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/09/30 10:56:28 UTC

svn commit: r820217 - in /portals/applications/webcontent/trunk: webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/proxy/impl/ webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/ webcontent-war/src/ma...

Author: woonsan
Date: Wed Sep 30 08:56:28 2009
New Revision: 820217

URL: http://svn.apache.org/viewvc?rev=820217&view=rev
Log:
APA-17: Generalize more on rewriter configurations.

Modified:
    portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/proxy/impl/DefaultHttpReverseProxyServlet.java
    portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/rewriter/MappingRewriterController.java
    portals/applications/webcontent/trunk/webcontent-war/src/main/webapp/WEB-INF/conf/reverseproxy.properties

Modified: portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/proxy/impl/DefaultHttpReverseProxyServlet.java
URL: http://svn.apache.org/viewvc/portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/proxy/impl/DefaultHttpReverseProxyServlet.java?rev=820217&r1=820216&r2=820217&view=diff
==============================================================================
--- portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/proxy/impl/DefaultHttpReverseProxyServlet.java (original)
+++ portals/applications/webcontent/trunk/webcontent-jar/src/main/java/org/apache/portals/applications/webcontent/proxy/impl/DefaultHttpReverseProxyServlet.java Wed Sep 30 08:56:28 2009
@@ -150,27 +150,23 @@
                 
                 proxyPathMappers.add(new DefaultHttpProxyPathMapperImpl(localBasePath, remoteBaseURL));
                 
-                String [] rewriterClassNames = pathPassConf.getStringArray("rewriters");
-                String [] rewriterRuleConfs = pathPassConf.getStringArray("rules");
-                String [] adaptorClassNames = pathPassConf.getStringArray("adaptors");
+                Configuration rewritersConf = pathPassConf.subset("rewriter");
                 
-                int rewriterRuleConfsLength = ArrayUtils.getLength(rewriterRuleConfs);
-                
-                if (rewriterRuleConfsLength > 0)
+                if (!rewritersConf.isEmpty())
                 {
-                    RewriterController rewriterController = createRewriterController(rewriterRuleConfs[0], rewriterClassNames, adaptorClassNames);
+                    RewriterController rewriterController = createRewriterController(rewritersConf);
                     
                     if (rewriterController != null)
                     {
                         rewriterControllerPairs.add(new DefaultKeyValue(localBasePath, rewriterController));
-                        Ruleset rewriterRuleset = null;
                         
-                        if (rewriterRuleConfsLength > 1)
+                        String rules = rewritersConf.getString("rules");
+                        Ruleset ruleset = loadRewriterRuleset(rewriterController, rules);
+                        
+                        if (ruleset != null)
                         {
-                            rewriterRuleset = loadRewriterRuleset(rewriterController, rewriterRuleConfs[1]);
+                            rewriterRulesetPairs.add(new DefaultKeyValue(localBasePath, ruleset));
                         }
-                        
-                        rewriterRulesetPairs.add(new DefaultKeyValue(localBasePath, rewriterRuleset));
                     }
                 }
             }
@@ -301,9 +297,73 @@
         doGet(request, response);
     }
     
-    private RewriterController createRewriterController(String rulesMappingResourcePath, String [] rewriterClassNames, String [] adaptorClassNames) throws Exception
+    private RewriterController createRewriterController(final Configuration rewriterConf)
     {
-        return new MappingRewriterController(getServletContext().getRealPath(rulesMappingResourcePath), buildClassList(rewriterClassNames), buildClassList(adaptorClassNames));
+        String ruleMappingsFilePath = null;
+        Class basicRewriterClass = null;
+        Class ruleBasedRewriterClass = null;
+        Map<String, Class> adaptorMimeTypeClassMap = new HashMap<String, Class>();
+        
+        try
+        {
+            String ruleMappings = rewriterConf.getString("ruleMappings");
+            
+            if (!StringUtils.isBlank(ruleMappings))
+            {
+                ruleMappingsFilePath = getServletContext().getRealPath(ruleMappings);
+            }
+            
+            String basicRewriter = rewriterConf.getString("basic");
+            
+            if (!StringUtils.isBlank(basicRewriter))
+            {
+                basicRewriterClass = Thread.currentThread().getContextClassLoader().loadClass(basicRewriter);
+            }
+            
+            String ruleBasedRewriter = rewriterConf.getString("rulebased");
+            
+            if (!StringUtils.isBlank(ruleBasedRewriter))
+            {
+                ruleBasedRewriterClass = Thread.currentThread().getContextClassLoader().loadClass(ruleBasedRewriter);
+            }
+            
+            Configuration parserAdaptorsConf = rewriterConf.subset("parserAdaptor");
+            
+            String [] parserAdaptorNames = parserAdaptorsConf.getStringArray("");
+            
+            if (!ArrayUtils.isEmpty(parserAdaptorNames))
+            {
+                for (String parserAdaptorName : parserAdaptorNames)
+                {
+                    Configuration parserAdaptorConf = parserAdaptorsConf.subset(parserAdaptorName);
+                    String mimeType = parserAdaptorConf.getString("mimeType");
+                    String parserAdaptor = parserAdaptorConf.getString("");
+                    
+                    if (!StringUtils.isBlank(parserAdaptor))
+                    {
+                        Class parserAdaptorClass = Thread.currentThread().getContextClassLoader().loadClass(parserAdaptor);
+                        adaptorMimeTypeClassMap.put(mimeType, parserAdaptorClass);
+                    }
+                }
+            }
+            
+            return new MappingRewriterController(ruleMappingsFilePath, 
+                                                 basicRewriterClass, ruleBasedRewriterClass, 
+                                                 adaptorMimeTypeClassMap);
+        }
+        catch (Exception e)
+        {
+            if (log.isDebugEnabled())
+            {
+                log.error("Failed to initialize rewriters.", e);
+            }
+            else
+            {
+                log.error("Failed to initialize rewriters. {}", e.toString());
+            }
+        }
+        
+        return null;
     }
     
     private HttpRoute buildHttpRoute(Configuration routeConf) throws Exception
