Author: nuttycom
Date: Thu Oct 26 14:47:55 2006
New Revision: 468154

URL: http://svn.apache.org/viewvc?view=rev&rev=468154
Log:
Updated Digester configuration system & tests to encompass new features

Modified:
    
jakarta/commons/sandbox/pipeline/trunk/src/main/java/org/apache/commons/pipeline/config/PipelineRuleSet.java
    
jakarta/commons/sandbox/pipeline/trunk/src/test/java/org/apache/commons/pipeline/config/DigesterPipelineFactoryTest.java
    
jakarta/commons/sandbox/pipeline/trunk/src/test/resources/TestResources.properties
    jakarta/commons/sandbox/pipeline/trunk/src/test/resources/test_conf.xml

Modified: 
jakarta/commons/sandbox/pipeline/trunk/src/main/java/org/apache/commons/pipeline/config/PipelineRuleSet.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/sandbox/pipeline/trunk/src/main/java/org/apache/commons/pipeline/config/PipelineRuleSet.java?view=diff&rev=468154&r1=468153&r2=468154
==============================================================================
--- 
jakarta/commons/sandbox/pipeline/trunk/src/main/java/org/apache/commons/pipeline/config/PipelineRuleSet.java
 (original)
+++ 
jakarta/commons/sandbox/pipeline/trunk/src/main/java/org/apache/commons/pipeline/config/PipelineRuleSet.java
 Thu Oct 26 14:47:55 2006
@@ -1,24 +1,28 @@
 /*
- * Copyright 2005 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
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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. 
- */
+ * 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.commons.pipeline.config;
 
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.digester.*;
 import org.apache.commons.pipeline.*;
 import org.xml.sax.Attributes;
@@ -31,15 +35,15 @@
  * <ul>
  *     <li>
  *         <code>&lt;pipeline&gt;&lt;/pipeline&gt;</code><br/>
- *         The root element of the XML configuration file for a pipeline. This 
tag 
- *         supports two optional attributes that are for use only when 
configuring 
- *         branch pipelines, <code>key</code> and <code>configURI</code>. 
These 
+ *         The root element of the XML configuration file for a pipeline. This 
tag
+ *         supports two optional attributes that are for use only when 
configuring
+ *         branch pipelines, <code>key</code> and <code>configURI</code>. These
  *         attributes are described more fully below in the 
<code>&lt;branch&gt;</code>
  *         documentation.
- *     </li>     
+ *     </li>
  *     <li>
  *         <code>&lt;driverFactory className="<em>MyDriverFactory</em>" 
id="<em>my_id</em>" ... /&gt;</code><br/>
- *         This tag is used to create and configure a [EMAIL PROTECTED] 
StageDriverFactory} that 
+ *         This tag is used to create and configure a [EMAIL PROTECTED] 
StageDriverFactory} that
  *         will be used to create [EMAIL PROTECTED] StageDriver} instances for 
stages
  *         in the parent pipeline. Each [EMAIL PROTECTED] StageDriverFactory} 
is identified by a unique
  *         string identifier that is used by the <code>&lt;stage&gt;</code> tag
@@ -51,40 +55,40 @@
  *     </li>
  *     <li>
  *         <code>&lt;stage className="<em>MyStageClass</em>" 
driverFactoryId="<i>name</i>" ... &gt;&lt;/stage&gt;</code><br/>
- *         A single stage is created, configured, and added to the parent 
pipeline using 
- *         this tag. Stages created in this manner are added to the pipeline 
in the order 
+ *         A single stage is created, configured, and added to the parent 
pipeline using
+ *         this tag. Stages created in this manner are added to the pipeline 
in the order
  *         that they occur in the configuration file. The class of the stage 
(which must
  *         provide a no-argument constructor) is specified by the 
<em>className</em> attribute.
  *         Each stage should be associated with a previously declared driver 
factory
- *         by use of the <code>driverFactoryId</code> attribute. All other 
attributes are 
- *         used by Digester to set bean properties on the newly created Stage 
object. 
+ *         by use of the <code>driverFactoryId</code> attribute. All other 
attributes are
+ *         used by Digester to set bean properties on the newly created Stage 
object.
  *     </li>
  *     <li>
  *         <code>&lt;feed/&gt;</code><br/>
- *         Enqueue an object onto the first stage in the pipeline. There are 
two 
+ *         Enqueue an object onto the first stage in the pipeline. There are 
two
  *         types of usage available, provided by the following subtags:
  *         <ul>
  *             <li>
  *                 <code>&lt;value&gt;my_value&lt;/value&gt;</code><br/>
  *                 Feed the string value of the body of this tag to the first 
