You are viewing a plain text version of this content. The canonical link for it is here.
Posted to portalapps-dev@portals.apache.org by wo...@apache.org on 2009/10/05 19:50:07 UTC

svn commit: r821934 [2/2] - in /portals/applications/webcontent/trunk: webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/proxy/ webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/proxy/impl/ webcontent-jar/src...

Modified: portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/proxy/impl/RewritableHttpReverseProxyServiceImpl.java
URL: http://svn.apache.org/viewvc/portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/proxy/impl/RewritableHttpReverseProxyServiceImpl.java?rev=821934&r1=821933&r2=821934&view=diff
==============================================================================
--- portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/proxy/impl/RewritableHttpReverseProxyServiceImpl.java (original)
+++ portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/proxy/impl/RewritableHttpReverseProxyServiceImpl.java Mon Oct  5 17:50:07 2009
@@ -26,6 +26,7 @@
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.List;
+import java.util.Map;
 import java.util.zip.GZIPInputStream;
 import java.util.zip.GZIPOutputStream;
 
@@ -67,6 +68,8 @@
 import org.apache.http.protocol.HTTP;
 import org.apache.http.util.EntityUtils;
 import org.apache.portals.applications.webcontent.proxy.HttpReverseProxyConstants;
+import org.apache.portals.applications.webcontent.proxy.HttpReverseProxyException;
+import org.apache.portals.applications.webcontent.proxy.HttpReverseProxyNotFoundException;
 import org.apache.portals.applications.webcontent.proxy.HttpReverseProxyPathMapper;
 import org.apache.portals.applications.webcontent.proxy.HttpReverseProxyPathMapperProvider;
 import org.apache.portals.applications.webcontent.proxy.HttpReverseProxyService;
@@ -173,7 +176,7 @@
         }
     }
     
-    public void invoke(HttpServletRequest request, HttpServletResponse response) throws IOException
+    public void invoke(HttpServletRequest request, HttpServletResponse response) throws HttpReverseProxyException, IOException
     {
         // proxyPathMapper can be injected by using request attribute.
         HttpReverseProxyPathMapper proxyPathMapper = (HttpReverseProxyPathMapper) request.getAttribute(HttpReverseProxyConstants.PATH_MAPPER);
@@ -192,7 +195,7 @@
         
         if (proxyPathMapper == null)
         {
-            throw new IOException("Proxy configuration is not defined for " + localPathInfo);
+            throw new HttpReverseProxyNotFoundException("Proxy configuration is not defined for " + localPathInfo);
         }
         
         if (hostHeaderValue == null)
@@ -211,7 +214,7 @@
         
         if (proxyTargetURL == null)
         {
-            throw new IllegalStateException("Cannot translate the location path info into remote URL. " + localPathInfo);
+            throw new HttpReverseProxyNotFoundException("Cannot translate the location path info into remote URL. " + localPathInfo);
         }
         
         String queryString = request.getQueryString();
@@ -275,7 +278,7 @@
         }
         else
         {
-            throw new IOException("Unsupported method: " + method);
+            throw new HttpReverseProxyException("Unsupported method: " + method);
         }
         
         // set sso credentials if available
@@ -321,6 +324,16 @@
             }
         }
         
+        Map<String, String> defaultRequestHeaders = proxyPathMapper.getDefaultRequestHeaders();
+        
+        if (defaultRequestHeaders != null)
+        {
+            for (Map.Entry<String, String> entry : defaultRequestHeaders.entrySet())
+            {
+                httpRequest.setHeader(entry.getKey(), entry.getValue());
+            }
+        }
+        
         HttpEntity httpEntity = null;
         
         try
@@ -344,7 +357,7 @@
                 
                 if (location == null)
                 {
-                    throw new IOException("Recieved status code: " + statusCode + " but no " + HttpReverseProxyConstants.HTTP_HEADER_LOCATION + " header was found in the response");
+                    throw new HttpReverseProxyException("Recieved status code is " + statusCode + " but no " + HttpReverseProxyConstants.HTTP_HEADER_LOCATION + " header was found in the response");
                 }
                 
                 // Modify the redirect to go to this proxy servlet rather that the proxied host
