1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 package com.gargoylesoftware.base.objectstore;
39
40 import java.util.Collections;
41 import java.util.Map;
42
43 /***
44 * An object store that just dispatches commands to other object stores
45 *
46 * @version $Revision: 1.6 $
47 * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
48 */
49 public class DispatchingObjectStore extends ObjectStore {
50
51 private final Map dispatchMap_;
52 private final Map resourceFactoryMap_;
53
54
55 /***
56 * Create an instance. If you use this constructor then you must
57 * override findStoreClass() since the dispatchMap has not been populated
58 *
59 * @param nameToResourceFactoryMap keys are names, values are the
60 * resource factory objects that are represented by the name. This map
61 * will be passed into any newly created ObjectStore's via the method
62 * setResourceFactoryMap()
63 */
64 protected DispatchingObjectStore(final Map nameToResourceFactoryMap) {
65 dispatchMap_ = Collections.EMPTY_MAP;
66 resourceFactoryMap_ = nameToResourceFactoryMap;
67 }
68
69 /***
70 * Create an instance
71 * @param commandToStoreMap A map containing command to store mappings. Keys
72 * and values must be class objects.
73 * @param nameToResourceFactoryMap keys are names, values are the
74 * resource factory objects that are represented by the name. This map
75 * will be passed into any newly created ObjectStore's via the method
76 * setResourceFactoryMap()
77 */
78 public DispatchingObjectStore( final Map commandToStoreMap,
79 final Map nameToResourceFactoryMap ) {
80 assertNotNull("commandToStoreMap", commandToStoreMap);
81 assertNotNull("nameToResourceFactoryMap", nameToResourceFactoryMap);
82
83 dispatchMap_ = commandToStoreMap;
84 resourceFactoryMap_ = nameToResourceFactoryMap;
85 }
86
87
88 /***
89 * Perform the dispatching.
90 *
91 * @param command The command to dispatch
92 * @return The result of the command after the other store has processed it
93 */
94 protected Object executeImpl(
95 final ObjectStoreCommand command ) {
96
97 return findStore(command).execute(command);
98 }
99
100
101 /***
102 * Find the ObjectStore for the specified command
103 *
104 * @param command The command for which we are finding the store
105 * @return The object store
106 * @throws ObjectStoreCommandNotSupportedException If we cannot find a
107 * store for the specified command
108 * @throws ObjectStoreException if an error occurs when finding or
109 * creating an object store
110 */
111 protected ObjectStore findStore(
112 final ObjectStoreCommand command )
113 throws
114 ObjectStoreCommandNotSupportedException,
115 ObjectStoreException {
116
117 final Class storeClass = (Class)dispatchMap_.get(command.getClass());
118 if( storeClass == null ) {
119 throw new ObjectStoreCommandNotSupportedException(command);
120 }
121
122 try {
123 final ObjectStore store = (ObjectStore)storeClass.newInstance();
124 store.setResourceFactoryMap(resourceFactoryMap_);
125 return store;
126 }
127 catch( IllegalAccessException e ) {
128 throw new ObjectStoreException(e);
129 }
130 catch( final InstantiationException e ) {
131 throw new ObjectStoreException(e);
132 }
133 }
134 }