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 2006/04/18 21:30:36 UTC

svn commit: r395005 - in /cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal: event/ event/impl/ event/layout/ layout/ layout/renderer/aspect/impl/

Author: cziegeler
Date: Tue Apr 18 12:30:35 2006
New Revision: 395005

URL: http://svn.apache.org/viewcvs?rev=395005&view=rev
Log:
Start improved handling of tab events

Added:
    cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/NewPageLabelEventConverter.java   (with props)
    cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/ChangeTabEvent.java   (with props)
Modified:
    cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/EventConverter.java
    cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/DefaultEventConverter.java
    cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/DefaultEventManager.java
    cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/PageLabelEventConverter.java
    cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/layout/LayoutFeatures.java
    cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/TabContentAspect.java

Modified: cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/EventConverter.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/EventConverter.java?rev=395005&r1=395004&r2=395005&view=diff
==============================================================================
--- cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/EventConverter.java (original)
+++ cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/EventConverter.java Tue Apr 18 12:30:35 2006
@@ -42,14 +42,4 @@
      * @return The event or null 
      */
     Event decode(String value);
-
-    /**
-     * This notifies the converter that a new event processing phase starts.
-     */
-    void start();
-
-    /**
-     * This notifies the converter that an event processing phase ends.
-     */
-    void finish();
 }

Modified: cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/DefaultEventConverter.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/DefaultEventConverter.java?rev=395005&r1=395004&r2=395005&view=diff
==============================================================================
--- cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/DefaultEventConverter.java (original)
+++ cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/DefaultEventConverter.java Tue Apr 18 12:30:35 2006
@@ -19,12 +19,14 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.avalon.framework.configuration.Configurable;
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.service.ServiceException;
 import org.apache.cocoon.portal.PortalRuntimeException;
 import org.apache.cocoon.portal.PortalService;
 import org.apache.cocoon.portal.event.ConvertableEvent;
@@ -40,6 +42,9 @@
  * the current user session. Each event is then converted to a string just containing
  * the index of the event in this list. This list is cleared when the session is closed.
  *
+ * In addition, this component can be configured with additional event converters
+ * that convert a specific event.
+ *
  * TODO - What happens if two event classes have the same hash?
  *
  * @version $Id$
@@ -61,6 +66,9 @@
      */
     protected Map factories = new HashMap();
 
+    /** All configured event converters. */
+    protected Map converters = new HashMap();
+
     /**
      * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
      */
@@ -75,10 +83,43 @@
             final String hashKey = Long.toString(hash);
             this.factories.put(hashKey, key);
             this.factories.put(key, c);
-            
+        }
+        Configuration[] helpers = config.getChild("converters").getChildren("converter");
+        for( int i=0; i<helpers.length; i++) {
+            final Configuration current = helpers[i];
+            final String role = current.getAttribute("role");
+            final String eventClass = current.getAttribute("event-class");
+            final String name = current.getAttribute("name", null);
+            try {
+                final EventConverter converter = (EventConverter)this.manager.lookup(role);
+                final long hash = HashUtil.hash(eventClass);
+                final String hashKey = Long.toString(hash);
+                if ( name != null ) {
+                    this.factories.put(name, converter);
+                    this.factories.put(hashKey, name);                    
+                } else {
+                    this.factories.put(hashKey, converter);                    
+                }
+                this.converters.put(eventClass, converter);
+            } catch (ServiceException e) {
+                throw new ConfigurationException("Unable to lookup event converter: " + role, e);
+            }
         }
     }
 
