e9d3f5ddbf598c1863eb8ddcc8836bdb2a833511
[mir.git] / source / mir / producer / EntityEnumeratingProducerNode.java
1 /*
2  * Copyright (C) 2001, 2002  The Mir-coders group
3  *
4  * This file is part of Mir.
5  *
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.
10  *
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.
15  *
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
19  *
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.
30  */
31
32 package mir.producer;
33
34 import java.util.*;
35 import java.io.*;
36 import mir.entity.adapter.*;
37 import mir.entity.*;
38 import mir.storage.*;
39 import mir.util.*;
40
41 public class EntityEnumeratingProducerNode extends ProducerNodeDecorator {
42   private Map verbs;
43   private EntityEnumeratingProducerNodeVerb defaultVerb;
44   private String key;
45   private EntityAdapterModel model;
46   private String definition;
47   private String skip;
48   private String limit;
49
50   public EntityEnumeratingProducerNode(
51                 String aKey,
52                 EntityAdapterModel aModel, String aDefinition,
53                 ProducerNode aSubNode) {
54     super(aSubNode);
55
56     defaultVerb = null;
57     verbs = new HashMap();
58     model = aModel;
59     definition = aDefinition;
60     key = aKey;
61   }
62
63   public EntityEnumeratingProducerNode(
64               String aKey,
65               EntityAdapterModel aModel, String aDefinition,
66               String aDefaultWhereClause, String aDefaultOrderByClause,
67               ProducerNode aSubNode) {
68     this(aKey, aModel, aDefinition, aDefaultWhereClause, aDefaultOrderByClause, "", "", aSubNode);
69   }
70
71   public EntityEnumeratingProducerNode(
72               String aKey,
73               EntityAdapterModel aModel, String aDefinition,
74               String aDefaultWhereClause, String aDefaultOrderByClause,
75               String aLimit, String aSkip,
76               ProducerNode aSubNode) {
77     this(aKey, aModel, aDefinition, aSubNode);
78
79     limit= aLimit;
80     skip = aSkip;
81     defaultVerb = new EntityEnumeratingProducerNodeVerb(aDefaultWhereClause, aDefaultOrderByClause);
82   }
83
84   public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
85     EntityEnumeratingProducerNodeVerb verb = (EntityEnumeratingProducerNodeVerb) verbs.get(aVerb);
86     Iterator browser;
87
88     if (verb==null)
89       verb = defaultVerb;
90
91     if (verb==null)
92       throw new ProducerFailure("EntityEnumeratingProducerNode: unknown verb '"+aVerb+"'", null);
93
94     try {
95       browser = new EntityIteratorAdapter(
96           ParameterExpander.expandExpression( aValueMap, verb.whereClause ),
97           ParameterExpander.expandExpression( aValueMap, verb.orderByClause ),
98           100,
99           model,
100           definition,
101           ParameterExpander.evaluateIntegerExpressionWithDefault( aValueMap, limit, -1),
102           ParameterExpander.evaluateIntegerExpressionWithDefault( aValueMap, skip, 0));
103
104       while (browser.hasNext()) {
105         ParameterExpander.setValueForKey( aValueMap, key, browser.next());
106         super.produce(aValueMap, aVerb, aLogger);
107       }
108     }
109     catch (Throwable t) {
110       throw new ProducerFailure(t.getMessage(), t);
111     }
112   };
113
114   public Set buildVerbSet() {
115     Set set;
116
117     set = super.buildVerbSet();
118     set.addAll(verbs.keySet());
119
120     return set;
121   };
122
123   public void addVerb(String aVerb, String aWhereClause, String anOrderByClause) {
124     verbs.put(aVerb, new EntityEnumeratingProducerNodeVerb(aWhereClause, anOrderByClause));
125   }
126
127   private class EntityEnumeratingProducerNodeVerb {
128     String whereClause;
129     String orderByClause;
130
131     EntityEnumeratingProducerNodeVerb(String aWhereClause, String anOrderByClause) {
132       whereClause = aWhereClause;
133       orderByClause = anOrderByClause;
134     }
135   }
136 }