e40a58c4e5c1415534145fd6b8e9e3d89b7b31c0
[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 EntityAdapterDefinition definition;
15   private StorageObject storage;
16
17   public EntityEnumeratingProducerNode(String aKey, StorageObject aStorage, EntityAdapterDefinition aDefinition, ProducerNode aSubNode) {
18     super(aSubNode);
19
20     defaultVerb = null;
21     verbs = new HashMap();
22     storage = aStorage;
23     definition = aDefinition;
24     key = aKey;
25   }
26
27   public EntityEnumeratingProducerNode(String aKey, StorageObject aStorage, EntityAdapterDefinition aDefinition,
28           String aDefaultWhereClause, String aDefaultOrderByClause, ProducerNode aSubNode) {
29     this(aKey, aStorage, aDefinition, aSubNode);
30
31     defaultVerb = new EntityEnumeratingProducerNodeVerb(aDefaultWhereClause, aDefaultOrderByClause);
32   }
33
34   public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
35     EntityEnumeratingProducerNodeVerb verb = (EntityEnumeratingProducerNodeVerb) verbs.get(aVerb);
36     Iterator browser;
37
38     if (verb==null)
39       verb = defaultVerb;
40
41     if (verb==null)
42       throw new ProducerFailure("EntityEnumeratingProducerNode: unknown verb '"+aVerb+"'", null);
43
44     try {
45       browser = new EntityIteratorAdapter(
46           storage,
47           ParameterExpander.expandExpression( aValueMap, verb.whereClause ),
48           ParameterExpander.expandExpression( aValueMap, verb.orderByClause ),
49           -1,
50           definition );
51
52       while (browser.hasNext()) {
53         aValueMap.put(key, browser.next());
54         super.produce(aValueMap, aVerb, aLogger);
55       }
56     }
57     catch (Throwable t) {
58       throw new ProducerFailure(t.getMessage(), t);
59     }
60   };
61
62   public Set buildVerbSet() {
63     Set set;
64
65     set = super.buildVerbSet();
66     set.addAll(verbs.keySet());
67
68     return set;
69   };
70
71   public void addVerb(String aVerb, String aWhereClause, String anOrderByClause) {
72     verbs.put(aVerb, new EntityEnumeratingProducerNodeVerb(aWhereClause, anOrderByClause));
73   }
74
75   private class EntityEnumeratingProducerNodeVerb {
76     String whereClause;
77     String orderByClause;
78
79     EntityEnumeratingProducerNodeVerb(String aWhereClause, String anOrderByClause) {
80       whereClause = aWhereClause;
81       orderByClause = anOrderByClause;
82     }
83   }
84 }