2 * Copyright (C) 2001, 2002 The Mir-coders group
4 * This file is part of Mir.
6 * Mir is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * Mir is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with Mir; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * In addition, as a special exception, The Mir-coders gives permission to link
21 * the code of this program with the com.oreilly.servlet library, any library
22 * licensed under the Apache Software License, The Sun (tm) Java Advanced
23 * Imaging library (JAI), The Sun JIMI library (or with modified versions of
24 * the above that use the same license as the above), and distribute linked
25 * combinations including the two. You must obey the GNU General Public
26 * License in all respects for all of the code used other than the above
27 * mentioned libraries. If you modify this file, you may extend this exception
28 * to your version of the file, but you are not obligated to do so. If you do
29 * not wish to do so, delete this exception statement from your version.
32 package mir.producer.reader;
34 import java.util.Arrays;
35 import java.util.HashMap;
36 import java.util.HashSet;
37 import java.util.Iterator;
41 import mir.entity.adapter.EntityAdapterModel;
42 import mir.generator.Generator;
43 import mir.generator.WriterEngine;
44 import mir.log.LoggerWrapper;
45 import mir.producer.ConditionalProducerNode;
46 import mir.producer.DirCopyingProducerNode;
47 import mir.producer.EntityBatchingProducerNode;
48 import mir.producer.EntityEnumeratingProducerNode;
49 import mir.producer.EntityListProducerNode;
50 import mir.producer.EvaluatedAssignmentProducerNode;
51 import mir.producer.ExpandedAssignmentProducerNode;
52 import mir.producer.FileDateSettingProducerNode;
53 import mir.producer.FileDeletingProducerNode;
54 import mir.producer.GeneratingProducerNode;
55 import mir.producer.LoggingProducerNode;
56 import mir.producer.LoopProducerNode;
57 import mir.producer.ProducerNode;
58 import mir.producer.ResourceBundleProducerNode;
59 import mir.producer.ScriptCallingProducerNode;
62 public class DefaultProducerNodeBuilders {
64 public static void registerBuilders(ProducerNodeBuilderLibrary aBuilderLibrary,
65 EntityAdapterModel aModel, Generator.GeneratorLibrary aGeneratorLibrary,
66 WriterEngine aWriterEngine, String aSourceBasePath, String aDestinationBasePath) throws ProducerConfigExc {
68 aBuilderLibrary.registerBuilder("Set", EvaluatedAssignmentProducerNodeBuilder.class);
69 aBuilderLibrary.registerBuilder("Define", ExpandedAssignmentProducerNodeBuilder.class);
70 aBuilderLibrary.registerBuilder("Log", LoggingProducerNodeBuilder.class);
71 aBuilderLibrary.registerBuilder("Execute", ScriptCallingProducerNodeBuilder.class);
72 aBuilderLibrary.registerBuilder("Resource", ResourceBundleProducerNodeBuilder.class);
73 aBuilderLibrary.registerFactory("CopyDir", new DirCopyProducerNodeBuilder.factory( aSourceBasePath, aDestinationBasePath));
75 aBuilderLibrary.registerBuilder("DeleteFile", FileDeletingProducerNodeBuilder.class);
76 aBuilderLibrary.registerBuilder("SetFileDate", FileDateSettingProducerNodeBuilder.class);
77 aBuilderLibrary.registerBuilder("If", ConditionalProducerNodeBuilder.class);
78 aBuilderLibrary.registerBuilder("While", LoopProducerNodeBuilder.class);
80 aBuilderLibrary.registerFactory("Enumerate", new EnumeratingProducerNodeBuilder.factory(aModel));
81 aBuilderLibrary.registerFactory("List", new ListProducerNodeBuilder.factory(aModel));
82 aBuilderLibrary.registerFactory("Batch", new BatchingProducerNodeBuilder.factory(aModel));
84 aBuilderLibrary.registerFactory("Generate",
85 new GeneratingProducerNodeBuilder.factory(aGeneratorLibrary, aWriterEngine));
88 public static abstract class AbstractProducerNodeBuilder implements ProducerNodeBuilder {
89 private Map attributes;
91 private Set availableSubnodes;
93 public AbstractProducerNodeBuilder(String anAvailableSubNodes[]) {
94 attributes = new HashMap();
95 subNodes = new HashMap();
96 availableSubnodes = new HashSet(Arrays.asList(anAvailableSubNodes));
99 protected ProducerNode getSubNode(String aName) {
100 return (ProducerNode) subNodes.get(aName);
103 public void setSubNode(String aName, ProducerNode aNode) {
104 subNodes.put(aName, aNode);
107 public Set getAvailableSubNodes() {
108 return availableSubnodes;
112 ////////////////////////////////////////////////////////////////////////////////
114 // general attribute names, specifc builders reference these, to keep attribute
117 public final static String SELECTION_ATTRIBUTE = "selection";
118 public final static String ORDER_ATTRIBUTE = "order";
119 public final static String DEFINITION_ATTRIBUTE = "table";
120 public final static String SKIP_ATTRIBUTE = "skip";
121 public final static String KEY_ATTRIBUTE = "key";
122 public final static String LIMIT_ATTRIBUTE = "limit";
124 ////////////////////////////////////////////////////////////////////////////////
126 private final static String ASSIGNMENT_KEY_ATTRIBUTE = KEY_ATTRIBUTE;
127 private final static String ASSIGNMENT_VALUE_ATTRIBUTE = "value";
128 private final static String[] ASSIGNMENT_REQUIRED_ATTRIBUTES = { ASSIGNMENT_KEY_ATTRIBUTE, ASSIGNMENT_VALUE_ATTRIBUTE };
129 private final static String[] ASSIGNMENT_OPTIONAL_ATTRIBUTES = {};
130 private final static String[] ASSIGNMENT_SUBNODES = {};
132 public static class ExpandedAssignmentProducerNodeBuilder extends AbstractProducerNodeBuilder {
135 private String value;
137 public ExpandedAssignmentProducerNodeBuilder() {
138 super(ASSIGNMENT_SUBNODES);
141 public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc {
142 XMLReaderTool.checkAttributes(anAttributes, ASSIGNMENT_REQUIRED_ATTRIBUTES, ASSIGNMENT_OPTIONAL_ATTRIBUTES);
144 key = (String) anAttributes.get(ASSIGNMENT_KEY_ATTRIBUTE);
145 value = (String) anAttributes.get(ASSIGNMENT_VALUE_ATTRIBUTE);
148 public ProducerNode constructNode() {
149 return new ExpandedAssignmentProducerNode(key, value);
153 ////////////////////////////////////////////////////////////////////////////////
155 public static class EvaluatedAssignmentProducerNodeBuilder extends AbstractProducerNodeBuilder {
158 private String value;
160 public EvaluatedAssignmentProducerNodeBuilder() {
161 super(ASSIGNMENT_SUBNODES);
164 public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc {
165 XMLReaderTool.checkAttributes(anAttributes, ASSIGNMENT_REQUIRED_ATTRIBUTES, ASSIGNMENT_OPTIONAL_ATTRIBUTES);
167 key = (String) anAttributes.get(ASSIGNMENT_KEY_ATTRIBUTE);
168 value = (String) anAttributes.get(ASSIGNMENT_VALUE_ATTRIBUTE);
171 public ProducerNode constructNode() {
172 return new EvaluatedAssignmentProducerNode(key, value);
176 ////////////////////////////////////////////////////////////////////////////////
178 public static class EnumeratingProducerNodeBuilder extends AbstractProducerNodeBuilder {
179 private final static String ENUMERATION_KEY_ATTRIBUTE = KEY_ATTRIBUTE;
180 private final static String ENUMERATION_DEFINITION_ATTRIBUTE = DEFINITION_ATTRIBUTE;
181 private final static String ENUMERATION_SELECTION_ATTRIBUTE = SELECTION_ATTRIBUTE;
182 private final static String ENUMERATION_ORDER_ATTRIBUTE = ORDER_ATTRIBUTE;
183 private final static String ENUMERATION_DEFAULT_SUBNODE = "default";
184 private final static String ENUMERATION_LIMIT_ATTRIBUTE = LIMIT_ATTRIBUTE;
185 private final static String ENUMERATION_SKIP_ATTRIBUTE = SKIP_ATTRIBUTE;
186 private final static String[] ENUMERATION_REQUIRED_ATTRIBUTES = { ENUMERATION_KEY_ATTRIBUTE, ENUMERATION_DEFINITION_ATTRIBUTE };
187 private final static String[] ENUMERATION_OPTIONAL_ATTRIBUTES = { ENUMERATION_SELECTION_ATTRIBUTE, ENUMERATION_ORDER_ATTRIBUTE, ENUMERATION_LIMIT_ATTRIBUTE, ENUMERATION_SKIP_ATTRIBUTE};
188 private final static String[] ENUMERATION_SUBNODES = {ENUMERATION_DEFAULT_SUBNODE};
191 private String definition;
192 private String selection;
193 private String order;
194 private String limit;
196 private EntityAdapterModel model;
198 public EnumeratingProducerNodeBuilder(EntityAdapterModel aModel) {
199 super(ENUMERATION_SUBNODES);
204 public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc {
205 XMLReaderTool.checkAttributes(anAttributes, ENUMERATION_REQUIRED_ATTRIBUTES, ENUMERATION_OPTIONAL_ATTRIBUTES);
207 key = (String) anAttributes.get(ENUMERATION_KEY_ATTRIBUTE);
208 definition = (String) anAttributes.get(ENUMERATION_DEFINITION_ATTRIBUTE);
209 selection = (String) XMLReaderTool.getStringAttributeWithDefault(anAttributes, ENUMERATION_SELECTION_ATTRIBUTE, "");
210 order = (String) XMLReaderTool.getStringAttributeWithDefault(anAttributes, ENUMERATION_ORDER_ATTRIBUTE, "");
211 limit = (String) anAttributes.get(ENUMERATION_LIMIT_ATTRIBUTE);
212 skip = (String) anAttributes.get(ENUMERATION_SKIP_ATTRIBUTE);
215 public ProducerNode constructNode() {
216 return new EntityEnumeratingProducerNode(key, model, definition, selection, order, limit, skip, getSubNode(ENUMERATION_DEFAULT_SUBNODE ));
219 public static class factory implements ProducerNodeBuilderFactory {
220 private EntityAdapterModel model;
222 public factory(EntityAdapterModel aModel) {
226 public ProducerNodeBuilder makeBuilder() {
227 return new EnumeratingProducerNodeBuilder(model);
232 ////////////////////////////////////////////////////////////////////////////////
234 public static class LoopProducerNodeBuilder extends AbstractProducerNodeBuilder {
235 private final static String LOOP_CONDITION_ATTRIBUTE = "condition";
236 private final static String LOOP_LIMIT_ATTRIBUTE = LIMIT_ATTRIBUTE;
237 private final static String LOOP_DEFAULT_SUBNODE = "default";
238 private final static String[] LOOP_REQUIRED_ATTRIBUTES = { LOOP_CONDITION_ATTRIBUTE };
239 private final static String[] LOOP_OPTIONAL_ATTRIBUTES = { LOOP_LIMIT_ATTRIBUTE };
240 private final static String[] LOOP_SUBNODES = {LOOP_DEFAULT_SUBNODE};
242 private String condition;
243 private String limit;
245 public LoopProducerNodeBuilder() {
246 super(LOOP_SUBNODES);
249 public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc {
250 XMLReaderTool.checkAttributes(anAttributes, LOOP_REQUIRED_ATTRIBUTES, LOOP_OPTIONAL_ATTRIBUTES);
252 condition = (String) anAttributes.get(LOOP_CONDITION_ATTRIBUTE);
253 limit = (String) XMLReaderTool.getStringAttributeWithDefault(anAttributes, LOOP_LIMIT_ATTRIBUTE, "");
256 public ProducerNode constructNode() {
257 return new LoopProducerNode(condition, limit, getSubNode( LOOP_DEFAULT_SUBNODE ));
261 ////////////////////////////////////////////////////////////////////////////////
263 public static class ListProducerNodeBuilder extends AbstractProducerNodeBuilder {
264 private final static String LIST_KEY_ATTRIBUTE = KEY_ATTRIBUTE;
265 private final static String LIST_DEFINITION_ATTRIBUTE = DEFINITION_ATTRIBUTE;
266 private final static String LIST_SELECTION_ATTRIBUTE = SELECTION_ATTRIBUTE;
267 private final static String LIST_ORDER_ATTRIBUTE = ORDER_ATTRIBUTE;
268 private final static String LIST_DEFAULT_SUBNODE = "default";
269 private final static String LIST_LIMIT_ATTRIBUTE = LIMIT_ATTRIBUTE;
270 private final static String LIST_SKIP_ATTRIBUTE = SKIP_ATTRIBUTE;
271 private final static String[] LIST_REQUIRED_ATTRIBUTES = { LIST_KEY_ATTRIBUTE, LIST_DEFINITION_ATTRIBUTE };
272 private final static String[] LIST_OPTIONAL_ATTRIBUTES = { LIST_SELECTION_ATTRIBUTE, LIST_ORDER_ATTRIBUTE, LIST_SKIP_ATTRIBUTE, LIST_LIMIT_ATTRIBUTE};
273 private final static String[] LIST_SUBNODES = {};
276 private String definition;
277 private String selection;
278 private String order;
279 private String limit;
281 private EntityAdapterModel model;
283 public ListProducerNodeBuilder(EntityAdapterModel aModel) {
284 super(LIST_SUBNODES);
289 public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc {
290 XMLReaderTool.checkAttributes(anAttributes, LIST_REQUIRED_ATTRIBUTES, LIST_OPTIONAL_ATTRIBUTES);
292 key = (String) anAttributes.get(LIST_KEY_ATTRIBUTE);
293 definition = (String) anAttributes.get(LIST_DEFINITION_ATTRIBUTE);
294 selection = (String) XMLReaderTool.getStringAttributeWithDefault(anAttributes, LIST_SELECTION_ATTRIBUTE, "");
295 order = (String) XMLReaderTool.getStringAttributeWithDefault(anAttributes, LIST_ORDER_ATTRIBUTE, "");
296 limit = (String) anAttributes.get(LIST_LIMIT_ATTRIBUTE);
297 skip = (String) anAttributes.get(LIST_SKIP_ATTRIBUTE);
300 public ProducerNode constructNode() {
301 return new EntityListProducerNode(key, model, definition, selection, order, limit, skip, null );
304 public static class factory implements ProducerNodeBuilderFactory {
305 private EntityAdapterModel model;
307 public factory(EntityAdapterModel aModel) {
311 public ProducerNodeBuilder makeBuilder() {
312 return new ListProducerNodeBuilder(model);
317 ////////////////////////////////////////////////////////////////////////////////
319 public static class LoggingProducerNodeBuilder extends AbstractProducerNodeBuilder {
320 private final static String LOG_MESSAGE_ATTRIBUTE = "message";
321 private final static String LOG_TYPE_ATTRIBUTE = "type";
322 private final static String[] LOG_REQUIRED_ATTRIBUTES = { LOG_MESSAGE_ATTRIBUTE };
323 private final static String[] LOG_OPTIONAL_ATTRIBUTES = { LOG_TYPE_ATTRIBUTE };
324 private final static String[] LOG_SUBNODES = {};
326 private String message;
327 private int type = LoggerWrapper.INFO_MESSAGE;
329 public LoggingProducerNodeBuilder() {
333 public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc {
336 XMLReaderTool.checkAttributes(anAttributes, LOG_REQUIRED_ATTRIBUTES, LOG_OPTIONAL_ATTRIBUTES);
338 message = (String) anAttributes.get(LOG_MESSAGE_ATTRIBUTE);
339 if (anAttributes.containsKey(LOG_TYPE_ATTRIBUTE)) {
340 typeString = ((String) anAttributes.get( LOG_TYPE_ATTRIBUTE ));
342 if (typeString.toLowerCase().equals("debug"))
343 type = LoggerWrapper.DEBUG_MESSAGE;
344 else if (typeString.toLowerCase().equals("info"))
345 type = LoggerWrapper.INFO_MESSAGE;
346 else if (typeString.toLowerCase().equals("error"))
347 type = LoggerWrapper.ERROR_MESSAGE;
348 else if (typeString.toLowerCase().equals("warning"))
349 type = LoggerWrapper.WARN_MESSAGE;
350 else if (typeString.toLowerCase().equals("fatal"))
351 type = LoggerWrapper.FATAL_MESSAGE;
353 throw new ProducerConfigExc("unknown log type: " + typeString + " (allowed are debug, info, warning, error, fatal)");
356 type = LoggerWrapper.INFO_MESSAGE;
359 public ProducerNode constructNode() {
360 return new LoggingProducerNode(message, type);
364 ////////////////////////////////////////////////////////////////////////////////
366 public static class ResourceBundleProducerNodeBuilder extends AbstractProducerNodeBuilder {
367 private final static String RESOURCEBUNDLE_KEY_ATTRIBUTE = KEY_ATTRIBUTE;
368 private final static String RESOURCEBUNDLE_BUNDLE_ATTRIBUTE = "bundle";
369 private final static String RESOURCEBUNDLE_LANGUAGE_ATTRIBUTE = "language";
370 private final static String RESOURCEBUNDLE_DEFAULT_SUBNODE = "default";
371 private final static String[] RESOURCEBUNDLE_REQUIRED_ATTRIBUTES = { RESOURCEBUNDLE_KEY_ATTRIBUTE, RESOURCEBUNDLE_BUNDLE_ATTRIBUTE };
372 private final static String[] RESOURCEBUNDLE_OPTIONAL_ATTRIBUTES = { RESOURCEBUNDLE_LANGUAGE_ATTRIBUTE};
373 private final static String[] RESOURCEBUNDLE_SUBNODES = {};
376 private String bundle;
377 private String language;
379 public ResourceBundleProducerNodeBuilder() {
380 super(RESOURCEBUNDLE_SUBNODES);
383 public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc {
384 XMLReaderTool.checkAttributes(anAttributes, RESOURCEBUNDLE_REQUIRED_ATTRIBUTES, RESOURCEBUNDLE_OPTIONAL_ATTRIBUTES);
386 key = (String) anAttributes.get(RESOURCEBUNDLE_KEY_ATTRIBUTE);
387 bundle = (String) anAttributes.get(RESOURCEBUNDLE_BUNDLE_ATTRIBUTE);
388 language = (String) anAttributes.get(RESOURCEBUNDLE_LANGUAGE_ATTRIBUTE);
391 public ProducerNode constructNode() {
392 return new ResourceBundleProducerNode(key, bundle, language);
396 ////////////////////////////////////////////////////////////////////////////////
398 public static class FileDateSettingProducerNodeBuilder extends AbstractProducerNodeBuilder {
399 private final static String FILEDATESETTING_FILE_ATTRIBUTE = "filename";
400 private final static String FILEDATESETTING_DATE_ATTRIBUTE = "date";
401 private final static String[] FILEDATESETTING_REQUIRED_ATTRIBUTES = { FILEDATESETTING_FILE_ATTRIBUTE, FILEDATESETTING_DATE_ATTRIBUTE };
402 private final static String[] FILEDATESETTING_OPTIONAL_ATTRIBUTES = { };
403 private final static String[] FILEDATESETTING_SUBNODES = {};
405 private String fileNameKey;
406 private String dateKey;
408 public FileDateSettingProducerNodeBuilder() {
409 super(FILEDATESETTING_SUBNODES);
412 public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc {
413 XMLReaderTool.checkAttributes(anAttributes, FILEDATESETTING_REQUIRED_ATTRIBUTES, FILEDATESETTING_OPTIONAL_ATTRIBUTES);
415 fileNameKey = (String) anAttributes.get(FILEDATESETTING_FILE_ATTRIBUTE);
416 dateKey = (String) anAttributes.get(FILEDATESETTING_DATE_ATTRIBUTE);
419 public ProducerNode constructNode() {
420 return new FileDateSettingProducerNode(fileNameKey, dateKey);
424 ////////////////////////////////////////////////////////////////////////////////
426 public static class FileDeletingProducerNodeBuilder extends AbstractProducerNodeBuilder {
427 private final static String FILEDELETING_FILE_ATTRIBUTE = "filename";
428 private final static String[] FILEDELETING_REQUIRED_ATTRIBUTES = { FILEDELETING_FILE_ATTRIBUTE };
429 private final static String[] FILEDELETING_OPTIONAL_ATTRIBUTES = { };
430 private final static String[] FILEDELETING_SUBNODES = { };
432 private String fileNameKey;
434 public FileDeletingProducerNodeBuilder() {
435 super(FILEDELETING_SUBNODES);
438 public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc {
439 XMLReaderTool.checkAttributes(anAttributes, FILEDELETING_REQUIRED_ATTRIBUTES, FILEDELETING_OPTIONAL_ATTRIBUTES);
441 fileNameKey = (String) anAttributes.get(FILEDELETING_FILE_ATTRIBUTE);
444 public ProducerNode constructNode() {
445 return new FileDeletingProducerNode(fileNameKey);
449 ////////////////////////////////////////////////////////////////////////////////
451 public static class ScriptCallingProducerNodeBuilder extends AbstractProducerNodeBuilder {
452 private final static String SCRIPT_COMMAND_ATTRIBUTE = "command";
453 private final static String[] SCRIPT_REQUIRED_ATTRIBUTES = { SCRIPT_COMMAND_ATTRIBUTE };
454 private final static String[] SCRIPT_OPTIONAL_ATTRIBUTES = {};
455 private final static String[] SCRIPT_SUBNODES = {};
457 private String command;
459 public ScriptCallingProducerNodeBuilder() {
460 super(SCRIPT_SUBNODES);
463 public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc {
464 XMLReaderTool.checkAttributes(anAttributes, SCRIPT_REQUIRED_ATTRIBUTES, SCRIPT_OPTIONAL_ATTRIBUTES);
466 command = (String) anAttributes.get(SCRIPT_COMMAND_ATTRIBUTE);
469 public ProducerNode constructNode() {
470 return new ScriptCallingProducerNode(command);
474 ////////////////////////////////////////////////////////////////////////////////
476 private final static String DIRCOPY_SOURCE_ATTRIBUTE = "source";
477 private final static String DIRCOPY_DESTINATION_ATTRIBUTE = "destination";
478 private final static String[] DIRCOPY_REQUIRED_ATTRIBUTES = { DIRCOPY_SOURCE_ATTRIBUTE, DIRCOPY_DESTINATION_ATTRIBUTE };
479 private final static String[] DIRCOPY_OPTIONAL_ATTRIBUTES = {};
480 private final static String[] DIRCOPY_SUBNODES = {};
482 public static class DirCopyProducerNodeBuilder extends AbstractProducerNodeBuilder {
483 private String source;
484 private String destination;
485 private String sourceBasePath;
486 private String destinationBasePath;
488 public DirCopyProducerNodeBuilder(String aSourceBasePath, String aDestinationBasePath) {
489 super(DIRCOPY_SUBNODES);
491 sourceBasePath = aSourceBasePath;
492 destinationBasePath = aDestinationBasePath;
495 public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc {
496 XMLReaderTool.checkAttributes(anAttributes, DIRCOPY_REQUIRED_ATTRIBUTES, DIRCOPY_OPTIONAL_ATTRIBUTES);
498 source = (String) anAttributes.get(DIRCOPY_SOURCE_ATTRIBUTE);
499 destination = (String) anAttributes.get(DIRCOPY_DESTINATION_ATTRIBUTE);
502 public ProducerNode constructNode() {
503 return new DirCopyingProducerNode(sourceBasePath, destinationBasePath, source, destination);
506 public static class factory implements ProducerNodeBuilderFactory {
507 private String sourceBasePath;
508 private String destinationBasePath;
510 public factory(String aSourceBasePath, String aDestinationBasePath) {
511 sourceBasePath = aSourceBasePath;
512 destinationBasePath = aDestinationBasePath;
515 public ProducerNodeBuilder makeBuilder() {
516 return new DirCopyProducerNodeBuilder(sourceBasePath, destinationBasePath);
521 ////////////////////////////////////////////////////////////////////////////////
523 public static class GeneratingProducerNodeBuilder extends AbstractProducerNodeBuilder {
524 private final static String GENERATION_GENERATOR_ATTRIBUTE = "generator";
525 private final static String GENERATION_DESTINATION_ATTRIBUTE = "destination";
526 private final static String GENERATION_PARAMETERS_ATTRIBUTE = "parameters";
527 private final static String[] GENERATION_REQUIRED_ATTRIBUTES = { GENERATION_GENERATOR_ATTRIBUTE, GENERATION_DESTINATION_ATTRIBUTE };
528 private final static String[] GENERATION_OPTIONAL_ATTRIBUTES = { GENERATION_PARAMETERS_ATTRIBUTE};
529 private final static String[] GENERATION_SUBNODES = {};
531 private String generator;
532 private String destination;
533 private String parameters;
534 private Generator.GeneratorLibrary generatorLibrary;
535 private WriterEngine writerEngine;
537 public GeneratingProducerNodeBuilder(Generator.GeneratorLibrary aGeneratorLibrary, WriterEngine aWriterEngine) {
538 super(GENERATION_SUBNODES);
540 writerEngine = aWriterEngine;
541 generatorLibrary = aGeneratorLibrary;
544 public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc {
545 XMLReaderTool.checkAttributes(anAttributes, GENERATION_REQUIRED_ATTRIBUTES, GENERATION_OPTIONAL_ATTRIBUTES);
547 generator = (String) anAttributes.get(GENERATION_GENERATOR_ATTRIBUTE);
548 destination = (String) anAttributes.get(GENERATION_DESTINATION_ATTRIBUTE);
549 parameters = XMLReaderTool.getStringAttributeWithDefault(anAttributes, GENERATION_PARAMETERS_ATTRIBUTE, "" );
552 public ProducerNode constructNode() {
553 return new GeneratingProducerNode(generatorLibrary, writerEngine, generator, destination, parameters);
556 public static class factory implements ProducerNodeBuilderFactory {
557 private Generator.GeneratorLibrary generatorLibrary;
558 private WriterEngine writerEngine;
560 public factory(Generator.GeneratorLibrary aGeneratorLibrary, WriterEngine aWriterEngine) {
561 writerEngine = aWriterEngine;
562 generatorLibrary = aGeneratorLibrary;
565 public ProducerNodeBuilder makeBuilder() {
566 return new GeneratingProducerNodeBuilder(generatorLibrary, writerEngine);
571 ////////////////////////////////////////////////////////////////////////////////
573 public static class BatchingProducerNodeBuilder extends AbstractProducerNodeBuilder {
575 private final static String BATCHER_DATAKEY_ATTRIBUTE = KEY_ATTRIBUTE;
576 private final static String BATCHER_INFOKEY_ATTRIBUTE = "infokey";
577 private final static String BATCHER_DEFINITION_ATTRIBUTE = DEFINITION_ATTRIBUTE;
578 private final static String BATCHER_SELECTION_ATTRIBUTE = SELECTION_ATTRIBUTE;
579 private final static String BATCHER_ORDER_ATTRIBUTE = ORDER_ATTRIBUTE;
581 private final static String BATCHER_BATCHSIZE_ATTRIBUTE = "batchsize";
582 private final static String BATCHER_MINBATCHSIZE_ATTRIBUTE = "minbatchsize";
583 private final static String BATCHER_SKIP_ATTRIBUTE = SKIP_ATTRIBUTE;
585 private final static String BATCHER_PROCESS_ATTRIBUTE = "process";
587 private final static String BATCHER_BATCH_SUBNODE = "batches";
588 private final static String BATCHER_BATCHLIST_SUBNODE = "batchlist";
589 private final static String[] BATCHER_REQUIRED_ATTRIBUTES = { BATCHER_DATAKEY_ATTRIBUTE, BATCHER_INFOKEY_ATTRIBUTE, BATCHER_DEFINITION_ATTRIBUTE, BATCHER_BATCHSIZE_ATTRIBUTE };
590 private final static String[] BATCHER_OPTIONAL_ATTRIBUTES = { BATCHER_SELECTION_ATTRIBUTE, BATCHER_ORDER_ATTRIBUTE, BATCHER_MINBATCHSIZE_ATTRIBUTE, BATCHER_SKIP_ATTRIBUTE, BATCHER_PROCESS_ATTRIBUTE };
591 private final static String[] BATCHER_SUBNODES = { BATCHER_BATCH_SUBNODE, BATCHER_BATCHLIST_SUBNODE };
593 // ML: batchSize, minBatchSize, skip should be expressions!
595 private EntityAdapterModel model;
596 private String batchDataKey;
597 private String batchInfoKey;
598 private String definition;
599 private String selection;
600 private String order;
601 private String batchSize;
602 private String minBatchSize;
604 private String process;
606 public BatchingProducerNodeBuilder(EntityAdapterModel aModel) {
607 super(BATCHER_SUBNODES);
612 public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc {
613 XMLReaderTool.checkAttributes(anAttributes, BATCHER_REQUIRED_ATTRIBUTES, BATCHER_OPTIONAL_ATTRIBUTES);
615 batchDataKey = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_DATAKEY_ATTRIBUTE, "data" );
616 batchInfoKey = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_INFOKEY_ATTRIBUTE, "info" );
617 definition = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_DEFINITION_ATTRIBUTE, "" );
618 selection = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_SELECTION_ATTRIBUTE, "" );
619 order = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_ORDER_ATTRIBUTE, "" );
621 batchSize = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_BATCHSIZE_ATTRIBUTE, "20" );
622 minBatchSize = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_MINBATCHSIZE_ATTRIBUTE, "0" );
623 skip = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_SKIP_ATTRIBUTE, "0" );
624 process = XMLReaderTool.getStringAttributeWithDefault(anAttributes, BATCHER_PROCESS_ATTRIBUTE, "-1" );
627 public ProducerNode constructNode() {
628 return new EntityBatchingProducerNode(
639 getSubNode( BATCHER_BATCH_SUBNODE ),
640 getSubNode( BATCHER_BATCHLIST_SUBNODE )
644 public static class factory implements ProducerNodeBuilderFactory {
645 private EntityAdapterModel model;
647 public factory(EntityAdapterModel aModel) {
651 public ProducerNodeBuilder makeBuilder() {
652 return new BatchingProducerNodeBuilder(model);
657 ////////////////////////////////////////////////////////////////////////////////
659 public static class ConditionalProducerNodeBuilder extends AbstractProducerNodeBuilder {
660 private final static String IF_CONDITION_ATTRIBUTE = "condition";
662 private final static String IF_TRUE_SUBNODE = "then";
663 private final static String IF_FALSE_SUBNODE = "else";
664 private final static String[] IF_REQUIRED_ATTRIBUTES = { IF_CONDITION_ATTRIBUTE };
665 private final static String[] IF_OPTIONAL_ATTRIBUTES = { };
666 private final static String[] IF_SUBNODES = { IF_TRUE_SUBNODE, IF_FALSE_SUBNODE };
668 private String condition;
670 public ConditionalProducerNodeBuilder() {
674 public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc {
675 XMLReaderTool.checkAttributes(anAttributes, IF_REQUIRED_ATTRIBUTES, IF_OPTIONAL_ATTRIBUTES);
677 condition = (String) anAttributes.get( IF_CONDITION_ATTRIBUTE );
680 public ProducerNode constructNode() {
681 return new ConditionalProducerNode(
683 getSubNode( IF_TRUE_SUBNODE ),
684 getSubNode( IF_FALSE_SUBNODE )
690 ////////////////////////////////////////////////////////////////////////////////
692 public static class ScriptedProducerParameterNodeBuilder implements ProducerNodeBuilder {
693 private String parameterName;
694 private String scriptedNodeName;
696 public ScriptedProducerParameterNodeBuilder(String aScriptedNodeName, String aParameterName) {
697 parameterName = aParameterName;
698 scriptedNodeName = aScriptedNodeName;
701 public void setSubNode(String aName, ProducerNode aNode) {
704 public Set getAvailableSubNodes() {
705 return new HashSet();
708 public void setAttributes(Map anAttributes) throws ProducerConfigExc {
709 if (!anAttributes.isEmpty())
710 throw new ProducerConfigExc("No parameters allowed here");
713 public ProducerNode constructNode() {
714 return new ScriptedProducerNodeDefinition.NodeParameterProducerNode(scriptedNodeName, parameterName);
718 ////////////////////////////////////////////////////////////////////////////////
720 public static class ScriptedProducerNodeBuilder implements ProducerNodeBuilder {
721 private ScriptedProducerNodeDefinition definition;
722 private Map nodeParameterValues;
723 private Map integerParameterValues;
724 private Map stringParameterValues;
726 public ScriptedProducerNodeBuilder(ScriptedProducerNodeDefinition aDefinition) {
727 definition = aDefinition;
729 stringParameterValues = new HashMap();
730 stringParameterValues.putAll(definition.getStringParameters());
732 integerParameterValues = new HashMap();
733 integerParameterValues.putAll(definition.getIntegerParameters());
735 nodeParameterValues = new HashMap();
738 public void setSubNode(String aName, ProducerNode aNode) {
739 nodeParameterValues.put(aName, aNode);
742 public Set getAvailableSubNodes() {
743 return definition.getNodeParameters();
746 public void setAttributes(Map anAttributes) throws ProducerConfigExc, XMLReader.XMLReaderExc {
747 XMLReaderTool.checkAttributeSet(anAttributes.keySet(), definition.getRequiredAttributes(), definition.getOptionalAttributes());
749 Iterator i = anAttributes.entrySet().iterator();
750 while (i.hasNext()) {
751 Map.Entry entry = (Map.Entry) i.next();
753 if (definition.getIntegerParameters().keySet().contains(entry.getKey()))
754 integerParameterValues.put(entry.getKey(), entry.getValue());
756 stringParameterValues.put(entry.getKey(), entry.getValue());
760 public ProducerNode constructNode() {
761 return new ScriptedProducerNode(definition, stringParameterValues, integerParameterValues, nodeParameterValues);
764 public static class factory implements ProducerNodeBuilderFactory {
765 private ScriptedProducerNodeDefinition definition;
767 public factory(ScriptedProducerNodeDefinition aDefinition) {
768 definition = aDefinition;
771 public ProducerNodeBuilder makeBuilder() {
772 return new ScriptedProducerNodeBuilder(definition);