001    package com.mockrunner.mock.web;
002    
003    import java.util.HashMap;
004    import java.util.Iterator;
005    import java.util.Map;
006    
007    import org.apache.struts.action.ActionForward;
008    import org.apache.struts.action.ActionMapping;
009    
010    /**
011     * Mock implementation of <code>ActionMapping</code>.
012     */
013    public class MockActionMapping extends ActionMapping
014    {
015        private Map forwards;
016    
017        public MockActionMapping()
018        {
019            super();
020            forwards = new HashMap();
021        }
022        
023        /**
024         * Clears all specified forwards.
025         */
026        public void clearForwards()
027        {
028            forwards.clear();
029        }
030        
031        /**
032         * Always return a valid <code>ActionForward</code>
033         * since we do not care if it exists in the
034         * struts-config. If an <code>ActionForward</code>
035         * was defined using {@link #addForward},
036         * this <code>ActionForward</code> will be returned.
037         * Otherwise a new <code>ActionForward</code>
038         * (with equal name and path) will be returned.
039         * @param name the name
040         * @return the corresponding <code>ActionForward</code>
041         */
042        public ActionForward findForward(String name)
043        {
044            Iterator iterator = forwards.keySet().iterator();
045            while(iterator.hasNext())
046            { 
047                String key = (String)iterator.next();
048                if(key.equals(name))
049                {
050                    return (ActionForward)forwards.get(key);
051                }
052            }
053            return new MockActionForward(name, name, false); 
054        }
055        
056        /**
057         * Adds an <code>ActionForward</code>
058         * with the specified name and path.
059         * @param forwardName the name of the forward
060         * @param forwardPath the path of the forward
061         */
062        public void addForward(String forwardName, String forwardPath) 
063        { 
064            ActionForward forward = new MockActionForward(forwardName, forwardPath, false); 
065            forwards.put(forwardName, forward); 
066        } 
067        
068        /**
069         * Sets multiple <code>ActionForward</code> objects
070         * with equal name and path.
071         * @param forwardNames the forward names
072         */
073        public void setupForwards(String[] forwardNames)
074        {
075            if(null == forwardNames) return; 
076            for(int ii = 0; ii < forwardNames.length; ii++) 
077            { 
078                String name = forwardNames[ii];
079                ActionForward forward = new MockActionForward(name, name, false); 
080                forwards.put(name, forward);
081            }
082        }
083    
084        /**
085         * Returns all forward names (set using {@link #addForward}
086         * or {@link #setupForwards}).
087         * @return the forward names
088         */
089        public String[] findForwards()
090        {
091            return (String[])forwards.keySet().toArray(new String[forwards.size()]);
092        }
093        
094        /**
095         * Always return a valid <code>ActionForward</code>.
096         * The input parameter of this mapping will be used
097         * as the name and path for the <code>ActionForward</code>.
098         */
099        public ActionForward getInputForward()
100        {
101            return new MockActionForward(getInput(), getInput(), false);
102        }
103    }