You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lenya.apache.org by an...@apache.org on 2008/02/06 00:44:44 UTC

svn commit: r618827 - /lenya/trunk/src/java/org/apache/lenya/cms/cocoon/components/modules/input/FallbackModule.java

Author: andreas
Date: Tue Feb  5 15:44:37 2008
New Revision: 618827

URL: http://svn.apache.org/viewvc?rev=618827&view=rev
Log:
Delegate logic from FallbackModule to source factory, leverage source URI caching in module.

Modified:
    lenya/trunk/src/java/org/apache/lenya/cms/cocoon/components/modules/input/FallbackModule.java

Modified: lenya/trunk/src/java/org/apache/lenya/cms/cocoon/components/modules/input/FallbackModule.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/java/org/apache/lenya/cms/cocoon/components/modules/input/FallbackModule.java?rev=618827&r1=618826&r2=618827&view=diff
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/cocoon/components/modules/input/FallbackModule.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/cocoon/components/modules/input/FallbackModule.java Tue Feb  5 15:44:37 2008
@@ -18,208 +18,145 @@
 
 package org.apache.lenya.cms.cocoon.components.modules.input;
 
-import java.io.File;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.parameters.ParameterException;
+import org.apache.avalon.framework.parameters.Parameterizable;
+import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.Serviceable;
+import org.apache.cocoon.components.modules.input.AbstractInputModule;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Request;
 import org.apache.excalibur.source.Source;
 import org.apache.excalibur.source.SourceResolver;
-import org.apache.excalibur.source.SourceUtil;
+import org.apache.excalibur.store.impl.MRUMemoryStore;
+import org.apache.lenya.cms.cocoon.source.FallbackSourceFactory;
+import org.apache.lenya.cms.publication.DocumentFactory;
+import org.apache.lenya.cms.publication.DocumentUtil;
+import org.apache.lenya.cms.publication.URLInformation;
+import org.apache.lenya.cms.repository.RepositoryUtil;
+import org.apache.lenya.cms.repository.Session;
+import org.apache.lenya.util.ServletHelper;
 
 /**
  * <p>
- * This module checks if a file exists in a publiation, and if not, it chooses the core file. The
- * attribute name must a path relatively to the <code>webapps/lenya/lenya</code> directory.
+ * This module returns the actual source URI of a fallback:// source. The protocol (fallback,
+ * template-fallback, ...) is configurable via the <em>protocol</em> parameter.
  * </p>
- * <p>
- * Example: <code>{fallback:xslt/style.xsl}</code> looks if
- * <code>lenya/pubs/(publication-id)/lenya/xslt/style.xsl</code> exists, and if not, it uses
- * <code>lenya/xslt/style.xsl</code>.
- * 
- * @version $Id$
  */
