Title: [942] trunk/examples/trader/src/main/java/org/jbehave/examples/trader: Updated trader example to use a container to find script configured components.
Revision
942
Author
mauro
Date
2008-09-21 13:28:54 -0500 (Sun, 21 Sep 2008)

Log Message

Updated trader example to use a container to find script configured components.
There are still some classloading issues that merit further attention (see FIXME in TraderContainer).

Modified Paths

Added Paths

Diff

Added: trunk/examples/trader/src/main/java/org/jbehave/examples/trader/container/TraderContainer.java (0 => 942)

--- trunk/examples/trader/src/main/java/org/jbehave/examples/trader/container/TraderContainer.java	                        (rev 0)
+++ trunk/examples/trader/src/main/java/org/jbehave/examples/trader/container/TraderContainer.java	2008-09-21 18:28:54 UTC (rev 942)
@@ -0,0 +1,11 @@
+package org.jbehave.examples.trader.container;
+
+
+//FIXME there are classloading issues (only using maven plugin) if TraderContainer extends the XMLPicoContainer cointained in core
+//Not quite sure what the root cause is - need more investigation. 
+public class TraderContainer extends XMLContainer {
+
+    public TraderContainer(ClassLoader classLoader) {
+        super("org/jbehave/examples/trader/container/trader.xml", classLoader);
+    }
+}

Added: trunk/examples/trader/src/main/java/org/jbehave/examples/trader/container/XMLContainer.java (0 => 942)

