You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by cz...@apache.org on 2007/02/28 08:56:22 UTC

svn commit: r512644 - in /cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal: event/layout/ services/aspects/impl/ services/impl/links/

Author: cziegeler
Date: Tue Feb 27 23:56:20 2007
New Revision: 512644

URL: http://svn.apache.org/viewvc?view=rev&rev=512644
Log:
Page labels are nearly working now

Modified:
    cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/ChangeTabEvent.java
    cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/LayoutInstanceChangeAttributeEvent.java
    cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/services/aspects/impl/PageLabelProfileManagerAspect.java
    cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/services/impl/links/PageLabelLinkService.java

Modified: cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/ChangeTabEvent.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/ChangeTabEvent.java?view=diff&rev=512644&r1=512643&r2=512644
==============================================================================
--- cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/ChangeTabEvent.java (original)
+++ cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/ChangeTabEvent.java Tue Feb 27 23:56:20 2007
@@ -51,4 +51,11 @@
     public boolean isUseName() {
         return useName;
     }
+
+    /**
+     * @see java.lang.Object#toString()
+     */
+    public String toString() {
+        return "ChangeTabEvent (" + this.hashCode() + ") : " + this.asString();
+    }
 }

Modified: cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/LayoutInstanceChangeAttributeEvent.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/LayoutInstanceChangeAttributeEvent.java?view=diff&rev=512644&r1=512643&r2=512644
==============================================================================
--- cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/LayoutInstanceChangeAttributeEvent.java (original)
+++ cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/LayoutInstanceChangeAttributeEvent.java Tue Feb 27 23:56:20 2007
@@ -45,7 +45,7 @@
             throw new IllegalArgumentException("Corrupt event data: " + eventData);
         }
         if ( eventData.charAt(pos+1) != 'T' && eventData.charAt(pos+1) != 'P') {
-            throw new IllegalArgumentException("Corrupt event data: " + eventData);            
+            throw new IllegalArgumentException("Corrupt event data: " + eventData);
         }
         this.temporary = (eventData.charAt(pos+1) == 'T');
         final String layoutId = eventData.substring(0, pos);
@@ -103,4 +103,10 @@
         return l.getId() + ':' + (this.temporary ? 'T' : 'P') + this.attributeName + ':' + this.value;
     }
 
+    /**
+     * @see java.lang.Object#toString()
+     */
+    public String toString() {
+        return "LayoutInstanceChangeAttributeEvent (" + this.hashCode() + ") : " + this.asString();
+    }
 }

Modified: cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/services/aspects/impl/PageLabelProfileManagerAspect.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/services/aspects/impl/PageLabelProfileManagerAspect.java?view=diff&rev=512644&r1=512643&r2=512644
==============================================================================
--- cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/services/aspects/impl/PageLabelProfileManagerAspect.java (original)
+++ cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/services/aspects/impl/PageLabelProfileManagerAspect.java Tue Feb 27 23:56:20 2007
@@ -16,11 +16,20 @@
  */
 package org.apache.cocoon.portal.services.aspects.impl;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
+import org.apache.cocoon.portal.PortalService;
+import org.apache.cocoon.portal.event.layout.ChangeTabEvent;
 import org.apache.cocoon.portal.om.CompositeLayout;
 import org.apache.cocoon.portal.om.Item;
 import org.apache.cocoon.portal.om.Layout;
+import org.apache.cocoon.portal.om.LayoutFeatures;
 import org.apache.cocoon.portal.om.NamedItem;
 import org.apache.cocoon.portal.services.aspects.ProfileManagerAspect;
 import org.apache.cocoon.portal.services.aspects.ProfileManagerAspectContext;
