[jboss-svn-commits] JBL Code SVN: r10371 - in labs/jbosslabs/trunk/portal-extensions: forge-common/src/java/org/jboss/forge/common and 8 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Mar 20 19:51:48 EDT 2007


Author: adamw
Date: 2007-03-20 19:51:47 -0400 (Tue, 20 Mar 2007)
New Revision: 10371

Added:
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/AbstractBaseCF.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/BaseCF.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/MainCF.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/PortalObjectCF.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/PortalObjectCFImpl.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/AbstractPageDelegateCF.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/DownloadCF.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/PageDelegateCF.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/PageDelegatingCF.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/PageDelegatingCFImpl.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/WikiCF.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/url/DownloadUrlFactory.java
   labs/jbosslabs/trunk/portal-extensions/forge-portlets/src/web/WEB-INF/jboss-portlet.xml
Removed:
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/AbstractLabsBaseCommandFactory.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/AbstractLabsDelegateCommandFactory.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsBaseCommandFactory.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsDelegateCommandFactory.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsDelegatingCommandFactory.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsDelegatingCommandFactoryImpl.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsMainCommandFactory.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsPortalObjectCommandFactory.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsPortalObjectCommandFactoryImpl.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/WikiCommandFactory.java
   labs/jbosslabs/trunk/portal-extensions/forge-portlets/src/java/org/jbosslabs/
Modified:
   labs/jbosslabs/trunk/portal-extensions/configuration/to-copy/server/default/deploy/jboss-portal.sar/META-INF/jboss-service.xml
   labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/Constants.java
   labs/jbosslabs/trunk/portal-extensions/forge-ejb3/src/java/org/jboss/forge/ejb3/projectpages/ProjectPagesServiceBean.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/url/AbstractLabsDelegateUrlFactory.java
   labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/url/WikiUrlFactory.java
   labs/jbosslabs/trunk/portal-extensions/forge-portlets/src/java/org/jboss/forge/projects/downloads/Downloads.java
Log:
Downloads mapper

Modified: labs/jbosslabs/trunk/portal-extensions/configuration/to-copy/server/default/deploy/jboss-portal.sar/META-INF/jboss-service.xml
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/configuration/to-copy/server/default/deploy/jboss-portal.sar/META-INF/jboss-service.xml	2007-03-20 22:44:49 UTC (rev 10370)
+++ labs/jbosslabs/trunk/portal-extensions/configuration/to-copy/server/default/deploy/jboss-portal.sar/META-INF/jboss-service.xml	2007-03-20 23:51:47 UTC (rev 10371)
@@ -753,7 +753,7 @@
    <!-- LABS command factories -->
 
    <mbean
-      code="org.jboss.labs.mapper.command.LabsMainCommandFactory"
+      code="org.jboss.labs.mapper.command.MainCF"
       name="portal:commandFactory=LabsMain"
       xmbean-dd=""
       xmbean-code="org.jboss.portal.jems.as.system.JBossServiceModelMBean">
@@ -762,16 +762,16 @@
          optional-attribute-name="Container"
          proxy-type="attribute">portal:container=PortalObject</depends>
       <depends
-         optional-attribute-name="DelegatingCF"
-         proxy-type="attribute">portal:commandFactory=LabsDelegating</depends>
+         optional-attribute-name="PageDelegatingCF"
+         proxy-type="attribute">portal:commandFactory=LabsPageDelegating</depends>
       <depends
          optional-attribute-name="PortalObjectCF"
          proxy-type="attribute">portal:commandFactory=LabsPortalObject</depends>
    </mbean>
 
    <mbean
-      code="org.jboss.labs.mapper.command.LabsDelegatingCommandFactoryImpl"
-      name="portal:commandFactory=LabsDelegating"
+      code="org.jboss.labs.mapper.command.delegating.page.PageDelegatingCFImpl"
+      name="portal:commandFactory=LabsPageDelegating"
       xmbean-dd=""
       xmbean-code="org.jboss.portal.jems.as.system.JBossServiceModelMBean">
       <xmbean/>
@@ -780,7 +780,7 @@
          proxy-type="attribute">portal:container=PortalObject</depends>
    </mbean>
    <mbean
-      code="org.jboss.labs.mapper.command.WikiCommandFactory"
+      code="org.jboss.labs.mapper.command.delegating.page.WikiCF"
       name="portal:commandFactory=Wiki"
       xmbean-dd=""
       xmbean-code="org.jboss.portal.jems.as.system.JBossServiceModelMBean">
@@ -792,15 +792,32 @@
          optional-attribute-name="Container"
          proxy-type="attribute">portal:container=PortalObject</depends>
       <depends
-         optional-attribute-name="DelegatingCF"
-         proxy-type="attribute">portal:commandFactory=LabsDelegating</depends>
+         optional-attribute-name="PageDelegatingCF"
+         proxy-type="attribute">portal:commandFactory=LabsPageDelegating</depends>
       <depends
          optional-attribute-name="PortalObjectCF"
          proxy-type="attribute">portal:commandFactory=LabsPortalObject</depends>
    </mbean>
+   <mbean
+      code="org.jboss.labs.mapper.command.delegating.page.DownloadCF"
+      name="portal:commandFactory=Download"
+      xmbean-dd=""
+      xmbean-code="org.jboss.portal.jems.as.system.JBossServiceModelMBean">
+      <xmbean/>
+      <attribute name="Path">downloads</attribute>
+      <depends
+         optional-attribute-name="Container"
+         proxy-type="attribute">portal:container=PortalObject</depends>
+      <depends
+         optional-attribute-name="PageDelegatingCF"
+         proxy-type="attribute">portal:commandFactory=LabsPageDelegating</depends>
+      <depends
+         optional-attribute-name="PortalObjectCF"
+         proxy-type="attribute">portal:commandFactory=LabsPortalObject</depends>
+   </mbean>
 
    <mbean
-      code="org.jboss.labs.mapper.command.LabsPortalObjectCommandFactoryImpl"
+      code="org.jboss.labs.mapper.command.PortalObjectCFImpl"
       name="portal:commandFactory=LabsPortalObject"
       xmbean-dd=""
       xmbean-code="org.jboss.portal.jems.as.system.JBossServiceModelMBean">
@@ -918,6 +935,20 @@
          optional-attribute-name="Factory"
          proxy-type="attribute">portal:urlFactory=Delegating</depends>
    </mbean>
+   <mbean
+      code="org.jboss.labs.mapper.url.DownloadUrlFactory"
+      name="portal:urlFactory=Download"
+      xmbean-dd=""
+      xmbean-code="org.jboss.portal.jems.as.system.JBossServiceModelMBean">
+      <attribute name="Path">downloads</attribute>
+      <xmbean/>
+      <depends
+         optional-attribute-name="Container"
+         proxy-type="attribute">portal:container=PortalObject</depends>
+      <depends
+         optional-attribute-name="Factory"
+         proxy-type="attribute">portal:urlFactory=Delegating</depends>
+   </mbean>
 
    <!-- The federating portlet invoker -->
    <mbean

Modified: labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/Constants.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/Constants.java	2007-03-20 22:44:49 UTC (rev 10370)
+++ labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/Constants.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -40,6 +40,13 @@
     public static final String PORTAL_OBJECT_LABS_MARKER = "labs";
 
     /**
+     * Name of a declared property for portal objects, which are handeled
+     * by labs, and have separate windows on one page. This property enables
+     * to distinguish between them.
+     */
+    public static final String PORTAL_OBJECT_UNIQUE_ID_MARKER = "uniqueId";
+
+    /**
      * Name of a portlet preference, which, if present, is used when
      * creating project pages, in case there is one then more portlets
      * of the same type on a page; the unique id is then used to generate

Modified: labs/jbosslabs/trunk/portal-extensions/forge-ejb3/src/java/org/jboss/forge/ejb3/projectpages/ProjectPagesServiceBean.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-ejb3/src/java/org/jboss/forge/ejb3/projectpages/ProjectPagesServiceBean.java	2007-03-20 22:44:49 UTC (rev 10370)
+++ labs/jbosslabs/trunk/portal-extensions/forge-ejb3/src/java/org/jboss/forge/ejb3/projectpages/ProjectPagesServiceBean.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -427,6 +427,11 @@
                 // Marking this window as belonging to this project.
                 markAsLabsObject(window, projectId);
 
+                // If the unique id is set, setting is as a property.
+                if (uniqueId != null) {
+                    window.setDeclaredProperty(Constants.PORTAL_OBJECT_UNIQUE_ID_MARKER, uniqueId);
+                }
+
                 // Creating necessary security bindings.
                 //setSecurityBindings(window);
 

Copied: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/AbstractBaseCF.java (from rev 10330, labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/AbstractLabsBaseCommandFactory.java)
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/AbstractBaseCF.java	                        (rev 0)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/AbstractBaseCF.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -0,0 +1,67 @@
+package org.jboss.labs.mapper.command;
+
+import org.jboss.portal.core.model.portal.*;
+import org.jboss.portal.core.model.portal.command.InvokePortletWindowRenderCommand;
+import org.jboss.portal.core.controller.ControllerCommand;
+import org.jboss.portal.jems.as.system.AbstractJBossService;
+import org.jboss.portal.theme.navigation.WindowNavigationalState;
+import org.jboss.portal.server.ServerInvocation;
+import org.jboss.portal.portlet.StateString;
+import org.jboss.portal.portlet.impl.PortletRequestDecoder;
+import org.jboss.labs.mapper.MapperTools;
+
+import java.io.IOException;
+
+/**
+ * A base class for Labs command factories.
+ * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
+ */
+public abstract class AbstractBaseCF extends AbstractJBossService
+        implements BaseCF {
+    private PortalObjectContainer container;
+
+    public PortalObjectContainer getContainer() {
+        return container;
+    }
+
+    public void setContainer(PortalObjectContainer container) {
+        this.container = container;
+    }  
+
+    protected ControllerCommand invokeRenderCommand(ServerInvocation invocation, Window window,
+                                                  StateString params) {
+        WindowNavigationalState windowNavState = MapperTools.getWindowNavState(invocation, window);
+
+        return new InvokePortletWindowRenderCommand(window.getId(), windowNavState.getMode(),
+                windowNavState.getWindowState(), params);
+    }
+
+    protected boolean hasMetaParameter(ServerInvocation invocation) {
+        return invocation.getServerContext().getQueryParameterMap().get(
+                    PortletRequestDecoder.META_PARAMETER) != null;
+    }
+
+    protected void sendRedirect(ServerInvocation invocation, String where) {
+        try {
+            String queryString = invocation.getServerContext().getClientRequest().getQueryString();
+            if (queryString != null) {
+                where += "?" + queryString;
+            }
+            invocation.getServerContext().getClientResponse().sendRedirect(where);
+        } catch (IOException e) {
+            // Oh well ...
+        }
+    }
+
+    /*
+     * Service lifecycle methods.
+     */
+
+    protected void startService() throws Exception {
+
+    }
+
+    protected void stopService() throws Exception {
+
+    }
+}

