diferença de tempo Calcular cliente-servidor em servidor O Borland StarTeam 8

StackOverflow https://stackoverflow.com/questions/126114

  •  02-07-2019
  •  | 
  •  

Pergunta

Problema . Eu preciso de uma maneira de encontrar tempo servidor Starteam através Starteam Java SDK 8.0. Versão do servidor é 8.0.172 tão método Server.getCurrentTime() não está disponível, uma vez que foi adicionado apenas no servidor versão 9.0.

Motivation . Minhas necessidades de aplicativos para usar exibições em datas específicas. Portanto, se há alguma diferença na hora do sistema entre o cliente (onde o aplicativo está sendo executado) e servidor, então, obtido pontos de vista não são precisos. Na pior das hipóteses data solicitada do cliente é no futuro para o servidor para que os resultados da operação em exceção.

Foi útil?

Solução

Depois de algumas investigações não encontrei qualquer solução mais limpa do que usar um item de temporário. Meu aplicativo solicita vez do item da criação e compara-o com o tempo local. Aqui está o método que eu uso para obter hora do servidor:

public Date getCurrentServerTime() {
    Folder rootFolder = project.getDefaultView().getRootFolder();

    Topic newItem = (Topic) Item.createItem(project.getTypeNames().TOPIC, rootFolder);
    newItem.update();
    newItem.remove();
    newItem.update();
    return newItem.getCreatedTime().createDate();
}

Outras dicas

Se o seu servidor StarTeam é em uma caixa de Windows e seu código será executar em uma caixa de Windows, você pode desembolsar e executar o tempo NET comando para buscar o tempo em que a máquina e depois compará -lo para a hora local.

net time \\my_starteam_server_machine_name

que deve retornar:

"Current time at \\my_starteam_server_machine_name is 10/28/2008 2:19 PM"

"The command completed successfully."

Nós precisávamos para chegar a uma maneira de encontrar a hora do servidor para uso com CodeCollab. Aqui está uma (comprido) C # exemplo de código de como fazê-lo sem criar um arquivo temporário. A resolução é de 1 segundo.

    static void Main(string[] args)
    {
        // ServerTime replacement for pre-2006 StarTeam servers.
        // Picks a date in the future.
        // Gets a view, sets the configuration to the date, and tries to get a property from the root folder.
        // If it cannot retrieve the property, the date is too far in the future.  Roll back the date to an earlier time.

        DateTime StartTime = DateTime.Now;

        Server s = new Server("serverAddress", 49201);
        s.LogOn("User", "Password");

        // Getting a view - doesn't matter which, as long as it is not deleted.
        Project p = s.Projects[0];
        View v = p.AccessibleViews[0]; // AccessibleViews saves checking permissions.

        // Timestep to use when searching.  One hour is fairly quick for resolution.
        TimeSpan deltaTime = new TimeSpan(1, 0, 0);
        deltaTime = new TimeSpan(24 * 365, 0, 0);

        // Invalid calls return faster - start a ways in the future.
        TimeSpan offset = new TimeSpan(24, 0, 0);

        // Times before the view was created are invalid.
        DateTime minTime = v.CreatedTime;
        DateTime localTime = DateTime.Now;

        if (localTime < minTime)
        {
            System.Console.WriteLine("Current time is older than view creation time: " + minTime);

            // If the dates are so dissimilar that the current date is before the creation date,
            // it is probably a good idea to use a bigger delta.
            deltaTime = new TimeSpan(24 * 365, 0, 0);

            // Set the offset to the minimum time and work up from there.
            offset = minTime - localTime;
        }

        // Storage for calculated date.
        DateTime testTime;

        // Larger divisors converge quicker, but might take longer depending on offset.
        const float stepDivisor = 10.0f;

        bool foundValid = false;

        while (true)
        {
            localTime = DateTime.Now;

            testTime = localTime.Add(offset);

            ViewConfiguration vc = ViewConfiguration.CreateFromTime(testTime);

            View tempView = new View(v, vc);

            System.Console.Write("Testing " + testTime + " (Offset " + (int)offset.TotalSeconds + ") (Delta " + deltaTime.TotalSeconds + "): ");

            // Unfortunately, there is no isValid operation.  Attempting to
            // read a property from an invalid date configuration will
            // throw an exception.
            // An alternate to this would be proferred.
            bool valid = true;
            try
            {
                string testname = tempView.RootFolder.Name;
            }
            catch (ServerException)
            {
                System.Console.WriteLine(" InValid");
                valid = false;
            }

            if (valid)
            {
                System.Console.WriteLine(" Valid");

                // If the last check was invalid, the current check is valid, and 
                // If the change is this small, the time is very close to the server time.
                if (foundValid == false && deltaTime.TotalSeconds <= 1)
                {
                    break;
                }

                foundValid = true;
                offset = offset.Add(deltaTime);
            }
            else
            {
                offset = offset.Subtract(deltaTime);

                // Once a valid time is found, start reducing the timestep.
                if (foundValid)
                {
                    foundValid = false;
                    deltaTime = new TimeSpan(0,0,Math.Max((int)(deltaTime.TotalSeconds / stepDivisor), 1));
                }
            }

        }

        System.Console.WriteLine("Run time: " + (DateTime.Now - StartTime).TotalSeconds + " seconds.");
        System.Console.WriteLine("The local time is " + localTime);
        System.Console.WriteLine("The server time is " + testTime);
        System.Console.WriteLine("The server time is offset from the local time by " + offset.TotalSeconds + " seconds.");
    }

Output:

Testing 4/9/2009 3:05:40 PM (Offset 86400) (Delta 31536000):  InValid
Testing 4/9/2008 3:05:40 PM (Offset -31449600) (Delta 31536000):  Valid
...
Testing 4/8/2009 10:05:41 PM (Offset 25200) (Delta 3):  InValid
Testing 4/8/2009 10:05:38 PM (Offset 25197) (Delta 1):  Valid
Run time: 9.0933426 seconds.
The local time is 4/8/2009 3:05:41 PM
The server time is 4/8/2009 10:05:38 PM
The server time is offset from the local time by 25197 seconds.

<stab_in_the_dark> Eu não estou familiarizado com esse SDK, mas de olhar para a API se o servidor está em um fuso horário conhecido por que não criar um objeto e OLEDate cuja data vai ser o tempo do cliente rolou apropriadamente de acordo com fuso horário do servidor? </stab_in_the_dark>

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top