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);