001    package com.hammurapi.eventbus.local;
002    
003    import java.io.File;
004    import java.io.FileWriter;
005    import java.io.Writer;
006    import java.util.HashMap;
007    import java.util.Map;
008    
009    import org.onemind.jxp.JxpContext;
010    import org.onemind.jxp.JxpPageSource;
011    import org.onemind.jxp.JxpProcessor;
012    import org.onemind.jxp.ResourceStreamPageSource;
013    
014    import com.hammurapi.eventbus.EventBusException;
015    
016    /**
017     * This class generates domain-specific implementations of 
018     * event store and event bus.
019     * @author Pavel Vlasov
020     *
021     */
022    public class DomainGenerator {
023            
024            private String packageName;
025            private String domain;
026            private String eventType;
027            private String priorityType;
028            private String contextType;
029            private File outputDir;
030    
031            public String getPackageName() {
032                    return packageName;
033            }
034    
035            public void setPackageName(String packageName) {
036                    this.packageName = packageName;
037            }
038    
039            public String getDomain() {
040                    return domain;
041            }
042    
043            public void setDomain(String domain) {
044                    this.domain = domain;
045            }
046    
047            public String getEventType() {
048                    return eventType;
049            }
050    
051            public void setEventType(String eventType) {
052                    this.eventType = eventType;
053            }
054    
055            public String getPriorityType() {
056                    return priorityType;
057            }
058    
059            public void setPriorityType(String priorityType) {
060                    this.priorityType = priorityType;
061            }
062    
063            public String getContextType() {
064                    return contextType;
065            }
066    
067            public void setContextType(String contextType) {
068                    this.contextType = contextType;
069            }
070    
071            public File getOutputDir() {
072                    return outputDir;
073            }
074    
075            public void setOutputDir(File outputDir) {
076                    this.outputDir = outputDir;
077            }
078            
079            public void generate() {
080                    Map<String, String> environment = new HashMap<String,String>();
081                    environment.put("package", packageName);
082                    environment.put("domain", domain);
083                    environment.put("E", eventType);
084                    environment.put("P", priorityType);
085                    environment.put("C", contextType);
086                    
087                    try {
088                            String prefix = getClass().getPackage().getName().replace('.', '/');
089                            JxpPageSource pageSource = new ResourceStreamPageSource("/"+prefix);            
090                            JxpContext context = new JxpContext(pageSource);
091                            JxpProcessor processor = new JxpProcessor(context);
092                            
093                            File packageDir = new File(outputDir, packageName.replace('.', File.separatorChar));
094                            packageDir.mkdirs();
095                                                    
096                            renderEventStore(processor, environment, packageDir);
097                            renderEventStoreImpl(processor, environment, packageDir);
098                            renderEventStorePredicate(processor, environment, packageDir);
099                            renderEventStoreAbstractPredicate(processor, environment, packageDir);
100                            renderEventStoreExtractor(processor, environment, packageDir);
101                            renderEventStoreAbstractExtractor(processor, environment, packageDir);
102                            renderEventBus(processor, environment, packageDir);
103                            renderIntrospector(processor, environment, packageDir);
104                            renderDispatchNetworkSnapshot(processor, environment, packageDir);
105                            renderDispatchContext(processor, environment, packageDir);
106                            renderDispatchJoinContext(processor, environment, packageDir);
107                            
108                    } catch (Exception e) {
109                            throw new EventBusException(e);
110                    }
111            }
112    
113            private void renderEventStore(
114                            JxpProcessor processor,
115                            Map<String, String> environment, 
116                            File packageDir) throws Exception {
117                    File outputFile = new File(packageDir, domain+"EventStore.java");                       
118                    Writer writer = new FileWriter(outputFile);
119                    try {
120                            processor.process("DomainSpecificEventStore.jxp", writer, environment);
121                    } finally {
122                            writer.close();
123                    }
124            }
125    
126            private void renderEventStorePredicate(
127                            JxpProcessor processor,
128                            Map<String, String> environment, 
129                            File packageDir) throws Exception {
130                    File outputFile = new File(packageDir, domain+"EventStorePredicate.java");                      
131                    Writer writer = new FileWriter(outputFile);
132                    try {
133                            processor.process("DomainSpecificEventStorePredicate.jxp", writer, environment);
134                    } finally {
135                            writer.close();
136                    }
137            }
138    
139            private void renderEventStoreAbstractPredicate(
140                            JxpProcessor processor,
141                            Map<String, String> environment, 
142                            File packageDir) throws Exception {
143                    File outputFile = new File(packageDir, domain+"EventStoreAbstractPredicate.java");                      
144                    Writer writer = new FileWriter(outputFile);
145                    try {
146                            processor.process("DomainSpecificEventStoreAbstractPredicate.jxp", writer, environment);
147                    } finally {
148                            writer.close();
149                    }
150            }
151    
152            private void renderEventStoreExtractor(
153                            JxpProcessor processor,
154                            Map<String, String> environment, 
155                            File packageDir) throws Exception {
156                    File outputFile = new File(packageDir, domain+"EventStoreExtractor.java");                      
157                    Writer writer = new FileWriter(outputFile);
158                    try {
159                            processor.process("DomainSpecificEventStoreExtractor.jxp", writer, environment);
160                    } finally {
161                            writer.close();
162                    }
163            }
164    
165            private void renderEventStoreAbstractExtractor(
166                            JxpProcessor processor,
167                            Map<String, String> environment, 
168                            File packageDir) throws Exception {
169                    File outputFile = new File(packageDir, domain+"EventStoreAbstractExtractor.java");                      
170                    Writer writer = new FileWriter(outputFile);
171                    try {
172                            processor.process("DomainSpecificEventStoreAbstractExtractor.jxp", writer, environment);
173                    } finally {
174                            writer.close();
175                    }
176            }
177    
178            private void renderEventStoreImpl(
179                            JxpProcessor processor,
180                            Map<String, String> environment, 
181                            File packageDir) throws Exception {
182                    File outputFile = new File(packageDir, domain+"EventStoreImpl.java");                   
183                    Writer writer = new FileWriter(outputFile);
184                    try {
185                            processor.process("DomainSpecificEventStoreImpl.jxp", writer, environment);
186                    } finally {
187                            writer.close();
188                    }
189            }
190    
191            private void renderEventBus(
192                            JxpProcessor processor,
193                            Map<String, String> environment, 
194                            File packageDir) throws Exception {
195                    File outputFile = new File(packageDir, domain+"EventBus.java");                 
196                    Writer writer = new FileWriter(outputFile);
197                    try {
198                            processor.process("DomainSpecificEventBus.jxp", writer, environment);
199                    } finally {
200                            writer.close();
201                    }
202            }
203            
204            private void renderIntrospector(
205                            JxpProcessor processor,
206                            Map<String, String> environment, 
207                            File packageDir) throws Exception {
208                    File outputFile = new File(packageDir, domain+"Introspector.java");                     
209                    Writer writer = new FileWriter(outputFile);
210                    try {
211                            processor.process("DomainSpecificIntrospector.jxp", writer, environment);
212                    } finally {
213                            writer.close();
214                    }
215            }
216            
217            private void renderDispatchNetworkSnapshot(
218                            JxpProcessor processor,
219                            Map<String, String> environment, 
220                            File packageDir) throws Exception {
221                    File outputFile = new File(packageDir, domain+"DispatchNetworkDotSnapshot.java");                       
222                    Writer writer = new FileWriter(outputFile);
223                    try {
224                            processor.process("DomainSpecificDispatchNetworkDotSnapshot.jxp", writer, environment);
225                    } finally {
226                            writer.close();
227                    }
228            }
229            
230            private void renderDispatchContext(
231                            JxpProcessor processor,
232                            Map<String, String> environment, 
233                            File packageDir) throws Exception {
234                    File outputFile = new File(packageDir, domain+"EventDispatchContext.java");                     
235                    Writer writer = new FileWriter(outputFile);
236                    try {
237                            processor.process("DomainSpecificEventDispatchContext.jxp", writer, environment);
238                    } finally {
239                            writer.close();
240                    }
241            }
242            
243            private void renderDispatchJoinContext(
244                            JxpProcessor processor,
245                            Map<String, String> environment, 
246                            File packageDir) throws Exception {
247                    File outputFile = new File(packageDir, domain+"EventDispatchJoinContext.java");                 
248                    Writer writer = new FileWriter(outputFile);
249                    try {
250                            processor.process("DomainSpecificEventDispatchJoinContext.jxp", writer, environment);
251                    } finally {
252                            writer.close();
253                    }
254            }
255            
256            /**
257             * @param args
258             */
259            public static void main(String[] args) {
260                    System.out.println("Parameters: <output dir> <package name> <domain> <event type> <priority type> <context type>");
261                    DomainGenerator generator = new DomainGenerator();
262                    generator.setOutputDir(new File(args[0]));
263                    generator.setPackageName(args[1]);
264                    generator.setDomain(args[2]);
265                    generator.setEventType(args[3]);
266                    generator.setPriorityType(args[4]);
267                    generator.setContextType(args[5]);
268                    generator.generate();
269            }
270    
271    }