KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > jorm > generator > lib > NamingFilterExpressionHelper


1 /**
2  * Copyright (C) 2004 France Telecom R&D
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  */

18 package org.objectweb.jorm.generator.lib;
19
20 import org.objectweb.jorm.type.api.PType;
21 import org.objectweb.jorm.api.PException;
22 import org.objectweb.medor.expression.api.Expression;
23 import org.objectweb.medor.expression.api.ExpressionException;
24 import org.objectweb.medor.expression.api.Operator;
25 import org.objectweb.medor.expression.api.Operand;
26 import org.objectweb.medor.expression.api.ParameterOperand;
27 import org.objectweb.medor.expression.lib.Equal;
28 import org.objectweb.medor.expression.lib.NotEqual;
29 import org.objectweb.medor.expression.lib.Mod;
30 import org.objectweb.medor.expression.lib.Round;
31 import org.objectweb.util.monolog.api.BasicLevel;
32 import org.objectweb.util.monolog.api.Logger;
33
34 import java.util.Map JavaDoc;
35 import java.util.HashMap JavaDoc;
36
37 /**
38  * This class is a helper for managing the evaluation of medor expression in
39  * naming.
40  *
41  * @author S.Chassande-Barrioz
42  */

43 public abstract class NamingFilterExpressionHelper extends CommonHelper {
44
45     /**
46      * A map containing a list of field declaration/initialisation. The key is
47      * the field name.
48      * key = String, field name
49      * value = String, declaration of the field
50      */

51     public Map JavaDoc field2declarations = new HashMap JavaDoc();
52
53     /**
54      * the expression evaluating the filter
55      */

56     public StringBuffer JavaDoc filter = new StringBuffer JavaDoc();
57
58     public Logger logger;
59
60
61     public NamingFilterExpressionHelper(Logger logger)
62         throws PException, ExpressionException {
63         this.logger = logger;
64     }
65
66     public Map JavaDoc getField2declarations() {
67         return field2declarations;
68     }
69
70     public String JavaDoc getFilter() {
71         return filter.toString();
72     }
73
74     public String JavaDoc toString() {
75         return super.toString()
76             + " / filter=" + filter.toString()
77             + " / field2declarations=" + field2declarations
78             ;
79     }
80
81     protected void fillMatchInfo(Expression e) throws PException, ExpressionException {
82         if (e instanceof Round) {
83             PType type = ((Operator) e).getExpression(0).getType();
84             if (type != null && (
85                     type.getTypeCode() == PType.TYPECODE_FLOAT
86                     || type.getTypeCode() == PType.TYPECODE_DOUBLE)) {
87                 filter.append("java.lang.Math.round(");
88                 fillMatchInfo(((Operator) e).getExpression(0));
89                 filter.append(')');
90             } else {
91                 fillMatchInfo(((Operator) e).getExpression(0));
92             }
93             
94         } else if (e instanceof Operator) {
95             Operator operator = (Operator) e;
96             logger.log(BasicLevel.DEBUG, "Operator " + operator.getOperatorString());
97             int nb = operator.getOperandNumber();
98             if (nb == 1) {
99                 filter.append(operator.getOperatorString());
100                 fillMatchInfo(operator.getExpression(0));
101             } else if (nb == 2) {
102                 String JavaDoc opPreString = "";
103                 String JavaDoc opString = " " + operator2String(operator) + " ";
104                 String JavaDoc opPostString = "";
105                 //particular case of the equal operator which is translated
106
// - to the equals method on java object,
107
// - to a equality (==) on primitive type,
108
// - to the static method java.util.Arrays.equals(o1,o2) on arrays
109
if (((e instanceof Equal) || (e instanceof NotEqual))
110                     && (isObjectOperand(operator.getExpression(0))
111                         || isObjectOperand(operator.getExpression(1)))) {
112                     opString = ".equals(";
113                     opPostString = ")";
114                     if (e instanceof NotEqual) {
115                         opPreString = "!";
116                     }
117                     if (isArrayOperand(operator.getExpression(0))
118                         || isArrayOperand(operator.getExpression(1))) {
119                         opPreString += "java.util.Arrays.equals(";
120                         opString = ",";
121                     }
122                 }
123
124                 filter.append('(');
125                 filter.append(opPreString);
126                 fillMatchInfo(operator.getExpression(0));
127                 filter.append(opString);
128                 fillMatchInfo(operator.getExpression(1));
129                 filter.append(opPostString);
130                 filter.append(')');
131             } else {
132                 throw new PException("Operators with more than 2 operands are not supported: " + e);
133             }
134         } else if (e instanceof ParameterOperand) {
135             fillMatchInfo((ParameterOperand) e);
136         } else if ((e instanceof Operand) && ((Operand) e).isDefined()) {
137             Operand operand = (Operand) e;
138             if (isObjectType(operand.getType())) {
139                 Object JavaDoc o = operand.getObject();
140                 if (o == null) {
141                     filter.append("null");
142                 } else {
143                     filterAppendOperand(operand);
144                 }
145             } else {
146                 filterAppendOperand(operand);
147             }
148         }
149     }
150
151     private void filterAppendOperand(Operand operand) throws PException, ExpressionException{
152         switch (operand.getType().getTypeCode()) {
153         case PType.TYPECODE_CHAR:
154         case PType.TYPECODE_OBJCHAR:
155             filter.append("'");
156             filter.append(operand.getChar());
157             filter.append("'");
158             break;
159
160         case PType.TYPECODE_BYTE:
161         case PType.TYPECODE_OBJBYTE:
162             filter.append(operand.getByte());
163             break;
164
165         case PType.TYPECODE_SHORT:
166         case PType.TYPECODE_OBJSHORT:
167             filter.append(operand.getShort());
168             break;
169
170         case PType.TYPECODE_INT:
171         case PType.TYPECODE_OBJINT:
172             filter.append(operand.getInt());
173             break;
174
175         case PType.TYPECODE_LONG:
176         case PType.TYPECODE_OBJLONG:
177             filter.append(operand.getLong());
178             filter.append('l');
179             break;
180
181         case PType.TYPECODE_STRING:
182             filter.append('"');
183             filter.append(operand.getString());
184             filter.append('"');
185             break;
186
187         case PType.TYPECODE_BYTEARRAY: {
188             filter.append("new byte[]{");
189             String JavaDoc sep = "";
190             byte[] arrays = operand.getByteArray();
191             for(int i=0; i<arrays.length; i++) {
192                 filter.append(sep);
193                 sep = ",";
194                 filter.append(arrays[i]);
195             }
196             filter.append("}");
197             break;
198         }
199         case PType.TYPECODE_CHARARRAY: {
200             char[] arrays = operand.getCharArray();
201                 filter.append("new char[]{");
202                 String JavaDoc sep = "";
203                 for(int i=0; i<arrays.length; i++) {
204                     filter.append(sep);
205                     sep = ",";
206                     filter.append(arrays[i]);
207                 }
208                 filter.append("}");
209             break;
210         }
211         case PType.TYPECODE_DATE:
212             filter.append("new java.util.Date(");
213             filter.append(operand.getDate().getTime());
214             filter.append(')');
215             break;
216         case PType.TYPECODE_BIGDECIMAL:
217             filter.append("new java.math.BigDecimal(\"");
218             filter.append(operand.getBigDecimal().toString());
219             filter.append("\")");
220             break;
221
222         case PType.TYPECODE_BIGINTEGER:
223             filter.append("new java.math.BigInteger(\"");
224             filter.append(operand.getBigDecimal().toString());
225             filter.append("\")");
226             break;
227
228         default:
229             
230         }
231     }
232     
233     private boolean isObjectOperand(Expression e) {
234         return (e instanceof Operand) && isObjectType(e.getType());
235     }
236
237     private boolean isArrayOperand(Expression e) {
238         return (e instanceof Operand)
239             && (e.getType().getTypeCode() == PType.TYPECODE_CHARARRAY
240                    || e.getType().getTypeCode() == PType.TYPECODE_BYTEARRAY);
241     }
242
243     protected String JavaDoc operator2String(Operator op) {
244         if (op instanceof Mod) {
245             return "%";
246         }
247         return op.getOperatorString();
248     }
249
250     protected abstract void fillMatchInfo(ParameterOperand po)
251         throws PException, ExpressionException;
252     
253 }
254
255
Popular Tags