@@ -407,12 +420,33 @@
                 
                 if (httpEntity != null)
                 {
+                    boolean rewritable = false;
+                    Rewriter rewriter = null;
+                    ParserAdaptor parserAdaptor = null;
+                    
+                    RewriterController rewriterController = proxyPathMapperProvider.getRewriterController(proxyPathMapper);
+                    
+                    if (rewriterController != null)
+                    {
+                        parserAdaptor = createParserAdaptor(rewriterController, httpEntity);
+                        
+                        if (parserAdaptor != null)
+                        {
+                            rewriter = createRewriter(rewriterController, proxyPathMapper);
+                            rewritable = (rewriter != null);
+                        }
+                    }
+                    
                     // Pass response headers back to the client
                     Header [] headerArrayResponse = httpResponse.getAllHeaders();
                     
                     for (Header header : headerArrayResponse)
                     {
                         String headerName = header.getName();
+                        
+                        if (rewritable && StringUtils.equalsIgnoreCase(headerName, HTTP.CONTENT_LEN))
+                            continue;
+                        
                         String headerValue = header.getValue();
                         
                         if (StringUtils.equalsIgnoreCase(headerName, HTTP.TARGET_HOST))
@@ -432,10 +466,26 @@
                     }
                     
                     // Send the content to the client
-                    writeHttpEntityToClient(request, response, httpEntity, proxyPathMapper, rewriterContextPath, localPathInfo);
+                    writeHttpEntityToClient(response, httpEntity, proxyPathMapper, rewriterContextPath, localPathInfo, rewriter, parserAdaptor);
                 }
             }
         }
+        catch (IOException e)
+        {
+            if (log.isDebugEnabled())
+            {
+                log.error("IOException occurred during execution for " + proxyTargetURL, e);
+            }
+            else
+            {
+                log.error("IOException occurred during execution for {} {}", proxyTargetURL, e);
+            }
+            
+            httpRequest.abort();
+            httpEntity = null;
+            
+            throw e;
+        }
         catch (Exception e)
         {
             if (log.isDebugEnabled())
@@ -450,7 +500,7 @@
             httpRequest.abort();
             httpEntity = null;
             
-            throw new IOException(e.toString());
+            throw new HttpReverseProxyException(e);
         }
         finally
         {
@@ -461,11 +511,13 @@
         }
     }
     
