cziegeler    2003/12/12 02:13:34

  Modified:    src/blocks/portal/conf portal.samplesxconf portal.xconf
               
src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/impl
                        AspectRenderer.java
               src/blocks/portal/java/org/apache/cocoon/portal/acting
                        BookmarkAction.java
               
src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect
                        RendererAspectContext.java
               src/blocks/portal/samples/news/content/xdocs
                        portal-intro.xml
               
src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl
                        DefaultRendererContext.java AbstractAspect.java
               src/blocks/portal/samples/resources bookmarks.xml
  Added:       src/blocks/portal/java/org/apache/cocoon/portal/acting/helpers
                        CopletEventDescription.java Mapping.java
                        CopletMapping.java LayoutEventDescription.java
                        LayoutMapping.java
               
src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl
                        HistoryAspect.java
  Log:
  Add the feature to create a browsable history
  Add some warnings about the portal demo
  
  Revision  Changes    Path
  1.9       +10 -0     cocoon-2.1/src/blocks/portal/conf/portal.samplesxconf
  
  Index: portal.samplesxconf
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/conf/portal.samplesxconf,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- portal.samplesxconf       9 Dec 2003 10:21:56 -0000       1.8
  +++ portal.samplesxconf       12 Dec 2003 10:13:34 -0000      1.9
  @@ -2,6 +2,12 @@
   
   <samplesxconf xpath="/cocoon" unless="[EMAIL 
PROTECTED]'org.apache.cocoon.portal.profile.ProfileManager/Auth']">
   
  + <!-- THIS IS A SAMPLE PORTAL
  +      It demonstrates several features of the portal engine,
  +      so it's not optimized for production. Make sure that
  +      if you use the portal for your own projects that you
  +      remove all unused stuff from the configuration! 
  + -->
    <component 
class="org.apache.cocoon.portal.profile.impl.AuthenticationProfileManager" 
logger="portal" role="org.apache.cocoon.portal.profile.ProfileManager/Auth">
    </component>
   
  @@ -41,6 +47,7 @@
                <aspect type="parameter">
                    <parameter name="tag-name" value="tab-layout"/>
                </aspect>
  +             <aspect type="history"/>
                <aspect type="tab-content">
                    <parameter name="root-tag" value="false"/>
                    <parameter name="store"    value="session"/>
  @@ -55,6 +62,7 @@
                <aspect type="parameter">
                    <parameter name="tag-name" value="linktab-layout"/>
                </aspect>
  +             <aspect type="history"/>
                <aspect type="tab-content">
                    <parameter name="root-tag" value="false"/>
                    <parameter name="store" value="session"/>
  @@ -75,6 +83,7 @@
                <aspect type="coplet-removing"/>
                <aspect type="coplet-full-screen"/>
                <aspect type="coplet-sizing"/>
  +             <aspect type="history"/>
                <aspect type="coplet-cinclude"/>
            </aspects>
        </renderer>
  @@ -87,6 +96,7 @@
        </renderer>
        <renderer name="nowindow" 
class="org.apache.cocoon.portal.layout.renderer.impl.AspectRenderer" 
logger="portal" >
            <aspects>
  +             <aspect type="history"/>
                <aspect type="coplet"/>
            </aspects>
        </renderer>
  
  
  
  1.29      +5 -0      cocoon-2.1/src/blocks/portal/conf/portal.xconf
  
  Index: portal.xconf
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/conf/portal.xconf,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- portal.xconf      11 Dec 2003 09:30:17 -0000      1.28
  +++ portal.xconf      12 Dec 2003 10:13:34 -0000      1.29
  @@ -67,6 +67,11 @@
            use the coplet aspect below to directly stream the content -->
       <aspect name="coplet-cinclude" 
class="org.apache.cocoon.portal.layout.renderer.aspect.impl.CIncludeCopletAspect"/>
   
  +    <!-- This aspect creates a history of all layout aspect datas,
  +         coplet aspect datas and coplet attributes. It can be used by
  +         the bookmark action to browse the history -->
  +    <aspect name="history" 
class="org.apache.cocoon.portal.layout.renderer.aspect.impl.HistoryAspect"/>
  +    
       <!-- This aspect can be used to render the content of the coplet -->
       <aspect name="coplet" 
class="org.apache.cocoon.portal.layout.renderer.aspect.impl.DefaultCopletAspect"/>
       <aspect name="frame" 