--- trunk/examples/trader/src/main/java/org/jbehave/examples/trader/container/XMLContainer.java	                        (rev 0)
+++ trunk/examples/trader/src/main/java/org/jbehave/examples/trader/container/XMLContainer.java	2008-09-21 18:28:54 UTC (rev 942)
@@ -0,0 +1,53 @@
+package org.jbehave.examples.trader.container;
+
+import java.io.InputStreamReader;
+import java.io.Reader;
+
+import org.jbehave.container.Container;
+import org.picocontainer.PicoContainer;
+import org.picocontainer.script.ScriptedContainerBuilder;
+import org.picocontainer.script.xml.XMLContainerBuilder;
+
+/**
+ * Simplified XML Pico-based Container
+ * 
+ * @author Mauro Talevi
+ */
+public class XMLContainer implements Container {
+
+    private final ClassLoader classLoader;
+    private final PicoContainer container;
+
+    public XMLContainer(String resource) {
+        this(resource, Thread.currentThread().getContextClassLoader());
+    }
+
+    public XMLContainer(String resource, ClassLoader classLoader) {
+        this.classLoader = classLoader;
+        this.container = buildContainer(resource);
+    }
+
+    public <T> T getComponent(Class<T> type) {
+        return container.getComponent(type);
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T> T getComponent(Class<T> type, Object key) {
+        return (T) container.getComponent(key);
+    }
+
+    private PicoContainer buildContainer(String resource) {
+        Reader script = getReader(resource, classLoader);
+        ScriptedContainerBuilder builder = createContainerBuilder(script, classLoader);
+        return builder.buildContainer(null, null, false);
+    }
+
+    private Reader getReader(String resource, ClassLoader classLoader) {
+        return new InputStreamReader(classLoader.getResourceAsStream(resource));
+    }
+    
+    protected ScriptedContainerBuilder createContainerBuilder(Reader script, ClassLoader classLoader) {
+        return new XMLContainerBuilder(script, classLoader);
+    }
+
+}

Added: trunk/examples/trader/src/main/java/org/jbehave/examples/trader/container/trader.xml (0 => 942)

--- trunk/examples/trader/src/main/java/org/jbehave/examples/trader/container/trader.xml	                        (rev 0)
+++ trunk/examples/trader/src/main/java/org/jbehave/examples/trader/container/trader.xml	2008-09-21 18:28:54 UTC (rev 942)
@@ -0,0 +1,25 @@
+<container component-instance-factory='org.picocontainer.script.xml.XStreamComponentInstanceFactory'>
+
+  <component-instance key='org.jbehave.examples.trader.model.Trader'>
+    <org.jbehave.examples.trader.model.Trader>
+      <name>Mauro</name>
+      <stocks class="java.util.Arrays$ArrayList">
+        <a class="org.jbehave.examples.trader.model.Stock-array">
+          <org.jbehave.examples.trader.model.Stock>
+            <prices class="java.util.Arrays$ArrayList">
+              <a class="java.lang.Double-array">
+                <double>1.0</double>
+              </a>
+            </prices>
+            <alertPrice>10.0</alertPrice>
+            <status>OFF</status>
+          </org.jbehave.examples.trader.model.Stock>
+        </a>
+      </stocks>
+    </org.jbehave.examples.trader.model.Trader>
+  </component-instance>
+
+  <component-implementation class='org.jbehave.examples.trader.persistence.TraderPersister' />
+  <component-implementation class='org.jbehave.examples.trader.converters.TraderConverter' />
+
+</container>

Added: trunk/examples/trader/src/main/java/org/jbehave/examples/trader/scenarios/TraderContainerSteps.java (0 => 942)

--- trunk/examples/trader/src/main/java/org/jbehave/examples/trader/scenarios/TraderContainerSteps.java	                        (rev 0)
+++ trunk/examples/trader/src/main/java/org/jbehave/examples/trader/scenarios/TraderContainerSteps.java	2008-09-21 18:28:54 UTC (rev 942)
@@ -0,0 +1,58 @@
+package org.jbehave.examples.trader.scenarios;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.jbehave.util.JUnit4Ensure.ensureThat;
+
+import java.util.List;
+
+import org.jbehave.container.Container;
+import org.jbehave.examples.trader.container.TraderContainer;
+import org.jbehave.examples.trader.model.Stock;
+import org.jbehave.examples.trader.model.Trader;
+import org.jbehave.examples.trader.persistence.TraderPersister;
+import org.jbehave.scenario.annotations.Given;
+import org.jbehave.scenario.annotations.Then;
+import org.jbehave.scenario.annotations.When;
+import org.jbehave.scenario.steps.Steps;
+import org.jbehave.scenario.steps.StepsConfiguration;
+
+public class TraderContainerSteps extends Steps {
+
+    private double threshold;
+    private Stock stock;
+    private Trader trader;
+    private Container container;
+
+    public TraderContainerSteps(double threshold, ClassLoader classLoader) {
+        super(new StepsConfiguration());
+        this.threshold = threshold;
+        this.container = new TraderContainer(classLoader);
+    }
+
+    @Given("a trader of name $name")
+    public void aTrader(String name) {
+        this.trader = container.getComponent(TraderPersister.class).retrieveTrader(name);
+    }
+
+    @Given("a stock of prices $prices")
+    public void aStockOfPrice(List<Double> prices) {
+        stock = new Stock(prices, threshold);
+    }
+
+    @When("the stock is traded at $price")
+    public void theStockIsTradedAt(double price) {
+        stock.tradeAt(price);
+    }
+
+    @Then("the alert status should be $status")
+    public void theAlertStatusShouldBe(String status) {
+        ensureThat(stock.getStatus().name(), equalTo(status));
+    }
+
+    @Then("the trader sells all stocks")
+    public void theTraderSellsAllStocks() {
+        trader.sellAllStocks();
+        ensureThat(trader.getStocks().size(), equalTo(0));
+    }
+
+}

Modified: trunk/examples/trader/src/main/java/org/jbehave/examples/trader/scenarios/TraderSellsAllStocks.java (941 => 942)

--- trunk/examples/trader/src/main/java/org/jbehave/examples/trader/scenarios/TraderSellsAllStocks.java	2008-09-21 17:51:34 UTC (rev 941)
+++ trunk/examples/trader/src/main/java/org/jbehave/examples/trader/scenarios/TraderSellsAllStocks.java	2008-09-21 18:28:54 UTC (rev 942)
@@ -1,10 +1,10 @@
 package org.jbehave.examples.trader.scenarios;
 
+import org.jbehave.scenario.JUnitScenario;
 import org.jbehave.scenario.PropertyBasedConfiguration;
-import org.jbehave.scenario.JUnitScenario;
+import org.jbehave.scenario.parser.ClasspathScenarioDefiner;
 import org.jbehave.scenario.parser.PatternScenarioParser;
 import org.jbehave.scenario.parser.ScenarioDefiner;
-import org.jbehave.scenario.parser.ClasspathScenarioDefiner;
 import org.jbehave.scenario.parser.UnderscoredCamelCaseResolver;
 
 
@@ -19,7 +19,7 @@
             public ScenarioDefiner forDefiningScenarios() {
                 return new ClasspathScenarioDefiner(new UnderscoredCamelCaseResolver(".scenario"), new PatternScenarioParser(this), classLoader);
             }
-        }, new TraderSteps(10.0, classLoader));
+        }, new TraderContainerSteps(10.0, classLoader)); // Could also use new TraderSteps(10.0, classLoader)
     }
 
 }


To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email

Reply via email to