-    private void writeHttpEntityToClient(HttpServletRequest request, HttpServletResponse response, 
+    private void writeHttpEntityToClient(HttpServletResponse response, 
                                          HttpEntity httpEntity, 
                                          HttpReverseProxyPathMapper proxyPathMapper, 
                                          String rewriterContextPath,
-                                         String localPathInfo) throws IOException
+                                         String localPathInfo,
+                                         Rewriter rewriter,
+                                         ParserAdaptor parserAdaptor) throws Exception
     {
         InputStream in = null;
         Reader reader = null;
@@ -481,127 +533,48 @@
             if (in != null)
             {
                 out = response.getOutputStream();
-
-                RewriterController rewriterController = proxyPathMapperProvider.getRewriterController(proxyPathMapper);
-                Rewriter rewriter = null;
                 
-                if (rewriterController != null)
-                {
-                    Ruleset rewriterRuleset = proxyPathMapperProvider.getRewriterRuleset(proxyPathMapper);
-                    
-                    if (rewriterRuleset == null)
-                    {
-                        rewriter = rewriterController.createRewriter();
-                    }
-                    else
-                    {
-                        rewriter = rewriterController.createRewriter(rewriterRuleset);
-                    }
-                }
-                
-                if (rewriterController == null || rewriter == null)
+                if (rewriter == null || parserAdaptor == null)
                 {
                     IOUtils.copy(in, out);
                     out.flush();
                 }
                 else
                 {
-                    String mimeType = "text/html";
-                    String contentType = null;
-                    Header contentTypeHeader = httpEntity.getContentType();
+                    boolean gzipEncoded = false;
+                    Header contentEncodingHeader = httpEntity.getContentEncoding();
                     
-                    if (contentTypeHeader != null)
+                    if (contentEncodingHeader != null)
                     {
-                        contentType = contentTypeHeader.getValue();
+                        gzipEncoded = StringUtils.equalsIgnoreCase("gzip", contentEncodingHeader.getValue());
                     }
                     
-                    if (contentType != null)
+                    if (parserAdaptor instanceof ReverseProxyRewritingContextAware)
                     {
-                        int offset = contentType.indexOf(';');
-                        
-                        if (offset > 0)
-                        {
-                            mimeType = contentType.substring(0, offset).trim();
-                        }
-                        else
-                        {
-                            mimeType = contentType;
-                        }
+                        ReverseProxyRewritingContext rewritingContext = 
+                            new DefaultReverseProxyRewritingContext(proxyPathMapper, proxyPathMapperProvider, rewriterContextPath);
+                        ((ReverseProxyRewritingContextAware) parserAdaptor).setReverseProxyRewritingContext(rewritingContext);
                     }
                     
-                    ParserAdaptor parserAdaptor = null;
+                    String responseCharSet = EntityUtils.getContentCharSet(httpEntity);
                     
-                    try
+                    if (responseCharSet != null)
                     {
-                        parserAdaptor = rewriterController.createParserAdaptor(mimeType);
-                    }
-                    catch (Exception e)
-                    {
-                        if (log.isDebugEnabled())
-                        {
-                            log.error("Failed to create parser adaptor.", e);
-                        }
-                        else
-                        {
-                            log.error("Failed to create parser adaptor. {}", e.toString());
-                        }
-                    }
-                    
-                    if (parserAdaptor == null)
-                    {
-                        IOUtils.copy(in, out);
-                        out.flush();
+                        reader = new InputStreamReader(gzipEncoded ? new GZIPInputStream(in) : in, responseCharSet);
+                        writer = new OutputStreamWriter(gzipEncoded ? new GZIPOutputStream(out) : out, responseCharSet);
                     }
                     else
                     {
-                        boolean gzipEncoded = false;
-                        Header contentEncodingHeader = httpEntity.getContentEncoding();
-                        
-                        if (contentEncodingHeader != null)
-                        {
-                            gzipEncoded = StringUtils.equalsIgnoreCase("gzip", contentEncodingHeader.getValue());
-                        }
-                        
-                        if (parserAdaptor instanceof ReverseProxyRewritingContextAware)
-                        {
-                            ReverseProxyRewritingContext rewritingContext = 
-                                new DefaultReverseProxyRewritingContext(proxyPathMapper, proxyPathMapperProvider, rewriterContextPath);
-                            ((ReverseProxyRewritingContextAware) parserAdaptor).setReverseProxyRewritingContext(rewritingContext);
-                        }
-                        
-                        String responseCharSet = EntityUtils.getContentCharSet(httpEntity);
-                        
-                        if (responseCharSet != null)
-                        {
-                            reader = new InputStreamReader(gzipEncoded ? new GZIPInputStream(in) : in, responseCharSet);
-                            writer = new OutputStreamWriter(gzipEncoded ? new GZIPOutputStream(out) : out, responseCharSet);
-                        }
-                        else
-                        {
-                            reader = new InputStreamReader(gzipEncoded ? new GZIPInputStream(in) : in);
-                            writer = new OutputStreamWriter(gzipEncoded ? new GZIPOutputStream(out) : out);
-                        }
-                        
-                        rewriter.setBaseUrl(rewriterContextPath + localPathInfo);
-                        rewriter.rewrite(parserAdaptor, reader, writer);
-                        writer.flush();
+                        reader = new InputStreamReader(gzipEncoded ? new GZIPInputStream(in) : in);
+                        writer = new OutputStreamWriter(gzipEncoded ? new GZIPOutputStream(out) : out);
                     }
+                    
+                    rewriter.setBaseUrl(rewriterContextPath + localPathInfo);
+                    rewriter.rewrite(parserAdaptor, reader, writer);
+                    writer.flush();
                 }
             }
         }
-        catch (Exception e)
-        {
-            if (log.isDebugEnabled())
-            {
-                log.error("Exception occurred during writing content.", e);
-            }
-            else
-            {
-                log.error("Exception occurred during writing content. {}", e.toString());
-            }
-
-            throw new IOException(e.getLocalizedMessage());
-        }
         finally
         {
             if (reader != null)
@@ -623,6 +596,46 @@
         }
     }
     
