|
From: <tre...@us...> - 2007-11-12 17:37:13
|
Revision: 572
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=572&view=rev
Author: trevorolio
Date: 2007-11-12 09:37:16 -0800 (Mon, 12 Nov 2007)
Log Message:
-----------
Fixed a bug in which the sim comet connection was dropped due to heartbeat timing miscalculation, causing events generated via web api to not make their way back to connected clients if there were no client originated comet events. Hello, edge case.
Modified Paths:
--------------
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SimMessageHandler.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SpaceSimulator.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/MessageProxy.java
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SimMessageHandler.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SimMessageHandler.java 2007-11-12 17:37:13 UTC (rev 571)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SimMessageHandler.java 2007-11-12 17:37:16 UTC (rev 572)
@@ -55,6 +55,7 @@
if (!(message.getPayload() instanceof PayloadFactory.HeartbeatPayload)) {
Log.error("Somebody sent message with the 'heartbeat' space id:"+message.getPayload());
}
+
//Log.info("Sim is ignoring heartbeat from proxy.");
return;
}
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-11-12 17:37:13 UTC (rev 571)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SpaceSimulator.java 2007-11-12 17:37:16 UTC (rev 572)
@@ -357,7 +357,6 @@
}
page.setContentType(event.getStringProperty(SpaceEvent.CONTENT_TYPE));
listener.generatedSpaceEvent(event, SpaceSimulator.this);
-
} else if (SpaceEvent.UPDATE_PAGE_CONTENT_EVENT.equals(event.getName())) {
long thingID = event.getLongProperty(SpaceEvent.THING_ID).longValue();
long pageID = event.getLongProperty(SpaceEvent.PAGE_ID).longValue();
@@ -371,7 +370,6 @@
}
page.setContentType(event.getStringProperty(SpaceEvent.CONTENT_TYPE));
listener.generatedSpaceEvent(event, SpaceSimulator.this);
-
} else if (SpaceEvent.TEXT_SAY_EVENT.equals(event.getName())) {
String username = event.getStringProperty(SpaceEvent.USERNAME);
User user = space.getUser(username);
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/MessageProxy.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/MessageProxy.java 2007-11-12 17:37:13 UTC (rev 571)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/MessageProxy.java 2007-11-12 17:37:16 UTC (rev 572)
@@ -63,20 +63,20 @@
private ClientMessageHandler clientMessageHandler = new ClientMessageHandler();
private Timer outgoingHeartbeatTimer = new Timer();
-
- private long lastIncomingHeartbeat = 0L;
+ private long lastSentSimHeartbeat = 0L;
+
private static final long HEARTBEAT_INTERVAL_TO_SIM = 5000;
-
+
//needed because we are CLIENT of the sim servlet and need to know how to reach it
private WebAPIDescriptor descriptor;
-
+
public MessageProxy(SessionFactory sessionFactory, WebAPIDescriptor descriptor) throws IOException {
ArgumentUtils.assertNotNull(sessionFactory);
this.sessionFactory = sessionFactory;
- this.descriptor=descriptor;
+ this.descriptor = descriptor;
channelServer = new NetworkChannelServer(clientMessageHandler, descriptor.getCometProxyURI(), true, this);
- Log.info("Started Message Proxy on port " + channelServer.getLocator().getPort()+" with target of "+descriptor.getCometSimURI());
+ Log.info("Started Message Proxy on port " + channelServer.getLocator().getPort() + " with target of " + descriptor.getCometSimURI());
outgoingHeartbeatTimer.schedule(new OutgoingHeartbeatTask(), 5000, 60000);
}
@@ -85,7 +85,7 @@
PayloadFactory.HeartbeatPayload payload = new PayloadFactory.HeartbeatPayload();
Object[] locators = locatorAuths.getKeys();
for (int i = 0; i < locators.length; i++) {
- Locator remoteLocator = (Locator)locators[i];
+ Locator remoteLocator = (Locator) locators[i];
Message message = new Message(getLocator(), remoteLocator, 1, payload);
try {
channelServer.sendMessage(message);
@@ -94,14 +94,14 @@
Log.error("Heartbeat failure to " + remoteLocator, e);
logout(remoteLocator);
} catch (NoSuchDestinationException e1) {
- Log.error("Could not logout locator (" +remoteLocator +") with failed heartbeat",e1);
+ Log.error("Could not logout locator (" + remoteLocator + ") with failed heartbeat", e1);
}
}
-
+
}
}
}
-
+
public void cleanup() {
channelServer.cleanup();
outgoingHeartbeatTimer.cancel();
@@ -120,7 +120,7 @@
return channelServer.getLocator().getPort();
}
*/
-
+
private class ClientMessageHandler implements MessageHandler {
public void handleMessage(Message request, TCPChannel sourceChannel) throws NoSuchDestinationException {
try {
@@ -153,46 +153,46 @@
}
SpaceRecord spaceRecord = SpacePersistTasks.findSpaceBySpaceID(payload.getSpaceID(), sessionFactory);
- if(spaceRecord == null) {
+ if (spaceRecord == null) {
Log.error("Got an auth message for an unknown space: " + payload.getSpaceID());
Message failureMessage = new Message(channelServer.getLocator(), request.getOrigin(), payload.getSpaceID(), new PayloadFactory.AuthenticationFailurePayload("Could not find that space."));
sourceChannel.sendMessage(failureMessage);
return;
}
-
+
SimRecord simRecord = SpacePersistTasks.findOrAssignSim(spaceRecord, sessionFactory);
- if(simRecord == null) { //Oh, crap. Couldn't assign a sim
+ if (simRecord == null) { //Oh, crap. Couldn't assign a sim
Log.error("Could not assign sim for space " + spaceRecord.getSpaceID());
Message failureMessage = new Message(channelServer.getLocator(), request.getOrigin(), payload.getSpaceID(), new PayloadFactory.AuthenticationFailurePayload("Could not find a simulator for that space."));
sourceChannel.sendMessage(failureMessage);
return;
}
-
- if(username.startsWith(WebConstants.GUEST_COOKIE_PREFIX)) {
+
+ if (username.startsWith(WebConstants.GUEST_COOKIE_PREFIX)) {
URI userListURI = WebAPIUtil.appendToURI(simRecord.getSimURI(), "space/" + spaceRecord.getSpaceID() + "/user/");
XMLElement element = new WebAPIClientWire().fetchAuthenticatedXML(userListURI, null);
- if(element == null) {
+ if (element == null) {
Log.error("Could not get space user count for guest: " + payload.getSpaceID());
Message failureMessage = new Message(channelServer.getLocator(), request.getOrigin(), payload.getSpaceID(), new PayloadFactory.AuthenticationFailurePayload("Error reading that space's user count."));
sourceChannel.sendMessage(failureMessage);
return;
}
- if(!"list".equals(element.getName())){
+ if (!"list".equals(element.getName())) {
Log.error("Could not get list of users for space user count for guest: " + payload.getSpaceID());
Message failureMessage = new Message(channelServer.getLocator(), request.getOrigin(), payload.getSpaceID(), new PayloadFactory.AuthenticationFailurePayload("Error reading that space's user list."));
sourceChannel.sendMessage(failureMessage);
return;
-
+
}
int userCount = element.getChildren(UserDocument.NAME).length;
- if(userCount >= spaceRecord.getMaxGuests()) {
+ if (userCount >= spaceRecord.getMaxGuests()) {
Log.error("Refused guest to space " + spaceRecord.getSpaceID() + " for reasons of max guest limit: " + spaceRecord.getMaxGuests());
Message failureMessage = new Message(channelServer.getLocator(), request.getOrigin(), payload.getSpaceID(), new PayloadFactory.AuthenticationFailurePayload("This space has reached its guest limit."));
sourceChannel.sendMessage(failureMessage);
return;
}
}
-
+
LocatorAuth locatorAuth = new LocatorAuth(payload.getSpaceID(), username, simRecord.getSimURI());
locatorAuths.put(request.getOrigin(), locatorAuth);
@@ -200,7 +200,7 @@
sourceChannel.sendMessage(message);
Message simMessage = new Message(channelServer.getLocator(), request.getOrigin(), payload.getSpaceID(), new PayloadFactory.AuthenticatedPayload(username));
- sendMessageToSpace(locatorAuth.uri,locatorAuth.spaceID, simMessage);
+ sendMessageToSpace(locatorAuth.uri, locatorAuth.spaceID, simMessage);
return;
} else if (request.getPayload() instanceof PayloadFactory.LogoutPayload) {
request.getPayload(); //XXX is this necessary?
@@ -219,12 +219,12 @@
event.setProperty(SpaceEvent.USERNAME, locatorAuth.username);
payload.setSpaceEvent(event);
- sendMessageToSpace(locatorAuth.uri,locatorAuth.spaceID, request);
+ sendMessageToSpace(locatorAuth.uri, locatorAuth.spaceID, request);
} else if (request.getPayload() instanceof PayloadFactory.HeartbeatPayload) {
- long now=System.currentTimeMillis();
- long diff = now-lastIncomingHeartbeat;
- lastIncomingHeartbeat=now;
- if (diff>HEARTBEAT_INTERVAL_TO_SIM) {
+ long now = System.currentTimeMillis();
+ long diff = now - lastSentSimHeartbeat;
+ if (diff > HEARTBEAT_INTERVAL_TO_SIM) {
+ lastSentSimHeartbeat = now;
heartbeatToSims();
}
} else {
@@ -242,15 +242,14 @@
return;
}
Message message = new Message(remoteLocator, getLocator(), locatorAuth.spaceID, new PayloadFactory.LoggedOutPayload(locatorAuth.username));
- sendMessageToSpace(locatorAuth.uri,locatorAuth.spaceID, message);
+ sendMessageToSpace(locatorAuth.uri, locatorAuth.spaceID, message);
}
private void heartbeatToSims() throws NoSuchDestinationException {
- //Log.info("Refreshing all sims...");
synchronized (simChannels) {
Object[] channels = (Object[]) simChannels.getValues();
- for (int i=0; i<channels.length;++i) {
- URI uri=(URI)simChannels.getBackward(channels[i]);
+ for (int i = 0; i < channels.length; ++i) {
+ URI uri = (URI) simChannels.getBackward(channels[i]);
Message message = new Message(channelServer.getLocator(), getLocator(), Sim.NO_SPACE_ID, new PayloadFactory.HeartbeatPayload());
sendMessageToSpace(uri, Sim.NO_SPACE_ID, message);
}
@@ -267,13 +266,13 @@
}
private void sendToUser(Message message) {
- final PayloadFactory.ProxiedSpaceEventPayload proxyPayload = (PayloadFactory.ProxiedSpaceEventPayload)message.getPayload();
+ final PayloadFactory.ProxiedSpaceEventPayload proxyPayload = (PayloadFactory.ProxiedSpaceEventPayload) message.getPayload();
Object[] spaceClientLocators = locatorAuths.getKeys(new TwoWayMap.Filter() {
public boolean matches(Object obj) {
return ((LocatorAuth) obj).username.equals(proxyPayload.getUsername());
}
});
-
+
PayloadFactory.SpaceEventPayload eventPayload = new PayloadFactory.SpaceEventPayload(proxyPayload.getSpaceEvent());
for (int i = 0; i < spaceClientLocators.length; i++) {
Locator remoteLocator = (Locator) spaceClientLocators[i];
@@ -281,30 +280,30 @@
try {
channelServer.sendMessage(individualMessage);
} catch (Throwable e) {
- Log.error("Could not send a message to client at " + remoteLocator,e);
+ Log.error("Could not send a message to client at " + remoteLocator, e);
}
}
}
-
+
//Distribute the sim message to all clients authed to that space
//TODO fix me: this is way way too expensive just to send a sim message
private void sendToAll(final Message message) {
Object[] auths = locatorAuths.getValues();
for (int i = 0; i < auths.length; i++) {
- LocatorAuth auth = (LocatorAuth)auths[i];
- if(auth.spaceID != message.getSpaceID()) {
- continue;
+ LocatorAuth auth = (LocatorAuth) auths[i];
+ if (auth.spaceID != message.getSpaceID()) {
+ continue;
}
Locator remoteLocator = (Locator) locatorAuths.getBackward(auth);
- if(remoteLocator == null) {
+ if (remoteLocator == null) {
continue;
}
Message individualMessage = new Message(getLocator(), remoteLocator, message.getSpaceID(), message.getPayload());
try {
channelServer.sendMessage(individualMessage);
} catch (Throwable e) {
- Log.error("Could not send a message to a client at " + remoteLocator,e);
+ Log.error("Could not send a message to a client at " + remoteLocator, e);
}
}
}
@@ -324,7 +323,7 @@
try {
/*Object selector=AsyncProtoFactory.getDefaultInfo().getSimSpecificSelector();
AsyncProto proto=AsyncProtoFactory.getDefaultClient(uri.getHost(), selector);*/
- AsyncProto proto=AsyncProtoFactory.getDefaultClient(descriptor, false);
+ AsyncProto proto = AsyncProtoFactory.getDefaultClient(descriptor, false);
simChannel = new TCPChannel(proto, simMessageHandler, false, simMessageHandler, true, "sim-client");
} catch (IOException e) {
e.printStackTrace();
@@ -360,7 +359,7 @@
public LocatorAuth(long spaceID, String username, URI uri) {
this.spaceID = spaceID;
this.username = username;
- this.uri=uri;
+ this.uri = uri;
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tre...@us...> - 2007-12-13 01:29:41
|
Revision: 630
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=630&view=rev
Author: trevorolio
Date: 2007-12-12 17:29:46 -0800 (Wed, 12 Dec 2007)
Log Message:
-----------
Removed old debug messages.
Modified Paths:
--------------
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/message/server/CometChannelManager.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/message/server/CometServlet.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/Sim.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SimMessageHandler.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SpaceSimulator.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/site/SimServlet.java
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/message/server/CometChannelManager.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/message/server/CometChannelManager.java 2007-12-13 01:29:36 UTC (rev 629)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/message/server/CometChannelManager.java 2007-12-13 01:29:46 UTC (rev 630)
@@ -100,7 +100,6 @@
//the buffer is critical here
StringBuffer buff=(StringBuffer)sessionToBuffer.get(event);
buff.append(tmp);
- Log.debug("Added some text to the buffer in ChanMgr:"+buff.toString());
String msg = CometClient.pullOutNextMessage(buff);
if (msg!=null) {
messageDone((TCPChannel) sessionToChannel.get(event), msg, event);
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/message/server/CometServlet.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/message/server/CometServlet.java 2007-12-13 01:29:36 UTC (rev 629)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/message/server/CometServlet.java 2007-12-13 01:29:46 UTC (rev 630)
@@ -47,7 +47,6 @@
public static void addChannel(String subspace, CometChannelManager mgr) {
if (!clientChannelMap.containsKey(subspace)) {
clientChannelMap.put(subspace, Collections.synchronizedList(new ArrayList()));
- Log.info("Comet listener on space:" + subspace);
}
List clienChannList = (List) clientChannelMap.get(subspace);
clienChannList.add(mgr);
@@ -87,14 +86,12 @@
response.flushBuffer();
} else if (event.getEventType() == CometEvent.EventType.ERROR) {
if (event.getEventSubType().equals(CometEvent.EventSubType.TIMEOUT)) {
- //Log.info("Ignoring timeout on session "+ request.getSession(true).getId());
return;
}
Log.error("Error for session: " + request.getSession(true).getId() + "-->" + event.getEventSubType());
closeComet(event);
} else if (event.getEventType() == CometEvent.EventType.END) {
closeComet(event);
- //Log.info("End for session: " + request.getSession(true).getId());
} else if (event.getEventType() == CometEvent.EventType.READ) {
if (drainDataBuffer(event, request)) {
response.flushBuffer();
@@ -111,7 +108,6 @@
CometChannelManager mgr = (CometChannelManager) iterator.next();
mgr.connectionDropped(event);
}
- Log.info("Destroyed comet info for path "+path+":"+event.getHttpServletRequest().getSession(true).getId());
} else {
Log.warn("Close comet on path " + path + " but nobody interested....");
}
@@ -145,7 +141,6 @@
mgr.addConnection(event, channel);
//in 6.0.14 this is an unsupported operation
//event.setTimeout(30000);
- Log.info("Added comet connection for path "+event.getHttpServletRequest().getPathInfo()+":"+event.getHttpServletRequest().getSession(true).getId());
}
private boolean drainDataBuffer(CometEvent event, HttpServletRequest request) throws IOException {
@@ -167,7 +162,6 @@
} while (is.available() > 0);
return true;
} catch (IOException exception) {
- Log.info("Client appears to have closed the comet connection:" + event.getHttpServletRequest().getSession(true).getId()+". Closing it b/c:"+exception.getMessage()+" of type "+exception.getClass().getName());
closeComet(event);
return false;
}
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/Sim.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/Sim.java 2007-12-13 01:29:36 UTC (rev 629)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/Sim.java 2007-12-13 01:29:46 UTC (rev 630)
@@ -296,19 +296,14 @@
return simulator;
}
- Log.debug("Sim.getOrCreateSpaceSim: don't have space doc cached.");
SpaceDocument spaceDoc = null;
try {
- Log.debug("Sim.getOrCreateSpaceSim: about to read it from the media service!");
spaceDoc = getSpaceDocument(record.getSpaceID());
- Log.debug("Sim.getOrCreateSpaceSim: Media service:" + (spaceDoc == null));
} catch (IOException e) {
}
if (spaceDoc == null) {
- Log.debug("Sim.getOrCreateSpaceSim:Now trying to get it from the DocumentFactory.");
spaceDoc = DocumentFactory.documentFromRecord(record);
} else {
- Log.debug("Sim.getOrCreateSpaceSim: Setting basic properties... why aren't these there before?");
spaceDoc.setDisplayName(record.getDisplayName());
spaceDoc.setMaxGuests(record.getMaxGuests());
spaceDoc.setSimID(record.getSimID());
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SimMessageHandler.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SimMessageHandler.java 2007-12-13 01:29:36 UTC (rev 629)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SimMessageHandler.java 2007-12-13 01:29:46 UTC (rev 630)
@@ -56,7 +56,6 @@
Log.error("Somebody sent message with the 'heartbeat' space id:"+message.getPayload());
}
- //Log.info("Sim is ignoring heartbeat from proxy.");
return;
}
@@ -71,7 +70,6 @@
SpaceSimulator ss=(SpaceSimulator)allSpaces[i];
buffer.append(" "+ss.getSpaceID());
}
- Log.info("Currently supporting spaces:"+buffer);
return;
}
}
@@ -85,9 +83,7 @@
} else if (message.getPayload() instanceof PayloadFactory.LoggedOutPayload) {
PayloadFactory.LoggedOutPayload payload = (PayloadFactory.LoggedOutPayload) message.getPayload();
- Log.info("Client "+payload.getUsername()+" sent logged out!");
spaceSim.userLoggedOut(payload.getUsername());
- Log.info("Sim finished telling the spacesim about the logout.");
} else {
Log.error("Sim received unknown payload in this message: " + message);
}
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-12-13 01:29:36 UTC (rev 629)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SpaceSimulator.java 2007-12-13 01:29:46 UTC (rev 630)
@@ -102,7 +102,6 @@
renderer.setSimCamera(); //Sigh, you have to add a view before it will schedule the behavior
ThingDocument[] thingDocs = spaceDocument.getThingDocuments();
- Log.debug("Initialization SpaceSimulator on space " + spaceDocument.getSpaceID() + " with " + thingDocs.length);
for (int i = 0; i < thingDocs.length; i++) {
TemplateDocument templateDoc = listener.getTemplateDocument(thingDocs[i].getTemplateID());
if (templateDoc == null) {
@@ -196,7 +195,6 @@
public void startSim() {
simThread.setName("space-" + space.getSpaceID());
- //Log.info("Starting up thread: "+simThread.getName());
simThread.start();
}
@@ -717,7 +715,6 @@
public ThingDocument[] getThingDocuments() {
Thing[] things = space.getThings();
- Log.debug("SpaceSimulator: asked space object how many things:" + things.length);
ThingDocument[] results = new ThingDocument[things.length];
for (int i = 0; i < results.length; i++) {
results[i] = new ThingDocument(things[i]);
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/site/SimServlet.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/site/SimServlet.java 2007-12-13 01:29:36 UTC (rev 629)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/site/SimServlet.java 2007-12-13 01:29:46 UTC (rev 630)
@@ -95,10 +95,10 @@
//don't bother with the sim if nobody wants it
if (servletNeeded) {
- String tmpSimUrl=(String) envCtx.lookup(OGOGLIO_BASE_SIM_URL_KEY);
+ String tmpSimUrl = (String) envCtx.lookup(OGOGLIO_BASE_SIM_URL_KEY);
if (!tmpSimUrl.endsWith("/")) {
- tmpSimUrl=tmpSimUrl+"/";
- Log.warn(OGOGLIO_BASE_SIM_URL_KEY+" in server.xml should end in / but we are patching it:"+tmpSimUrl);
+ tmpSimUrl = tmpSimUrl + "/";
+ Log.warn(OGOGLIO_BASE_SIM_URL_KEY + " in server.xml should end in / but we are patching it:" + tmpSimUrl);
}
simURI = new URI(tmpSimUrl);
SimRecord simRecord = SimPersistTasks.findSimsBySimURI(simURI, getSessionFactory());
@@ -113,10 +113,10 @@
}
WebAPIDescriptor descriptor;
String serviceURI = (String) envCtx.lookup("ogoglio/baseURL");
- if ((serviceURI==null) || (serviceURI.trim().equals(""))) {
+ if ((serviceURI == null) || (serviceURI.trim().equals(""))) {
throw new ServletException("Unable to fetch ogoglio/baseURL from the server.xml file!");
}
- descriptor=new WebAPIDescriptor(new URI(serviceURI));
+ descriptor = new WebAPIDescriptor(new URI(serviceURI));
sim = new Sim(simRecord, getMediaService(), getSessionFactory(), descriptor);
localIP = InetAddress.getByName(simURI.getHost()).getHostAddress();
}
@@ -484,11 +484,8 @@
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
- Log.debug("GET on SimServlet.ThingsResource: "+requestedSpaceID+" --- how many possessions?"+
- (PossessionPersistTasks.findPossessionsBySpaceID(requestedSpaceID, getSessionFactory())));
SpaceSimulator simulator = sim.getOrCreateSpaceSimulator(spaceRecord);
ThingDocument[] thingDocs = simulator.getThingDocuments();
- Log.debug("SimServlet, Thing request:"+thingDocs.length);
XMLElement list = new XMLElement("list");
for (int i = 0; i < thingDocs.length; i++) {
list.addChild(thingDocs[i].toElement());
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tre...@us...> - 2008-01-01 22:54:07
|
Revision: 661
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=661&view=rev
Author: trevorolio
Date: 2008-01-01 14:54:12 -0800 (Tue, 01 Jan 2008)
Log Message:
-----------
Added email update to the account resource, which now triggers a validation email, creates a pending validation record, and sets the emailValid field to false on the account record.
Modified Paths:
--------------
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/AccountPersistTasks.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/AccountPersistTasks.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/AccountPersistTasks.java 2008-01-01 21:35:01 UTC (rev 660)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/AccountPersistTasks.java 2008-01-01 22:54:12 UTC (rev 661)
@@ -184,6 +184,28 @@
return (AccountRecord) task.execute();
}
+ public static PendingEmailValidationRecord updateAccountEmail(final AccountRecord account, final String newEmail, SessionFactory sessionFactory) throws PersistException {
+ if(account.getEmail().equals(newEmail)){
+ return null;
+ }
+ final String cleanedEmail = AccountRecord.cleanEmail(newEmail);
+ if(cleanedEmail == null){
+ return null;
+ }
+ HibernateTask task = new HibernateTask() {
+ public Object run(Session hibernateSession) {
+ PendingEmailValidationRecord validationRec = new PendingEmailValidationRecord(account.getUsername(), cleanedEmail);
+ hibernateSession.save(validationRec);
+ account.setEmail(cleanedEmail);
+ account.setEmailValid(false);
+ hibernateSession.update(account);
+ return validationRec;
+ }
+ };
+ task.setSessionFactory(sessionFactory);
+ return (PendingEmailValidationRecord) task.execute();
+ }
+
public static AccountRecord findAccountByUsername(String username, SessionFactory sessionFactory) throws PersistException {
final String cleanedUsername = AccountRecord.cleanUsername(username);
if (cleanedUsername == null) {
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java 2008-01-01 21:35:01 UTC (rev 660)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java 2008-01-01 22:54:12 UTC (rev 661)
@@ -73,7 +73,7 @@
public static final String SECRET_PARAMETER = "secret";
public String defaultAccountPhotoPath = null;
-
+
public static URI getAccountURI(AccountRecord accountRecord, URI baseURI) {
try {
return new URI(baseURI.toString() + "account/" + accountRecord.getUsername());
@@ -481,7 +481,7 @@
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
- if(authedAccount == null || !authedAccount.getUsername().equals(requestedUsername)){
+ if (authedAccount == null || !authedAccount.getUsername().equals(requestedUsername)) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return;
}
@@ -519,7 +519,7 @@
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
- if(authedAccount == null || !authedAccount.getUsername().equals(requestedUsername)){
+ if (authedAccount == null || !authedAccount.getUsername().equals(requestedUsername)) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return;
}
@@ -609,17 +609,30 @@
}
}
+ //Email changes are special, as they involve validation messages
+ if (updatedDocument.getEmail() != null && !updatedDocument.getEmail().equals(requestedAccount.getEmail())) {
+ try {
+ PendingEmailValidationRecord pendingRecord = AccountPersistTasks.updateAccountEmail(requestedAccount, updatedDocument.getEmail(), getSessionFactory());
+ if (pendingRecord == null) {
+ Log.error("Could not update account email: " + requestedAccount.getUsername() + ": " + updatedDocument.getEmail());
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ return;
+ }
+ sendValidationMail(pendingRecord);
+ requestedAccount = AccountPersistTasks.findAccountByUsername(usernameParam, getSessionFactory());
+ sendStringResponse(createAccountDocument(requestedAccount, true).toString(), "text/xml", response);
+ return;
+ } catch (MailSendException e) {
+ Log.error("Could not send email validation message: " + e);
+ }
+ }
+
//TODO if this returns false we really should reflect that in the response
-
if (!AccountPersistTasks.update(requestedAccount, updatedDocument, getSessionFactory())) {
Log.warn("Account update failed:" + requestedAccount.getUsername());
}
- AccountDocument result = createAccountDocument(requestedAccount, true);
- response.setStatus(HttpServletResponse.SC_OK);
- response.setContentType("text/xml");
- response.getOutputStream().write(result.toString().getBytes());
- return;
+ sendStringResponse(createAccountDocument(requestedAccount, true).toString(), "text/xml", response);
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <tre...@us...> - 2008-01-13 23:11:34
|
Revision: 685
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=685&view=rev
Author: trevorolio
Date: 2008-01-13 15:11:36 -0800 (Sun, 13 Jan 2008)
Log Message:
-----------
Fixed a bug in body configuration delete when using admin access.
Modified Paths:
--------------
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/AccountPersistTasks.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/BodyPersistTasks.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/AccountPersistTasks.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/AccountPersistTasks.java 2008-01-13 23:11:30 UTC (rev 684)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/AccountPersistTasks.java 2008-01-13 23:11:36 UTC (rev 685)
@@ -21,6 +21,7 @@
import com.ogoglio.appdev.persist.PersistException;
import com.ogoglio.util.Log;
import com.ogoglio.xml.AccountDocument;
+import com.ogoglio.xml.BodyDataDocument;
public class AccountPersistTasks {
@@ -165,10 +166,17 @@
Query bodyDataQuery = hibernateSession.getNamedQuery(BodyPersistTasks.BODY_DATA);
BodyDataRecord[] bodyDataRecords = (BodyDataRecord[]) bodyDataQuery.list().toArray(new BodyDataRecord[0]);
- if (bodyDataRecords.length == 0) {
- throw new IllegalStateException("No body data records!");
+ BodyDataRecord guestBodyDataRecord = null;
+ for (int i = 0; i < bodyDataRecords.length; i++) {
+ if(bodyDataRecords[i].getDisplayName().equals(BodyDataDocument.GUEST_BODY_NAME)){
+ guestBodyDataRecord = bodyDataRecords[i];
+ break;
+ }
}
- BodyConfigurationRecord bodyConfRecord = new BodyConfigurationRecord(username, "Body", bodyDataRecords[0].getBodyDataID(), null);
+ if (guestBodyDataRecord == null) {
+ throw new IllegalStateException("No guest body data record with name: " + BodyDataDocument.GUEST_BODY_NAME);
+ }
+ BodyConfigurationRecord bodyConfRecord = new BodyConfigurationRecord(username, "Body", guestBodyDataRecord.getBodyDataID(), null);
hibernateSession.save(bodyConfRecord);
record = new AccountRecord(username, accountlevel, email, false, bodyConfRecord.getBodyConfigurationID(), null, null);
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/BodyPersistTasks.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/BodyPersistTasks.java 2008-01-13 23:11:30 UTC (rev 684)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/BodyPersistTasks.java 2008-01-13 23:11:36 UTC (rev 685)
@@ -98,6 +98,7 @@
session.delete(settings[i]);
}
session.delete(record);
+
return Boolean.TRUE;
}
};
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java 2008-01-13 23:11:30 UTC (rev 684)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java 2008-01-13 23:11:36 UTC (rev 685)
@@ -175,7 +175,7 @@
return true;
}
if ("POST".equals(request.getMethod()) || "DELETE".equals(request.getMethod())) {
- return authedAccount != null && username.equals(authedAccount.getUsername());
+ return authedAccount != null && (username.equals(authedAccount.getUsername()) || authedAccount.getAccountlevel().equals(AccountDocument.ACCOUNT_LEVEL_ADMIN));
}
return false;
}
@@ -183,7 +183,7 @@
private boolean requestOkForBodyList(HttpServletRequest request, String[] pathElements, AccountRecord authedAccount) {
String username = pathElements[pathElements.length - 2];
if ("GET".equals(request.getMethod()) || "HEAD".equals(request.getMethod()) || "POST".equals(request.getMethod()) || "DELETE".equals(request.getMethod())) {
- return authedAccount != null && username.equals(authedAccount.getUsername());
+ return authedAccount != null && (username.equals(authedAccount.getUsername()) || authedAccount.getAccountlevel().equals(AccountDocument.ACCOUNT_LEVEL_ADMIN));
}
return false;
}
@@ -345,7 +345,12 @@
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return;
}
- BodyConfigurationRecord record = BodyPersistTasks.findBodyConfigurationByID(authedAccount.getDefaultBodyConfigurationID(), getSessionFactory());
+ AccountRecord requestedAccountRecord = AccountPersistTasks.findAccountByUsername(username, getSessionFactory());
+ if(requestedAccountRecord == null){
+ response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+ return;
+ }
+ BodyConfigurationRecord record = BodyPersistTasks.findBodyConfigurationByID(requestedAccountRecord.getDefaultBodyConfigurationID(), getSessionFactory());
if (record == null) {
throw new IllegalStateException("Account has a bogus body configuration record.. " + authedAccount.getDefaultBodyConfigurationID());
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ian...@us...> - 2008-02-28 02:04:30
|
Revision: 781
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=781&view=rev
Author: iansmith
Date: 2008-02-27 18:04:33 -0800 (Wed, 27 Feb 2008)
Log Message:
-----------
Some small changes to hopefully detect failed space starts more quickly. The new subtype
of PersistException explicitly demarcates this failure.
Modified Paths:
--------------
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/SpacePersistTasks.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/site/SimServlet.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/SpaceServlet.java
Added Paths:
-----------
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/UnableToAssignSimException.java
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 2008-02-27 23:10:25 UTC (rev 780)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/SpacePersistTasks.java 2008-02-28 02:04:33 UTC (rev 781)
@@ -209,6 +209,7 @@
HttpURLConnection connection = (HttpURLConnection) simURI.toURL().openConnection();
connection.setRequestMethod("GET");
connection.setAllowUserInteraction(false);
+ connection.setConnectTimeout(2000);
connection.setReadTimeout(3000);
if (connection.getResponseCode()!=200) {
Log.warn("Can't get a connection to "+simURI+"! Marking inactive!");
@@ -238,7 +239,7 @@
}
SimRecord[] assignable=findAllReachableAndNotRetiredSims(spaceRecord, sessionFactory);
if (assignable.length==0) {
- throw new PersistException("Unable to find any sims that we can assign to!");
+ throw new UnableToAssignSimException("Unable to find any sims that we can assign to!");
}
//has it been a while?
long now=System.currentTimeMillis();
@@ -252,7 +253,7 @@
assignable=findAllReachableAndNotRetiredSims(spaceRecord, sessionFactory);
if (assignable.length==0) {
- throw new PersistException("Unable to find any reachable sims (after doing a check)!");
+ throw new UnableToAssignSimException("Unable to find any reachable sims (after doing a check)!");
}
return pickSimRandomly(spaceRecord, sessionFactory, assignable);
}
Added: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/UnableToAssignSimException.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/UnableToAssignSimException.java (rev 0)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/UnableToAssignSimException.java 2008-02-28 02:04:33 UTC (rev 781)
@@ -0,0 +1,13 @@
+package com.ogoglio.persist;
+
+import com.ogoglio.appdev.persist.PersistException;
+
+public class UnableToAssignSimException extends PersistException {
+ public UnableToAssignSimException(String msg) {
+ super(msg);
+ }
+ public UnableToAssignSimException(String msg, Exception e) {
+ super(msg);
+ innerThrowable=e;
+ }
+}
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/site/SimServlet.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/site/SimServlet.java 2008-02-27 23:10:25 UTC (rev 780)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/site/SimServlet.java 2008-02-28 02:04:33 UTC (rev 781)
@@ -43,6 +43,7 @@
import com.ogoglio.persist.SimRecord;
import com.ogoglio.persist.SpacePersistTasks;
import com.ogoglio.persist.SpaceRecord;
+import com.ogoglio.persist.UnableToAssignSimException;
import com.ogoglio.sim.Sim;
import com.ogoglio.sim.SpaceSimulator;
import com.ogoglio.sim.script.ScriptContextFactory;
@@ -491,6 +492,10 @@
}
sendStringResponse(list.toString(), "text/xml", response);
+ } catch (UnableToAssignSimException e) {
+ Log.error("Unable to assign sim trying to get list of things (often triggered by space duplication):"+e);
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ return;
} catch (PersistException e) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return;
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java 2008-02-27 23:10:25 UTC (rev 780)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java 2008-02-28 02:04:33 UTC (rev 781)
@@ -59,6 +59,7 @@
import com.ogoglio.persist.SpaceRecord;
import com.ogoglio.persist.TemplatePersistTasks;
import com.ogoglio.persist.TemplateRecord;
+import com.ogoglio.persist.UnableToAssignSimException;
import com.ogoglio.sim.Sim;
import com.ogoglio.util.Log;
import com.ogoglio.util.StreamUtils;
@@ -441,6 +442,12 @@
Map validationMap = createEmailValidationMap(validationRecord.getEmail(), validationURL, "Ogoglio", getHostPortionOfURLForExternalUse());
String body = mailFormatter.format(validationMap, getTemplate(EMAIL_VALIDATION_TEMPLATE));
+ MailClient mailClient = getInitializedMailClient();
+ mailClient.sendEmail(validationRecord.getEmail(), from, "validate request", body);
+ Log.info("Sent validation email to " + validationRecord.getEmail());
+ }
+
+ private MailClient getInitializedMailClient() {
MailClient mailClient = null;
File mailDir = getSiteInfo().getMailDirectory() ;
if (mailDir == null) {
@@ -448,9 +455,19 @@
} else {
mailClient = new MailClient(mailDir);
}
- mailClient.sendEmail(validationRecord.getEmail(), from, "validate request", body);
- Log.info("Sent validation email to " + validationRecord.getEmail());
+ return mailClient;
}
+
+ private void handleCriticalException(Exception e) {
+ String from = "dont-reply@" + getDomainForExternalUse();
+ String to = "critical@" + getDomainForExternalUse();
+ MailClient mailClient = getInitializedMailClient();
+// try {
+// mailClient.sendEmail(to, from, "criticial exception", e.toString());
+// } catch (MailSendException ex) {
+// Log.error("Unable to send email about critical exception:"+e);
+// }
+ }
public static String getTemplate(String templateName) {
try {
@@ -893,13 +910,18 @@
if (record.getSpaceID() != -1) {
SpaceRecord spaceRecord = SpacePersistTasks.findSpaceBySpaceID(record.getSpaceID(), getSessionFactory());
if (spaceRecord != null) {
- SimRecord simRecord = SpacePersistTasks.findOrAssignSim(spaceRecord, getSessionFactory());
- if (simRecord != null) {
- URI thingURI = WebAPIUtil.appendToURI(simRecord.getSimURI(), "space/" + record.getSpaceID() + "/thing/" + record.getThingID());
- if (!new WebAPIClientWire().sendDelete(thingURI, null)) {
- response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- return;
+ try {
+ SimRecord simRecord = SpacePersistTasks.findOrAssignSim(spaceRecord, getSessionFactory());
+ if (simRecord != null) {
+ URI thingURI = WebAPIUtil.appendToURI(simRecord.getSimURI(), "space/" + record.getSpaceID() + "/thing/" + record.getThingID());
+ if (!new WebAPIClientWire().sendDelete(thingURI, null)) {
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ return;
+ }
}
+ } catch (UnableToAssignSimException e) {
+ Log.error("Unable to find or assign sim! Space="+spaceRecord.getSpaceID()+"!");
+ throw e;
}
}
}
@@ -943,13 +965,18 @@
if (oldSpaceID != PossessionDocument.NO_SPACE) {
SpaceRecord oldSpaceRecord = SpacePersistTasks.findSpaceBySpaceID(oldSpaceID, getSessionFactory());
if (oldSpaceRecord != null) {
- SimRecord simRecord = SpacePersistTasks.findOrAssignSim(oldSpaceRecord, getSessionFactory());
- if (simRecord != null) {
- URI thingURI = WebAPIUtil.appendToURI(simRecord.getSimURI(), "space/" + oldSpaceID + "/thing/" + oldThingID);
- if (!new WebAPIClientWire().sendDelete(thingURI, null)) {
- response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- return;
+ try {
+ SimRecord simRecord = SpacePersistTasks.findOrAssignSim(oldSpaceRecord, getSessionFactory());
+ if (simRecord != null) {
+ URI thingURI = WebAPIUtil.appendToURI(simRecord.getSimURI(), "space/" + oldSpaceID + "/thing/" + oldThingID);
+ if (!new WebAPIClientWire().sendDelete(thingURI, null)) {
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ return;
+ }
}
+ } catch (UnableToAssignSimException e) {
+ handleCriticalException(e);
+ throw e;
}
}
}
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 2008-02-27 23:10:25 UTC (rev 780)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/SpaceServlet.java 2008-02-28 02:04:33 UTC (rev 781)
@@ -885,14 +885,14 @@
}
SimRecord[] simRecs = SimPersistTasks.findSims(getSessionFactory());
- Log.debug("Found a list of sims in BaseSimResource, length is " + simRecs.length);
+ //Log.debug("Found a list of sims in BaseSimResource, length is " + simRecs.length);
XMLElement list = new XMLElement("list");
for (int i = 0; i < simRecs.length; i++) {
SimDocument simDoc = DocumentFactory.documentFromRecord(simRecs[i]);
if ((simDoc.isReachable()) && (!onlyServers)) {
try {
URI uri = WebAPIUtil.appendToURI(simDoc.getSimURI(), "space/");
- Log.debug("About to poll " + uri + " to see about it's space list...");
+ //Log.debug("About to poll " + uri + " to see about it's space list...");
WebAPIClientWire wire = new WebAPIClientWire();
wire.setConnectTimeout(2000);
wire.setReadTimeout(2000);
@@ -919,7 +919,7 @@
}
list.addChild(simDoc.toElement());
}
- Log.info("Requested list of sims:"+list.toString());
+ //Log.info("Requested list of sims:"+list.toString());
this.sendStringResponse(list.toString(), "text/xml", response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|