merge of localization branch into HEAD. mh and zap
[mir.git] / source / mir / producer / EntityEnumeratingProducerNode.java
1 package mir.producer;
2
3 import java.util.*;
4 import java.io.*;
5 import mir.entity.adapter.*;
6 import mir.entity.*;
7 import mir.storage.*;
8 import mir.util.*;
9
10 public class EntityEnumeratingProducerNode extends ProducerNodeDecorator {
11   private Map verbs;
12   private EntityEnumeratingProducerNodeVerb defaultVerb;
13   private String key;
14   private EntityAdapterModel model;
15   private String definition;
16   private String skip;
17   private String limit;
18
19   public EntityEnumeratingProducerNode(
20                 String aKey,
21                 EntityAdapterModel aModel, String aDefinition,
22                 ProducerNode aSubNode) {
23     super(aSubNode);
24
25     defaultVerb = null;
26     verbs = new HashMap();
27     model = aModel;
28     definition = aDefinition;
29     key = aKey;
30   }
31
32   public EntityEnumeratingProducerNode(
33               String aKey,
34               EntityAdapterModel aModel, String aDefinition,
35               String aDefaultWhereClause, String aDefaultOrderByClause,
36               ProducerNode aSubNode) {
37     this(aKey, aModel, aDefinition, aDefaultWhereClause, aDefaultOrderByClause, "", "", aSubNode);
38   }
39
40   public EntityEnumeratingProducerNode(
41               String aKey,
42               EntityAdapterModel aModel, String aDefinition,
43               String aDefaultWhereClause, String aDefaultOrderByClause,
44               String aLimit, String aSkip,
45               ProducerNode aSubNode) {
46     this(aKey, aModel, aDefinition, aSubNode);
47
48     limit= aLimit;
49     skip = aSkip;
50     defaultVerb = new EntityEnumeratingProducerNodeVerb(aDefaultWhereClause, aDefaultOrderByClause);
51   }
52
53   public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
54     EntityEnumeratingProducerNodeVerb verb = (EntityEnumeratingProducerNodeVerb) verbs.get(aVerb);
55     Iterator browser;
56
57     if (verb==null)
58       verb = defaultVerb;
59
60     if (verb==null)
61       throw new ProducerFailure("EntityEnumeratingProducerNode: unknown verb '"+aVerb+"'", null);
62
63     try {
64       browser = new EntityIteratorAdapter(
65           ParameterExpander.expandExpression( aValueMap, verb.whereClause ),
66           ParameterExpander.expandExpression( aValueMap, verb.orderByClause ),
67           100,
68           model,
69           definition,
70           ParameterExpander.evaluateIntegerExpressionWithDefault( aValueMap, limit, -1),
71           ParameterExpander.evaluateIntegerExpressionWithDefault( aValueMap, skip, 0));
72
73       while (browser.hasNext()) {
74         ParameterExpander.setValueForKey( aValueMap, key, browser.next());
75         super.produce(aValueMap, aVerb, aLogger);
76       }
77     }
78     catch (Throwable t) {
79       throw new ProducerFailure(t.getMessage(), t);
80     }
81   };
82
83   public Set buildVerbSet() {
84     Set set;
85
86     set = super.buildVerbSet();
87     set.addAll(verbs.keySet());
88
89     return set;
90   };
91
92   public void addVerb(String aVerb, String aWhereClause, String anOrderByClause) {
93     verbs.put(aVerb, new EntityEnumeratingProducerNodeVerb(aWhereClause, anOrderByClause));
94   }
95
96   private class EntityEnumeratingProducerNodeVerb {
97     String whereClause;
98     String orderByClause;
99
100     EntityEnumeratingProducerNodeVerb(String aWhereClause, String anOrderByClause) {
101       whereClause = aWhereClause;
102       orderByClause = anOrderByClause;
103     }
104   }
105 }