@@ -33,6 +42,8 @@
     extends AbstractBean
     implements ProfileManagerAspect {
 
+    protected boolean stickyTabs = false;
+
     /**
      * @see org.apache.cocoon.portal.services.aspects.ProfileManagerAspect#prepareCopletDefinitions(org.apache.cocoon.portal.services.aspects.ProfileManagerAspectContext, java.util.Collection)
      */
@@ -59,26 +70,72 @@
      */
     public void prepareLayout(ProfileManagerAspectContext context, Layout rootLayout) {
         if ( rootLayout instanceof CompositeLayout ) {
-            this.populate((CompositeLayout)rootLayout, "");
+            final Map pageLabelMap = new HashMap();
+            this.populate(context.getPortalService(), (CompositeLayout)rootLayout, pageLabelMap, "", null);
+            context.getPortalService().getUserService().setAttribute("pageLabelMap", pageLabelMap);
         }
         context.invokeNext(rootLayout);
     }
 
-    protected void populate(CompositeLayout layout, String name) {
+    private List populate(PortalService service, CompositeLayout layout, Map map, String name, List parentEvents) {
+        List lhList = null;
         for (int j = 0; j < layout.getSize(); j++) {
             final Item tab = layout.getItem(j);
+            final PageLabelEventInfo event = new PageLabelEventInfo(layout, tab);
             final StringBuffer label = new StringBuffer(name);
             if (label.length() > 0) {
                 label.append(".");
             }
             label.append((tab instanceof NamedItem) ? ((NamedItem) tab).getName()
                                                     : Integer.toString(j));
-            // TODO
-            tab.setTemporaryAttribute("pageLabel", label.toString());
-            final Layout child = tab.getLayout();
+            try {
+                tab.setTemporaryAttribute("pageLabel", URLEncoder.encode(label.toString(), "utf-8"));
+            } catch (UnsupportedEncodingException e) {
+                // this can never happen
+            }
+
+            final List events = (parentEvents != null ? new ArrayList(parentEvents) : new ArrayList());
+            events.add(event);
+
+            Layout child = tab.getLayout();
+            List allEvents = null;
             if (child != null && child instanceof CompositeLayout) {
-                this.populate((CompositeLayout) child, label.toString());
+                allEvents = populate(service, (CompositeLayout) child, map, label.toString(), events);
+            }
+            if ( !this.stickyTabs ) {
+                // With non-sticky tabs the non-leaf nodes always display
+                // the left-most child tabs
+                if (lhList == null) {
+                    if (allEvents != null) {
+                        lhList = allEvents;
+                    } else {
+                        lhList = events;
+                    }
+                }
+                if (allEvents != null) {
+                    map.put(label.toString(), allEvents);
+                } else {
+                    map.put(label.toString(), events);
+                }
+            } else {
+                map.put(label.toString(), events);
             }
+        }
+        return lhList;
+    }
+
+    public static final class PageLabelEventInfo {
+
+        protected final CompositeLayout layout;
+        protected final Item            item;
+
+        public PageLabelEventInfo(final CompositeLayout l, final Item i) {
+            this.layout = l;
+            this.item = i;
+        }
+
+        public ChangeTabEvent createEvent(PortalService service) {
+            return new ChangeTabEvent(LayoutFeatures.getLayoutInstance(service, this.layout, true), this.item, false);
         }
     }
 }

Modified: cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/services/impl/links/PageLabelLinkService.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/services/impl/links/PageLabelLinkService.java?view=diff&rev=512644&r1=512643&r2=512644
==============================================================================
--- cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/services/impl/links/PageLabelLinkService.java (original)
+++ cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/services/impl/links/PageLabelLinkService.java Tue Feb 27 23:56:20 2007
@@ -19,9 +19,15 @@
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Request;
 import org.apache.cocoon.portal.event.Event;
+import org.apache.cocoon.portal.event.EventManager;
 import org.apache.cocoon.portal.event.layout.ChangeTabEvent;
+import org.apache.cocoon.portal.services.aspects.RequestProcessorAspectContext;
+import org.apache.cocoon.portal.services.aspects.impl.PageLabelProfileManagerAspect;
 
 
 /**
@@ -32,6 +38,12 @@
  */
 public class PageLabelLinkService extends DefaultLinkService {
 
+    protected String pageLabelRequestParameter = "pageLabel";
+
+    public void setPageLabelRequestParameter(String pageLabelRequestParameter) {
+        this.pageLabelRequestParameter = pageLabelRequestParameter;
+    }
+
     /**
      * Test implementation for generating page labels.
      * @see org.apache.cocoon.portal.services.impl.links.DefaultLinkService#createUrl(java.util.List, java.util.List, java.lang.Boolean)
@@ -43,11 +55,13 @@
                 final Event current = (Event)i.next();
                 if ( current instanceof ChangeTabEvent ) {
                     final ChangeTabEvent tabEvent = (ChangeTabEvent)current;
-                    if ( tabEvent.getItem().getTemporaryAttribute("pageLabel") != null ) {
+                    final String pageLabel = (String)tabEvent.getItem().getTemporaryAttribute("pageLabel");
+                    if ( pageLabel != null ) {
+                        i.remove();
                         if ( parameterDescriptions == null ) {
                             parameterDescriptions = new ArrayList();
                         }
-                        parameterDescriptions.add(new ParameterDescription("pageLabel=" + tabEvent.getItem().getTemporaryAttribute("pageLabel")));
+                        parameterDescriptions.add(new ParameterDescription(this.pageLabelRequestParameter + '=' + pageLabel));
                     }
                 }
             }
@@ -55,5 +69,31 @@
         return super.createUrl(events, parameterDescriptions, secure);
     }
 
-
-}
+    /**
+     * @see org.apache.cocoon.portal.services.impl.links.DefaultLinkService#process(org.apache.cocoon.portal.services.aspects.RequestProcessorAspectContext)
+     */
+    public void process(RequestProcessorAspectContext context) {
+        final Map pageLabelMap = (Map)context.getPortalService().getUserService().getAttribute("pageLabelMap");
+        if ( pageLabelMap != null ) {
+            final Request request = ObjectModelHelper.getRequest(context.getPortalService().getProcessInfoProvider().getObjectModel());
+            final EventManager publisher = context.getPortalService().getEventManager();
+
+            final String[] values = request.getParameterValues( this.pageLabelRequestParameter );
+            if ( values != null ) {
+                for(int i=0; i<values.length; i++) {
+                    final String current = values[i];
+                    final List events = (List)pageLabelMap.get(current);
+                    if ( events != null ) {
+                        final Iterator iter = events.iterator();
+                        while ( iter.hasNext() ) {
+                            final PageLabelProfileManagerAspect.PageLabelEventInfo event = (PageLabelProfileManagerAspect.PageLabelEventInfo)iter.next();
+                            // TODO - check for change
+                            publisher.send(event.createEvent(context.getPortalService()));
+                        }
+                    }
+                }
+            }
+        }
+        super.process(context);
+    }
+}
\ No newline at end of file