Deleted: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/AbstractLabsBaseCommandFactory.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/AbstractLabsBaseCommandFactory.java	2007-03-20 22:44:49 UTC (rev 10370)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/AbstractLabsBaseCommandFactory.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -1,67 +0,0 @@
-package org.jboss.labs.mapper.command;
-
-import org.jboss.portal.core.model.portal.*;
-import org.jboss.portal.core.model.portal.command.InvokePortletWindowRenderCommand;
-import org.jboss.portal.core.controller.ControllerCommand;
-import org.jboss.portal.jems.as.system.AbstractJBossService;
-import org.jboss.portal.theme.navigation.WindowNavigationalState;
-import org.jboss.portal.server.ServerInvocation;
-import org.jboss.portal.portlet.StateString;
-import org.jboss.portal.portlet.impl.PortletRequestDecoder;
-import org.jboss.labs.mapper.MapperTools;
-
-import java.io.IOException;
-
-/**
- * A base class for Labs command factories.
- * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
- */
-public abstract class AbstractLabsBaseCommandFactory extends AbstractJBossService
-        implements LabsBaseCommandFactory {
-    private PortalObjectContainer container;
-
-    public PortalObjectContainer getContainer() {
-        return container;
-    }
-
-    public void setContainer(PortalObjectContainer container) {
-        this.container = container;
-    }  
-
-    protected ControllerCommand invokeRenderCommand(ServerInvocation invocation, Window window,
-                                                  StateString params) {
-        WindowNavigationalState windowNavState = MapperTools.getWindowNavState(invocation, window);
-
-        return new InvokePortletWindowRenderCommand(window.getId(), windowNavState.getMode(),
-                windowNavState.getWindowState(), params);
-    }
-
-    protected boolean hasMetaParameter(ServerInvocation invocation) {
-        return invocation.getServerContext().getQueryParameterMap().get(
-                    PortletRequestDecoder.META_PARAMETER) != null;
-    }
-
-    protected void sendRedirect(ServerInvocation invocation, String where) {
-        try {
-            String queryString = invocation.getServerContext().getClientRequest().getQueryString();
-            if (queryString != null) {
-                where += "?" + queryString;
-            }
-            invocation.getServerContext().getClientResponse().sendRedirect(where);
-        } catch (IOException e) {
-            // Oh well ...
-        }
-    }
-
-    /*
-     * Service lifecycle methods.
-     */
-
-    protected void startService() throws Exception {
-
-    }
-
-    protected void stopService() throws Exception {
-
-    }
-}