-public class FallbackModule extends AbstractPageEnvelopeModule {
-
-    private String[] baseUris;
-
-    /**
-     * <code>PATH_PREFIX</code> The path prefix from the webapp
-     */
-    public static final String PATH_PREFIX = "lenya/";
+public class FallbackModule extends AbstractInputModule implements Serviceable, Parameterizable {
 
-    protected static final String ELEMENT_PATH = "directory";
-
-    protected static final String ATTRIBUTE_SRC = "src";
-
-    /**
-     * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
-     */
-    public void configure(Configuration conf) throws ConfigurationException {
-        super.configure(conf);
+    protected static final String PARAM_PROTOCOL = "protocol";
+    protected ServiceManager manager;
+    private String protocol;
+    protected static MRUMemoryStore store;
+    private static Boolean useCache = null;
+
+    protected boolean useCache() {
+        if (useCache == null) {
+            useCache = Boolean.valueOf(this.manager.hasService(FallbackSourceFactory.STORE_ROLE));
+        }
+        return useCache.booleanValue();
+    }
 
-        Configuration[] pathConfigs = conf.getChildren(ELEMENT_PATH);
-        List baseUriList = new ArrayList();
+    protected MRUMemoryStore getStore() {
+        if (store == null) {
+            try {
+                store = (MRUMemoryStore) this.manager.lookup(FallbackSourceFactory.STORE_ROLE);
+            } catch (ServiceException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return store;
+    }
 
-        SourceResolver resolver = null;
+    protected String getPublicationId(Map objectModel) {
+        Request request = ObjectModelHelper.getRequest(objectModel);
+        String webappUri = ServletHelper.getWebappURI(request);
+        URLInformation info = new URLInformation(webappUri);
+        String pubId = null;
         try {
-            resolver = (SourceResolver) this.manager.lookup(SourceResolver.ROLE);
-            Source source = null;
-            for (int i = 0; i < pathConfigs.length; i++) {
-                String uri = pathConfigs[i].getAttribute(ATTRIBUTE_SRC);
-                try {
-                    source = resolver.resolveURI(uri);
-                    if (source.exists()) {
-                        File file = SourceUtil.getFile(source);
-                        if (file.isDirectory()) {
-                            baseUriList.add(uri);
-                        } else {
-                            getLogger().warn("Omitting path [" + uri + "] (not a directory).");
-                        }
-                    } else {
-                        getLogger().warn("Omitting path [" + uri + "] (does not exist).");
-                    }
-                } catch (Exception e) {
-                    getLogger().error("Could not resolve path [" + uri + "]: ", e);
-                    throw e;
-                } finally {
-                    if (source != null) {
-                        resolver.release(source);
-                    }
-                }
+            Session session = RepositoryUtil.getSession(this.manager, request);
+            DocumentFactory factory = DocumentUtil.createDocumentFactory(this.manager, session);
+            String pubIdCandidate = info.getPublicationId();
+            if (pubIdCandidate != null && factory.existsPublication(pubIdCandidate)) {
+                pubId = pubIdCandidate;
             }
         } catch (Exception e) {
-            throw new ConfigurationException("Configuring failed: ", e);
-        } finally {
-            if (resolver != null) {
-                this.manager.release(resolver);
-            }
+            throw new RuntimeException(e);
         }
-
-        this.baseUris = (String[]) baseUriList.toArray(new String[baseUriList.size()]);
+        return pubId;
     }
 
-    /**
-     * @see org.apache.cocoon.components.modules.input.InputModule#getAttribute(java.lang.String,
-     *      org.apache.avalon.framework.configuration.Configuration, java.util.Map)
-     */
     public Object getAttribute(String name, Configuration modeConf, Map objectModel)
             throws ConfigurationException {
-
-        if (getLogger().isDebugEnabled()) {
-            getLogger().debug("Resolving file for path [" + name + "]");
+        String uri;
+        String fallbackUri = getFallbackUri(name);
+        if (useCache()) {
+            final String pubId = getPublicationId(objectModel);
+            String cacheKey = FallbackSourceFactory.getCacheKey(pubId, fallbackUri);
+            MRUMemoryStore store = getStore();
+            if (store.containsKey(cacheKey)) {
+                uri = (String) store.get(cacheKey);
+            }
+            else {
+                uri = resolveSourceUri(name);
+            }
         }
-
-        String resolvedUri = resolveURI(name, objectModel);
-        return resolvedUri;
+        else {
+            uri = resolveSourceUri(name);
+        }
+        return uri;
     }
 
-    /**
-     * Resolves the URI for a certain path.
-     * @param path The path.
-     * @param objectModel The object model.
-     * @return A string.
-     * @throws ConfigurationException if an error occurs.
-     */
-    protected String resolveURI(final String path, Map objectModel) throws ConfigurationException {
-        String resolvedUri = null;
-        String checkedUris = "\n";
-
+    protected String resolveSourceUri(String name) throws ConfigurationException {
         SourceResolver resolver = null;
+        Source source = null;
         try {
             resolver = (SourceResolver) this.manager.lookup(SourceResolver.ROLE);
-
-            String[] _baseUris = getBaseURIs(objectModel, path);
-            Source source = null;
-            int i = 0;
-            while (resolvedUri == null && i < _baseUris.length) {
-                String uri = _baseUris[i] + "/" + path;
-
-                checkedUris += uri + "\n";
-
-                if (getLogger().isDebugEnabled()) {
-                    getLogger().debug("Trying to resolve URI [" + uri + "]");
-                }
-
-                try {
-                    source = resolver.resolveURI(uri);
-                    if (source.exists()) {
-                        resolvedUri = uri;
-                    } else {
-                        if (getLogger().isDebugEnabled()) {
-                            getLogger().debug("Skipping URI [" + uri + "] (does not exist).");
-                        }
-                    }
-                } catch (Exception e) {
-                    getLogger().error("Could not resolve URI [" + uri + "]: ", e);
-                    throw e;
-                } finally {
-                    if (source != null) {
-                        resolver.release(source);
-                    }
-                }
-                i++;
-            }
-
+            source = resolver.resolveURI(getFallbackUri(name));
+            return source.getURI();
         } catch (Exception e) {
-            throw new ConfigurationException("Resolving attribute [" + path + "] failed: ", e);
+            throw new ConfigurationException("Resolving fallback source [" + name + "] failed: ", e);
         } finally {
             if (resolver != null) {
+                if (source != null) {
+                    resolver.release(source);
+                }
                 this.manager.release(resolver);
             }
         }
+    }
 
-        if (resolvedUri == null) {
-            /*
-            throw new ConfigurationException("Could not resolve file for path [" + path + "]."
-                    + "\nChecked URIs:" + checkedUris);
-            */
-            resolvedUri = this.baseUris[this.baseUris.length - 1] + "/" + path;
-            if (getLogger().isDebugEnabled()) {
-                getLogger().debug("No URI resolved, choosing last defined URI: [" + resolvedUri + "]");
-            }
-        }
-        else {
-            if (getLogger().isDebugEnabled()) {
-                getLogger().debug("Resolved URI: [" + resolvedUri + "]");
-            }
-        }
-        return resolvedUri;
+    protected String getFallbackUri(String name) {
+        return this.protocol + "://" + name;
     }
 
-    /**
-     * Returns the base directory URIs in the order they should be traversed.
-     * @param objectModel The object model.
-     * @param attributeName The name of the module attribute.
-     * @return An array of strings.
-     * @throws ConfigurationException if an error occurs.
-     */
-    protected String[] getBaseURIs(Map objectModel, String attributeName) throws ConfigurationException {
-        return this.baseUris;
-    }
-
-    /**
-     * @see org.apache.cocoon.components.modules.input.InputModule#getAttributeNames(org.apache.avalon.framework.configuration.Configuration,
-     *      java.util.Map)
-     */
     public Iterator getAttributeNames(Configuration modeConf, Map objectModel)
             throws ConfigurationException {
         return Collections.EMPTY_SET.iterator();
     }
 
-    /**
-     * @see org.apache.cocoon.components.modules.input.InputModule#getAttributeValues(java.lang.String,
-     *      org.apache.avalon.framework.configuration.Configuration, java.util.Map)
-     */
     public Object[] getAttributeValues(String name, Configuration modeConf, Map objectModel)
             throws ConfigurationException {
         Object[] objects = { getAttribute(name, modeConf, objectModel) };
-
         return objects;
+    }
+
+    public void service(ServiceManager manager) throws ServiceException {
+        this.manager = manager;
+        
+    }
+
+    public void parameterize(Parameters params) throws ParameterException {
+        this.protocol = params.getParameter(PARAM_PROTOCOL);
+        
     }
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@lenya.apache.org
For additional commands, e-mail: commits-help@lenya.apache.org