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

Reply via email to