Deleted: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/AbstractLabsDelegateCommandFactory.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/AbstractLabsDelegateCommandFactory.java	2007-03-20 22:44:49 UTC (rev 10370)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/AbstractLabsDelegateCommandFactory.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -1,35 +0,0 @@
-package org.jboss.labs.mapper.command;
-
-/**
- * A base class for Labs delegate command factories.
- * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
- */
-public abstract class AbstractLabsDelegateCommandFactory extends AbstractLabsBaseCommandFactory
-        implements LabsDelegateCommandFactory {
-    private LabsDelegatingCommandFactory delegatingCF;
-    private String path;
-
-    public LabsDelegatingCommandFactory getDelegatingCF() {
-        return delegatingCF;
-    }
-
-    public void setDelegatingCF(LabsDelegatingCommandFactory delegatingCF) {
-        this.delegatingCF = delegatingCF;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    /*
-     * Service lifecycle methods.
-     */
-
-    protected void startService() throws Exception {
-        getDelegatingCF().register(getPath(), this);
-    }
-}

Copied: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/BaseCF.java (from rev 10330, labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsBaseCommandFactory.java)
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/BaseCF.java	                        (rev 0)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/BaseCF.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -0,0 +1,11 @@
+package org.jboss.labs.mapper.command;
+
+import org.jboss.portal.core.model.portal.PortalObjectContainer;
+
+/**
+ * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
+ */
+public interface BaseCF {
+    public PortalObjectContainer getContainer();
+    public void setContainer(PortalObjectContainer container);
+}

Deleted: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsBaseCommandFactory.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsBaseCommandFactory.java	2007-03-20 22:44:49 UTC (rev 10370)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsBaseCommandFactory.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -1,11 +0,0 @@
-package org.jboss.labs.mapper.command;
-
-import org.jboss.portal.core.model.portal.PortalObjectContainer;
-
-/**
- * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
- */
-public interface LabsBaseCommandFactory {
-    public PortalObjectContainer getContainer();
-    public void setContainer(PortalObjectContainer container);
-}

Deleted: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsDelegateCommandFactory.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsDelegateCommandFactory.java	2007-03-20 22:44:49 UTC (rev 10370)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsDelegateCommandFactory.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -1,23 +0,0 @@
-package org.jboss.labs.mapper.command;
-
-import org.jboss.portal.core.controller.ControllerCommand;
-import org.jboss.portal.server.ServerInvocation;
-import org.jboss.labs.mapper.PathParser;
-
-/**
- * A base interface for factories, to which mapping requests can
- * be delegated basing on the request path, by
- * {@see LabsDelegatingCommandFactory}.
- * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
- */
-public interface LabsDelegateCommandFactory extends LabsBaseCommandFactory {
-    public ControllerCommand doMapping(ServerInvocation invocation,
-                                       String host, String contextPath,
-                                       PathParser parser);
-
-    public LabsDelegatingCommandFactory getDelegatingCF();
-    public void setDelegatingCF(LabsDelegatingCommandFactory delegating);
-
-    public String getPath();
-    public void setPath(String path);
-}

Deleted: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsDelegatingCommandFactory.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsDelegatingCommandFactory.java	2007-03-20 22:44:49 UTC (rev 10370)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsDelegatingCommandFactory.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -1,25 +0,0 @@
-package org.jboss.labs.mapper.command;
-
-import org.jboss.portal.core.controller.ControllerCommand;
-import org.jboss.portal.server.ServerInvocation;
-import org.jboss.labs.mapper.PathParser;
-
-/**
- * A delegating command factory, which delegates mapping to registered
- * factories based on the first token of the requested path.
- * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
- */
-public interface LabsDelegatingCommandFactory extends LabsBaseCommandFactory {
-    public ControllerCommand doMapping(ServerInvocation invocation,
-                                       String host, String contextPath,
-                                       PathParser parser);
-
-    /**
-     * Registeres a factory so that requests with the given first token
-     * will be delegated to it.
-     * @param path First token of the request path that must be matched
-     * in order to delegate the mapping.
-     * @param factory Factory to which mapping should be delegated.
-     */
-    public void register(String path, LabsDelegateCommandFactory factory);
-}

Deleted: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsDelegatingCommandFactoryImpl.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsDelegatingCommandFactoryImpl.java	2007-03-20 22:44:49 UTC (rev 10370)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsDelegatingCommandFactoryImpl.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -1,45 +0,0 @@
-package org.jboss.labs.mapper.command;
-
-import org.jboss.portal.core.controller.ControllerCommand;
-import org.jboss.portal.server.ServerInvocation;
-import org.jboss.labs.mapper.PathParser;
-
-import java.util.Map;
-import java.util.HashMap;
-
-/**
- * 
- * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
- */
-public class LabsDelegatingCommandFactoryImpl extends AbstractLabsBaseCommandFactory
-        implements LabsDelegatingCommandFactory {
-    private Map<String, LabsDelegateCommandFactory> factories;
-
-    public LabsDelegatingCommandFactoryImpl() {
-        factories = new HashMap<String, LabsDelegateCommandFactory>();
-    }
-
-    public ControllerCommand doMapping(ServerInvocation invocation, String host,
-                                       String contextPath, PathParser parser) {
-        if (parser.hasFirstToken()) {
-            // Checking if there is any delegate factory registered for the
-            // given token.
-            String firstToken = parser.getFirstToken();
-            for (String path : factories.keySet()) {
-                if (firstToken.equals(path)) {
-                    // Found a match; skipping the matched token and proceeding
-                    // with the mapping.                    
-                    parser.proceed();
-                    return factories.get(path).doMapping(invocation, host, contextPath,
-                            parser);
-                }
-            }
-        }
-
-        return null;
-    }
-
-    public synchronized void register(String path, LabsDelegateCommandFactory factory) {
-        factories.put(path, factory);
-    }
-}

Deleted: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsMainCommandFactory.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsMainCommandFactory.java	2007-03-20 22:44:49 UTC (rev 10370)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsMainCommandFactory.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -1,112 +0,0 @@
-package org.jboss.labs.mapper.command;
-
-import org.jboss.portal.core.controller.command.mapper.CommandFactory;
-import org.jboss.portal.core.controller.ControllerCommand;
-import org.jboss.portal.core.model.portal.*;
-import org.jboss.portal.server.ServerInvocation;
-import org.jboss.labs.mapper.PathParser;
-import org.jboss.forge.common.Constants;
-
-/**
- * Main Labs command factory. Finds the most specific portal object
- * the request reffers to; then tries to delegate the mapping to
- * some registered delegate factory and if this is unsuccessfull,
- * default portal object mapping is invoked.
- * @author Adam Warski (adamw at aster.pl)
- */
-public class LabsMainCommandFactory extends AbstractLabsBaseCommandFactory implements CommandFactory {
-    private LabsDelegatingCommandFactory delegatingCF;
-    private LabsPortalObjectCommandFactory portalObjectCF;
-
-    /*
-     * Getters and setters.
-     */
-
-    public LabsPortalObjectCommandFactory getPortalObjectCF() {
-        return portalObjectCF;
-    }
-
-    public void setPortalObjectCF(LabsPortalObjectCommandFactory portalObjectCF) {
-        this.portalObjectCF = portalObjectCF;
-    }
-
-    public LabsDelegatingCommandFactory getDelegatingCF() {
-        return delegatingCF;
-    }
-
-    public void setDelegatingCF(LabsDelegatingCommandFactory delegatingCF) {
-        this.delegatingCF = delegatingCF;
-    }
-
-    /**
-     * Portal id of the labs portal.
-     */
-    private PortalObjectId defaultPortalPath = PortalObjectId.parse("/" + Constants.LABS_PORTAL,
-            PortalObjectId.CANONICAL_FORMAT);
-
-    /**
-     *
-     * @return A portal object representing the Labs portal.
-     */
-    private Portal getLabsPortal() {
-        return (Portal) getContainer().getObject(defaultPortalPath);
-    }
-
-    /**
-     *
-     * @param parser Parser from which to read the data.
-     * @return The most specific portal object, corresponding to the data from
-     * the parser.
-     */
-    private PortalObject getPortalObject(PathParser parser) {
-        PortalObject o = getLabsPortal();
-
-        while (true) {
-            if (!parser.hasFirstToken()) {
-                return o;
-            }
-            
-            PortalObject child = o.getChild(parser.getFirstToken());
-
-            if (child == null) {
-                return o;
-            }
-
-            o = child;
-            parser.proceed();
-        }
-    }
-
-    public ControllerCommand doMapping(ServerInvocation invocation, String host,
-                                       String contextPath, String requestPath) {
-        PathParser parser = new PathParser(requestPath);
-
-        // Getting the portal object referenced by the path.
-        PortalObject target = getPortalObject(parser);
-
-        // In case the portal object is a portal, the "real" target is this
-        // portal's default page.
-        if (target instanceof Portal) {
-            target = ((Portal) target).getDefaultPage();
-        }
-
-        if (target instanceof Page) {
-            // First trying to delegate the mapping.
-            ControllerCommand cmd = delegatingCF.doMapping(invocation, host, contextPath, parser);
-
-            if (cmd == null) {
-                // If this is unsuccessfull, doing the default page mappnig.
-                return getPortalObjectCF().doMapping(invocation, parser, (Page) target);
-            } else {
-                return cmd;
-            }
-        } else if (target instanceof Window) {
-            // If the path referenced a window, then the mapping cannot be
-            // delegated; doing the default window mapping.
-            return getPortalObjectCF().doMapping(invocation, parser, (Window) target);
-        } else {
-            // Unknown portal object type.
-            return null;
-        }
-    }
-}

Deleted: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsPortalObjectCommandFactory.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsPortalObjectCommandFactory.java	2007-03-20 22:44:49 UTC (rev 10370)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsPortalObjectCommandFactory.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -1,26 +0,0 @@
-package org.jboss.labs.mapper.command;
-
-import org.jboss.portal.core.controller.ControllerCommand;
-import org.jboss.portal.core.model.portal.Page;
-import org.jboss.portal.core.model.portal.Window;
-import org.jboss.portal.server.ServerInvocation;
-import org.jboss.labs.mapper.PathParser;
-
-import java.util.Map;
-
-/**
- * A command factory which maps a page/ window request to a freezone
- * request, or a portal action/ render request.
- * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
- */
-public interface LabsPortalObjectCommandFactory {
-    public ControllerCommand doMapping(ServerInvocation invocation, PathParser parser,
-                                       Page page);
-
-    public ControllerCommand doMapping(ServerInvocation invocation, PathParser parser,
-                                       Window window);
-
-    public ControllerCommand doMapping(ServerInvocation invocation, Window window,
-                                        Map<String, Object> additionalParameters,
-                                        boolean overwrite);
-}

Deleted: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsPortalObjectCommandFactoryImpl.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsPortalObjectCommandFactoryImpl.java	2007-03-20 22:44:49 UTC (rev 10370)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsPortalObjectCommandFactoryImpl.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -1,204 +0,0 @@
-package org.jboss.labs.mapper.command;
-
-import org.jboss.portal.core.controller.ControllerCommand;
-import org.jboss.portal.core.model.portal.Page;
-import org.jboss.portal.core.model.portal.Window;
-import org.jboss.portal.core.model.portal.command.RenderPageCommand;
-import org.jboss.portal.core.model.portal.command.InvokePortletWindowRenderCommand;
-import org.jboss.portal.core.model.portal.command.InvokePortletWindowActionCommand;
-import org.jboss.portal.core.model.portal.command.ImportPageToDashboardCommand;
-import org.jboss.portal.server.ServerInvocation;
-import org.jboss.portal.portlet.PortletParametersStateString;
-import org.jboss.portal.portlet.StateString;
-import org.jboss.portal.portlet.impl.PortletRequestDecoder;
-import org.jboss.portal.theme.navigation.WindowNavigationalState;
-import org.jboss.portal.WindowState;
-import org.jboss.portal.Mode;
-import org.jboss.forge.common.Constants;
-import org.jboss.forge.common.ForgeHelper;
-import org.jboss.forge.common.projects.ProjectsHelper;
-import org.jboss.forge.common.exceptions.ServiceRetrievalException;
-import org.jboss.forge.common.ejb3.LabsServices;
-import org.jboss.labs.mapper.PathParser;
-import org.jboss.labs.mapper.MapperTools;
-import org.jboss.shotoku.aop.Inject;
-import org.jboss.shotoku.ContentManager;
-import org.jboss.shotoku.tools.Tools;
-import org.jboss.shotoku.exceptions.ResourceDoesNotExist;
-
-import java.util.Map;
-import java.util.HashMap;
-
-/**
- * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
- */
-public class LabsPortalObjectCommandFactoryImpl extends AbstractLabsBaseCommandFactory
-        implements LabsPortalObjectCommandFactory {
-    @Inject
-    private ContentManager cm;
-
-    public ControllerCommand doMapping(ServerInvocation invocation, PathParser parser,
-                                       Window window) {
-        return doMapping(invocation, window, null, true);
-    }
-
-    public ControllerCommand doMapping(ServerInvocation invocation, Window window,
-                                        Map<String, Object> additionalParameters,
-                                        boolean overwrite) {
-        if (window == null) {
-            throw new IllegalArgumentException("Window cannot be null.");
-        }
-
-        //noinspection unchecked
-        Map<String, String[]> queryParams = new HashMap<String, String[]>(
-                invocation.getServerContext().getQueryParameterMap());
-
-        if (additionalParameters != null) {
-            for (String key : additionalParameters.keySet()) {
-                if ((!overwrite) && (queryParams.containsKey(key))) {
-                    continue;
-                }
-
-                Object value = additionalParameters.get(key);
-                if (value instanceof String[]) {
-                    queryParams.put(key, (String[]) value);
-                } else if (value != null) {
-                    queryParams.put(key, new String[] { value.toString() });
-                }
-            }
-        }
-
-        // Decoding the window state.
-        PortletRequestDecoder decoder = new PortletRequestDecoder();
-        decoder.decode(queryParams, invocation.getServerContext().getBodyParameterMap());
-
-        // Get the window navigational state
-        WindowNavigationalState windowNavState = MapperTools.getWindowNavState(invocation, window);
-
-        //
-        WindowState windowState = decoder.getWindowState();
-        if (windowState == null) {
-            windowState = windowNavState.getWindowState();
-        }
-
-        //
-        Mode mode = decoder.getMode();
-        if (mode == null) {
-            mode = windowNavState.getMode();
-        }
-
-        // If any additional navigational parameters where passed and if we
-        // can add them, adding them.
-        StateString navState = decoder.getNavigationalstate();
-
-        // Returning an appropriate command.
-        switch (decoder.getType())
-        {
-            case PortletRequestDecoder.NAV_TYPE:
-                return new InvokePortletWindowRenderCommand(window.getId(), mode, windowState);
-            case PortletRequestDecoder.ACTION_TYPE:
-                return new InvokePortletWindowActionCommand(window.getId(), mode, windowState,
-                        navState, decoder.getInteractionState(),
-                        decoder.getForm());
-            case PortletRequestDecoder.RENDER_TYPE:
-                return new InvokePortletWindowRenderCommand(window.getId(), mode, windowState,
-                        navState);
-        }
-
-        return null;
-    }
-
-    protected final static String FREEZONE_PORTLET_NAME = "freezone";
-
-    private String getFreezoneWindowId(String projectId, Page page) {
-        try {
-            if (projectId == null) {
-                return LabsServices.getProjectPagesService().createWindowId(
-                        FREEZONE_PORTLET_NAME, null, page.getName(), null);
-            } else {
-                String pageName = null;
-                if (!Tools.objectsEqual(projectId, page.getName())) {
-                    // The page is not a main project page, but a subpage.
-                    // So it must be considered when generating the window id.
-                    pageName = page.getName();
-                }
-                return LabsServices.getProjectPagesService().createWindowId(
-                        FREEZONE_PORTLET_NAME, projectId, pageName, null);
-            }
-        } catch (ServiceRetrievalException e) {
-            return null;
-        }
-    }
-
-    public ControllerCommand doMapping(ServerInvocation invocation, PathParser parser,
-                                       Page page) {
-        if (page == null) {
-            throw new IllegalArgumentException("Page cannot be null.");
-        }
-
-        // If a page is requested, the URL must end with a /, in order for
-        // relative paths to work.
-        if ((!parser.hasFirstToken()) && (!parser.getFullPath().endsWith("/"))) {
-            sendRedirect(invocation, parser.getFullPath()+"/");
-            return null;
-        }
-
-        // Checking if there is a freezone on the page.
-        String projectId = page.getDeclaredProperty(Constants.PORTAL_OBJECT_LABS_MARKER);
-
-        Window freezone = null;
-        String freezoneId = getFreezoneWindowId(projectId, page);
-
-        if (freezoneId != null) {
-            freezone = page.getWindow(freezoneId);
-        }
-
-        if (freezone != null) {
-            // Found a freezone window; invoking a render command on it.
-            String path = parser.getCurrent();
-
-            // Checking the mime type of the requested resource.
-            try {
-                String absPath = ProjectsHelper.createAbsoluteFreezonePath(projectId,
-                        path);
-                if (!Constants.PAGES_MIME_TYPE.equals(cm.getNode(absPath).getMimeType())) {
-                    // A binary request; redirecting to file-access.
-                    sendRedirect(invocation, ForgeHelper.createFileAccessPath(absPath));
-                    return null;
-                }
-            } catch (ResourceDoesNotExist resourceDoesNotExist) {
-                // The page does not exist; proceeding.
-            }
-
-            // Setting the path parameter for the freezone to know what page
-            // to display. It has to be not-null, so "" is used as a
-            // null-marker.
-            if (path == null) { path = ""; }
-
-            // Checking if there is a meta parameter - if so, invoking portal actions.
-            if (hasMetaParameter(invocation)) {
-                // If so, invoking default portal actions on a window action request,
-                // with a default path parameter.
-                Map<String, Object> additionalParameters = new HashMap<String, Object>();
-                additionalParameters.put(Constants.FREEZONE_PATH_PARAM, path);
-
-                return doMapping(invocation, freezone, additionalParameters, true);
-            }
-
-            // Otherwise, invoking a render command on the freezone window.
-            PortletParametersStateString params = new PortletParametersStateString();
-            params.setValue(Constants.FREEZONE_PATH_PARAM, path);
-            return invokeRenderCommand(invocation, freezone, params);
-        }
-
-        // Invoking a normal page render command.
-        String action = invocation.getServerContext().getQueryParameterMap().getValue("action");
-
-        //
-        if ("import".equals(action)) {
-            return new ImportPageToDashboardCommand(page.getId());
-        } else {
-            return new RenderPageCommand(page.getId());
-        }
-    }
-}

Copied: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/MainCF.java (from rev 10330, labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsMainCommandFactory.java)
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/MainCF.java	                        (rev 0)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/MainCF.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -0,0 +1,116 @@
+package org.jboss.labs.mapper.command;
+
+import org.jboss.portal.core.controller.command.mapper.CommandFactory;
+import org.jboss.portal.core.controller.ControllerCommand;
+import org.jboss.portal.core.model.portal.*;
+import org.jboss.portal.server.ServerInvocation;
+import org.jboss.labs.mapper.PathParser;
+import org.jboss.labs.mapper.command.delegating.page.PageDelegatingCF;
+import org.jboss.forge.common.Constants;
+
+/**
+ * Main Labs command factory. Finds the most specific portal object
+ * the request reffers to; then tries to delegate the mapping to
+ * some registered delegate factory and if this is unsuccessfull,
+ * default portal object mapping is invoked.
+ * @author Adam Warski (adamw at aster.pl)
+ */
+public class MainCF extends AbstractBaseCF implements CommandFactory {
+    private PageDelegatingCF pageDelegatingCF;
+    private PortalObjectCF portalObjectCF;
+
+    /*
+     * Getters and setters.
+     */
+
+    public PortalObjectCF getPortalObjectCF() {
+        return portalObjectCF;
+    }
+
+    public void setPortalObjectCF(PortalObjectCF portalObjectCF) {
+        this.portalObjectCF = portalObjectCF;
+    }
+
+    public PageDelegatingCF getPageDelegatingCF() {
+        return pageDelegatingCF;
+    }
+
+    public void setPageDelegatingCF(PageDelegatingCF pageDelegatingCF) {
+        this.pageDelegatingCF = pageDelegatingCF;
+    }
+
+    /**
+     * Portal id of the labs portal.
+     */
+    private PortalObjectId defaultPortalPath = PortalObjectId.parse("/" + Constants.LABS_PORTAL,
+            PortalObjectId.CANONICAL_FORMAT);
+
+    /**
+     *
+     * @return A portal object representing the Labs portal.
+     */
+    private Portal getLabsPortal() {
+        return (Portal) getContainer().getObject(defaultPortalPath);
+    }
+
+    /**
+     *
+     * @param parser Parser from which to read the data.
+     * @return The most specific portal object, corresponding to the data from
+     * the parser.
+     */
+    private PortalObject getPortalObject(PathParser parser) {
+        PortalObject o = getLabsPortal();
+
+        while (true) {
+            if (!parser.hasFirstToken()) {
+                return o;
+            }
+            
+            PortalObject child = o.getChild(parser.getFirstToken());
+
+            if (child == null) {
+                return o;
+            }
+
+            o = child;
+            parser.proceed();
+        }
+    }
+
+    public ControllerCommand doMapping(ServerInvocation invocation, String host,
+                                       String contextPath, String requestPath) {
+        PathParser parser = new PathParser(requestPath);
+
+        // Getting the portal object referenced by the path.
+        PortalObject target = getPortalObject(parser);
+
+        // In case the portal object is a portal, the "real" target is this
+        // portal's default page.
+        if (target instanceof Portal) {
+            target = ((Portal) target).getDefaultPage();
+        }
+
+        if (target instanceof Page) {
+            Page page = (Page) target;
+
+            // First trying to delegate the mapping to a prefix-based factory.
+            ControllerCommand cmd = pageDelegatingCF.doMapping(invocation, host, contextPath,
+                    parser, page);
+
+            if (cmd != null) {
+                return cmd;
+            }
+
+            // If this is unsuccessfull, doing the default page mappnig.
+            return getPortalObjectCF().doMapping(invocation, parser, (Page) target);
+        } else if (target instanceof Window) {
+            // If the path referenced a window, then the mapping cannot be
+            // delegated; doing the default window mapping.
+            return getPortalObjectCF().doMapping(invocation, parser, (Window) target);
+        } else {
+            // Unknown portal object type.
+            return null;
+        }
+    }
+}

Copied: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/PortalObjectCF.java (from rev 10330, labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsPortalObjectCommandFactory.java)
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/PortalObjectCF.java	                        (rev 0)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/PortalObjectCF.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -0,0 +1,26 @@
+package org.jboss.labs.mapper.command;
+
+import org.jboss.portal.core.controller.ControllerCommand;
+import org.jboss.portal.core.model.portal.Page;
+import org.jboss.portal.core.model.portal.Window;
+import org.jboss.portal.server.ServerInvocation;
+import org.jboss.labs.mapper.PathParser;
+
+import java.util.Map;
+
+/**
+ * A command factory which maps a page/ window request to a freezone
+ * request, or a portal action/ render request.
+ * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
+ */
+public interface PortalObjectCF {
+    public ControllerCommand doMapping(ServerInvocation invocation, PathParser parser,
+                                       Page page);
+
+    public ControllerCommand doMapping(ServerInvocation invocation, PathParser parser,
+                                       Window window);
+
+    public ControllerCommand doMapping(ServerInvocation invocation, Window window,
+                                        Map<String, Object> additionalParameters,
+                                        boolean overwrite);
+}

Copied: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/PortalObjectCFImpl.java (from rev 10330, labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsPortalObjectCommandFactoryImpl.java)
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/PortalObjectCFImpl.java	                        (rev 0)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/PortalObjectCFImpl.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -0,0 +1,204 @@
+package org.jboss.labs.mapper.command;
+
+import org.jboss.portal.core.controller.ControllerCommand;
+import org.jboss.portal.core.model.portal.Page;
+import org.jboss.portal.core.model.portal.Window;
+import org.jboss.portal.core.model.portal.command.RenderPageCommand;
+import org.jboss.portal.core.model.portal.command.InvokePortletWindowRenderCommand;
+import org.jboss.portal.core.model.portal.command.InvokePortletWindowActionCommand;
+import org.jboss.portal.core.model.portal.command.ImportPageToDashboardCommand;
+import org.jboss.portal.server.ServerInvocation;
+import org.jboss.portal.portlet.PortletParametersStateString;
+import org.jboss.portal.portlet.StateString;
+import org.jboss.portal.portlet.impl.PortletRequestDecoder;
+import org.jboss.portal.theme.navigation.WindowNavigationalState;
+import org.jboss.portal.WindowState;
+import org.jboss.portal.Mode;
+import org.jboss.forge.common.Constants;
+import org.jboss.forge.common.ForgeHelper;
+import org.jboss.forge.common.projects.ProjectsHelper;
+import org.jboss.forge.common.exceptions.ServiceRetrievalException;
+import org.jboss.forge.common.ejb3.LabsServices;
+import org.jboss.labs.mapper.PathParser;
+import org.jboss.labs.mapper.MapperTools;
+import org.jboss.shotoku.aop.Inject;
+import org.jboss.shotoku.ContentManager;
+import org.jboss.shotoku.tools.Tools;
+import org.jboss.shotoku.exceptions.ResourceDoesNotExist;
+
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
+ */
+public class PortalObjectCFImpl extends AbstractBaseCF
+        implements PortalObjectCF {
+    @Inject
+    private ContentManager cm;
+
+    public ControllerCommand doMapping(ServerInvocation invocation, PathParser parser,
+                                       Window window) {
+        return doMapping(invocation, window, null, true);
+    }
+
+    public ControllerCommand doMapping(ServerInvocation invocation, Window window,
+                                        Map<String, Object> additionalParameters,
+                                        boolean overwrite) {
+        if (window == null) {
+            throw new IllegalArgumentException("Window cannot be null.");
+        }
+
+        //noinspection unchecked
+        Map<String, String[]> queryParams = new HashMap<String, String[]>(
+                invocation.getServerContext().getQueryParameterMap());
+
+        if (additionalParameters != null) {
+            for (String key : additionalParameters.keySet()) {
+                if ((!overwrite) && (queryParams.containsKey(key))) {
+                    continue;
+                }
+
+                Object value = additionalParameters.get(key);
+                if (value instanceof String[]) {
+                    queryParams.put(key, (String[]) value);
+                } else if (value != null) {
+                    queryParams.put(key, new String[] { value.toString() });
+                }
+            }
+        }
+
+        // Decoding the window state.
+        PortletRequestDecoder decoder = new PortletRequestDecoder();
+        decoder.decode(queryParams, invocation.getServerContext().getBodyParameterMap());
+
+        // Get the window navigational state
+        WindowNavigationalState windowNavState = MapperTools.getWindowNavState(invocation, window);
+
+        //
+        WindowState windowState = decoder.getWindowState();
+        if (windowState == null) {
+            windowState = windowNavState.getWindowState();
+        }
+
+        //
+        Mode mode = decoder.getMode();
+        if (mode == null) {
+            mode = windowNavState.getMode();
+        }
+
+        // If any additional navigational parameters where passed and if we
+        // can add them, adding them.
+        StateString navState = decoder.getNavigationalstate();
+
+        // Returning an appropriate command.
+        switch (decoder.getType())
+        {
+            case PortletRequestDecoder.NAV_TYPE:
+                return new InvokePortletWindowRenderCommand(window.getId(), mode, windowState);
+            case PortletRequestDecoder.ACTION_TYPE:
+                return new InvokePortletWindowActionCommand(window.getId(), mode, windowState,
+                        navState, decoder.getInteractionState(),
+                        decoder.getForm());
+            case PortletRequestDecoder.RENDER_TYPE:
+                return new InvokePortletWindowRenderCommand(window.getId(), mode, windowState,
+                        navState);
+        }
+
+        return null;
+    }
+
+    protected final static String FREEZONE_PORTLET_NAME = "freezone";
+
+    private String getFreezoneWindowId(String projectId, Page page) {
+        try {
+            if (projectId == null) {
+                return LabsServices.getProjectPagesService().createWindowId(
+                        FREEZONE_PORTLET_NAME, null, page.getName(), null);
+            } else {
+                String pageName = null;
+                if (!Tools.objectsEqual(projectId, page.getName())) {
+                    // The page is not a main project page, but a subpage.
+                    // So it must be considered when generating the window id.
+                    pageName = page.getName();
+                }
+                return LabsServices.getProjectPagesService().createWindowId(
+                        FREEZONE_PORTLET_NAME, projectId, pageName, null);
+            }
+        } catch (ServiceRetrievalException e) {
+            return null;
+        }
+    }
+
+    public ControllerCommand doMapping(ServerInvocation invocation, PathParser parser,
+                                       Page page) {
+        if (page == null) {
+            throw new IllegalArgumentException("Page cannot be null.");
+        }
+
+        // If a page is requested, the URL must end with a /, in order for
+        // relative paths to work.
+        if ((!parser.hasFirstToken()) && (!parser.getFullPath().endsWith("/"))) {
+            sendRedirect(invocation, parser.getFullPath()+"/");
+            return null;
+        }
+
+        // Checking if there is a freezone on the page.
+        String projectId = page.getDeclaredProperty(Constants.PORTAL_OBJECT_LABS_MARKER);
+
+        Window freezone = null;
+        String freezoneId = getFreezoneWindowId(projectId, page);
+
+        if (freezoneId != null) {
+            freezone = page.getWindow(freezoneId);
+        }
+
+        if (freezone != null) {
+            // Found a freezone window; invoking a render command on it.
+            String path = parser.getCurrent();
+
+            // Checking the mime type of the requested resource.
+            try {
+                String absPath = ProjectsHelper.createAbsoluteFreezonePath(projectId,
+                        path);
+                if (!Constants.PAGES_MIME_TYPE.equals(cm.getNode(absPath).getMimeType())) {
+                    // A binary request; redirecting to file-access.
+                    sendRedirect(invocation, ForgeHelper.createFileAccessPath(absPath));
+                    return null;
+                }
+            } catch (ResourceDoesNotExist resourceDoesNotExist) {
+                // The page does not exist; proceeding.
+            }
+
+            // Setting the path parameter for the freezone to know what page
+            // to display. It has to be not-null, so "" is used as a
+            // null-marker.
+            if (path == null) { path = ""; }
+
+            // Checking if there is a meta parameter - if so, invoking portal actions.
+            if (hasMetaParameter(invocation)) {
+                // If so, invoking default portal actions on a window action request,
+                // with a default path parameter.
+                Map<String, Object> additionalParameters = new HashMap<String, Object>();
+                additionalParameters.put(Constants.FREEZONE_PATH_PARAM, path);
+
+                return doMapping(invocation, freezone, additionalParameters, true);
+            }
+
+            // Otherwise, invoking a render command on the freezone window.
+            PortletParametersStateString params = new PortletParametersStateString();
+            params.setValue(Constants.FREEZONE_PATH_PARAM, path);
+            return invokeRenderCommand(invocation, freezone, params);
+        }
+
+        // Invoking a normal page render command.
+        String action = invocation.getServerContext().getQueryParameterMap().getValue("action");
+
+        //
+        if ("import".equals(action)) {
+            return new ImportPageToDashboardCommand(page.getId());
+        } else {
+            return new RenderPageCommand(page.getId());
+        }
+    }
+}

Deleted: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/WikiCommandFactory.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/WikiCommandFactory.java	2007-03-20 22:44:49 UTC (rev 10370)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/WikiCommandFactory.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -1,135 +0,0 @@
-package org.jboss.labs.mapper.command;
-
-import org.jboss.portal.core.controller.ControllerCommand;
-import org.jboss.portal.core.model.portal.PortalObjectId;
-import org.jboss.portal.core.model.portal.Window;
-import org.jboss.portal.core.model.portal.command.RenderPageCommand;
-import org.jboss.portal.server.ServerInvocation;
-import org.jboss.portal.portlet.PortletParametersStateString;
-import org.jboss.portal.portlet.impl.PortletRequestDecoder;
-import org.jboss.labs.mapper.PathParser;
-import org.jboss.labs.mapper.MapperTools;
-import org.jboss.forge.common.Constants;
-
-/**
- * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
- */
-public class WikiCommandFactory extends AbstractLabsDelegateCommandFactory {
-	private String pageName;
-
-	private PortalObjectId wikiPageId;
-
-	private String windowName;
-
-	private PortalObjectId windowId;
-
-	private LabsPortalObjectCommandFactory portalObjectCF;
-
-	private void setIds() {
-		if ((pageName != null) && (windowName != null)) {
-			wikiPageId = PortalObjectId.parse("/" + Constants.LABS_PORTAL + "/"
-					+ pageName, PortalObjectId.CANONICAL_FORMAT);
-
-			windowId = PortalObjectId.parse("/" + Constants.LABS_PORTAL + "/"
-					+ pageName + "/" + windowName,
-					PortalObjectId.CANONICAL_FORMAT);
-		}
-	}
-
-	public String getPageName() {
-		return pageName;
-	}
-
-	public void setPageName(String pageName) {
-		this.pageName = pageName;
-		setIds();
-	}
-
-	public String getWindowName() {
-		return windowName;
-	}
-
-	public void setWindowName(String windowName) {
-		this.windowName = windowName;
-		setIds();
-	}
-
-	public LabsPortalObjectCommandFactory getPortalObjectCF() {
-		return portalObjectCF;
-	}
-
-	public void setPortalObjectCF(LabsPortalObjectCommandFactory portalObjectCF) {
-		this.portalObjectCF = portalObjectCF;
-	}
-
-	private ControllerCommand getDefaultCommand() {
-		return new RenderPageCommand(wikiPageId);
-	}
-
-	public ControllerCommand doMapping(ServerInvocation invocation,
-			String host, String contextPath, PathParser parser) {
-		String firstToken = parser.getFirstToken();
-		String language = null;
-		String current = parser.getCurrent();
-
-		if ((firstToken != null)
-				&& (firstToken.length() == 2)
-				&& (Character.isLowerCase(firstToken.charAt(0)) && Character
-						.isLowerCase(firstToken.charAt(1)))) {
-			language = firstToken.toUpperCase();
-			parser.proceed();
-		}
-
-		String page = null;
-		while (parser.hasFirstToken()) {
-			firstToken = parser.getFirstToken();
-			if (Character.isUpperCase(firstToken.charAt(0))) {
-				if (page == null) {
-					page = firstToken;
-				} else {
-					page += "/" + firstToken;
-				}
-			} else {
-				sendRedirect(invocation, "/wiki-files/" + current);
-				return null;
-			}
-
-			parser.proceed();
-		}
-
-		String version = null;
-		if ((page != null) && (page.contains(":"))) {
-			String[] tokens = page.split("[:]", 2);
-			if ((tokens.length == 2)) {
-				page = tokens[0];
-				version = tokens[1];
-			} else {
-				return getDefaultCommand();
-			}
-		}
-
-		PortletParametersStateString params = new PortletParametersStateString();
-		params
-				.setValue(MapperTools.JSF_VIEW_ID_PARAM,
-						"/views/wiki_view.xhtml");
-		if (page != null)
-			params.setValue("page", page);
-		if (language != null) {
-			params.setValue("language", language);
-		}
-		if (version != null) {
-			params.setValue("version", version);
-		}
-
-		Window wikiWindow = (Window) getContainer().getObject(windowId);
-		if (hasMetaParameter(invocation)) {
-			return getPortalObjectCF().doMapping(invocation, wikiWindow,
-					params.getMap(), false);
-		} else {
-			params.setValue(PortletRequestDecoder.META_PARAMETER, Integer
-					.toString(PortletRequestDecoder.RENDER_MASK));
-			return getPortalObjectCF().doMapping(invocation, wikiWindow,
-					params.getMap(), false);
-		}
-	}
-}

Copied: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/AbstractPageDelegateCF.java (from rev 10330, labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/AbstractLabsDelegateCommandFactory.java)
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/AbstractPageDelegateCF.java	                        (rev 0)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/AbstractPageDelegateCF.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -0,0 +1,47 @@
+package org.jboss.labs.mapper.command.delegating.page;
+
+import org.jboss.labs.mapper.command.AbstractBaseCF;
+import org.jboss.labs.mapper.command.PortalObjectCF;
+
+/**
+ * A base class for Labs delegate command factories.
+ * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
+ */
+public abstract class AbstractPageDelegateCF extends AbstractBaseCF
+        implements PageDelegateCF {
+    private PageDelegatingCF pageDelegatingCF;
+    private PortalObjectCF portalObjectCF;
+    private String path;
+
+    public PageDelegatingCF getPageDelegatingCF() {
+        return pageDelegatingCF;
+    }
+
+    public void setPageDelegatingCF(PageDelegatingCF pageDelegatingCF) {
+        this.pageDelegatingCF = pageDelegatingCF;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public PortalObjectCF getPortalObjectCF() {
+        return portalObjectCF;
+    }
+
+    public void setPortalObjectCF(PortalObjectCF portalObjectCF) {
+        this.portalObjectCF = portalObjectCF;
+    }
+
+    /*
+    * Service lifecycle methods.
+    */
+
+    protected void startService() throws Exception {
+        getPageDelegatingCF().register(getPath(), this);
+    }
+}

Added: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/DownloadCF.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/DownloadCF.java	                        (rev 0)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/DownloadCF.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -0,0 +1,75 @@
+package org.jboss.labs.mapper.command.delegating.page;
+
+import org.jboss.portal.core.controller.ControllerCommand;
+import org.jboss.portal.core.model.portal.Page;
+import org.jboss.portal.core.model.portal.Window;
+import org.jboss.portal.core.model.portal.PortalObjectContainer;
+import org.jboss.portal.server.ServerInvocation;
+import org.jboss.portal.portlet.impl.PortletRequestDecoder;
+import org.jboss.labs.mapper.PathParser;
+import org.jboss.forge.common.Constants;
+import org.jboss.forge.common.exceptions.ServiceRetrievalException;
+import org.jboss.forge.common.ejb3.LabsServices;
+import org.jboss.forge.common.ejb3.ProjectPagesService;
+
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
+ */
+public class DownloadCF extends AbstractPageDelegateCF {
+    protected final static String DOWNLOAD_PORTLET_NAME = "downloads";
+
+    public ControllerCommand doMapping(ServerInvocation invocation, String host,
+                                       String contextPath, PathParser parser, Page page) {
+        String projectId = page.getDeclaredProperty(Constants.PORTAL_OBJECT_LABS_MARKER);
+
+        // Only project pages are supported.
+        if (projectId == null) {
+            return null;
+        }
+
+        ProjectPagesService pps;
+
+        try {
+            pps = LabsServices.getProjectPagesService();
+        } catch (ServiceRetrievalException e) {
+            return null;
+        }
+
+        String pageName = null;
+        if (!projectId.equals(page.getName())) {
+            pageName = page.getName();
+        }
+
+        // First trying a window with a possible unique-id
+        Window downloadsWindow = page.getWindow(pps.createWindowId(DOWNLOAD_PORTLET_NAME, projectId, pageName,
+                parser.getFirstToken()));
+        if (downloadsWindow == null) {
+            // Trying if there is no single downloads window.
+            downloadsWindow = page.getWindow(pps.createWindowId(DOWNLOAD_PORTLET_NAME, projectId, pageName, null));
+        } else {
+            // Forgetting the unique-id.
+            parser.proceed();
+        }
+
+        // Checking if a downloads window was found on the page.
+        if (downloadsWindow == null) {
+            return null;
+        }
+
+        Map<String, Object> params = new HashMap<String, Object>();
+        params.put("category", parser.getCurrent());
+
+        if (hasMetaParameter(invocation)) {
+			return getPortalObjectCF().doMapping(invocation, downloadsWindow,
+					params, false);
+		} else {
+			params.put(PortletRequestDecoder.META_PARAMETER, Integer
+					.toString(PortletRequestDecoder.RENDER_MASK));
+			return getPortalObjectCF().doMapping(invocation, downloadsWindow,
+					params, false);
+		}
+    }
+}

Copied: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/PageDelegateCF.java (from rev 10330, labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsDelegateCommandFactory.java)
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/PageDelegateCF.java	                        (rev 0)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/PageDelegateCF.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -0,0 +1,25 @@
+package org.jboss.labs.mapper.command.delegating.page;
+
+import org.jboss.portal.core.controller.ControllerCommand;
+import org.jboss.portal.core.model.portal.Page;
+import org.jboss.portal.server.ServerInvocation;
+import org.jboss.labs.mapper.PathParser;
+import org.jboss.labs.mapper.command.BaseCF;
+
+/**
+ * A base interface for factories, to which mapping requests can
+ * be delegated basing on the request path, by
+ * {@see LabsDelegatingCommandFactory}.
+ * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
+ */
+public interface PageDelegateCF extends BaseCF {
+    public ControllerCommand doMapping(ServerInvocation invocation,
+                                       String host, String contextPath,
+                                       PathParser parser, Page page);
+
+    public PageDelegatingCF getPageDelegatingCF();
+    public void setPageDelegatingCF(PageDelegatingCF delegating);
+
+    public String getPath();
+    public void setPath(String path);
+}

Copied: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/PageDelegatingCF.java (from rev 10330, labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsDelegatingCommandFactory.java)
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/PageDelegatingCF.java	                        (rev 0)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/PageDelegatingCF.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -0,0 +1,27 @@
+package org.jboss.labs.mapper.command.delegating.page;
+
+import org.jboss.portal.core.controller.ControllerCommand;
+import org.jboss.portal.core.model.portal.Page;
+import org.jboss.portal.server.ServerInvocation;
+import org.jboss.labs.mapper.PathParser;
+import org.jboss.labs.mapper.command.BaseCF;
+
+/**
+ * A delegating command factory, which delegates mapping to registered
+ * factories based on the first token of the requested path.
+ * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
+ */
+public interface PageDelegatingCF extends BaseCF {
+    public ControllerCommand doMapping(ServerInvocation invocation,
+                                       String host, String contextPath,
+                                       PathParser parser, Page page);
+
+    /**
+     * Registeres a factory so that requests with the given first token
+     * will be delegated to it.
+     * @param path First token of the request path that must be matched
+     * in order to delegate the mapping.
+     * @param factory Factory to which mapping should be delegated.
+     */
+    public void register(String path, PageDelegateCF factory);
+}

Copied: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/PageDelegatingCFImpl.java (from rev 10330, labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/LabsDelegatingCommandFactoryImpl.java)
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/PageDelegatingCFImpl.java	                        (rev 0)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/PageDelegatingCFImpl.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -0,0 +1,47 @@
+package org.jboss.labs.mapper.command.delegating.page;
+
+import org.jboss.portal.core.controller.ControllerCommand;
+import org.jboss.portal.core.model.portal.Page;
+import org.jboss.portal.server.ServerInvocation;
+import org.jboss.labs.mapper.PathParser;
+import org.jboss.labs.mapper.command.AbstractBaseCF;
+
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * 
+ * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
+ */
+public class PageDelegatingCFImpl extends AbstractBaseCF
+        implements PageDelegatingCF {
+    private Map<String, PageDelegateCF> factories;
+
+    public PageDelegatingCFImpl() {
+        factories = new HashMap<String, PageDelegateCF>();
+    }
+
+    public ControllerCommand doMapping(ServerInvocation invocation, String host,
+                                       String contextPath, PathParser parser, Page page) {
+        if (parser.hasFirstToken()) {
+            // Checking if there is any delegate factory registered for the
+            // given token.
+            String firstToken = parser.getFirstToken();
+            for (String path : factories.keySet()) {
+                if (firstToken.equals(path)) {
+                    // Found a match; skipping the matched token and proceeding
+                    // with the mapping.                    
+                    parser.proceed();
+                    return factories.get(path).doMapping(invocation, host, contextPath,
+                            parser, page);
+                }
+            }
+        }
+
+        return null;
+    }
+
+    public synchronized void register(String path, PageDelegateCF factory) {
+        factories.put(path, factory);
+    }
+}

Copied: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/WikiCF.java (from rev 10330, labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/WikiCommandFactory.java)
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/WikiCF.java	                        (rev 0)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/command/delegating/page/WikiCF.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -0,0 +1,126 @@
+package org.jboss.labs.mapper.command.delegating.page;
+
+import org.jboss.portal.core.controller.ControllerCommand;
+import org.jboss.portal.core.model.portal.PortalObjectId;
+import org.jboss.portal.core.model.portal.Window;
+import org.jboss.portal.core.model.portal.Page;
+import org.jboss.portal.core.model.portal.command.RenderPageCommand;
+import org.jboss.portal.server.ServerInvocation;
+import org.jboss.portal.portlet.impl.PortletRequestDecoder;
+import org.jboss.labs.mapper.PathParser;
+import org.jboss.labs.mapper.MapperTools;
+import org.jboss.forge.common.Constants;
+
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
+ */
+public class WikiCF extends AbstractPageDelegateCF {
+	private String pageName;
+
+	private PortalObjectId wikiPageId;
+
+	private String windowName;
+
+	private PortalObjectId windowId;
+
+	private void setIds() {
+		if ((pageName != null) && (windowName != null)) {
+			wikiPageId = PortalObjectId.parse("/" + Constants.LABS_PORTAL + "/"
+					+ pageName, PortalObjectId.CANONICAL_FORMAT);
+
+			windowId = PortalObjectId.parse("/" + Constants.LABS_PORTAL + "/"
+					+ pageName + "/" + windowName,
+					PortalObjectId.CANONICAL_FORMAT);
+		}
+	}
+
+	public String getPageName() {
+		return pageName;
+	}
+
+	public void setPageName(String pageName) {
+		this.pageName = pageName;
+		setIds();
+	}
+
+	public String getWindowName() {
+		return windowName;
+	}
+
+	public void setWindowName(String windowName) {
+		this.windowName = windowName;
+		setIds();
+	}
+
+	private ControllerCommand getDefaultCommand() {
+		return new RenderPageCommand(wikiPageId);
+	}
+
+	public ControllerCommand doMapping(ServerInvocation invocation,
+			String host, String contextPath, PathParser parser, Page portalPage) {
+		String firstToken = parser.getFirstToken();
+		String language = null;
+		String current = parser.getCurrent();
+
+		if ((firstToken != null)
+				&& (firstToken.length() == 2)
+				&& (Character.isLowerCase(firstToken.charAt(0)) && Character
+						.isLowerCase(firstToken.charAt(1)))) {
+			language = firstToken.toUpperCase();
+			parser.proceed();
+		}
+
+		String page = null;
+		while (parser.hasFirstToken()) {
+			firstToken = parser.getFirstToken();
+			if (Character.isUpperCase(firstToken.charAt(0))) {
+				if (page == null) {
+					page = firstToken;
+				} else {
+					page += "/" + firstToken;
+				}
+			} else {
+				sendRedirect(invocation, "/wiki-files/" + current);
+				return null;
+			}
+
+			parser.proceed();
+		}
+
+		String version = null;
+		if ((page != null) && (page.contains(":"))) {
+			String[] tokens = page.split("[:]", 2);
+			if ((tokens.length == 2)) {
+				page = tokens[0];
+				version = tokens[1];
+			} else {
+				return getDefaultCommand();
+			}
+		}
+
+		Map<String, Object> params = new HashMap<String, Object>();
+		params.put(MapperTools.JSF_VIEW_ID_PARAM, "/views/wiki_view.xhtml");
+		if (page != null)
+			params.put("page", page);
+		if (language != null) {
+			params.put("language", language);
+		}
+		if (version != null) {
+			params.put("version", version);
+		}
+
+		Window wikiWindow = (Window) getContainer().getObject(windowId);
+		if (hasMetaParameter(invocation)) {
+			return getPortalObjectCF().doMapping(invocation, wikiWindow,
+					params, false);
+		} else {
+			params.put(PortletRequestDecoder.META_PARAMETER, Integer
+					.toString(PortletRequestDecoder.RENDER_MASK));
+			return getPortalObjectCF().doMapping(invocation, wikiWindow,
+					params, false);
+		}
+	}
+}

Modified: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/url/AbstractLabsDelegateUrlFactory.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/url/AbstractLabsDelegateUrlFactory.java	2007-03-20 22:44:49 UTC (rev 10370)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/url/AbstractLabsDelegateUrlFactory.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -1,9 +1,17 @@
 package org.jboss.labs.mapper.url;
 
 import org.jboss.portal.core.controller.command.mapper.URLFactoryDelegate;
+import org.jboss.portal.core.model.portal.PortalObjectId;
+import org.jboss.portal.core.model.portal.command.InvokePortletWindowActionCommand;
+import org.jboss.portal.core.model.portal.command.InvokePortletWindowRenderCommand;
 import org.jboss.portal.server.ServerURL;
 import org.jboss.portal.server.AbstractServerURL;
+import org.jboss.portal.portlet.impl.PortletRequestEncoder;
+import org.jboss.portal.portlet.impl.PortletRequestDecoder;
+import org.jboss.portal.portlet.StateString;
 
+import java.util.Iterator;
+
 /**
  * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
  */
@@ -28,4 +36,57 @@
 
         return asu;
     }
+
+    /**
+     * To the given buffer, adds a portal-id-path to the given portal object id,
+     * without the portal name (that is, the first part of the id).
+     * @param sb Buffer to which to add the path.
+     * @param id Id from which to read the information.
+     * @param addLast Should the last token be added to the buffer.
+     */
+    protected void addToPath(StringBuffer sb, PortalObjectId id, boolean addLast) {
+        Iterator it = id.names();
+        // Skipping the portal name.
+        it.next();
+        for (; it.hasNext();) {
+            String current = (String) it.next();
+
+            if ((addLast || it.hasNext())) {
+                addTokenToPath(sb, current);
+            } else {
+                break;
+            }
+        }
+    }
+
+    protected void encodeUrl(InvokePortletWindowActionCommand actionCmd,
+                             InvokePortletWindowRenderCommand renderCmd,
+                             ServerURL url, StateString navigationalState) {
+        PortletRequestEncoder encoder = new PortletRequestEncoder(url.getParameterMap());
+
+        if (actionCmd != null) {
+            encoder.encodeAction(actionCmd.getNavigationalState(),
+                    actionCmd.getInteractionState(), actionCmd.getMode(),
+                    actionCmd.getWindowState());
+        } else if (renderCmd != null) {
+            encoder.encodeRender(navigationalState,
+                    renderCmd.getMode(), renderCmd.getWindowState());
+
+            // If the request isn't only a render request, but also, for
+            // example, window state change, we leave the meta
+            // parameter intact. Otherwise, we remove it from the
+            // url.
+            Object meta = url.getParameterMap().get(
+                    PortletRequestDecoder.META_PARAMETER);
+
+            if (meta != null) {
+                int metaInt = Integer.parseInt(((String []) meta)[0], 16);
+
+                if ((metaInt | PortletRequestDecoder.RENDER_MASK) ==
+                        PortletRequestDecoder.RENDER_MASK) {
+                    url.getParameterMap().remove(PortletRequestDecoder.META_PARAMETER);
+                }
+            }
+        }
+    }
 }

