You are viewing a plain text version of this content. The canonical link for it is here.
Posted to svn@forrest.apache.org by rg...@apache.org on 2006/11/18 01:12:06 UTC

svn commit: r476384 [1/3] - in /forrest/trunk/whiteboard/forrest2: ./ .settings/ core/ core/org/ core/org/apache/ core/org/apache/forrest/ core/org/apache/forrest/cli/ core/org/apache/forrest/core/ core/org/apache/forrest/core/document/ core/org/apache...

Author: rgardler
Date: Fri Nov 17 16:12:01 2006
New Revision: 476384

URL: http://svn.apache.org/viewvc?view=rev&rev=476384
Log:
First stab at an eperimental implementation of Forrest2. Please
see src/docs/readme.html

Added:
    forrest/trunk/whiteboard/forrest2/   (with props)
    forrest/trunk/whiteboard/forrest2/.classpath   (with props)
    forrest/trunk/whiteboard/forrest2/.project   (with props)
    forrest/trunk/whiteboard/forrest2/.settings/
    forrest/trunk/whiteboard/forrest2/.settings/org.jayasoft.ivyde.eclipse.prefs
    forrest/trunk/whiteboard/forrest2/.springBeans
    forrest/trunk/whiteboard/forrest2/core/
    forrest/trunk/whiteboard/forrest2/core/org/
    forrest/trunk/whiteboard/forrest2/core/org/apache/
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/cli/
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/cli/CLI.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/Controller.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractDocument.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractOutputDocument.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractSourceDocument.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AggregateInteralDocument.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DefaultOutputDocument.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DefaultSourceDocument.java
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DocumentFactory.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/IDocument.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/InternalDocument.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/XMLSourceDocument.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/LocationmapException.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/ProcessingException.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/SourceException.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/UnknownProtocolException.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/locationMap/
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/locationMap/Location.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/locationMap/LocationMap.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/AbstractInputPlugin.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/BaseOutputPlugin.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/IOutputPlugin.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/IPlugin.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/PassThroughInputPlugin.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/XSLTInputPlugin.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/XSLTOutputPlugin.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/reader/
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/reader/AbstractReader.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/reader/FileReader.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/reader/HTTPReader.java   (with props)
    forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/reader/IReader.java   (with props)
    forrest/trunk/whiteboard/forrest2/ivy.xml   (with props)
    forrest/trunk/whiteboard/forrest2/ivyconf.xml   (with props)
    forrest/trunk/whiteboard/forrest2/src/
    forrest/trunk/whiteboard/forrest2/src/conf/
    forrest/trunk/whiteboard/forrest2/src/conf/defaultForrestContext.xml   (with props)
    forrest/trunk/whiteboard/forrest2/src/conf/locationmap.xml   (with props)
    forrest/trunk/whiteboard/forrest2/src/docs/
    forrest/trunk/whiteboard/forrest2/src/docs/createAPlugin.html   (with props)
    forrest/trunk/whiteboard/forrest2/src/docs/examples/
    forrest/trunk/whiteboard/forrest2/src/docs/examples/affiliateProductCatalogue.html   (with props)
    forrest/trunk/whiteboard/forrest2/src/docs/howDoesItWork.html   (with props)
    forrest/trunk/whiteboard/forrest2/src/docs/readme.html   (with props)
    forrest/trunk/whiteboard/forrest2/src/docs/urlExtensions.html   (with props)
    forrest/trunk/whiteboard/forrest2/src/examples/
    forrest/trunk/whiteboard/forrest2/src/examples/affiliateProductCatalogue/
    forrest/trunk/whiteboard/forrest2/src/examples/affiliateProductCatalogue/src/
    forrest/trunk/whiteboard/forrest2/src/examples/affiliateProductCatalogue/src/forrestContext.xml   (with props)
    forrest/trunk/whiteboard/forrest2/src/examples/affiliateProductCatalogue/src/locationmap.xml   (with props)
    forrest/trunk/whiteboard/forrest2/src/examples/affiliateProductCatalogue/src/org/
    forrest/trunk/whiteboard/forrest2/src/examples/affiliateProductCatalogue/src/org/apache/
    forrest/trunk/whiteboard/forrest2/src/examples/affiliateProductCatalogue/src/org/apache/forrest/
    forrest/trunk/whiteboard/forrest2/src/examples/affiliateProductCatalogue/src/org/apache/forrest/examples/
    forrest/trunk/whiteboard/forrest2/src/examples/affiliateProductCatalogue/src/org/apache/forrest/examples/affiliateProductCatalogue/
    forrest/trunk/whiteboard/forrest2/src/examples/affiliateProductCatalogue/src/org/apache/forrest/examples/affiliateProductCatalogue/reader/
    forrest/trunk/whiteboard/forrest2/src/examples/affiliateProductCatalogue/src/org/apache/forrest/examples/affiliateProductCatalogue/reader/TradeDoublerReader.java   (with props)
    forrest/trunk/whiteboard/forrest2/src/examples/affiliateProductCatalogue/src/xdocs/
    forrest/trunk/whiteboard/forrest2/src/examples/affiliateProductCatalogue/src/xdocs/exampleFeed.xml   (with props)
    forrest/trunk/whiteboard/forrest2/src/examples/affiliateProductCatalogue/src/xslt/
    forrest/trunk/whiteboard/forrest2/src/examples/affiliateProductCatalogue/src/xslt/tradeDoublerFeed-to-internal.xsl   (with props)
    forrest/trunk/whiteboard/forrest2/src/examples/affiliateProductCatalogue/tradeDoubler.html/
    forrest/trunk/whiteboard/forrest2/src/examples/helloWorld/
    forrest/trunk/whiteboard/forrest2/src/examples/helloWorld/src/
    forrest/trunk/whiteboard/forrest2/src/examples/helloWorld/src/forrestContext.xml   (with props)
    forrest/trunk/whiteboard/forrest2/src/examples/helloWorld/src/locationmap.xml   (with props)
    forrest/trunk/whiteboard/forrest2/src/examples/helloWorld/src/xdocs/
    forrest/trunk/whiteboard/forrest2/src/examples/helloWorld/src/xdocs/helloWorld.xhtml2
    forrest/trunk/whiteboard/forrest2/test/
    forrest/trunk/whiteboard/forrest2/test/forrestContext.xml   (with props)
    forrest/trunk/whiteboard/forrest2/test/locationmap.xml   (with props)
    forrest/trunk/whiteboard/forrest2/test/org/
    forrest/trunk/whiteboard/forrest2/test/org/apache/
    forrest/trunk/whiteboard/forrest2/test/org/apache/forrest/
    forrest/trunk/whiteboard/forrest2/test/org/apache/forrest/test/
    forrest/trunk/whiteboard/forrest2/test/org/apache/forrest/test/core/
    forrest/trunk/whiteboard/forrest2/test/org/apache/forrest/test/core/TestController.java   (with props)
    forrest/trunk/whiteboard/forrest2/test/org/apache/forrest/test/core/plugins/
    forrest/trunk/whiteboard/forrest2/test/org/apache/forrest/test/core/plugins/input/
    forrest/trunk/whiteboard/forrest2/test/org/apache/forrest/test/core/plugins/input/HelloWorldInputPlugin.java   (with props)
    forrest/trunk/whiteboard/forrest2/test/org/apache/forrest/test/core/readers/
    forrest/trunk/whiteboard/forrest2/test/org/apache/forrest/test/core/readers/HelloReader.java   (with props)
    forrest/trunk/whiteboard/forrest2/test/xdocs/
    forrest/trunk/whiteboard/forrest2/test/xdocs/samples/
    forrest/trunk/whiteboard/forrest2/test/xdocs/samples/xhtml2/
    forrest/trunk/whiteboard/forrest2/test/xdocs/samples/xhtml2/sample_simple.html   (with props)
    forrest/trunk/whiteboard/forrest2/test/xdocs/samples/xml/
    forrest/trunk/whiteboard/forrest2/test/xdocs/samples/xml/helloWorld.xml   (with props)
    forrest/trunk/whiteboard/forrest2/test/xdocs/samples/xslt/
    forrest/trunk/whiteboard/forrest2/test/xdocs/samples/xslt/internal-to-html.xsl   (with props)