class="org.apache.cocoon.portal.layout.renderer.aspect.impl.FrameAspect"/>
  
  
  
  1.4       +18 -5     
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/impl/AspectRenderer.java
  
  Index: AspectRenderer.java
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/impl/AspectRenderer.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- AspectRenderer.java       20 Oct 2003 13:37:10 -0000      1.3
  +++ AspectRenderer.java       12 Dec 2003 10:13:34 -0000      1.4
  @@ -56,17 +56,20 @@
   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.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.service.ServiceException;
   import org.apache.avalon.framework.service.ServiceManager;
   import org.apache.avalon.framework.service.ServiceSelector;
   import org.apache.avalon.framework.service.Serviceable;
   import org.apache.avalon.framework.thread.ThreadSafe;
  +import org.apache.cocoon.components.ContextHelper;
   import org.apache.cocoon.portal.PortalService;
   import org.apache.cocoon.portal.layout.Layout;
   import org.apache.cocoon.portal.layout.renderer.Renderer;
   import org.apache.cocoon.portal.layout.renderer.aspect.RendererAspect;
  -import org.apache.cocoon.portal.layout.renderer.aspect.RendererAspectContext;
   import 
org.apache.cocoon.portal.layout.renderer.aspect.impl.DefaultRendererContext;
   import 
