1 package com.sourceforge.jpatterns.core;
2
3 import com.sourceforge.jpatterns.core.configuration.IPropertiesManager;
4 import com.sourceforge.jpatterns.core.configuration.PropertiesBasedFactory;
5 import com.sourceforge.jpatterns.core.configuration.exceptions.JPInitializationException;
6 import com.zmicer.utils.InputArgumentUtils;
7 import com.zmicer.utils.LoggingUtils;
8 import org.apache.log4j.Logger;
9
10 import java.io.Serializable;
11 import java.util.HashMap;
12 import java.util.Map;
13
14
15
16
17
18
19
20
21
22 public final class JPEngineFactory implements Serializable
23 {
24
25
26
27
28 final public static Logger LOG = Logger.getLogger(JPEngineFactory.class);
29
30
31
32
33 private static JPEngineFactory INSTANCE = null;
34
35
36
37
38
39
40 private Map<JPConstants.EngineConfigCaregory, IJPEngine> m_engines = new HashMap<JPConstants.EngineConfigCaregory, IJPEngine>();
41
42
43
44
45
46
47
48 private JPEngineFactory()
49 {
50 super();
51
52 init();
53 }
54
55
56
57
58 public void init()
59 {
60 final IJPEngine engine1 = instantiateEngine();
61 engine1.init(JPConstants.EngineConfigCaregory.CONSUMER);
62 m_engines.put(JPConstants.EngineConfigCaregory.CONSUMER, engine1);
63
64 final IJPEngine engine2 = instantiateEngine();
65 engine2.init(JPConstants.EngineConfigCaregory.FRAMEWORK);
66 m_engines.put(JPConstants.EngineConfigCaregory.FRAMEWORK, engine2);
67 }
68
69
70
71
72 protected IJPEngine instantiateEngine()
73 {
74 final IPropertiesManager propsManager = PropertiesBasedFactory.getInstance().getPropertiesManager();
75 if (null == propsManager)
76 {
77 throw new JPInitializationException("IPropertiesManager can not be null.");
78 }
79 final Object objectEngine = propsManager.getBundledObject(IJPEngine.class);
80 if (null == objectEngine)
81 {
82 throw new JPInitializationException("Can not instantiate the IJPEngine implementation.");
83 }
84 if (!(objectEngine instanceof IJPEngine))
85 {
86 throw new JPInitializationException("Incorrect implemetation of the IJPEngine interface is set at the framework properties.");
87 }
88 return (IJPEngine) objectEngine;
89 }
90
91
92
93
94 public synchronized static JPEngineFactory getInstance()
95 {
96 if (null != INSTANCE)
97 {
98 return INSTANCE;
99 }
100 try
101 {
102 INSTANCE = new JPEngineFactory();
103 return INSTANCE;
104 }
105 catch (Throwable ex)
106 {
107 LoggingUtils.logException(LOG, ex, null, JPEngineFactory.class);
108 throw new JPInitializationException("Cannot instantiate JPEngineFactory: " +ex.getMessage());
109 }
110 }
111
112
113
114
115
116
117
118
119 public static IJPEngine getJPEngine(JPConstants.EngineConfigCaregory category)
120 {
121 InputArgumentUtils.checkObjects(category);
122 if (null == getInstance().m_engines.get(category))
123 {
124 logAndThrow("Can not obtain the IJPEngine of the category [" + category.toString() + "]");
125 }
126 return getInstance().m_engines.get(category);
127 }
128
129
130
131
132
133
134
135
136 protected static void logAndThrow(final String message) throws JPInitializationException
137 {
138 InputArgumentUtils.checkStrings(true, message);
139 LoggingUtils.error(LOG, JPEngineFactory.class, message);
140 throw new JPInitializationException(message);
141 }
142 }