+    /**
+     * @see org.apache.cocoon.portal.impl.AbstractComponent#dispose()
+     */
+    public void dispose() {
+        if ( this.manager != null ) {
+            final Iterator i = this.converters.values().iterator();
+            while ( i.hasNext() ) {
+                this.manager.release(i.next());
+            }
+        }
+        super.dispose();
+    }
+
     protected Constructor getConstructor(String factory) {
         try {
             final Class factoryClass = ClassUtils.loadClass(factory);
@@ -94,26 +135,34 @@
      * @see org.apache.cocoon.portal.event.EventConverter#encode(org.apache.cocoon.portal.event.Event)
      */
     public String encode(Event event) {
+        final String eventClassName = event.getClass().getName();
+        String data = null;
+        // first check if we have a converter registered for this event
+        EventConverter registeredConverter = (EventConverter)this.converters.get(eventClassName);
+        if ( registeredConverter != null ) {
+            data = registeredConverter.encode(event);
+        }
         // if this is a convertable event just return
         // the used factory and the data.
-        if ( event instanceof ConvertableEvent ) {
-            final String data = ((ConvertableEvent)event).asString();
-            // check if *this* event is convertable
-            if ( data != null ) {
-                final String factory = event.getClass().getName();
-                final long hash = HashUtil.hash(factory);
-                final String hashKey = Long.toString(hash);
-                Object o = this.factories.get(hashKey);
-                if ( o == null ) {
-                    final Constructor c = this.getConstructor(factory);
-                    this.factories.put(hashKey, c);
-                    o = c;
-                }
-                if ( o instanceof Constructor ) {
-                    return hashKey + ':' + data;
-                }
-                return o.toString() + ':' + data;
+        if ( data == null && event instanceof ConvertableEvent ) {
+            data = ((ConvertableEvent)event).asString();
+        }
+        // check if *this* event is convertable
+        if ( data != null ) {
+            final long hash = HashUtil.hash(eventClassName);
+            final String hashKey = Long.toString(hash);
+            Object o = this.factories.get(hashKey);
+            if ( o == null ) {
+                final Constructor c = this.getConstructor(eventClassName);
+                this.factories.put(hashKey, c);
+                o = c;
             }
+            if ( o instanceof Constructor ) {
+                return hashKey + ':' + data;
+            } else if ( o instanceof EventConverter ) {
+                return hashKey + ':' + data;
+            }
+            return o.toString() + ':' + data;
         }
         List list = (List)this.portalService.getAttribute(EVENT_LIST);
         if ( null == list ) {
@@ -139,16 +188,14 @@
                 final String hashKey = value.substring(0, pos);
                 final String data = value.substring(pos+1);
                 Object o = this.factories.get(hashKey);
-                Constructor c;
-                // if the value is a constructor we simply use it
+                // if the value is a constructor or an event converter we simply use it
                 // if the value is a string we simply use this string
-                // to lookup the constructor (another lookup in the map).
-                if ( o instanceof Constructor) {
-                    c = (Constructor)o;
-                } else {
-                   c = (Constructor)this.factories.get(o);
+                // to lookup the constructor/event converter (another lookup in the map).
+                if ( o instanceof String ) {
+                    o = this.factories.get(o);
                 }
-                if ( c != null ) {
+                if ( o instanceof Constructor) {
+                    Constructor c = (Constructor)o;
                     try {
                         return (Event)c.newInstance(new Object[] {this.portalService, data});
                     } catch (InstantiationException ie) {
@@ -161,6 +208,9 @@
                         iae.printStackTrace();
                         // we ignore this                    
                     }
+                } else if ( o instanceof EventConverter ) {
+                    EventConverter converter = (EventConverter)o;
+                    return converter.decode(data);
                 }
             }
             List list = (List)this.portalService.getAttribute(EVENT_LIST);
@@ -172,19 +222,5 @@
             }
         }
         return null;
-    }
-
-    /**
-     * @see org.apache.cocoon.portal.event.EventConverter#start()
-     */
-    public void start() {
-        // nothing to do
-    }
-
-    /**
-     * @see org.apache.cocoon.portal.event.EventConverter#finish()
-     */
-    public void finish() {
-        // nothing to do
     }
 }

Modified: cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/DefaultEventManager.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/DefaultEventManager.java?rev=395005&r1=395004&r2=395005&view=diff
==============================================================================
--- cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/DefaultEventManager.java (original)
+++ cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/DefaultEventManager.java Tue Apr 18 12:30:35 2006
@@ -171,14 +171,10 @@
         try {
             converter = (EventConverter) this.manager.lookup(EventConverter.ROLE);
 
-            converter.start();
-
             // Invoke aspects
             context.setObjectModel(this.getObjectModel());
             context.setEventConverter(converter);
             context.invokeNext( this.portalService );
-
-            converter.finish();
 
         } catch (ServiceException ce) {
             throw new ProcessingException("Unable to lookup component.", ce);

Added: cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/NewPageLabelEventConverter.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/NewPageLabelEventConverter.java?rev=395005&view=auto
==============================================================================
--- cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/NewPageLabelEventConverter.java (added)
+++ cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/NewPageLabelEventConverter.java Tue Apr 18 12:30:35 2006
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cocoon.portal.event.impl;
+
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.thread.ThreadSafe;
+import org.apache.cocoon.portal.event.Event;
+import org.apache.cocoon.portal.event.EventConverter;
+import org.apache.cocoon.portal.event.layout.ChangeTabEvent;
+import org.apache.cocoon.portal.layout.Item;
+import org.apache.cocoon.portal.layout.NamedItem;
+
+/**
+ * This page label event converter converts only {@link ChangeTabEvent} events.
+ *
+ * @version $Id$
+ * @since 2.2
+ */
+public class NewPageLabelEventConverter
+    extends AbstractLogEnabled
+    implements EventConverter, ThreadSafe {
+
+    /**
+     * @see org.apache.cocoon.portal.event.EventConverter#encode(org.apache.cocoon.portal.event.Event)
+     */
+    public String encode(Event event) {
+        if ( event instanceof ChangeTabEvent ) {
+            // TODO - populate tabs
+            final Item item = ((ChangeTabEvent)event).getItem();
+            final boolean useName = ((ChangeTabEvent)event).isUseName();
+            if ( useName ) {
+                return ((NamedItem)item).getName();
+            } else {
+                return String.valueOf(item.getParent().getItems().indexOf(item));
+            }
+        }
+        return null;
+    }
+
+    /**
+     * @see org.apache.cocoon.portal.event.EventConverter#decode(java.lang.String)
+     */
+    public Event decode(String value) {
+        if ( value != null ) {
+            // TODO
+        }
+        return null;
+    }
+}
\ No newline at end of file

Propchange: cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/NewPageLabelEventConverter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/NewPageLabelEventConverter.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/PageLabelEventConverter.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/PageLabelEventConverter.java?rev=395005&r1=395004&r2=395005&view=diff
==============================================================================
--- cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/PageLabelEventConverter.java (original)
+++ cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/impl/PageLabelEventConverter.java Tue Apr 18 12:30:35 2006
@@ -115,11 +115,4 @@
             map.remove(encode);
         }
     }
-
-    /**
-     * @see org.apache.cocoon.portal.event.EventConverter#finish()
-     */
-    public void finish() {
-        // nothing to do         
-    }
 }

Added: cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/ChangeTabEvent.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/ChangeTabEvent.java?rev=395005&view=auto
==============================================================================
--- cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/ChangeTabEvent.java (added)
+++ cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/ChangeTabEvent.java Tue Apr 18 12:30:35 2006
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cocoon.portal.event.layout;
+
+import org.apache.cocoon.portal.PortalService;
+import org.apache.cocoon.portal.layout.Item;
+import org.apache.cocoon.portal.layout.LayoutFeatures;
+import org.apache.cocoon.portal.layout.NamedItem;
+
+/**
+ *
+ * @version $Id$
+ * @since 2.2
+ */
+public class ChangeTabEvent
+    extends LayoutChangeParameterEvent {
+
+    public static final String TAB_TEMPORARY_ATTRIBUTE_NAME = "tab";
+
+    protected Item item;
+
+    protected boolean useName;
+
+    public ChangeTabEvent(PortalService service, String eventData) {
+        super(service, eventData);
+    }
+
+    public ChangeTabEvent(Item target, boolean useName) {
+        super(target.getParent(), LayoutFeatures.ATTRIBUTE_TAB, (useName ? ((NamedItem)target).getName(): String.valueOf(target.getParent().getItems().indexOf(target))), true);
+        this.item = target;
+        this.useName = useName;
+    }
+
+    public Item getItem() {
+        return item;
+    }
+
+    public boolean isUseName() {
+        return useName;
+    }
+}

Propchange: cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/ChangeTabEvent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/event/layout/ChangeTabEvent.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/layout/LayoutFeatures.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/layout/LayoutFeatures.java?rev=395005&r1=395004&r2=395005&view=diff
==============================================================================
--- cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/layout/LayoutFeatures.java (original)
+++ cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/layout/LayoutFeatures.java Tue Apr 18 12:30:35 2006
@@ -34,6 +34,10 @@
      * about maximized layouts. */
     protected static final String ATTRIBUTE_MAXMIZEDINFO = LayoutFeatures.class.getName() + "/maximized-info";
 
+    /** This is the name of the temporary layout attribute containing the information
+     * about the selected tab (as index or name). */
+    public static final String ATTRIBUTE_TAB = "tab";
+
     public static final class RenderInfo {
         public final Layout layout;
         public final Item   item;

Modified: cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/TabContentAspect.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/TabContentAspect.java?rev=395005&r1=395004&r2=395005&view=diff
==============================================================================
--- cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/TabContentAspect.java (original)
+++ cocoon/trunk/blocks/cocoon-portal/cocoon-portal-impl/src/main/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/TabContentAspect.java Tue Apr 18 12:30:35 2006
@@ -23,6 +23,7 @@
 import org.apache.avalon.framework.parameters.ParameterException;
 import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.cocoon.portal.PortalService;
+import org.apache.cocoon.portal.event.layout.ChangeTabEvent;
 import org.apache.cocoon.portal.event.layout.LayoutChangeParameterEvent;
 import org.apache.cocoon.portal.layout.CompositeLayout;
 import org.apache.cocoon.portal.layout.Item;
@@ -107,8 +108,6 @@
 public class TabContentAspect 
     extends CompositeContentAspect {
 
-    public static final String TAB_TEMPORARY_ATTRIBUTE_NAME = "tab";
-
     /**
      * @see org.apache.cocoon.portal.layout.renderer.aspect.RendererAspect#toSAX(org.apache.cocoon.portal.layout.renderer.aspect.RendererAspectContext, org.apache.cocoon.portal.layout.Layout, org.apache.cocoon.portal.PortalService, org.xml.sax.ContentHandler)
      */
@@ -127,11 +126,11 @@
                 XMLUtils.startElement(handler, config.tagName);
             }
 
-            AttributesImpl attributes = new AttributesImpl();
-            CompositeLayout tabLayout = (CompositeLayout) layout;
+            final AttributesImpl attributes = new AttributesImpl();
+            final CompositeLayout tabLayout = (CompositeLayout) layout;
 
             // selected tab
-            String selectedTabName = (String)layout.getTemporaryAttribute(TAB_TEMPORARY_ATTRIBUTE_NAME);
+            String selectedTabName = (String)layout.getTemporaryAttribute(LayoutFeatures.ATTRIBUTE_TAB);
             int selectedTabIndex = 0;
             if ( selectedTabName != null && !config.useNames) {
                 selectedTabIndex = Integer.valueOf(selectedTabName).intValue();
@@ -161,13 +160,8 @@
                 if ( selected ) {
                     attributes.addCDATAAttribute("selected", "true");
                 }
-                final String eventData;
-                if ( config.useNames ) {
-                    eventData = ((NamedItem)tab).getName();
-                } else {
-                    eventData = String.valueOf(j);
-                }
-                final LayoutChangeParameterEvent event = new LayoutChangeParameterEvent(tabLayout, TAB_TEMPORARY_ATTRIBUTE_NAME, eventData, true);
+                final LayoutChangeParameterEvent event;
+                event = new ChangeTabEvent(tab, config.useNames);
                 attributes.addCDATAAttribute("parameter", service.getLinkService().getLinkURI(event)); 
 
                 // add parameters
@@ -242,17 +236,8 @@
                         subNav = true;
                     }
                     attributes.addCDATAAttribute("name", ((NamedItem) tab).getName());
-                    final String eventData;
-                    if ( config.useNames ) {
-                        eventData = ((NamedItem) tab).getName();
-                    } else {
-                        eventData = String.valueOf(j);
-                    }
-                    final LayoutChangeParameterEvent event = 
-                                      new LayoutChangeParameterEvent(tabLayout,
-                                                                     TAB_TEMPORARY_ATTRIBUTE_NAME,
-                                                                     eventData,
-                                                                     true);
+                    final LayoutChangeParameterEvent event;
+                    event = new ChangeTabEvent(tab, config.useNames);
                     List events = new ArrayList(parentEvents);
                     events.add(event);