View Javadoc

1   /*
2    * Copyright (c) 2003-2008, by Henrik Arro and Contributors
3    *
4    * This file is part of JSeq, a tool to automatically create
5    * sequence diagrams by tracing program execution.
6    *
7    * See <http://jseq.sourceforge.net> for more information.
8    *
9    * JSeq is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU Lesser General Public License as
11   * published by the Free Software Foundation, either version 3 of
12   * the License, or (at your option) any later version.
13   *
14   * JSeq is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17   * GNU Lesser General Public License for more details.
18   *
19   * You should have received a copy of the GNU Lesser General Public License
20   * along with JSeq. If not, see <http://www.gnu.org/licenses/>.
21   */
22  
23  package th.co.edge.jseq;
24  
25  import java.util.Collections;
26  import java.util.HashMap;
27  import java.util.LinkedList;
28  import java.util.List;
29  import java.util.Map;
30  
31  /**
32   * A <code>MockObjectMap</code> is a mapping from names to
33   * <code>MockObject</code>s, with utility methods to make it easy to
34   * translate from <code>Activation</code>s to <code>MockObject</code>s,
35   * with automatic handling of column numbers.
36   */
37  public class MockObjectMap {
38      private Map<String, MockObject> objectMap = new HashMap<String, MockObject>();
39      private int nextColumn = 0;
40  
41      /**
42       * Ensures that all <code>MockObject</code>s in another
43       * <code>MockObjectMap</code> is also in this map.
44       *
45       * @param otherObjectMap
46       *            the <code>MockObjectMap</code> whose <code>MockObject</code>s
47       *            to add to this map if necessary
48       */
49      public void add(MockObjectMap otherObjectMap) {
50          for (MockObject object : otherObjectMap.listView()) {
51              getInstance(object.getName());
52          }
53      }
54  
55      /**
56       * Returns a new <code>MockObjectMap</code> where the method calls
57       * represented by the given <code>Activation</code> and its nested
58       * activations have been added as <code>MockObject</code>s to this map,
59       * with the activation method call first, and the nested method calls in the
60       * order they were added to the activation.
61       *
62       * @param activation
63       *            the <code>Activation</code> whose method call and nested
64       *            method calls to add to this map
65       *
66       * @return a new <code>MockObjectMap</code> containing all method calls
67       *         from <code>activation</code>
68       */
69      public static MockObjectMap addAll(Activation activation) {
70          MockObjectMap objectMap = new MockObjectMap();
71          addAll(activation, objectMap);
72          return objectMap;
73      }
74  
75      private static void addAll(Activation activation, MockObjectMap objectMap) {
76          objectMap.getInstance(activation.getClassName());
77          for (Activation nestedActivation : activation.getNestedActivations()) {
78              addAll(nestedActivation, objectMap);
79          }
80      }
81  
82      /**
83       * Returns the <code>MockObject</code> associated with the given name. If
84       * there is none, a new <code>MockObject</code> is created, using the
85       * given name and the next available column number, and this object is added
86       * to the map.
87       *
88       * @param name
89       *            the name of the <code>MockObject</code> to look up
90       *
91       * @return the <code>MockObject</code> associated with <code>name</code>,
92       *         or a newly created <code>MockObject</code> (this method never
93       *         returns <code>null</code>
94       */
95      private MockObject getInstance(String name) {
96          MockObject object = objectMap.get(name);
97          if (object == null) {
98              object = new MockObject(name, nextColumn++);
99              objectMap.put(name, object);
100         }
101         return object;
102     }
103 
104     /**
105      * Returns the <code>MockObject</code> associated with the given name, or
106      * <code>null</code> if there is none.
107      *
108      * @param name
109      *            the name of the <code>MockObject</code> to look up
110      *
111      * @return the <code>MockObject</code> associated with <code>name</code>,
112      *         or <code>null</code> if there is none
113      */
114     public MockObject get(String name) {
115         return objectMap.get(name);
116     }
117 
118     /**
119      * Returns a list of all <code>MockObject</code>s in this map, ordered by
120      * column number (and name if the same column number occurs several times,
121      * which it normally should not do).
122      *
123      * @return a list of all <code>MockObject</code>s in this map
124      */
125     public List<MockObject> listView() {
126         List<MockObject> values = new LinkedList<MockObject>(objectMap.values());
127         Collections.sort(values);
128         return values;
129     }
130 
131     /**
132      * Returns a string representation of this <code>MockObjectMap</code>,
133      * mainly useful for logging.
134      *
135      * @return a string representation of this <code>MockObjectMap</code>
136      */
137     @Override
138     public String toString() {
139         return listView().toString();
140     }
141 }