Christopher, I've added scenario to verify behaviour with null calendar objects:
https://svn.codehaus.org/jbehave/trunk/core/examples/trader/src/main/java/org/jbehave/examples/trader/scenarios/claims_with_null_calendar.scenario It shows HTML/XML reports can now be generated. Obviously, though, because you introduced a null object (quite a bad anti-pattern, IMO) you need to be careful not to invoke any method on it without having first verified it's not null. I'll let you verify that it works for you before cutting a 2.4.1 release. Cheers On 30/01/2010 10:33, Mauro Talevi wrote: > There may some other source of nulls. I've committed a fix that checks > for null objects when escaping values. I've deployed 2.5-SNAPSHOT, > could you please try it out (or try out building snapshot from latest > trunk?) I've not had time to build full scenario to verify behaviour > from your example, but will do so. > > Cheers > > On 29/01/2010 17:19, Christopher Gardner wrote: >> I tried the empty string, but received >> >> java.lang.NullPointerException >> at >> org.jbehave.scenario.reporters.PrintStreamScenarioReporter$1.transform(PrintStreamScenarioReporter.java:245) >> at >> org.apache.commons.collections.CollectionUtils.transform(CollectionUtils.java:433) >> at >> org.jbehave.scenario.reporters.PrintStreamScenarioReporter.escape(PrintStreamScenarioReporter.java:252) >> at >> org.jbehave.scenario.reporters.PrintStreamScenarioReporter.escapeAll(PrintStreamScenarioReporter.java:230) >> at >> org.jbehave.scenario.reporters.PrintStreamScenarioReporter.format(PrintStreamScenarioReporter.java:222) >> at >> org.jbehave.scenario.reporters.PrintStreamScenarioReporter.beforeExamples(PrintStreamScenarioReporter.java:188) >> at >> org.jbehave.scenario.reporters.DelegatingScenarioReporter.beforeExamples(DelegatingScenarioReporter.java:80) >> at >> org.jbehave.scenario.ScenarioRunner.runExamplesTableScenario(ScenarioRunner.java:94) >> at org.jbehave.scenario.ScenarioRunner.run(ScenarioRunner.java:63) >> at org.jbehave.scenario.ScenarioRunner.run(ScenarioRunner.java:48) >> at org.jbehave.scenario.ScenarioRunner.run(ScenarioRunner.java:38) >> at >> org.jbehave.scenario.AbstractScenario.runScenario(AbstractScenario.java:75) >> at org.jbehave.scenario.JUnitScenario.runScenario(JUnitScenario.java:54) >> at >> org.jbehave.scenario.JUnitScenario.testScenario(JUnitScenario.java:84) >> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >> at >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) >> at >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) >> at java.lang.reflect.Method.invoke(Method.java:592) >> at junit.framework.TestCase.runTest(TestCase.java:168) >> at junit.framework.TestCase.runBare(TestCase.java:134) >> at junit.framework.TestResult$1.protect(TestResult.java:110) >> at junit.framework.TestResult.runProtected(TestResult.java:128) >> at junit.framework.TestResult.run(TestResult.java:113) >> at junit.framework.TestCase.run(TestCase.java:124) >> at junit.framework.TestSuite.runTest(TestSuite.java:232) >> at junit.framework.TestSuite.run(TestSuite.java:227) >> at >> org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:79) >> at >> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) >> at >> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) >> at >> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) >> at >> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) >> at >> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) >> at >> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) >> >> >> >> On Fri, Jan 29, 2010 at 9:09 AM, Christopher Gardner >> <[email protected]> wrote: >>> Thanks, Mauro. >>> >>> On Fri, Jan 29, 2010 at 2:22 AM, Mauro Talevi >>> <[email protected]> wrote: >>>> The problem is that in your CalendarConverter you return a null object >>>> for the "none" date entry. Simply return an empty string and it will >>>> work for now. >>>> >>>> Cheers >>>> >>>> On 28/01/2010 15:52, Christopher Gardner wrote: >>>>> Mauro, >>>>> >>>>> I can't give the real version of the Steps class, as it has >>>>> significant proprietary information, but attached are 2 files: A >>>>> .scenario file and a CalendarConverter.java file that converts string >>>>> dates in the form of mm/dd/yyyy or "none" into an appropriate Calendar >>>>> representation. Note in the .scenario file the parameter "<outcome>" >>>>> is quoted. In the Steps class those quotes are escaped. >>>>> >>>>> >>>>> >>>>> On Thu, Jan 28, 2010 at 9:16 AM, Mauro Talevi >>>>> <[email protected]> wrote: >>>>>> Hi Christopher, >>>>>> >>>>>> the problem occurs because it tries to escape HTML chars from the values >>>>>> of the examples table that it does not find (defaulting to null). The >>>>>> reason it does not fail for CONSOLE and TXT is that only HTML and XML >>>>>> reporters escape chars. >>>>>> >>>>>> Opened issue to improve resilience: >>>>>> >>>>>> http://jira.codehaus.org/browse/JBEHAVE-237 >>>>>> >>>>>> But if could you please forward the scenario you're using we can help >>>>>> you sort out the data issues to get it working properly in the first >>>>>> place. >>>>>> >>>>>> Cheers >>>>>> >>>>>> On 27/01/2010 22:10, Christopher Gardner wrote: >>>>>>> I created my own AbstractScenario class to handle the configuration of >>>>>>> the scenario filenames, pending steps, and reports. If I specify only >>>>>>> CONSOLE and TXT, reports work as expected: The jbehave-reports >>>>>>> directory is generated with the .txt and .stats files. If, however, I >>>>>>> add HTML the builder, I receive an exception: >>>>>>> >>>>>>> java.lang.NullPointerException >>>>>>> at >>>>>>> org.jbehave.scenario.reporters.PrintStreamScenarioReporter$1.transform(PrintStreamScenarioReporter.java:245) >>>>>>> at >>>>>>> org.apache.commons.collections.CollectionUtils.transform(CollectionUtils.java:433) >>>>>>> at >>>>>>> org.jbehave.scenario.reporters.PrintStreamScenarioReporter.escape(PrintStreamScenarioReporter.java:252) >>>>>>> at >>>>>>> org.jbehave.scenario.reporters.PrintStreamScenarioReporter.escapeAll(PrintStreamScenarioReporter.java:230) >>>>>>> at >>>>>>> org.jbehave.scenario.reporters.PrintStreamScenarioReporter.format(PrintStreamScenarioReporter.java:222) >>>>>>> at >>>>>>> org.jbehave.scenario.reporters.PrintStreamScenarioReporter.beforeExamples(PrintStreamScenarioReporter.java:188) >>>>>>> at >>>>>>> org.jbehave.scenario.reporters.DelegatingScenarioReporter.beforeExamples(DelegatingScenarioReporter.java:80) >>>>>>> at >>>>>>> org.jbehave.scenario.ScenarioRunner.runExamplesTableScenario(ScenarioRunner.java:94) >>>>>>> at org.jbehave.scenario.ScenarioRunner.run(ScenarioRunner.java:63) >>>>>>> at org.jbehave.scenario.ScenarioRunner.run(ScenarioRunner.java:48) >>>>>>> at org.jbehave.scenario.ScenarioRunner.run(ScenarioRunner.java:38) >>>>>>> at >>>>>>> org.jbehave.scenario.AbstractScenario.runScenario(AbstractScenario.java:75) >>>>>>> at >>>>>>> org.jbehave.scenario.JUnitScenario.runScenario(JUnitScenario.java:54) >>>>>>> at >>>>>>> org.jbehave.scenario.JUnitScenario.testScenario(JUnitScenario.java:84) >>>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>>>>>> at >>>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) >>>>>>> at >>>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) >>>>>>> at java.lang.reflect.Method.invoke(Method.java:592) >>>>>>> at junit.framework.TestCase.runTest(TestCase.java:168) >>>>>>> at junit.framework.TestCase.runBare(TestCase.java:134) >>>>>>> at junit.framework.TestResult$1.protect(TestResult.java:110) >>>>>>> at junit.framework.TestResult.runProtected(TestResult.java:128) >>>>>>> at junit.framework.TestResult.run(TestResult.java:113) >>>>>>> at junit.framework.TestCase.run(TestCase.java:124) >>>>>>> at junit.framework.TestSuite.runTest(TestSuite.java:232) >>>>>>> at junit.framework.TestSuite.run(TestSuite.java:227) >>>>>>> at >>>>>>> org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:79) >>>>>>> at >>>>>>> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) >>>>>>> at >>>>>>> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) >>>>>>> at >>>>>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) >>>>>>> at >>>>>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) >>>>>>> at >>>>>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) >>>>>>> at >>>>>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) >>>>>>> >>>>>>> >>>>>>> Here is my AbstractScenario. Subclasses are responsible for providing >>>>>>> their class objects and instantiating CandidateSteps. >>>>>>> >>>>>>> package base; >>>>>>> >>>>>>> import static >>>>>>> org.jbehave.scenario.reporters.ScenarioReporterBuilder.Format.*; >>>>>>> import org.jbehave.scenario.*; >>>>>>> import org.jbehave.scenario.errors.*; >>>>>>> import org.jbehave.scenario.parser.*; >>>>>>> import org.jbehave.scenario.reporters.FilePrintStreamFactory; >>>>>>> import org.jbehave.scenario.reporters.ScenarioReporter; >>>>>>> import org.jbehave.scenario.reporters.ScenarioReporterBuilder; >>>>>>> import org.jbehave.scenario.steps.*; >>>>>>> >>>>>>> public abstract class AbstractScenario extends JUnitScenario { >>>>>>> >>>>>>> protected static ScenarioNameResolver converter = new >>>>>>> UnderscoredCamelCaseResolver(".scenario"); >>>>>>> >>>>>>> public AbstractScenario(final Class<? extends RunnableScenario> >>>>>>> scenarioClass, CandidateSteps... candidateSteps) { >>>>>>> super(new PropertyBasedConfiguration() { >>>>>>> @Override >>>>>>> public ScenarioDefiner forDefiningScenarios() { >>>>>>> return new ClasspathScenarioDefiner(converter, new >>>>>>> PatternScenarioParser(keywords())); >>>>>>> } >>>>>>> >>>>>>> @Override >>>>>>> public PendingErrorStrategy forPendingSteps() { >>>>>>> return PendingErrorStrategy.FAILING; >>>>>>> } >>>>>>> >>>>>>> @Override >>>>>>> public ScenarioReporter forReportingScenarios() { >>>>>>> return new ScenarioReporterBuilder(new >>>>>>> FilePrintStreamFactory(scenarioClass, converter)) >>>>>>> .with(CONSOLE) >>>>>>> .with(HTML) >>>>>>> .with(TXT) >>>>>>> .build(); >>>>>>> } >>>>>>> }, candidateSteps); >>>>>>> } >>>>>>> } >>>>>>> >>>>>>> Any suggestions as to what I'm doing wrong? >>>>>>> >>>>>>> Thanks. >>>>>>> >>>>>>> --------------------------------------------------------------------- >>>>>>> To unsubscribe from this list, please visit: >>>>>>> >>>>>>> http://xircles.codehaus.org/manage_email >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> --------------------------------------------------------------------- >>>>>> To unsubscribe from this list, please visit: >>>>>> >>>>>> http://xircles.codehaus.org/manage_email >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> --------------------------------------------------------------------- >>>>>> To unsubscribe from this list, please visit: >>>>>> >>>>>> http://xircles.codehaus.org/manage_email >>>> >>>> >>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe from this list, please visit: >>>> >>>> http://xircles.codehaus.org/manage_email >>>> >>>> >>>> >>> >> >> --------------------------------------------------------------------- >> To unsubscribe from this list, please visit: >> >> http://xircles.codehaus.org/manage_email >> >> >> > > > > --------------------------------------------------------------------- > To unsubscribe from this list, please visit: > > http://xircles.codehaus.org/manage_email > > > --------------------------------------------------------------------- To unsubscribe from this list, please visit: http://xircles.codehaus.org/manage_email