+    private Rewriter createRewriter(RewriterController rewriterController, HttpReverseProxyPathMapper proxyPathMapper) throws Exception
+    {
+        Ruleset rewriterRuleset = proxyPathMapperProvider.getRewriterRuleset(proxyPathMapper);
+        
+        if (rewriterRuleset == null)
+        {
+            return rewriterController.createRewriter();
+        }
+        else
+        {
+            return rewriterController.createRewriter(rewriterRuleset);
+        }
+    }
+    
+    private ParserAdaptor createParserAdaptor(RewriterController rewriterController, HttpEntity httpEntity) throws Exception
+    {
+        String contentType = null;
+        Header contentTypeHeader = httpEntity.getContentType();
+        
+        if (contentTypeHeader != null)
+        {
+            contentType = contentTypeHeader.getValue();
+        }
+        
+        if (contentType == null)
+        {
+            return null;
+        }
+
+        String mimeType = contentType;
+        int offset = mimeType.indexOf(';');
+            
+        if (offset > 0)
+        {
+            mimeType = mimeType.substring(0, offset).trim();
+        }
+        
+        return rewriterController.createParserAdaptor(mimeType);
+    }
+    
     private List<SSOSiteCredentials> getSSOSiteCredentials(String siteURL, DefaultHttpClient httpClient, HttpServletRequest request)
     {
         SSOSiteCredentialsProvider credsProvider = (SSOSiteCredentialsProvider) request.getAttribute(HttpReverseProxyConstants.SSO_SITE_CREDENTIALS_PROVIDER);

Added: portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/AbstractTextLinesParserAdaptor.java
URL: http://svn.apache.org/viewvc/portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/AbstractTextLinesParserAdaptor.java?rev=821934&view=auto
==============================================================================
--- portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/AbstractTextLinesParserAdaptor.java (added)
+++ portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/AbstractTextLinesParserAdaptor.java Mon Oct  5 17:50:07 2009
@@ -0,0 +1,74 @@
+/*
+ * 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.portals.applications.webcontent.rewriter;
+
+import java.io.BufferedWriter;
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.io.Writer;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.LineIterator;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * AbstractTextLinesParserAdaptor
+ * 
+ * @version $Id$
+ */
+public abstract class AbstractTextLinesParserAdaptor implements ParserAdaptor
+{
+
+    private static Logger log = LoggerFactory.getLogger(AbstractTextLinesParserAdaptor.class);
+    
+    public void rewrite(Rewriter rewriter, Reader reader, Writer writer) throws RewriterException
+    {
+        PrintWriter out = new PrintWriter(new BufferedWriter(writer));
+        
+        for (LineIterator lineIt = IOUtils.lineIterator(reader); lineIt.hasNext(); )
+        {
+            String line = lineIt.nextLine();
+            
+            if (!StringUtils.isBlank(line))
+            {
+                try 
+                {
+                    line = rewriteLine(line);
+                }
+                catch (Exception e)
+                {
+                    log.warn("Error during {}: {}", "replacement", e);
+                }
+            }
+            
+            out.println(line);
+        }
+        
+        out.flush();
+    }
+    
+    protected abstract String rewriteLine(String line) throws Exception;
+    
+    public void parse(Rewriter rewriter, Reader reader) throws RewriterException
+    {
+        throw new UnsupportedOperationException("Text lines parser adaptor does not support parse() method.");
+    }
+    
+}

Propchange: portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/AbstractTextLinesParserAdaptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/AbstractTextLinesParserAdaptor.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/AbstractTextLinesParserAdaptor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingClasspathRewriterController.java
URL: http://svn.apache.org/viewvc/portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingClasspathRewriterController.java?rev=821934&r1=821933&r2=821934&view=diff
==============================================================================
--- portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingClasspathRewriterController.java (original)
+++ portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingClasspathRewriterController.java Mon Oct  5 17:50:07 2009
@@ -21,6 +21,7 @@
 import java.io.InputStreamReader;
 import java.io.Reader;
 import java.util.List;
+import java.util.Map;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,6 +43,12 @@
     {
         super(mappingFile);
     }
+    
+    public MappingClasspathRewriterController( String mappingFile, Class basicRewriterClass, Class ruleBasedRewriterClass, Map<String, Class> adaptorMimeTypeClassMap )
+            throws RewriterException
+    {
+        super(mappingFile, basicRewriterClass, ruleBasedRewriterClass, adaptorMimeTypeClassMap);
+    }
 
     public MappingClasspathRewriterController( String mappingFile, List rewriterClasses, List adaptorClasses )
             throws RewriterException

Modified: portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingRewriterController.java
URL: http://svn.apache.org/viewvc/portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingRewriterController.java?rev=821934&r1=821933&r2=821934&view=diff
==============================================================================
--- portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingRewriterController.java (original)
+++ portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingRewriterController.java Mon Oct  5 17:50:07 2009
@@ -19,6 +19,7 @@
 import java.io.File;
 import java.io.InputStream;
 import java.io.Reader;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -28,6 +29,7 @@
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 
+import org.apache.commons.beanutils.BeanUtils;
 import org.apache.portals.applications.webcontent.rewriter.html.SwingParserAdaptor;
 import org.apache.portals.applications.webcontent.rewriter.rules.Ruleset;
 import org.apache.portals.applications.webcontent.rewriter.xml.SaxParserAdaptor;
@@ -65,13 +67,22 @@
 
     /** configured basic rewriter class */
     protected Class basicRewriterClass = BasicRewriter.class;
-
+    
     /** configured ruleset rewriter class */
     protected Class rulesetRewriterClass = RulesetRewriterImpl.class;
 
     /** Adaptors */
     protected Map<String, Class> parserAdaptorMimeTypeClassMap;
-
+    
+    /** Basic rewriter instance properties */
+    protected Map<String, Object> basicRewriterProps;
+    
+    /** Ruleset rewriter instance properties */
+    protected Map<String, Object> rulesetRewriterProps;
+    
+    /** Parser adaptor rewriter instance properties map */
+    protected Map<String, Map<String, Object>> parserAdaptorMimeTypePropsMap;
+    
     public MappingRewriterController( String mappingFile ) throws RewriterException
     {
         this.mappingFile = mappingFile;
@@ -181,7 +192,24 @@
 
     public Rewriter createRewriter() throws InstantiationException, IllegalAccessException
     {
-        return (Rewriter) basicRewriterClass.newInstance();
+        Rewriter rewriter = (Rewriter) basicRewriterClass.newInstance();
+        
+        try
+        {
+            if (basicRewriterProps != null)
+            {
+                for (Map.Entry<String, Object> entry : basicRewriterProps.entrySet())
+                {
+                    BeanUtils.setProperty(rewriter, entry.getKey(), entry.getValue());
+                }
+            }
+        }
+        catch (InvocationTargetException e)
+        {
+            throw new RuntimeException(e);
+        }
+        
+        return rewriter;
     }
 
     public RulesetRewriter createRewriter( Ruleset ruleset ) throws RewriterException
@@ -190,6 +218,22 @@
         {
             RulesetRewriter rewriter = (RulesetRewriter) rulesetRewriterClass.newInstance();
             rewriter.setRuleset(ruleset);
+            
+            try
+            {
+                if (rulesetRewriterProps != null)
+                {
+                    for (Map.Entry<String, Object> entry : rulesetRewriterProps.entrySet())
+                    {
+                        BeanUtils.setProperty(rewriter, entry.getKey(), entry.getValue());
+                    }
+                }
+            }
+            catch (InvocationTargetException e)
+            {
+                throw new RuntimeException(e);
+            }
+            
             return rewriter;
         }
         catch (Exception e)
@@ -203,12 +247,35 @@
     {
         try
         {
+            ParserAdaptor parserAdaptor = null;
             Class parserAdaptorClass = parserAdaptorMimeTypeClassMap.get(mimeType);
             
             if (parserAdaptorClass != null)
             {
-                return (ParserAdaptor) parserAdaptorClass.newInstance();
+                parserAdaptor = (ParserAdaptor) parserAdaptorClass.newInstance();
+            
+                try
+                {
+                    if (parserAdaptorMimeTypePropsMap != null)
+                    {
+                        Map<String, Object> parserAdaptorProps = parserAdaptorMimeTypePropsMap.get(mimeType);
+                        
+                        if (parserAdaptorProps != null)
+                        {
+                            for (Map.Entry<String, Object> entry : parserAdaptorProps.entrySet())
+                            {
+                                BeanUtils.setProperty(parserAdaptor, entry.getKey(), entry.getValue());
+                            }
+                        }
+                    }
+                }
+                catch (InvocationTargetException e)
+                {
+                    throw new RuntimeException(e);
+                }
             }
+            
+            return parserAdaptor;
         }
         catch (Exception e)
         {
@@ -229,17 +296,28 @@
             throw new RewriterException("The mapping file is not set.");
         }
         
-        File file = new File(this.mappingFile);
-        
-        if (!file.isFile())
-        {
-            throw new RewriterException("The mapping file is not available: " + this.mappingFile);
-        }
+        Reader reader = getReader(this.mappingFile);
         
         try
         {
-            this.mapper = new Mapping();
-            this.mapper.loadMapping(file.toURL());
+            if (reader == null && this.mappingFile != null)
+            {
+                File file = new File(this.mappingFile);
+                
+                if (!file.isFile())
+                {
+                    throw new RewriterException("The mapping file is not available: " + this.mappingFile);
+                }
+                
+                this.mapper = new Mapping();
+                this.mapper.loadMapping(file.toURL());
+            }
+            else
+            {
+                InputSource is = new InputSource(reader);
+                is.setSystemId(this.mappingFile);
+                this.mapper.loadMapping(is);
+            }
         }
         catch (Exception e)
         {
@@ -307,5 +385,40 @@
 
         return ruleset;
     }
+    
+    public Map<String, Object> getBasicRewriterProps()
+    {
+        return basicRewriterProps;
+    }
+    
+    public void setBasicRewriterProps(Map<String, Object> props)
+    {
+        basicRewriterProps = props;
+    }
+    
+    public Map<String, Object> getRulesetRewriterProps()
+    {
+        return rulesetRewriterProps;
+    }
+    
+    public void setRulesetRewriterProps(Map<String, Object> props)
+    {
+        rulesetRewriterProps = props;
+    }
+    
+    public Map<String, Map<String, Object>> getParserAdaptorMimeTypePropsMap()
+    {
+        return parserAdaptorMimeTypePropsMap;
+    }
+    
+    public void setParserAdaptorMimeTypePropsMap(Map<String, Map<String, Object>> propsMap)
+    {
+        parserAdaptorMimeTypePropsMap = propsMap;
+    }
+    
+    protected Reader getReader(String resourcePath) throws RewriterException
+    {
+        return null;
+    }
 
 }
\ No newline at end of file

Modified: portals/applications/webcontent/trunk/webcontent-jar/src/test/java/org/apache/portals/applications/webcontent/proxy/TestProxyPathMappings.java
URL: http://svn.apache.org/viewvc/portals/applications/webcontent/trunk/webcontent-jar/src/test/java/org/apache/portals/applications/webcontent/proxy/TestProxyPathMappings.java?rev=821934&r1=821933&r2=821934&view=diff
==============================================================================
--- portals/applications/webcontent/trunk/webcontent-jar/src/test/java/org/apache/portals/applications/webcontent/proxy/TestProxyPathMappings.java (original)
+++ portals/applications/webcontent/trunk/webcontent-jar/src/test/java/org/apache/portals/applications/webcontent/proxy/TestProxyPathMappings.java Mon Oct  5 17:50:07 2009
@@ -35,7 +35,7 @@
  */
 public class TestProxyPathMappings extends TestCase
 {
-    private HttpReverseProxyPathMapperProvider pathMapperProvider;
+    private DefaultHttpReverseProxyPathMapperProviderImpl pathMapperProvider;
     
     @Override
     public void setUp()
@@ -43,9 +43,13 @@
         Map<HttpReverseProxyPathMapper, RewriterController> rewriterControllerMap = new HashMap<HttpReverseProxyPathMapper, RewriterController>();
         Map<HttpReverseProxyPathMapper, Ruleset> rewriterRulesetMap = new HashMap<HttpReverseProxyPathMapper, Ruleset>();
         List<HttpReverseProxyPathMapper> proxyPathMappers = new ArrayList<HttpReverseProxyPathMapper>();
-        proxyPathMappers.add(new DefaultHttpReverseProxyPathMapperImpl("localhost", "/localhost/", "http://www.localhost.com/"));
-        proxyPathMappers.add(new DefaultHttpReverseProxyPathMapperImpl("apache", "/*_apache/", "http://$1.apache.org/"));
+        proxyPathMappers.add(new DefaultHttpReverseProxyPathMapperImpl("localhost", "/localhost/", "http://www.localhost.com/", null));
+        proxyPathMappers.add(new DefaultHttpReverseProxyPathMapperImpl("localhost1", "/localhost/path1/", "http://www.localhost.com/path1/", null));
+        proxyPathMappers.add(new DefaultHttpReverseProxyPathMapperImpl("localhost2", "/localhost/path1/path2/", "http://www.localhost.com/path1/path2/", null));
+        proxyPathMappers.add(new DefaultHttpReverseProxyPathMapperImpl("apache", "/*_apache/", "http://$1.apache.org/", null));
+        proxyPathMappers.add(new DefaultHttpReverseProxyPathMapperImpl("apache", "/*.google.*/", "http://$1.google.$2/", null));
         pathMapperProvider = new DefaultHttpReverseProxyPathMapperProviderImpl(proxyPathMappers, rewriterControllerMap, rewriterRulesetMap);
+        pathMapperProvider.setMaxMatchingPathPartCount(3);
     }
     
     public void testProxyPathMappings() throws Exception
@@ -80,8 +84,26 @@
         mapper = pathMapperProvider.findMapperByRemoteURL("http://portals.apache.org/index.html");
         assertEquals("/portals_apache/", mapper.getLocalBasePath());
         
+        mapper = pathMapperProvider.findMapperByRemoteURL("http://www.localhost.com/path1/path2/index.html");
+        assertEquals("/localhost/path1/path2/", mapper.getLocalBasePath());
+        
+        mapper = pathMapperProvider.findMapperByRemoteURL("http://www.localhost.com/path1/index.html");
+        assertEquals("/localhost/path1/", mapper.getLocalBasePath());
+        
         mapper = pathMapperProvider.findMapperByRemoteURL("http://www.localhost.com/index.html");
         assertEquals("/localhost/", mapper.getLocalBasePath());
+        
+        mapper = pathMapperProvider.findMapperByRemoteURL("http://www.localhost.com/path2/index.html");
+        assertEquals("/localhost/", mapper.getLocalBasePath());
+        
+        mapper = pathMapperProvider.findMapperByRemoteURL("http://www.localhost.com");
+        assertEquals("/localhost/", mapper.getLocalBasePath());
+        
+        mapper = pathMapperProvider.findMapperByRemoteURL("http://www.google.com/");
+        assertEquals("/www.google.com/", mapper.getLocalBasePath());
+        
+        mapper = pathMapperProvider.findMapperByRemoteURL("http://images.google.com/query?q=1/");
+        assertEquals("/images.google.com/", mapper.getLocalBasePath());
     }
     
 }

