Carsten Ziegeler wrote:

Ok, so let's change the strategy and fix the standalone service
selector... :) If svn works again I can do this on monday evening - if
noone beats me to it.

I didn't fix the StandaloneServiceSelector but replaced it with a factory. Basically the factory works for me and the code is very simple. Exception handling needs to be improved but that's the next step.

Could somebody verify and review the attached patch?

--
Reinhard Pötz Independent Consultant, Trainer & (IT)-Coach
{Software Engineering, Open Source, Web Applications, Apache Cocoon}

                                       web(log): http://www.poetz.cc
--------------------------------------------------------------------
Index: 
src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
===================================================================
--- 
src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
       (Revision 400157)
+++ 
src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/SitemapLanguage.java
       (Arbeitskopie)
@@ -153,7 +153,7 @@
      * Selector for ProcessingNodeBuilders which is set up in the context of 
the
      * processor that we are building.
      */
-    private ServiceSelector itsBuilders;
+    private ProcessingNodeBuilderFactory processingNodeBuilderFactory;
 
     /**
      * The sitemap component information grabbed while building itsMaanger
@@ -294,11 +294,12 @@
         }
 
         ProcessingNodeBuilder builder;
-        try {
-            builder = (ProcessingNodeBuilder) 
this.itsBuilders.select(nodeName);
+        // try {
+            builder = (ProcessingNodeBuilder) 
this.processingNodeBuilderFactory.createBuilder(nodeName);
+            /*
         } catch (ServiceException ce) {
             // Is it because this element is unknown ?
-            if (this.itsBuilders.isSelectable(nodeName)) {
+            if (this.processingNodeBuilderFactory.isSelectable(nodeName)) {
                 // No : rethrow
                 throw ce;
             }
@@ -306,7 +307,8 @@
             String msg = "Unknown element '" + nodeName + "' at " + 
config.getLocation();
             throw new ConfigurationException(msg);
         }
-
+        */
+            
         builder.setBuilder(this);
 
         if (builder instanceof LinkedProcessingNodeBuilder) {
@@ -403,7 +405,7 @@
 
         // Create & initialize the NodeBuilder selector.
         {
-            StandaloneServiceSelector selector = new 
StandaloneServiceSelector();
+//            StandaloneServiceSelector selector = new 
StandaloneServiceSelector();
 
             // Load the builder config file
             SourceResolver resolver = (SourceResolver) 
this.manager.lookup(SourceResolver.ROLE);
@@ -424,9 +426,9 @@
             } finally {
                 this.manager.release(resolver);
             }
-            LifecycleHelper.setupComponent(selector, getLogger(), itsContext, 
this.itsManager,
-                    config.getChild("nodes", false), true);
-            this.itsBuilders = selector;
+//            LifecycleHelper.setupComponent(selector, getLogger(), 
itsContext, this.itsManager,
+//                    config.getChild("nodes", false), true);
+            this.processingNodeBuilderFactory = new 
ProcessingNodeBuilderFactory(this, config, this.getLogger());
         }
 
         // Calls to getRegisteredNode() are forbidden
@@ -641,8 +643,8 @@
         this.processor = null; // Set in setProcessor()
 
         this.itsNamespace = null; // Set in build()
-        LifecycleHelper.dispose(this.itsBuilders);
-        this.itsBuilders = null; // Set in build()
+        LifecycleHelper.dispose(this.processingNodeBuilderFactory);
+        this.processingNodeBuilderFactory = null; // Set in build()
         this.itsLifecycle = null; // Set in build()
         this.itsManager = null; // Set in build()
 
Index: 
src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/ProcessingNodeBuilderFactory.java
===================================================================
--- 
src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/ProcessingNodeBuilderFactory.java
  (Revision 0)
+++ 
src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/ProcessingNodeBuilderFactory.java
  (Revision 0)
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cocoon.components.treeprocessor.sitemap;
+
+import java.util.HashMap;
+import java.util.Map;
+
+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.logger.LogEnabled;
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.cocoon.components.treeprocessor.ProcessingNodeBuilder;
+import org.apache.cocoon.components.treeprocessor.TreeBuilder;
+
+public class ProcessingNodeBuilderFactory {
+
+       private TreeBuilder treeBuilder;
+       private Map builderNodesMap = new HashMap();
+       private Logger logger;
+
+       public ProcessingNodeBuilderFactory(TreeBuilder treeBuilder, 
Configuration nodeBuildersConfiguration, Logger logger)  
+               throws ConfigurationException {
+               
+               this.logger = logger;
+               this.treeBuilder = treeBuilder;
+               createBuilderNodes(nodeBuildersConfiguration);
+       }
+       
+       public ProcessingNodeBuilder createBuilder(String node) {
+               BuilderNode builderNode = (BuilderNode) 
this.builderNodesMap.get(node);
+               ProcessingNodeBuilder processingNodeBuilder = null;
+               try {
+                       processingNodeBuilder = (ProcessingNodeBuilder) 
Class.forName(builderNode.builderClass).newInstance();
+                       ((Configurable) 
processingNodeBuilder).configure(builderNode.configuration);
+                       ((LogEnabled) 
processingNodeBuilder).enableLogging(this.logger);
+                       processingNodeBuilder.setBuilder(this.treeBuilder);
+               } catch (Exception e) {
+                       new RuntimeException("Can't create 
ProcessingNodeBuilder for element '" + node + "'", e);
+               }
+               return processingNodeBuilder;
+       }
+       
+       private void createBuilderNodes(Configuration 
nodeBuildersConfiguration) throws ConfigurationException {
+               Configuration[] nodes = 
nodeBuildersConfiguration.getChild("nodes").getChildren();
+               for(int i = 0; i < nodes.length; i++) {
+                       BuilderNode builderNode = new BuilderNode();
+                       builderNode.name = nodes[i].getAttribute("name");
+                       builderNode.builderClass = 
nodes[i].getAttribute("builder");
+                       builderNode.configuration = nodes[i];
+                       builderNodesMap.put(builderNode.name, builderNode);
+               }
+       }
+       
+       private static class BuilderNode {
+               String name;
+               String builderClass;
+               Configuration configuration;
+       }
+       
+       
+}

Eigenschaftsänderungen: 
src\main\java\org\apache\cocoon\components\treeprocessor\sitemap\ProcessingNodeBuilderFactory.java
___________________________________________________________________
Name: eol:style
   + 'native'

Reply via email to