stage in the
- *                 pipeline.    
+ *                 pipeline.
  *             </li>
  *             <li>
  *                 <code>&lt;object className="MyClass" ... /&gt;</code><br/>
  *                 This tag uses the standard Digester ObjectCreateRule to 
create an
  *                 arbitrary object of the specified class (which must provide 
a
  *                 no-argument constructor) to the first stage in the pipeline.
- *                 All attributes other than <code>className</codee> are used 
by 
+ *                 All attributes other than <code>className</codee> are used 
by
  *                 Digester to set bean properties on the newly created object.
- *             </li>             
+ *             </li>
  *         </ul>
  *     </li>
  *     <li>
  *         <code>&lt;branch/&gt;</code><br/>
  *         Add a branch to a pipeline. The contents of this tag should
- *         be one or more <code>&lt;pipeline/&gt;</code> declarations. Branch 
- *         pipelines added in this fashion must be configured with an 
attribute 
- *         named <code>key</code> that holds the name by which the branch 
pipeline 
+ *         be one or more <code>&lt;pipeline/&gt;</code> declarations. Branch
+ *         pipelines added in this fashion must be configured with an attribute
+ *         named <code>key</code> that holds the name by which the branch 
pipeline
  *         will be referred to.<br/>
  *  Branch pipelines may be configured either inline in the main configuration
  *  file or in a separate file referred to by the <code>configURI</code> 
pipeline
@@ -106,7 +110,7 @@
     /**
      * Creates a new pipeline rule set with the specified collection of 
additional
      * rule sets that may be used for recursive creation of branch pipelines.
-     * @param nestedRuleSets A list of other RuleSet instances that are being 
used in conjunction with the 
+     * @param nestedRuleSets A list of other RuleSet instances that are being 
used in conjunction with the
      * PipelineRuleSet. In the case that branch pipelines are referred to by 
URI, these
      * rule sets will be added to a new Digester instance (along with a 
PipelineRuleSet
      * instance) that is used to parse the branch configuration file.
@@ -128,7 +132,7 @@
         digester.addFactoryCreate("pipeline", pipelineFactory);
         digester.addSetProperties("pipeline");
         digester.addRule("pipeline", new PipelineDriverFactoriesRule());
-                
+        
         //these rules are used to add branches to the main pipeline
         digester.addFactoryCreate("*/branch/pipeline", pipelineFactory);
         digester.addRule("*/branch/pipeline", new CallMethodRule(1, 
"addBranch", 2, addBranchTypes));
@@ -136,8 +140,8 @@
         digester.addCallParam("*/branch/pipeline", 1, 0);
         digester.addRule("*/branch/pipeline", new 
PipelineDriverFactoriesRule());
         
-        //rules for adding values to the global pipeline environment        
-        digester.addObjectCreate("*/pipeline/env/object", "java.lang.Object", 
"className");        
+        //rules for adding values to the global pipeline environment
+        digester.addObjectCreate("*/pipeline/env/object", "java.lang.Object", 
"className");
         digester.addSetProperties("*/pipeline/env/object");
         digester.addRule("*/pipeline/env/object", new CallMethodRule(1, 
"setEnv", 2, setEnvTypes));
         digester.addCallParam("*/pipeline/env/object", 0, "key");
@@ -156,6 +160,16 @@
         digester.addFactoryCreate("*/pipeline/driverFactory", 
driverFactoryFactory);
         digester.addSetProperties("*/pipeline/driverFactory");
         
+        digester.addObjectCreate("*/driverFactory", 
"org.apache.commons.pipeline.StageDriverFactory", "className");
+        digester.addSetProperties("*/driverFactory");
+        digester.addSetNext("*/driverFactory", "setWrappedSDF", 
"org.apache.commons.pipeline.StageDriverFactory");
+        
+        //rules for setting an object property on the next-to-top object on 
the stack
+        //similar to setNestedPropertiesRule
+        digester.addObjectCreate("*/property", "java.lang.Object", 
"className");
+        digester.addSetProperties("*/property");
+        digester.addRule("*/property", new SetNestedPropertyObjectRule());
+        
         //this rule is intended to be used to add a stage to a pipeline
         digester.addObjectCreate("*/pipeline/stage", 
"org.apache.commons.pipeline.BaseStage", "className");
         digester.addSetProperties("*/pipeline/stage");
@@ -169,13 +183,13 @@
         digester.addSetProperties("*/pipeline/feed/object");
         digester.addRule("*/pipeline/feed/object", new 
PipelineFeedObjectRule());
     }