Modified: portals/applications/webcontent/trunk/webcontent-jar/src/test/java/org/apache/portals/applications/webcontent/proxy/TestReverseProxyLinkRewritingParserAaptor.java
URL: http://svn.apache.org/viewvc/portals/applications/webcontent/trunk/webcontent-jar/src/test/java/org/apache/portals/applications/webcontent/proxy/TestReverseProxyLinkRewritingParserAaptor.java?rev=821934&r1=821933&r2=821934&view=diff
==============================================================================
--- portals/applications/webcontent/trunk/webcontent-jar/src/test/java/org/apache/portals/applications/webcontent/proxy/TestReverseProxyLinkRewritingParserAaptor.java (original)
+++ portals/applications/webcontent/trunk/webcontent-jar/src/test/java/org/apache/portals/applications/webcontent/proxy/TestReverseProxyLinkRewritingParserAaptor.java Mon Oct  5 17:50:07 2009
@@ -30,7 +30,7 @@
 import org.apache.portals.applications.webcontent.proxy.impl.DefaultHttpReverseProxyPathMapperImpl;
 import org.apache.portals.applications.webcontent.proxy.impl.DefaultHttpReverseProxyPathMapperProviderImpl;
 import org.apache.portals.applications.webcontent.proxy.impl.DefaultReverseProxyRewritingContext;