Added: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/url/DownloadUrlFactory.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/url/DownloadUrlFactory.java	                        (rev 0)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/url/DownloadUrlFactory.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -0,0 +1,84 @@
+package org.jboss.labs.mapper.url;
+
+import org.jboss.portal.server.ServerURL;
+import org.jboss.portal.server.ServerInvocation;
+import org.jboss.portal.core.controller.ControllerCommand;
+import org.jboss.portal.core.model.portal.command.*;
+import org.jboss.portal.core.model.portal.PortalObjectId;
+import org.jboss.portal.core.model.portal.PortalObjectContainer;
+import org.jboss.portal.portlet.StateString;
+import org.jboss.portal.portlet.PortletParametersStateString;
+import org.jboss.forge.common.Constants;
+
+/**
+ * @author <a href="mailto:adamw at aster.pl">Adam Warski</a>
+ */
+public class DownloadUrlFactory extends AbstractLabsDelegateUrlFactory {
+    private PortalObjectContainer container;
+
+    public PortalObjectContainer getContainer() {
+        return container;
+    }
+
+    public void setContainer(PortalObjectContainer container) {
+        this.container = container;
+    }
+
+    public ServerURL doMapping(ServerInvocation invocation, ControllerCommand cmd) {
+        if (cmd == null) {
+            throw new IllegalArgumentException("No null command accepted");
+        }
+
+        if (cmd instanceof InvokeWindowCommand) {
+            PortalObjectCommand poc = (PortalObjectCommand) cmd;
+            PortalObjectId targetId = poc.getTargetId();
+
+            if (targetId.getLength() >= 0) {
+                return null;
+            }
+
+            if (targetId.getName(Math.abs(targetId.getLength()) - 1).toLowerCase().contains(getPath())) {
+                StringBuffer sb = new StringBuffer();
+                addToPath(sb, targetId, false);
+                addTokenToPath(sb, getPath());
+
+                InvokePortletWindowActionCommand actionCmd = null;
+                InvokePortletWindowRenderCommand renderCmd = null;
+
+                StateString navigationalState = null;
+
+                if (poc instanceof InvokePortletWindowActionCommand) {
+                    actionCmd = (InvokePortletWindowActionCommand) poc;
+                    navigationalState = actionCmd.getNavigationalState();                    
+                } else if (poc instanceof InvokePortletWindowRenderCommand) {
+                    renderCmd = (InvokePortletWindowRenderCommand) poc;
+                    navigationalState = renderCmd.getNavigationalState();
+                }
+
+                String uniqueId = getContainer().getObject(targetId).getDeclaredProperty(
+                        Constants.PORTAL_OBJECT_UNIQUE_ID_MARKER);
+                if (uniqueId != null) {
+                    addTokenToPath(sb, uniqueId);
+                }
+
+                if (navigationalState instanceof PortletParametersStateString) {
+                    PortletParametersStateString ppss =
+                            (PortletParametersStateString) navigationalState;
+
+                    if (ppss.getValue("category") != null) {
+                        addTokenToPath(sb, ppss.getValue("category").toLowerCase());
+                    }
+                }
+
+                ServerURL url = convertToURL(sb);
+                encodeUrl(actionCmd, renderCmd, url, navigationalState);
+                
+                url.getParameterMap().remove("category");
+
+                return url;
+            }
+        }
+
+        return null;
+    }
+}

