Author: craigmcc Date: Wed Sep 28 13:57:01 2005 New Revision: 292297 URL: http://svn.apache.org/viewcvs?rev=292297&view=rev Log: Add accessors that allow you to iterate over the states and transitions associated with a Dialog, or the transitions associated with a state. Also, add some unit tests to validate the behavior of the configuration parsing (including the functionality of these new methods).
Added: struts/shale/trunk/core-library/src/test/org/apache/shale/dialog/impl/ struts/shale/trunk/core-library/src/test/org/apache/shale/dialog/impl/ImplClassesTestCase.java Modified: struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/Dialog.java struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/State.java struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/impl/AbstractState.java struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/impl/DialogImpl.java Modified: struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/Dialog.java URL: http://svn.apache.org/viewcvs/struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/Dialog.java?rev=292297&r1=292296&r2=292297&view=diff ============================================================================== --- struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/Dialog.java (original) +++ struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/Dialog.java Wed Sep 28 13:57:01 2005 @@ -16,6 +16,8 @@ package org.apache.shale.dialog; +import java.util.Iterator; + /** * <p>Overall configuration of an individual dialog. During application * execution, this information is immutable (so that simultaneous execution @@ -56,6 +58,23 @@ * [EMAIL PROTECTED] Dialog}.</p> */ public String getStart(); + + + /** + * <p>Return an <code>Iterator</code> over the names of [EMAIL PROTECTED] State}s + * that are owned by this [EMAIL PROTECTED] Dialog}. If there are no such + * [EMAIL PROTECTED] State}s, an empty <code>Iterator</code> is returned.</p> + */ + public Iterator getStateIds(); + + + /** + * <p>Return an <code>Iterator</code> over the logical outcomes of + * global [EMAIL PROTECTED] Transition}s for this [EMAIL PROTECTED] Dialog}. If there are + * no such [EMAIL PROTECTED] Transition}s, an empty <code>Iterator</code> is + * returned.</p> + */ + public Iterator getTransitionOutcomes(); // ---------------------------------------------------------- Public Methods Modified: struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/State.java URL: http://svn.apache.org/viewcvs/struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/State.java?rev=292297&r1=292296&r2=292297&view=diff ============================================================================== --- struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/State.java (original) +++ struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/State.java Wed Sep 28 13:57:01 2005 @@ -16,6 +16,8 @@ package org.apache.shale.dialog; +import java.util.Iterator; + /** * <p>A [EMAIL PROTECTED] State} is an executable entity, within the scope of an * owning [EMAIL PROTECTED] Dialog}. Execution of a [EMAIL PROTECTED] State} returns a logical @@ -55,6 +57,15 @@ * among the [EMAIL PROTECTED] State}s owned by the same [EMAIL PROTECTED] Dialog}.</p> */ public String getName(); + + + /** + * <p>Return an <code>Iterator</code> over the logical outcomes of + * local [EMAIL PROTECTED] Transition}s for this [EMAIL PROTECTED] State}. If there are + * no such [EMAIL PROTECTED] Transition}s, an empty <code>Iterator</code> is + * returned.</p> + */ + public Iterator getTransitionOutcomes(); // ---------------------------------------------------------- Public Methods Modified: struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/impl/AbstractState.java URL: http://svn.apache.org/viewcvs/struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/impl/AbstractState.java?rev=292297&r1=292296&r2=292297&view=diff ============================================================================== --- struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/impl/AbstractState.java (original) +++ struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/impl/AbstractState.java Wed Sep 28 13:57:01 2005 @@ -17,6 +17,7 @@ package org.apache.shale.dialog.impl; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -87,6 +88,16 @@ public String getName() { return this.name; + + } + + + /** + * [EMAIL PROTECTED] + */ + public Iterator getTransitionOutcomes() { + + return this.transitions.keySet().iterator(); } Modified: struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/impl/DialogImpl.java URL: http://svn.apache.org/viewcvs/struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/impl/DialogImpl.java?rev=292297&r1=292296&r2=292297&view=diff ============================================================================== --- struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/impl/DialogImpl.java (original) +++ struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/impl/DialogImpl.java Wed Sep 28 13:57:01 2005 @@ -17,6 +17,7 @@ package org.apache.shale.dialog.impl; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -90,6 +91,31 @@ public String getStart() { return this.start; + + } + + + /** + * <p>Return an <code>Iterator</code> over the names of [EMAIL PROTECTED] State}s + * that are owned by this [EMAIL PROTECTED] Dialog}. If there are no such + * [EMAIL PROTECTED] State}s, an empty <code>Iterator</code> is returned.</p> + */ + public Iterator getStateIds() { + + return this.states.keySet().iterator(); + + } + + + /** + * <p>Return an <code>Iterator</code> over the logical outcomes of + * global [EMAIL PROTECTED] Transition}s for this [EMAIL PROTECTED] Dialog}. If there are + * no such [EMAIL PROTECTED] Transition}s, an empty <code>Iterator</code> is + * returned.</p> + */ + public Iterator getTransitionOutcomes() { + + return this.transitions.keySet().iterator(); } Added: struts/shale/trunk/core-library/src/test/org/apache/shale/dialog/impl/ImplClassesTestCase.java URL: http://svn.apache.org/viewcvs/struts/shale/trunk/core-library/src/test/org/apache/shale/dialog/impl/ImplClassesTestCase.java?rev=292297&view=auto ============================================================================== --- struts/shale/trunk/core-library/src/test/org/apache/shale/dialog/impl/ImplClassesTestCase.java (added) +++ struts/shale/trunk/core-library/src/test/org/apache/shale/dialog/impl/ImplClassesTestCase.java Wed Sep 28 13:57:01 2005 @@ -0,0 +1,294 @@ +/* + * Copyright 2004 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.shale.dialog.impl; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import junit.framework.TestCase; +import junit.framework.Test; +import junit.framework.TestSuite; +import org.apache.commons.chain.Command; +import org.apache.commons.chain.Context; +import org.apache.commons.chain.impl.ContextBase; +import org.apache.shale.dialog.ActionState; +import org.apache.shale.dialog.Dialog; +import org.apache.shale.dialog.EndState; +import org.apache.shale.dialog.Globals; +import org.apache.shale.dialog.State; +import org.apache.shale.dialog.config.ConfigurationInit; +import org.apache.shale.test.base.AbstractJsfTestCase; +import org.apache.shale.test.mock.MockNavigationHandler; +import org.apache.shale.test.mock.MockPropertyResolver; + +/** + * <p>Test case for implementation classes in package + * <code>org.apache.shale.dialog.impl</code>. Note that we are + * sharing a dialog configuration file with package + * <code>org.apache.shale.dialog.faces</code> as well.</p> + * + * $Id$ + */ + +public class ImplClassesTestCase extends AbstractJsfTestCase { + + + // ------------------------------------------------------------ Constructors + + + // Construct a new instance of this test case. + public ImplClassesTestCase(String name) { + super(name); + } + + + // ---------------------------------------------------- Overall Test Methods + + + // Set up instance variables required by this test case. + public void setUp() { + + super.setUp(); + + // Configure the test dialogs we will be using + servletContext.addInitParameter + (Globals.CONFIGURATION_PARAM, + "/org/apache/shale/dialog/faces/dialog-config.xml"); + Context context = new ContextBase(); + context.put("context", servletContext); + Command command = new ConfigurationInit(); + try { + command.execute(context); + } catch (Exception e) { + throw new RuntimeException(e); + } + dialogMap = (Map) externalContext.getApplicationMap().get(Globals.DIALOGS); + + } + + + // Return the tests included in this test case. + public static Test suite() { + + return (new TestSuite(ImplClassesTestCase.class)); + + } + + + // Tear down instance variables required by this test case. + public void tearDown() { + + dialogMap = null; + super.tearDown(); + + } + + + // ------------------------------------------------------ Instance Variables + + + // Map of configured Dialog instances for this test case, + // keyed by dialog id + Map dialogMap = null; + + + // ------------------------------------------------------------ Test Methods + + + // Test the contents of the "testExplicitTransitions" dialog + public void testExplicitTransitions() { + + Dialog dialog = (Dialog) dialogMap.get("testExplicitTransitions"); + assertNotNull(dialog); + assertTrue(dialog instanceof DialogImpl); + assertEquals("testExplicitTransitions", dialog.getName()); + assertEquals("first", dialog.getStart()); + checkItems("testExplicitTransitions states", + dialog.getStateIds(), + new String[] { "first", "previous", "next", "last", "finish" }); + checkItems("textExplicitTransitions transitions", + dialog.getTransitionOutcomes(), + new String[0]); + State state = null; + + state = dialog.findState("first"); + assertNotNull(state); + assertTrue(state instanceof ActionState); + assertEquals(dialog, state.getDialog()); + assertEquals("first", state.getName()); + checkItems("testExplicitTransitions.first transitions", + state.getTransitionOutcomes(), + new String[] { "first" }); + + state = dialog.findState("previous"); + assertNotNull(state); + assertTrue(state instanceof ActionState); + assertEquals(dialog, state.getDialog()); + assertEquals("previous", state.getName()); + checkItems("testExplicitTransitions.previous transitions", + state.getTransitionOutcomes(), + new String[] { "previous" }); + + state = dialog.findState("next"); + assertNotNull(state); + assertTrue(state instanceof ActionState); + assertEquals(dialog, state.getDialog()); + assertEquals("next", state.getName()); + checkItems("testExplicitTransitions.next transitions", + state.getTransitionOutcomes(), + new String[] { "next" }); + + state = dialog.findState("last"); + assertNotNull(state); + assertTrue(state instanceof ActionState); + assertEquals(dialog, state.getDialog()); + assertEquals("last", state.getName()); + checkItems("testExplicitTransitions.last transitions", + state.getTransitionOutcomes(), + new String[] { "last" }); + + state = dialog.findState("finish"); + assertNotNull(state); + assertTrue(state instanceof EndState); + assertEquals(dialog, state.getDialog()); + assertEquals("finish", state.getName()); + checkItems("testExplicitTransitions.finish transitions", + state.getTransitionOutcomes(), + new String[0]); + + } + + + // Test the contents of the "testImplicitTransitions" dialog + public void testImplicitTransitions() { + + Dialog dialog = (Dialog) dialogMap.get("testImplicitTransitions"); + assertNotNull(dialog); + assertTrue(dialog instanceof DialogImpl); + assertEquals("testImplicitTransitions", dialog.getName()); + assertEquals("first", dialog.getStart()); + checkItems("testImplicitTransitions states", + dialog.getStateIds(), + new String[] { "first", "previous", "next", "last", "finish" }); + checkItems("textImplicitTransitions transitions", + dialog.getTransitionOutcomes(), + new String[] { "first", "previous", "next", "last" }); + State state = null; + + state = dialog.findState("first"); + assertNotNull(state); + assertTrue(state instanceof ActionState); + assertEquals(dialog, state.getDialog()); + assertEquals("first", state.getName()); + checkItems("testImplicitTransitions.first transitions", + state.getTransitionOutcomes(), + new String[0]); + + state = dialog.findState("previous"); + assertNotNull(state); + assertTrue(state instanceof ActionState); + assertEquals(dialog, state.getDialog()); + assertEquals("previous", state.getName()); + checkItems("testImplicitTransitions.previous transitions", + state.getTransitionOutcomes(), + new String[0]); + + state = dialog.findState("next"); + assertNotNull(state); + assertTrue(state instanceof ActionState); + assertEquals(dialog, state.getDialog()); + assertEquals("next", state.getName()); + checkItems("testImplicitTransitions.next transitions", + state.getTransitionOutcomes(), + new String[0]); + + state = dialog.findState("last"); + assertNotNull(state); + assertTrue(state instanceof ActionState); + assertEquals(dialog, state.getDialog()); + assertEquals("last", state.getName()); + checkItems("testImplicitTransitions.last transitions", + state.getTransitionOutcomes(), + new String[0]); + + state = dialog.findState("finish"); + assertNotNull(state); + assertTrue(state instanceof EndState); + assertEquals(dialog, state.getDialog()); + assertEquals("finish", state.getName()); + checkItems("testImplicitTransitions.finish transitions", + state.getTransitionOutcomes(), + new String[0]); + + } + + + // Test that the configured Map contains exactly the expected dialogs + public void testPristine() { + + assertNotNull(dialogMap); + assertEquals(5, dialogMap.size()); + assertNotNull(dialogMap.get("testExplicitTransitions")); + assertNotNull(dialogMap.get("testImplicitTransitions")); + assertNotNull(dialogMap.get("testMixedTransitions")); + assertNotNull(dialogMap.get("testNestedSubdialog")); + assertNotNull(dialogMap.get("testViewStates")); + + } + + + // --------------------------------------------------------- Support Methods + + + // Check the contents of an iterator against the specified + // array of expected values. Order does not matter, but exactly + // matching content does matter + private void checkItems(String message, Iterator iterator, String expected[]) { + Set set = new HashSet(); + for (int i = 0; i < expected.length; i++) { + set.add(expected[i]); + } + while (iterator.hasNext()) { + String next = (String) iterator.next(); + assertTrue(message + ": value '" + next + "' is legal", set.contains(next)); + set.remove(next); + } + Iterator leftovers = set.iterator(); + while (leftovers.hasNext()) { + String leftover = (String) leftovers.next(); + fail(message + ": value '" + leftover + "' is missing"); + } + } + + + // Check the count of items returned by the specified Iterator + private void checkIterator(String message, Iterator iterator, int expected) { + int actual = 0; + while (iterator.hasNext()) { + iterator.next(); + actual++; + } + assertEquals(message, expected, actual); + } + + + +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]