|
From: <ian...@us...> - 2007-09-18 15:05:24
|
Revision: 414
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=414&view=rev
Author: iansmith
Date: 2007-09-18 08:05:26 -0700 (Tue, 18 Sep 2007)
Log Message:
-----------
Added support for spaces to know their own last modified time. og:populate mojo now respects last update time on template geometry files, template support files, and space files in the populate directory.
This change is a DB breaker, does require a drop/add to work properly.
Added support for poms that derive server port info from the settings.xml file. Requires addition of "ogoglio.port" property to your settings.xml.
Modified Paths:
--------------
maven/trunk/dev-plugins/src/main/java/com/ogoglio/plugin/PopulateMojo.java
maven/trunk/dev-plugins/src/main/java/com/ogoglio/plugin/ReverseMojo.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/WebAPIClient.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/SpaceDocument.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/TemplateDocument.java
maven/trunk/ogoglio-common/src/test/java/com/ogoglio/xml/test/XMLTest.java
maven/trunk/ogoglio-integration-test/pom.xml
maven/trunk/ogoglio-integration-test/src/test/java/com/ogoglio/client/test/ClientTest.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/SpacePersistTasks.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/SpaceRecord.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/TemplateSupportFileRecord.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SpaceSimulator.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/SpaceServlet.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/xml/server/DocumentFactory.java
maven/trunk/ogoglio-server/src/main/resources/hibernate/migration-1.xml
maven/trunk/ogoglio-server/src/test/java/com/ogoglio/sim/script/test/ScriptTest.java
Modified: maven/trunk/dev-plugins/src/main/java/com/ogoglio/plugin/PopulateMojo.java
===================================================================
--- maven/trunk/dev-plugins/src/main/java/com/ogoglio/plugin/PopulateMojo.java 2007-09-18 01:14:18 UTC (rev 413)
+++ maven/trunk/dev-plugins/src/main/java/com/ogoglio/plugin/PopulateMojo.java 2007-09-18 15:05:26 UTC (rev 414)
@@ -5,14 +5,17 @@
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
-import java.util.ArrayList;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.util.Date;
import java.util.HashMap;
-import java.util.List;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
import nanoxml.XMLElement;
import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
import com.ogoglio.client.WebAPIClient;
import com.ogoglio.util.StreamUtils;
@@ -21,27 +24,40 @@
import com.ogoglio.xml.SettingDocument;
import com.ogoglio.xml.SpaceDocument;
import com.ogoglio.xml.TemplateDocument;
+import com.ogoglio.xml.TemplateSupportFileDocument;
import com.ogoglio.xml.ThingDocument;
/**
* @goal populate
*/
public class PopulateMojo extends OgServiceMojoBase {
- private HashMap<Long, Long> templateIdMap = new HashMap<Long, Long>();
+ private Map<Long, Long> templateIdMap = new HashMap<Long, Long>();
- private List<SpaceDocument> spaces = new ArrayList<SpaceDocument>();
+ private Map<Long,SpaceDocument> localSpaces = new HashMap<Long,SpaceDocument>();
+ private Map<String,SpaceDocument> serveSpacerNameToSpaceDoc = new HashMap<String, SpaceDocument>();
+ private Map<String, TemplateDocument> existingServerTemplates = null;
+
+ public static final DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.US);
+
public void execute() throws MojoExecutionException {
WebAPIClient client = validateArgsAndConnect();
if (client == null) {
return;
}
+
+ try {
+ existingServerTemplates = getAllServerTemplates(client);
+ } catch (IOException e) {
+ throw new MojoExecutionException("Couldn't get the existing templates", e);
+ }
+
File[] templates = populateDir.listFiles();
for (int i = 0; i < templates.length; ++i) {
File candidate = templates[i];
if (candidate.getName().startsWith(TEMPLATE_PREFIX)) {
- uploadTemplate(client, candidate);
+ uploadTemplate(client, candidate, existingServerTemplates);
} else if (candidate.getName().startsWith(SPACE_PREFIX)) {
readSpace(client, candidate);
} else {
@@ -50,17 +66,56 @@
}
}
}
-
+ serveSpacerNameToSpaceDoc=getAllServerSpaces(client);
patchSpaces(client);
}
- private SpaceDocument[] patchSpaces(WebAPIClient client) throws MojoExecutionException {
+ private Map<String,SpaceDocument> getAllServerSpaces(WebAPIClient client) throws MojoExecutionException{
+ try {
+ Map<String,SpaceDocument> result=new HashMap<String,SpaceDocument>();
+ SpaceDocument[] doc=client.getAccountSpaceDocuments(username);
+ for (int i=0; i<doc.length;++i) {
+ result.put(doc[i].getDisplayName(),doc[i]);
+ }
+ return result;
+ } catch (IOException e) {
+ throw new MojoExecutionException("Unable to read server set of space documents",e);
+ }
+ }
+
+ private Map<String, TemplateDocument> getAllServerTemplates(WebAPIClient client) throws IOException {
+ Map<String, TemplateDocument> result = new HashMap<String, TemplateDocument>();
+
+ TemplateDocument[] doc = client.getTemplateDocuments(username);
+ getLog().info("Checking existing server templates...total of:"+doc.length);
+ for (int i = 0; i < doc.length; ++i) {
+ result.put(doc[i].getDisplayName(), doc[i]);
+ }
+ return result;
+ }
+
+ private void patchSpaces(WebAPIClient client) throws MojoExecutionException {
SpaceDocument fakeSpaceDoc, realSpaceDoc;
- SpaceDocument[] result=new SpaceDocument[spaces.size()];
+ Iterator<Long> iter=localSpaces.keySet().iterator();
- for (int i = 0; i < spaces.size(); ++i) {
- fakeSpaceDoc = spaces.get(i);
+ while (iter.hasNext()) {
try {
+ long localModTime = iter.next();
+ fakeSpaceDoc = localSpaces.get(localModTime);
+ if (serveSpacerNameToSpaceDoc.containsKey(fakeSpaceDoc.getDisplayName())) {
+ realSpaceDoc = serveSpacerNameToSpaceDoc.get(fakeSpaceDoc.getDisplayName());
+
+ Date fileModified=new Date(localModTime);
+ Date serverModified = TemplateSupportFileDocument.fmt.parse(realSpaceDoc.getLastModifiedAsUTC());
+ if (fileModified.before(serverModified)) {
+ getLog().info("Not patching space document "+realSpaceDoc.getDisplayName()+". Server copy is newer.");
+ continue;
+ } else {
+ //need to torch the server version b/c it's too old
+ client.deleteSpace(realSpaceDoc.getSpaceID());
+ getLog().info("Deleted old server version of "+realSpaceDoc.getDisplayName()+" ["+realSpaceDoc.getSpaceID()+"]");
+ }
+ }
realSpaceDoc = client.createSpace(fakeSpaceDoc.getDisplayName());
if (realSpaceDoc == null) {
throw new MojoExecutionException("Could not create a space for population: " + fakeSpaceDoc.getDisplayName());
@@ -94,14 +149,13 @@
client.createDoor(realSpaceID, doorDocs[j].getTemplateID(), doorDocs[j].getTemplateOwner(), doorDocs[j].getDisplayName(), doorDocs[j].getLink(), doorDocs[j].getTransform());
}
- getLog().info("Patched up space " + realSpaceDoc.getDisplayName());
- result[i]=realSpaceDoc;
+ getLog().info("Patched up space " + realSpaceDoc.getDisplayName() +" ["+realSpaceDoc.getSpaceID()+"]");
+ } catch (ParseException e) {
+ throw new MojoExecutionException("Parse exception patching space", e);
} catch (IOException e) {
- throw new MojoExecutionException("IOException patching space (" + fakeSpaceDoc.getDisplayName() + ":" + fakeSpaceDoc.getSpaceID() + ")", e);
+ throw new MojoExecutionException("IOException patching space", e);
}
}
- return result;
-
}
private void readSpace(WebAPIClient client, File candidate) throws MojoExecutionException {
@@ -120,7 +174,7 @@
FileInputStream inputStream = new FileInputStream(candidate);
String docContent = StreamUtils.readInput(inputStream);
SpaceDocument doc = new SpaceDocument(XMLElement.parseElementFromString(docContent));
- spaces.add(doc);
+ localSpaces.put(candidate.lastModified(),doc);
inputStream.close();
} catch (IOException e) {
throw new MojoExecutionException("IO Error reading space", e);
@@ -128,11 +182,10 @@
}
- private void uploadTemplate(WebAPIClient client, File candidate) throws MojoExecutionException {
+ private void uploadTemplate(WebAPIClient client, File candidate, Map<String, TemplateDocument> existing) throws MojoExecutionException {
String name = candidate.getName();
- int templateFakeId = dirNameToTemplateNumber(candidate);
+ long templateFakeId = dirNameToTemplateNumber(candidate);
- getLog().info("Uploading template #" + templateFakeId + " to " + serviceURI);
File[] objs = candidate.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".obj");
@@ -141,13 +194,23 @@
if (objs.length != 1) {
throw new MojoExecutionException("Badly formed directory " + name + ". Should have 1 obj file but has " + objs.length);
}
+
+ String templateVisibleName=fileToTemplateName(objs[0]);
+ if (!checkFileTemplateIsNewer(client, candidate, existing, templateVisibleName)) {
+ getLog().info("Not uploading template " + templateVisibleName + ". Server copy is newer.");
+ templateIdMap.put(templateFakeId,existing.get(templateVisibleName).getTemplateID());
+ return;
+ } else {
+ getLog().info("Uploading template #" + templateFakeId + " to " + serviceURI);
+ }
+
try {
TemplateDocument doc = fileNameToTemplateDocument(client, objs[0]);
InputStream objStream = new FileInputStream(objs[0]);
client.uploadTemplateGeometryStream(username, doc.getTemplateID(), 0, objStream);
- templateIdMap.put(new Long(templateFakeId), new Long(doc.getTemplateID()));
+ templateIdMap.put(templateFakeId, doc.getTemplateID());
getLog().info("Created template from " + objs[0].getName() + " [" + templateFakeId + " -> " + doc.getTemplateID() + "]");
File[] notObjs = candidate.listFiles(new FilenameFilter() {
@@ -181,4 +244,114 @@
}
}
+ private boolean checkFileTemplateIsNewer(WebAPIClient client, File candidate, Map<String, TemplateDocument> existing, String displayName) throws MojoExecutionException {
+ //is it even on server?
+ if (!existing.containsKey(displayName)) {
+ return true;
+ }
+
+ TemplateDocument serverCopy = existing.get(displayName);
+
+ //first check support files
+ File[] notObjs = candidate.listFiles(new FilenameFilter() {
+ public boolean accept(File dir, String name) {
+ return !name.endsWith(".obj");
+ }
+ });
+
+ //walk support files
+ for (int i = 0; i < notObjs.length; ++i) {
+ File supportFile = notObjs[i];
+ String supportName = supportFile.getName();
+ String modTime = null;
+ if (supportName.endsWith(".js")) {
+ if (!serverCopy.hasScriptFile()) {
+ getLog().info("You have added a javascript file since the last server update.");
+ return true;
+ }
+ modTime = serverCopy.getScriptModifiedTime();
+ } else if ((!(supportName.endsWith(".gif"))) && (!(supportName.endsWith(".jpg"))) && (!(supportName.endsWith(".png"))) && (!(supportName.endsWith(".mtl")))) {
+ continue;
+ } else {
+ modTime = serverCopy.getSupportFileModifiedTime(supportName);
+ }
+ try {
+ //if there is no modtime, then the file doesn't exist on the server
+ if (modTime == null) {
+ getLog().info("Added support file " + supportName + " to template since server copy created");
+ client.deleteTemplate(serverCopy.getTemplateID());
+ return true;
+ }
+ //modtime is now set to what the server thinks the modtime is
+ Date serverTime = fmt.parse(modTime);
+ if (serverTime.before(new Date(supportFile.lastModified()))) {
+ getLog().info("File " + supportFile + " has been modified since last upload to server...");
+ client.deleteTemplate(serverCopy.getTemplateID());
+ return true; //we can bail out now
+ }
+ } catch (IOException e) {
+ throw new MojoExecutionException("unable to delete server copy of template " + serverCopy.getDisplayName(), e);
+ } catch (ParseException e) {
+ throw new MojoExecutionException("unable to comprehend modified time", e);
+ }
+ }
+
+ //at this point we've checked the files that exist on the client side, but we might
+ //have deleted one
+ boolean destroyServerTemplate = false;
+ //special case for js
+ if (serverCopy.hasScriptFile()) {
+ File[] jsFiles = candidate.listFiles(new FilenameFilter() {
+ public boolean accept(File dir, String name) {
+ return name.endsWith(".js");
+ }
+ });
+ if (jsFiles.length > 1) {
+ throw new MojoExecutionException("Only one script file is allowed per template (" + candidate.getPath() + ")");
+ }
+ if (jsFiles.length == 0) {
+ getLog().info("Javascript file removed since last server update.");
+ destroyServerTemplate = true;
+ }
+ }
+ //now support files
+ String name[] = serverCopy.getAllSupportFileNames();
+ for (int i = 0; i < name.length; ++i) {
+ File f = new File(candidate, name[i]);
+ if (!f.exists()) {
+ getLog().info("You have removed the file " + name[i] + " from the template.");
+ destroyServerTemplate = true;
+ break;
+ }
+ }
+ //check the obj file
+ File[] objs = candidate.listFiles(new FilenameFilter() {
+ public boolean accept(File dir, String name) {
+ return name.endsWith(".obj");
+ }
+ });
+ if (objs.length != 1) {
+ throw new MojoExecutionException("You should have exactly one object (geometry) file per template directory (was " + objs.length + ")");
+ }
+ try {
+ Date fileMod = new Date(objs[0].lastModified());
+ Date onServerMod = fmt.parse(serverCopy.getGeometryModifiedTime(0));
+ if (onServerMod.before(fileMod)) {
+ getLog().info("Local geometry file is newer than server copy.");
+ destroyServerTemplate = true;
+ }
+ //implement destruction
+ if (destroyServerTemplate) {
+ client.deleteTemplate(serverCopy.getTemplateID());
+ return true;
+ } else {
+ return false;
+ }
+ } catch (IOException e) {
+ throw new MojoExecutionException("unable to delete server copy of template " + serverCopy.getDisplayName(), e);
+ } catch (ParseException e) {
+ throw new MojoExecutionException("unable to comprehend modified time", e);
+ }
+ }
+
}
\ No newline at end of file
Modified: maven/trunk/dev-plugins/src/main/java/com/ogoglio/plugin/ReverseMojo.java
===================================================================
--- maven/trunk/dev-plugins/src/main/java/com/ogoglio/plugin/ReverseMojo.java 2007-09-18 01:14:18 UTC (rev 413)
+++ maven/trunk/dev-plugins/src/main/java/com/ogoglio/plugin/ReverseMojo.java 2007-09-18 15:05:26 UTC (rev 414)
@@ -65,7 +65,7 @@
long localThingId = 1;
long localPossId = 1;
- SpaceDocument result = new SpaceDocument(localSpaceId, origSpaceDoc.getDisplayName(), origSpaceDoc.getOwnerUsername(), true /*origSpaceDoc.getPublished()*/, origSpaceDoc.getMaxGuests(), origSpaceDoc.getDisplaySea(), origSpaceDoc.getSeaLevel(), origSpaceDoc.getSimID());
+ SpaceDocument result = new SpaceDocument(localSpaceId, origSpaceDoc.getDisplayName(), origSpaceDoc.getOwnerUsername(), true /*origSpaceDoc.getPublished()*/, origSpaceDoc.getMaxGuests(), origSpaceDoc.getDisplaySea(), origSpaceDoc.getSeaLevel(), origSpaceDoc.getSimID(), null);
ThingDocument[] thingDocs = origSpaceDoc.getThingDocuments();
for (int i = 0; i < thingDocs.length; ++i) {
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/WebAPIClient.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/WebAPIClient.java 2007-09-18 01:14:18 UTC (rev 413)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/client/WebAPIClient.java 2007-09-18 15:05:26 UTC (rev 414)
@@ -16,6 +16,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
+import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
@@ -37,6 +38,7 @@
import com.ogoglio.xml.SpaceDocument;
import com.ogoglio.xml.SpaceMemberDocument;
import com.ogoglio.xml.TemplateDocument;
+import com.ogoglio.xml.TemplateSupportFileDocument;
import com.ogoglio.xml.ThingDocument;
import com.ogoglio.xml.UserDocument;
@@ -68,7 +70,7 @@
}
public SpaceDocument createSpace(String spaceName) {
- SpaceDocument spaceDoc = new SpaceDocument(-1, spaceName, authenticator.getUsername(), false, 0, false, 0, -1);
+ SpaceDocument spaceDoc = new SpaceDocument(-1, spaceName, authenticator.getUsername(), false, 0, false, 0, -1, null);
try {
return new SpaceDocument(wire.sendAuthenticatedXML(descriptor.getSpacesURI(), spaceDoc.toString(), "POST", authenticator.getAuthCookie()));
} catch (IOException e) {
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/SpaceDocument.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/SpaceDocument.java 2007-09-18 01:14:18 UTC (rev 413)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/SpaceDocument.java 2007-09-18 15:05:26 UTC (rev 414)
@@ -13,6 +13,8 @@
limitations under the License. */
package com.ogoglio.xml;
+import java.text.ParseException;
+
import nanoxml.XMLElement;
import com.ogoglio.util.ArgumentUtils;
@@ -37,11 +39,13 @@
public static final String SIM_ID = "simid";
+ public static final String LAST_MODIFIED="lastmodified";
+
public static final int MAX_SETTING_VALUE_SIZE = 10240;
XMLElement data = null;
- public SpaceDocument(long spaceID, String displayName, String ownerUsername, boolean published, int maxGuests, boolean displaySea, double seaLevel, long simID) {
+ public SpaceDocument(long spaceID, String displayName, String ownerUsername, boolean published, int maxGuests, boolean displaySea, double seaLevel, long simID, String lastModifiedGMT) {
data = new XMLElement(NAME);
if (spaceID != -1) {
@@ -63,6 +67,10 @@
data.setAttribute(DISPLAY_SEA, displaySea);
data.setAttribute(SEA_LEVEL, seaLevel);
+ if (lastModifiedGMT!=null) {
+ data.setAttribute(LAST_MODIFIED, lastModifiedGMT);
+ }
+
if (simID != -1) {
data.setAttribute(SIM_ID, simID);
}
@@ -222,4 +230,8 @@
public double getSeaLevel() {
return data.getDoubleAttribute(SEA_LEVEL, 0);
}
+
+ public String getLastModifiedAsUTC() {
+ return data.getStringAttribute(LAST_MODIFIED,null);
+ }
}
\ No newline at end of file
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/TemplateDocument.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/TemplateDocument.java 2007-09-18 01:14:18 UTC (rev 413)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/xml/TemplateDocument.java 2007-09-18 15:05:26 UTC (rev 414)
@@ -181,4 +181,13 @@
}
return (String)elem.getAttribute(LAST_MODIFIED);
}
+ public String[] getAllSupportFileNames() {
+ XMLElement elem[] = data.getChildren(SUPPORT_TAG);
+ String[] result=new String[elem.length];
+ for (int i=0; i<elem.length; ++i) {
+ XMLElement candidate = elem[i];
+ result[i]=elem[i].getStringAttribute(SUPPORT_FILE_NAME,null);
+ }
+ return result;
+ }
}
Modified: maven/trunk/ogoglio-common/src/test/java/com/ogoglio/xml/test/XMLTest.java
===================================================================
--- maven/trunk/ogoglio-common/src/test/java/com/ogoglio/xml/test/XMLTest.java 2007-09-18 01:14:18 UTC (rev 413)
+++ maven/trunk/ogoglio-common/src/test/java/com/ogoglio/xml/test/XMLTest.java 2007-09-18 15:05:26 UTC (rev 414)
@@ -2,7 +2,9 @@
import java.net.URI;
+import java.text.DateFormat;
import java.util.Date;
+import java.util.Locale;
import javax.media.j3d.Transform3D;
import javax.vecmath.Point3f;
@@ -230,7 +232,12 @@
}
public void testSpaceDocuments() {
- SpaceDocument doc1 = new SpaceDocument(spaceID1, displayName1, ownerUsername1, true, 23, false, 0, 44);
+ DateFormat fmt=DateFormat.getDateTimeInstance(DateFormat.FULL,
+ DateFormat.FULL, Locale.US);
+ Date now=new Date();
+ Date aSecondAgo=new Date(now.getTime()-1000);
+
+ SpaceDocument doc1 = new SpaceDocument(spaceID1, displayName1, ownerUsername1, true, 23, false, 0, 44, fmt.format(aSecondAgo));
assertEquals(spaceID1, doc1.getSpaceID());
assertEquals(displayName1, doc1.getDisplayName());
assertEquals(ownerUsername1, doc1.getOwnerUsername());
@@ -239,7 +246,7 @@
assertFalse(doc1.getDisplaySea());
assertEquals(0, doc1.getSeaLevel(), 0.001);
assertEquals(44, doc1.getSimID());
-
+ assertEquals(fmt.format(aSecondAgo), doc1.getLastModifiedAsUTC());
SpaceDocument doc2 = new SpaceDocument(XMLElement.parseElementFromString(doc1.toElement().toString()));
assertEquals(spaceID1, doc2.getSpaceID());
assertEquals(displayName1, doc2.getDisplayName());
@@ -250,7 +257,7 @@
assertEquals(0, doc2.getSeaLevel(), 0.001);
assertEquals(44, doc2.getSimID());
- SpaceDocument doc3 = new SpaceDocument(spaceID1, displayName1, ownerUsername1, true, 23, true, -2, 44);
+ SpaceDocument doc3 = new SpaceDocument(spaceID1, displayName1, ownerUsername1, true, 23, true, -2, 44, null);
assertTrue(doc3.getDisplaySea());
assertEquals(-2, doc3.getSeaLevel(), 0.00001);
SpaceDocument doc4 = new SpaceDocument(XMLElement.parseElementFromString(doc3.toElement().toString()));
@@ -258,14 +265,14 @@
assertEquals(-2, doc4.getSeaLevel(), 0.00001);
try {
- new SpaceDocument(spaceID1, displayName1, null, true, 4, true, 0, -1);
+ new SpaceDocument(spaceID1, displayName1, null, true, 4, true, 0, -1,null);
fail("Should not allow null ownerURI");
} catch (IllegalArgumentException e) {
//this should happen
}
try {
- new SpaceDocument(spaceID1, null, ownerUsername1, true, 0, true, 0, -1);
+ new SpaceDocument(spaceID1, null, ownerUsername1, true, 0, true, 0, -1,null);
fail("Should not allow null display name");
} catch (IllegalArgumentException e) {
//this should happen
Modified: maven/trunk/ogoglio-integration-test/pom.xml
===================================================================
--- maven/trunk/ogoglio-integration-test/pom.xml 2007-09-18 01:14:18 UTC (rev 413)
+++ maven/trunk/ogoglio-integration-test/pom.xml 2007-09-18 15:05:26 UTC (rev 414)
@@ -118,7 +118,7 @@
<home>${ogoglio.tmp.tomcat5x}</home>
<properties>
<cargo.servlet.port>
- 8080
+ ${ogoglio.port}
</cargo.servlet.port>
<cargo.logging>high</cargo.logging>
</properties>
Modified: maven/trunk/ogoglio-integration-test/src/test/java/com/ogoglio/client/test/ClientTest.java
===================================================================
--- maven/trunk/ogoglio-integration-test/src/test/java/com/ogoglio/client/test/ClientTest.java 2007-09-18 01:14:18 UTC (rev 413)
+++ maven/trunk/ogoglio-integration-test/src/test/java/com/ogoglio/client/test/ClientTest.java 2007-09-18 15:05:26 UTC (rev 414)
@@ -20,6 +20,7 @@
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
+import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.Random;
@@ -209,6 +210,8 @@
WebAPIAuthenticator advancedAuth = new WebAPIAuthenticator(wire1, descriptor1, USERNAME1, PASSWORD1);
WebAPIClient advancedClient = new WebAPIClient(descriptor1, advancedAuth, wire1);
SpaceDocument spaceDocument = advancedClient.createSpace("Susan's Space");
+ checkSpaceDocumentCreateTime(spaceDocument);
+
assertNotNull(spaceDocument);
advancedClient.setSpacePublished(spaceDocument.getSpaceID(), true);
@@ -267,6 +270,18 @@
}
+ private void checkSpaceDocumentCreateTime(SpaceDocument spaceDocument) {
+ try {
+ long now=new Date().getTime();
+ long lastMod=TemplateSupportFileDocument.fmt.parse(spaceDocument.getLastModifiedAsUTC()).getTime();
+ assertTrue(now-lastMod < 1000); //1 sec seems pretty safe
+ assertTrue(now-lastMod > 0); // asked for now AFTER we created the space
+ } catch (ParseException e) {
+ fail("can't parse the server's timestamp on last modified time of the space");
+ }
+
+ }
+
public void testApplet() throws AuthenticationFailedException, IOException {
WebAPIAuthenticator basicAuthenticator = new WebAPIAuthenticatorFactory().authenticate(wire1, descriptor1, USERNAME1, PASSWORD1);
assertNotNull("got null auth cookie", basicAuthenticator.getAuthCookie());
@@ -481,14 +496,33 @@
private SpaceDocument checkSpaceSeaLevel(WebAPIClient webClient1, SpaceDocument spaceDocument) throws IOException {
assertFalse(spaceDocument.getDisplaySea());
- assertEquals(0, spaceDocument.getSeaLevel(), 0.001);
- webClient1.setSpaceSeaLevel(spaceDocument.getSpaceID(), -2);
- spaceDocument = webClient1.getSpaceDocument(spaceDocument.getSpaceID(), false);
- assertEquals(-2, spaceDocument.getSeaLevel(), 0.000001);
- webClient1.setSpaceDisplaySea(spaceDocument.getSpaceID(), true);
- spaceDocument = webClient1.getSpaceDocument(spaceDocument.getSpaceID(), false);
- assertTrue(spaceDocument.getDisplaySea());
- return spaceDocument;
+
+ //redefine this here b/c we don't want linkage against internal server code
+ DateFormat fmt=TemplateSupportFileDocument.fmt;
+
+ try {
+ long lastUpdateBeforeSet = fmt.parse(spaceDocument.getLastModifiedAsUTC()).getTime();
+ Thread.sleep(1000);
+ assertEquals(0, spaceDocument.getSeaLevel(), 0.001);
+ webClient1.setSpaceSeaLevel(spaceDocument.getSpaceID(), -2);
+ //also testing that the last updated time changed
+ spaceDocument = webClient1.getSpaceDocument(spaceDocument.getSpaceID(), false);
+ //side test, make sure update time changes
+ long lastUpdateAfterSet = fmt.parse(spaceDocument.getLastModifiedAsUTC()).getTime();
+ assertTrue(lastUpdateAfterSet-lastUpdateBeforeSet>=1000);
+
+ assertEquals(-2, spaceDocument.getSeaLevel(), 0.000001);
+ webClient1.setSpaceDisplaySea(spaceDocument.getSpaceID(), true);
+ spaceDocument = webClient1.getSpaceDocument(spaceDocument.getSpaceID(), false);
+ assertTrue(spaceDocument.getDisplaySea());
+ return spaceDocument;
+ } catch (ParseException e) {
+ fail("Unable to parse the date sent from the server as the last modified time of the space");
+ return null;
+ } catch (InterruptedException e) {
+ fail("Interrupted exception timing the last space updated time");
+ return null;
+ }
}
private void checkNoConnectionToSpaceWithoutAuth(long spaceID) {
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/SpacePersistTasks.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/SpacePersistTasks.java 2007-09-18 01:14:18 UTC (rev 413)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/SpacePersistTasks.java 2007-09-18 15:05:26 UTC (rev 414)
@@ -13,6 +13,7 @@
limitations under the License. */
package com.ogoglio.persist;
+import java.util.Date;
import java.util.Random;
import org.hibernate.Query;
@@ -70,7 +71,7 @@
}
if (dirty) {
- hibernateSession.update(record);
+ record=updateRecordAndUpdateModifiedTime(record,hibernateSession,true);
}
return record;
}
@@ -78,6 +79,16 @@
task.setSessionFactory(sessionFactory);
return (SpaceRecord) task.execute();
}
+
+ private static SpaceRecord updateRecordAndUpdateModifiedTime(SpaceRecord record, Session hibernateSession, boolean useUpdate) {
+ record.setLastModifiedTime(new Date().getTime());
+ if (useUpdate) {
+ hibernateSession.update(record);
+ } else {
+ hibernateSession.save(record);
+ }
+ return record;
+ }
public static SpaceRecord[] findAllSpaces(SessionFactory sessionFactory) throws PersistException {
HibernateTask task = new HibernateTask() {
@@ -117,7 +128,7 @@
public static void update(final SpaceRecord record, final SessionFactory sessionFactory) throws PersistException {
HibernateTask task = new HibernateTask() {
public Object run(Session hibernateSession) {
- hibernateSession.update(record);
+ updateRecordAndUpdateModifiedTime(record, hibernateSession,true);
return null;
}
};
@@ -133,10 +144,9 @@
Query simQuery = hibernateSession.getNamedQuery(SimPersistTasks.SIM_BY_ID);
simQuery.setLong("simID", spaceRecord.getSimID());
simRecord = (SimRecord) simQuery.uniqueResult();
-
if (simRecord == null || simRecord.isActive() == false) {
spaceRecord.setSimID(-1);
- hibernateSession.update(spaceRecord);
+ updateRecordAndUpdateModifiedTime(spaceRecord,hibernateSession,true);
simRecord = null;
} else {
return simRecord;
@@ -152,7 +162,7 @@
//TODO pick a sim based on load, not at random
simRecord = (SimRecord) sims[Math.abs(RANDOM.nextInt() % sims.length)];
spaceRecord.setSimID(simRecord.getSimID());
- hibernateSession.update(spaceRecord);
+ updateRecordAndUpdateModifiedTime(spaceRecord,hibernateSession,true);
return simRecord;
}
};
@@ -170,7 +180,7 @@
return null;
}
SpaceRecord record = new SpaceRecord(displayName, ownerUsername);
- hibernateSession.save(record);
+ record=updateRecordAndUpdateModifiedTime(record, hibernateSession, false);
return record;
}
};
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/SpaceRecord.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/SpaceRecord.java 2007-09-18 01:14:18 UTC (rev 413)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/SpaceRecord.java 2007-09-18 15:05:26 UTC (rev 414)
@@ -13,6 +13,10 @@
limitations under the License. */
package com.ogoglio.persist;
+import java.util.Date;
+
+import com.ogoglio.xml.TemplateSupportFileDocument;
+
public class SpaceRecord {
private long spaceID = -1;
@@ -31,6 +35,8 @@
private long simID = -1;
+ private long lastModifiedTime=0L;
+
public SpaceRecord() {
}
@@ -123,4 +129,16 @@
}
}
+ public void setLastModifiedTime(long time) {
+ this.lastModifiedTime=time;
+ }
+
+ public long getLastModifiedTime() {
+ return this.lastModifiedTime;
+ }
+
+ public String getLastModifiedTimeGMT() {
+ return TemplateSupportFileDocument.fmt.format(new Date(lastModifiedTime));
+ }
+
}
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/TemplateSupportFileRecord.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/TemplateSupportFileRecord.java 2007-09-18 01:14:18 UTC (rev 413)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/TemplateSupportFileRecord.java 2007-09-18 15:05:26 UTC (rev 414)
@@ -1,8 +1,6 @@
package com.ogoglio.persist;
-import java.text.DateFormat;
import java.util.Date;
-import java.util.Locale;
import com.ogoglio.xml.TemplateSupportFileDocument;
@@ -13,8 +11,6 @@
private int levelOfDetail = TemplateSupportFileDocument.NO_LOD;
private boolean script = false;
private Date lastChanged= null;
- public static final DateFormat fmt=DateFormat.getDateTimeInstance(DateFormat.FULL,
- DateFormat.FULL, Locale.US);
public Date getLastChanged() {
return lastChanged;
@@ -23,7 +19,7 @@
lastChanged=changed;
}
public String getLastChangedAsUTC() {
- return fmt.format(lastChanged);
+ return TemplateSupportFileDocument.fmt.format(lastChanged);
}
public int getLevelOfDetail()
{
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SpaceSimulator.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SpaceSimulator.java 2007-09-18 01:14:18 UTC (rev 413)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SpaceSimulator.java 2007-09-18 15:05:26 UTC (rev 414)
@@ -901,7 +901,7 @@
}
public SpaceDocument toSpaceDocument() {
- SpaceDocument spaceDoc = new SpaceDocument(space.getSpaceID(), space.getDisplayName(), space.getOwnerUsername(), false, 0, space.shouldDisplaySea(), space.getSeaLevel(), -1);
+ SpaceDocument spaceDoc = new SpaceDocument(space.getSpaceID(), space.getDisplayName(), space.getOwnerUsername(), false, 0, space.shouldDisplaySea(), space.getSeaLevel(), -1, null);
ThingDocument[] thingDocs = getThingDocuments();
for (int i = 0; i < thingDocs.length; i++) {
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/SpaceServlet.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/SpaceServlet.java 2007-09-18 01:14:18 UTC (rev 413)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/SpaceServlet.java 2007-09-18 15:05:26 UTC (rev 414)
@@ -195,7 +195,6 @@
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
-
if (!canUseMethodOnSpace(request.getMethod(), authedAccount, spaceRecord)) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return;
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/xml/server/DocumentFactory.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/xml/server/DocumentFactory.java 2007-09-18 01:14:18 UTC (rev 413)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/xml/server/DocumentFactory.java 2007-09-18 15:05:26 UTC (rev 414)
@@ -36,7 +36,7 @@
}
public static SpaceDocument documentFromRecord(SpaceRecord requestedRecord) {
- return new SpaceDocument(requestedRecord.getSpaceID(), requestedRecord.getDisplayName(), requestedRecord.getOwnerUsername(), requestedRecord.isPublished(), requestedRecord.getMaxGuests(), requestedRecord.getDisplaySea(), requestedRecord.getSeaLevel(), requestedRecord.getSimID());
+ return new SpaceDocument(requestedRecord.getSpaceID(), requestedRecord.getDisplayName(), requestedRecord.getOwnerUsername(), requestedRecord.isPublished(), requestedRecord.getMaxGuests(), requestedRecord.getDisplaySea(), requestedRecord.getSeaLevel(), requestedRecord.getSimID(), requestedRecord.getLastModifiedTimeGMT());
}
Modified: maven/trunk/ogoglio-server/src/main/resources/hibernate/migration-1.xml
===================================================================
--- maven/trunk/ogoglio-server/src/main/resources/hibernate/migration-1.xml 2007-09-18 01:14:18 UTC (rev 413)
+++ maven/trunk/ogoglio-server/src/main/resources/hibernate/migration-1.xml 2007-09-18 15:05:26 UTC (rev 414)
@@ -63,6 +63,7 @@
<property name="displaySea" access="field" />
<property name="seaLevel" />
<property name="simID" />
+ <property name="lastModifiedTime"/>
</class>
<class name="com.ogoglio.persist.SpaceMemberRecord" table="SpaceMemberRecords">
Modified: maven/trunk/ogoglio-server/src/test/java/com/ogoglio/sim/script/test/ScriptTest.java
===================================================================
--- maven/trunk/ogoglio-server/src/test/java/com/ogoglio/sim/script/test/ScriptTest.java 2007-09-18 01:14:18 UTC (rev 413)
+++ maven/trunk/ogoglio-server/src/test/java/com/ogoglio/sim/script/test/ScriptTest.java 2007-09-18 15:05:26 UTC (rev 414)
@@ -28,7 +28,7 @@
TestSpaceListener listener = new TestSpaceListener();
SpaceSimulator spaceSimulator = null;
try {
- SpaceDocument spaceDocument = new SpaceDocument(1, "Space", "trevor", true, 0, false, 0, 1);
+ SpaceDocument spaceDocument = new SpaceDocument(1, "Space", "trevor", true, 0, false, 0, 1, null);
spaceSimulator = new SpaceSimulator(spaceDocument, listener);
spaceSimulator.startSim();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|