|
From: <ian...@us...> - 2007-08-28 22:50:17
|
Revision: 282
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=282&view=rev
Author: iansmith
Date: 2007-08-28 15:50:10 -0700 (Tue, 28 Aug 2007)
Log Message:
-----------
First cut at moving app independent code out of ogoglio server.
Added Paths:
-----------
maven/trunk/ogoglio-appdev/.classpath
maven/trunk/ogoglio-appdev/.project
maven/trunk/ogoglio-appdev/.settings/
maven/trunk/ogoglio-appdev/.settings/org.eclipse.jdt.core.prefs
maven/trunk/ogoglio-appdev/pom.xml
maven/trunk/ogoglio-appdev/src/
maven/trunk/ogoglio-appdev/src/main/
maven/trunk/ogoglio-appdev/src/main/java/
maven/trunk/ogoglio-appdev/src/main/java/com/
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/DBVersionPersistTasks.java
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/DBVersionRecord.java
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/Migration.java
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/MigrationSupport.java
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/test/
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/test/DBZapTest.java
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/persist/
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/persist/HibernateTask.java
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/persist/PersistException.java
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/AbstractRemoteServlet.java
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/AbstractResourceServlet.java
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/DescendingSiteResource.java
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/MigratedResourceServlet.java
maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/SiteResource.java
maven/trunk/ogoglio-appdev/src/main/resources/
maven/trunk/ogoglio-appdev/src/test/
maven/trunk/ogoglio-appdev/src/test/java/
maven/trunk/ogoglio-appdev/src/test/resources/
Property Changed:
----------------
maven/trunk/ogoglio-appdev/
Property changes on: maven/trunk/ogoglio-appdev
___________________________________________________________________
Name: svn:ignore
+ target
Added: maven/trunk/ogoglio-appdev/.classpath
===================================================================
--- maven/trunk/ogoglio-appdev/.classpath (rev 0)
+++ maven/trunk/ogoglio-appdev/.classpath 2007-08-28 22:50:10 UTC (rev 282)
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/test/java"/>
+ <classpathentry excluding="**" kind="src" output="src/main/resources" path="src/main/resources"/>
+ <classpathentry excluding="**" kind="src" output="src/test/resources" path="src/test/resources"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
Added: maven/trunk/ogoglio-appdev/.project
===================================================================
--- maven/trunk/ogoglio-appdev/.project (rev 0)
+++ maven/trunk/ogoglio-appdev/.project 2007-08-28 22:50:10 UTC (rev 282)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>ogoglio-appdev</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.maven.ide.eclipse.maven2Builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.maven.ide.eclipse.maven2Nature</nature>
+ </natures>
+</projectDescription>
Added: maven/trunk/ogoglio-appdev/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- maven/trunk/ogoglio-appdev/.settings/org.eclipse.jdt.core.prefs (rev 0)
+++ maven/trunk/ogoglio-appdev/.settings/org.eclipse.jdt.core.prefs 2007-08-28 22:50:10 UTC (rev 282)
@@ -0,0 +1,12 @@
+#Tue Aug 28 08:20:12 PDT 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.4
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
+org.eclipse.jdt.core.compiler.source=1.3
Added: maven/trunk/ogoglio-appdev/pom.xml
===================================================================
--- maven/trunk/ogoglio-appdev/pom.xml (rev 0)
+++ maven/trunk/ogoglio-appdev/pom.xml 2007-08-28 22:50:10 UTC (rev 282)
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.ogoglio</groupId>
+ <artifactId>ogoglio-appdev</artifactId>
+ <version>0.0.1</version>
+ <packaging>jar</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate</artifactId>
+ <version>3.2.1.ga</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ <version>2.3</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-fileupload</groupId>
+ <artifactId>commons-fileupload</artifactId>
+ <version>1.2</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.3</version>
+ </dependency>
+
+ <!-- -->
+ <!-- OGOGLIO DEPENDENCIES-->
+ <!-- -->
+ <dependency>
+ <groupId>com.ogoglio</groupId>
+ <artifactId>ogoglio-common</artifactId>
+ <version>0.0.1</version>
+ </dependency>
+ </dependencies>
+</project>
+
Added: maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/DBVersionPersistTasks.java
===================================================================
--- maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/DBVersionPersistTasks.java (rev 0)
+++ maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/DBVersionPersistTasks.java 2007-08-28 22:50:10 UTC (rev 282)
@@ -0,0 +1,49 @@
+package com.ogoglio.appdev.migrate;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+
+import com.ogoglio.appdev.persist.HibernateTask;
+import com.ogoglio.appdev.persist.PersistException;
+
+public class DBVersionPersistTasks {
+ public final static String FIND_VERSION = "com.ogoglio.appdev.migrate.dbversions";
+
+ public static int findVersion(SessionFactory sessionFactory) throws PersistException {
+ HibernateTask task = new HibernateTask() {
+ public Object run(Session session) throws PersistException {
+ Query query = session.getNamedQuery(FIND_VERSION);
+ return query.uniqueResult();
+ }
+ };
+ task.setSessionFactory(sessionFactory);
+ return ((DBVersionRecord) task.execute()).getVersion();
+ }
+
+ public static boolean updateVersion(final int newVersion, final int expectedSize/* one or zero */, SessionFactory sessionFactory) throws PersistException {
+ HibernateTask task = new HibernateTask() {
+ public Object run(Session session) throws PersistException {
+ Query query = session.getNamedQuery(FIND_VERSION);
+ int size = query.list().size();
+ DBVersionRecord rec;
+ if (expectedSize != size) {
+ System.out.println("Whoa! Size of returned result for db version record was (" + size + ") but should have been " + expectedSize + "!");
+ return Boolean.FALSE;
+ }
+ if (size == 0) {
+ rec = new DBVersionRecord();
+ } else {
+ rec = (DBVersionRecord) query.uniqueResult();
+ }
+ rec.setVersion(newVersion);
+ session.saveOrUpdate(rec);
+ System.out.println("******* Wrote new version FART:" + newVersion);
+ return Boolean.TRUE;
+ }
+ };
+ task.setSessionFactory(sessionFactory);
+ return (task.execute().equals(Boolean.TRUE));
+ }
+
+}
Added: maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/DBVersionRecord.java
===================================================================
--- maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/DBVersionRecord.java (rev 0)
+++ maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/DBVersionRecord.java 2007-08-28 22:50:10 UTC (rev 282)
@@ -0,0 +1,28 @@
+package com.ogoglio.appdev.migrate;
+
+public class DBVersionRecord {
+ public static int INTERNAL_DEV_STATE = -8288;
+
+ private int version = 0;
+
+ private long id;
+
+ public DBVersionRecord() {
+ }
+
+ public long getVersionId() {
+ return id;
+ }
+
+ public void setVersionId(long id) {
+ this.id = id;
+ }
+
+ public int getVersion() {
+ return version;
+ }
+
+ public void setVersion(int version) {
+ this.version = version;
+ }
+}
Added: maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/Migration.java
===================================================================
--- maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/Migration.java (rev 0)
+++ maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/Migration.java 2007-08-28 22:50:10 UTC (rev 282)
@@ -0,0 +1,14 @@
+package com.ogoglio.appdev.migrate;
+
+import java.util.Properties;
+
+import javax.naming.Context;
+import javax.servlet.ServletConfig;
+
+import org.hibernate.SessionFactory;
+
+public interface Migration {
+
+ public boolean migrate(SessionFactory sessionFactory, ServletConfig servletConfig, Context ctx, Properties testConfig, int from, int to);
+
+}
Added: maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/MigrationSupport.java
===================================================================
--- maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/MigrationSupport.java (rev 0)
+++ maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/MigrationSupport.java 2007-08-28 22:50:10 UTC (rev 282)
@@ -0,0 +1,170 @@
+package com.ogoglio.appdev.migrate;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.servlet.ServletConfig;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.Configuration;
+
+import com.ogoglio.appdev.persist.PersistException;
+import com.ogoglio.viewer.render.UIConstants;
+
+public abstract class MigrationSupport {
+
+ //check on migration okayness
+ public static final String MIGRATION_KEY = "ogoglio/okToMigrateDB";
+
+ public MigrationSupport() {
+ }
+
+ public abstract int versionNumber();
+ public abstract Migration[] migrationList();
+
+ public boolean verifyVersion(ServletConfig servletConf, Context ctx) {
+ try {
+ SessionFactory sessionFactory = getCurrentConfiguration().buildSessionFactory();
+ int version = DBVersionPersistTasks.findVersion(sessionFactory);
+ if (version != versionNumber()) {
+ System.err.println("DB Version Mismatch! Expected (" + versionNumber() + ") but got " + version + "!");
+ sessionFactory.close();
+ return tryUpgrade(servletConf, ctx, version, versionNumber(), "update", true);
+ }
+ sessionFactory.close();
+ return true; // we are at the expected version
+ } catch (PersistException e) {
+ if (e.innerThrowable == null) {
+ System.out.println("Serious problem with hibernate:" + e.getMessage());
+ return false;
+ }
+ System.err.println("Unable to figure out DB version number. Likely this is a fresh database....(" + e.innerThrowable.getClass().getName() + ")");
+ return initialize_version(servletConf, ctx, true);
+ }
+ }
+
+ public boolean initialize_version(ServletConfig conf, Context ctx, boolean useJNDI) {
+ Configuration configuration = createConfigurationForHibernate(0, "create", useJNDI);
+ try {
+ SessionFactory factory = configuration.buildSessionFactory();
+ if (setVersionNumberOfDbViaQuery(factory, 0, 0) == false) {
+ factory.close();
+ return false;
+ }
+ factory.close();
+ return tryUpgrade(conf, ctx, 0, versionNumber(), "create", useJNDI);
+ } catch (Throwable e) {
+ System.err.println("Error trying initialized DB:" + e.getMessage());
+ return false;
+ }
+
+ }
+
+ public Configuration getCurrentConfiguration() {
+ return createConfigurationForHibernate(versionNumber(), null, true);
+ }
+
+ public Configuration createConfigurationForHibernate(int num, String autoSetting, boolean useJNDI) {
+ Configuration configuration = new Configuration();
+ if (autoSetting != null) {
+ configuration.setProperty("hibernate.hbm2ddl.auto", autoSetting);
+ }
+ if (useJNDI) {
+ configuration.setProperty("hibernate.connection.datasource", "java:comp/env/jdbc/space");
+ } else {
+ Properties p = new Properties();
+ try {
+ p.load(getClass().getResourceAsStream("/test-config.properties"));
+ configuration.addProperties(p);
+ } catch (IOException e) {
+ System.err.println("Unable to find the test configuration file!" + e.getMessage());
+ return configuration.configure();
+ }
+ }
+ configuration.addInputStream(UIConstants.getResource("com/ogoglio/migrate/migration-" + num + ".xml"));
+ return configuration.configure();
+ }
+
+ private boolean setVersionNumberOfDbViaQuery(SessionFactory sessionFactory, int targetVersion, int expectedSize) {
+ try {
+ return DBVersionPersistTasks.updateVersion(targetVersion, expectedSize, sessionFactory);
+ } catch (PersistException e) {
+ System.err.println("Problem updating the version of the database to version " + targetVersion + ":" + e.getMessage());
+ return false;
+ }
+ }
+
+ public boolean tryUpgrade(ServletConfig servletConfig, Context ctx, int db_is, int db_wants_to_be, String ddlMode, boolean useJNDI) {
+ if (migrationList().length != versionNumber()) {
+ System.out.println("Internal error! Migration list length should be " + versionNumber() + " but is " + migrationList().length + "!");
+ return false;
+ }
+ Properties testConfig = new Properties();
+ boolean canMigrate = false;
+ if (ctx == null) {
+ //in test mode
+ testConfig = getTestConfig();
+ if ("true".equals(testConfig.getProperty("ogoglio.okToMigrateDB"))) {
+ canMigrate = true;
+ }
+ } else {
+ //not testing, but might be integration testing
+ try {
+ String migrate = (String) ctx.lookup(MIGRATION_KEY);
+ if ("true".equals(migrate)) {
+ canMigrate = true;
+ }
+ } catch (NamingException e) {
+ System.err.println("Naming exception trying to access " + MIGRATION_KEY + " from naming context!");
+ }
+ }
+
+ if (!canMigrate) {
+ System.err.println("Cannot migrate data! Property ogoglio.okToMigrateDB is false or non-existent!");
+ return false;
+ }
+
+ for (int i = db_is; i < db_wants_to_be; ++i) {
+ Migration current = migrationList()[i];
+ System.out.println("------------------------------------------------\n");
+ System.out.println("DB: Attempting migration from " + i + " to " + (i + 1) + "...");
+
+ //try to get hibernate to do the work
+ Configuration config = createConfigurationForHibernate(i + 1, ddlMode, useJNDI);
+ SessionFactory factory = config.buildSessionFactory();
+
+ //subtle: if the ddlMode is create, hibernate blows away all the data (including our version number record)
+ int expectedRecords = 1;
+ if ("create".equals(ddlMode)) {
+ expectedRecords = 0;
+ }
+ setVersionNumberOfDbViaQuery(factory, i + 1, expectedRecords);
+
+ if (!current.migrate(factory, servletConfig, ctx, testConfig, i, i + 1)) {
+ factory.close();
+ return false;
+ }
+ factory.close();
+ System.out.println("------------------------------------------------\n");
+ }
+ return true;
+ }
+
+ public Properties getTestConfig() {
+ Properties testConfig = new Properties();
+ InputStream is = getClass().getResourceAsStream("/test-config.properties");
+ if (is == null) {
+ System.err.println("Warning! Unable to find test-config.properties! Probably something is broken!");
+ } else {
+ try {
+ testConfig.load(is);
+ } catch (IOException e) {
+ System.err.println("Warning! Error reading test-config.properties! " + e.getMessage());
+ }
+ }
+ return testConfig;
+ }
+}
Added: maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/test/DBZapTest.java
===================================================================
--- maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/test/DBZapTest.java (rev 0)
+++ maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/migrate/test/DBZapTest.java 2007-08-28 22:50:10 UTC (rev 282)
@@ -0,0 +1,40 @@
+package com.ogoglio.appdev.migrate.test;
+
+import junit.framework.TestCase;
+
+import org.hibernate.SessionFactory;
+
+import com.ogoglio.appdev.migrate.MigrationSupport;
+
+public abstract class DBZapTest extends TestCase {
+
+ protected SessionFactory sessionFactory;
+
+ public abstract MigrationSupport getMigrationSupport();
+
+ public void setUp() {
+ try {
+ MigrationSupport support = getMigrationSupport();
+ if (!("true".equals(support.getTestConfig().getProperty("ogoglio.okToZapDB")))) {
+ fail("Whoa! Shouldn't be running tests without setting the ogoglio.okToZapDB property!");
+ }
+ if (support.initialize_version(null, null, false) == false) {
+ fail("can't get DB set up: trying to initialize it in the test code");
+ }
+
+ //if we are here, db stuff worked, but we still need to avoid all the jndi stuff
+ sessionFactory = support.createConfigurationForHibernate(getMigrationSupport().versionNumber(), null, false).buildSessionFactory();
+ } catch (Exception e) {
+ System.out.println("-------");
+ e.printStackTrace(System.out);
+ System.out.println("---------");
+ fail("Could not setup:" + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ if (sessionFactory != null) {
+ sessionFactory.close();
+ }
+ }
+}
Added: maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/persist/HibernateTask.java
===================================================================
--- maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/persist/HibernateTask.java (rev 0)
+++ maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/persist/HibernateTask.java 2007-08-28 22:50:10 UTC (rev 282)
@@ -0,0 +1,85 @@
+
+/* Copyright 2007 Transmutable (http://transmutable.com/)
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. */
+package com.ogoglio.appdev.persist;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.StaleObjectStateException;
+import org.hibernate.Transaction;
+
+
+public abstract class HibernateTask {
+
+ private SessionFactory sessionFactory = null;
+
+ public HibernateTask() {
+ }
+
+ public void setSessionFactory(SessionFactory sessionFactory) {
+ this.sessionFactory = sessionFactory;
+ }
+
+ public abstract Object run(Session hibernateSession) throws PersistException;
+
+ public Object execute() throws PersistException {
+ Session hibernateSession = sessionFactory.openSession();
+ Transaction transaction = hibernateSession.beginTransaction();
+ try {
+ Object result = run(hibernateSession);
+ transaction.commit();
+ return result;
+ } catch (StaleObjectStateException staleEx) {
+ System.err.println("This interceptor does not implement optimistic concurrency control!");
+ System.err.println("Your application will not work until you add compensation actions!");
+ throw new PersistException("This DB is not supported.");
+ } catch (PersistException ex) {
+ try {
+ if (transaction.isActive()) {
+ transaction.rollback();
+ }
+ } catch (Throwable rbEx) {
+ }
+ throw ex;
+ } catch (Throwable ex) { //catches things that are created by Hibernate that are not PersistException
+ System.err.println("TRUE TYPE OF CAUGHT EXCEPTION:"+ex.getClass().getName());
+ System.err.println("ORIG STACK TRACE");
+ ex.printStackTrace();
+ try {
+ if (transaction.isActive()) {
+ transaction.rollback();
+ }
+ } catch (Throwable rbEx) {
+ }
+ // XXX This is really dodgy. This changes the type of the error from it's
+ // XXX true type (for example LazyInitializationException) to the PersistException
+ // XXX which I can only assume is to make the throws clauses easier. Ugh.
+ throw new PersistException(ex,"Hibernate error: " + ex);
+ } finally {
+ hibernateSession.close();
+ }
+ }
+
+ public static boolean equals(Object obj1, Object obj2) {
+ if (obj1 == obj2) {
+ return true;
+ }
+ if (obj1 != null) {
+ return obj1.equals(obj2);
+ } else {
+ return obj2.equals(obj1);
+ }
+
+ }
+}
\ No newline at end of file
Added: maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/persist/PersistException.java
===================================================================
--- maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/persist/PersistException.java (rev 0)
+++ maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/persist/PersistException.java 2007-08-28 22:50:10 UTC (rev 282)
@@ -0,0 +1,18 @@
+package com.ogoglio.appdev.persist;
+
+public class PersistException extends Exception {
+
+ public Throwable innerThrowable;
+
+ public PersistException() {
+ }
+
+ public PersistException(Throwable throwable, String string) {
+ super(string);
+ this.innerThrowable=throwable;
+ }
+
+ public PersistException(String string) {
+ this(null,string);
+ }
+}
Added: maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/AbstractRemoteServlet.java
===================================================================
--- maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/AbstractRemoteServlet.java (rev 0)
+++ maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/AbstractRemoteServlet.java 2007-08-28 22:50:10 UTC (rev 282)
@@ -0,0 +1,85 @@
+package com.ogoglio.appdev.servlet;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import javax.naming.Context;
+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.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 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(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 = getRequestAuthCookie(request);
+ if (authCookie == null) {
+ return null;
+ }
+ return getOgoglioClient().getAuthDocumentByAuthCookie(authCookie);
+ }
+
+ public WebAPIClient getOgoglioClient() {
+ return ogoglioClient;
+ }
+
+ public String getOgoglioUsername() {
+ return ogoglioUsername;
+ }
+}
Added: maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/AbstractResourceServlet.java
===================================================================
--- maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/AbstractResourceServlet.java (rev 0)
+++ maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/AbstractResourceServlet.java 2007-08-28 22:50:10 UTC (rev 282)
@@ -0,0 +1,287 @@
+/* Copyright 2007 Transmutable (http://transmutable.com/)
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License. */
+package com.ogoglio.appdev.servlet;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileItemFactory;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+
+import com.ogoglio.util.StreamUtils;
+import com.ogoglio.util.WebConstants;
+import com.ogoglio.xml.SpaceDocument;
+
+public abstract class AbstractResourceServlet extends HttpServlet {
+
+ public static final String OGOGLIO_BASE_URL_KEY = "ogoglio/baseURL";
+
+ private static final String METHOD_PARAM = "method";
+
+ private SiteResource baseResource = null;
+
+ private boolean noCache = true;
+
+
+ // WARNING: This is really, really easy to hose yourself with. This will get called
+ // WARNING: during the init() of this class, so it is very easy to end up calling this
+ // WARNING: init method "too soon" in your init method, before you are fully initialized
+ public abstract SiteResource createBaseResource(ServletConfig servletConfig);
+
+ protected Context initCtx=null;
+ protected String baseUrl=null;
+
+ private void initContext() throws NamingException {
+ if (initCtx==null) {
+ initCtx = new InitialContext();
+ }
+ }
+ public void initBaseUrl() throws NamingException {
+ if (baseUrl==null) {
+ initContext();
+ Context envCtx = (Context) initCtx.lookup("java:comp/env");
+ baseUrl = (String) envCtx.lookup(OGOGLIO_BASE_URL_KEY);
+ }
+ }
+ public void init(ServletConfig config) throws ServletException {
+ try {
+ initBaseUrl();
+ } catch (NamingException e) {
+ throw new ServletException("Could not init in AbstractResourceServlet: " + e);
+ }
+
+ super.init(config);
+
+ baseResource = createBaseResource(config);
+
+ if (baseResource==null) {
+ System.out.println("Warning: Class "+getClass().getName()+" should be sure it eventually sets the value of the base resource on it's servlet.");
+ } else {
+ if (!(baseResource.getPathElement() instanceof String)) {
+ throw new IllegalStateException("The base resource must have a String path element: " + baseResource.getPathElement());
+ }
+ }
+ }
+
+ public String getBaseUrl() {
+ return baseUrl;
+ }
+
+ public void destroy() {
+ super.destroy();
+ }
+
+ public static void setNoCache(HttpServletResponse response) {
+ //IE caches XMLHttpRequest responses, so we set explicit no-cache headers
+ response.addHeader("Cache-Control", "must-revalidate");
+ response.addHeader("Cache-Control", "no-cache");
+ response.addHeader("Cache-Control", "no-store");
+ response.setDateHeader("Expires", 0);
+ }
+ public static String getRequestAuthCookie(HttpServletRequest request) {
+ Cookie[] cookies = request.getCookies();
+ for (int i = 0; cookies != null && i < cookies.length; i++) {
+ if (WebConstants.AUTH_COOKIE.equals(cookies[i].getName())) {
+ return cookies[i].getValue();
+ }
+ }
+ return null;
+ }
+
+
+ public static void setCachable(HttpServletResponse response) {
+ response.setHeader("Cache-Control", "public");
+ response.setDateHeader("Expires", System.currentTimeMillis() + 10000000);
+ }
+
+ public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ if (noCache) {
+ setNoCache(response);
+ }
+
+ URI requestURI = getRequestURI(request);
+
+ String[] pathElements = getPathElements((String) baseResource.getPathElement(), requestURI);
+
+ SiteResource requestedResource = getSiteResource(pathElements, baseResource);
+
+ if (requestedResource == null) {
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+
+ if (request.getMethod().equals("GET")) {
+ if ("DELETE".equals(request.getParameter(METHOD_PARAM))) { //A workaround for WebKit
+ requestedResource.doDelete(request, response, pathElements);
+ } else {
+ requestedResource.doGet(request, response, pathElements);
+ }
+ return;
+ } else if (request.getMethod().equals("POST")) {
+ requestedResource.doPost(request, response, pathElements);
+ return;
+ } else if (request.getMethod().equals("DELETE")) {
+ requestedResource.doDelete(request, response, pathElements);
+ return;
+ } else if (request.getMethod().equals("PUT")) {
+ requestedResource.doPut(request, response, pathElements);
+ return;
+ } else if (request.getMethod().equals("HEAD")) {
+ requestedResource.doHead(request, response, pathElements);
+ return;
+ } else {
+ response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ return;
+ }
+
+ }
+
+ private SiteResource getSiteResource(String[] pathElements, SiteResource rootResource) {
+
+ SiteResource currentPick = rootResource;
+ for (int i = 0; i < pathElements.length && currentPick != null; i++) {
+ if (i == pathElements.length - 1) {
+ return currentPick;
+ }
+ currentPick = currentPick.getSubResource(pathElements[i + 1]);
+ }
+ return null;
+ }
+
+ private static URI getRequestURI(HttpServletRequest request) {
+ try {
+ return new URI(request.getRequestURL().toString());
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ throw new IllegalStateException("Bad request URI?!? " + request.getRequestURI());
+ }
+ }
+
+ private static String[] getPathElements(String baseElement, URI uri) {
+ String[] pathElements = uri.getPath().split("/");
+ String[] pathFromSpace = null;
+ for (int i = 0; i < pathElements.length; i++) {
+ if (baseElement.equals(pathElements[i])) {
+ pathFromSpace = new String[pathElements.length - i];
+ for (int j = 0; j < pathFromSpace.length; j++) {
+ pathFromSpace[j] = pathElements[j + i];
+ }
+ return pathFromSpace;
+ }
+ }
+ return null;
+ }
+
+ public static void proxy(URI uri, String method, HttpServletRequest request, HttpServletResponse response) throws IOException {
+ HttpURLConnection connection = (HttpURLConnection) uri.toURL().openConnection();
+ connection.setRequestMethod(method);
+ connection.setAllowUserInteraction(false);
+ Enumeration headerNames = request.getHeaderNames();
+ while (headerNames.hasMoreElements()) {
+ String headerName = (String) headerNames.nextElement();
+ connection.setRequestProperty(headerName, request.getHeader(headerName));
+ }
+
+ if ("POST".equals(method)) {
+ connection.setDoOutput(true);
+ InputStream requestInput = request.getInputStream();
+ OutputStream outputStream = connection.getOutputStream();
+ StreamUtils.write(requestInput, outputStream, -1);
+ outputStream.flush();
+ outputStream.close();
+ }
+
+ response.setStatus(connection.getResponseCode());
+
+ Map headers = connection.getHeaderFields();
+ String[] headerFields = (String[]) headers.keySet().toArray(new String[0]);
+ for (int i = 0; i < headerFields.length; i++) {
+ if (headerFields[i] == null) {
+ continue;
+ }
+ String[] values = (String[]) ((Collection) headers.get(headerFields[i])).toArray(new String[0]); //It's lines like this that make me hate Java
+ for (int j = 0; j < values.length; j++) {
+ if (values[j] != null) {
+ response.setHeader(headerFields[i], values[j]);
+ }
+ }
+ }
+
+ if (connection.getResponseCode() == 200) {
+ InputStream input = connection.getInputStream();
+ StreamUtils.write(input, response.getOutputStream(), -1);
+ }
+ }
+
+ public static String getFirstStringValue(HttpServletRequest request) throws IOException {
+ if (request.getContentType() != null && (request.getContentType().startsWith("application/x-www-form-urlencoded") || request.getContentType().startsWith("multipart/form-data"))) {
+ Enumeration enumeration = request.getParameterNames();
+ while (enumeration.hasMoreElements()) {
+ String element = (String) enumeration.nextElement();
+ if (element != null && !"null".equals(element)) { // *sigh*
+ String newValue = request.getParameter(element);
+ if (newValue != null) {
+ return newValue;
+ }
+ }
+ }
+ return null;
+ } else {
+ return StreamUtils.readInput(request.getInputStream(), SpaceDocument.MAX_SETTING_VALUE_SIZE);
+ }
+ }
+
+ public static InputStream getFirstFile(HttpServletRequest request, long maxSize) throws IOException {
+ FileItemFactory factory = new DiskFileItemFactory();
+ ServletFileUpload upload = new ServletFileUpload(factory);
+ upload.setSizeMax(maxSize);
+ try {
+ Iterator iter = upload.parseRequest(request).iterator();
+ while (iter.hasNext()) {
+ FileItem item = (FileItem) iter.next();
+
+ if (item.isFormField()) {
+ //ignore it.
+ } else {
+ return item.getInputStream();
+ }
+ }
+ } catch (FileUploadException e) {
+ e.printStackTrace();
+ throw new IOException(e.getMessage());
+ }
+ return null;
+ }
+}
Added: maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/DescendingSiteResource.java
===================================================================
--- maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/DescendingSiteResource.java (rev 0)
+++ maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/DescendingSiteResource.java 2007-08-28 22:50:10 UTC (rev 282)
@@ -0,0 +1,68 @@
+/* Copyright 2007 Transmutable (http://transmutable.com/)
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License. */
+package com.ogoglio.appdev.servlet;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * This resource claims an entire URL space, starting with it's path element
+ * All requests get fed back to the object extending DescendingSiteResourch
+ */
+
+public abstract class DescendingSiteResource extends SiteResource {
+
+ InfiteSiteResource infiniteResource = new InfiteSiteResource();
+
+ public DescendingSiteResource(Object pathElement) {
+ super(pathElement);
+ }
+
+ public SiteResource getSubResource(String pathElement) {
+ return infiniteResource;
+ }
+
+ private class InfiteSiteResource extends SiteResource {
+ public InfiteSiteResource() {
+ super(SiteResource.WILDCARD_ELEMENT);
+ }
+
+ public SiteResource getSubResource(String pathElement) {
+ return infiniteResource;
+ }
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
+ DescendingSiteResource.this.doGet(request, response, pathElements);
+ }
+
+ public void doPost(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
+ DescendingSiteResource.this.doPost(request, response, pathElements);
+ }
+
+ public void doPut(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
+ DescendingSiteResource.this.doPut(request, response, pathElements);
+ }
+
+ public void doDelete(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
+ DescendingSiteResource.this.doDelete(request, response, pathElements);
+ }
+
+ public void doHead(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
+ DescendingSiteResource.this.doHead(request, response, pathElements);
+ }
+}
+}
Added: maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/MigratedResourceServlet.java
===================================================================
--- maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/MigratedResourceServlet.java (rev 0)
+++ maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/MigratedResourceServlet.java 2007-08-28 22:50:10 UTC (rev 282)
@@ -0,0 +1,61 @@
+package com.ogoglio.appdev.servlet;
+
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+
+import org.hibernate.SessionFactory;
+
+import com.ogoglio.appdev.migrate.MigrationSupport;
+
+public abstract class MigratedResourceServlet extends AbstractResourceServlet {
+
+ private static final String HIBERNATE_SESSION_FACTORY_KEY = "com.ogoglio.hibernateSessionFactory";
+ private SessionFactory hibernateSessionFactory = null;
+ public abstract MigrationSupport getMigration();
+
+ public void init(ServletConfig config) throws ServletException {
+ try {
+ initBaseUrl();
+ Context envCtx = (Context) initCtx.lookup("java:comp/env");
+ hibernateSessionFactory = getOrCreateHibernateSessionFactory(config,envCtx);
+ System.out.println("FART****:"+getClass().getName()+","+(hibernateSessionFactory==null));
+ if (hibernateSessionFactory==null) {
+ throw new IllegalStateException("Unable to create sensible hibernate configuration!");
+ }
+
+ //CALL THIS LAST
+ super.init(config);
+ } catch (NamingException e) {
+ throw new ServletException("Unable to initialize Migrated resource servlet:"+e.getMessage());
+ }
+ }
+ public void destroy() {
+ super.destroy();
+ try {
+ hibernateSessionFactory.close();
+ } catch (Throwable e) {
+ }
+ super.destroy();
+ }
+ public SessionFactory getSessionFactory() {
+ return hibernateSessionFactory;
+ }
+
+ private 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...");
+ MigrationSupport ms= getMigration();
+ if (!ms.verifyVersion(config,context)) {
+ throw new IllegalStateException("Cannot find a DB configuration for hibernate!");
+ }
+ sessionFactory= ms.getCurrentConfiguration().configure().buildSessionFactory();
+ config.getServletContext().setAttribute(HIBERNATE_SESSION_FACTORY_KEY, sessionFactory);
+ }
+ return sessionFactory;
+ }
+
+
+}
Added: maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/SiteResource.java
===================================================================
--- maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/SiteResource.java (rev 0)
+++ maven/trunk/ogoglio-appdev/src/main/java/com/ogoglio/appdev/servlet/SiteResource.java 2007-08-28 22:50:10 UTC (rev 282)
@@ -0,0 +1,140 @@
+/* Copyright 2007 Transmutable (http://transmutable.com/)
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License. */
+package com.ogoglio.appdev.servlet;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.util.Vector;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import nanoxml.XMLElement;
+
+public abstract class SiteResource {
+
+ public static final Long LONG_ELEMENT = new Long(-1);
+
+ public static final Long WILDCARD_ELEMENT = new Long(-100);
+
+ private Object pathElement = null;
+
+ private Vector subResources = new Vector();
+
+ /**
+ * @param pathElement A single path element string (e.g. "space"), LONG_ELEMENT, or WILDCARD_ELEMENT
+ */
+ public SiteResource(Object pathElement) {
+ if(!(pathElement instanceof String) && pathElement != LONG_ELEMENT && pathElement != WILDCARD_ELEMENT) {
+ throw new IllegalArgumentException("Bad path element: " + pathElement);
+ }
+ this.pathElement = pathElement;
+ }
+
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
+ response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ return;
+ }
+
+ public void doPost(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
+ response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ return;
+ }
+
+ public void doPut(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
+ response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ return;
+ }
+
+ public void doDelete(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
+ response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ return;
+ }
+
+ public void doHead(HttpServletRequest request, HttpServletResponse response, String[] pathElements) throws ServletException, IOException {
+ response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ return;
+ }
+
+ public Object getPathElement() {
+ return pathElement;
+ }
+
+ public boolean matches(String pathElement) {
+ if (this.pathElement == WILDCARD_ELEMENT) {
+ return true;
+ } else if (this.pathElement instanceof String) {
+ return this.pathElement.equals(pathElement);
+ } else if (this.pathElement == LONG_ELEMENT) {
+ try {
+ Long.parseLong(pathElement);
+ return true;
+ } catch (NumberFormatException e) {
+ return false;
+ }
+ }
+ throw new IllegalStateException("Path element must be String, LONG_ELEMENT, or WILDCARD_ELEMENT: " + this.pathElement);
+ }
+
+ public void addSubResource(SiteResource subResource) {
+ subResources.add(subResource);
+ }
+
+ public SiteResource getSubResource(String path) {
+ SiteResource[] subs = getSubResources();
+ for (int i = 0; i < subs.length; i++) {
+ if (subs[i].matches(path)) {
+ return subs[i];
+ }
+ }
+ return null;
+ }
+
+ private SiteResource[] getSubResources() {
+ return (SiteResource[]) subResources.toArray(new SiteResource[0]);
+ }
+
+ public static long parseLong(String input) {
+ try {
+ return Long.parseLong(input);
+ } catch (NumberFormatException e) {
+ throw new IllegalArgumentException("Bad long parser input: " + input);
+ }
+ }
+
+ public void sendStringResponse(String message, String mimeType, HttpServletResponse response) throws IOException {
+ response.setContentType(mimeType);
+ byte[] result = message.getBytes();
+ response.setContentLength(result.length);
+ response.getOutputStream().write(result);
+ }
+
+ public XMLElement parseXML(InputStream input) throws IOException {
+ XMLElement element = new XMLElement();
+ element.parseFromReader(new InputStreamReader(input));
+ return element;
+ }
+
+ public static void transfer(InputStream input, OutputStream output) throws IOException {
+ byte[] buffer = new byte[2048];
+ int read = -1;
+ while ((read = input.read(buffer)) > 0) {
+ output.write(buffer, 0, read);
+ }
+ }
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|