Author: rgardler
Date: Mon Nov 20 08:33:34 2006
New Revision: 477242

URL: http://svn.apache.org/viewvc?view=rev&rev=477242
Log:
Enable variable substitution in location URIs

Modified:
    
forrest/trunk/whiteboard/forrest2/src/core/org/apache/forrest/core/locationMap/Location.java

Modified: 
forrest/trunk/whiteboard/forrest2/src/core/org/apache/forrest/core/locationMap/Location.java
URL: 
http://svn.apache.org/viewvc/forrest/trunk/whiteboard/forrest2/src/core/org/apache/forrest/core/locationMap/Location.java?view=diff&rev=477242&r1=477241&r2=477242
==============================================================================
--- 
forrest/trunk/whiteboard/forrest2/src/core/org/apache/forrest/core/locationMap/Location.java
 (original)
+++ 
forrest/trunk/whiteboard/forrest2/src/core/org/apache/forrest/core/locationMap/Location.java
 Mon Nov 20 08:33:34 2006
@@ -22,10 +22,14 @@
 import java.net.URISyntaxException;
 import java.net.URL;
 
+import org.apache.forrest.core.exception.ProcessingException;
 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
@@ -108,13 +112,47 @@
         * 
         * @return
         * @throws MalformedURLException
+        * @throws ProcessingException
         */
-       public URL getResolvedSourceURL() throws MalformedURLException {
+       public URL getResolvedSourceURL(URI requestURI)
+                       throws MalformedURLException, ProcessingException {
+
+               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();
+
+               RE r;
+               String sourcePath = this.getSourceURI().getPath();
+               try {
+                       r = new RE(getRequestPattern());
+               } catch (RESyntaxException re) {
+                       throw new ProcessingException(
+                                       "Unable to extract variable values from 
request: "
+                                                       + re.getMessage(), re);
+               }
+
+               if (r.match(urlString)) {
+                       String variable;
+                       String value;
+                       for (int i = 0; i < r.getParenCount(); i++) {
+                               variable = "$(" + i + ")";
+                               value = r.getParen(i);
+                               sourcePath = sourcePath.replace(variable, 
value);
+                       }
+               } else {
+                       throw new ProcessingException(
+                                       "Unable to extract variable values from 
requestURI");
+               }
+
                URI uri = getSourceURI();
                URL resourceURL;
-               final String sourcePath;
                if (uri.getScheme().equals("classpath")) {
-                       sourcePath = uri.getPath();
                        resourceURL = resolveClasspathURI(sourcePath);
                } else {
                        String strURI = uri.getSchemeSpecificPart();
@@ -164,8 +202,9 @@
        }
 
        /**
-        * Get the scheme used for retrieving this resource.
-        * The scheme will be the first protocol in the source URI.
+        * Get the scheme used for retrieving this resource. The scheme will be 
the
+        * first protocol in the source URI.
+        * 
         * @return
         */
        public String getScheme() {