forrest-svn mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From rgard...@apache.org
Subject svn commit: r482430 - in /forrest/trunk/whiteboard/forrest2/core/src: core/org/apache/forrest/core/ core/org/apache/forrest/core/locationMap/ core/org/apache/forrest/core/matcher/ core/org/apache/forrest/core/reader/ test/org/apache/forrest/test/core/
Date Tue, 05 Dec 2006 00:34:52 GMT
Author: rgardler
Date: Mon Dec  4 16:34:50 2006
New Revision: 482430

URL: http://svn.apache.org/viewvc?view=rev&rev=482430
Log:
@refactor abstract out handling of various nodes in the locationmap
@refactor use a matcher class for prossing pattern matching

Added:
    forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/AbstractSourceNode.java
  (with props)
    forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/LocationNode.java
      - copied, changed from r482324, forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/Location.java
    forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/SourceNode.java
  (with props)
    forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/matcher/
    forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/matcher/AbstractMatcher.java
  (with props)
    forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/matcher/REMatcher.java
  (with props)
Removed:
    forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/Location.java
Modified:
    forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/Controller.java
    forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/IController.java
    forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/LocationMap.java
    forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/ChainedReader.java
    forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/FileReader.java
    forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/HTTPReader.java
    forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/IReader.java
    forrest/trunk/whiteboard/forrest2/core/src/test/org/apache/forrest/test/core/TestController.java

Modified: forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/Controller.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/Controller.java?view=diff&rev=482430&r1=482429&r2=482430
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/Controller.java
(original)
+++ forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/Controller.java
Mon Dec  4 16:34:50 2006
@@ -35,7 +35,8 @@
 import org.apache.forrest.core.document.InternalErrorDocument;
 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.AbstractSourceNode;
+import org.apache.forrest.core.locationMap.LocationNode;
 import org.apache.forrest.core.locationMap.LocationMap;
 import org.apache.forrest.core.plugin.AbstractInputPlugin;
 import org.apache.forrest.core.plugin.BaseOutputPlugin;
@@ -67,7 +68,7 @@
 
 	Logger log = Logger.getLogger(Controller.class);
 
-	private final Map<URI, List<Location>> sourceLocationsCache = new HashMap<URI,
List<Location>>();
+	private final Map<URI, List<LocationNode>> sourceLocationsCache = new HashMap<URI,
List<LocationNode>>();
 
 	private final Map<URI, AbstractSourceDocument> sourceDocsCache = new HashMap<URI,
AbstractSourceDocument>();
 
