cziegeler 2003/05/28 06:47:30
Modified: src/blocks/portal/java/org/apache/cocoon/portal/event/aspect/impl
FrameEventAspect.java
RequestParameterEventAspect.java
src/blocks/portal/java/org/apache/cocoon/portal/coplet/adapter
CopletAdapter.java
src/blocks/portal/java/org/apache/cocoon/portal/aspect/impl
RequestAspectDataStore.java
src/blocks/portal/java/org/apache/cocoon/portal/event/impl
ChangeAspectDataEvent.java
src/blocks/portal/java/org/apache/cocoon/portal/coplet/adapter/impl
AbstractCopletAdapter.java
src/blocks/portal/java/org/apache/cocoon/portal/impl
DefaultLinkService.java
Log:
Add coplet timeout
Implement request data storage for aspects
Revision Changes Path
1.6 +1 -7
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/event/aspect/impl/FrameEventAspect.java
Index: FrameEventAspect.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/event/aspect/impl/FrameEventAspect.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- FrameEventAspect.java 26 May 2003 09:52:58 -0000 1.5
+++ FrameEventAspect.java 28 May 2003 13:47:29 -0000 1.6
@@ -96,7 +96,6 @@
e = context.getEventConverter().decode(value);
if (null != e) {
publisher.publish(e);
- service.getLinkService().addEventToLink(e);
}
} catch (Exception ignore) {
}
@@ -121,11 +120,6 @@
} catch (ComponentException ignore) {
} finally {
this.manager.release( profileManager );
- }
-
- // TODO - move this into aspect data store
- if (uri != null) {
- service.getLinkService().addEventToLink(e);
}
}
}
1.3 +27 -10
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/event/aspect/impl/RequestParameterEventAspect.java
Index: RequestParameterEventAspect.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/event/aspect/impl/RequestParameterEventAspect.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- RequestParameterEventAspect.java 7 May 2003 20:24:03 -0000 1.2
+++ RequestParameterEventAspect.java 28 May 2003 13:47:29 -0000 1.3
@@ -50,6 +50,8 @@
*/
package org.apache.cocoon.portal.event.aspect.impl;
+import java.util.StringTokenizer;
+
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.avalon.framework.thread.ThreadSafe;
@@ -73,15 +75,8 @@
extends AbstractLogEnabled
implements EventAspect, ThreadSafe {
- /* (non-Javadoc)
- * @see
org.apache.cocoon.portal.event.aspect.EventAspect#process(org.apache.cocoon.portal.event.aspect.EventAspectContext,
org.apache.cocoon.portal.PortalService)
- */
- public void process(EventAspectContext context, PortalService service) {
- final Parameters config = context.getAspectParameters();
- // FIXME Configure more than one parameter name
- final String requestParameterName = config.getParameter("parameter-name",
LinkService.DEFAULT_REQUEST_EVENT_PARAMETER_NAME);
- final Request request = ObjectModelHelper.getRequest(
context.getObjectModel() );
- String[] values = request.getParameterValues( requestParameterName );
+ protected void process(EventAspectContext context, Request request, String
parameterName) {
+ String[] values = request.getParameterValues( parameterName );
if ( values != null ) {
final Publisher publisher = context.getEventPublisher();
for(int i=0; i<values.length; i++) {
@@ -91,6 +86,28 @@
publisher.publish(e);
}
}
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see
org.apache.cocoon.portal.event.aspect.EventAspect#process(org.apache.cocoon.portal.event.aspect.EventAspectContext,
org.apache.cocoon.portal.PortalService)
+ */
+ public void process(EventAspectContext context, PortalService service) {
+ final Request request = ObjectModelHelper.getRequest(
context.getObjectModel() );
+ final Parameters config = context.getAspectParameters();
+ final String requestParameterNames = config.getParameter("parameter-name",
LinkService.DEFAULT_REQUEST_EVENT_PARAMETER_NAME);
+ boolean processedDefault = false;
+
+ StringTokenizer tokenizer = new StringTokenizer(requestParameterNames, ",
");
+ while ( tokenizer.hasMoreTokens() ) {
+ final String currentName = tokenizer.nextToken();
+ this.process(context, request, currentName);
+ if (
LinkService.DEFAULT_REQUEST_EVENT_PARAMETER_NAME.equals(currentName) ) {
+ processedDefault = true;
+ }
+ }
+ if ( !processedDefault ) {
+ this.process( context, request,
LinkService.DEFAULT_REQUEST_EVENT_PARAMETER_NAME );
}
context.invokeNext( service );
}
1.6 +6 -1
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/coplet/adapter/CopletAdapter.java
Index: CopletAdapter.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/coplet/adapter/CopletAdapter.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- CopletAdapter.java 27 May 2003 14:07:16 -0000 1.5
+++ CopletAdapter.java 28 May 2003 13:47:29 -0000 1.6
@@ -76,6 +76,11 @@
* xml data stream from the coplet is buffered. If the stream
* is not buffered and an exception occurs then the whole
* portal will be rendered invalid.
+ * timeout - An integer value (default is endless) that defines the
+ * maximum time (in seconds) the coplet has to deliver it's content.
+ * If the timeout is reached the content is assumed as not
+ * gettable. If you set a timeout, the content is automatically
+ * buffered.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Volker Schmitt</a>
1.4 +51 -2
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/aspect/impl/RequestAspectDataStore.java
Index: RequestAspectDataStore.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/aspect/impl/RequestAspectDataStore.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- RequestAspectDataStore.java 23 May 2003 12:13:14 -0000 1.3
+++ RequestAspectDataStore.java 28 May 2003 13:47:29 -0000 1.4
@@ -53,16 +53,27 @@
import java.util.HashMap;
import java.util.Map;
+import org.apache.avalon.framework.CascadingRuntimeException;
import org.apache.avalon.framework.component.Component;
+import org.apache.avalon.framework.component.ComponentException;
+import org.apache.avalon.framework.component.ComponentManager;
+import org.apache.avalon.framework.component.Composable;
import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.context.ContextException;
import org.apache.avalon.framework.context.Contextualizable;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.parameters.ParameterException;
+import org.apache.avalon.framework.parameters.Parameterizable;
+import org.apache.avalon.framework.parameters.Parameters;
import org.apache.avalon.framework.thread.ThreadSafe;
import org.apache.cocoon.components.ContextHelper;
import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.portal.LinkService;
import org.apache.cocoon.portal.aspect.AspectDataStore;
import org.apache.cocoon.portal.aspect.Aspectalizable;
+import org.apache.cocoon.portal.coplet.CopletInstanceData;
+import org.apache.cocoon.portal.event.impl.ChangeAspectDataEvent;
+import org.apache.cocoon.portal.event.impl.ChangeCopletInstanceAspectDataEvent;
/**
* An aspect data store is a component that manages aspect data objects.
@@ -73,10 +84,14 @@
*/
public class RequestAspectDataStore
extends AbstractLogEnabled
- implements Component, ThreadSafe, AspectDataStore, Contextualizable {
+ implements Component, Composable, ThreadSafe, AspectDataStore,
Contextualizable, Parameterizable {
protected Context context;
+ protected String requestParameterName;
+
+ protected ComponentManager manager;
+
protected Map getMap(Aspectalizable owner) {
final Request request = ContextHelper.getRequest(this.context);
Map componentMap = (Map)request.getAttribute(this.getClass().getName());
@@ -98,6 +113,26 @@
public void setAspectData(Aspectalizable owner, String aspectName, Object data)
{
this.getMap(owner).put(aspectName, data);
+ // create persistence
+ ChangeAspectDataEvent e;
+ if ( owner instanceof CopletInstanceData) {
+ e = new ChangeCopletInstanceAspectDataEvent((CopletInstanceData)owner,
aspectName, data);
+ } else {
+ e = new ChangeAspectDataEvent( owner, aspectName, data );
+ }
+ if ( this.requestParameterName != null ) {
+ e.setRequestParameterName( this.requestParameterName );
+ }
+ LinkService service = null;
+ try {
+ service = (LinkService)this.manager.lookup(LinkService.ROLE);
+ service.addEventToLink( e );
+ } catch (ComponentException ce) {
+ throw new CascadingRuntimeException("Unable to lookup link service.",
ce);
+ } finally {
+ this.manager.release( service );
+ }
+
}
public boolean isPersistent() {
@@ -110,6 +145,20 @@
public void contextualize(Context context) throws ContextException {
this.context = context;
+ }
+
+ /* (non-Javadoc)
+ * @see
org.apache.avalon.framework.parameters.Parameterizable#parameterize(org.apache.avalon.framework.parameters.Parameters)
+ */
+ public void parameterize(Parameters pars) throws ParameterException {
+ requestParameterName = pars.getParameter("parameter-name", null);
+ }
+
+ /* (non-Javadoc)
+ * @see
org.apache.avalon.framework.component.Composable#compose(org.apache.avalon.framework.component.ComponentManager)
+ */
+ public void compose(ComponentManager manager) throws ComponentException {
+ this.manager = manager;
}
}
1.4 +32 -2
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/event/impl/ChangeAspectDataEvent.java
Index: ChangeAspectDataEvent.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/event/impl/ChangeAspectDataEvent.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ChangeAspectDataEvent.java 26 May 2003 12:49:13 -0000 1.3
+++ ChangeAspectDataEvent.java 28 May 2003 13:47:30 -0000 1.4
@@ -52,6 +52,8 @@
import org.apache.cocoon.portal.aspect.Aspectalizable;
import org.apache.cocoon.portal.event.ActionEvent;
+import org.apache.cocoon.portal.event.ComparableEvent;
+import org.apache.cocoon.portal.event.RequestEvent;
/**
* This events set the aspect data for an [EMAIL PROTECTED] Aspectalizable} object
@@ -62,12 +64,15 @@
*/
public class ChangeAspectDataEvent
extends AbstractActionEvent
- implements ActionEvent {
+ implements ActionEvent, RequestEvent, ComparableEvent {
protected String aspectName;
protected Object data;
+ protected String requestParameterName;
+
+
public ChangeAspectDataEvent(Aspectalizable target, String aspectName, Object
data) {
super(target);
this.aspectName = aspectName;
@@ -99,4 +104,29 @@
public Aspectalizable getAspectalizable() {
return (Aspectalizable)this.target;
}
+
+ /* (non-Javadoc)
+ * @see org.apache.cocoon.portal.event.RequestEvent#getRequestParameterName()
+ */
+ public String getRequestParameterName() {
+ return this.requestParameterName;
+ }
+
+ public void setRequestParameterName(String value) {
+ this.requestParameterName = value;
+ }
+
+ /* (non-Javadoc)
+ * @see
org.apache.cocoon.portal.event.ComparableEvent#equalsEvent(org.apache.cocoon.portal.event.ComparableEvent)
+ */
+ public boolean equalsEvent(ComparableEvent event) {
+ if ( event instanceof ChangeAspectDataEvent ) {
+ ChangeAspectDataEvent other = (ChangeAspectDataEvent)event;
+ return (this.getTarget().equals(other.getTarget())
+ && this.getAspectName().equals(other.getAspectName()));
+ }
+
+ return false;
+ }
+
}
1.5 +53 -7
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/coplet/adapter/impl/AbstractCopletAdapter.java
Index: AbstractCopletAdapter.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/coplet/adapter/impl/AbstractCopletAdapter.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- AbstractCopletAdapter.java 27 May 2003 14:07:16 -0000 1.4
+++ AbstractCopletAdapter.java 28 May 2003 13:47:30 -0000 1.5
@@ -70,8 +70,6 @@
/**
* This is the adapter to use pipelines as coplets
*
- * TODO - implement timeout
- *
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Volker Schmitt</a>
*
@@ -116,7 +114,12 @@
public void toSAX(CopletInstanceData coplet, ContentHandler contentHandler)
throws SAXException {
Boolean bool = (Boolean) this.getConfiguration( coplet, "buffer" );
-
+ Integer timeout = (Integer) this.getConfiguration( coplet, "timeout");
+ if ( timeout != null ) {
+ // if timeout is set we have to buffer!
+ bool = Boolean.TRUE;
+ }
+
if ( bool != null && bool.booleanValue() ) {
boolean read = false;
XMLSerializer serializer = null;
@@ -124,9 +127,24 @@
try {
serializer = (XMLSerializer)this.manager.lookup(XMLSerializer.ROLE);
- this.streamContent( coplet, serializer );
- data = serializer.getSAXFragment();
- read = true;
+ if ( timeout != null ) {
+ final int milli = timeout.intValue() * 1000;
+ LoaderThread loader = new LoaderThread(this, coplet,
serializer);
+ Thread thread = new Thread(loader);
+ thread.start();
+ try {
+ thread.join(milli);
+ } catch (InterruptedException ignore) {
+ }
+ if ( loader.finished ) {
+ data = serializer.getSAXFragment();
+ read = true;
+ }
+ } else {
+ this.streamContent( coplet, serializer );
+ data = serializer.getSAXFragment();
+ read = true;
+ }
} catch (ComponentException ce) {
throw new SAXException("Unable to lookup xml serializer.", ce);
} catch (Exception exception ) {
@@ -190,4 +208,32 @@
throws SAXException {
return false;
}
+}
+
+final class LoaderThread implements Runnable {
+
+ private AbstractCopletAdapter adapter;
+ private ContentHandler handler;
+ private CopletInstanceData coplet;
+ boolean finished;
+ Exception exception;
+
+ public LoaderThread(AbstractCopletAdapter adapter,
+ CopletInstanceData coplet,
+ ContentHandler handler) {
+ this.adapter = adapter;
+ this.coplet = coplet;
+ this.handler = handler;
+ }
+
+ public void run() {
+ try {
+ adapter.streamContent( this.coplet, this.handler );
+ } catch (Exception local) {
+ this.exception = local;
+ } finally {
+ this.finished = true;
+ }
+ }
+
}
1.4 +24 -16
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/impl/DefaultLinkService.java
Index: DefaultLinkService.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/impl/DefaultLinkService.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- DefaultLinkService.java 23 May 2003 12:13:15 -0000 1.3
+++ DefaultLinkService.java 28 May 2003 13:47:30 -0000 1.4
@@ -70,6 +70,7 @@
import org.apache.cocoon.portal.event.Event;
import org.apache.cocoon.portal.event.EventConverter;
import org.apache.cocoon.portal.event.RequestEvent;
+import org.apache.excalibur.source.SourceUtil;
/**
*
@@ -122,12 +123,14 @@
}
hasParams = true;
String parameterName = DEFAULT_REQUEST_EVENT_PARAMETER_NAME;
- if (ce instanceof RequestEvent) {
- parameterName =
((RequestEvent)ce).getRequestParameterName();
+ if (ce instanceof RequestEvent ) {
+ final String eventParName =
((RequestEvent)ce).getRequestParameterName();
+ if ( eventParName != null ) {
+ parameterName = eventParName;
+ }
}
- // FIXME Encode value
final String value = this.converter.encode( ce );
- buffer.append(parameterName).append('=').append(value);
+
buffer.append(parameterName).append('=').append(SourceUtil.encode(value));
}
}
}
@@ -140,10 +143,12 @@
}
String parameterName = DEFAULT_REQUEST_EVENT_PARAMETER_NAME;
if (event instanceof RequestEvent) {
- parameterName = ((RequestEvent)event).getRequestParameterName();
+ final String eventParName =
((RequestEvent)event).getRequestParameterName();
+ if ( eventParName != null ) {
+ parameterName = eventParName;
+ }
}
- // FIXME Encode value
- buffer.append(parameterName).append('=').append(value);
+ buffer.append(parameterName).append('=').append(SourceUtil.encode(value));
return buffer.toString();
}
@@ -165,10 +170,12 @@
hasPars = true;
String parameterName = DEFAULT_REQUEST_EVENT_PARAMETER_NAME;
if (current instanceof RequestEvent) {
- parameterName = ((RequestEvent)current).getRequestParameterName();
+ final String eventParName =
((RequestEvent)current).getRequestParameterName();
+ if ( eventParName != null ) {
+ parameterName = eventParName;
+ }
}
- // FIXME Encode value
- buffer.append(parameterName).append('=').append(value);
+
buffer.append(parameterName).append('=').append(SourceUtil.encode(value));
}
return buffer.toString();
}
@@ -179,10 +186,12 @@
info.comparableEvents.add( event );
} else {
final String value = converter.encode(event);
- // FIXME - remove hardcoded parameter name
- String parameterName = "frame-event";
+ String parameterName = LinkService.DEFAULT_REQUEST_EVENT_PARAMETER_NAME;
if (event instanceof RequestEvent) {
- parameterName = ((RequestEvent)event).getRequestParameterName();
+ final String eventParName =
((RequestEvent)event).getRequestParameterName();
+ if ( eventParName != null ) {
+ parameterName = eventParName;
+ }
}
this.addParameterToLink(parameterName, value);
}
@@ -195,8 +204,7 @@
} else {
info.linkBase.append('?');
}
- // FIXME Encode value
- info.linkBase.append(name).append('=').append(value);
+ info.linkBase.append(name).append('=').append(SourceUtil.encode(value));
info.hasParameters = true;
}