sylvain     02/02/09 14:34:24

  Modified:    src/scratchpad/src/org/apache/cocoon/treeprocessor/sitemap
                        AggregateNode.java AggregateNodeBuilder.java
  Log:
  Correction of views handling in map:aggregate
  
  Revision  Changes    Path
  1.6       +26 -28    
xml-cocoon2/src/scratchpad/src/org/apache/cocoon/treeprocessor/sitemap/AggregateNode.java
  
  Index: AggregateNode.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/treeprocessor/sitemap/AggregateNode.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- AggregateNode.java        4 Feb 2002 14:39:53 -0000       1.5
  +++ AggregateNode.java        9 Feb 2002 22:34:23 -0000       1.6
  @@ -79,29 +79,32 @@
    * </li>
    * <li>each map:part can have a label
    * </li>
  - * <li>parts labels are checked first for a matching view, then the aggregate label 
is checked
  + * <li>if at least one of the parts has a label matching the current view, only 
parts matching
  + *     this view are added. Otherwise, all parts are added.
    * </li>
    * </ul>
  - * For more info on aggregation and view, see the mail archive
  + * For more info on aggregation and views, see the mail archive
    * <a 
href="http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=100525751417953";>here</a> or
    * <a 
href="http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=100517130418424";>here</a>.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Sylvain Wallez</a>
  - * @version CVS $Id: AggregateNode.java,v 1.5 2002/02/04 14:39:53 cziegeler Exp $
  + * @version CVS $Id: AggregateNode.java,v 1.6 2002/02/09 22:34:23 sylvain Exp $
    */
   
   public class AggregateNode extends AbstractProcessingNode {
   
  -    private Part[] parts;
       private String element;
       private String nsURI;
       private String nsPrefix;
   
  -    /** Views for each part */
  -    private Map[]partViews;
  +    /** All parts */
  +    private Part[] allParts;
  +    
  +    /** Pre-filtered Part[] for views that have a matching label in any of the 
parts */
  +    private Map viewParts;
   
  -    /** View for map:aggregate */
  -    private Map views;
  +    /** View nodes to jump to */
  +    private Map viewNodes;
   
       public AggregateNode(String element, String nsURI, String nsPrefix) {
           this.element = element;
  @@ -109,13 +112,13 @@
           this.nsPrefix = nsPrefix;
       }
   
  -    public void setParts(Part[] parts) {
  -        this.parts = parts;
  +    public void setParts(Part[] allParts, Map viewParts) {
  +        this.allParts = allParts;
  +        this.viewParts = viewParts;
       }
   
  -    public void setViews(Map views, Map[]partViews) {
  -        this.views = views;
  -        this.partViews = partViews;
  +    public void setViewNodes(Map viewNodes) {
  +        this.viewNodes = viewNodes;
       }
   
       public boolean invoke(Environment env, InvokeContext context)
  @@ -135,24 +138,19 @@
   
           // Get actual parts, potentially filtered by the view
           Part[] actualParts;
  +        
           String cocoonView = env.getView();
           if (cocoonView == null) {
               // Keep all parts
  -            actualParts = this.parts;
  +            actualParts = this.allParts;
   
           } else {
  -            // Keep only those parts that are in the view
  -            actualParts = new Part[this.parts.length];
  -            for (int i = 0; i < actualParts.length; i++) {
  -                if (this.partViews[i] != null && 
this.partViews[i].containsKey(cocoonView)) {
  -                    // this part is in the view
  -                    actualParts[i] = this.parts[i];
  -                } else {
  -                    if (infoEnabled) {
  -                        getLogger().info("Aggregate part " + (i+1) + " is not in 
the '" +
  -                            cocoonView + "' view, at " + this.getLocation());
  -                    }
  -                }
  +            // Are there some parts that match this view ?
  +            actualParts = (Part[])this.viewParts.get(cocoonView);
  +            
  +            // If not, keep all parts
  +            if (actualParts == null) {
  +                actualParts = this.allParts;
               }
           }
   
  @@ -168,8 +166,8 @@
           }
   
           // Check aggregate-level view
  -        if (cocoonView != null && this.views != null) {
  -            ProcessingNode viewNode = (ProcessingNode)this.views.get(cocoonView);
  +        if (cocoonView != null && this.viewNodes != null) {
  +            ProcessingNode viewNode = 
(ProcessingNode)this.viewNodes.get(cocoonView);
               if (viewNode != null) {
                   if (infoEnabled) {
                       getLogger().info("Jumping to view '" + cocoonView + "' from 
aggregate at " + this.getLocation());
  
  
  
  1.5       +59 -27    
xml-cocoon2/src/scratchpad/src/org/apache/cocoon/treeprocessor/sitemap/AggregateNodeBuilder.java
  
  Index: AggregateNodeBuilder.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/treeprocessor/sitemap/AggregateNodeBuilder.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- AggregateNodeBuilder.java 4 Feb 2002 14:39:53 -0000       1.4
  +++ AggregateNodeBuilder.java 9 Feb 2002 22:34:23 -0000       1.5
  @@ -69,18 +69,16 @@
   /**
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Sylvain Wallez</a>
  - * @version CVS $Id: AggregateNodeBuilder.java,v 1.4 2002/02/04 14:39:53 cziegeler 
Exp $
  + * @version CVS $Id: AggregateNodeBuilder.java,v 1.5 2002/02/09 22:34:23 sylvain 
Exp $
    */
   
   public class AggregateNodeBuilder extends AbstractProcessingNodeBuilder
     implements LinkedProcessingNodeBuilder {
   
  -    /** The collection of views for each part */
  -    private List partViews;
  -
  -    /** The views for the whole aggregate element */
  +    /** The views for the aggregate element */
       private Collection views;
   
  +    /** The built node */
       private AggregateNode node;
   
       public ProcessingNode buildNode(Configuration config) throws Exception {
  @@ -94,12 +92,16 @@
           this.treeBuilder.setupNode(this.node, config);
   
           this.views = ((SitemapLanguage)this.treeBuilder).getViewsForStatement("", 
"", config);
  +        
  +        // The sitemap builder
  +        SitemapLanguage sitemap = (SitemapLanguage)this.treeBuilder;
   
  -        // Build parts
  -        List parts = new ArrayList();
  -
  -        this.partViews = new ArrayList();
  -
  +        // All parts of the aggregate
  +        List allParts = new ArrayList();
  +   
  +        // For each view that a part matches, the list of all parts that match it
  +        Map viewParts = new HashMap();
  +        
           Configuration[] childConfigs = config.getChildren();
           for (int i = 0; i < childConfigs.length; i++) {
               Configuration childConfig = childConfigs[i];
  @@ -113,27 +115,63 @@
   
               checkNamespace(childConfig);
   
  -            parts.add(new AggregateNode.Part(
  +            AggregateNode.Part currentPart = new AggregateNode.Part(
                   childConfig.getAttribute("src"),
                   childConfig.getAttribute("element", ""),
                   childConfig.getAttribute("ns", ""),
                   childConfig.getAttribute("prefix", ""),
                   childConfig.getAttributeAsBoolean("strip-root", false)
  -            ));
  -
  -            
this.partViews.add(((SitemapLanguage)this.treeBuilder).getViewsForStatement("", "", 
childConfig));
  +            );
  +            
  +            allParts.add(currentPart);
  +            
  +            // Get the views for this part
  +            Collection viewsForPart = sitemap.getViewsForStatement("", "", 
childConfig);
  +            
  +            // Associate this part to all the views it belongs to
  +            if (viewsForPart != null) {
  +                Iterator iter = viewsForPart.iterator();
  +                while(iter.hasNext()) {
  +                    String currentView = (String)iter.next();
  +                    
  +                    // Get collection of parts for current view
  +                    Collection currentViewParts = 
(Collection)viewParts.get(currentView);
  +                    if (currentViewParts == null) {
  +                        // None for now : create the collection
  +                        currentViewParts = new ArrayList();
  +                        viewParts.put(currentView, currentViewParts);
  +                    }
  +                    
  +                    // Add the current part to the parts list of the view
  +                    currentViewParts.add(currentPart);
  +                }
  +            }
           }
   
  -        if (parts.size() == 0) {
  +        if (allParts.size() == 0) {
               String msg = "There must be at least one part in map:aggregate at " + 
config.getLocation();
               getLogger().error(msg);
               throw new ConfigurationException(msg);
           }
   
  -        AggregateNode.Part[] partArray = (AggregateNode.Part[])parts.toArray(
  -            new AggregateNode.Part[parts.size()]);
  +        // Now convert all Collections to Array for faster traversal
  +        AggregateNode.Part[] allPartsArray = (AggregateNode.Part[])allParts.toArray(
  +            new AggregateNode.Part[allParts.size()]);
  +            
  +        Iterator iter = viewParts.entrySet().iterator();
  +        while(iter.hasNext()) {
  +            Map.Entry entry = (Map.Entry)iter.next();
  +            
  +            // Get collection of parts for this entry
  +            Collection coll = (Collection)entry.getValue();
  +
  +            // Convert to array and replace the entry value
  +            entry.setValue(
  +                coll.toArray(new AggregateNode.Part[coll.size()])
  +            );
  +        }
   
  -        node.setParts(partArray);
  +        node.setParts(allPartsArray, viewParts);
   
           return node;
   
  @@ -141,15 +179,9 @@
   
       public void linkNode() throws Exception {
   
  +        // Give the AggregateNode a Node for each view
           SitemapLanguage sitemap = (SitemapLanguage)this.treeBuilder;
  -
  -        // Replace all contents of partViews by the map of views.
  -        Map[] partViewNodes = new Map[this.partViews.size()];
  -
  -        for (int i = 0; i < partViewNodes.length; i++) {
  -            partViewNodes[i] = 
sitemap.getViewNodes((Collection)this.partViews.get(i));
  -        }
  -
  -        this.node.setViews(sitemap.getViewNodes(this.views), partViewNodes);
  +        
  +        this.node.setViewNodes(sitemap.getViewNodes(this.views));
       }
   }
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     [EMAIL PROTECTED]
To unsubscribe, e-mail:          [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to