Modified: labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/url/WikiUrlFactory.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/url/WikiUrlFactory.java	2007-03-20 22:44:49 UTC (rev 10370)
+++ labs/jbosslabs/trunk/portal-extensions/forge-mapper/src/java/org/jboss/labs/mapper/url/WikiUrlFactory.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -6,8 +6,6 @@
 import org.jboss.portal.server.ServerInvocation;
 import org.jboss.portal.portlet.StateString;
 import org.jboss.portal.portlet.PortletParametersStateString;
-import org.jboss.portal.portlet.impl.PortletRequestEncoder;
-import org.jboss.portal.portlet.impl.PortletRequestDecoder;
 import org.jboss.labs.mapper.MapperTools;
 
 /**
@@ -70,33 +68,8 @@
                     }
 
                     ServerURL url = convertToURL(sb);
-                    PortletRequestEncoder encoder = new PortletRequestEncoder(url.getParameterMap());
+                    encodeUrl(actionCmd, renderCmd, url, navigationalState);
 
-                    if (actionCmd != null) {
-                        encoder.encodeAction(actionCmd.getNavigationalState(),
-                                actionCmd.getInteractionState(), actionCmd.getMode(),
-                                actionCmd.getWindowState());
-                    } else if (renderCmd != null) {
-                        encoder.encodeRender(navigationalState,
-                                renderCmd.getMode(), renderCmd.getWindowState());
-
-                        // If the request isn't only a render request, but also, for
-                        // example, window state change, we leave the meta
-                        // parameter intact. Otherwise, we remove it from the
-                        // url.
-                        Object meta = url.getParameterMap().get(
-                                PortletRequestDecoder.META_PARAMETER);
-
-                        if (meta != null) {
-                            int metaInt = Integer.parseInt(((String []) meta)[0], 16);
-
-                            if ((metaInt | PortletRequestDecoder.RENDER_MASK) ==
-                                    PortletRequestDecoder.RENDER_MASK) {
-                                url.getParameterMap().remove(PortletRequestDecoder.META_PARAMETER);
-                            }
-                        }
-                    }
-
                     String[] jsfPageParam = (String[]) url.getParameterMap().get(
                             MapperTools.JSF_VIEW_ID_PARAM);
                     String jsfPage = jsfPageParam == null ? null : jsfPageParam[0];

Modified: labs/jbosslabs/trunk/portal-extensions/forge-portlets/src/java/org/jboss/forge/projects/downloads/Downloads.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-portlets/src/java/org/jboss/forge/projects/downloads/Downloads.java	2007-03-20 22:44:49 UTC (rev 10370)
+++ labs/jbosslabs/trunk/portal-extensions/forge-portlets/src/java/org/jboss/forge/projects/downloads/Downloads.java	2007-03-20 23:51:47 UTC (rev 10371)
@@ -29,7 +29,6 @@
 
 import javax.portlet.PortletRequestDispatcher;
 
-import org.jboss.forge.common.Constants;
 import org.jboss.forge.common.ForgeHelper;
 import org.jboss.forge.common.ejb3.LabsServices;
 import org.jboss.forge.common.exceptions.ServiceRetrievalException;
@@ -47,10 +46,6 @@
  * @author adamw
  */
 public class Downloads extends JBossPortlet {
-	private final static String DOWNLOADS_JSP = "prj-downloads/downloads.jsp";
-
-	private static final String DOWNLOADS = "Downloads";
-
 	public void doView(JBossRenderRequest request, JBossRenderResponse response)
 			throws IOException {
 		response.setContentType("text/html");
@@ -62,42 +57,37 @@
 			// Getting the selected project
 			String projectId = ProjectsHelper.getSelectedProjectId(request);
 			if (projectId == null)
-				throw new Exception("1");
+				throw new Exception("No project selected");
 
 			response.setTitle(projects.getProjectName(projectId) + " "
-					+ DOWNLOADS);
+					+ "Downloads");
 
 			// Getting the selected category (null if no selected category)
-			String categoryId = request
-					.getParameter(Constants.FREEZONE_PATH_PARAM);
+			String categoryId = request.getParameter("category");
 
-			// Getting the appropriate context
-			Set<File> files = getAllFiles(projectId);
+            request.setAttribute(DownloadsConstants.FILES, getAllFiles(projectId));
 
-			request.setAttribute(DownloadsConstants.FILES, files);
-
 			// Setting the attributes
-			// request.setAttribute(PortalJsp.CTX_REQUEST, context);
 			request.setAttribute(ProjectsHelper.PROJECT_ID, projectId);
 
 			// set tagme attributes
-			request.setAttribute("DOWNLOAD-URL", "/portal/" + projectId
+			request.setAttribute("DOWNLOAD-URL", "/" + projectId
 					+ "/downloads/" + ((categoryId != null) ? categoryId : ""));
 
 			if (request.getUser() != null) {
-				request.setAttribute("DOWNLOAD-USER", request.getUser()
-						.getUserName());
+				request.setAttribute("DOWNLOAD-USER", request.getUser().getUserName());
 			}
 
 			// Displaying the JSP
 			PortletRequestDispatcher rd = getPortletContext()
 					.getRequestDispatcher(
 							ForgeHelper.createRepoAccessPath(portalName,
-									DOWNLOADS_JSP));
+									"prj-downloads/downloads.jsp"));
 
 			rd.include(request, response);
 		} catch (Exception e) {
-			response.getWriter().write("ERROR: " + e.getMessage());
+            e.printStackTrace();
+            response.getWriter().write("ERROR: " + e.getMessage());
 		}
 	}
 