@@ -151,7 +152,7 @@
 	 */
 	private AbstractOutputDocument processRequest(final URI requestURI)
 			throws IOException, LocationmapException, ProcessingException {
-		final List<Location> sourceLocs = this
+		final List<LocationNode> sourceLocs = this
 				.resolveSourceLocations(requestURI);
 		this.sourceLocationsCache.put(requestURI, sourceLocs);
 
@@ -266,13 +267,13 @@
 	 * @fixme resource handlers should be provided from a factory class
 	 */
 	private List<AbstractSourceDocument> loadAllSourceDocuments(URI requestURI,
-			final List<Location> sourceLocations) throws MalformedURLException,
+			final List<LocationNode> sourceLocations) throws MalformedURLException,
 			ProcessingException {
 		final List<AbstractSourceDocument> results = new ArrayList<AbstractSourceDocument>(
 				sourceLocations.size());
 
 		for (int i = 0; i < sourceLocations.size(); i++) {
-			final Location location = sourceLocations.get(i);
+			final LocationNode location = sourceLocations.get(i);
 			AbstractSourceDocument doc = loadSourceDocument(requestURI,
 					location);
 			results.add(doc);
@@ -281,13 +282,13 @@
 	}
 
 	private AbstractSourceDocument loadSourceDocument(URI requestURI,
-			final Location location) throws ProcessingException,
+			final LocationNode location) throws ProcessingException,
 			MalformedURLException {
 		AbstractSourceDocument doc = sourceDocsCache.get(requestURI);
 		if (doc == null) {
-			for (URI uri : location.getSourceURIs()) {
-				IReader reader = getReader(uri);
-				doc = reader.read(this, requestURI, location, uri);
+			for (AbstractSourceNode node : location.getSourceNodes()) {
+				IReader reader = getReader(node.getSourceURI());
+				doc = reader.read(this, requestURI, node, location.getMatcher());
 				if (doc != null) {
 					addToSourceDocCache(requestURI, doc);
 					break;
@@ -311,7 +312,7 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.apache.forrest.core.IController#getReader(org.apache.forrest.core.locationMap.Location)
+	 * @see org.apache.forrest.core.IController#getReader(org.apache.forrest.core.locationMap.LocationNode)
 	 */
 	public IReader getReader(final URI uri) throws ProcessingException {
 		IReader reader;
@@ -343,36 +344,27 @@
 	 * @throws ProcessingException
 	 * @FIXME handle fall through if the first location is not correct
 	 */
-	private List<Location> resolveSourceLocations(final URI requestURI)
+	private List<LocationNode> resolveSourceLocations(final URI requestURI)
 			throws LocationmapException, MalformedURLException,
 			ProcessingException {
-		final List<List<Location>> possibleLocs = this.locationMap
+		final List<List<LocationNode>> possibleLocs = this.locationMap
 				.get(requestURI);
 		if (possibleLocs == null || possibleLocs.size() == 0)
 			throw new LocationmapException(
 					"Unable to find a source location for " + requestURI);
 
-		List<Location> result = new ArrayList<Location>();
+		List<LocationNode> result = new ArrayList<LocationNode>();
 		Boolean isValid = false;
-		for (List<Location> locs : possibleLocs) {
-			result = new ArrayList<Location>();
+		for (List<LocationNode> locs : possibleLocs) {
+			result = new ArrayList<LocationNode>();
 			isValid = true;
-			Iterator<Location> sourceLocs = locs.iterator();
-			Location loc;
+			Iterator<LocationNode> sourceLocs = locs.iterator();
+			LocationNode loc;
 			while (sourceLocs.hasNext() && isValid) {
 				loc = sourceLocs.next();
 				if (sourceExists(requestURI, loc)) {
 					result.add(loc);
 					log.debug("Found valid location");
-				} else {
-					if (loc.isRequired()) {
-						isValid = false;
-						log
-								.debug("Can't use this set of locations because one is required: "
-										+ loc.toString());
-					} else {
-						log.debug("Can't find file for " + loc.toString());
-					}
 				}
 			}
 			if (isValid)
@@ -395,7 +387,7 @@
 	 * @throws MalformedURLException
 	 * @TODO we need a more efficient test for existence.
 	 */
-	private boolean sourceExists(URI requestURI, Location location)
+	private boolean sourceExists(URI requestURI, LocationNode location)
 			throws MalformedURLException, ProcessingException {
 		AbstractSourceDocument doc = loadSourceDocument(requestURI, location);
 		return doc != null;
@@ -406,9 +398,9 @@
 	 * 
 	 * @see org.apache.forrest.core.IController#getSourceLocations(java.net.URI)
 	 */
-	public List<Location> getSourceLocations(final URI requestURI)
+	public List<LocationNode> getSourceLocations(final URI requestURI)
 			throws IOException, LocationmapException, ProcessingException {
-		List<Location> locs = this.sourceLocationsCache.get(requestURI);
+		List<LocationNode> locs = this.sourceLocationsCache.get(requestURI);
 		if (locs == null) {
 			this.processRequest(requestURI);
 			locs = this.sourceLocationsCache.get(requestURI);

Modified: forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/IController.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/IController.java?view=diff&rev=482430&r1=482429&r2=482430
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/IController.java
(original)
+++ forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/IController.java
Mon Dec  4 16:34:50 2006
@@ -10,7 +10,7 @@
 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.LocationNode;
 import org.apache.forrest.core.plugin.AbstractInputPlugin;
 import org.apache.forrest.core.plugin.BaseOutputPlugin;
 import org.apache.forrest.core.reader.IReader;
@@ -46,7 +46,7 @@
 	 * @throws LocationmapException
 	 * @throws ProcessingException
 	 */
-	public abstract List<Location> getSourceLocations(final URI requestURI)
+	public abstract List<LocationNode> getSourceLocations(final URI requestURI)
 			throws IOException, LocationmapException, ProcessingException;
 
 	/**

Added: forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/AbstractSourceNode.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/AbstractSourceNode.java?view=auto&rev=482430
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/AbstractSourceNode.java
(added)
+++ forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/AbstractSourceNode.java
Mon Dec  4 16:34:50 2006
@@ -0,0 +1,141 @@
+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 java.util.ArrayList;
+import java.util.List;
+
+import org.apache.forrest.core.exception.ProcessingException;
+import org.apache.forrest.core.matcher.AbstractMatcher;
+import org.apache.log4j.Logger;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import com.sun.org.apache.regexp.internal.RE;
+import com.sun.org.apache.regexp.internal.RESyntaxException;
+
+/**
+ * A Source Node represents a single possible source or, in the case of an
+ * aggregated node a collection of possible source nodes.
+ * 
+ */
+public abstract class AbstractSourceNode {
+
+	Logger log = Logger.getLogger(AbstractSourceNode.class);
+
+	private boolean isRequired;
+
+	private URI sourceURI;
+
+	/**
+	 * Construct a new LocationNode from an XML node.
+	 * 
+	 * @param element
+	 * @throws URISyntaxException
+	 * @throws IOException
+	 */
+	public AbstractSourceNode(final Node element) throws URISyntaxException,
+			IOException {
+		final NamedNodeMap atts = element.getAttributes();
+		setSourceURI(new URI(atts.getNamedItem("href").getNodeValue()));
+		final Node required = atts.getNamedItem("required");
+		if (required != null) {
+			setRequired(required.getNodeValue().equals("true"));
+		}
+	}
+
+	public boolean isRequired() {
+		return this.isRequired;
+	}
+
+	public void setRequired(final boolean isRequired) {
+		this.isRequired = isRequired;
+	}
+
+	/**
+	 * 
+	 * @param sourceURI
+	 * @return
+	 * @throws ProcessingException -
+	 *             if the path to the resource cannot be resolved
+	 */
+	private URL resolveClasspathURI(final URI sourceURI)
+			throws ProcessingException {
+		URL resourceURL;
+		resourceURL = this.getClass().getResource(sourceURI.getPath());
+		if (resourceURL == null)
+			throw new ProcessingException(
+					"Cannot find the classpath resource: " + sourceURI);
+		return resourceURL;
+	}
+
+	public String toString() {
+		StringBuffer sb = new StringBuffer();
+		if (isRequired()) {
+			sb.append("Required ");
+		} else {
+			sb.append("Optional ");
+		}
+		sb.append("Source URI: ");
+		sb.append(this.getSourceURI());
+		return sb.toString();
+	}
+
+	/**
+	 * Resolve the supplied URI and return a URL that can be used to attempt to
+	 * retrieve the resource. A resolved uri has all variables substituted with
+	 * their values.
+	 * 
+	 * @param requestURI -
+	 *            the full request URI
+	 * @return
+	 * @throws MalformedURLException
+	 * @throws ProcessingException
+	 */
+	public URL resolveURL(AbstractMatcher matcher, URI requestURI)
+			throws MalformedURLException, ProcessingException {
+		URI uri = matcher.substituteVariables(requestURI, getSourceURI());
+
+		URL resolvedURL;
+		if (uri.getScheme().equals("classpath")) {
+			resolvedURL = resolveClasspathURI(uri);
+		} else {
+			try {
+				String strURI = uri.getSchemeSpecificPart();
+				if (strURI.contains(":")) {
+					String subProtocol = strURI.substring(0, strURI
+							.lastIndexOf(':'));
+					uri = new URI(strURI.substring(strURI.lastIndexOf(':') + 1));
+					if (subProtocol.equals("classpath")) {
+						resolvedURL = resolveClasspathURI(uri);
+					} else {
+						URI subURI;
+						subURI = new URI(subProtocol, uri
+								.getSchemeSpecificPart(), null);
+						resolvedURL = subURI.toURL();
+					}
+				} else {
+					resolvedURL = uri.toURL();
+				}
+			} catch (URISyntaxException e) {
+				throw new MalformedURLException(
+						"Unable to work out sub protocol URI");
+			}
+		}
+		return resolvedURL;
+
+	}
+
+	public URI getSourceURI() {
+		return sourceURI;
+	}
+
+	public void setSourceURI(URI sourceURI) {
+		this.sourceURI = sourceURI;
+	}
+
+}

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

Modified: forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/LocationMap.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/LocationMap.java?view=diff&rev=482430&r1=482429&r2=482430
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/LocationMap.java
(original)
+++ forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/LocationMap.java
Mon Dec  4 16:34:50 2006
@@ -47,7 +47,7 @@
 public class LocationMap {
 	Logger log = Logger.getLogger(LocationMap.class);
 	
-	private final Map<String, List<Location>> locations = new HashMap<String,
List<Location>>();
+	private final Map<String, List<LocationNode>> locations = new HashMap<String,
List<LocationNode>>();
 
 	/**
 	 * Create a new locationmap, configured by the file at the given path within
@@ -74,7 +74,7 @@
 		for (int i = 0; i < nodes.getLength(); i++) {
 			final Node element = nodes.item(i);
 			if (element.getNodeName().equals("location")) {
-				Location loc = new Location(element);
+				LocationNode loc = new LocationNode(element);
 				this.put(loc);
 				log.debug("Adding " + loc.toString());
 			}
@@ -87,14 +87,14 @@
 	 * @param requestURI
 	 * @param location
 	 */
-	public void put(final Location location) {
-		List<Location> sourceLocations = this.locations.get(location
-				.getRequestPattern());
+	public void put(final LocationNode location) {
+		List<LocationNode> sourceLocations = this.locations.get(location
+				.getMatcher().getPattern());
 		if (sourceLocations == null)
-			sourceLocations = new ArrayList<Location>();
+			sourceLocations = new ArrayList<LocationNode>();
 		if (sourceLocations.contains(location) == false)
 			sourceLocations.add(location);
-		this.locations.put(location.getRequestPattern(), sourceLocations);
+		this.locations.put(location.getMatcher().getPattern(), sourceLocations);
 	}
 
 	/**
@@ -111,15 +111,15 @@
 	 *             if the Request URI is invalid
 	 * @throws LocationmapException
 	 */
-	public List<List<Location>> get(final URI requestURI)
+	public List<List<LocationNode>> get(final URI requestURI)
 			throws MalformedURLException, LocationmapException {
 		log.debug("Getting potential locations for request of " + requestURI.toASCIIString());
-		final List<List<Location>> results = new ArrayList<List<Location>>();
+		final List<List<LocationNode>> results = new ArrayList<List<LocationNode>>();
 		final Set<String> locPatterns = this.locations.keySet();
 		for (final String pattern : locPatterns) {
 			try {
 				if (this.isMatch(pattern, requestURI)) {
-					List<Location> locs = this.locations.get(pattern);
+					List<LocationNode> locs = this.locations.get(pattern);
 					results.add(locs);
 					log.info(locs.size() + " potenatial location from pattern " + pattern);
 				}

Copied: forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/LocationNode.java
(from r482324, forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/Location.java)
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/LocationNode.java?view=diff&rev=482430&p1=forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/Location.java&r1=482324&p2=forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/LocationNode.java&r2=482430
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/Location.java
(original)
+++ forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/LocationNode.java
Mon Dec  4 16:34:50 2006
@@ -17,58 +17,42 @@
 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 java.util.ArrayList;
 import java.util.List;
 
-import org.apache.forrest.core.exception.ProcessingException;
+import org.apache.forrest.core.matcher.AbstractMatcher;
+import org.apache.forrest.core.matcher.REMatcher;
 import org.apache.log4j.Logger;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
-import com.sun.org.apache.regexp.internal.RE;
-import com.sun.org.apache.regexp.internal.RESyntaxException;
-
 /**
  * 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 {
-
-	Logger log = Logger.getLogger(Location.class);
-
-	private String requestPattern;
-
-	private boolean isRequired;
+public class LocationNode {
 
-	private List<URI> sourceURIs;
-
-	public Location(final String pattern, final URL sourceURL,
-			final boolean isRequired) throws URISyntaxException {
-		List<URI> uris = new ArrayList<URI>();
-		uris.add(sourceURL.toURI());
-		this.init(pattern, uris, isRequired);
-	}
+	Logger log = Logger.getLogger(LocationNode.class);
+	
+	private AbstractMatcher matcher;
+	
+	private List<AbstractSourceNode> sourceNodes;
 
 	/**
-	 * Construct a new Location from an XML node.
+	 * Construct a new LocationNode from an XML node.
 	 * 
 	 * @param element
 	 * @throws URISyntaxException
 	 * @throws IOException
 	 */
-	public Location(final Node element) throws URISyntaxException, IOException {
+	public LocationNode(final Node element) throws URISyntaxException, IOException {
 		String pattern = null;
-		String url = null;
-		List<URI> uris = new ArrayList<URI>();
-		boolean isRequired = false;
-
+		List<AbstractSourceNode> nodes = new ArrayList<AbstractSourceNode>();
+		
 		final NamedNodeMap atts = element.getAttributes();
 		pattern = atts.getNamedItem("regexp").getNodeValue();
 		final NodeList children = element.getChildNodes();
@@ -76,184 +60,46 @@
 			final Node child = children.item(i);
 			String nodeName = child.getNodeName();
 			if (nodeName != null && nodeName.equals("source")) {
-				url = child.getAttributes().getNamedItem("href").getNodeValue();
-				final Node required = child.getAttributes().getNamedItem(
-						"required");
-				if (required != null) {
-					isRequired = required.getNodeValue().equals("true");
-				}
-				uris.add(new URI(url));
+				nodes.add(new SourceNode(child));
 			}
 		}
-		this.init(pattern, uris, isRequired);
+		this.init(pattern, nodes);
 	}
 
-	private void init(final String pattern, final List<URI> uris,
-			final boolean isRequired) throws URISyntaxException {
+	private void init(final String pattern, final List<AbstractSourceNode> nodes) throws
URISyntaxException {
 		if (pattern == null)
 			throw new IllegalArgumentException(
 					"requestURIPattern cannot be null");
-		if (uris == null || uris.size() == 0)
+		if (nodes == null || nodes.size() == 0)
 			throw new IllegalArgumentException(
-					"There must be at least one potential source uri");
-		this.setRequestPattern(pattern);
-		this.setSourceURIs(uris);
-		this.setRequired(isRequired);
-	}
-
-	public boolean isRequired() {
-		return this.isRequired;
-	}
-
-	public void setRequired(final boolean isRequired) {
-		this.isRequired = isRequired;
-	}
-
-	public String getRequestPattern() {
-		return this.requestPattern;
+					"There must be at least one source node for a location");
+		this.setMatcher(new REMatcher(pattern));
+		this.setSourceNodes(nodes);
 	}
 
-	public void setRequestPattern(final String pattern) {
-		this.requestPattern = pattern;
-	}
-
-	/**
-	 * Get the source URLs, that may be used to read the source document. A
-	 * source URL is the sourceURI modified appropriately for the given request.
-	 * Note that the resulting list of URLs have not been verified with respect
-	 * to the existence of a document, it is only a potential location.
-	 * 
-	 * @return
-	 * @throws MalformedURLException
-	 * @throws ProcessingException
-	 */
-	public List<URL> getResolvedSourceURL(URI requestURI)
-			throws MalformedURLException, ProcessingException {
-		List<URL> resolvedUrls = new ArrayList<URL>();
-		for (URI sourceURI : getSourceURIs()) {
-			resolvedUrls.add(resolveURL(requestURI, sourceURI));
-		}
-		return resolvedUrls;
-	}
-
-	/**
-	 * 
-	 * @param sourcePath
-	 * @return
-	 * @throws ProcessingException - if the path to the resource cannot be resolved
-	 */
-	private URL resolveClasspathURI(final String sourcePath)
-			throws ProcessingException {
-		URL resourceURL;
-		resourceURL = this.getClass().getResource(sourcePath);
-		if (resourceURL == null)
-			throw new ProcessingException(
-					"Cannot find the classpath resource: " + sourcePath);
-		return resourceURL;
-	}
-
-	public List<URI> getSourceURIs() {
-		return this.sourceURIs;
-	}
-
-	/**
-	 * Set the list of potential source URIs for this document.
-	 * 
-	 * @param sourceURI
-	 */
-	public void setSourceURIs(final List<URI> sourceURIs) {
-		this.sourceURIs = sourceURIs;
-	}
-	
 	public String toString() {
 		StringBuffer sb = new StringBuffer();
-		if (isRequired()) {
-			sb.append("Required ");
-		} else {
-			sb.append("Optional ");
-		}
 		sb.append("location: ");
-		sb.append("Pattern: ");
-		sb.append(this.getRequestPattern());
-		sb.append(" Potential sourceURIs: ");
-		for (URI uri : getSourceURIs()) {
-		  sb.append(uri.toASCIIString());
-		  sb.append(" ");
-		}
-
+		sb.append("Matcher:");
+		sb.append(this.getMatcher().toString());
+		
 		return sb.toString();
 	}
 
-	/**
-	 * Resolve the supplied URI and return a URL that can
-	 * be used to attempt to retrieve the resource. A resolved
-	 * uri has all variables substituted with their values.
-	 * 
-	 * @param sourceURI
-	 * @return
-	 * @throws MalformedURLException 
-	 * @throws ProcessingException 
-	 */
-	public URL resolveURL(URI requestURI, URI sourceURI) throws MalformedURLException, ProcessingException
{
-		URL url;
-		RE r;
-
-		try {
-			r = new RE(getRequestPattern());
-		} catch (RESyntaxException re) {
-			throw new ProcessingException(
-					"Unable to extract variable values from request: "
-							+ re.getMessage(), re);
-		}
-		
-		String urlString = requestURI.getPath();
+	public List<AbstractSourceNode> getSourceNodes() {
+		return sourceNodes;
+	}
 
-			String sourceSSP = sourceURI.getSchemeSpecificPart();
+	public void setSourceNodes(List<AbstractSourceNode> sourceNodes) {
+		this.sourceNodes = sourceNodes;
+	}
 
-			if (r.match(urlString)) {
-				String variable;
-				String value;
-				for (int i = 0; i < r.getParenCount(); i++) {
-					variable = "$(" + i + ")";
-					value = r.getParen(i);
-					if (value != null) {
-						sourceSSP = sourceSSP.replace(variable, value);
-					}
-				}
-				log.debug("After variable substitution a potential source path is "
-						+ sourceSSP);
-			} else {
-				throw new ProcessingException(
-						"Unable to extract variable values from requestURI");
-			}
+	public AbstractMatcher getMatcher() {
+		return matcher;
+	}
 
-			URL resolvedURL;
-			if (sourceURI.getScheme().equals("classpath")) {
-				resolvedURL = resolveClasspathURI(sourceSSP);
-			} else {
-				String strURI = sourceURI.getSchemeSpecificPart();
-				if (strURI.contains(":")) {
-					String subProtocol = strURI.substring(0, strURI
-							.lastIndexOf(':'));
-					sourceSSP = strURI.substring(strURI.lastIndexOf(':') + 1);
-					if (subProtocol.equals("classpath")) {
-						resolvedURL = resolveClasspathURI(sourceSSP);
-					} else {
-						URI subURI;
-						try {
-							subURI = new URI(subProtocol, sourceSSP, null);
-							resolvedURL = subURI.toURL();
-						} catch (URISyntaxException e) {
-							throw new MalformedURLException(
-									"Unable to work out sub protocol URI");
-						}
-					}
-				} else {
-					resolvedURL = sourceURI.toURL();
-				}
-			}
-			return resolvedURL;
-		
+	public void setMatcher(AbstractMatcher matcher) {
+		this.matcher = matcher;
 	}
 
 }

Added: forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/SourceNode.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/SourceNode.java?view=auto&rev=482430
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/SourceNode.java
(added)
+++ forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/locationMap/SourceNode.java
Mon Dec  4 16:34:50 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.locationMap;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import org.w3c.dom.Node;
+
+/**
+ * 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 SourceNode extends AbstractSourceNode {
+
+	public SourceNode(Node element) throws URISyntaxException, IOException {
+		super(element);
+	}
+	
+}

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

Added: forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/matcher/AbstractMatcher.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/matcher/AbstractMatcher.java?view=auto&rev=482430
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/matcher/AbstractMatcher.java
(added)
+++ forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/matcher/AbstractMatcher.java
Mon Dec  4 16:34:50 2006
@@ -0,0 +1,46 @@
+package org.apache.forrest.core.matcher;
+
+import java.net.URI;
+import java.net.URL;
+
+import org.apache.forrest.core.exception.ProcessingException;
+
+
+/**
+ * A matcher is used to match a pattern against a given 
+ * string. 
+ *
+ */
+public abstract class AbstractMatcher {
+	
+	String pattern;
+
+	/**
+	 * Get the pattern used by this mathcer.
+	 * The syntax of the pattern is dependant on the
+	 * implementation of the matcher.
+	 * @return
+	 */
+	public String getPattern() {
+		return pattern;
+	}
+
+	/**
+	 * Set the pattern used by this mathcer.
+	 * The syntax of the pattern is dependant on the
+	 * implementation of the matcher.
+	 * @param pattern
+	 */
+	public void setPattern(String pattern) {
+		this.pattern = pattern;
+	}
+
+	/**
+	 * Perform any necessary variable substitution in the
+	 * supplied sourceURI using the given requestURI to find
+	 * values for variables.
+	 * @throws ProcessingException 
+	 * 
+	 */
+	public abstract URI substituteVariables(URI requestURI, URI sourceURI) throws ProcessingException;
+}

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

Added: forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/matcher/REMatcher.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/matcher/REMatcher.java?view=auto&rev=482430
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/matcher/REMatcher.java
(added)
+++ forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/matcher/REMatcher.java
Mon Dec  4 16:34:50 2006
@@ -0,0 +1,78 @@
+package org.apache.forrest.core.matcher;
+
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.apache.forrest.core.exception.ProcessingException;
+import org.apache.forrest.core.locationMap.AbstractSourceNode;
+import org.apache.log4j.Logger;
+
+import com.sun.org.apache.regexp.internal.RE;
+import com.sun.org.apache.regexp.internal.RESyntaxException;
+
+/**
+ * An REMatcher uses a regular expression to define a match.
+ * 
+ */
+public class REMatcher extends AbstractMatcher {
+
+	Logger log = Logger.getLogger(REMatcher.class);
+
+	/**
+	 * Create an REMatcher using the supplied Regular Expression.
+	 * 
+	 * @param pattern
+	 */
+	public REMatcher(String re) {
+		this.setPattern(re);
+	}
+
+	@Override
+	public URI substituteVariables(URI requestURI, URI sourceURI)
+			throws ProcessingException {
+		URL url;
+		RE r;
+
+		try {
+			r = new RE(getPattern());
+		} catch (RESyntaxException re) {
+			throw new ProcessingException(
+					"Unable to extract variable values from request: "
+							+ re.getMessage(), re);
+		}
+
+		String urlString = requestURI.getPath();
+
+		String sourceSSP = sourceURI.getSchemeSpecificPart();
+
+		if (r.match(urlString)) {
+			String variable;
+			String value;
+			for (int i = 0; i < r.getParenCount(); i++) {
+				variable = "$(" + i + ")";
+				value = r.getParen(i);
+				if (value != null) {
+					sourceSSP = sourceSSP.replace(variable, value);
+				}
+			}
+			log.debug("After variable substitution a potential source path is "
+					+ sourceSSP);
+		} else {
+			throw new ProcessingException(
+					"Unable to extract variable values from requestURI");
+		}
+
+		URI newURI;
+		try {
+			newURI = new URI(sourceURI.getScheme(), sourceSSP, null);
+		} catch (URISyntaxException e) {
+			throw new ProcessingException(
+					"Unable to perform variable substitution on the source uri "
+							+ sourceURI + " cuased by " + e.getMessage(), e);
+		}
+		return newURI;
+	}
+
+}

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

Modified: forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/ChainedReader.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/ChainedReader.java?view=diff&rev=482430&r1=482429&r2=482430
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/ChainedReader.java
(original)
+++ forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/ChainedReader.java
Mon Dec  4 16:34:50 2006
@@ -24,7 +24,9 @@
 import org.apache.forrest.core.document.AbstractSourceDocument;
 import org.apache.forrest.core.document.DefaultSourceDocument;
 import org.apache.forrest.core.exception.ProcessingException;
-import org.apache.forrest.core.locationMap.Location;
+import org.apache.forrest.core.locationMap.AbstractSourceNode;
+import org.apache.forrest.core.locationMap.LocationNode;
+import org.apache.forrest.core.matcher.AbstractMatcher;
 
 /**
  * A chained reader implements a psuedo protocol. It is commonly used when you
@@ -55,28 +57,26 @@
 	private String docType;
 
 	public AbstractSourceDocument read(IController controller, URI requestURI,
-			final Location location, URI sourceURI) throws ProcessingException {
+			final AbstractSourceNode sourceNode, AbstractMatcher matcher)
+			throws ProcessingException {
 		DefaultSourceDocument doc = null;
-		for (URI psuedoURI: location.getSourceURIs()) {
-			final String ssp = psuedoURI.getSchemeSpecificPart();
-			URI subSourceURI;
-			try {
-				subSourceURI = new URI(ssp);
-				IReader reader;
-				reader = (IReader) controller.getReader(subSourceURI);
-				doc = (DefaultSourceDocument) reader.read(controller,
-						requestURI, location, subSourceURI);
-				if (doc != null) {
-					doc.setType(getDocType());
-					break;
-				}
-			} catch (final URISyntaxException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
-			} catch (MalformedURLException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
+		final String ssp = sourceNode.getSourceURI().getSchemeSpecificPart();
+		URI subSourceURI;
+		try {
+			subSourceURI = new URI(ssp);
+			IReader reader;
+			reader = (IReader) controller.getReader(subSourceURI);
+			doc = (DefaultSourceDocument) reader.read(controller, requestURI,
+					sourceNode, matcher);
+			if (doc != null) {
+				doc.setType(getDocType());
 			}
+		} catch (final URISyntaxException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (MalformedURLException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
 		}
 		return doc;
 	}

Modified: forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/FileReader.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/FileReader.java?view=diff&rev=482430&r1=482429&r2=482430
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/FileReader.java
(original)
+++ forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/FileReader.java
Mon Dec  4 16:34:50 2006
@@ -26,7 +26,9 @@
 import org.apache.forrest.core.document.AbstractSourceDocument;
 import org.apache.forrest.core.document.DocumentFactory;
 import org.apache.forrest.core.exception.SourceException;
-import org.apache.forrest.core.locationMap.Location;
+import org.apache.forrest.core.locationMap.AbstractSourceNode;
+import org.apache.forrest.core.locationMap.LocationNode;
+import org.apache.forrest.core.matcher.AbstractMatcher;
 
 /**
  * A File reader reads a resource using the file protocol, i.e. it will read
@@ -41,14 +43,14 @@
 	 * @see org.apache.forrest.core.reader.IReader#read(org.apache.forrest.test.core.locationMap.Location)
 	 */
 	public AbstractSourceDocument read(IController controller, URI requestURI,
-			final Location location, final URI sourceURI) {
+			final AbstractSourceNode sourceNode, AbstractMatcher matcher) {
 		AbstractSourceDocument result = null;
 		try {
-			URL resolvedURL = location.resolveURL(requestURI, sourceURI);
+			URL resolvedURL = sourceNode.resolveURL(matcher, requestURI);
 			final InputStream is = new FileInputStream(new File(resolvedURL.toURI()));
 			result = DocumentFactory.getSourceDocumentFor(requestURI, is);
 		} catch (final Exception e) {
-			if (location.isRequired())
+			if (sourceNode.isRequired())
 				throw new SourceException("Source URL is invalid", e);
 		}
 		return result;

Modified: forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/HTTPReader.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/HTTPReader.java?view=diff&rev=482430&r1=482429&r2=482430
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/HTTPReader.java
(original)
+++ forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/HTTPReader.java
Mon Dec  4 16:34:50 2006
@@ -30,7 +30,9 @@
 import org.apache.forrest.core.document.DefaultSourceDocument;
 import org.apache.forrest.core.exception.ProcessingException;
 import org.apache.forrest.core.exception.SourceException;
-import org.apache.forrest.core.locationMap.Location;
+import org.apache.forrest.core.locationMap.AbstractSourceNode;
+import org.apache.forrest.core.locationMap.LocationNode;
+import org.apache.forrest.core.matcher.AbstractMatcher;
 import org.w3c.tidy.Tidy;
 
 /**
@@ -56,12 +58,12 @@
 	 * 
 	 * @see org.apache.forrest.core.reader.IReader#read(org.apache.forrest.test.core.locationMap.Location)
 	 */
-	public AbstractSourceDocument read(IController controller,
-			final URI requestURI, final Location location, URI sourceURI)
+	public AbstractSourceDocument read(IController controller, URI requestURI,
+			final AbstractSourceNode sourceNode, AbstractMatcher matcher)
 			throws MalformedURLException, ProcessingException {
 		InputStream is;
 		DefaultSourceDocument result = null;
-		URL resolvedURL = location.resolveURL(requestURI, sourceURI);
+		URL resolvedURL = sourceNode.resolveURL(matcher, requestURI);
 		final ByteArrayOutputStream out = new ByteArrayOutputStream();
 		final GetMethod get = new GetMethod(resolvedURL.toExternalForm());
 		get.setFollowRedirects(true);
@@ -74,7 +76,7 @@
 			result = new DefaultSourceDocument(requestURI, out.toString());
 		} catch (final Exception e) {
 			result = null;
-			if (location.isRequired())
+			if (sourceNode.isRequired())
 				throw new SourceException("Source URL is invalid", e);
 		} finally {
 			get.releaseConnection();

Modified: forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/IReader.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/IReader.java?view=diff&rev=482430&r1=482429&r2=482430
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/IReader.java
(original)
+++ forrest/trunk/whiteboard/forrest2/core/src/core/org/apache/forrest/core/reader/IReader.java
Mon Dec  4 16:34:50 2006
@@ -22,7 +22,9 @@
 import org.apache.forrest.core.IController;
 import org.apache.forrest.core.document.AbstractSourceDocument;
 import org.apache.forrest.core.exception.ProcessingException;
-import org.apache.forrest.core.locationMap.Location;
+import org.apache.forrest.core.locationMap.AbstractSourceNode;
+import org.apache.forrest.core.locationMap.LocationNode;
+import org.apache.forrest.core.matcher.AbstractMatcher;
 
 public interface IReader {
 
@@ -41,14 +43,15 @@
 	 * 
 	 * @param controller - the forrest controller in use
 	 * @param requestURI - the URI being requested
-	 * @param uri - the uri we are to read the document from
-	 * @param sourceURI - the source URI we are trying to read
+	 * @param sourceNode - the source node we are trying to use to resole this document
+	 * @param matcher - the matcher that produced this source node
 	 * 
 	 * @return
 	 * @throws MalformedURLException
 	 * @throws ProcessingException 
 	 */
-	public abstract AbstractSourceDocument read(IController controller, URI requestURI, Location
location, URI sourceURI)
+	public abstract AbstractSourceDocument read(IController controller, URI requestURI,
+			final AbstractSourceNode sourceNode, AbstractMatcher matcher)
 			throws MalformedURLException, ProcessingException;
 
 }

Modified: forrest/trunk/whiteboard/forrest2/core/src/test/org/apache/forrest/test/core/TestController.java
URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/core/src/test/org/apache/forrest/test/core/TestController.java?view=diff&rev=482430&r1=482429&r2=482430
==============================================================================
--- forrest/trunk/whiteboard/forrest2/core/src/test/org/apache/forrest/test/core/TestController.java
(original)
+++ forrest/trunk/whiteboard/forrest2/core/src/test/org/apache/forrest/test/core/TestController.java
Mon Dec  4 16:34:50 2006
@@ -32,7 +32,7 @@
 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.LocationNode;
 
 public class TestController extends TestCase {
 	static final String SOURCE_DOCUMENT_XHTML2_SIMPLE = "/xdocs/samples/xhtml2/sample_simple.html";
@@ -83,7 +83,7 @@
 
 	public void testSourceURLs() throws IOException, LocationmapException,
 			ProcessingException, URISyntaxException {
-		final List<Location> sourceURLs = this.controller
+		final List<LocationNode> sourceURLs = this.controller
 				.getSourceLocations(new URI(XHTML_REQUEST_URI));
 		assertNotNull(sourceURLs);
 	}
@@ -92,7 +92,7 @@
 			URISyntaxException {
 		final AbstractSourceDocument document = this.controller
 				.getSourceDocuments(new URI(XHTML_REQUEST_URI));
-		assertNotNull(document);
+		assertNotNull("No document returned", document);
 	}
 
 	public void testInternalDocuments() throws IOException,
@@ -102,6 +102,7 @@
 		final InternalDocument internalDoc = this.controller
 				.getInternalDocument(new URI(XHTML_REQUEST_URI));
 		final AbstractSourceDocument firstSrcDoc = srcDoc;
+		assertNotNull("No internal document returned", internalDoc);
 		assertFalse(firstSrcDoc.equals(internalDoc));
 	}
 



Mime
View raw message