-import org.apache.portals.applications.webcontent.proxy.impl.PassMappingLinkRewritingParserAaptor;
+import org.apache.portals.applications.webcontent.proxy.impl.DefaultReverseProxyLinkRewritingParserAaptor;
 import org.apache.portals.applications.webcontent.rewriter.RewriterController;
 import org.apache.portals.applications.webcontent.rewriter.rules.Ruleset;
 import org.slf4j.Logger;
@@ -66,8 +66,8 @@
     @Override
     public void setUp()
     {
-        apacheProxyPathMapper = new DefaultHttpReverseProxyPathMapperImpl("apache", "/*_apache/", "http://$1.apache.org/");
-        localhostProxyPathMapper = new DefaultHttpReverseProxyPathMapperImpl("localhost", "/localhost/", "http://www.localhost.com/");
+        apacheProxyPathMapper = new DefaultHttpReverseProxyPathMapperImpl("apache", "/*_apache/", "http://$1.apache.org/", null);
+        localhostProxyPathMapper = new DefaultHttpReverseProxyPathMapperImpl("localhost", "/localhost/", "http://www.localhost.com/", null);
         
         Map<HttpReverseProxyPathMapper, RewriterController> rewriterControllerMap = new HashMap<HttpReverseProxyPathMapper, RewriterController>();
         Map<HttpReverseProxyPathMapper, Ruleset> rewriterRulesetMap = new HashMap<HttpReverseProxyPathMapper, Ruleset>();
@@ -85,7 +85,7 @@
                                                     proxyPathMapperProvider, 
                                                     "/webcontent/rproxy");
         