Propchange: forrest/trunk/whiteboard/forrest2/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Fri Nov 17 16:12:01 2006
@@ -0,0 +1,2 @@
+
+bin

Added: forrest/trunk/whiteboard/forrest2/.classpath
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/.classpath?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/.classpath (added)
+++ forrest/trunk/whiteboard/forrest2/.classpath Fri Nov 17 16:12:01 2006
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="core"/>
+	<classpathentry kind="src" path="test"/>
+	<classpathentry kind="src" path="src/conf"/>
+	<classpathentry kind="src" path="src/examples/helloWorld/src"/>
+	<classpathentry kind="src" path="src/examples/affiliateProductCatalogue/src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="con" path="org.jayasoft.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/ivy.xml/*"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/org.saafe.catalogue"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Propchange: forrest/trunk/whiteboard/forrest2/.classpath
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/.project
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/.project?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/.project (added)
+++ forrest/trunk/whiteboard/forrest2/.project Fri Nov 17 16:12:01 2006
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>forrest2</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.genuitec.eclipse.springframework.springbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.genuitec.eclipse.springframework.springnature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

Propchange: forrest/trunk/whiteboard/forrest2/.project
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/.settings/org.jayasoft.ivyde.eclipse.prefs
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/.settings/org.jayasoft.ivyde.eclipse.prefs?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/.settings/org.jayasoft.ivyde.eclipse.prefs (added)
+++ forrest/trunk/whiteboard/forrest2/.settings/org.jayasoft.ivyde.eclipse.prefs Fri Nov 17 16:12:01 2006
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+
+#Sun Oct 22 02:10:00 BST 2006
+acceptedTypes=[inherited]
+eclipse.preferences.version=1
+ivy_conf_path=file\:/D\:/projectWorkspace/forrest2/ivyconf.xml
+retreive.pattern=none

Added: forrest/trunk/whiteboard/forrest2/.springBeans
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/.springBeans?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/.springBeans (added)
+++ forrest/trunk/whiteboard/forrest2/.springBeans Fri Nov 17 16:12:01 2006
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<configExtensions>
+		<configExtension>xml</configExtension>
+	</configExtensions>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/cli/CLI.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/cli/CLI.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/cli/CLI.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/cli/CLI.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.cli;
+
+import java.net.URI;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.forrest.core.Controller;
+import org.apache.forrest.core.document.AbstractOutputDocument;
+
+/**
+ * A command line interface for Forrest.
+ * 
+ */
+public class CLI {
+	private static final Log log = LogFactory.getLog(CLI.class);
+
+	/**
+	 * @param args
+	 */
+	public static void main(final String[] args) {
+		System.out.println("Forrest 2 Command Line Interface");
+		System.out.println("================================");
+
+		if (args[0].equals("--help")) {
+			displayHelp();
+			return;
+		}
+
+		try {
+			AbstractOutputDocument doc = null;
+			System.out.println("\n Processing request for " + args[0]);
+			final URI requestURI = new URI(args[0]);
+			final Controller controller = new Controller();
+			doc = controller.getOutputDocument(requestURI);
+
+			System.out.println("\n Resulting document for request " + args[0]
+					+ " is:\n");
+			System.out.println(doc.getContentAsString());
+
+		} catch (final Exception e) {
+			e.printStackTrace();
+			log.error(e);
+			System.exit(1);
+		}
+	}
+
+	/**
+	 * Outputs a short description on how to use the CLI.
+	 */
+	private static void displayHelp() {
+		System.out.println("Help");
+		System.out.println("====");
+		System.out.println("CLI [URI]");
+		System.out.println("URI is the request URI that you wish to process");
+		System.out
+				.println("The default behaviour is to process the request and output the results to the System.out");
+	}
+
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/cli/CLI.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/Controller.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/Controller.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/Controller.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/Controller.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,402 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.forrest.core.document.AbstractOutputDocument;
+import org.apache.forrest.core.document.AbstractSourceDocument;
+import org.apache.forrest.core.document.AggregateInteralDocument;
+import org.apache.forrest.core.document.DefaultOutputDocument;
+import org.apache.forrest.core.document.IDocument;
+import org.apache.forrest.core.document.InternalDocument;
+import org.apache.forrest.core.exception.LocationmapException;
+import org.apache.forrest.core.exception.ProcessingException;
+import org.apache.forrest.core.locationMap.Location;
+import org.apache.forrest.core.locationMap.LocationMap;
+import org.apache.forrest.core.plugin.AbstractInputPlugin;
+import org.apache.forrest.core.plugin.BaseOutputPlugin;
+import org.apache.forrest.core.plugin.PassThroughInputPlugin;
+import org.apache.forrest.reader.IReader;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.context.support.FileSystemXmlApplicationContext;
+import org.xml.sax.SAXException;
+
+/**
+ * The Controller manages all things Forrest. It is responsible for:
+ * 
+ * <ol>
+ * <li>resolving the input document(s)</li>
+ * <li>loading the input document(s)</li>
+ * <li>selecting an appropriate input plugin(s)</li>
+ * <li>processing the input document with the selected plugin</li>
+ * <li>selecting an appropriate output plugin</li>
+ * <li>processing the internal document with the output plugin</li>
+ * <li>streaming the results to the client</li>
+ * </ol>
+ * 
+ * 
+ */
+public class Controller {
+
+	private final String sourceURLExtension = ".forrestSource";
+
+	private final String internalURLExtension = ".forrestInternal";
+
+	private final Map<URI, List<Location>> sourceLocationsCache = new HashMap<URI, List<Location>>();
+
+	private final Map<URI, List<AbstractSourceDocument>> sourceDocsCache = new HashMap<URI, List<AbstractSourceDocument>>();
+
+	private final Map<URI, List<InternalDocument>> internalDocsCache = new HashMap<URI, List<InternalDocument>>();
+
+	private final Map<URI, AbstractOutputDocument> outputDocCache = new HashMap<URI, AbstractOutputDocument>();
+
+	private LocationMap locationMap;
+
+	private AbstractXmlApplicationContext context;
+
+	/**
+	 * Create a controller that uses the locationmap definition file at the
+	 * provided location.
+	 * 
+	 * @param locationmapPath -
+	 *            path to the locationmap definition file
+	 * @throws URISyntaxException
+	 * @throws IOException
+	 *             If the locationmap cannot be loaded
+	 * @throws SAXException
+	 *             If the locationmap is invalid
+	 * 
+	 */
+	public Controller(final String locationmapPath, final String contextPath)
+			throws URISyntaxException, SAXException, IOException {
+		final File file = new File(contextPath);
+		if (file.exists()) {
+			this.context = new FileSystemXmlApplicationContext(file
+					.getAbsolutePath());
+		} else {
+			this.context = new ClassPathXmlApplicationContext(
+					"defaultForrestContext.xml");
+		}
+		this.initLocationmap(locationmapPath);
+	}
+
+	/**
+	 * Create a controller that uses the default location for the locationmap
+	 * definition file and forrest context file. That is "src/locationmap.xml"
+	 * and "src/forrestContext.xml" respectively..
+	 * 
+	 * @throws URISyntaxException
+	 * @throws IOException
+	 *             If the locationmap cannot be loaded
+	 * @throws SAXException
+	 *             If the locationmap is invalid
+	 * 
+	 */
+	public Controller() throws URISyntaxException, SAXException, IOException {
+		this("src/locationmap.xml", "src/forrestContext.xml");
+	}
+
+	/**
+	 * Initialises the locationmap for use.
+	 * 
+	 * @throws URISyntaxException
+	 * @throws IOException
+	 * @throws SAXException
+	 * @FIXME read the locationmap from a config file.
+	 */
+	private void initLocationmap(final String locationmapPath)
+			throws URISyntaxException, SAXException, IOException {
+		this.locationMap = new LocationMap(locationmapPath);
+	}
+
+	/**
+	 * Process a request for the resource identified by a given URI.
+	 * 
+	 * @param requestURI
+	 * @throws IOException
+	 * @throws LocationmapException
+	 * @throws ProcessingException
+	 */
+	private AbstractOutputDocument processRequest(final URI requestURI)
+			throws IOException, LocationmapException, ProcessingException {
+		final List<Location> sourceLocs = this.resolveSources(requestURI);
+		this.sourceLocationsCache.put(requestURI, sourceLocs);
+
+		final List<AbstractSourceDocument> sourceDocs = this
+				.loadSourceDocuments(sourceLocs);
+		this.sourceDocsCache.put(requestURI, sourceDocs);
+
+		final List<InternalDocument> internalDocs = this
+				.processInputPlugins(sourceDocs);
+		this.internalDocsCache.put(requestURI, internalDocs);
+
+		final AbstractOutputDocument output = this
+				.processOutputPlugins(requestURI);
+		this.outputDocCache.put(requestURI, output);
+		return output;
+	}
+
+	/**
+	 * Process each of the documents supplied with the appropriate input plugins
+	 * to get a document in our internal format.
+	 * 
+	 * @param sourceDocuments
+	 * @throws IOException
+	 */
+	private List<InternalDocument> processInputPlugins(
+			final List<AbstractSourceDocument> sourceDocuments)
+			throws IOException {
+		final List<InternalDocument> results = new ArrayList<InternalDocument>(
+				sourceDocuments.size());
+		for (int i = 0; i < sourceDocuments.size(); i++) {
+			final AbstractSourceDocument doc = sourceDocuments.get(i);
+			AbstractInputPlugin plugin;
+			try {
+				plugin = (AbstractInputPlugin) this.context.getBean(doc
+						.getType());
+			} catch (final NoSuchBeanDefinitionException e) {
+				plugin = new PassThroughInputPlugin();
+			}
+			results.add((InternalDocument) plugin.process(doc));
+		}
+		return results;
+	}
+
+	/**
+	 * Aggregate all the internal documents into a single document and then
+	 * process it will the appropraite output plugin for the given requestURI.
+	 * 
+	 * @param requestURI
+	 * @throws IOException
+	 * @throws ProcessingException
+	 * @throws IOException
+	 */
+	private AbstractOutputDocument processOutputPlugins(final URI requestURI)
+			throws ProcessingException, IOException {
+		IDocument doc = null;
+		final List<InternalDocument> intDocs = this
+				.getInternalDocuments(requestURI);
+		if (intDocs.size() > 1) {
+			doc = new AggregateInteralDocument(intDocs);
+		} else {
+			doc = intDocs.get(0);
+		}
+
+		BaseOutputPlugin plugin = new BaseOutputPlugin();
+		final String[] names = this.context.getBeanNamesForType(plugin
+				.getClass());
+		for (int i = 0; i < names.length; i = i + 1) {
+			plugin = (BaseOutputPlugin) this.context.getBean(names[i]);
+			if (plugin.isMatch(requestURI)) {
+				break;
+			} else {
+				plugin = null;
+			}
+		}
+		if (plugin == null) {
+			plugin = new BaseOutputPlugin();
+		}
+
+		return (AbstractOutputDocument) plugin.process(doc);
+	}
+
+	/**
+	 * Load each of the source documents.
+	 * 
+	 * @throws MalformedURLException
+	 * 
+	 * @fixme cache the resource
+	 * @fixme handle document types other than HTML
+	 * @fixme resource handlers should be provided from a factory class
+	 */
+	private List<AbstractSourceDocument> loadSourceDocuments(
+			final List<Location> sourceLocations) throws MalformedURLException {
+		final List<AbstractSourceDocument> results = new ArrayList<AbstractSourceDocument>(
+				sourceLocations.size());
+
+		for (int i = 0; i < sourceLocations.size(); i++) {
+			final Location location = sourceLocations.get(i);
+			IReader reader;
+			reader = (IReader) this.context.getBean(location.getSourceURI()
+					.getScheme());
+			results.add(reader.read(location));
+		}
+		return results;
+	}
+
+	/**
+	 * Resolve the input documents for a given request.
+	 * 
+	 * @param requestURI
+	 * @return
+	 * @throws LocationmapException
+	 * @throws MalformedURLException
+	 *             if the Request URI is not valid
+	 * @FIXME handle fall through if the first location is not correct
+	 */
+	private List<Location> resolveSources(final URI requestURI)
+			throws LocationmapException, MalformedURLException {
+		final List<List<Location>> possibleLocs = this.locationMap
+				.get(requestURI);
+		if (possibleLocs == null || possibleLocs.size() == 0)
+			throw new LocationmapException(
+					"Unable to find a source location for " + requestURI);
+		// TODO: we need to test for the validity of a location and return the
+		// first matching one instead of returning the first location regardless
+		return possibleLocs.get(0);
+	}
+
+	/**
+	 * Get the source URLs for a given request URI.
+	 * 
+	 * @param requestURI
+	 * @return
+	 * @throws IOException
+	 * @throws LocationmapException
+	 * @throws ProcessingException
+	 */
+	public List<Location> getSourceLocations(final URI requestURI)
+			throws IOException, LocationmapException, ProcessingException {
+		List<Location> locs = this.sourceLocationsCache.get(requestURI);
+		if (locs == null) {
+			this.processRequest(requestURI);
+			locs = this.sourceLocationsCache.get(requestURI);
+		}
+		return locs;
+	}
+
+	/**
+	 * Get the source documents for a given request URI.
+	 * 
+	 * @param requestURI
+	 * @return
+	 * @throws ProcessingException
+	 * @throws MalformedURLException
+	 * @throws IOException
+	 */
+	public List<AbstractSourceDocument> getSourceDocuments(final URI requestURI)
+			throws MalformedURLException, ProcessingException {
+		List<AbstractSourceDocument> sources = this.sourceDocsCache
+				.get(requestURI);
+		if (sources == null)
+			try {
+				this.processRequest(requestURI);
+				sources = this.sourceDocsCache.get(requestURI);
+			} catch (final Exception e) {
+				throw new ProcessingException(
+						"Unable to retrieve the source documents for "
+								+ requestURI, e);
+			}
+		return sources;
+	}
+
+	/**
+	 * Get the internal format documents for a given request URI.
+	 * 
+	 * @param requestURI
+	 * @return
+	 * @throws ProcessingException
+	 * @throws MalformedURLException
+	 * @throws IOException
+	 */
+	public List<InternalDocument> getInternalDocuments(final URI requestURI)
+			throws ProcessingException {
+		List<InternalDocument> internalDocs = this.internalDocsCache
+				.get(requestURI);
+		if (internalDocs == null)
+			try {
+				this.processRequest(requestURI);
+				internalDocs = this.internalDocsCache.get(requestURI);
+			} catch (final Exception e) {
+				throw new ProcessingException(
+						"Unable to create the internal representation of the source documents for "
+								+ requestURI.toString(), e);
+			}
+
+		return internalDocs;
+	}
+
+	/**
+	 * Get the output format documents for a given request URI.
+	 * 
+	 * @param requestURI
+	 * @return
+	 * @throws ProcessingException
+	 * @throws MalformedURLException
+	 * @throws IOException
+	 */
+	public AbstractOutputDocument getOutputDocument(final URI requestURI)
+			throws MalformedURLException, ProcessingException {
+		if (requestURI.getPath().endsWith(this.sourceURLExtension)) {
+			final List<AbstractSourceDocument> sources = this
+					.getSourceDocuments(requestURI);
+			final StringBuffer content = new StringBuffer();
+			for (final AbstractSourceDocument doc : sources) {
+				try {
+					content.append(doc.getContentAsString());
+				} catch (final IOException e) {
+					content
+							.append("<error>Unable to read source document for ");
+					content.append(requestURI);
+					content.append("</error>");
+				}
+			}
+			final DefaultOutputDocument output = new DefaultOutputDocument(
+					content.toString());
+			return output;
+		} else if (requestURI.getPath().endsWith(this.internalURLExtension)) {
+			final List<InternalDocument> docs = this
+					.getInternalDocuments(requestURI);
+			final StringBuffer content = new StringBuffer();
+			for (final InternalDocument doc : docs) {
+				try {
+					content.append(doc.getContentAsString());
+				} catch (final IOException e) {
+					content
+							.append("<error>Unable to read source document for ");
+					content.append(requestURI);
+					content.append("</error>");
+				}
+			}
+			final DefaultOutputDocument output = new DefaultOutputDocument(
+					content.toString());
+			return output;
+		}
+
+		AbstractOutputDocument output = this.outputDocCache.get(requestURI);
+		if (output == null)
+			try {
+				output = this.processRequest(requestURI);
+			} catch (final Exception e) {
+				throw new ProcessingException(
+						"Unable to create the output documents for "
+								+ requestURI + " because " + e.getMessage(), e);
+			}
+		return output;
+	}
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/Controller.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractDocument.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractDocument.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractDocument.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractDocument.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.document;
+
+import java.io.IOException;
+import java.util.Date;
+
+public abstract class AbstractDocument implements IDocument {
+	private Date lastModified;
+
+	String content;
+
+	public AbstractDocument() {
+	}
+
+	public AbstractDocument(final String string) {
+		this.content = string;
+	}
+
+	public String getContentAsString() throws IOException {
+		return this.content;
+	}
+
+	/**
+	 * Set the content of this document. The last modified date will also be
+	 * updated.
+	 * 
+	 * @param content
+	 */
+	public void setContent(final String content) {
+		this.content = content;
+		this.lastModified = new Date();
+	}
+
+	/**
+	 * Get the date and time that this IDocument was last modified. In the case
+	 * of a AbstractSourceDocument this will be the time the source was last
+	 * retrieved. In the case of an Internal IDocument this will be the last
+	 * time the source was processed by the input plugins to generate the
+	 * internal document. In the case of an outputDocument this will be the last
+	 * time the Internal IDocument was last processed using the output plugins.
+	 * 
+	 * @return
+	 */
+	public Date getLastModified() {
+		return this.lastModified;
+	}
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractDocument.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractOutputDocument.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractOutputDocument.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractOutputDocument.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractOutputDocument.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.document;
+
+import java.net.URI;
+
+/**
+ * An output document is a single document that has been processed by Forrest
+ * and is now ready to be returned to the client.
+ */
+public abstract class AbstractOutputDocument extends AbstractDocument {
+
+	private URI requestURI;
+
+	/**
+	 * Get the URI that was used to request this document.
+	 * 
+	 * @return
+	 */
+	public URI getRequestURI() {
+		return this.requestURI;
+	}
+
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractOutputDocument.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractSourceDocument.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractSourceDocument.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractSourceDocument.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractSourceDocument.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.document;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+
+/**
+ * A source document is a single input document as retrieved from its source
+ * location.
+ * 
+ */
+public abstract class AbstractSourceDocument extends AbstractDocument {
+	String type;
+
+	@Override
+	public String getContentAsString() throws IOException {
+		if (this.isComplete() == false) {
+			this.load();
+		}
+		return super.getContentAsString();
+	}
+
+	/**
+	 * Loads the remainder of the content from the input stream.
+	 * 
+	 * @throws IOException
+	 * 
+	 */
+	private void load() throws IOException {
+		final StringBuffer fileData = new StringBuffer(1000);
+		final BufferedReader reader = this.getReader();
+		char[] buf = new char[1000];
+		int numRead = 0;
+		while ((numRead = reader.read(buf)) != -1) {
+			final String readData = String.valueOf(buf, 0, numRead);
+			fileData.append(readData);
+			buf = new char[1000];
+		}
+		this.addContent(fileData.toString());
+		this.setComplete(true);
+		reader.close();
+	}
+
+	/**
+	 * Adds some conntent to the end of the current content.
+	 * 
+	 * @param newContent
+	 */
+	private void addContent(final String newContent) {
+		this.content = this.content + newContent;
+	}
+
+	private boolean isComplete;
+
+	private BufferedReader reader;
+
+	/**
+	 * Indicate whether the complete document is available or not.
+	 * 
+	 * @param b
+	 */
+	protected void setComplete(final boolean b) {
+		this.isComplete = b;
+	}
+
+	/**
+	 * Indicates whether the complete document is available or not. If it is not
+	 * avilable then the rest can be read using the load() method.
+	 * 
+	 * @param b
+	 */
+	public boolean isComplete() {
+		return this.isComplete;
+	}
+
+	/**
+	 * Set the reader from which the remains of a partially loaded file can be
+	 * read.
+	 * 
+	 * @param reader
+	 */
+	protected void setReader(final BufferedReader reader) {
+		this.reader = reader;
+	}
+
+	protected BufferedReader getReader() {
+		return this.reader;
+	}
+
+	/**
+	 * Gets a string that defines the type of document this is. This value is
+	 * used to identify which input plugin will be used top generate the
+	 * internal document for further processing. This string is usually a
+	 * mime-type, but may be any unique string.
+	 * 
+	 * @return
+	 */
+	public String getType() {
+		return this.type;
+	}
+
+	public void setType(final String type) {
+		this.type = type;
+	}
+
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AbstractSourceDocument.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AggregateInteralDocument.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AggregateInteralDocument.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AggregateInteralDocument.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AggregateInteralDocument.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.document;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * A colelction of intenral documents that are to be processed as a single
+ * document by the output plugins.
+ * 
+ * @FIXME when aggregating content ensure that the result is XHTML2 compliant
+ * 
+ */
+public class AggregateInteralDocument extends InternalDocument {
+
+	private List<InternalDocument> documents;
+
+	/**
+	 * Create a new Aggregate document containing all the supplied internal
+	 * documents.
+	 * 
+	 * @param intDocs
+	 */
+	public AggregateInteralDocument(final List<InternalDocument> internalDocs) {
+		this.documents = internalDocs;
+	}
+
+	@Override
+	public String getContentAsString() throws IOException {
+		final StringBuffer result = new StringBuffer("<aggregate>");
+		for (int i = 0; i < this.documents.size(); i++) {
+			result.append(this.documents.get(i).getContentAsString());
+		}
+		result.append("</aggregate>");
+		return result.toString();
+	}
+
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/AggregateInteralDocument.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DefaultOutputDocument.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DefaultOutputDocument.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DefaultOutputDocument.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DefaultOutputDocument.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.document;
+
+/**
+ * The most basic of output documents. The document itself is nothing more than
+ * a String.
+ * 
+ */
+public class DefaultOutputDocument extends AbstractOutputDocument {
+
+	public DefaultOutputDocument(final String content) {
+		this.setContent(content);
+	}
+
+	@Override
+	public String getContentAsString() {
+		return this.content;
+	}
+
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DefaultOutputDocument.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DefaultSourceDocument.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DefaultSourceDocument.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DefaultSourceDocument.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DefaultSourceDocument.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.document;
+
+import java.io.BufferedReader;
+
+/**
+ * A basic source document. It holds the document as a string.
+ * 
+ */
+public class DefaultSourceDocument extends AbstractSourceDocument {
+
+	public DefaultSourceDocument(final String content) {
+		this.setContent(content);
+		this.setComplete(true);
+	}
+
+	/**
+	 * Create a new stringSourceDocument that has partial data read from a
+	 * reader, and partial data left to be read.
+	 * 
+	 * @param fileData
+	 * @param reader
+	 * @param type
+	 *            The mime type of the document. May be null if unkown.
+	 */
+	public DefaultSourceDocument(final String fileData,
+			final BufferedReader reader, final String type) {
+		this.setContent(fileData);
+		this.setReader(reader);
+		this.setComplete(false);
+		this.setType(type);
+	}
+
+	public DefaultSourceDocument(final String content, final String type) {
+		this.setContent(content);
+		this.setComplete(true);
+		this.setType(type);
+	}
+}
\ No newline at end of file

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DocumentFactory.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DocumentFactory.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DocumentFactory.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DocumentFactory.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.document;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+/**
+ * The document factory creates instances of various types of document.
+ * 
+ */
+public class DocumentFactory {
+
+	/**
+	 * Reads as much of the supplied input stream as needed in order to identify
+	 * the type of document that should be created. Then it creates the document
+	 * and returns it.
+	 * 
+	 * @FIXME At present the whole file is read
+	 * 
+	 * @param is
+	 * @return
+	 * @throws IOException
+	 *             If there is a problem reading the document content from the
+	 *             InputStream
+	 */
+	public static AbstractSourceDocument getSourceDocumentFor(
+			final InputStream is) throws IOException {
+		return readFile(is);
+	}
+
+	/**
+	 * Read a string from an InputStream. Each time a chunk of the file is read
+	 * we try and work out what type of document we have. Once we know what it
+	 * is we return an IDocument instance that contains the data read so far and
+	 * the reader used to read the rest of the data.
+	 * 
+	 * @param is
+	 */
+	private static AbstractSourceDocument readFile(final InputStream is)
+			throws java.io.IOException {
+		AbstractSourceDocument doc = null;
+		final StringBuffer fileData = new StringBuffer(1024);
+		final BufferedReader reader = new BufferedReader(new InputStreamReader(
+				is));
+		char[] buf = new char[1000];
+		int numRead = 0;
+		String type = null;
+		while ((numRead = reader.read(buf)) != -1 && type == null) {
+			final String readData = String.valueOf(buf, 0, numRead);
+			fileData.append(readData);
+			buf = new char[1024];
+			if (fileData.toString().contains("<?xml")) {
+				type = getXMLDocumentType(fileData.toString());
+				if (type != null) {
+					doc = new XMLSourceDocument(fileData.toString(), reader,
+							type);
+				}
+			}
+		}
+		if (type == null) {
+			if (fileData.toString().contains("<?xml")) {
+				doc = new XMLSourceDocument(fileData.toString(), reader,
+						"application/xml");
+			} else {
+				doc = new DefaultSourceDocument(fileData.toString(), reader,
+						null);
+			}
+		}
+		return doc;
+	}
+
+	/**
+	 * Given a string that identifies the start of an XML document we look ahead
+	 * to see if there is a Doctype or a namespace definition that enables to
+	 * narrow down the type of XML document this is. If there is no clue to the
+	 * specific type of XML document we return null.
+	 * 
+	 * See http://www.ietf.org/rfc/rfc3023.txt for more inforamtion about XML
+	 * mime types and how to identify them.
+	 * 
+	 * @param string
+	 * @return
+	 */
+	private static String getXMLDocumentType(final String content) {
+		String type = null;
+		if (content.contains("http://www.w3.org/2002/06/xhtml2")) {
+			type = "org.w3c.xhtml2";
+		} else if (content.contains("http://forrest.apache.org/helloWorld.dtd")) {
+			type = "org.apache.forrest.hellowWorld";
+		}
+		return type;
+	}
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/DocumentFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/IDocument.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/IDocument.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/IDocument.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/IDocument.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.document;
+
+import java.io.IOException;
+
+/**
+ * A document contains all the necessary information for processing a resource.
+ * 
+ */
+public interface IDocument {
+
+	/**
+	 * Get the content of the document as a String.
+	 * 
+	 * @return
+	 * @throws IOException
+	 */
+	public String getContentAsString() throws IOException;
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/IDocument.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/InternalDocument.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/InternalDocument.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/InternalDocument.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/InternalDocument.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.document;
+
+/**
+ * An InternalDocument is a document that has been converted from a Source
+ * IDocument into the internal Forrest XML format for processing.
+ * 
+ */
+public class InternalDocument extends AbstractDocument {
+
+	public InternalDocument() {
+	}
+
+	public InternalDocument(final String content) {
+		this.setContent(content);
+	}
+
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/InternalDocument.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/XMLSourceDocument.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/XMLSourceDocument.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/XMLSourceDocument.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/XMLSourceDocument.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.document;
+
+import java.io.BufferedReader;
+
+/**
+ * A representation of an XML document.
+ * 
+ * @FIXME: at this time this is nothing more than a simple string representation
+ *         of the document
+ */
+public class XMLSourceDocument extends DefaultSourceDocument {
+
+	public XMLSourceDocument(final String fileData,
+			final BufferedReader reader, final String type) {
+		super(fileData, reader, type);
+	}
+
+	public XMLSourceDocument(final String content, final String type) {
+		super(content, type);
+	}
+
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/document/XMLSourceDocument.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/LocationmapException.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/LocationmapException.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/LocationmapException.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/LocationmapException.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.exception;
+
+public class LocationmapException extends Exception {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 8900976832922111062L;
+
+	public LocationmapException(final String message) {
+		super(message);
+	}
+
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/LocationmapException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/ProcessingException.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/ProcessingException.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/ProcessingException.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/ProcessingException.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.exception;
+
+public class ProcessingException extends Exception {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -5175336575758457083L;
+
+	public ProcessingException(final String message, final Exception e) {
+		super(message, e);
+	}
+
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/ProcessingException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/SourceException.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/SourceException.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/SourceException.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/SourceException.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.exception;
+
+/**
+ * Thrown when there is an unrecoverable error processing a source document.
+ * 
+ */
+public class SourceException extends RuntimeException {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -7163983081957477821L;
+
+	public SourceException(final String message, final Throwable cause) {
+		super(message, cause);
+	}
+
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/SourceException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/UnknownProtocolException.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/UnknownProtocolException.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/UnknownProtocolException.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/UnknownProtocolException.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.exception;
+
+/**
+ * Thrown if we are trying to handle a URL with an unrecognised protocol.
+ * 
+ */
+public class UnknownProtocolException extends Exception {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 6071505540149764130L;
+
+	public UnknownProtocolException(final String message) {
+		super(message);
+	}
+
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/exception/UnknownProtocolException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/locationMap/Location.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/locationMap/Location.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/locationMap/Location.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/locationMap/Location.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.locationMap;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * A location is a possible source location for a given request URI. There may
+ * be more than one location for any request URI, each of the possible locations
+ * may be optional or requried.
+ * 
+ */
+public class Location {
+	private String requestPattern;
+
+	private boolean isRequired;
+
+	private URI sourceURI;
+
+	public Location(final String pattern, final URL sourceURL,
+			final boolean isRequired) throws URISyntaxException {
+		this.init(pattern, sourceURL.toURI(), isRequired);
+	}
+
+	/**
+	 * Construct a new Location from an XML node.
+	 * 
+	 * @param element
+	 * @throws URISyntaxException
+	 * @throws IOException
+	 */
+	public Location(final Node element) throws URISyntaxException, IOException {
+		String pattern = null;
+		String url = null;
+		boolean isOptional = false;
+
+		final NamedNodeMap atts = element.getAttributes();
+		pattern = atts.getNamedItem("pattern").getNodeValue();
+		final NodeList children = element.getChildNodes();
+		for (int i = 0; i < children.getLength(); i++) {
+			final Node child = children.item(i);
+			if (child.getNodeName().equals("source")) {
+				url = child.getAttributes().getNamedItem("href").getNodeValue();
+				final Node required = child.getAttributes().getNamedItem(
+						"required");
+				if (required != null) {
+					isOptional = required.getNodeValue().equals("false");
+				}
+			}
+		}
+		if (url.contains("classpath:")) {
+			final String path = url.substring(url.lastIndexOf(':') + 1);
+			final URL resourceURL = this.getClass().getResource(path);
+			if (resourceURL == null)
+				throw new IOException("Cannot find the resource: " + path);
+			URI uri;
+			if (url.indexOf("classpath:") != 0) {
+				final String psudeoProtocol = url.substring(0, url
+						.indexOf("classpath:") - 1);
+				final String ssp = resourceURL.toURI().toURL().toExternalForm();
+				uri = new URI(psudeoProtocol, ssp, null);
+			} else {
+				uri = resourceURL.toURI();
+			}
+			this.init(pattern, uri, isOptional);
+		} else {
+			this.init(pattern, new URI(url), isOptional);
+		}
+	}
+
+	private void init(final String pattern, final URI uri,
+			final boolean isOptional) throws URISyntaxException {
+		if (pattern == null)
+			throw new IllegalArgumentException(
+					"requestURIPattern cannot be null");
+		if (uri == null)
+			throw new IllegalArgumentException("sourceURI cannot be null");
+		this.setRequestPattern(pattern);
+		this.setSourceURI(uri);
+		this.setRequired(this.isRequired);
+	}
+
+	public boolean isRequired() {
+		return this.isRequired;
+	}
+
+	public void setRequired(final boolean isRequired) {
+		this.isRequired = isRequired;
+	}
+
+	public String getRequestPattern() {
+		return this.requestPattern;
+	}
+
+	public void setRequestPattern(final String pattern) {
+		this.requestPattern = pattern;
+	}
+
+	public URL getSourceURL() throws MalformedURLException {
+		return this.getSourceURI().toURL();
+	}
+
+	public void setSourceURL(final URL sourceURL) throws URISyntaxException {
+		this.setSourceURI(sourceURL.toURI());
+	}
+
+	public URI getSourceURI() {
+		return this.sourceURI;
+	}
+
+	public void setSourceURI(final URI sourceURI) {
+		this.sourceURI = sourceURI;
+	}
+
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/locationMap/Location.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/locationMap/LocationMap.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/locationMap/LocationMap.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/locationMap/LocationMap.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/locationMap/LocationMap.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.locationMap;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.forrest.core.exception.LocationmapException;
+import org.apache.xerces.parsers.DOMParser;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import com.sun.org.apache.regexp.internal.RE;
+import com.sun.org.apache.regexp.internal.RESyntaxException;
+
+/**
+ * A locationmap is a collection of all mappings from a request URI to source
+ * URLs.
+ * 
+ */
+public class LocationMap {
+	private final Map<String, List<Location>> locations = new HashMap<String, List<Location>>();
+
+	/**
+	 * Create a new locationmap, configured by the file at the given path within
+	 * the classpath.
+	 * 
+	 * @param locationmapPath
+	 * @throws URISyntaxException
+	 * @throws MalformedURLException
+	 * @throws IOException
+	 * @throws SAXException
+	 */
+	public LocationMap(final String locationmapPath) throws URISyntaxException,
+			SAXException, IOException {
+		final File file = new File(locationmapPath);
+		final URL lmURL = file.toURL();
+
+		final DOMParser parser = new DOMParser();
+		parser.parse(lmURL.toString());
+		final Document doc = parser.getDocument();
+		final Node root = doc.getDocumentElement();
+		final NodeList nodes = root.getChildNodes();
+
+		for (int i = 0; i < nodes.getLength(); i++) {
+			final Node element = nodes.item(i);
+			if (element.getNodeName().equals("location")) {
+				this.put(new Location(element));
+			}
+		}
+	}
+
+	/**
+	 * Adds a location to the possible locations for a given requestURI.
+	 * 
+	 * @param requestURI
+	 * @param location
+	 */
+	public void put(final Location location) {
+		List<Location> sourceLocations = this.locations.get(location
+				.getRequestPattern());
+		if (sourceLocations == null)
+			sourceLocations = new ArrayList<Location>();
+		if (sourceLocations.contains(location) == false)
+			sourceLocations.add(location);
+		this.locations.put(location.getRequestPattern(), sourceLocations);
+	}
+
+	/**
+	 * Get the all matching sets of locations for the given URI.
+	 * 
+	 * @param requestURI
+	 * @return
+	 * @throws MalformedURLException
+	 *             if the Request URI is invalid
+	 * @throws LocationmapException
+	 */
+	public List<List<Location>> get(final URI requestURI)
+			throws MalformedURLException, LocationmapException {
+		final List<List<Location>> results = new ArrayList<List<Location>>();
+		final Set<String> locPatterns = this.locations.keySet();
+		for (final String pattern : locPatterns) {
+			try {
+				if (this.isMatch(pattern, requestURI))
+					results.add(this.locations.get(pattern));
+			} catch (final RESyntaxException e) {
+				throw new LocationmapException(
+						"Pattern is not a valid regular expression (" + pattern
+								+ "): " + e.getMessage());
+			}
+		}
+		return results;
+	}
+
+	/**
+	 * Test to see if this location is applicable to a given request URI.
+	 * 
+	 * @param requestURI
+	 * @return
+	 * @throws MalformedURLException
+	 * @throws MalformedURLException
+	 *             if the request URI cannot be converted to a valid URL
+	 * @throws RESyntaxException
+	 *             if the pattern supplied is not a valid regular expression
+	 * @FIXME use pattern matching to test for a match
+	 */
+	public boolean isMatch(final String pattern, final URI requestURI)
+			throws MalformedURLException, RESyntaxException {
+		URL url;
+		try {
+			url = requestURI.toURL();
+		} catch (final IllegalArgumentException e) {
+			// we'll assume that this is not an absolute URL and therefore
+			// refers to a file
+			url = new URL("file://" + requestURI);
+		}
+		final String urlString = url.toExternalForm();
+
+		final RE r = new RE(pattern);
+		return r.match(urlString);
+	}
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/locationMap/LocationMap.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/AbstractInputPlugin.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/AbstractInputPlugin.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/AbstractInputPlugin.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/AbstractInputPlugin.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.plugin;
+
+/**
+ * An output plugin processes an internal document and produces a document ready
+ * for output.
+ * 
+ * @TODO it seems that there are no implemented methods left here, perhaps we
+ *       should deprecate it
+ */
+public abstract class AbstractInputPlugin implements IPlugin {
+
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/AbstractInputPlugin.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/BaseOutputPlugin.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/BaseOutputPlugin.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/BaseOutputPlugin.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/BaseOutputPlugin.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.plugin;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.forrest.core.document.DefaultOutputDocument;
+import org.apache.forrest.core.document.IDocument;
+import org.apache.regexp.RE;
+
+/**
+ * A base output plugin from which all other output plugins should be etended.
+ * This plugin does not actually do anything, it is essentially a pass through
+ * plugin.
+ * 
+ */
+public class BaseOutputPlugin implements IOutputPlugin {
+
+	String requestURIPattern;
+
+	/**
+	 * Get the pattern that a requestURI must match for this plugin to be
+	 * applied to the internal documents.
+	 */
+	public String getPattern() {
+		return this.requestURIPattern;
+	}
+
+	/**
+	 * Set the URI pattern this plugin should match befre being applied.
+	 * 
+	 * @param requestURIPattern
+	 */
+	public void setPattern(final String requestURIPattern) {
+		this.requestURIPattern = requestURIPattern;
+	}
+
+	/**
+	 * Tests to see if there is match between this plugins request URI pattern
+	 * and a given request URI.
+	 * 
+	 * @param requestURI
+	 * @return
+	 * @fixme implement proper matching
+	 */
+	public boolean isMatch(final URI requestURI) {
+		final RE r = new RE(this.getPattern());
+		return r.match(requestURI.getPath());
+	}
+
+	public IDocument process(final IDocument doc) throws IOException {
+		return new DefaultOutputDocument(doc.getContentAsString());
+	}
+
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/BaseOutputPlugin.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/IOutputPlugin.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/IOutputPlugin.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/IOutputPlugin.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/IOutputPlugin.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.plugin;
+
+public interface IOutputPlugin extends IPlugin {
+
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/IOutputPlugin.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/IPlugin.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/IPlugin.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/IPlugin.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/IPlugin.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.plugin;
+
+import java.io.IOException;
+
+import org.apache.forrest.core.document.IDocument;
+
+public interface IPlugin {
+
+	/**
+	 * Process an input document producing a document in the internal Forrest
+	 * format.
+	 * 
+	 * @param doc
+	 * @return
+	 * @throws IOException
+	 */
+	public IDocument process(IDocument doc) throws IOException;
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/IPlugin.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/PassThroughInputPlugin.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/PassThroughInputPlugin.java?view=auto&rev=476384
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/PassThroughInputPlugin.java (added)
+++ forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/PassThroughInputPlugin.java Fri Nov 17 16:12:01 2006
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.forrest.core.plugin;
+
+import java.io.IOException;
+
+import org.apache.forrest.core.document.IDocument;
+import org.apache.forrest.core.document.InternalDocument;
+
+/**
+ * This is plugin does not process the content in any way, it simply repackages
+ * the sourceDocument as an internal document. It will be applied if no other
+ * plugin is available that is suitable for the source document.
+ * 
+ */
+public class PassThroughInputPlugin extends AbstractInputPlugin {
+
+	public IDocument process(final IDocument doc) throws IOException {
+		return new InternalDocument(doc.getContentAsString());
+	}
+
+}

Propchange: forrest/trunk/whiteboard/forrest2/core/org/apache/forrest/core/plugin/PassThroughInputPlugin.java
------------------------------------------------------------------------------
    svn:eol-style = native