|
From: <ian...@us...> - 2007-08-01 01:19:20
|
Revision: 231
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=231&view=rev
Author: iansmith
Date: 2007-07-31 18:19:22 -0700 (Tue, 31 Jul 2007)
Log Message:
-----------
Added more support for template support files. The client
for synchronizing templates to the server now has all the
infrastructure necessary, but needs significant work to
make that functionality usable.
-------------------------------------------------------
Broke out TemplateResource into it's own file from the
AccountServlet. In this process tried to refactor to
avoid duplication.
Modified Paths:
--------------
spaces/trunk/build.xml
spaces/trunk/src/com/ogoglio/OgoglioTestSuite.java
spaces/trunk/src/com/ogoglio/client/ClientTests.java
spaces/trunk/src/com/ogoglio/client/WebAPIClient.java
spaces/trunk/src/com/ogoglio/persist/AccountPersistTasks.java
spaces/trunk/src/com/ogoglio/persist/TemplatePersistTasks.java
spaces/trunk/src/com/ogoglio/site/AccountServlet.java
spaces/trunk/src/com/ogoglio/templatesync/SyncTool.java
spaces/trunk/src/com/ogoglio/templatesync/SyncToolSpec.java
spaces/trunk/src/com/ogoglio/xml/TemplateDocument.java
Added Paths:
-----------
spaces/trunk/src/com/ogoglio/site/TemplateResource.java
spaces/trunk/src/com/ogoglio/templatesync/GeomComparator.java
spaces/trunk/src/com/ogoglio/templatesync/MaterialsComparator.java
spaces/trunk/src/com/ogoglio/templatesync/ScriptComparator.java
spaces/trunk/src/com/ogoglio/templatesync/TypedFileComparator.java
Modified: spaces/trunk/build.xml
===================================================================
--- spaces/trunk/build.xml 2007-07-23 02:22:26 UTC (rev 230)
+++ spaces/trunk/build.xml 2007-08-01 01:19:22 UTC (rev 231)
@@ -80,8 +80,8 @@
<pathelement location="${dest}"/>
</classpath>
<formatter type="brief" usefile="false" />
- <test name="com.ogoglio.templatesync.TemplateSyncTestSuite" />
- <!--<test name="com.ogoglio.OgoglioTestSuite" />-->
+ <!--<test name="com.ogoglio.templatesync.TemplateSyncTestSuite" /> -->
+ <test name="com.ogoglio.OgoglioTestSuite" />
<jvmarg value="-Demma.coverage.out.file=${coverage.dir}/coverage.emma" />
<jvmarg value="-Demma.coverage.out.merge=false" />
Modified: spaces/trunk/src/com/ogoglio/OgoglioTestSuite.java
===================================================================
--- spaces/trunk/src/com/ogoglio/OgoglioTestSuite.java 2007-07-23 02:22:26 UTC (rev 230)
+++ spaces/trunk/src/com/ogoglio/OgoglioTestSuite.java 2007-08-01 01:19:22 UTC (rev 231)
@@ -19,6 +19,7 @@
import com.ogoglio.client.ClientTests;
import com.ogoglio.persist.PersistTests;
import com.ogoglio.sim.script.ScriptTests;
+import com.ogoglio.templatesync.TemplateSyncTestSuite;
import com.ogoglio.viewer.j3d.obj.ObjTest;
import com.ogoglio.xml.XMLTests;
@@ -30,6 +31,7 @@
suite.addTestSuite(PersistTests.class);
suite.addTestSuite(ClientTests.class);
suite.addTestSuite(ScriptTests.class);
+ suite.addTest(TemplateSyncTestSuite.suite());
return suite;
}
}
Modified: spaces/trunk/src/com/ogoglio/client/ClientTests.java
===================================================================
--- spaces/trunk/src/com/ogoglio/client/ClientTests.java 2007-07-23 02:22:26 UTC (rev 230)
+++ spaces/trunk/src/com/ogoglio/client/ClientTests.java 2007-08-01 01:19:22 UTC (rev 231)
@@ -420,15 +420,28 @@
}
private void checkGeomAndResourceStreamsOfTemplate(WebAPIClient webClient1, long templateID) throws IOException {
+ URI templateURI = webClient1.getTemplateURI(USERNAME1, templateID);
//get the geom for a template owned by this user
- InputStream stream = webClient1.getGeometryStream(webClient1.getTemplateURI(USERNAME1, templateID), 0);
+ InputStream stream = webClient1.getGeometryStream(templateURI, 0);
assertNotNull(stream);
consume(stream);
//get a material file for the same template
- stream = webClient1.getGeometryStream(webClient1.getTemplateURI(USERNAME1, templateID), "TestCube.mtl");
+ stream = webClient1.getGeometryStream(templateURI, "TestCube.mtl");
assertNotNull(stream);
consume(stream);
+
+ assertTrue(webClient1.deleteGeometryStream(templateID, 0));
+ try {
+ webClient1.getGeometryStream(templateURI, 0);
+ fail("Shouldn't be able to get a deleted stream!");
+ } catch (IOException e) {
+ //can't get the stream because we just deleted it
+ assertTrue(e.getMessage().indexOf("404")!=-1); //very weak test
+ }
+
+ webClient1.putGeometryStream(templateURI,
+ new FileInputStream("src/com/ogoglio/persist/resources/TestCylinder.obj"), 0);
}
private void checkPageManipulation(WebAPIClient webClient1, ThingDocument someThing) throws IOException {
Modified: spaces/trunk/src/com/ogoglio/client/WebAPIClient.java
===================================================================
--- spaces/trunk/src/com/ogoglio/client/WebAPIClient.java 2007-07-23 02:22:26 UTC (rev 230)
+++ spaces/trunk/src/com/ogoglio/client/WebAPIClient.java 2007-08-01 01:19:22 UTC (rev 231)
@@ -375,13 +375,33 @@
}
// XXX: IES: should this be "post" not put?
public void putGeometryStream(URI rootURI, InputStream input, int lodIndex) throws IOException {
- wire.performPOST(WebAPIUtil.appendToURI(rootURI, "geometry/data/" + lodIndex), StreamUtils.readInput(input), "application/octet-stream", authCookie);
+ wire.performPOST(WebAPIUtil.appendToURI(rootURI, formGeometrySuffix(lodIndex)), StreamUtils.readInput(input), "application/octet-stream", authCookie);
}
// XXX IES: should this be called "post" not put? used to be putGeometryStream but that was wholly deceptive
public void putTemplateSupportFile(URI rootURI, InputStream input, String name) throws IOException {
- wire.performPOST(WebAPIUtil.appendToURI(rootURI, "geometry/" + name), StreamUtils.readInput(input), "application/octet-stream", authCookie);
+ wire.performPOST(WebAPIUtil.appendToURI(rootURI, formMaterialSuffix(name)), StreamUtils.readInput(input), "application/octet-stream", authCookie);
}
-
+ public void updateTemplateScript(long templateID, String script) throws IOException {
+ if (script == null || script.trim().length() == 0) {
+ wire.sendDelete(getTemplateScriptURI(templateID), authCookie);
+ return;
+ }
+ wire.performPOST(getTemplateScriptURI(templateID), script, "text/plain", authCookie);
+ }
+ private String formGeometrySuffix(int lod) {
+ return "geometry/data/" + lod;
+ }
+ private String formMaterialSuffix(String name) {
+ return "geometry/" + name;
+ }
+ public boolean deleteGeometryStream(long templateID, int lodIndex) throws IOException {
+ return wire.sendDelete(WebAPIUtil.appendToURI(getTemplateURI(getAuthUsername(),templateID),
+ formGeometrySuffix(lodIndex)), authCookie);
+ }
+ public boolean deleteTemplateSupportFile(long templateID, String name) throws IOException {
+ return wire.sendDelete(WebAPIUtil.appendToURI(getTemplateURI(getAuthUsername(),templateID),
+ formMaterialSuffix(name)), authCookie);
+ }
/*
* End of new style: IES HACK
*/
@@ -415,14 +435,6 @@
}
}
- public void updateTemplateScript(long templateID, String script) throws IOException {
- if (script == null || script.trim().length() == 0) {
- sendDelete(getTemplateScriptURI(templateID), authCookie);
- return;
- }
- performPOST(getTemplateScriptURI(templateID), script, "text/plain", authCookie);
- }
-
public ThingDocument[] getThingDocuments() throws IOException {
Vector results = new Vector();
Modified: spaces/trunk/src/com/ogoglio/persist/AccountPersistTasks.java
===================================================================
--- spaces/trunk/src/com/ogoglio/persist/AccountPersistTasks.java 2007-07-23 02:22:26 UTC (rev 230)
+++ spaces/trunk/src/com/ogoglio/persist/AccountPersistTasks.java 2007-08-01 01:19:22 UTC (rev 231)
@@ -102,7 +102,8 @@
public Object run(Session hibernateSession) {
Query query = hibernateSession.getNamedQuery(ACCOUNT_BY_COOKIE);
query.setParameter("cookie", cookie);
- return query.uniqueResult();
+ AccountRecord rec=(AccountRecord)query.uniqueResult();
+ return rec;
}
};
task.setSessionFactory(sessionFactory);
Modified: spaces/trunk/src/com/ogoglio/persist/TemplatePersistTasks.java
===================================================================
--- spaces/trunk/src/com/ogoglio/persist/TemplatePersistTasks.java 2007-07-23 02:22:26 UTC (rev 230)
+++ spaces/trunk/src/com/ogoglio/persist/TemplatePersistTasks.java 2007-08-01 01:19:22 UTC (rev 231)
@@ -13,6 +13,8 @@
limitations under the License. */
package com.ogoglio.persist;
+import java.util.Date;
+
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
@@ -141,4 +143,87 @@
task.setSessionFactory(sessionFactory);
return task.execute() == Boolean.TRUE;
}
+ // XXX this should be unified with its brothers that updates the same for scripts and geom
+ public static void updateSupportFileTemplateLastModified(TemplateRecord record, String name, boolean newValue, SessionFactory sessionFactory) throws PersistException {
+ TemplateSupportFileRecord scriptRec = record.findSupportFile(name);
+ boolean currentValue;
+
+ if (scriptRec==null) {
+ currentValue = false;
+ } else {
+ currentValue=true;
+ }
+
+ if (currentValue==newValue) {
+ if (newValue==false) {
+ return; //nothing to do
+ }
+ //only thing to do is refresh timestamp
+ scriptRec.setLastChanged(new Date());
+ } else {
+ if (newValue==true) {
+ scriptRec= TemplateSupportFilePersistTasks.createSupportFileForMaterial(name, sessionFactory);
+ record.addTemplateSupportFileRecord(scriptRec);
+ } else {
+ record.getSupportFiles().remove(scriptRec);
+ }
+ }
+ TemplatePersistTasks.update(record, sessionFactory);
+ }
+ // XXX this should be unified with its brother that updates the same for scripts or support files
+ public static void updateGeometryFileTemplateLastModified(TemplateRecord record, int LOD, boolean newValue, SessionFactory sessionFactory) throws PersistException {
+ TemplateSupportFileRecord scriptRec = record.findGeometryFileRec(LOD);
+ boolean currentValue;
+
+ if (scriptRec==null) {
+ currentValue = false;
+ } else {
+ currentValue=true;
+ }
+
+ if (currentValue==newValue) {
+ if (newValue==false) {
+ return; //nothing to do
+ }
+ //only thing to do is refresh timestamp
+ scriptRec.setLastChanged(new Date());
+ } else {
+ if (newValue==true) {
+ scriptRec= TemplateSupportFilePersistTasks.createSupportFileForGeometry(LOD, sessionFactory);
+ record.addTemplateSupportFileRecord(scriptRec);
+ } else {
+ record.getSupportFiles().remove(scriptRec);
+ }
+ }
+ TemplatePersistTasks.update(record, sessionFactory);
+ }
+ public static void updateScriptFilePropOfTemplate(TemplateRecord record, boolean newValue, SessionFactory sessionFactory) throws PersistException {
+ TemplateSupportFileRecord scriptRec = record.findScriptFileRec();
+ boolean currentValue;
+
+ if (scriptRec==null) {
+ currentValue = false;
+ } else {
+ currentValue=true;
+ }
+
+ if (currentValue==newValue) {
+ if (newValue==false) {
+ return; //nothing to do
+ }
+ //only thing to do is refresh timestamp
+ scriptRec.setLastChanged(new Date());
+ } else {
+ if (newValue==true) {
+ scriptRec= TemplateSupportFilePersistTasks.createSupportFileForScript(sessionFactory);
+ record.addTemplateSupportFileRecord(scriptRec);
+ } else {
+ record.getSupportFiles().remove(scriptRec);
+ }
+ }
+ TemplatePersistTasks.update(record, sessionFactory);
+ }
}
+
+
+
Modified: spaces/trunk/src/com/ogoglio/site/AccountServlet.java
===================================================================
--- spaces/trunk/src/com/ogoglio/site/AccountServlet.java 2007-07-23 02:22:26 UTC (rev 230)
+++ spaces/trunk/src/com/ogoglio/site/AccountServlet.java 2007-08-01 01:19:22 UTC (rev 231)
@@ -18,7 +18,6 @@
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Date;
-import java.util.zip.GZIPOutputStream;
import javax.media.j3d.Transform3D;
import javax.servlet.ServletConfig;
@@ -28,7 +27,6 @@
import nanoxml.XMLElement;
-import com.ogoglio.client.DecoratedInputStream;
import com.ogoglio.client.WebAPIClient;
import com.ogoglio.client.WebAPIUtil;
import com.ogoglio.media.MediaService;
@@ -47,8 +45,6 @@
import com.ogoglio.persist.SpaceRecord;
import com.ogoglio.persist.TemplatePersistTasks;
import com.ogoglio.persist.TemplateRecord;
-import com.ogoglio.persist.TemplateSupportFilePersistTasks;
-import com.ogoglio.persist.TemplateSupportFileRecord;
import com.ogoglio.sim.Sim;
import com.ogoglio.util.StreamUtils;
import com.ogoglio.xml.AccountDocument;
@@ -268,7 +264,7 @@
public class TemplatesResource extends AuthenticatedSiteResource {
public TemplatesResource() {
super("template", true, getSessionFactory());
- addSubResource(new TemplateResource());
+ addSubResource(new TemplateResource(getSessionFactory(),getMediaService()));
}
public void doPost(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
@@ -291,7 +287,8 @@
}
- public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
+ public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElements,
+ AccountRecord authedAccount) throws PersistException, ServletException, IOException {
String usernameParam = pathElements[pathElements.length - 2];
AccountRecord requestedAccount = AccountPersistTasks.findAccountByUsername(usernameParam, getSessionFactory());
if (requestedAccount == null) {
@@ -309,566 +306,6 @@
}
}
- private class TemplateGeometryResource extends DescendingSiteResource {
- public TemplateGeometryResource() {
- super("geometry");
- }
-
-
- public void doPost(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
- String usernameParam = pathElements[1];
- try {
- AccountRecord authedAccount = getAuthedAccount(request, response);
- if (authedAccount==null) {
- return;
- }
- AccountRecord requestedAccount = getRequestedAccount(response, usernameParam);
- if (requestedAccount==null) {
- return;
- }
-
- if (verifyAccountHolderIsOk(response, authedAccount, requestedAccount)==false) {
- return;
- }
-
- Long tid = checkTemplateIDIsOk(response, authedAccount, requestedAccount, pathElements);
- if (tid==null) {
- return;
- }
- long templateID = tid.longValue();
-
- //trying to post to just /template/<TID>/geometry
- if (pathElements.length == 5) {
- response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- return;
- }
- //trying to post to /geometry/data but requires an LOD number
- if (pathElements.length == 6 && "data".equals(pathElements[pathElements.length - 1])) {
- response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- return;
- };
- //posting to /geometry/data/<number>
- if (pathElements.length == 7 && "data".equals(pathElements[pathElements.length - 2])) {
- InputStream fileInput;
- //is this coming from a browser?
- if (request.getContentType() != null && request.getContentType().startsWith("multipart/form-data")) {
- fileInput = getFirstFile(request, Sim.MAX_GEOMETRY_SIZE);
- if (fileInput == null) {
- response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
- return;
- }
- } else {
- //coming from a sensible browser, just get the file input
- fileInput=request.getInputStream();
- }
- int LOD=-2995;
- try {
- LOD=Integer.parseInt(pathElements[pathElements.length -1]);
- } catch (NumberFormatException e) {
- response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
- return;
- }
- String templateGeometryName = MediaService.getTemplateGeometryName(templateID, LOD);
- getMediaService().write(templateGeometryName, fileInput, Sim.MAX_GEOMETRY_SIZE);
- TemplateRecord record = TemplatePersistTasks.findTemplateByTemplateID(templateID, getSessionFactory());
- updateGeometryFileTemplateLastModified(record, LOD, true);
- } else {
- //posting to /geometry/<filename> for a support file like a texture or material
- InputStream fileInput;
- //from a browser?
- if (request.getContentType() != null && request.getContentType().startsWith("multipart/form-data")) {
- fileInput = getFirstFile(request, Sim.MAX_GEOMETRY_RESOURCE_SIZE);
- if (fileInput == null) {
- response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
- return;
- }
- } else {
- fileInput=request.getInputStream();
- }
- String rawName=pathElements[pathElements.length -1 ];
- String templateResourceName = MediaService.getTemplateResourceName(templateID, rawName);
- getMediaService().write(templateResourceName, fileInput, Sim.MAX_GEOMETRY_RESOURCE_SIZE);
- TemplateRecord record = TemplatePersistTasks.findTemplateByTemplateID(templateID, getSessionFactory());
- updateSupportFileTemplateLastModified(record, rawName, true);
- }
- response.setStatus(HttpServletResponse.SC_OK);
- return;
- } catch (PersistException e) {
- handlePersistException(response, e);
- return;
- }
- }
- // XXX this should be unified with its brothers that updates the same for scripts and geom
- private void updateSupportFileTemplateLastModified(TemplateRecord record, String name, boolean newValue) throws PersistException {
- TemplateSupportFileRecord scriptRec = record.findSupportFile(name);
- boolean currentValue;
-
- if (scriptRec==null) {
- currentValue = false;
- } else {
- currentValue=true;
- }
-
- if (currentValue==newValue) {
- if (newValue==false) {
- return; //nothing to do
- }
- //only thing to do is refresh timestamp
- scriptRec.setLastChanged(new Date());
- } else {
- if (newValue==true) {
- scriptRec= TemplateSupportFilePersistTasks.createSupportFileForMaterial(name, getSessionFactory());
- record.addTemplateSupportFileRecord(scriptRec);
- } else {
- record.getSupportFiles().remove(scriptRec);
- }
- }
- TemplatePersistTasks.update(record, getSessionFactory());
- }
-
- // XXX this should be unified with its brother that updates the same for scripts
- private void updateGeometryFileTemplateLastModified(TemplateRecord record, int LOD, boolean newValue) throws PersistException {
- TemplateSupportFileRecord scriptRec = record.findGeometryFileRec(LOD);
- boolean currentValue;
-
- if (scriptRec==null) {
- currentValue = false;
- } else {
- currentValue=true;
- }
-
- if (currentValue==newValue) {
- if (newValue==false) {
- return; //nothing to do
- }
- //only thing to do is refresh timestamp
- scriptRec.setLastChanged(new Date());
- } else {
- if (newValue==true) {
- scriptRec= TemplateSupportFilePersistTasks.createSupportFileForGeometry(LOD, getSessionFactory());
- record.addTemplateSupportFileRecord(scriptRec);
- } else {
- record.getSupportFiles().remove(scriptRec);
- }
- }
- TemplatePersistTasks.update(record, getSessionFactory());
- }
-
-
- private void handlePersistException(HttpServletResponse response, PersistException e) {
- e.printStackTrace();
- response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- }
-
- private Long checkTemplateIDIsOk(HttpServletResponse response, AccountRecord authedAccount, AccountRecord requestedAccount,String[] pathElements) throws PersistException {
- long templateID = Long.parseLong(pathElements[3]);
- TemplateRecord record = TemplatePersistTasks.findTemplateByTemplateID(templateID, getSessionFactory());
- if (record == null || !record.getOwnerUsername().equals(requestedAccount.getUsername())) {
- response.setStatus(HttpServletResponse.SC_NOT_FOUND);
- return null;
- }
- return new Long(templateID);
- }
-
- private boolean verifyAccountHolderIsOk(HttpServletResponse response, AccountRecord authedAccount, AccountRecord requestedAccount) {
- if (!requestedAccount.getUsername().equals(authedAccount.getUsername())) {
- response.setStatus(HttpServletResponse.SC_FORBIDDEN);
- return false;
- }
- return true;
- }
-
-
- private AccountRecord getRequestedAccount(HttpServletResponse response, String usernameParam) throws PersistException {
- AccountRecord requestedAccount = AccountPersistTasks.findAccountByUsername(usernameParam, getSessionFactory());
- if (requestedAccount == null) {
- response.setStatus(HttpServletResponse.SC_NOT_FOUND);
- return null;
- }
- return requestedAccount;
- }
-
-
- private AccountRecord getAuthedAccount(HttpServletRequest request, HttpServletResponse response) throws PersistException {
- AccountRecord authedAccount = AuthServlet.getAuthedAccountRecord(request, getSessionFactory());
- if (authedAccount == null) {
- response.setStatus(HttpServletResponse.SC_FORBIDDEN);
- return null;
- }
- return authedAccount;
- }
- public void doPut(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
- String usernameParam = pathElements[1];
- System.out.println("XXX WHO IS CALLING PUT ON A TEMPLATE GEOM RESOURCE???");
- for (int i=0; i<pathElements.length;++i) System.out.println("XXX PUT: "+i+" ->"+pathElements[i]);
- try {
- AccountRecord authedAccount = getAuthedAccount(request, response);
- if (authedAccount==null) {
- return;
- }
- AccountRecord requestedAccount = getRequestedAccount(response, usernameParam);
- if (requestedAccount==null) {
- return;
- }
-
- if (verifyAccountHolderIsOk(response, authedAccount, requestedAccount)==false) {
- return;
- }
-
- String geomFileName = verifyParamsAreOk(response,pathElements);
- if (geomFileName==null) {
- return;
- }
- Long tid = checkTemplateIDIsOk(response, authedAccount, requestedAccount, pathElements);
- if (tid==null) {
- return;
- }
- } catch (PersistException e) {
- handlePersistException(response, e);
- }
- }
- private String verifyParamsAreOk(HttpServletResponse response, String[] pathElements) {
- if (pathElements.length!=7) {
- response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- return null;
- }
- if ((pathElements[4].equals("geometry")==false) || (pathElements[5].equals("data")==false)) {
- response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- return null;
- }
-
- if ((pathElements[6]==null) || (pathElements[6].equals("")==true) || (pathElements[6].indexOf('-')!=-1)) {
- response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
- return null;
- }
- return pathElements[6];
- }
-
-
- public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
- String usernameParam = pathElements[1];
- try {
- AccountRecord authedAccount = AuthServlet.getAuthedAccountRecord(request, getSessionFactory());
- if (authedAccount == null && !AuthServlet.isGuest(request)) {
- response.setStatus(HttpServletResponse.SC_FORBIDDEN);
- return;
- }
-
- AccountRecord requestedAccount = AccountPersistTasks.findAccountByUsername(usernameParam, getSessionFactory());
- if (requestedAccount == null) {
- response.setStatus(HttpServletResponse.SC_NOT_FOUND);
- return;
- }
-
- long templateID = Long.parseLong(pathElements[3]);
- TemplateRecord record = TemplatePersistTasks.findTemplateByTemplateID(templateID, getSessionFactory());
- if (record == null || !record.getOwnerUsername().equals(requestedAccount.getUsername())) {
- response.setStatus(HttpServletResponse.SC_NOT_FOUND);
- return;
- }
-
- if (pathElements.length == 5) {
- sendStringResponse("This is where a geometry document would be.", "text/plain", response);
- return;
- }
-
- DecoratedInputStream data = null;
- if (pathElements.length == 7 && "data".equals(pathElements[pathElements.length - 2])) {
- data = getMediaService().getData(MediaService.getTemplateGeometryName(templateID, Integer.parseInt(pathElements[pathElements.length - 1])));
- } else {
- data = getMediaService().getData(MediaService.getTemplateResourceName(templateID, pathElements[pathElements.length - 1]));
- }
- if (data == null) {
- response.setStatus(HttpServletResponse.SC_NOT_FOUND);
- return;
- }
- response.setStatus(HttpServletResponse.SC_OK);
- setCachable(response);
- if (data.getMimeType() != null) {
- response.setContentType(data.getMimeType());
- }
- if ("gzip".equals(request.getHeader("Accept-encoding"))) {
- response.setHeader("Content-encoding", "gzip");
- StreamUtils.write(data, new GZIPOutputStream(response.getOutputStream()));
- } else {
- if (data.getLength() > -1) {
- response.setContentLength((int) data.getLength());
- }
- StreamUtils.write(data, response.getOutputStream());
- }
- } catch (PersistException e) {
- handlePersistException(response, e);
- return;
- }
- }
-
- public void doHead(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
- String usernameParam = pathElements[1];
- try {
- AccountRecord authedAccount = AuthServlet.getAuthedAccountRecord(request, getSessionFactory());
- if (authedAccount == null && !AuthServlet.isGuest(request)) {
- response.setStatus(HttpServletResponse.SC_FORBIDDEN);
- return;
- }
-
- AccountRecord requestedAccount = AccountPersistTasks.findAccountByUsername(usernameParam, getSessionFactory());
- if (requestedAccount == null) {
- response.setStatus(HttpServletResponse.SC_NOT_FOUND);
- return;
- }
-
- long templateID = Long.parseLong(pathElements[3]);
- TemplateRecord record = TemplatePersistTasks.findTemplateByTemplateID(templateID, getSessionFactory());
- if (record == null || !record.getOwnerUsername().equals(requestedAccount.getUsername())) {
- response.setStatus(HttpServletResponse.SC_NOT_FOUND);
- return;
- }
-
- if (pathElements.length == 5) {
- sendStringResponse("This is where a geometry document would be.", "text/plain", response);
- return;
- }
-
- String mediaName = null;
- if (pathElements.length == 7 && "data".equals(pathElements[pathElements.length - 2])) {
- mediaName = MediaService.getTemplateGeometryName(templateID, Integer.parseInt(pathElements[pathElements.length - 1]));
- } else {
- mediaName = MediaService.getTemplateResourceName(templateID, pathElements[pathElements.length - 1]);
- }
-
- long length = getMediaService().getSize(mediaName);
- if (length == -1) {
- response.setStatus(HttpServletResponse.SC_NOT_FOUND);
- return;
- }
-
- long lastModified = getMediaService().getLastModified(mediaName);
-
- setCachable(response);
- response.setStatus(HttpServletResponse.SC_OK);
- response.setContentLength((int) length);
- response.setDateHeader("Last-Modified", lastModified);
- } catch (PersistException e) {
- handlePersistException(response, e);
- return;
- }
- }
- }
-
- private class TemplateScriptResource extends AuthenticatedSiteResource {
- public TemplateScriptResource() {
- super("script", true, getSessionFactory());
- }
-
- public void doPost(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
- AccountRecord requestedAccount = verifyAccount(response, pathElements);
- if (requestedAccount==null) {
- return;
- }
- TemplateRecord record = verifyTemplateExists(response, pathElements, requestedAccount);
- if (record==null) {
- return;
- }
- String script = getFirstStringValue(request);
- if (script == null) {
- InputStream scriptStream = getFirstFile(request, Sim.MAX_SCRIPT_SIZE);
- if (scriptStream == null) {
- response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
- return;
- }
- script = StreamUtils.readInput(scriptStream);
- }
- if (!getMediaService().write(MediaService.getTemplateScriptName(record.getTemplateID()), script)) {
- response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- return;
- }
-
- updateScriptFilePropOfTemplate(record,true);
-
- response.setStatus(HttpServletResponse.SC_OK);
- return;
- }
-
- private void updateScriptFilePropOfTemplate(TemplateRecord record, boolean newValue) throws PersistException {
- TemplateSupportFileRecord scriptRec = record.findScriptFileRec();
- boolean currentValue;
-
- if (scriptRec==null) {
- currentValue = false;
- } else {
- currentValue=true;
- }
-
- if (currentValue==newValue) {
- if (newValue==false) {
- return; //nothing to do
- }
- //only thing to do is refresh timestamp
- scriptRec.setLastChanged(new Date());
- } else {
- if (newValue==true) {
- scriptRec= TemplateSupportFilePersistTasks.createSupportFileForScript(sessionFactory);
- record.addTemplateSupportFileRecord(scriptRec);
- } else {
- record.getSupportFiles().remove(scriptRec);
- }
- }
- TemplatePersistTasks.update(record, sessionFactory);
- }
-
- private TemplateRecord verifyTemplateExists(HttpServletResponse response, String[] pathElements, AccountRecord requestedAccount) throws PersistException {
- TemplateRecord record = TemplatePersistTasks.findTemplateByTemplateID(Long.parseLong(pathElements[3]), getSessionFactory());
- if (record == null) {
- response.setStatus(HttpServletResponse.SC_NOT_FOUND);
- return null;
- }
- if (!requestedAccount.getUsername().equals(record.getOwnerUsername())) {
- response.setStatus(HttpServletResponse.SC_FORBIDDEN);
- return null;
- }
- return record;
- }
-
- private AccountRecord verifyAccount(HttpServletResponse response, String[] pathElements) throws PersistException {
- String usernameParam = pathElements[1];
- AccountRecord requestedAccount = AccountPersistTasks.findAccountByUsername(usernameParam, getSessionFactory());
- if (requestedAccount == null) {
- response.setStatus(HttpServletResponse.SC_NOT_FOUND);
- return null;
- }
- return requestedAccount;
- }
-
- public void doDelete(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
- AccountRecord requestedAccount = verifyAccount(response, pathElements);
- if (requestedAccount==null) {
- return;
- }
- TemplateRecord record = verifyTemplateExists(response, pathElements, requestedAccount);
- if (record==null) {
- return;
- }
-
- if (!getMediaService().delete(MediaService.getTemplateScriptName(record.getTemplateID()))) {
- response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- return;
- }
- updateScriptFilePropOfTemplate(record, false);
-
- response.setStatus(HttpServletResponse.SC_OK);
- return;
- }
-
- public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
-
- AccountRecord requestedAccount = verifyAccount(response, pathElements);
- if (requestedAccount==null) {
- return;
- }
- TemplateRecord record = verifyTemplateExists(response, pathElements, requestedAccount);
- if (record==null) {
- return;
- }
- InputStream data = getMediaService().getData(MediaService.getTemplateScriptName(record.getTemplateID()));
- if (data == null) {
- response.setStatus(HttpServletResponse.SC_NOT_FOUND);
- return;
- } else {
- response.setStatus(HttpServletResponse.SC_OK);
- response.setContentType("text/plain");
- StreamUtils.write(data, response.getOutputStream());
- }
- }
- }
-
- public class TemplateResource extends AuthenticatedSiteResource {
- public TemplateResource() {
- super(SiteResource.LONG_ELEMENT, false, getSessionFactory());
- addSubResource(new TemplateGeometryResource());
- addSubResource(new TemplateScriptResource());
- }
-
- public void doDelete(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
- AccountRecord requestedAccount = verifyAccountFromPathElements(response, pathElements);
- if (requestedAccount==null) {
- return;
- }
-
- TemplateRecord record = verifyTemplateIDFromPathElements(response, pathElements);
- if (record==null) {
- return;
- }
- if (!TemplatePersistTasks.deleteTemplate(record, getSessionFactory())) {
- response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- return;
- }
- response.setStatus(HttpServletResponse.SC_OK);
- }
-
- public void doPost(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
- AccountRecord requestedAccount = verifyAccountFromPathElements(response, pathElements);
- if (requestedAccount==null) {
- return;
- }
-
- TemplateRecord record = verifyTemplateIDFromPathElements(response, pathElements);
- if (record==null) {
- return;
- }
-
- if (authedAccount == null || !requestedAccount.getUsername().equals(authedAccount.getUsername())) {
- response.setStatus(HttpServletResponse.SC_FORBIDDEN);
- return;
- }
-
- TemplateDocument newDoc = new TemplateDocument(parseXML(request.getInputStream()));
- TemplateRecord updatedRec = TemplatePersistTasks.update(newDoc, record, getSessionFactory());
- if (updatedRec == null) {
- response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
- return;
- }
-
- newDoc = new TemplateDocument(updatedRec);
-
- sendStringResponse(newDoc.toString(), "text/xml", response);
- }
-
- private TemplateRecord verifyTemplateIDFromPathElements(HttpServletResponse response, String[] pathElements) throws PersistException {
- long templateID = Long.parseLong(pathElements[pathElements.length - 1]);
- TemplateRecord record = TemplatePersistTasks.findTemplateByTemplateID(templateID, getSessionFactory());
- if (record == null) {
- response.setStatus(HttpServletResponse.SC_NOT_FOUND);
- return null;
- }
- return record;
- }
-
- private AccountRecord verifyAccountFromPathElements(HttpServletResponse response, String[] pathElements) throws PersistException {
- String usernameParam = pathElements[pathElements.length - 3];
- AccountRecord requestedAccount = AccountPersistTasks.findAccountByUsername(usernameParam, getSessionFactory());
- if (requestedAccount == null) {
- response.setStatus(HttpServletResponse.SC_NOT_FOUND);
- return null;
- }
- return requestedAccount;
- }
-
- public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
- AccountRecord requestedAccount = verifyAccountFromPathElements(response, pathElements);
- if (requestedAccount==null) {
- return;
- }
-
- TemplateRecord record = verifyTemplateIDFromPathElements(response, pathElements);
- if (record==null) {
- return;
- }
- TemplateDocument result = new TemplateDocument(record);
- sendStringResponse(result.toString(), "text/xml", response);
-
- }
- }
-
private class SpacesResource extends AuthenticatedSiteResource {
public SpacesResource() {
super("space", true, getSessionFactory());
Added: spaces/trunk/src/com/ogoglio/site/TemplateResource.java
===================================================================
--- spaces/trunk/src/com/ogoglio/site/TemplateResource.java (rev 0)
+++ spaces/trunk/src/com/ogoglio/site/TemplateResource.java 2007-08-01 01:19:22 UTC (rev 231)
@@ -0,0 +1,587 @@
+package com.ogoglio.site;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.zip.GZIPOutputStream;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.hibernate.SessionFactory;
+
+import com.ogoglio.client.DecoratedInputStream;
+import com.ogoglio.media.MediaService;
+import com.ogoglio.persist.AccountPersistTasks;
+import com.ogoglio.persist.AccountRecord;
+import com.ogoglio.persist.PersistException;
+import com.ogoglio.persist.TemplatePersistTasks;
+import com.ogoglio.persist.TemplateRecord;
+import com.ogoglio.persist.TemplateSupportFileRecord;
+import com.ogoglio.sim.Sim;
+import com.ogoglio.util.StreamUtils;
+import com.ogoglio.xml.TemplateDocument;
+
+public class TemplateResource extends AuthenticatedSiteResource {
+ private SessionFactory sessionFactory;
+ private MediaService mediaService;
+
+ public TemplateResource(SessionFactory factory, MediaService service) {
+ super(SiteResource.LONG_ELEMENT, false, factory);
+ addSubResource(new TemplateGeometryResource());
+ addSubResource(new TemplateScriptResource(factory));
+ sessionFactory=factory;
+ mediaService=service;
+ }
+ public SessionFactory getSessionFactory() {
+ return sessionFactory;
+ }
+ public InputStream getFirstFile(HttpServletRequest request,long maxSize) throws IOException {
+ return AbstractResourceServlet.getFirstFile(request, maxSize);
+ }
+ public MediaService getMediaService() {
+ return mediaService;
+ }
+ public void setCachable(HttpServletResponse response) {
+ AbstractResourceServlet.setCachable(response);
+ }
+ public String getFirstStringValue(HttpServletRequest request) throws IOException {
+ return AbstractResourceServlet.getFirstStringValue(request);
+ }
+
+
+ public void doDelete(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
+ AccountRecord requestedAccount = verifyAccountFromPathElements(response, pathElements);
+ if (requestedAccount==null) {
+ return;
+ }
+
+ TemplateRecord record = verifyTemplateIDFromPathElements(response, pathElements);
+ if (record==null) {
+ return;
+ }
+ if (!TemplatePersistTasks.deleteTemplate(record, getSessionFactory())) {
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ return;
+ }
+ response.setStatus(HttpServletResponse.SC_OK);
+ }
+
+ public void doPost(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
+ AccountRecord requestedAccount = verifyAccountFromPathElements(response, pathElements);
+ if (requestedAccount==null) {
+ return;
+ }
+
+ TemplateRecord record = verifyTemplateIDFromPathElements(response, pathElements);
+ if (record==null) {
+ return;
+ }
+
+ if (authedAccount == null || !requestedAccount.getUsername().equals(authedAccount.getUsername())) {
+ response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+ return;
+ }
+
+ TemplateDocument newDoc = new TemplateDocument(parseXML(request.getInputStream()));
+ TemplateRecord updatedRec = TemplatePersistTasks.update(newDoc, record, getSessionFactory());
+ if (updatedRec == null) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ return;
+ }
+
+ newDoc = new TemplateDocument(updatedRec);
+
+ sendStringResponse(newDoc.toString(), "text/xml", response);
+ }
+
+ private TemplateRecord verifyTemplateIDFromPathElements(HttpServletResponse response, String[] pathElements) throws PersistException {
+ long templateID = Long.parseLong(pathElements[pathElements.length - 1]);
+ TemplateRecord record = TemplatePersistTasks.findTemplateByTemplateID(templateID, getSessionFactory());
+ if (record == null) {
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return null;
+ }
+ return record;
+ }
+
+ private AccountRecord verifyAccountFromPathElements(HttpServletResponse response, String[] pathElements) throws PersistException {
+ String usernameParam = pathElements[pathElements.length - 3];
+ AccountRecord requestedAccount = AccountPersistTasks.findAccountByUsername(usernameParam, getSessionFactory());
+ if (requestedAccount == null) {
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return null;
+ }
+ return requestedAccount;
+ }
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
+ AccountRecord requestedAccount = verifyAccountFromPathElements(response, pathElements);
+ if (requestedAccount==null) {
+ return;
+ }
+
+ TemplateRecord record = verifyTemplateIDFromPathElements(response, pathElements);
+ if (record==null) {
+ return;
+ }
+ TemplateDocument result = new TemplateDocument(record);
+ sendStringResponse(result.toString(), "text/xml", response);
+
+ }
+
+
+// to prevent repetition between post and delete
+ private abstract class TemplateSupportFileAction {
+ public abstract void doGeometryAction(HttpServletRequest request, HttpServletResponse response,
+ String[] pathElements, long templateID) throws PersistException, IOException;
+ public abstract void doMaterialFileAction(HttpServletRequest request, HttpServletResponse response,
+ String[] pathElements, long templateID) throws IOException, PersistException;
+
+ void destroyARecordInATemplateSetOfSupportFiles(HttpServletResponse response, TemplateRecord template, TemplateSupportFileRecord rec) throws PersistException {
+ if (rec==null) {
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ return;
+ }
+ template.getSupportFiles().remove(rec); //destroy pointer
+ TemplatePersistTasks.update(template, getSessionFactory());
+ response.setStatus(HttpServletResponse.SC_OK);
+ }
+ public String templateGeometryNameFromPathElements(long templateID, String[] pathElements, int[] hackReturn) {
+ int LOD=-2995;
+ try {
+ LOD=Integer.parseInt(pathElements[pathElements.length -1]);
+ hackReturn[0]=LOD;
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ return MediaService.getTemplateGeometryName(templateID, LOD);
+ }
+ }
+
+ class TemplateSupportFilePost extends TemplateSupportFileAction{
+ public void doGeometryAction(HttpServletRequest request, HttpServletResponse response,
+ String[] pathElements, long templateID) throws PersistException, IOException{
+ InputStream fileInput;
+ //is this coming from a browser?
+ if (request.getContentType() != null && request.getContentType().startsWith("multipart/form-data")) {
+ fileInput = getFirstFile(request, Sim.MAX_GEOMETRY_SIZE);
+ if (fileInput == null) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ return;
+ }
+ } else {
+ //coming from a sensible browser, just get the file input
+ fileInput=request.getInputStream();
+ }
+ int[] lodHack=new int[1];
+ String templateGeometryName = templateGeometryNameFromPathElements(templateID, pathElements,lodHack);
+ getMediaService().write(templateGeometryName, fileInput, Sim.MAX_GEOMETRY_SIZE);
+ TemplateRecord record = TemplatePersistTasks.findTemplateByTemplateID(templateID, getSessionFactory());
+ TemplatePersistTasks.updateGeometryFileTemplateLastModified(record, lodHack[0], true,getSessionFactory());
+ response.setStatus(HttpServletResponse.SC_OK);
+ }
+ public void doMaterialFileAction(HttpServletRequest request, HttpServletResponse response,
+ String[] pathElements, long templateID) throws IOException, PersistException{
+ InputStream fileInput;
+ //from a browser?
+ if (request.getContentType() != null && request.getContentType().startsWith("multipart/form-data")) {
+ fileInput = getFirstFile(request, Sim.MAX_GEOMETRY_RESOURCE_SIZE);
+ if (fileInput == null) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ return;
+ }
+ } else {
+ fileInput=request.getInputStream();
+ }
+ String rawName=pathElements[pathElements.length -1 ];
+ String templateResourceName = MediaService.getTemplateResourceName(templateID, rawName);
+ getMediaService().write(templateResourceName, fileInput, Sim.MAX_GEOMETRY_RESOURCE_SIZE);
+ TemplateRecord record = TemplatePersistTasks.findTemplateByTemplateID(templateID, getSessionFactory());
+ TemplatePersistTasks.updateSupportFileTemplateLastModified(record, rawName, true,getSessionFactory());
+ response.setStatus(HttpServletResponse.SC_OK);
+ }
+ }
+ class TemplateSupportFileDelete extends TemplateSupportFileAction{
+ public void doGeometryAction(HttpServletRequest request, HttpServletResponse response,
+ String[] pathElements, long templateID) throws PersistException, IOException{
+ int[] lodHack=new int[1];
+ String templateGeometryName = templateGeometryNameFromPathElements(templateID,pathElements,lodHack);
+ if (templateGeometryName==null) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ return;
+ }
+ getMediaService().delete(templateGeometryName); //destroy the content
+ TemplateRecord template = TemplatePersistTasks.findTemplateByTemplateID(templateID, getSessionFactory());
+ destroyARecordInATemplateSetOfSupportFiles(response, template, template.findGeometryFileRec(lodHack[0]));
+ }
+ public void doMaterialFileAction(HttpServletRequest request, HttpServletResponse response,
+ String[] pathElements, long templateID) throws IOException, PersistException{
+
+ String rawName=pathElements[pathElements.length -1 ];
+ String templateResourceName = MediaService.getTemplateResourceName(templateID, pathElements[pathElements.length -1 ]);
+ getMediaService().delete(templateResourceName);//destroy content
+ TemplateRecord template = TemplatePersistTasks.findTemplateByTemplateID(templateID, getSessionFactory());
+ destroyARecordInATemplateSetOfSupportFiles(response, template, template.findSupportFile(rawName));
+ }
+ }
+ class TemplateGeometryResource extends DescendingSiteResource {
+ public TemplateGeometryResource() {
+ super("geometry");
+ }
+
+ public void doDelete(HttpServletRequest request, HttpServletResponse response,
+ String[] pathElements) throws ServletException, IOException {
+ doSomething(request, response, pathElements, new TemplateSupportFileDelete());
+ }
+ public void doPost(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
+ doSomething(request,response,pathElements,new TemplateSupportFilePost());
+ }
+ public void doSomething(HttpServletRequest request, HttpServletResponse response,
+ String[] pathElements, TemplateSupportFileAction action) throws ServletException, IOException {
+ String usernameParam = pathElements[1];
+ try {
+ AccountRecord authedAccount = getAuthedAccount(request, response);
+ if (authedAccount==null) {
+ return;
+ }
+ AccountRecord requestedAccount = getRequestedAccount(response, usernameParam);
+ if (requestedAccount==null) {
+ return;
+ }
+
+ if (verifyAccountHolderIsOk(response, authedAccount, requestedAccount)==false) {
+ return;
+ }
+
+ Long tid = checkTemplateIDIsOk(response, authedAccount, requestedAccount, pathElements);
+ if (tid==null) {
+ return;
+ }
+ long templateID = tid.longValue();
+
+ //trying to post to just /template/<TID>/geometry
+ if (pathElements.length == 5) {
+ response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ return;
+ }
+ //trying to post to /geometry/data but requires an LOD number
+ if (pathElements.length == 6 && "data".equals(pathElements[pathElements.length - 1])) {
+ response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ return;
+ };
+ //posting to /geometry/data/<number>
+ if (pathElements.length == 7 && "data".equals(pathElements[pathElements.length - 2])) {
+ action.doGeometryAction(request, response, pathElements, templateID);
+ } else {
+ action.doMaterialFileAction(request, response, pathElements, templateID);
+ }
+ return;
+ } catch (PersistException e) {
+ handlePersistException(response, e);
+ return;
+ }
+ }
+
+
+ private void handlePersistException(HttpServletResponse response, PersistException e) {
+ e.printStackTrace();
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ }
+
+ private Long checkTemplateIDIsOk(HttpServletResponse response, AccountRecord authedAccount, AccountRecord requestedAccount,String[] pathElements) throws PersistException {
+ long templateID = Long.parseLong(pathElements[3]);
+ TemplateRecord record = TemplatePersistTasks.findTemplateByTemplateID(templateID, getSessionFactory());
+ if (record == null || !record.getOwnerUsername().equals(requestedAccount.getUsername())) {
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return null;
+ }
+ return new Long(templateID);
+ }
+
+ private boolean verifyAccountHolderIsOk(HttpServletResponse response, AccountRecord authedAccount, AccountRecord requestedAccount) {
+ if (!requestedAccount.getUsername().equals(authedAccount.getUsername())) {
+ response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+ return false;
+ }
+ return true;
+ }
+
+
+ private AccountRecord getRequestedAccount(HttpServletResponse response, String usernameParam) throws PersistException {
+ AccountRecord requestedAccount = AccountPersistTasks.findAccountByUsername(usernameParam, getSessionFactory());
+ if (requestedAccount == null) {
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return null;
+ }
+ return requestedAccount;
+ }
+
+
+ private AccountRecord getAuthedAccount(HttpServletRequest request, HttpServletResponse response) throws PersistException {
+ AccountRecord authedAccount = AuthServlet.getAuthedAccountRecord(request, getSessionFactory());
+ if (authedAccount == null) {
+ response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+ return null;
+ }
+ return authedAccount;
+ }
+ public void doPut(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
+ String usernameParam = pathElements[1];
+ System.out.println("XXX WHO IS CALLING PUT ON A TEMPLATE GEOM RESOURCE???");
+ for (int i=0; i<pathElements.length;++i) System.out.println("XXX PUT: "+i+" ->"+pathElements[i]);
+ try {
+ AccountRecord authedAccount = getAuthedAccount(request, response);
+ if (authedAccount==null) {
+ return;
+ }
+ AccountRecord requestedAccount = getRequestedAccount(response, usernameParam);
+ if (requestedAccount==null) {
+ return;
+ }
+
+ if (verifyAccountHolderIsOk(response, authedAccount, requestedAccount)==false) {
+ return;
+ }
+
+ String geomFileName = verifyParamsAreOk(response,pathElements);
+ if (geomFileName==null) {
+ return;
+ }
+ Long tid = checkTemplateIDIsOk(response, authedAccount, requestedAccount, pathElements);
+ if (tid==null) {
+ return;
+ }
+ } catch (PersistException e) {
+ handlePersistException(response, e);
+ }
+ }
+ private String verifyParamsAreOk(HttpServletResponse response, String[] pathElements) {
+ if (pathElements.length!=7) {
+ response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ return null;
+ }
+ if ((pathElements[4].equals("geometry")==false) || (pathElements[5].equals("data")==false)) {
+ response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ return null;
+ }
+
+ if ((pathElements[6]==null) || (pathElements[6].equals("")==true) || (pathElements[6].indexOf('-')!=-1)) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ return null;
+ }
+ return pathElements[6];
+ }
+
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
+ String usernameParam = pathElements[1];
+ try {
+ AccountRecord authedAccount = AuthServlet.getAuthedAccountRecord(request, getSessionFactory());
+ if (authedAccount == null && !AuthServlet.isGuest(request)) {
+ response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+ return;
+ }
+
+ AccountRecord requestedAccount = AccountPersistTasks.findAccountByUsername(usernameParam, getSessionFactory());
+ if (requestedAccount == null) {
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+
+ long templateID = Long.parseLong(pathElements[3]);
+ TemplateRecord record = TemplatePersistTasks.findTemplateByTemplateID(templateID, getSessionFactory());
+ if (record == null || !record.getOwnerUsername().equals(requestedAccount.getUsername())) {
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+
+ if (pathElements.length == 5) {
+ sendStringResponse("This is where a geometry document would be.", "text/plain", response);
+ return;
+ }
+
+ DecoratedInputStream data = null;
+ if (pathElements.length == 7 && "data".equals(pathElements[pathElements.length - 2])) {
+ data = getMediaService().getData(MediaService.getTemplateGeometryName(templateID, Integer.parseInt(pathElements[pathElements.length - 1])));
+ } else {
+ data = getMediaService().getData(MediaService.getTemplateResourceName(templateID, pathElements[pathElements.length - 1]));
+ }
+ if (data == null) {
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+ response.setStatus(HttpServletResponse.SC_OK);
+ setCachable(response);
+ if (data.getMimeType() != null) {
+ response.setContentType(data.getMimeType());
+ }
+ if ("gzip".equals(request.getHeader("Accept-encoding"))) {
+ response.setHeader("Content-encoding", "gzip");
+ StreamUtils.write(data, new GZIPOutputStream(response.getOutputStream()));
+ } else {
+ if (data.getLength() > -1) {
+ response.setContentLength((int) data.getLength());
+ }
+ StreamUtils.write(data, response.getOutputStream());
+ }
+ } catch (PersistException e) {
+ handlePersistException(response, e);
+ return;
+ }
+ }
+
+ public void doHead(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
+ String usernameParam = pathElements[1];
+ try {
+ AccountRecord authedAccount = AuthServlet.getAuthedAccountRecord(request, getSessionFactory());
+ if (authedAccount == null && !AuthServlet.isGuest(request)) {
+ response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+ return;
+ }
+
+ AccountRecord requestedAccount = AccountPersistTasks.findAccountByUsername(usernameParam, getSessionFactory());
+ if (requestedAccount == null) {
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+
+ long templateID = Long.parseLong(pathElements[3]);
+ TemplateRecord record = TemplatePersistTasks.findTemplateByTemplateID(templateID, getSessionFactory());
+ if (record == null || !record.getOwnerUsername().equals(requestedAccount.getUsername())) {
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+
+ if (pathElements.length == 5) {
+ sendStringResponse("This is where a geometry document would be.", "text/plain", response);
+ return;
+ }
+
+ String mediaName = null;
+ if (pathElements.length == 7 && "data".equals(pathElements[pathElements.length - 2])) {
+ mediaName = MediaService.getTemplateGeometryName(templateID, ...
[truncated message content] |