7bc5caaf75d6a4691155115b8de98dc90b7f642a
[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         aLogger.println( verb.whereClause + ": next... ");
54         aValueMap.put(key, browser.next());
55         super.produce(aValueMap, aVerb, aLogger);
56       }
57     }
58     catch (Throwable t) {
59       throw new ProducerFailure(t.getMessage(), t);
60     }
61   };
62
63   public Set buildVerbSet() {
64     Set set;
65
66     set = super.buildVerbSet();
67     set.addAll(verbs.keySet());
68
69     return set;
70   };
71
72   public void addVerb(String aVerb, String aWhereClause, String anOrderByClause) {
73     verbs.put(aVerb, new EntityEnumeratingProducerNodeVerb(aWhereClause, anOrderByClause));
74   }
75
76   private class EntityEnumeratingProducerNodeVerb {
77     StorageObject database;
78
79     String whereClause;
80     String orderByClause;
81
82     EntityEnumeratingProducerNodeVerb(String aWhereClause, String anOrderByClause) {
83       whereClause = aWhereClause;
84       orderByClause = anOrderByClause;
85     }
86   }
87 }