@@ -106,7 +96,20 @@
 		Set<File> allFiles = new TreeSet<File>(new Comparator<File>() {
 
 			public int compare(File o1, File o2) {
-				return o1.getRelease().compareTo(o2.getRelease());
+                if (o1 == null) {
+                    if (o2 == null) return 0;
+                    return -1;
+                }
+
+                if (o1.getRelease() == null) {
+                    if (o2.getRelease() == null) {
+                        return 0;
+                    }
+
+                    return -1;
+                }
+
+                return o1.getRelease().compareTo(o2.getRelease());
 			}
 
 		});
@@ -123,7 +126,11 @@
 	}
 
 	private void addFilesFromCategory(Set<File> allFiles, Category category) {
-		for (Category c : category.getCategories().getCategory()) {
+        if (category.getCategories() == null) {
+            return;
+        }
+        
+        for (Category c : category.getCategories().getCategory()) {
 			addFilesFromCategory(allFiles, c);
 		}
 

Added: labs/jbosslabs/trunk/portal-extensions/forge-portlets/src/web/WEB-INF/jboss-portlet.xml
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-portlets/src/web/WEB-INF/jboss-portlet.xml	                        (rev 0)
+++ labs/jbosslabs/trunk/portal-extensions/forge-portlets/src/web/WEB-INF/jboss-portlet.xml	2007-03-20 23:51:47 UTC (rev 10371)
@@ -0,0 +1,8 @@
+<portlet-app>
+    <portlet>
+        <portlet-name>DownloadsPortlet</portlet-name>
+        <transaction>
+            <trans-attribute>Required</trans-attribute>
+        </transaction>
+    </portlet>
+</portlet-app>
\ No newline at end of file




More information about the jboss-svn-commits mailing list