-            
+    
     /**
      * This factory is used to create a pipeline. If the "configURI" parameter
      * is specified, the pipeline is created based upon the configuration file
      * located at that URI.
      */
-    private class PipelineFactory extends AbstractObjectCreationFactory {      
  
+    private class PipelineFactory extends AbstractObjectCreationFactory {
         public Object createObject(Attributes attributes) throws 
java.lang.Exception {
             String configURI = attributes.getValue("configURI");
             if (configURI == null) {
@@ -204,13 +218,30 @@
             
digester.push("org.apache.commons.pipeline.config.DriverFactories", new 
HashMap<String, StageDriverFactory>());
             super.begin(namespace, name, attributes);
         }
-    
+        
         public void end(String namespace, String name) throws Exception {
             super.end(namespace, name);
             digester.pop("org.apache.commons.pipeline.config.DriverFactories");
         }
     }
-
+    
+    /**
+     * Configure the storage for the map of driver factories for the pipeline.
+     */
+    private class SetNestedPropertyObjectRule extends Rule {
+        String propName;
+        
+        public void begin(String namespace, String name, Attributes 
attributes) throws Exception {
+            propName = attributes.getValue("propName");
+            super.begin(namespace, name, attributes);
+        }
+        
+        public void end(String namespace, String name) throws Exception {
+            super.end(namespace, name);
+            BeanUtils.setProperty(digester.peek(1), propName, digester.peek());
+        }
+    }
+    
     /**
      * This ObjectCreationFactory creates a stage driver factory and stores
      * it in the scope of the rule set so that it can be retrieved by the stage
@@ -254,8 +285,8 @@
             Pipeline pipeline = (Pipeline) digester.peek(1);
             pipeline.addStage(stage, factory);
         }
-        }
-        
+    }
+    
     /**
      * This Rule allows an object to be fed to the pipeline.
      */

Modified: 
jakarta/commons/sandbox/pipeline/trunk/src/test/java/org/apache/commons/pipeline/config/DigesterPipelineFactoryTest.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/sandbox/pipeline/trunk/src/test/java/org/apache/commons/pipeline/config/DigesterPipelineFactoryTest.java?view=diff&rev=468154&r1=468153&r2=468154
==============================================================================
--- 
jakarta/commons/sandbox/pipeline/trunk/src/test/java/org/apache/commons/pipeline/config/DigesterPipelineFactoryTest.java
 (original)
+++ 
jakarta/commons/sandbox/pipeline/trunk/src/test/java/org/apache/commons/pipeline/config/DigesterPipelineFactoryTest.java
 Thu Oct 26 14:47:55 2006
@@ -1,18 +1,21 @@
 /*
- * Copyright 2005 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
- *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
- */
+ * 
+ * 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.commons.pipeline.config;
 
@@ -26,6 +29,9 @@
 import org.apache.commons.pipeline.Stage;
 import org.apache.commons.pipeline.StageEventListener;
 import org.apache.commons.pipeline.listener.ObjectProcessedEventCounter;
+import org.apache.commons.pipeline.stage.KeyWaitBufferStage;
+import org.apache.commons.pipeline.testFramework.TestFeeder;
+import org.apache.commons.pipeline.util.BlockingQueueFactory;
 
 /**
  * Test cases for the DigesterPipelineFactory.
@@ -50,6 +56,8 @@
         PipelineFactory factory = new DigesterPipelineFactory(confURL);
         
         Pipeline pipeline = factory.createPipeline();
+        TestFeeder terminalFeeder = new TestFeeder();
+        pipeline.setTerminalFeeder(terminalFeeder);
         assertNotNull("Pipeline exists.", pipeline);
         
         int i = 0;
@@ -57,10 +65,14 @@
             assertNotNull("Stage is not null.", stage);
             assertEquals(stage.getClass(), 
Class.forName(testResources.getString(keyBase + ".stage" + i + ".class")));
             i++;
+            if (stage instanceof KeyWaitBufferStage) {
+                assertTrue(((KeyWaitBufferStage) stage).getQueueFactory() 
instanceof BlockingQueueFactory.ArrayBlockingQueueFactory);
+            }
         }
         
         pipeline.run();
         
+        
         boolean eventsRecorded = false;
         assertTrue("Pipeline has at least one listener.", 
pipeline.getRegisteredListeners().size() > 0);
         for (StageEventListener l : pipeline.getRegisteredListeners()) {
@@ -74,5 +86,6 @@
         
         assertNotNull(pipeline.getEnv("testDate"));
         assertEquals("Hello, World!", pipeline.getEnv("testEnvVar"));
+        assertTrue("Terminal feeder did not receive any data.", 
terminalFeeder.receivedValues.size() > 0);
     }
 }

Modified: 
jakarta/commons/sandbox/pipeline/trunk/src/test/resources/TestResources.properties
URL: 
http://svn.apache.org/viewvc/jakarta/commons/sandbox/pipeline/trunk/src/test/resources/TestResources.properties?view=diff&rev=468154&r1=468153&r2=468154
==============================================================================
--- 
jakarta/commons/sandbox/pipeline/trunk/src/test/resources/TestResources.properties
 (original)
+++ 
jakarta/commons/sandbox/pipeline/trunk/src/test/resources/TestResources.properties
 Thu Oct 26 14:47:55 2006
@@ -20,3 +20,5 @@
 
test.DigesterPipelineFactoryTest.stage1.class=org.apache.commons.pipeline.stage.LogStage
 
test.DigesterPipelineFactoryTest.stage2.class=org.apache.commons.pipeline.stage.RaiseEventStage
 
test.DigesterPipelineFactoryTest.stage3.class=org.apache.commons.pipeline.stage.RaiseKeyAvailableEventStage
+test.DigesterPipelineFactoryTest.stage4.class=org.apache.commons.pipeline.stage.KeyWaitBufferStage
+test.DigesterPipelineFactoryTest.stage5.class=org.apache.commons.pipeline.stage.LogStage

Modified: 
jakarta/commons/sandbox/pipeline/trunk/src/test/resources/test_conf.xml
URL: 
http://svn.apache.org/viewvc/jakarta/commons/sandbox/pipeline/trunk/src/test/resources/test_conf.xml?view=diff&rev=468154&r1=468153&r2=468154
==============================================================================
--- jakarta/commons/sandbox/pipeline/trunk/src/test/resources/test_conf.xml 
(original)
+++ jakarta/commons/sandbox/pipeline/trunk/src/test/resources/test_conf.xml Thu 
Oct 26 14:47:55 2006
@@ -14,13 +14,16 @@
  * 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.
- *
- * Author     : Kris Nuttycombe, National Geophysical Data Center
 -->
 
 <pipeline>
   <listener 
className="org.apache.commons.pipeline.listener.ObjectProcessedEventCounter"/>
-  <driverFactory 
className="org.apache.commons.pipeline.driver.DedicatedThreadStageDriverFactory"
 id="f1"/>
+  
+  <driverFactory 
className="org.apache.commons.pipeline.driver.DedicatedThreadStageDriverFactory"
 id="f1">
+      <property propName="queueFactory" 
className="org.apache.commons.pipeline.util.BlockingQueueFactory$ArrayBlockingQueueFactory"
+                capacity="10" fair="false"/>
+  </driverFactory>
+  
   <env>
       <object className="java.util.Date" key="testDate"/>
       <value key="testEnvVar">Hello, World!</value>
@@ -28,18 +31,25 @@
 
   <stage className="org.apache.commons.pipeline.stage.FileFinderStage" 
driverFactoryId="f1"
          filePattern=".*\.java" />
-
-  <stage className="org.apache.commons.pipeline.stage.LogStage" 
driverFactoryId="f1" />
                    
+  <stage className="org.apache.commons.pipeline.stage.LogStage" 
driverFactoryId="f1" />
+
   <stage className="org.apache.commons.pipeline.stage.RaiseEventStage" 
driverFactoryId="f1" />
   
-  <!--
-  <stage 
className="org.apache.commons.pipeline.stage.RaiseKeyAvailableEventStage" 
driverFactoryId="f1" 
-         
keyFactoryClass="org.apache.commons.pipeline.opt.KeyFactory$HashKeyFactory"/>
-  -->
+  <stage 
className="org.apache.commons.pipeline.stage.RaiseKeyAvailableEventStage" 
driverFactoryId="f1">
+      <property propName="keyFactory" 
className="org.apache.commons.pipeline.util.KeyFactory$HashKeyFactory"/>      
+  </stage> 
+         
+  <stage className="org.apache.commons.pipeline.stage.KeyWaitBufferStage" 
driverFactoryId="f1">
+      <property propName="keyFactory" 
className="org.apache.commons.pipeline.util.KeyFactory$HashKeyFactory"/>      
+      <property propName="queueFactory" 
className="org.apache.commons.pipeline.util.BlockingQueueFactory$ArrayBlockingQueueFactory"
+                capacity="10" fair="false"/>
+  </stage>
   
+  <stage className="org.apache.commons.pipeline.stage.LogStage" 
driverFactoryId="f1" />
+
   <feed>
     <value>src/main/java</value>
-    <value>src/test/java</value>
+    <value>src/test/java</value>    
   </feed>
 </pipeline>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to