|
From: <tre...@us...> - 2007-06-27 19:35:32
|
Revision: 199
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=199&view=rev
Author: trevorolio
Date: 2007-06-27 12:35:10 -0700 (Wed, 27 Jun 2007)
Log Message:
-----------
Added a tool for duplicating the things, doors, and settings of a space into another space.
Modified Paths:
--------------
spaces/trunk/src/com/ogoglio/client/WebAPIClient.java
Added Paths:
-----------
spaces/trunk/src/com/ogoglio/client/SpaceDuplicator.java
spaces/trunk/src/com/ogoglio/client/SpaceDuplicatorTests.java
Added: spaces/trunk/src/com/ogoglio/client/SpaceDuplicator.java
===================================================================
--- spaces/trunk/src/com/ogoglio/client/SpaceDuplicator.java (rev 0)
+++ spaces/trunk/src/com/ogoglio/client/SpaceDuplicator.java 2007-06-27 19:35:10 UTC (rev 199)
@@ -0,0 +1,155 @@
+package com.ogoglio.client;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Map;
+
+import com.ogoglio.util.ArgumentUtils;
+import com.ogoglio.xml.DoorDocument;
+import com.ogoglio.xml.PositionedDocument;
+import com.ogoglio.xml.PossessionDocument;
+import com.ogoglio.xml.SpaceDocument;
+import com.ogoglio.xml.ThingDocument;
+
+public class SpaceDuplicator {
+
+ private URI spaceURI = null;
+
+ private URI serviceURI = null;
+
+ private String username = null;
+
+ private String authCookie = null;
+
+ public SpaceDuplicator(URI spaceURI, URI serviceURI, String username, String authCookie) {
+ ArgumentUtils.assertNotNull(spaceURI);
+ this.spaceURI = spaceURI;
+ ArgumentUtils.assertNotNull(serviceURI);
+ this.serviceURI = serviceURI;
+ ArgumentUtils.assertNotEmpty(username);
+ this.username = username;
+ ArgumentUtils.assertNotEmpty(authCookie);
+ this.authCookie = authCookie;
+ }
+
+ public void duplicateSpace(URI destinationSpaceURI, boolean emptyFirst) throws IOException {
+ ArgumentUtils.assertNotNull(destinationSpaceURI);
+ if(destinationSpaceURI.toString().equals(spaceURI.toString())) {
+ throw new IllegalArgumentException("Cannot copy a space to itself: " + destinationSpaceURI);
+ }
+
+ WebAPIClient client1 = new WebAPIClient(spaceURI, serviceURI, authCookie);
+ WebAPIClient client2 = new WebAPIClient(destinationSpaceURI, serviceURI, authCookie);
+
+ if(emptyFirst) {
+ emptySpace(client2);
+ }
+
+ SpaceDocument spaceDoc1 = client1.getSpaceDocument(false);
+ SpaceDocument spaceDoc2 = client2.getSpaceDocument(false);
+
+ client2.setDisplayName(spaceDoc1.getDisplayName());
+ client2.setDisplaySea(spaceDoc1.getDisplaySea());
+ client2.setSeaLevel(spaceDoc1.getSeaLevel());
+ client2.setMaxGuests(spaceDoc1.getMaxGuests());
+ client2.setPublished(spaceDoc1.isPublished());
+
+
+ ThingDocument[] thingDocs = client1.getThingDocuments();
+ for (int i = 0; i < thingDocs.length; i++) {
+ PossessionDocument[] possDocuments = client2.getPossessionDocuments(client2.getAccountDocument(true).getUsername());
+ PossessionDocument possToUse = null;
+ for (int j = 0; j < possDocuments.length; j++) {
+ if(possDocuments[j].getThingID() == -1 && possDocuments[j].getTemplateID() == thingDocs[i].getTemplateID()) {
+ possToUse = possDocuments[j];
+ break;
+ }
+ }
+
+ if(possToUse == null) { //don't have a possession, try to make one
+ possToUse = client2.createPossession(thingDocs[i].getTemplateID());
+ }
+
+ if(possToUse == null) {
+ throw new IllegalStateException("Could not create a possession needed for this space: " + thingDocs[i].getDisplayName() + ": Template ID " + thingDocs[i].getTemplateID());
+ }
+
+ PossessionDocument newPossDoc = client2.addPossessionToSpace(possToUse.getPossessionID(), spaceDoc2.getSpaceID());
+ if(newPossDoc == null) {
+ throw new IllegalStateException("Could not create thing");
+ }
+
+ ThingDocument newThingDoc = client2.getThingDocument(newPossDoc.getThingID());
+ setToSamePosition(thingDocs[i], newThingDoc);
+ client2.updateThing(newThingDoc);
+ }
+
+ DoorDocument[] doorDocs = client1.getDoorDocuments();
+ for (int i = 0; i < doorDocs.length; i++) {
+ client2.createDoor(spaceDoc2.getSpaceID(), doorDocs[i].getTemplateID(), doorDocs[i].getTemplateOwner(), doorDocs[i].getDisplayName(), doorDocs[i].getLink(), doorDocs[i].getTransform());
+ }
+
+ Map settings = client1.getSettings();
+ String[] keys = (String[])settings.keySet().toArray(new String[0]);
+ for (int i = 0; i < keys.length; i++) {
+ client2.putSetting(keys[i], (String)settings.get(keys[i]));
+ }
+ }
+
+ private void setToSamePosition(PositionedDocument placedDoc, PositionedDocument docToMove) {
+ docToMove.setX(placedDoc.getX());
+ docToMove.setY(placedDoc.getY());
+ docToMove.setZ(placedDoc.getZ());
+ docToMove.setRW(placedDoc.getRW());
+ docToMove.setRX(placedDoc.getRX());
+ docToMove.setRY(placedDoc.getRY());
+ docToMove.setRZ(placedDoc.getRZ());
+ docToMove.setScale(placedDoc.getScale());
+ }
+
+ private void emptySpace(WebAPIClient client) throws IOException {
+ ThingDocument[] thingDocs = client.getThingDocuments();
+ for (int i = 0; i < thingDocs.length; i++) {
+ client.removePossessionFromSpace(thingDocs[i].getOwnerUsername(), thingDocs[i].getPossessionID());
+ }
+
+ DoorDocument[] doorDocs = client.getDoorDocuments();
+ for (int i = 0; i < doorDocs.length; i++) {
+ client.deleteDoor(doorDocs[i].getDoorID());
+ }
+
+ Map settings = client.getSettings();
+ String[] keys = (String[])settings.keySet().toArray(new String[0]);
+ for (int i = 0; i < keys.length; i++) {
+ client.removeSetting(keys[i]);
+ }
+ }
+
+ public static void main(String[] args) {
+ if(args.length != 5) {
+ printUsage();
+ return;
+ }
+
+ try {
+ URI serviceURI = new URI(args[0]);
+ URI sourceSpaceURI = new URI(args[1]);
+ URI destSpaceURI = new URI(args[2]);
+ String username = args[3];
+ String authCookie = args[4];
+
+ SpaceDuplicator duplicator = new SpaceDuplicator(sourceSpaceURI, serviceURI, username, authCookie);
+ duplicator.duplicateSpace(destSpaceURI, true);
+ } catch (URISyntaxException e) {
+ System.err.println("Error parsing URI: " + e);
+ printUsage();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static void printUsage() {
+ System.err.println("...SpaceDuplicator <SERVICE_URI> <SOURCE_SPACE> <DESTINATION_SPACE_URI> <USERNAME> <AUTH_COOKIE>");
+ }
+}
Added: spaces/trunk/src/com/ogoglio/client/SpaceDuplicatorTests.java
===================================================================
--- spaces/trunk/src/com/ogoglio/client/SpaceDuplicatorTests.java (rev 0)
+++ spaces/trunk/src/com/ogoglio/client/SpaceDuplicatorTests.java 2007-06-27 19:35:10 UTC (rev 199)
@@ -0,0 +1,117 @@
+package com.ogoglio.client;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import com.ogoglio.persist.TestPersistTasks;
+import com.ogoglio.xml.DoorDocument;
+import com.ogoglio.xml.PositionedDocument;
+import com.ogoglio.xml.SpaceDocument;
+import com.ogoglio.xml.ThingDocument;
+
+public class SpaceDuplicatorTests extends TestCase {
+
+ URI spaceURI1 = null;
+
+ URI spaceURI2 = null;
+
+ URI serviceURI1 = null;
+
+ WebAPIClient client1 = null;
+
+ WebAPIClient client2 = null;
+
+ String testSettingKey = "test.setting.key";
+ String testSettingValue = "A Value for the Test Setting";
+
+ public void setUp() {
+ try {
+ spaceURI1 = new URI("http://127.0.0.1:8080/og/space/1/");
+ spaceURI2 = new URI("http://127.0.0.1:8080/og/space/2/");
+ serviceURI1 = new URI("http://127.0.0.1:8080/og/");
+
+ client1 = new WebAPIClient(spaceURI1, serviceURI1, TestPersistTasks.COOKIE1);
+ client1.putSetting(testSettingKey, testSettingValue);
+
+ client2 = new WebAPIClient(spaceURI2, serviceURI1, TestPersistTasks.COOKIE1);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ }
+
+ public void testBasics() {
+ try {
+ SpaceDocument originalSpaceDoc = client1.getSpaceDocument(false);
+ ThingDocument[] originalThingDocs = client1.getThingDocuments();
+ DoorDocument[] originalDoorDocs = client1.getDoorDocuments();
+ Map originalSettings = client1.getSettings();
+
+ //TODO settings transfer
+
+ SpaceDuplicator duplicator = new SpaceDuplicator(spaceURI1, serviceURI1, TestPersistTasks.USERNAME1, TestPersistTasks.COOKIE1);
+ duplicator.duplicateSpace(spaceURI2, true);
+
+ SpaceDocument newSpaceDoc = client2.getSpaceDocument(false);
+ assertEquals(originalSpaceDoc.getDisplaySea(), newSpaceDoc.getDisplaySea());
+ assertEquals(originalSpaceDoc.getSeaLevel(), newSpaceDoc.getSeaLevel(), 0.001);
+ assertEquals(originalSpaceDoc.getDisplayName(), newSpaceDoc.getDisplayName());
+ assertEquals(originalSpaceDoc.isPublished(), newSpaceDoc.isPublished());
+ assertEquals(originalSpaceDoc.getMaxGuests(), newSpaceDoc.getMaxGuests());
+ assertEquals(originalSpaceDoc.getOwnerUsername(), newSpaceDoc.getOwnerUsername());
+
+ ThingDocument[] newThingDocs = client2.getThingDocuments();
+ Arrays.sort(newThingDocs, new ThingDocComparator());
+ Arrays.sort(originalThingDocs, new ThingDocComparator());
+ assertEquals(originalThingDocs.length, newThingDocs.length);
+ for (int i = 0; i < originalThingDocs.length; i++) {
+ assertEquals(originalThingDocs[i].getTemplateID(), newThingDocs[i].getTemplateID());
+ assertEqualPositions(originalThingDocs[i], newThingDocs[i]);
+ }
+
+ DoorDocument[] newDoorDocs = client2.getDoorDocuments();
+ for (int i = 0; i < originalDoorDocs.length; i++) {
+ assertEquals(originalDoorDocs[i].getDisplayName(), newDoorDocs[i].getDisplayName());
+ assertEquals(originalDoorDocs[i].getLink(), newDoorDocs[i].getLink());
+ assertEqualPositions(originalDoorDocs[i], newDoorDocs[i]);
+ }
+
+ Map newSettings = client2.getSettings();
+ newSettings.equals(originalSettings);
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail("" + e);
+ }
+ }
+
+ private static class ThingDocComparator implements Comparator {
+ public int compare(Object arg0, Object arg1) {
+ ThingDocument doc1 = (ThingDocument) arg0;
+ ThingDocument doc2 = (ThingDocument) arg1;
+ long idDiff = doc1.getTemplateID() - doc2.getTemplateID();
+ if(idDiff != 0) {
+ return idDiff < 0 ? -1 : 1;
+ }
+ return doc1.getPossessionID() < doc1.getPossessionID() ? -1 : 1;
+ }
+ }
+
+ private static void assertEqualPositions(PositionedDocument doc1, PositionedDocument doc2) {
+ assertEquals(doc1.getX(), doc2.getX(), 0.001);
+ assertEquals(doc1.getY(), doc2.getY(), 0.001);
+ assertEquals(doc1.getZ(), doc2.getZ(), 0.001);
+ assertEquals(doc1.getRW(), doc2.getRW(), 0.001);
+ assertEquals(doc1.getRX(), doc2.getRX(), 0.001);
+ assertEquals(doc1.getRY(), doc2.getRY(), 0.001);
+ assertEquals(doc1.getRZ(), doc2.getRZ(), 0.001);
+ assertEquals(doc1.getScale().x, doc2.getScale().x, 0.001);
+ }
+}
Modified: spaces/trunk/src/com/ogoglio/client/WebAPIClient.java
===================================================================
--- spaces/trunk/src/com/ogoglio/client/WebAPIClient.java 2007-06-27 17:14:05 UTC (rev 198)
+++ spaces/trunk/src/com/ogoglio/client/WebAPIClient.java 2007-06-27 19:35:10 UTC (rev 199)
@@ -21,6 +21,8 @@
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Vector;
import java.util.zip.GZIPInputStream;
@@ -38,6 +40,7 @@
import com.ogoglio.xml.DoorDocument;
import com.ogoglio.xml.PageDocument;
import com.ogoglio.xml.PossessionDocument;
+import com.ogoglio.xml.SettingDocument;
import com.ogoglio.xml.SpaceDocument;
import com.ogoglio.xml.SpaceMemberDocument;
import com.ogoglio.xml.TemplateDocument;
@@ -86,7 +89,7 @@
XMLElement result = sendAuthenticatedXML(appendToURI(serviceURI, "account/"), newAccountDoc.toString(), "POST", adminAuthCookie);
return new AccountDocument(result);
}
-
+
public static SpaceDocument createSpace(URI serviceURI, String authCookie) throws IOException {
AuthDocument authDocument = new AuthDocument(fetchAuthenticatedXML(getAuthURI(serviceURI), authCookie));
SpaceDocument spaceDoc = new SpaceDocument(-1, "New Space", authDocument.getUsername(), false, 0, false, 0, -1);
@@ -95,16 +98,16 @@
}
public static AccountDocument updateAccount(URI serviceURI, String authCookie, AccountDocument accountDoc) throws IOException {
- XMLElement result = sendAuthenticatedXML(appendToURI(serviceURI, "account/" + accountDoc.getUsername()), accountDoc.toElement().toString(), "POST", authCookie);
- if(result == null) {
- return null;
- }
- return new AccountDocument(result);
+ XMLElement result = sendAuthenticatedXML(appendToURI(serviceURI, "account/" + accountDoc.getUsername()), accountDoc.toElement().toString(), "POST", authCookie);
+ if (result == null) {
+ return null;
+ }
+ return new AccountDocument(result);
}
public static AccountDocument getAccountDocument(URI serviceURI, String authCookie, String username) throws IOException {
XMLElement response = fetchAuthenticatedXML(appendToURI(serviceURI, "account/" + username), authCookie);
- if(response == null) {
+ if (response == null) {
return null;
}
return new AccountDocument(response);
@@ -206,6 +209,12 @@
return postAuthenticatedXML(getSpaceURI(), spaceDoc.toString()) != null;
}
+ public boolean setDisplayName(String displayName) throws IOException {
+ SpaceDocument spaceDoc = new SpaceDocument(fetchAuthenticatedXML(getSpaceURI()));
+ spaceDoc.setDisplayName(displayName);
+ return postAuthenticatedXML(getSpaceURI(), spaceDoc.toString()) != null;
+ }
+
public boolean setSeaLevel(double seaLevel) throws IOException {
SpaceDocument spaceDoc = new SpaceDocument(fetchAuthenticatedXML(getSpaceURI()));
spaceDoc.setSeaLevel(seaLevel);
@@ -435,6 +444,17 @@
return performGET(getPageContentsURI(thingID, pageID), authCookie);
}
+ public Map getSettings() throws IOException {
+ HashMap results = new HashMap();
+ XMLElement list = fetchAuthenticatedXML(getSettingsURI());
+ XMLElement[] children = (XMLElement[]) list.getChildren().toArray(new XMLElement[0]);
+ for (int i = 0; i < children.length; i++) {
+ SettingDocument settingDoc = new SettingDocument(children[i]);
+ results.put(settingDoc.getKey(), settingDoc.getValue());
+ }
+ return results;
+ }
+
public String getSetting(String key) {
try {
InputStream stream = performGET(getSettingURI(key), authCookie);
@@ -742,5 +762,4 @@
public URI getSettingURI(String key) {
return appendToURI(getSettingsURI(), key + "/");
}
-
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|