@@ -562,7 +622,7 @@
         
         try
         {
-            if (!StringUtils.isBlank(rulesConfResourcePath))
+            if (rewriterController != null && !StringUtils.isBlank(rulesConfResourcePath))
             {
                 is = getServletContext().getResourceAsStream(rulesConfResourcePath);
                 bis = new BufferedInputStream(is);

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=820217&r1=820216&r2=820217&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 Wed Sep 30 08:56:28 2009
@@ -17,7 +17,6 @@
 package org.apache.portals.applications.webcontent.rewriter;
 
 import java.io.File;
-import java.io.FileReader;
 import java.io.InputStream;
 import java.io.Reader;
 import java.util.ArrayList;
@@ -71,37 +70,85 @@
     protected Class rulesetRewriterClass = RulesetRewriterImpl.class;
 
     /** Adaptors */
-    protected Class adaptorHtmlClass = SwingParserAdaptor.class;
-    protected Class adaptorXmlClass = SaxParserAdaptor.class;
+    protected Map<String, Class> parserAdaptorMimeTypeClassMap;
 
     public MappingRewriterController( String mappingFile ) throws RewriterException
     {
         this.mappingFile = mappingFile;
-        loadMapping();
+        
+        this.parserAdaptorMimeTypeClassMap = new HashMap<String, Class>();
+        this.parserAdaptorMimeTypeClassMap.put("text/html", SwingParserAdaptor.class);
+        this.parserAdaptorMimeTypeClassMap.put("text/xml", SaxParserAdaptor.class);
+        
+        if (this.mappingFile != null)
+        {
+            loadMapping();
+        }
     }
 
+    public MappingRewriterController( String mappingFile, Class basicRewriterClass, Class ruleBasedRewriterClass, Map<String, Class> adaptorMimeTypeClassMap )
+            throws RewriterException
+    {
+        this.mappingFile = mappingFile;
+        
+        this.parserAdaptorMimeTypeClassMap = new HashMap<String, Class>();
+        this.parserAdaptorMimeTypeClassMap.put("text/html", SwingParserAdaptor.class);
+        this.parserAdaptorMimeTypeClassMap.put("text/xml", SaxParserAdaptor.class);
+        
+        if (basicRewriterClass != null)
+        {
+            this.basicRewriterClass = basicRewriterClass;
+        }
+        
+        if (ruleBasedRewriterClass != null)
+        {
+            this.rulesetRewriterClass = ruleBasedRewriterClass;
+        }
+        
+        if (adaptorMimeTypeClassMap != null)
+        {
+            this.parserAdaptorMimeTypeClassMap.putAll(adaptorMimeTypeClassMap);
+        }
+        
+        if (this.mappingFile != null)
+        {
+            loadMapping();
+        }
+    }
+    
     public MappingRewriterController( String mappingFile, List rewriterClasses, List adaptorClasses )
             throws RewriterException
     {
         this.mappingFile = mappingFile;
+        
+        this.parserAdaptorMimeTypeClassMap = new HashMap<String, Class>();
+        this.parserAdaptorMimeTypeClassMap.put("text/html", SwingParserAdaptor.class);
+        this.parserAdaptorMimeTypeClassMap.put("text/xml", SaxParserAdaptor.class);
+        
         if (rewriterClasses.size() > 0)
         {
             this.basicRewriterClass = (Class) rewriterClasses.get(0);
+            
             if (rewriterClasses.size() > 1)
             {
                 this.rulesetRewriterClass = (Class) rewriterClasses.get(1);
             }
         }
+        
         if (adaptorClasses.size() > 0)
         {
-            this.adaptorHtmlClass = (Class) adaptorClasses.get(0);
+            this.parserAdaptorMimeTypeClassMap.put("text/html", (Class) adaptorClasses.get(0));
+            
             if (adaptorClasses.size() > 1)
             {
-                this.adaptorXmlClass = (Class) adaptorClasses.get(1);
+                this.parserAdaptorMimeTypeClassMap.put("text/xmll", (Class) adaptorClasses.get(1));
             }
         }
 
-        loadMapping();
+        if (this.mappingFile != null)
+        {
+            loadMapping();
+        }
     }
     
     public MappingRewriterController( String mappingFile, String basicRewriterClassName, String rulesetRewriterClassName, 
@@ -156,22 +203,18 @@
     {
         try
         {
-            if (mimeType.equals("text/html"))
-            {
-                return (ParserAdaptor) adaptorHtmlClass.newInstance();
-            }
-            else if (mimeType.equals("text/xml"))
-            {
-                return (ParserAdaptor) adaptorXmlClass.newInstance();
-            }
-            else
+            Class parserAdaptorClass = parserAdaptorMimeTypeClassMap.get(mimeType);
+            
+            if (parserAdaptorClass != null)
             {
+                return (ParserAdaptor) parserAdaptorClass.newInstance();
             }
         }
         catch (Exception e)
         {
             log.error("Error creating rewriter class", e);
         }
+        
         return null;
     }
 
@@ -181,42 +224,31 @@
      */
     protected void loadMapping() throws RewriterException
     {
+        if (this.mappingFile == null)
+        {
+            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);
+        }
+        
         try
         {
-            Reader reader = getReader(this.mappingFile);
-            
             this.mapper = new Mapping();
-            InputSource is = new InputSource(reader);
-            is.setSystemId(this.mappingFile);
-            this.mapper.loadMapping(is);
+            this.mapper.loadMapping(file.toURL());
         }
         catch (Exception e)
         {
-            e.printStackTrace();
             String msg = "RewriterService: Error in castor mapping creation";
             log.error(msg, e);
             throw new RewriterException(msg, e);
         }
     }
-
-    protected Reader getReader(String resource)
-    throws RewriterException
-    {
-        File file = new File(resource);
-        if (file.exists() && file.isFile() && file.canRead())
-        {
-            try
-            {
-                return new FileReader(file);
-            }
-            catch (Exception e)
-            {
-                throw new RewriterException("could not open rewriter file " + resource, e);
-            }
-        }
-        throw new RewriterException("could not access rewriter file " + resource);
-    }
-        
+    
     public Ruleset lookupRuleset( String id )
     {
         return (Ruleset) rulesets.get(id);

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=820217&r1=820216&r2=820217&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 Wed Sep 30 08:56:28 2009
@@ -20,15 +20,6 @@
 #
 # ------------------------------------------------------------------------
 
-# Constant properties
-# ... Constant properties can be used in other property values by wrapping '${}'.
-defaults.htmlRewriter = org.apache.portals.applications.webcontent.rewriter.WebContentRewriter
-defaults.xmlRewriter = org.apache.portals.applications.webcontent.rewriter.WebContentRewriter
-defaults.htmlAdaptor = org.apache.portals.applications.webcontent.rewriter.html.neko.NekoParserAdaptor
-defaults.xmlAdaptor = org.apache.portals.applications.webcontent.rewriter.xml.SaxParserAdaptor
-defaults.ruleMappings = /WEB-INF/conf/rewriter-rules-mapping.xml
-defaults.rewriterRules = /WEB-INF/conf/default-rewriter-rules.xml
-
 # Proxy Host Configurations
 # ... Set the following when you want to force HOST header value forcefully.
 #proxy.server.hostname = www.localhost.com
@@ -96,6 +87,13 @@
 # ... 'somewhere' is just an example to show the full configurable items...
 proxy.reverse.pass.somewhere.local = /somewhere/
 proxy.reverse.pass.somewhere.remote = http://somewhere.localhost.com/
-proxy.reverse.pass.somewhere.rewriters = ${defaults.htmlRewriter}, ${defaults.xmlRewriter} 
-proxy.reverse.pass.somewhere.adaptors = ${defaults.htmlAdaptor}, ${defaults.xmlAdaptor}
-proxy.reverse.pass.somewhere.rules = ${defaults.ruleMappings}, ${defaults.rewriterRules}
+# ... rewriter configuration for this pass mapping on html and xml types.
+proxy.reverse.pass.somewhere.rewriter.basic = org.apache.portals.applications.webcontent.rewriter.WebContentRewriter
+proxy.reverse.pass.somewhere.rewriter.rulebased = org.apache.portals.applications.webcontent.rewriter.WebContentRewriter
+proxy.reverse.pass.somewhere.rewriter.parserAdaptor = html, xml
+proxy.reverse.pass.somewhere.rewriter.parserAdaptor.html = org.apache.portals.applications.webcontent.rewriter.html.neko.NekoParserAdaptor
+proxy.reverse.pass.somewhere.rewriter.parserAdaptor.html.mimeType = text/html
+proxy.reverse.pass.somewhere.rewriter.parserAdaptor.xml = org.apache.portals.applications.webcontent.rewriter.xml.SaxParserAdaptor
+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