|
From: <tre...@us...> - 2007-08-27 23:53:10
|
Revision: 276
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=276&view=rev
Author: trevorolio
Date: 2007-08-27 16:53:13 -0700 (Mon, 27 Aug 2007)
Log Message:
-----------
Added ServiceState docs and API. Added test cube and cylindar objs. Added fetal mail service. Added abstract remote servlet for apps in the same container which use ogoglio on the back end. Added some email validation code.
Modified Paths:
--------------
maven/trunk/ogoglio-server/pom.xml
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/migrate/AccountsForTesting.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/AccountRecord.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/ServiceInitializationPersistTasks.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SpaceSimulator.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AbstractResourceServlet.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/SiteInfo.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/SpaceServlet.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/xml/server/DocumentFactory.java
maven/trunk/ogoglio-server/src/main/resources/hibernate/migration-1.xml
maven/trunk/ogoglio-server/src/main/webapp/createAccount.html
Added Paths:
-----------
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailClient.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailFormatter.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailSendException.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailTemplateFactory.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailTests.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/PendingEmailValidationRecord.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/PendingEmailValidationTasks.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/ServiceStateRecord.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/ServiceStateTasks.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AbstractRemoteServlet.java
Removed Paths:
-------------
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/util/
Modified: maven/trunk/ogoglio-server/pom.xml
===================================================================
--- maven/trunk/ogoglio-server/pom.xml 2007-08-27 23:52:59 UTC (rev 275)
+++ maven/trunk/ogoglio-server/pom.xml 2007-08-27 23:53:13 UTC (rev 276)
@@ -170,6 +170,16 @@
<artifactId>commons-io</artifactId>
<version>1.3</version>
</dependency>
+ <dependency>
+ <groupId>com.sun</groupId>
+ <artifactId>mail</artifactId>
+ <version>1.4</version>
+ </dependency>
+ <dependency>
+ <groupId>com.sun</groupId>
+ <artifactId>jaf</artifactId>
+ <version>1.1</version>
+ </dependency>
<!-- need MYSQL for tests -->
<dependency>
Added: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailClient.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailClient.java (rev 0)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailClient.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -0,0 +1,92 @@
+package com.ogoglio.mail;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.internet.AddressException;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import com.ogoglio.util.ArgumentUtils;
+
+public class MailClient {
+
+ private boolean writeToDisk = false;
+
+ private File outputDir = null;
+
+ /**
+ * Sends all mail to individual files in outputDir
+ */
+ public MailClient(File outputDir) {
+ ArgumentUtils.assertReadableDir(outputDir, true);
+ this.outputDir = outputDir;
+ writeToDisk = true;
+ }
+
+ /**
+ * Sends all mail via JNDI:java:comp/env session at mail/Session
+ */
+ public MailClient() {
+ writeToDisk = false;
+ }
+
+ public void sendEmail(String to, String from, String subject, String body) throws MailSendException {
+ try {
+ if (writeToDisk) {
+ sendToDisk(to, from, subject, body);
+ } else {
+ sendViaContextSession(to, from, subject, body);
+ }
+ } catch (NamingException e) {
+ throw new MailSendException(e);
+ } catch (AddressException e) {
+ throw new MailSendException(e);
+ } catch (MessagingException e) {
+ throw new MailSendException(e);
+ } catch (IOException e) {
+ throw new MailSendException(e);
+ }
+ }
+
+ private void sendToDisk(String to, String from, String subject, String body) throws IOException {
+ FileOutputStream output = new FileOutputStream(new File(outputDir, "Mail-Message-" + System.currentTimeMillis()));
+ output.write(("to: " + to + "\n").getBytes());
+ output.write(("from: " + from + "\n").getBytes());
+ output.write(("subject: " + subject + "\n").getBytes());
+ output.write(("\n").getBytes());
+ output.write(body.getBytes());
+ output.flush();
+ output.close();
+ }
+
+ private void sendViaContextSession(String to, String from, String subject, String body) throws NamingException, AddressException, MessagingException {
+ Context initCtx = new InitialContext();
+ Context envCtx = (Context) initCtx.lookup("java:comp/env");
+ Session session = (Session) envCtx.lookup("mail/Session");
+
+ Message message = new MimeMessage(session);
+ InternetAddress toAddress[] = new InternetAddress[1];
+ toAddress[0] = new InternetAddress(to);
+ message.setRecipients(Message.RecipientType.TO, toAddress);
+ message.setFrom(new InternetAddress(from));
+ message.setSubject(subject);
+ message.setContent(body, "text/plain");
+ Transport.send(message);
+ }
+
+ /**
+ * @return null if this client is using the JNDI mail session instead of writing to disk
+ */
+ public File getOutputDir() {
+ return outputDir;
+ }
+}
Added: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailFormatter.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailFormatter.java (rev 0)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailFormatter.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -0,0 +1,29 @@
+package com.ogoglio.mail;
+
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import com.ogoglio.util.ArgumentUtils;
+
+public class MailFormatter {
+
+ public String format(Map map, String template) {
+ ArgumentUtils.assertNotNull(map);
+ ArgumentUtils.assertNotEmpty(template);
+ return stupidMerge(map, template);
+ }
+
+ private String stupidMerge(Map map, String template) {
+ String result = new String(template);
+ String[] keys = (String[])map.keySet().toArray(new String[0]);
+ for (int i = 0; i < keys.length; i++) {
+ String replacement = (String)map.get(keys[i]);
+ result = result.replaceAll(Pattern.quote(createVariableString((keys[i]))), replacement);
+ }
+ return result;
+ }
+
+ public String createVariableString(String variableName) {
+ return "${" + variableName + "}";
+ }
+}
Added: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailSendException.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailSendException.java (rev 0)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailSendException.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -0,0 +1,7 @@
+package com.ogoglio.mail;
+
+public class MailSendException extends Exception {
+ public MailSendException(Exception e) {
+ super(e);
+ }
+}
Added: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailTemplateFactory.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailTemplateFactory.java (rev 0)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailTemplateFactory.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -0,0 +1,33 @@
+package com.ogoglio.mail;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.ogoglio.util.StreamUtils;
+
+public class MailTemplateFactory {
+
+ private static final String TEMPLATE_RESOURCE_PATH = "com/ogoglio/mail/";
+
+ public static final String TEST_TEMPLATE_1 = "TestTemplate1.txt";
+
+ public static final String EMAIL_VALIDATION_TEMPLATE = "EmailValidationTemplate.txt";
+
+ public static String getTemplate(String templateName) {
+ try {
+ return StreamUtils.readResource(TEMPLATE_RESOURCE_PATH + templateName);
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ public static Map createEmailValidationMap(String emailToValidate, String validationURL, String serviceName, String serviceURL) {
+ HashMap map = new HashMap();
+ map.put("emailToValidate", emailToValidate);
+ map.put("validationURL", validationURL);
+ map.put("serviceName", serviceName);
+ map.put("serviceURL", serviceURL);
+ return map;
+ }
+}
Added: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailTests.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailTests.java (rev 0)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/mail/MailTests.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -0,0 +1,100 @@
+package com.ogoglio.mail;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.HashMap;
+
+import junit.framework.TestCase;
+
+import com.ogoglio.util.ArgumentUtils;
+import com.ogoglio.util.StreamUtils;
+
+public class MailTests extends TestCase {
+
+ private static final String TEST_DIR_PATH = "mailTestFiles";
+
+ private File mailOutputDir = null;
+
+ private MailClient mailClient1 = null;
+
+ private MailFormatter mailFormatter1 = null;
+
+ private String testTemplate1 = null;
+
+ private HashMap testMap1 = null;
+
+ public void setUp() throws IOException {
+ mailOutputDir = new File(TEST_DIR_PATH);
+ if (mailOutputDir.exists()) {
+ delete(mailOutputDir);
+ }
+ assertTrue(mailOutputDir.mkdir());
+
+ mailClient1 = new MailClient(mailOutputDir);
+
+ mailFormatter1 = new MailFormatter();
+
+ testTemplate1 = MailTemplateFactory.getTemplate(MailTemplateFactory.TEST_TEMPLATE_1);
+ assertNotNull(testTemplate1);
+
+ testMap1 = new HashMap();
+ testMap1.put("username", "susan");
+ testMap1.put("url", "http://example.com/og/");
+ testMap1.put("moon.unit", "zappa");
+ testMap1.put("Kurt", "Vonnegut.");
+ }
+
+ private void delete(File dir) {
+ File[] children = dir.listFiles();
+ for (int i = 0; i < children.length; i++) {
+ assertTrue(children[i].delete());
+ }
+ assertTrue(dir.delete());
+ }
+
+ public void tearDown() {
+ if (mailOutputDir != null && mailOutputDir.exists()) {
+ delete(mailOutputDir);
+ }
+ }
+
+ public void testClientFileOutput() throws MailSendException, FileNotFoundException, IOException {
+ String body = "This is the body.";
+ String to = "to...@ex...";
+ String from = "ha...@ex...";
+ String subject = "OWLs 'n Stuff";
+ mailClient1.sendEmail(to, from, subject, body);
+ File[] files = mailClient1.getOutputDir().listFiles();
+ assertNotNull(files);
+ assertEquals(1, files.length);
+ assertFalse(files[0].length() == 0);
+ String fileContents = StreamUtils.readInput(new FileInputStream(files[0]));
+ assertTrue(fileContents.endsWith(body));
+ }
+
+ public void testFormat() {
+ String result = mailFormatter1.format(testMap1, testTemplate1);
+ assertNotNull(result);
+ assertTrue(result.length() > 1);
+ assertExactlyOne(result, (String) testMap1.get("username"));
+ assertMultiple(result, (String) testMap1.get("url"));
+ assertExactlyOne(result, (String) testMap1.get("moon.unit"));
+ assertExactlyOne(result, (String) testMap1.get("Kurt"));
+ }
+
+ private void assertExactlyOne(String data, String target) {
+ ArgumentUtils.assertNotEmpty(data);
+ ArgumentUtils.assertNotEmpty(target);
+ assertFalse(data.indexOf(target) == -1);
+ assertTrue(data.indexOf(target) == data.lastIndexOf(target));
+ }
+
+ private void assertMultiple(String data, String target) {
+ ArgumentUtils.assertNotEmpty(data);
+ ArgumentUtils.assertNotEmpty(target);
+ assertFalse(data.indexOf(target) == -1);
+ assertFalse(data.indexOf(target) == data.lastIndexOf(target));
+ }
+}
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/migrate/AccountsForTesting.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/migrate/AccountsForTesting.java 2007-08-27 23:52:59 UTC (rev 275)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/migrate/AccountsForTesting.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -44,6 +44,7 @@
//actual work
ServiceInitializationPersistTasks.initializeLocalSim(uri,sessionFactory);
ServiceInitializationPersistTasks.initializeBootstrapAccount(sessionFactory, uri.getHost(), user, pw);
+ ServiceInitializationPersistTasks.initializeServiceState(sessionFactory);
return true;
} catch (Exception e) {
e.printStackTrace();
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/AccountRecord.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/AccountRecord.java 2007-08-27 23:52:59 UTC (rev 275)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/AccountRecord.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -15,10 +15,8 @@
import com.ogoglio.xml.AccountDocument;
-
public class AccountRecord {
-
private String username = null;
private String accountlevel = AccountDocument.ACCOUNT_LEVEL_BASIC;
@@ -60,6 +58,8 @@
if (this.email == null) {
throw new IllegalArgumentException("Bad email: " + email);
}
+
+ this.creationDate = System.currentTimeMillis();
}
public boolean equals(Object obj) {
@@ -81,11 +81,11 @@
return null;
}
String result = password.trim();
- if (result.length() < 5) {
+ if (result.length() < 4) {
return null;
}
for (int i = 0; i < result.length(); i++) {
- if (!Character.isLetterOrDigit(result.charAt(i))) {
+ if (result.charAt(i) != ' ') {
return null;
}
}
@@ -104,13 +104,13 @@
if (result.length() == 0) {
return null;
}
- if(result.indexOf('@') == -1 || result.indexOf('@') == 0 || result.indexOf('@') == result.length() - 1) {
+ if (result.indexOf('@') == -1 || result.indexOf('@') == 0 || result.indexOf('@') == result.length() - 1) {
return null;
}
- if(result.indexOf(' ') != -1) {
+ if (result.indexOf(' ') != -1) {
return null;
}
- if(result.indexOf('.') == -1 || result.indexOf('.') == result.length() - 1) {
+ if (result.indexOf('.') == -1 || result.indexOf('.') == result.length() - 1) {
return null;
}
return result;
@@ -155,7 +155,7 @@
}
public void setAccountlevel(String level) {
- if(verifyAccountLevel(level) == null) {
+ if (verifyAccountLevel(level) == null) {
throw new IllegalArgumentException("Bad account level: " + level);
}
this.accountlevel = level;
@@ -178,7 +178,7 @@
}
public long getCreationDate() {
- return creationDate;
+ return creationDate;
}
public void setCreationDate(long creationDate) {
@@ -253,7 +253,7 @@
this.defaultBodyId = defaultBodyID;
}
- public void setNotFrozen() {
- this.frozenUntil=AccountDocument.NO_TIME_VALUE;
- }
+ public void setNotFrozen() {
+ this.frozenUntil = AccountDocument.NO_TIME_VALUE;
+ }
}
Added: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/PendingEmailValidationRecord.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/PendingEmailValidationRecord.java (rev 0)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/PendingEmailValidationRecord.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -0,0 +1,74 @@
+package com.ogoglio.persist;
+
+import java.util.Random;
+
+import com.ogoglio.util.ArgumentUtils;
+import com.ogoglio.xml.AccountDocument;
+
+public class PendingEmailValidationRecord {
+
+ private static Random RANDOM = new Random();
+
+ private String username = null;
+
+ private String email = null;
+
+ private String secret = null;
+
+ private long creationDate = AccountDocument.NO_TIME_VALUE;
+
+ public PendingEmailValidationRecord() {
+ }
+
+ public PendingEmailValidationRecord(String username, String email) {
+ ArgumentUtils.assertNotEmpty(username);
+ ArgumentUtils.assertIsEmail(email);
+ this.username = username;
+ this.email = email;
+ this.secret = generateSecret();
+ creationDate = System.currentTimeMillis();
+ }
+
+ private static final String SECRET_SOURCE = "abcdefghijklmnopqrstuvwxyz1234567890";
+
+ private String generateSecret() {
+ StringBuffer result = new StringBuffer();
+ for (int i = 0; i < 25; i++) {
+ result.append(SECRET_SOURCE.charAt(Math.abs(RANDOM.nextInt()) % SECRET_SOURCE.length()));
+ }
+ return result.toString();
+ }
+
+ public long getCreationDate() {
+ return creationDate;
+ }
+
+ public void setCreationDate(long creationDate) {
+ this.creationDate = creationDate;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ ArgumentUtils.assertIsEmail(email);
+ this.email = email;
+ }
+
+ public String getSecret() {
+ return secret;
+ }
+
+ public void setSecret(String secret) {
+ this.secret = secret;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+}
Added: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/PendingEmailValidationTasks.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/PendingEmailValidationTasks.java (rev 0)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/PendingEmailValidationTasks.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -0,0 +1,61 @@
+package com.ogoglio.persist;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+
+public class PendingEmailValidationTasks {
+
+ public static final String PEV_BY_USERNAME = "com.ogoglio.persist.pendingEmailValidationsByUsername";
+ public static final String PEV_BY_EMAIL = "com.ogoglio.persist.pendingEmailValidationByEmail";
+ public static final String PEV_BY_SECRET = "com.ogoglio.persist.pendingEmailValidationBySecret";
+
+ public static PendingEmailValidationRecord[] findPendingEmailValidationsByUsername(final String username, SessionFactory sessionFactory) throws PersistException {
+ HibernateTask task = new HibernateTask() {
+ public Object run(Session hibernateSession) {
+ Query query = hibernateSession.getNamedQuery(PEV_BY_USERNAME);
+ query.setParameter("username", username);
+ PendingEmailValidationRecord recs[] = (PendingEmailValidationRecord[]) query.list().toArray(new PendingEmailValidationRecord[0]);
+ return recs;
+ }
+ };
+ task.setSessionFactory(sessionFactory);
+ return (PendingEmailValidationRecord[]) task.execute();
+ }
+
+ public static PendingEmailValidationRecord findPendingEmailValidationByEmail(final String email, SessionFactory sessionFactory) throws PersistException {
+ HibernateTask task = new HibernateTask() {
+ public Object run(Session hibernateSession) {
+ Query query = hibernateSession.getNamedQuery(PEV_BY_EMAIL);
+ query.setParameter("email", email);
+ return query.uniqueResult();
+ }
+ };
+ task.setSessionFactory(sessionFactory);
+ return (PendingEmailValidationRecord) task.execute();
+ }
+
+ public static PendingEmailValidationRecord findPendingEmailValidationBySecret(final String secret, SessionFactory sessionFactory) throws PersistException {
+ HibernateTask task = new HibernateTask() {
+ public Object run(Session hibernateSession) {
+ Query query = hibernateSession.getNamedQuery(PEV_BY_SECRET);
+ query.setParameter("secret", secret);
+ return query.uniqueResult();
+ }
+ };
+ task.setSessionFactory(sessionFactory);
+ return (PendingEmailValidationRecord) task.execute();
+ }
+
+ public static boolean delete(final PendingEmailValidationRecord validationRecord, SessionFactory sessionFactory) throws PersistException {
+ HibernateTask task = new HibernateTask() {
+ public Object run(Session hibernateSession) {
+ hibernateSession.delete(validationRecord);
+ return Boolean.TRUE;
+ }
+ };
+ task.setSessionFactory(sessionFactory);
+ return Boolean.TRUE.equals(task.execute());
+ }
+
+}
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/ServiceInitializationPersistTasks.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/ServiceInitializationPersistTasks.java 2007-08-27 23:52:59 UTC (rev 275)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/ServiceInitializationPersistTasks.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -46,4 +46,8 @@
AccountPersistTasks.update(accountRec, sessionFactory);
}
+
+ public static void initializeServiceState(SessionFactory sessionFactory) throws PersistException, IOException{
+ ServiceStateTasks.getOrCreateServiceState(sessionFactory);
+ }
}
Added: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/ServiceStateRecord.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/ServiceStateRecord.java (rev 0)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/ServiceStateRecord.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -0,0 +1,43 @@
+package com.ogoglio.persist;
+
+import com.ogoglio.xml.ServiceStateDocument;
+
+public class ServiceStateRecord {
+
+ private String registrationState = ServiceStateDocument.REGISTRATION_STATE_ADMIN_ONLY;
+
+ private long serviceStateID = -1;
+
+ public ServiceStateRecord() {
+ }
+
+ public ServiceStateRecord(String registrationState) {
+ setRegistrationState(registrationState);
+ }
+
+ public String getRegistrationState() {
+ return registrationState;
+ }
+
+ public void setRegistrationState(String registrationState) {
+ assertValidRegistrationState(registrationState);
+ this.registrationState = registrationState;
+ }
+
+ private void assertValidRegistrationState(String registrationState) {
+ for (int i = 0; i < ServiceStateDocument.REGISTRATION_STATES.length; i++) {
+ if (ServiceStateDocument.REGISTRATION_STATES[i].equals(registrationState)) {
+ return;
+ }
+ }
+ throw new IllegalArgumentException("Baad registration state: " + registrationState);
+ }
+
+ public long getServiceStateID() {
+ return serviceStateID;
+ }
+
+ public void setServiceStateID(long serviceStateID) {
+ this.serviceStateID = serviceStateID;
+ }
+}
\ No newline at end of file
Added: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/ServiceStateTasks.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/ServiceStateTasks.java (rev 0)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/ServiceStateTasks.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -0,0 +1,54 @@
+package com.ogoglio.persist;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+
+import com.ogoglio.xml.ServiceStateDocument;
+
+public class ServiceStateTasks {
+
+ public static final String SERVICE_STATE_RECORDS = "com.ogoglio.persist.serviceStateRecords";
+
+ /**
+ * This will barf if there are more than one service state records
+ */
+ public static ServiceStateRecord getOrCreateServiceState(SessionFactory sessionFactory) throws PersistException{
+ HibernateTask task = new HibernateTask() {
+ public Object run(Session session) throws PersistException {
+ Query query = session.getNamedQuery(SERVICE_STATE_RECORDS);
+ ServiceStateRecord record = (ServiceStateRecord)query.uniqueResult();
+ if(record == null) {
+ record = new ServiceStateRecord();
+ session.save(record);
+ }
+ return record;
+ }
+ };
+ task.setSessionFactory(sessionFactory);
+ return (ServiceStateRecord) task.execute();
+ }
+
+ public static ServiceStateRecord updateServiceState(final ServiceStateDocument proposedDoc, SessionFactory sessionFactory) throws PersistException {
+ HibernateTask task = new HibernateTask() {
+ public Object run(Session session) throws PersistException {
+ Query query = session.getNamedQuery(SERVICE_STATE_RECORDS);
+ ServiceStateRecord record = (ServiceStateRecord)query.uniqueResult();
+ if(record == null) {
+ throw new IllegalStateException("Tried to update service state when there's no record!");
+ }
+ boolean dirty = false;
+ if(!record.getRegistrationState().equals(proposedDoc.getRegistrationState())) {
+ record.setRegistrationState(proposedDoc.getRegistrationState());
+ dirty = true;
+ }
+ if(dirty) {
+ session.update(record);
+ }
+ return record;
+ }
+ };
+ task.setSessionFactory(sessionFactory);
+ return (ServiceStateRecord) task.execute();
+ }
+}
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-08-27 23:52:59 UTC (rev 275)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/sim/SpaceSimulator.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -41,6 +41,7 @@
import com.ogoglio.util.BlockingQueue;
import com.ogoglio.util.BlockingQueue.QueueClosedException;
import com.ogoglio.viewer.j3d.J3DRenderer;
+import com.ogoglio.viewer.render.UIConstants;
import com.ogoglio.xml.BodyDocument;
import com.ogoglio.xml.DoorDocument;
import com.ogoglio.xml.PageDocument;
@@ -162,17 +163,17 @@
public InputStream getUserAnimationStream(String username, long animationID) throws IOException {
if (animationID == 1) {
- return SpaceSimulator.class.getClassLoader().getResourceAsStream("com/ogoglio/viewer/applet/resources/avatar.bvh");
+ return UIConstants.getResource("avatar/avatar.bvh");
} else if (animationID == 2) {
- return SpaceSimulator.class.getClassLoader().getResourceAsStream("com/ogoglio/viewer/applet/resources/avatar-walk.bvh");
+ return UIConstants.getResource("avatar/avatar-walk.bvh");
} else if (animationID == 3) {
- return SpaceSimulator.class.getClassLoader().getResourceAsStream("com/ogoglio/viewer/applet/resources/avatar-wave.bvh");
+ return UIConstants.getResource("avatar/avatar-wave.bvh");
}
return null;
}
public InputStream getUserSkinMapStream(String username) throws IOException {
- return SpaceSimulator.class.getClassLoader().getResourceAsStream("com/ogoglio/viewer/applet/resources/avatar.smap");
+ return UIConstants.getResource("avatar/avatar.smap");
}
public String getThingScript(long thingID) throws IOException {
@@ -184,7 +185,7 @@
}
public InputStream getUserGeometryStream(String username, String name) throws IOException {
- return SpaceSimulator.class.getClassLoader().getResourceAsStream("com/ogoglio/viewer/applet/resources/avatar.obj");
+ return UIConstants.getResource("avatar/avatar.obj");
}
public InputStream getPageContentStream(long thingID, long pageID) {
Added: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AbstractRemoteServlet.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AbstractRemoteServlet.java (rev 0)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AbstractRemoteServlet.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -0,0 +1,88 @@
+package com.ogoglio.site;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ogoglio.client.AuthenticationFailedException;
+import com.ogoglio.client.WebAPIAuthenticator;
+import com.ogoglio.client.WebAPIAuthenticatorFactory;
+import com.ogoglio.client.WebAPIClient;
+import com.ogoglio.client.WebAPIClientWire;
+import com.ogoglio.client.WebAPIDescriptor;
+import com.ogoglio.site.AbstractResourceServlet;
+import com.ogoglio.site.AuthServlet;
+import com.ogoglio.util.ArgumentUtils;
+import com.ogoglio.xml.AuthDocument;
+
+public abstract class AbstractRemoteServlet extends AbstractResourceServlet {
+
+ private WebAPIClient ogoglioClient = null;
+
+ private String ogoglioUsername = null;
+
+ private String ogoglioPassword = null;
+
+ public abstract String getOgoglioUsernameContextKey();
+
+ public abstract String getOgoglioPasswordContextKey();
+
+ public void init(ServletConfig config) throws ServletException {
+ super.init(config);
+ try {
+ Context initCtx = new InitialContext();
+ Context envCtx = (Context) initCtx.lookup("java:comp/env");
+
+ ogoglioUsername = (String) envCtx.lookup(getOgoglioUsernameContextKey());
+ ArgumentUtils.assertNotEmpty(ogoglioUsername);
+ ogoglioPassword = (String) envCtx.lookup(getOgoglioPasswordContextKey());
+ ArgumentUtils.assertNotEmpty(ogoglioPassword);
+ } catch (NamingException e) {
+ throw new ServletException("Could not init EventServlet (probably forgot env variables in setup.xml): " + e);
+ }
+ }
+
+ public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
+ if (ogoglioClient == null) {
+ try {
+ WebAPIClientWire wire = new WebAPIClientWire();
+ URI serviceURI = new URI(getSiteInfo().getBaseUrl());
+ WebAPIDescriptor descriptor = new WebAPIDescriptor(serviceURI);
+ WebAPIAuthenticator authenticator = new WebAPIAuthenticatorFactory().authenticate(wire, descriptor, ogoglioUsername, ogoglioPassword);
+ ogoglioClient = new WebAPIClient(new WebAPIDescriptor(serviceURI), authenticator, wire);
+ } catch (URISyntaxException e) {
+ throw new ServletException("Could not connect to ogoglio service: " + e);
+ } catch (IOException e) {
+ throw new ServletException("Failed because of Ogoglio service communication failure: " + e);
+ } catch (AuthenticationFailedException e) {
+ throw new ServletException("Failed because of Ogoglio service auth failure: " + e);
+ }
+ }
+
+ super.service(request, response);
+ }
+
+ public AuthDocument getAuthDocument(HttpServletRequest request) throws IOException {
+ String authCookie = AuthServlet.getRequestAuthCookie(request);
+ if (authCookie == null) {
+ return null;
+ }
+ return getOgoglioClient().getAuthDocumentByAuthCookie(authCookie);
+ }
+
+ public WebAPIClient getOgoglioClient() {
+ return ogoglioClient;
+ }
+
+ public String getOgoglioUsername() {
+ return ogoglioUsername;
+ }
+}
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AbstractResourceServlet.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AbstractResourceServlet.java 2007-08-27 23:52:59 UTC (rev 275)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AbstractResourceServlet.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -50,7 +50,7 @@
public static final String OGOGLIO_BASE_URL_KEY = "ogoglio/baseURL";
- public static final String HIBERNATE_SESSION_FACTORY_KEY = "com.ogoglio.hibernateSessionFactory";
+ private static final String HIBERNATE_SESSION_FACTORY_KEY = "com.ogoglio.hibernateSessionFactory";
private static final String METHOD_PARAM = "method";
@@ -82,8 +82,15 @@
mediaDirectory = new File((String)envCtx.lookup("ogoglio/mediaDirectory"));
} catch (NamingException e) {
}
- siteInfo = new SiteInfo(baseUrl, mediaUrl, simsAllowRemoteAccess, mediaDirectory);
+ File mailDir = null;
+ try {
+ mailDir = new File((String)envCtx.lookup("ogoglio/mailDirectory"));
+ } catch (NamingException e) {
+ }
+
+ siteInfo = new SiteInfo(baseUrl, mediaUrl, simsAllowRemoteAccess, mediaDirectory, mailDir);
+
mediaService = new MediaService(new URI(siteInfo.getMediaUrl()));
} catch (IOException e) {
throw new ServletException("Could not init: " + e);
@@ -103,7 +110,7 @@
throw new IllegalStateException("The base resource must have a String path element: " + baseResource.getPathElement());
}
}
-
+
public void destroy() {
try {
hibernateSessionFactory.close();
@@ -124,7 +131,7 @@
return hibernateSessionFactory;
}
- private static SessionFactory getOrCreateHibernateSessionFactory(ServletConfig config, Context context) {
+private static SessionFactory getOrCreateHibernateSessionFactory(ServletConfig config, Context context) {
SessionFactory sessionFactory = (SessionFactory) config.getServletContext().getAttribute(HIBERNATE_SESSION_FACTORY_KEY);
if (sessionFactory == null) {
System.out.println(config.getServletName()+" checking DB Version...");
@@ -137,7 +144,6 @@
}
return sessionFactory;
}
-
public static void setNoCache(HttpServletResponse response) {
//IE caches XMLHttpRequest responses, so we set explicit no-cache headers
response.addHeader("Cache-Control", "must-revalidate");
@@ -247,7 +253,7 @@
outputStream.flush();
outputStream.close();
}
- System.out.println("FART 2nd level proxy:"+connection.getResponseCode());
+
response.setStatus(connection.getResponseCode());
Map headers = connection.getHeaderFields();
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 2007-08-27 23:52:59 UTC (rev 275)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -17,6 +17,7 @@
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
+import java.util.Map;
import javax.media.j3d.Transform3D;
import javax.servlet.ServletConfig;
@@ -28,14 +29,22 @@
import com.ogoglio.client.WebAPIClientWire;
import com.ogoglio.client.WebAPIUtil;
+import com.ogoglio.mail.MailClient;
+import com.ogoglio.mail.MailFormatter;
+import com.ogoglio.mail.MailSendException;
+import com.ogoglio.mail.MailTemplateFactory;
import com.ogoglio.media.MediaService;
import com.ogoglio.persist.AccountPersistTasks;
import com.ogoglio.persist.AccountRecord;
import com.ogoglio.persist.BodyPersistTasks;
import com.ogoglio.persist.BodyRecord;
+import com.ogoglio.persist.PendingEmailValidationRecord;
+import com.ogoglio.persist.PendingEmailValidationTasks;
import com.ogoglio.persist.PersistException;
import com.ogoglio.persist.PossessionPersistTasks;
import com.ogoglio.persist.PossessionRecord;
+import com.ogoglio.persist.ServiceStateRecord;
+import com.ogoglio.persist.ServiceStateTasks;
import com.ogoglio.persist.SimRecord;
import com.ogoglio.persist.SpaceMemberPersistTasks;
import com.ogoglio.persist.SpaceMemberRecord;
@@ -48,12 +57,15 @@
import com.ogoglio.xml.AccountDocument;
import com.ogoglio.xml.BodyDocument;
import com.ogoglio.xml.PossessionDocument;
+import com.ogoglio.xml.ServiceStateDocument;
import com.ogoglio.xml.TemplateDocument;
import com.ogoglio.xml.ThingDocument;
import com.ogoglio.xml.server.DocumentFactory;
public class AccountServlet extends AbstractResourceServlet {
+ public static final String SECRET_PARAMETER = "secret";
+
public static URI getAccountURI(AccountRecord accountRecord, URI baseURI) {
try {
return new URI(baseURI.toString() + "account/" + accountRecord.getUsername());
@@ -73,26 +85,6 @@
return result;
}
- public void init(ServletConfig config) throws ServletException {
- super.init(config);
- /*
- * IES:NOT NEEDED NOW WITH DB MIGRATION?
- try {
- ServiceInitializationPersistTasks.initializeLocalSim(new URI(getSiteInfo().getBaseUrl()), getSessionFactory());
- ServiceInitializationPersistTasks.initializeLibraryAccount(getSessionFactory(), getSiteInfo().getHost());
- } catch (PersistException e) {
- e.printStackTrace();
- throw new ServletException("Could not initialize service: " + e);
- } catch (URISyntaxException e) {
- e.printStackTrace();
- throw new ServletException("Could not initialize service: " + e);
- } catch (IOException e) {
- e.printStackTrace();
- throw new ServletException("Could not initialize service: " + e);
- }
- */
- }
-
public SiteResource createBaseResource(ServletConfig servletConfig) {
return new AccountsResource();
}
@@ -102,6 +94,7 @@
public AccountsResource() {
super("account", false, getSessionFactory());
addSubResource(new TemplateQueryResource());
+ addSubResource(new EmailValidationResource());
addSubResource(new AccountResource());
}
@@ -109,8 +102,25 @@
sendStringResponse("Nothing to see here, folks.\n", "text/plain", response);
}
+ private boolean canCreateAccount(AccountRecord authedAccount) throws PersistException {
+ ServiceStateRecord serviceStateRecord = ServiceStateTasks.getOrCreateServiceState(getSessionFactory());
+ if (ServiceStateDocument.REGISTRATION_STATE_OPEN.equals(serviceStateRecord.getRegistrationState())) {
+ return true;
+ }
+
+ if (ServiceStateDocument.REGISTRATION_STATE_CLOSED.equals(serviceStateRecord.getRegistrationState())) {
+ return false;
+ }
+
+ if (authedAccount == null || !AccountDocument.ACCOUNT_LEVEL_ADMIN.equals(authedAccount.getAccountlevel())) {
+ return false;
+ }
+ return true;
+
+ }
+
public void doPost(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws ServletException, IOException, PersistException {
- if (authedAccount == null || !AccountDocument.ACCOUNT_LEVEL_ADMIN.equals(authedAccount.getAccountlevel())) {
+ if (!canCreateAccount(authedAccount)) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return;
}
@@ -129,10 +139,68 @@
newAccountRec.setLastName(newAccountDoc.getLastName());
newAccountRec.setHomepage(newAccountDoc.getHomepage());
AccountPersistTasks.update(newAccountRec, sessionFactory);
+
+ PendingEmailValidationRecord validationRecord = PendingEmailValidationTasks.findPendingEmailValidationByEmail(newAccountRec.getEmail(), getSessionFactory());
+ if (validationRecord != null) {
+ try {
+ sendValidationMail(validationRecord);
+ } catch (MailSendException e) {
+ System.err.println("Could not send validation email: " + e);
+ }
+ } else {
+ System.err.println("Created an account without creating an email validation: " + newAccountRec.getUsername());
+ }
+
sendStringResponse(createAccountDocument(newAccountRec, true).toElement().toString(), "text/xml", response);
}
}
+ private void sendValidationMail(PendingEmailValidationRecord validationRecord) throws MailSendException {
+ String from = "robot@" + getSiteInfo().getHost();
+ String validationURL = getSiteInfo().getBaseUrl() + "account/validate?" + SECRET_PARAMETER + "=" + validationRecord.getSecret();
+
+ MailFormatter mailFormatter = new MailFormatter();
+ Map validationMap = MailTemplateFactory.createEmailValidationMap(validationRecord.getEmail(), validationURL, "Ogoglio", getSiteInfo().getBaseUrl());
+ String body = mailFormatter.format(validationMap, MailTemplateFactory.getTemplate(MailTemplateFactory.EMAIL_VALIDATION_TEMPLATE));
+
+ MailClient mailClient = null;
+ if (getSiteInfo().getMailDirectory() == null) {
+ mailClient = new MailClient();
+ } else {
+ mailClient = new MailClient(getSiteInfo().getMailDirectory());
+ }
+ mailClient.sendEmail(validationRecord.getEmail(), from, "validate request", body);
+ System.out.println("Sent validation email to " + validationRecord.getEmail());
+ }
+
+ private class EmailValidationResource extends AuthenticatedSiteResource {
+ public EmailValidationResource() {
+ super("validate", false, getSessionFactory());
+ }
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
+ String requestedSecret = request.getParameter(SECRET_PARAMETER);
+ if (requestedSecret == null || requestedSecret.length() == 0) {
+ System.err.println("Requested validation with no secret");
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+ PendingEmailValidationRecord validationRecord = PendingEmailValidationTasks.findPendingEmailValidationBySecret(requestedSecret, getSessionFactory());
+ if (validationRecord == null) {
+ System.err.println("Requested validation with unknown secret: " + requestedSecret);
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+
+ if (!PendingEmailValidationTasks.delete(validationRecord, getSessionFactory())) {
+ System.err.println("Could not delete validation record for email: " + validationRecord.getEmail());
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ return;
+ }
+ sendStringResponse("ok", "text/plain", response);
+ }
+ }
+
private class AccountResource extends AuthenticatedSiteResource {
public AccountResource() {
super(SiteResource.WILDCARD_ELEMENT, true, getSessionFactory());
@@ -195,12 +263,12 @@
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return;
}
- if (requestedAccount.getFrozenUntil() != AccountDocument.NO_TIME_VALUE && requestedAccount.getFrozenUntil()!=updatedDocument.getFrozenUntil().getTime()) {
+ if (requestedAccount.getFrozenUntil() != AccountDocument.NO_TIME_VALUE && requestedAccount.getFrozenUntil() != updatedDocument.getFrozenUntil().getTime()) {
System.err.println("User tried to update own freeze: " + requestedAccount.getUsername());
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return;
}
- if (requestedAccount.getFrozenUntil() !=AccountDocument.NO_TIME_VALUE && updatedDocument.getFrozenUntil() != null) {
+ if (requestedAccount.getFrozenUntil() != AccountDocument.NO_TIME_VALUE && updatedDocument.getFrozenUntil() != null) {
System.err.println("User tried to freeze themselves: " + requestedAccount.getUsername());
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return;
@@ -210,9 +278,9 @@
//TODO if this returns false we really should reflect that in the response
if (!AccountPersistTasks.update(requestedAccount, updatedDocument, getSessionFactory())) {
- System.out.println("Warning: ACCOUNT update failed:"+requestedAccount.getUsername());
+ System.out.println("Warning: ACCOUNT update failed:" + requestedAccount.getUsername());
}
- //AccountPersistTasks.findAccountByUsername(usernameParam, getSessionFactory());
+
AccountDocument result = createAccountDocument(requestedAccount, true);
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType("text/xml");
@@ -261,7 +329,7 @@
public class TemplatesResource extends AuthenticatedSiteResource {
public TemplatesResource() {
super("template", true, getSessionFactory());
- addSubResource(new TemplateResource(getSessionFactory(),getMediaService()));
+ addSubResource(new TemplateResource(getSessionFactory(), getMediaService()));
}
public void doPost(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
@@ -278,14 +346,13 @@
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return;
}
-
+
TemplateDocument result = DocumentFactory.documentFromRecord(rec);
sendStringResponse(result.toString(), "text/xml", response);
}
- 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) {
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/SiteInfo.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/SiteInfo.java 2007-08-27 23:52:59 UTC (rev 275)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/SiteInfo.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -22,7 +22,7 @@
*
*/
public class SiteInfo {
-
+
// The base URL is the externally visible URL for the service. For example, http://YOUR_PUBLIC_DOMAIN.com/og/
private String baseUrl = null;
@@ -31,17 +31,25 @@
//True if the SimServlet handle allow non-local requests
private boolean simsAllowRemoteAccess = false;
-
+
// The media directory is where the MediaServlet will store your models, textures, scripts, and space documents
private File mediaDirectory = null;
-
- public SiteInfo(String baseUrl, String mediaUrl, boolean simsAllowRemoteAccess, File mediaDirectory) {
+
+ // The directory where mail will be written if we're not actually sending email via JNDI provided session
+ private File mailDirectory = null;
+
+ public SiteInfo(String baseUrl, String mediaUrl, boolean simsAllowRemoteAccess, File mediaDirectory, File mailDirectory) {
this.baseUrl = baseUrl;
this.mediaUrl = mediaUrl;
this.simsAllowRemoteAccess = simsAllowRemoteAccess;
this.mediaDirectory = mediaDirectory;
+ this.mailDirectory = mailDirectory;
}
+ public File getMailDirectory() {
+ return mailDirectory;
+ }
+
public String getBaseUrl() {
return baseUrl;
}
@@ -58,7 +66,7 @@
throw new IllegalStateException("Bad base url: " + getBaseUrl());
}
}
-
+
public boolean simsAllowRemoteAccess() {
return simsAllowRemoteAccess;
}
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/SpaceServlet.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/SpaceServlet.java 2007-08-27 23:52:59 UTC (rev 275)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/SpaceServlet.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -31,6 +31,8 @@
import com.ogoglio.media.MediaService;
import com.ogoglio.persist.AccountRecord;
import com.ogoglio.persist.PersistException;
+import com.ogoglio.persist.ServiceStateRecord;
+import com.ogoglio.persist.ServiceStateTasks;
import com.ogoglio.persist.SimPersistTasks;
import com.ogoglio.persist.SimRecord;
import com.ogoglio.persist.SpaceMemberPersistTasks;
@@ -39,6 +41,7 @@
import com.ogoglio.persist.SpaceRecord;
import com.ogoglio.xml.AccountDocument;
import com.ogoglio.xml.ServiceDocument;
+import com.ogoglio.xml.ServiceStateDocument;
import com.ogoglio.xml.SimDocument;
import com.ogoglio.xml.SpaceDocument;
import com.ogoglio.xml.SpaceMemberDocument;
@@ -69,7 +72,7 @@
if (messageProxy != null) {
messageProxy.cleanup();
}
- System.out.println("Destroy called on SpaceServlet. Cleaning up proxy....");
+ System.out.println("Destroy called on SpaceServlet. Cleaning up proxy....");
} catch (Throwable e) {
e.printStackTrace();
}
@@ -82,15 +85,16 @@
private class BaseSpaceResource extends AuthenticatedSiteResource {
public BaseSpaceResource() {
super("space", false, getSessionFactory());
+ addSubResource(new SimResource());
+ addSubResource(new StateResource());
addSubResource(new SpaceResource());
- addSubResource(new SimResource());
}
public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
ServiceDocument serviceDocument = new ServiceDocument(messageProxy.getUserCount(), messageProxy.getSimCount());
sendStringResponse(serviceDocument.toString(), "text/xml", response);
}
-
+
public void doPost(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
if (authedAccount == null || authedAccount.isFrozen()) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
@@ -117,6 +121,32 @@
}
}
+ private class StateResource extends AuthenticatedSiteResource {
+ public StateResource() {
+ super("state", false, getSessionFactory());
+ }
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, IOException {
+ ServiceStateRecord record = ServiceStateTasks.getOrCreateServiceState(getSessionFactory());
+ sendStringResponse(DocumentFactory.documentFromRecord(record).toElement().toString(), "text/xml", response);
+ }
+
+
+ public void doPost(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, IOException {
+ if(authedAccount == null || !AccountDocument.ACCOUNT_LEVEL_ADMIN.equals(authedAccount.getAccountlevel())) {
+ response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+ return;
+ }
+ ServiceStateDocument proposedDoc = new ServiceStateDocument(parseXML(request.getInputStream()));
+ ServiceStateRecord record = ServiceStateTasks.updateServiceState(proposedDoc, getSessionFactory());
+ if(record == null) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ return;
+ }
+ sendStringResponse(DocumentFactory.documentFromRecord(record).toElement().toString(), "text/xml", response);
+ }
+}
+
private class SpaceResource extends AuthenticatedSiteResource {
public SpaceResource() {
super(SiteResource.LONG_ELEMENT, false, getSessionFactory());
@@ -152,7 +182,6 @@
}
public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, IOException {
- System.out.println("***WE ARE FART:"+(pathElements.length-1));
long spaceID = Long.parseLong(pathElements[pathElements.length - 1]);
SpaceRecord spaceRecord = SpacePersistTasks.findSpaceBySpaceID(spaceID, getSessionFactory());
if (spaceRecord == null) {
@@ -217,7 +246,7 @@
return;
}
}
-
+
// delete the space from database
SpacePersistTasks.deleteSpace(spaceRecord, getSessionFactory());
@@ -435,7 +464,6 @@
private void doProxy(HttpServletRequest request, String method, HttpServletResponse response, String[] pathElements) throws IOException {
try {
- System.out.println("***FART1");
AccountRecord authedAccount = AuthServlet.getAuthedAccountRecord(request, getSessionFactory());
if (authedAccount == null) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
@@ -453,7 +481,6 @@
return;
}
- System.out.println("***FART2");
SimRecord simRecord = SpacePersistTasks.findOrAssignSim(spaceRecord, getSessionFactory());
if (simRecord == null) {
System.err.println("Could not assign a sim to space " + spaceRecord.getSpaceID());
@@ -462,21 +489,13 @@
}
String proxyURI = simRecord.getSimURI().toString();
- System.out.println("***FART3:"+proxyURI);
for (int i = 0; i < pathElements.length; i++) {
proxyURI += pathElements[i] + "/";
}
- System.out.print("***FART4:");
- for (int i=0; i< pathElements.length;++i) {
- System.out.print(pathElements[i]+"/");
- }
- System.out.println("");
proxy(new URI(proxyURI), method, request, response);
- System.out.println("***FART5");
} catch (PersistException e) {
- System.out.println("***FART6");
e.printStackTrace();
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return;
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/xml/server/DocumentFactory.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/xml/server/DocumentFactory.java 2007-08-27 23:52:59 UTC (rev 275)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/xml/server/DocumentFactory.java 2007-08-27 23:53:13 UTC (rev 276)
@@ -6,6 +6,7 @@
import com.ogoglio.persist.BodyRecord;
import com.ogoglio.persist.PossessionRecord;
+import com.ogoglio.persist.ServiceStateRecord;
import com.ogoglio.persist.SimRecord;
import com.ogoglio.persist.SpaceMemberRecord;
import com.ogoglio.persist.SpaceRecord;
@@ -13,6 +14,7 @@
import com.ogoglio.persist.TemplateSupportFileRecord;
import com.ogoglio.xml.BodyDocument;
import com.ogoglio.xml.PossessionDocument;
+import com.ogoglio.xml.ServiceStateDocument;
import com.ogoglio.xml.SimDocument;
import com.ogoglio.xml.SpaceDocument;
import com.ogoglio.xml.SpaceMemberDocument;
@@ -20,48 +22,57 @@
import com.ogoglio.xml.TemplateSupportFileDocument;
public class DocumentFactory {
- public static BodyDocument documentFromRecord(BodyRecord record) {
+ public static BodyDocument documentFromRecord(BodyRecord record) {
return new BodyDocument(record.getBodyID(), record.getOwnerUsername(), record.getDisplayName(), record.getHairIndex(), record.getEyesIndex(), record.getNoseIndex(), record.getMouthIndex(), record.getFaceIndex());
- }
- public static PossessionDocument documentFromRecord(PossessionRecord record) {
- return new PossessionDocument(record.getPossessionID(), record.getOwnerUsername(), record.getTemplateID(), record.getSpaceID(), record.getThingID());
- }
- public static SimDocument documentFromRecord(SimRecord record) {
- return new SimDocument(record.getSimID(), record.getSimURI(), record.getDisplayName(), record.isActive());
- }
-
- public static SpaceDocument documentFromRecord(SpaceRecord requestedRecord) {
- return new SpaceDocument (requestedRecor...
[truncated message content] |