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