org.apache.cocoon.portal.layout.renderer.aspect.impl.RendererAspectChain;
   import org.xml.sax.ContentHandler;
  @@ -81,7 +84,7 @@
    */
   public class AspectRenderer
       extends AbstractLogEnabled
  -    implements Renderer, Serviceable, Configurable, Disposable, ThreadSafe {
  +    implements Renderer, Serviceable, Configurable, Disposable, ThreadSafe, 
Contextualizable {
   
       protected ServiceManager manager;
   
  @@ -89,6 +92,8 @@
       
       protected ServiceSelector aspectSelector;
       
  +    protected Context context;
  +    
       /* (non-Javadoc)
        * @see 
org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
        */
  @@ -101,8 +106,9 @@
        * Stream out raw layout 
        */
       public void toSAX(Layout layout, PortalService service, ContentHandler 
handler) throws SAXException {
  -         RendererAspectContext context = new 
DefaultRendererContext(this.chain);
  -         context.invokeNext(layout, service, handler);
  +        DefaultRendererContext renderContext = new 
DefaultRendererContext(this.chain);
  +        
renderContext.setObjectModel(ContextHelper.getObjectModel(this.context));
  +        renderContext.invokeNext(layout, service, handler);
       }
   
        /* (non-Javadoc)
  @@ -132,6 +138,13 @@
        */
       public Iterator getAspectDescriptions() {
           return this.chain.getAspectDescriptionIterator();
  +    }
  +
  +    /* (non-Javadoc)
  +     * @see 
org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context)
  +     */
  +    public void contextualize(Context context) throws ContextException {
  +        this.context = context;
       }
   
   }
  
  
  
  1.2       +89 -91    
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/acting/BookmarkAction.java
  
  Index: BookmarkAction.java
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/acting/BookmarkAction.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- BookmarkAction.java       11 Dec 2003 13:31:55 -0000      1.1
  +++ BookmarkAction.java       12 Dec 2003 10:13:34 -0000      1.2
  @@ -54,6 +54,7 @@
   import java.util.ArrayList;
   import java.util.Enumeration;
   import java.util.HashMap;
  +import java.util.Iterator;
   import java.util.List;
   import java.util.Map;
   
  @@ -71,14 +72,13 @@
   import org.apache.cocoon.environment.ObjectModelHelper;
   import org.apache.cocoon.environment.Redirector;
   import org.apache.cocoon.environment.Request;
  +import org.apache.cocoon.environment.Session;
   import org.apache.cocoon.environment.SourceResolver;
   import org.apache.cocoon.portal.PortalManager;
   import org.apache.cocoon.portal.PortalService;
  -import org.apache.cocoon.portal.coplet.CopletInstanceData;
  -import org.apache.cocoon.portal.event.Event;
  -import org.apache.cocoon.portal.event.impl.CopletJXPathEvent;
  -import org.apache.cocoon.portal.event.impl.JXPathEvent;
  -import org.apache.cocoon.portal.layout.Layout;
  +import org.apache.cocoon.portal.acting.helpers.CopletMapping;
  +import org.apache.cocoon.portal.acting.helpers.LayoutMapping;
  +import org.apache.cocoon.portal.acting.helpers.Mapping;
   import org.apache.excalibur.source.Source;
   import org.xml.sax.SAXException;
   
  @@ -86,6 +86,7 @@
    * This action helps you in creating bookmarks
    * 
    * The definition file is:
  + * <bookmarks>
    * <events>
    *   <event type="jxpath" id="ID">
    *     <targetid>tagetId</targetid>
  @@ -93,6 +94,7 @@
    *     <path/>
    *   </event>
    * </events>
  + * </bookmarks>
    *
    * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
    * @version CVS $Id$
  @@ -103,70 +105,73 @@
   
       protected Map eventMap = new HashMap();
       
  +    protected String historyParameterName;
  +    
       /* (non-Javadoc)
        * @see 
org.apache.avalon.framework.parameters.Parameterizable#parameterize(org.apache.avalon.framework.parameters.Parameters)
        */
       public void parameterize(Parameters parameters) throws 
ParameterException {
  -       final String configurationFile = parameters.getParameter("src", null);
  -       if ( configurationFile == null ) return;
  +        this.historyParameterName = 
parameters.getParameter("history-parameter-name", "history");
  +        final String configurationFile = parameters.getParameter("src", 
null);
  +        if ( configurationFile == null ) return;
          
  -       Configuration config;
  -       org.apache.excalibur.source.SourceResolver resolver = null;
  -       try {
  -           resolver = (org.apache.excalibur.source.SourceResolver) 
this.manager.lookup(org.apache.excalibur.source.SourceResolver.ROLE);
  -           Source source = null;
  -           try {
  -               source = resolver.resolveURI(configurationFile);
  -               SAXConfigurationHandler handler = new 
SAXConfigurationHandler();
  -               SourceUtil.toSAX(source, handler);
  -               config = handler.getConfiguration();
  -           } catch (ProcessingException se) {
  -               throw new ParameterException("Unable to read configuration 
from " + configurationFile, se);
  -           } catch (SAXException se) {
  -               throw new ParameterException("Unable to read configuration 
from " + configurationFile, se);
  -           } catch (IOException ioe) {
  -               throw new ParameterException("Unable to read configuration 
from " + configurationFile, ioe);
  -           } finally {
  -               resolver.release(source);
  -           }
  -       } catch (ServiceException se) {
  -           throw new ParameterException("Unable to lookup source resolver.", 
se);
  -       } finally {
  -           this.manager.release(resolver);
  -       }
  -       Configuration[] events = config.getChildren("event");
  -       if ( events != null ) {
  -           for(int i=0; i<events.length;i++) {
  -               try {
  -                   final String type = events[i].getAttribute("type");
  -                   final String id = events[i].getAttribute("id");
  -                   if ( !"jxpath".equals(type) ) {
  -                       throw new ParameterException("Unknown event type for 
event " + id + ": " + type);
  -                   }
  -                   if ( this.eventMap.containsKey(id)) {
  -                       throw new ParameterException("The id for the event " 
+ id + " is not unique.");
  -                   }
  -                   final String targetType = 
events[i].getChild("targettype").getValue();
  -                   final String targetId = 
events[i].getChild("targetid").getValue();
  -                   final String path = events[i].getChild("path").getValue();
  -                   if ( "layout".equals(targetType) ) {
  -                       LayoutMapping mapping = new LayoutMapping();
  -                       mapping.layoutId = targetId;
  -                       mapping.path = path;
  -                       this.eventMap.put(id, mapping);
  -                   } else if ( "coplet".equals(targetType) ) {
  -                       CopletMapping mapping = new CopletMapping();
  -                       mapping.copletId = targetId;
  -                       mapping.path = path;  
  -                       this.eventMap.put(id, mapping);
  -                   } else {
  +        Configuration config;
  +        org.apache.excalibur.source.SourceResolver resolver = null;
  +        try {
  +            resolver = (org.apache.excalibur.source.SourceResolver) 
this.manager.lookup(org.apache.excalibur.source.SourceResolver.ROLE);
  +            Source source = null;
  +            try {
  +                source = resolver.resolveURI(configurationFile);
  +                SAXConfigurationHandler handler = new 
SAXConfigurationHandler();
  +                SourceUtil.toSAX(source, handler);
  +                config = handler.getConfiguration();
  +            } catch (ProcessingException se) {
  +                throw new ParameterException("Unable to read configuration 
from " + configurationFile, se);
  +            } catch (SAXException se) {
  +                throw new ParameterException("Unable to read configuration 
from " + configurationFile, se);
  +            } catch (IOException ioe) {
  +                throw new ParameterException("Unable to read configuration 
from " + configurationFile, ioe);
  +            } finally {
  +                resolver.release(source);
  +            }
  +        } catch (ServiceException se) {
  +            throw new ParameterException("Unable to lookup source 
resolver.", se);
  +        } finally {
  +            this.manager.release(resolver);
  +        }
  +        Configuration[] events = 
config.getChild("bookmarks").getChildren("event");
  +        if ( events != null ) {
  +            for(int i=0; i<events.length;i++) {
  +                try {
  +                    final String type = events[i].getAttribute("type");
  +                    final String id = events[i].getAttribute("id");
  +                    if ( !"jxpath".equals(type) ) {
  +                        throw new ParameterException("Unknown event type for 
event " + id + ": " + type);
  +                    }
  +                    if ( this.eventMap.containsKey(id)) {
  +                        throw new ParameterException("The id for the event " 
+ id + " is not unique.");
  +                    }
  +                    final String targetType = 
events[i].getChild("targettype").getValue();
  +                    final String targetId = 
events[i].getChild("targetid").getValue();
  +                    final String path = 
events[i].getChild("path").getValue();
  +                    if ( "layout".equals(targetType) ) {
  +                        LayoutMapping mapping = new LayoutMapping();
  +                        mapping.layoutId = targetId;
  +                        mapping.path = path;
  +                        this.eventMap.put(id, mapping);
  +                    } else if ( "coplet".equals(targetType) ) {
  +                        CopletMapping mapping = new CopletMapping();
  +                        mapping.copletId = targetId;
  +                        mapping.path = path;  
  +                        this.eventMap.put(id, mapping);
  +                    } else {
                          throw new ParameterException("Unknown target type " + 
targetType);
  -                   }
  -               } catch (ConfigurationException ce) {
  -                   throw new ParameterException("Configuration exception" 
,ce);
  -               }
  -           }
  -       }
  +                    }
  +                } catch (ConfigurationException ce) {
  +                    throw new ParameterException("Configuration exception" 
,ce);
  +                }
  +            }
  +        }
       }
   
       public Map act(Redirector redirector,
  @@ -196,9 +201,27 @@
                   this.manager.release(portalManager);
               }
               
  -            Request request = ObjectModelHelper.getRequest(objectModel);
  +            final Request request = 
ObjectModelHelper.getRequest(objectModel);
  +            final Session session = request.getSession(false);
  +            final List events = new ArrayList();
  +            
  +            // is the history invoked?
  +            final String historyValue = 
request.getParameter(this.historyParameterName);
  +            if ( historyValue != null && session != null) {
  +                // get the history
  +                final List history = 
(List)session.getAttribute("portal-history");
  +                if ( history != null ) {
  +                    final List state = 
(List)history.get(Integer.parseInt(historyValue));
  +                    if ( state != null ) {
  +                        final Iterator iter = state.iterator();
  +                        while ( iter.hasNext() ) {
  +                            Mapping m = (Mapping)iter.next();
  +                            events.add(m.getEvent(service, null));
  +                        }
  +                    }
  +                }
  +            }
               Enumeration enum = request.getParameterNames();
  -            List events = new ArrayList();
               while (enum.hasMoreElements()) {
                   String name = (String)enum.nextElement();
                   String value = request.getParameter(name);
  @@ -227,29 +250,4 @@
           return result;
       }
   
  -    static abstract class Mapping {
  -        public abstract Event getEvent(PortalService service, Object data);
  -    }
  -    static class CopletMapping extends Mapping {
  -        public String copletId;
  -        public String path;
  -
  -        public Event getEvent(PortalService service, Object data) {
  -            CopletInstanceData cid = 
service.getComponentManager().getProfileManager().getCopletInstanceData(this.copletId);
  -            Event e = new CopletJXPathEvent(cid, this.path, data);
  -            return e;
  -        }
  -
  -    }
  -
  -    static class LayoutMapping extends Mapping {
  -        public String layoutId;
  -        public String path;
  -
  -        public Event getEvent(PortalService service, Object data) {
  -          Layout layout = 
service.getComponentManager().getProfileManager().getPortalLayout(null, 
this.layoutId);
  -          Event e = new JXPathEvent(layout, this.path, data);
  -        return e;
  -    }
  -}
   }
  
  
  
  1.1                  
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/acting/helpers/CopletEventDescription.java
  
  Index: CopletEventDescription.java
  ===================================================================
  /*
  
   ============================================================================
                     The Apache Software License, Version 1.1
   ============================================================================
  
   Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
  
   Redistribution and use in source and binary forms, with or without modifica-
   tion, are permitted provided that the following conditions are met:
  
   1. Redistributions of  source code must  retain the above copyright  notice,
      this list of conditions and the following disclaimer.
  
   2. Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
  
   3. The end-user documentation included with the redistribution, if any, must
      include  the following  acknowledgment:  "This product includes  software
      developed  by the  Apache Software Foundation  (http://www.apache.org/)."
      Alternately, this  acknowledgment may  appear in the software itself,  if
      and wherever such third-party acknowledgments normally appear.
  
   4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
      used to  endorse or promote  products derived from  this software without
      prior written permission. For written permission, please contact
      [EMAIL PROTECTED]
  
   5. Products  derived from this software may not  be called "Apache", nor may
      "Apache" appear  in their name,  without prior written permission  of the
      Apache Software Foundation.
  
   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
   This software  consists of voluntary contributions made  by many individuals
   on  behalf of the Apache Software  Foundation and was  originally created by
   Stefano Mazzocchi  <[EMAIL PROTECTED]>. For more  information on the Apache
   Software Foundation, please see <http://www.apache.org/>.
  
  */
  package org.apache.cocoon.portal.acting.helpers;
  
  import org.apache.cocoon.portal.PortalService;
  import org.apache.cocoon.portal.event.Event;
  
  /**
   * Helper class for an coplet event
   * 
   * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
   * @version CVS $Id: CopletEventDescription.java,v 1.1 2003/12/12 10:13:34 
cziegeler Exp $
  */
  public class CopletEventDescription extends CopletMapping {
  
      public Object data;
  
      public Event getEvent(PortalService service, Object data) {
          return super.getEvent(service, (data == null ? this.data : data));
      }
  }
  
  
  
  1.1                  
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/acting/helpers/Mapping.java
  
  Index: Mapping.java
  ===================================================================
  /*
  
   ============================================================================
                     The Apache Software License, Version 1.1
   ============================================================================
  
   Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
  
   Redistribution and use in source and binary forms, with or without modifica-
   tion, are permitted provided that the following conditions are met:
  
   1. Redistributions of  source code must  retain the above copyright  notice,
      this list of conditions and the following disclaimer.
  
   2. Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
  
   3. The end-user documentation included with the redistribution, if any, must
      include  the following  acknowledgment:  "This product includes  software
      developed  by the  Apache Software Foundation  (http://www.apache.org/)."
      Alternately, this  acknowledgment may  appear in the software itself,  if
      and wherever such third-party acknowledgments normally appear.
  
   4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
      used to  endorse or promote  products derived from  this software without
      prior written permission. For written permission, please contact
      [EMAIL PROTECTED]
  
   5. Products  derived from this software may not  be called "Apache", nor may
      "Apache" appear  in their name,  without prior written permission  of the
      Apache Software Foundation.
  
   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
   This software  consists of voluntary contributions made  by many individuals
   on  behalf of the Apache Software  Foundation and was  originally created by
   Stefano Mazzocchi  <[EMAIL PROTECTED]>. For more  information on the Apache
   Software Foundation, please see <http://www.apache.org/>.
  
  */
  package org.apache.cocoon.portal.acting.helpers;
  
  import org.apache.cocoon.portal.PortalService;
  import org.apache.cocoon.portal.event.Event;
  
  /**
   * Helper class for an event
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
   * @version CVS $Id: Mapping.java,v 1.1 2003/12/12 10:13:34 cziegeler Exp $
  */
  public abstract class Mapping {
      public abstract Event getEvent(PortalService service, Object data);
  }
  
  
  
  1.1                  
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/acting/helpers/CopletMapping.java
  
  Index: CopletMapping.java
  ===================================================================
  /*
  
   ============================================================================
                     The Apache Software License, Version 1.1
   ============================================================================
  
   Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
  
   Redistribution and use in source and binary forms, with or without modifica-
   tion, are permitted provided that the following conditions are met:
  
   1. Redistributions of  source code must  retain the above copyright  notice,
      this list of conditions and the following disclaimer.
  
   2. Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
  
   3. The end-user documentation included with the redistribution, if any, must
      include  the following  acknowledgment:  "This product includes  software
      developed  by the  Apache Software Foundation  (http://www.apache.org/)."
      Alternately, this  acknowledgment may  appear in the software itself,  if
      and wherever such third-party acknowledgments normally appear.
  
   4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
      used to  endorse or promote  products derived from  this software without
      prior written permission. For written permission, please contact
      [EMAIL PROTECTED]
  
   5. Products  derived from this software may not  be called "Apache", nor may
      "Apache" appear  in their name,  without prior written permission  of the
      Apache Software Foundation.
  
   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
   This software  consists of voluntary contributions made  by many individuals
   on  behalf of the Apache Software  Foundation and was  originally created by
   Stefano Mazzocchi  <[EMAIL PROTECTED]>. For more  information on the Apache
   Software Foundation, please see <http://www.apache.org/>.
  
  */
  package org.apache.cocoon.portal.acting.helpers;
  
  import org.apache.cocoon.portal.PortalService;
  import org.apache.cocoon.portal.coplet.CopletInstanceData;
  import org.apache.cocoon.portal.event.Event;
  import org.apache.cocoon.portal.event.impl.CopletJXPathEvent;
  
  /**
   * Helper class for an coplet event
   * 
   * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
   * @version CVS $Id: CopletMapping.java,v 1.1 2003/12/12 10:13:34 cziegeler 
Exp $
  */
  public class CopletMapping extends Mapping {
      public String copletId;
      public String path;
  
      public Event getEvent(PortalService service, Object data) {
          CopletInstanceData cid = 
service.getComponentManager().getProfileManager().getCopletInstanceData(this.copletId);
          Event e = new CopletJXPathEvent(cid, this.path, data);
          return e;
      }
  
  }
  
  
  
  1.1                  
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/acting/helpers/LayoutEventDescription.java
  
  Index: LayoutEventDescription.java
  ===================================================================
  /*
  
   ============================================================================
                     The Apache Software License, Version 1.1
   ============================================================================
  
   Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
  
   Redistribution and use in source and binary forms, with or without modifica-
   tion, are permitted provided that the following conditions are met:
  
   1. Redistributions of  source code must  retain the above copyright  notice,
      this list of conditions and the following disclaimer.
  
   2. Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
  
   3. The end-user documentation included with the redistribution, if any, must
      include  the following  acknowledgment:  "This product includes  software
      developed  by the  Apache Software Foundation  (http://www.apache.org/)."
      Alternately, this  acknowledgment may  appear in the software itself,  if
      and wherever such third-party acknowledgments normally appear.
  
   4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
      used to  endorse or promote  products derived from  this software without
      prior written permission. For written permission, please contact
      [EMAIL PROTECTED]
  
   5. Products  derived from this software may not  be called "Apache", nor may
      "Apache" appear  in their name,  without prior written permission  of the
      Apache Software Foundation.
  
   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
   This software  consists of voluntary contributions made  by many individuals
   on  behalf of the Apache Software  Foundation and was  originally created by
   Stefano Mazzocchi  <[EMAIL PROTECTED]>. For more  information on the Apache
   Software Foundation, please see <http://www.apache.org/>.
  
  */
  package org.apache.cocoon.portal.acting.helpers;
  
  import org.apache.cocoon.portal.PortalService;
  import org.apache.cocoon.portal.event.Event;
  
  /**
   * Helper class for a layout event
   * 
   * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
   * @version CVS $Id: LayoutEventDescription.java,v 1.1 2003/12/12 10:13:34 
cziegeler Exp $
  */
  public class LayoutEventDescription extends LayoutMapping {
  
      public Object data;
  
      public Event getEvent(PortalService service, Object data) {
          return super.getEvent(service, (data == null ? this.data : data));
      }
  }
  
  
  
  1.1                  
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/acting/helpers/LayoutMapping.java
  
  Index: LayoutMapping.java
  ===================================================================
  /*
  
   ============================================================================
                     The Apache Software License, Version 1.1
   ============================================================================
  
   Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
  
   Redistribution and use in source and binary forms, with or without modifica-
   tion, are permitted provided that the following conditions are met:
  
   1. Redistributions of  source code must  retain the above copyright  notice,
      this list of conditions and the following disclaimer.
  
   2. Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
  
   3. The end-user documentation included with the redistribution, if any, must
      include  the following  acknowledgment:  "This product includes  software
      developed  by the  Apache Software Foundation  (http://www.apache.org/)."
      Alternately, this  acknowledgment may  appear in the software itself,  if
      and wherever such third-party acknowledgments normally appear.
  
   4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
      used to  endorse or promote  products derived from  this software without
      prior written permission. For written permission, please contact
      [EMAIL PROTECTED]
  
   5. Products  derived from this software may not  be called "Apache", nor may
      "Apache" appear  in their name,  without prior written permission  of the
      Apache Software Foundation.
  
   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
   This software  consists of voluntary contributions made  by many individuals
   on  behalf of the Apache Software  Foundation and was  originally created by
   Stefano Mazzocchi  <[EMAIL PROTECTED]>. For more  information on the Apache
   Software Foundation, please see <http://www.apache.org/>.
  
  */
  package org.apache.cocoon.portal.acting.helpers;
  
  import org.apache.cocoon.portal.PortalService;
  import org.apache.cocoon.portal.event.Event;
  import org.apache.cocoon.portal.event.impl.JXPathEvent;
  import org.apache.cocoon.portal.layout.Layout;
  
  /**
   * Helper class for a layout event
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
   * @version CVS $Id: LayoutMapping.java,v 1.1 2003/12/12 10:13:34 cziegeler 
Exp $
  */
  public class LayoutMapping extends Mapping {
      public String layoutId;
      public String path;
      
      public Event getEvent(PortalService service, Object data) {
          Layout layout = 
service.getComponentManager().getProfileManager().getPortalLayout(null, 
this.layoutId);
          Event e = new JXPathEvent(layout, this.path, data);
          return e;
      }
  }
  
  
  
  1.4       +8 -1      
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/RendererAspectContext.java
  
  Index: RendererAspectContext.java
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/RendererAspectContext.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- RendererAspectContext.java        15 Jun 2003 16:56:09 -0000      1.3
  +++ RendererAspectContext.java        12 Dec 2003 10:13:34 -0000      1.4
  @@ -50,6 +50,8 @@
   */
   package org.apache.cocoon.portal.layout.renderer.aspect;
   
  +import java.util.Map;
  +
   import org.apache.cocoon.portal.PortalService;
   import org.apache.cocoon.portal.layout.Layout;
   import org.xml.sax.ContentHandler;
  @@ -92,4 +94,9 @@
        * Remove an attribute
        */
       void removeAttribute(String key);
  +    
  +    /**
  +     * Get the object model
  +     */
  +    Map getObjectModel();
   }
  
  
  
  1.4       +6 -0      
cocoon-2.1/src/blocks/portal/samples/news/content/xdocs/portal-intro.xml
  
  Index: portal-intro.xml
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/blocks/portal/samples/news/content/xdocs/portal-intro.xml,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- portal-intro.xml  11 Dec 2003 16:05:01 -0000      1.3
  +++ portal-intro.xml  12 Dec 2003 10:13:34 -0000      1.4
  @@ -17,6 +17,12 @@
             <li>The TabDemo2 shows the same content as TabDemo2 but with just 
a different stylesheet for the tab.</li>
             <li>The Coplets tab show some more coplets. You need to also have 
the petstore example installed!</li>
           </ul>
  +        <note>THIS IS A SAMPLE PORTAL. It demonstrates several features of 
  +          the portal engine, so it's not optimized for production. Make sure 
  +          that if you use the portal for your own projects that you
  +          remove all unused stuff from the configuration! Every configured
  +          feature might have an impact on the performance.
  +        </note>
           <p>For more information <fork href="http://cocoon.apache.org";>visit 
the Cocoon Homepage</fork>.</p>
        </s1> 
   
  
  
  
  1.4       +17 -1     
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/DefaultRendererContext.java
  
  Index: DefaultRendererContext.java
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/DefaultRendererContext.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DefaultRendererContext.java       24 Sep 2003 21:22:33 -0000      1.3
  +++ DefaultRendererContext.java       12 Dec 2003 10:13:34 -0000      1.4
  @@ -74,6 +74,7 @@
       private Iterator configIterator;
       private Object config;
       private Map attributes;
  +    private Map objectModel;
       
       public DefaultRendererContext(RendererAspectChain chain) {
           this.iterator = chain.getIterator();
  @@ -131,6 +132,21 @@
           if ( this.attributes != null && key != null) {
               this.attributes.remove( key );
           }
  +    }
  +
  +    /* (non-Javadoc)
  +     * @see 
org.apache.cocoon.portal.layout.renderer.aspect.RendererAspectContext#getObjectModel()
  +     */
  +    public Map getObjectModel() {
  +        return this.objectModel;
  +    }
  +
  +    /**
  +     * Set the object model
  +     * @param map The object model
  +     */
  +    public void setObjectModel(Map map) {
  +        this.objectModel = map;
       }
   
   }
  
  
  
  1.6       +1 -3      
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/AbstractAspect.java
  
  Index: AbstractAspect.java
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/AbstractAspect.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- AbstractAspect.java       20 Oct 2003 13:37:10 -0000      1.5
  +++ AbstractAspect.java       12 Dec 2003 10:13:34 -0000      1.6
  @@ -95,8 +95,6 @@
           PortalService service,
           ContentHandler handler)
           throws SAXException {
  -        // TODO Auto-generated method stub
  -
       }
   
       /**
  
  
  
  1.1                  
cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/HistoryAspect.java
  
  Index: HistoryAspect.java
  ===================================================================
  /*
  
   ============================================================================
                     The Apache Software License, Version 1.1
   ============================================================================
  
   Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved.
  
   Redistribution and use in source and binary forms, with or without modifica-
   tion, are permitted provided that the following conditions are met:
  
   1. Redistributions of  source code must  retain the above copyright  notice,
      this list of conditions and the following disclaimer.
  
   2. Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
  
   3. The end-user documentation included with the redistribution, if any, must
      include  the following  acknowledgment:  "This product includes  software
      developed  by the  Apache Software Foundation  (http://www.apache.org/)."
      Alternately, this  acknowledgment may  appear in the software itself,  if
      and wherever such third-party acknowledgments normally appear.
  
   4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
      used to  endorse or promote  products derived from  this software without
      prior written permission. For written permission, please contact
      [EMAIL PROTECTED]
  
   5. Products  derived from this software may not  be called "Apache", nor may
      "Apache" appear  in their name,  without prior written permission  of the
      Apache Software Foundation.
  
   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
   This software  consists of voluntary contributions made  by many individuals
   on  behalf of the Apache Software  Foundation and was  originally created by
   Stefano Mazzocchi  <[EMAIL PROTECTED]>. For more  information on the Apache
   Software Foundation, please see <http://www.apache.org/>.
  
  */
  package org.apache.cocoon.portal.layout.renderer.aspect.impl;
  
  import java.util.ArrayList;
  import java.util.Iterator;
  import java.util.List;
  import java.util.Map;
  
  import org.apache.cocoon.environment.ObjectModelHelper;
  import org.apache.cocoon.environment.Request;
  import org.apache.cocoon.environment.Session;
  import org.apache.cocoon.portal.PortalService;
  import org.apache.cocoon.portal.acting.helpers.LayoutEventDescription;
  import org.apache.cocoon.portal.coplet.CopletInstanceData;
  import org.apache.cocoon.portal.layout.Layout;
  import org.apache.cocoon.portal.layout.impl.CopletLayout;
  import org.apache.cocoon.portal.layout.renderer.aspect.RendererAspectContext;
  import org.xml.sax.ContentHandler;
  import org.xml.sax.SAXException;
  
  
  /**
   * Save the current state of the layout into the session
   * 
   * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
   * 
   * @version CVS $Id: HistoryAspect.java,v 1.1 2003/12/12 10:13:34 cziegeler 
Exp $
   */
  public class HistoryAspect 
      extends AbstractAspect {
  
      /**
       * Add the values to the state
       * @param id
       * @param state
       * @param values
       */
      protected void addValues(String id, List state, Map values, String 
prefix) {
          final Iterator iter = values.entrySet().iterator();
          while ( iter.hasNext() ) {
              final Map.Entry entry = (Map.Entry)iter.next();
              final String path = prefix + entry.getKey();
              LayoutEventDescription led = new LayoutEventDescription();
              led.path = path;
              led.layoutId = id;
              led.data = entry.getValue();
              state.add(led);
          }
      }
  
      /* (non-Javadoc)
       * @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)
       */
      public void toSAX(RendererAspectContext context,
                      Layout layout,
                      PortalService service,
                      ContentHandler handler)
      throws SAXException {
          if ( layout.getId() != null ) {
              final Request request = 
ObjectModelHelper.getRequest(context.getObjectModel());
              final Session session = request.getSession(false);
              if ( session != null ) {
                  List history = (List)session.getAttribute("portal-history");
                  if ( history == null ) {
         
                      history = new ArrayList();
                  }
                  List state = (List)request.getAttribute("portal-history");
                  if ( state == null ) {
                      state = new ArrayList();
                      request.setAttribute("portal-history", state);
                      history.add(state);
                  }
                  
                  this.addValues(layout.getId(), state, 
layout.getAspectDatas(), "aspectDatas/");
                  
                  // are we a coplet layout
                  if ( layout instanceof CopletLayout ) {
                      CopletInstanceData cid = 
((CopletLayout)layout).getCopletInstanceData();
                      this.addValues(cid.getId(), state, cid.getAspectDatas(), 
"aspectDatas/");
                      this.addValues(cid.getId(), state, cid.getAttributes(), 
"attributes/");
                  }
                  session.setAttribute("portal-history", history);
              }
          }
          context.invokeNext(layout, service, handler);
      }
  
  }
  
  
  
  1.2       +2 -0      
cocoon-2.1/src/blocks/portal/samples/resources/bookmarks.xml
  
  Index: bookmarks.xml
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/blocks/portal/samples/resources/bookmarks.xml,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- bookmarks.xml     11 Dec 2003 14:41:32 -0000      1.1
  +++ bookmarks.xml     12 Dec 2003 10:13:34 -0000      1.2
  @@ -1,3 +1,4 @@
  +<bookmarks>
   <events>
     <event type="jxpath" id="showtab">
       <targettype>layout</targettype>
  @@ -5,3 +6,4 @@
       <path>aspectDatas/tab</path>
     </event>
   </events>
  +</bookmarks>
  
  
  

Reply via email to