-        PassMappingLinkRewritingParserAaptor parserAdaptor = new PassMappingLinkRewritingParserAaptor();
+        DefaultReverseProxyLinkRewritingParserAaptor parserAdaptor = new DefaultReverseProxyLinkRewritingParserAaptor();
         parserAdaptor.setReverseProxyRewritingContext(rewritingContext);
         
         StringReader reader = new StringReader(html);

Modified: portals/applications/webcontent/trunk/webcontent-war/src/main/webapp/WEB-INF/conf/reverseproxy.properties
URL: http://svn.apache.org/viewvc/portals/applications/webcontent/trunk/webcontent-war/src/main/webapp/WEB-INF/conf/reverseproxy.properties?rev=821934&r1=821933&r2=821934&view=diff
==============================================================================
--- portals/applications/webcontent/trunk/webcontent-war/src/main/webapp/WEB-INF/conf/reverseproxy.properties (original)
+++ portals/applications/webcontent/trunk/webcontent-war/src/main/webapp/WEB-INF/conf/reverseproxy.properties Mon Oct  5 17:50:07 2009
@@ -68,7 +68,11 @@
 
 # Proxy Pass Reverse Mapping configurations for each category
 # ... Put the path item names here. Each path item will be evaluated by the order. 
-proxy.reverse.pass = apache, localhost, somewhere 
+proxy.reverse.pass = apache, localhost, somewhere
+# ... Set cache count of proxy path mappers which are dynamically created by glob style mappings.
+proxy.reverse.pass.dynamicProxyPathMapperCacheCount = 1000
+# ... Set max matching path part count
+proxy.reverse.pass.maxMatchingPathPartCount = 2
 
 # ... Sets detail attributes for each path item.
 
