|
From: <tre...@us...> - 2007-07-03 22:05:55
|
Revision: 213
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=213&view=rev
Author: trevorolio
Date: 2007-07-03 15:05:56 -0700 (Tue, 03 Jul 2007)
Log Message:
-----------
Now initializing the space model takes one HTTP round trip, as the SpaceDocument includes templates, things, and users when fetched with children=true parameter.
Modified Paths:
--------------
spaces/trunk/src/com/ogoglio/client/SpaceClient.java
spaces/trunk/src/com/ogoglio/sim/SpaceSimulator.java
spaces/trunk/src/com/ogoglio/sim/site/SimServlet.java
spaces/trunk/src/com/ogoglio/site/SpaceServlet.java
spaces/trunk/src/com/ogoglio/viewer/applet/AppletTestWindow.java
spaces/trunk/src/com/ogoglio/xml/SpaceDocument.java
spaces/trunk/src/com/ogoglio/xml/ThingDocument.java
Modified: spaces/trunk/src/com/ogoglio/client/SpaceClient.java
===================================================================
--- spaces/trunk/src/com/ogoglio/client/SpaceClient.java 2007-07-03 19:25:40 UTC (rev 212)
+++ spaces/trunk/src/com/ogoglio/client/SpaceClient.java 2007-07-03 22:05:56 UTC (rev 213)
@@ -82,8 +82,8 @@
accountDoc = webClient.getAccountDocument(authDoc.getUsername());
- SpaceDocument document = webClient.getSpaceDocument(true);
- space = new Space(this, document.getSpaceID(), document.getDisplayName(), document.getOwnerUsername(), document.getDisplaySea(), document.getSeaLevel());
+ SpaceDocument spaceDoc = webClient.getSpaceDocument(true);
+ space = new Space(this, spaceDoc.getSpaceID(), spaceDoc.getDisplayName(), spaceDoc.getOwnerUsername(), spaceDoc.getDisplaySea(), spaceDoc.getSeaLevel());
//create the event channel and start queuing events
messageChannel = new TCPChannel(serviceURI.getHost(), DEFAULT_EVENT_PORT, messenger, true, new ChannelListener());
@@ -108,18 +108,18 @@
}
}
- UserDocument[] userDocs = webClient.getUserDocuments();
+ UserDocument[] userDocs = spaceDoc.getUserDocuments();
for (int i = 0; i < userDocs.length; i++) {
space.addUser(new User(space, userDocs[i].getUsername(), userDocs[i].getTransform(), userDocs[i].getBodyID()));
}
- ThingDocument[] thingDocs = webClient.getThingDocuments();
+ ThingDocument[] thingDocs = spaceDoc.getThingDocuments();
for (int i = 0; i < thingDocs.length; i++) {
Template template = space.getTemplate(thingDocs[i].getTemplateID());
if (template == null) {
- TemplateDocument templateDoc = webClient.getTemplateDocument(thingDocs[i].getTemplateOwner(), thingDocs[i].getTemplateID());
+ TemplateDocument templateDoc = spaceDoc.getTemplateDocument(thingDocs[i].getTemplateID());
if (templateDoc == null) {
- throw new IllegalStateException("There was no template for thing: " + thingDocs[i].getThingID());
+ throw new IllegalStateException("There was no template doc for thing: " + thingDocs[i].getThingID());
}
template = new Template(templateDoc);
@@ -133,7 +133,7 @@
for (int j = 0; j < shapeDocs.length; j++) {
thing.addShape(new Shape(thing, shapeDocs[j]));
}
- PageDocument[] pageDocs = webClient.getPageDocuments(thing.getThingID());
+ PageDocument[] pageDocs = thingDocs[i].getPageDocuments();
for (int j = 0; j < pageDocs.length; j++) {
thing.addPage(new Page(thing, pageDocs[j].getPageID(), pageDocs[j].getContentType(), pageDocs[j].getWidth(), pageDocs[j].getHeight(), pageDocs[j].getTransform()));
}
@@ -145,11 +145,11 @@
}
- DoorDocument[] doorDocs = webClient.getDoorDocuments();
+ DoorDocument[] doorDocs = spaceDoc.getDoorDocuments();
for (int i = 0; i < doorDocs.length; i++) {
Template template = space.getTemplate(doorDocs[i].getTemplateID());
if (template == null) {
- TemplateDocument templateDoc = webClient.getTemplateDocument(doorDocs[i].getTemplateOwner(), doorDocs[i].getTemplateID());
+ TemplateDocument templateDoc = spaceDoc.getTemplateDocument(doorDocs[i].getTemplateID());
if (templateDoc == null) {
throw new IllegalStateException("There was no template for door: " + doorDocs[i].getDoorID());
}
Modified: spaces/trunk/src/com/ogoglio/sim/SpaceSimulator.java
===================================================================
--- spaces/trunk/src/com/ogoglio/sim/SpaceSimulator.java 2007-07-03 19:25:40 UTC (rev 212)
+++ spaces/trunk/src/com/ogoglio/sim/SpaceSimulator.java 2007-07-03 22:05:56 UTC (rev 213)
@@ -111,6 +111,10 @@
//TODO construct the space script
}
+ public Listener getListener() {
+ return listener;
+ }
+
public interface Listener {
public void generatedSpaceEvent(SpaceEvent event, SpaceSimulator spaceSimulator);
Modified: spaces/trunk/src/com/ogoglio/sim/site/SimServlet.java
===================================================================
--- spaces/trunk/src/com/ogoglio/sim/site/SimServlet.java 2007-07-03 19:25:40 UTC (rev 212)
+++ spaces/trunk/src/com/ogoglio/sim/site/SimServlet.java 2007-07-03 22:05:56 UTC (rev 213)
@@ -19,6 +19,7 @@
import java.net.URI;
import java.util.Date;
import java.util.Enumeration;
+import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletConfig;
@@ -42,11 +43,14 @@
import com.ogoglio.site.AbstractResourceServlet;
import com.ogoglio.site.AuthServlet;
import com.ogoglio.site.SiteResource;
+import com.ogoglio.site.SpaceServlet;
import com.ogoglio.util.StreamUtils;
import com.ogoglio.xml.DoorDocument;
import com.ogoglio.xml.PageDocument;
import com.ogoglio.xml.SettingDocument;
+import com.ogoglio.xml.SpaceDocument;
import com.ogoglio.xml.SpaceSimulatorDocument;
+import com.ogoglio.xml.TemplateDocument;
import com.ogoglio.xml.ThingDocument;
import com.ogoglio.xml.UserDocument;
@@ -91,7 +95,7 @@
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return;
}
-
+
if (ScriptHTTPRequest.USER_AGENT.equals(request.getHeader("User-agent"))) {
System.err.println(new Date() + ": A sim script tried to hit the sim web API. Ignored.");
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
@@ -122,7 +126,7 @@
addSubResource(new SpaceResource());
}
- public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElementsauthedAccount) throws ServletException, IOException {
+ public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
Object[] spaceSims = sim.getSpaceSimulators();
XMLElement result = new XMLElement("list");
for (int i = 0; i < spaceSims.length; i++) {
@@ -143,6 +147,59 @@
addSubResource(new LogResource());
addSubResource(new SettingsResource());
}
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
+ try {
+ long spaceID = Long.parseLong(pathElements[pathElements.length - 1]);
+ SpaceRecord spaceRecord = SpacePersistTasks.findSpaceBySpaceID(spaceID, getSessionFactory());
+ if (spaceRecord == null) {
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+
+ SpaceSimulator simulator = sim.getOrCreateSpaceSimulator(spaceRecord);
+
+ SpaceDocument spaceDoc = new SpaceDocument(spaceRecord);
+
+ if ("true".equals(request.getParameter(SpaceServlet.INCLUDE_CHILDREN_PARAM))) {
+ HashMap templateDocs = new HashMap();
+
+ ThingDocument[] thingDocs = simulator.getThingDocuments();
+ for (int i = 0; i < thingDocs.length; i++) {
+ PageDocument[] pageDocs = simulator.getPageDocuments(thingDocs[i].getThingID());
+ for (int j = 0; j < pageDocs.length; j++) {
+ thingDocs[i].addPageDocument(pageDocs[j]);
+ }
+
+ spaceDoc.addThingDocument(thingDocs[i]);
+ if(templateDocs.get(new Long(thingDocs[i].getTemplateID())) == null) {
+ templateDocs.put(new Long(thingDocs[i].getTemplateID()), simulator.getListener().getTemplateDocument(thingDocs[i].getTemplateID()));
+ }
+ }
+
+ TemplateDocument[] tempDocs = (TemplateDocument[])templateDocs.values().toArray(new TemplateDocument[0]);
+ for (int i = 0; i < tempDocs.length; i++) {
+ spaceDoc.addTemplateDocument(tempDocs[i]);
+ }
+
+ DoorDocument[] doorDocs = simulator.getDoorDocuments();
+ for (int i = 0; i < doorDocs.length; i++) {
+ spaceDoc.addDoorDocument(doorDocs[i]);
+ }
+
+ UserDocument[] userDocs = simulator.getUserDocuments();
+ for (int i = 0; i < userDocs.length; i++) {
+ spaceDoc.addUserDocument(userDocs[i]);
+ }
+ }
+
+ sendStringResponse(spaceDoc.toString(), "text/xml", response);
+ return;
+ } catch (PersistException e) {
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ return;
+ }
+ }
}
private class SettingsResource extends SiteResource {
@@ -260,12 +317,12 @@
}
String value = getFirstStringValue(request);
- if(value == null || value.trim().length() == 0) {
+ if (value == null || value.trim().length() == 0) {
System.err.println("Posted null value: " + request.getContentType());
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return;
}
-
+
SpaceSimulator simulator = sim.getOrCreateSpaceSimulator(spaceRecord);
simulator.putSetting(pathElements[pathElements.length - 1], value);
sendStringResponse(value, "text/plain", response);
Modified: spaces/trunk/src/com/ogoglio/site/SpaceServlet.java
===================================================================
--- spaces/trunk/src/com/ogoglio/site/SpaceServlet.java 2007-07-03 19:25:40 UTC (rev 212)
+++ spaces/trunk/src/com/ogoglio/site/SpaceServlet.java 2007-07-03 22:05:56 UTC (rev 213)
@@ -55,9 +55,9 @@
config.getServletContext().setAttribute(MESSAGE_PROXY_KEY, messageProxy);
} catch (IOException e) {
throw new ServletException("Could not start the message proxy: " + e);
- }
+ }
}
-
+
public void destroy() {
try {
super.destroy();
@@ -133,15 +133,37 @@
return;
}
- SpaceDocument result = new SpaceDocument(spaceRecord);
+ //This is a way to speed up the initial space load by including all space info in one round trip
+ //The simulator will handle this request, so we'll proxy
+ if ("true".equals(request.getParameter(INCLUDE_CHILDREN_PARAM))) {
+ SimRecord simRecord = SpacePersistTasks.findOrAssignSim(spaceRecord, getSessionFactory());
+ if (simRecord == null) {
+ System.err.println("Could not assign a sim to space " + spaceRecord.getSpaceID());
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ return;
+ }
- if ("true".equals(request.getParameter(INCLUDE_CHILDREN_PARAM))) {
- //TODO add ThingDocuments, TemplateDocuments, UserDocuments
+ String proxyURI = simRecord.getSimURI().toString();
+ for (int i = 0; i < pathElements.length; i++) {
+ proxyURI += pathElements[i] + "/";
+ }
+ proxyURI += "?" + request.getQueryString();
+ try {
+ proxy(new URI(proxyURI), "GET", request, response);
+ return;
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ return;
+ }
}
+ SpaceDocument result = new SpaceDocument(spaceRecord);
+
sendStringResponse(result.toString(), "text/xml", response);
return;
}
+
}
private class DoorsResource extends DescendingSiteResource { //NOTE this will proxy eveything below "door" in the URL space
@@ -361,7 +383,7 @@
return;
}
- if (!authedAccount.getUsername().equals(spaceRecord.getOwnerUsername())){
+ if (!authedAccount.getUsername().equals(spaceRecord.getOwnerUsername())) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return;
}
@@ -426,12 +448,12 @@
return;
}
- if(spaceRecord.getSimID() == -1) { //if the space isn't simulated, don't start it just to report 0 users
+ if (spaceRecord.getSimID() == -1) { //if the space isn't simulated, don't start it just to report 0 users
XMLElement list = new XMLElement("list");
sendStringResponse(list.toString(), "text/xml", response);
return;
}
-
+
SimRecord simRecord = SpacePersistTasks.findOrAssignSim(spaceRecord, getSessionFactory());
if (simRecord == null) {
System.err.println("Could not assign a sim to space " + spaceRecord.getSpaceID());
@@ -630,7 +652,7 @@
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return;
}
-
+
SimRecord[] simRecs = SimPersistTasks.findSims(getSessionFactory());
XMLElement list = new XMLElement("list");
@@ -639,9 +661,9 @@
try {
URI uri = new URI(simDoc.getSimURI().toString() + "space/");
XMLElement spaceList = WebAPIClient.fetchAuthenticatedXML(uri, null);
- if(spaceList != null) {
+ if (spaceList != null) {
XMLElement[] spaceElements = spaceList.getChildren(SpaceSimulatorDocument.NAME);
- if(spaceElements != null) {
+ if (spaceElements != null) {
for (int j = 0; j < spaceElements.length; j++) {
simDoc.addSpaceSimulatorDocument(new SpaceSimulatorDocument(spaceElements[j]));
}
@@ -652,7 +674,7 @@
} catch (Exception e) {
e.printStackTrace();
}
-
+
list.addChild(simDoc.toElement());
}
Modified: spaces/trunk/src/com/ogoglio/viewer/applet/AppletTestWindow.java
===================================================================
--- spaces/trunk/src/com/ogoglio/viewer/applet/AppletTestWindow.java 2007-07-03 19:25:40 UTC (rev 212)
+++ spaces/trunk/src/com/ogoglio/viewer/applet/AppletTestWindow.java 2007-07-03 22:05:56 UTC (rev 213)
@@ -22,10 +22,16 @@
import java.awt.Frame;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
+import java.io.IOException;
import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.net.URL;
import java.util.HashMap;
+import com.ogoglio.client.WebAPIUtil;
+import com.ogoglio.persist.ServiceInitializationPersistTasks;
+
public class AppletTestWindow extends Frame {
//static Dimension appDimension = new Dimension(640, 500);
@@ -56,8 +62,13 @@
}
HashMap parameters1 = new HashMap();
+ try {
+ String loginCookie = WebAPIUtil.authenticate(new URI(serviceURI), ServiceInitializationPersistTasks.LIBRARY_USERNAME, ServiceInitializationPersistTasks.DEFAULT_LIBRARY_PASSWORD);
+ parameters1.put("loginCookie", loginCookie);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
parameters1.put("loginCookie", "guestApplet_Test_Window2");
- //parameters1.put("loginCookie", TestPersistTasks.COOKIE1);
parameters1.put("spaceURI", spaceURI);
parameters1.put("serviceURI", serviceURI);
Modified: spaces/trunk/src/com/ogoglio/xml/SpaceDocument.java
===================================================================
--- spaces/trunk/src/com/ogoglio/xml/SpaceDocument.java 2007-07-03 19:25:40 UTC (rev 212)
+++ spaces/trunk/src/com/ogoglio/xml/SpaceDocument.java 2007-07-03 22:05:56 UTC (rev 213)
@@ -105,6 +105,29 @@
return results;
}
+ public void addTemplateDocument(TemplateDocument templateDoc) {
+ data.addChild(templateDoc.toElement());
+ }
+
+ public TemplateDocument getTemplateDocument(long templateID) {
+ TemplateDocument[] docs = getTemplateDocuments();
+ for (int i = 0; i < docs.length; i++) {
+ if(docs[i].getTemplateID() == templateID) {
+ return docs[i];
+ }
+ }
+ return null;
+ }
+
+ public TemplateDocument[] getTemplateDocuments() {
+ XMLElement[] elements = data.getChildren(TemplateDocument.NAME);
+ TemplateDocument[] results = new TemplateDocument[elements.length];
+ for (int i = 0; i < results.length; i++) {
+ results[i] = new TemplateDocument(elements[i]);
+ }
+ return results;
+ }
+
public ThingDocument[] getThingDocuments() {
XMLElement[] elements = data.getChildren(ThingDocument.NAME);
ThingDocument[] results = new ThingDocument[elements.length];
Modified: spaces/trunk/src/com/ogoglio/xml/ThingDocument.java
===================================================================
--- spaces/trunk/src/com/ogoglio/xml/ThingDocument.java 2007-07-03 19:25:40 UTC (rev 212)
+++ spaces/trunk/src/com/ogoglio/xml/ThingDocument.java 2007-07-03 22:05:56 UTC (rev 213)
@@ -43,6 +43,8 @@
for (int i = 0; i < shapes.length; i++) {
getData().addChild(new ShapeDocument(shapes[i]).toElement());
}
+
+ //we don't automatically store pages, because they're ephemeral between space instances
}
public ThingDocument(long thingID, String displayName, long templateID, String templateOwner, String ownerUsername, long possessionID, Transform3D transform, SplinePath splinePath) {
@@ -101,4 +103,17 @@
}
return results;
}
+
+ public void addPageDocument(PageDocument pageDoc) {
+ getData().addChild(pageDoc.toElement());
+ }
+
+ public PageDocument[] getPageDocuments() {
+ XMLElement[] elements = getData().getChildren(PageDocument.NAME);
+ PageDocument[] results = new PageDocument[elements.length];
+ for (int i = 0; i < results.length; i++) {
+ results[i] = new PageDocument(elements[i]);
+ }
+ return results;
+ }
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|