Frage

Problem . Ich muss einen Weg StarTeam- Server Zeit durch Starteam Java SDK 8.0 zu finden. Version des Servers ist 8.0.172 so Methode Server.getCurrentTime() ist nicht verfügbar, da es nur in Server-Version 9.0 hinzugefügt wurde.

Motivation . Meine Anwendung benötigt Ansichten zu bestimmten Terminen zu verwenden. Also, wenn einige Unterschiede in der Systemzeit zwischen Client gibt es (wo die App läuft) und Server dann erhalten Ansichten sind nicht korrekt. Im schlimmsten Fall ist der Kundenwunschtermin in der Zukunft für Server, so dass die Betriebsergebnisse in Ausnahme.

War es hilfreich?

Lösung

Nach einigen Untersuchungen habe ich keine sauberere Lösung als die Verwendung eines temporären Gegenstand gefunden. Meine App fordert die Zeit der Erstellung des Einzelteils und vergleicht sie mit lokaler Zeit. Hier ist die Methode, die ich verwende Server-Zeit zu bekommen:

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();
}

Andere Tipps

Wenn Ihr Starteam-Server auf einer Windows-Box ist und der Code wird auf einem Windows-wird ausgeführt wird, könnten Sie berappen und führen Sie die NET Zeit Befehl, um die Zeit auf dieser Maschine zu holen und dann vergleichen es auf die Ortszeit.

net time \\my_starteam_server_machine_name

, welche zurückkehren sollte:

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

"The command completed successfully."

Wir mussten einen Weg finden, die Serverzeit für die Verwendung mit CodeCollab kommen. Hier ist ein (longish) C # Codebeispiel, wie es zu tun, ohne eine temporäre Datei zu erstellen. Die Auflösung beträgt 1 Sekunde.

    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.");
    }

Ausgabe:

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> Ich bin mit dem SDK nicht vertraut, aber aus an der API suchen, wenn der Server in einer bekannten Zeitzone warum man nicht und Objekt eines OLEDate, dessen Datums wird die Client-Zeit nach dem Server-Zeitzone angemessen sein gerollt? </stab_in_the_dark>

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top