Author: thorsten
Date: Fri Dec  9 04:50:57 2005
New Revision: 355474

URL: http://svn.apache.org/viewcvs?rev=355474&view=rev
Log:
Added first version of the LocationmapSourceFactory. With this it is possible 
to request locationmap source via lm://my-location which makes it easier to use 
it without contacting a input module in java and any other files. The problem 
ATM is that the mounts of the locationmap are not resolved when using the 
factory. Only matches are resolved only problems.

Added:
    forrest/trunk/main/java/org/apache/forrest/locationmap/source/
    forrest/trunk/main/java/org/apache/forrest/locationmap/source/impl/
    
forrest/trunk/main/java/org/apache/forrest/locationmap/source/impl/LocationmapSourceFactory.java
   (with props)
Modified:
    forrest/trunk/main/webapp/WEB-INF/xconf/forrest-core.xconf

Added: 
forrest/trunk/main/java/org/apache/forrest/locationmap/source/impl/LocationmapSourceFactory.java
URL: 
http://svn.apache.org/viewcvs/forrest/trunk/main/java/org/apache/forrest/locationmap/source/impl/LocationmapSourceFactory.java?rev=355474&view=auto
==============================================================================
--- 
forrest/trunk/main/java/org/apache/forrest/locationmap/source/impl/LocationmapSourceFactory.java
 (added)
+++ 
forrest/trunk/main/java/org/apache/forrest/locationmap/source/impl/LocationmapSourceFactory.java
 Fri Dec  9 04:50:57 2005
@@ -0,0 +1,102 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation or its licensors,
+ * as applicable.
+ * 
+ * Licensed 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.locationmap.source.impl;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.Map;
+
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.ServiceSelector;
+import org.apache.avalon.framework.service.Serviceable;
+import org.apache.avalon.framework.thread.ThreadSafe;
+import org.apache.cocoon.components.ContextHelper;
+import org.apache.cocoon.components.modules.input.InputModule;
+import org.apache.cocoon.environment.SourceResolver;
+import org.apache.excalibur.source.Source;
+import org.apache.excalibur.source.SourceException;
+import org.apache.excalibur.source.SourceFactory;
+
+public class LocationmapSourceFactory extends AbstractLogEnabled implements
+        Serviceable, SourceFactory, ThreadSafe, Contextualizable {
+
+    protected ServiceManager m_manager;
+    private Context context;
+    public static final String LM_PREFIX = "lm";
+    public static final String LM_SOURCE_SCHEME =LM_PREFIX+ ":";
+
+    public Source getSource(String location, Map parameters)
+            throws IOException, MalformedURLException {
+        Map objectModel = ContextHelper.getObjectModel( this.context );
+        if (this.getLogger().isDebugEnabled()) {
+            this.getLogger().debug("Processing " + location);
+        }
+
+        int protocolEnd = location.indexOf("://");
+        if (protocolEnd == -1) {
+            throw new MalformedURLException("URI does not contain '://' : "
+                    + location);
+        }
+        String documentName = location.substring(protocolEnd + 3, location
+                .length());
+        String lmLocation = "";
+        Source lmSource = null;
+        SourceResolver resolver = null;
+        ServiceSelector selector = null;
+        InputModule inputModule = null;
+        try {
+            selector = (ServiceSelector) m_manager.lookup(InputModule.ROLE
+                    + "Selector");
+            inputModule = (InputModule) selector.select(LM_PREFIX);
+            resolver = (SourceResolver) m_manager.lookup(SourceResolver.ROLE);
+            lmLocation = (String) inputModule.getAttribute(documentName, null,
+                    objectModel);
+            if (lmLocation==null)
+                throw new SourceException("Could not resolve locationmap 
location.");
+            lmSource = resolver.resolveURI(lmLocation);
+        } catch (ServiceException se) {
+            throw new SourceException("InputModule is not available.", se);
+        } catch (ConfigurationException e) {
+            throw new SourceException("SourceResolver is not available.", e);
+        } finally {
+            if (inputModule != null)
+                selector.release(inputModule);
+            m_manager.release(resolver);
+        }
+        return lmSource;
+    }
+    /**
+     * Contextualizable, get the object model
+     */
+    public void contextualize( Context context ) throws ContextException {
+        this.context = context;
+    }
+    public void release(Source source) {
+        // not necessary here
+    }
+
+    public void service(ServiceManager manager) throws ServiceException {
+        this.m_manager = manager;
+    }
+
+}

Propchange: 
forrest/trunk/main/java/org/apache/forrest/locationmap/source/impl/LocationmapSourceFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: forrest/trunk/main/webapp/WEB-INF/xconf/forrest-core.xconf
URL: 
http://svn.apache.org/viewcvs/forrest/trunk/main/webapp/WEB-INF/xconf/forrest-core.xconf?rev=355474&r1=355473&r2=355474&view=diff
==============================================================================
--- forrest/trunk/main/webapp/WEB-INF/xconf/forrest-core.xconf (original)
+++ forrest/trunk/main/webapp/WEB-INF/xconf/forrest-core.xconf Fri Dec  9 
04:50:57 2005
@@ -244,6 +244,7 @@
     <component-instance 
class="org.apache.cocoon.components.source.impl.ContextSourceFactory" 
name="context"/>
     <component-instance 
class="org.apache.cocoon.components.source.impl.SitemapSourceFactory" 
name="cocoon"/>
     <component-instance 
class="org.apache.cocoon.components.source.impl.ZipSourceFactory" name="zip"/>
+    <component-instance 
class="org.apache.forrest.locationmap.source.impl.LocationmapSourceFactory" 
name="lm"/>
     <!-- the "*" protocol handles all uri schemes that are not explicitely 
specified. This includes all
          JDK standard protocols, with special handling of the "file:" protocol 
which is modifiable
          (can be written to) and traversable (directory structures can be 
crawled). -->


Reply via email to