@@ -76,11 +80,9 @@
 proxy.reverse.pass.apache.remote = http://$1.apache.org/
 proxy.reverse.pass.apache.rewriter.basic = org.apache.portals.applications.webcontent.rewriter.WebContentRewriter
 proxy.reverse.pass.apache.rewriter.parserAdaptor = html
-# ... SimpleLinkRewritingParserAaptor rewrites links only based on its remote base URLs,
-# ... while PassMappingLinkRewritingParserAaptor rewrites links based on all reverse proxy pass mappings.
-#proxy.reverse.pass.apache.rewriter.parserAdaptor.html = org.apache.portals.applications.webcontent.proxy.impl.SimpleLinkRewritingParserAaptor
-proxy.reverse.pass.apache.rewriter.parserAdaptor.html = org.apache.portals.applications.webcontent.proxy.impl.PassMappingLinkRewritingParserAaptor
+proxy.reverse.pass.apache.rewriter.parserAdaptor.html = org.apache.portals.applications.webcontent.proxy.impl.DefaultReverseProxyLinkRewritingParserAaptor
 proxy.reverse.pass.apache.rewriter.parserAdaptor.html.mimeType = text/html
+proxy.reverse.pass.apache.rewriter.parserAdaptor.html.property.lookUpAllMappings = true
 
 proxy.reverse.pass.localhost.local = /localhost/
 proxy.reverse.pass.localhost.remote = http://localhost:8080/
@@ -98,3 +100,5 @@
 proxy.reverse.pass.somewhere.rewriter.parserAdaptor.xml.mimeType = text/xml
 proxy.reverse.pass.somewhere.rewriter.ruleMappings = /WEB-INF/conf/rewriter-rules-mapping.xml
 proxy.reverse.pass.somewhere.rewriter.rules = /WEB-INF/conf/default-rewriter-rules.xml
+proxy.reverse.pass.somewhere.request.header.Accept-Language = en
+proxy.reverse.pass.somewhere.request.header.X-Custom-Header = A custom value