KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > medor > optim > lib > MedorSourceTypeCompiler


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

23
24 /**
25  * Package definition.
26  */

27
28 package org.objectweb.medor.optim.lib;
29
30 import org.objectweb.jorm.type.api.PType;
31 import org.objectweb.jorm.type.api.PTypeSpace;
32 import org.objectweb.medor.api.MedorException;
33 import org.objectweb.medor.api.TupleStructure;
34 import org.objectweb.medor.filter.api.BelongOperator;
35 import org.objectweb.medor.expression.api.BinaryLogicalOperator;
36 import org.objectweb.medor.expression.api.Comparator;
37 import org.objectweb.medor.filter.api.ExpressionHelper;
38 import org.objectweb.medor.filter.api.FieldOperand;
39 import org.objectweb.medor.expression.api.ParameterOperand;
40 import org.objectweb.medor.expression.api.UnaryArithmeticOperator;
41 import org.objectweb.medor.expression.api.UnaryLogicalOperator;
42 import org.objectweb.medor.expression.api.Operand;
43 import org.objectweb.medor.expression.api.BinaryArithmeticOperator;
44 import org.objectweb.medor.expression.api.Expression;
45 import org.objectweb.medor.expression.api.ExpressionException;
46 import org.objectweb.medor.filter.postfix.PostfixExpressionHelper;
47 import org.objectweb.medor.optim.api.ExecPlanGenerator;
48 import org.objectweb.medor.query.api.CalculatedField;
49 import org.objectweb.medor.query.api.QueryNode;
50 import org.objectweb.medor.query.api.QueryTree;
51 import org.objectweb.medor.tuple.api.TupleLoader;
52 import org.objectweb.medor.type.lib.QTypeTuple;
53 import org.objectweb.util.io.api.Block;
54 import org.objectweb.util.io.api.TargetHolder;
55 import org.objectweb.util.io.lib.BlockImpl;
56 import org.objectweb.util.io.lib.JavaFileHolder;
57
58 import java.io.File JavaDoc;
59 import java.io.FileWriter JavaDoc;
60 import java.io.IOException JavaDoc;
61 import java.util.Enumeration JavaDoc;
62 import java.util.HashSet JavaDoc;
63 import java.util.Iterator JavaDoc;
64 import java.util.Stack JavaDoc;
65 import java.util.Vector JavaDoc;
66
67 public class MedorSourceTypeCompiler implements ExecPlanGenerator {
68     private DirsCompileClassLoader mcl;
69     private TargetHolder queryFiltersHolder;
70     private TargetHolder tcTypeHolder;
71     private QueryTree queryTree;
72     private String JavaDoc sourceDirectory,classDirectory;
73     private HashSet JavaDoc library = new HashSet JavaDoc();
74     ExpressionHelper eHelper = new PostfixExpressionHelper();
75     private int nbrFilter = 0;
76     private int nbrQTType = 0;
77     private static final String JavaDoc javaFilterName = "Filter";
78     private static final String JavaDoc javaTCTypeFileName = "QueryTreeType";
79
80     public MedorSourceTypeCompiler(String JavaDoc outputSourceDirectory,
81                                    String JavaDoc outputClassdirectory,
82                                    String JavaDoc[] libraryPaths)
83             throws MedorException {
84         try {
85             sourceDirectory = outputSourceDirectory;
86             classDirectory = outputClassdirectory;
87             File JavaDoc tadir;
88             tadir = new File JavaDoc(sourceDirectory);
89             if (!tadir.isDirectory()) {
90                 throw new MedorException("the output directory parametre must be a directory: " + sourceDirectory);
91             }
92             library.add(sourceDirectory);
93
94             tadir = new File JavaDoc(classDirectory);
95             if (!tadir.isDirectory()) {
96                 throw new MedorException("the output directory parametre must be a directory: " + classDirectory);
97             }
98             library.add(classDirectory);
99
100             for (int i = 0; (i < libraryPaths.length); i++) {
101                 File JavaDoc targetDirectory = new File JavaDoc(libraryPaths[i]);
102                 if (!targetDirectory.exists()) {
103                     throw new MedorException("the path library " + libraryPaths[i] + "does not exist");
104                 }
105                 library.add(libraryPaths[i]);
106             }
107             queryFiltersHolder = new JavaFileHolder(sourceDirectory);
108             tcTypeHolder = new JavaFileHolder(sourceDirectory);
109         } catch (Exception JavaDoc e) {
110             throw new MedorException(e.getMessage());
111         }
112     }
113
114     public void builtFilterSources(QueryTree query) throws MedorException {
115         try {
116             if ((query instanceof QueryNode)
117                     && (((QueryNode) query).getQueryFilter() != null)) {
118                 QueryNode qn = (QueryNode) query;
119                 generateFilter(qn.getQueryFilter(),
120                         javaFilterName + nbrFilter++);
121                 QueryTree[] qts = qn.getChildren();
122                 for (int cpt = 0; (cpt < qts.length); cpt++)
123                     builtFilterSources(qts[cpt]);
124             }
125         } catch (Exception JavaDoc e) {
126             throw new MedorException(e.getMessage());
127         }
128     }
129
130     public void builtTCTypeSources(QueryTree query) throws MedorException {
131         try {
132             if ((query instanceof QueryNode)
133                     && ((QueryNode) query).getTupleLoader() != null) {
134                 generateTCType(
135                         ((QueryNode) query).getTupleLoader().getFieldIndexes(),
136                         query.getTupleStructure(),
137                         javaTCTypeFileName + nbrQTType++);
138                 QueryTree[] qts = ((QueryNode) query).getChildren();
139                 for (int cpt = 0; (cpt < qts.length); cpt++)
140                     builtTCTypeSources(qts[cpt]);
141             }
142         } catch (Exception JavaDoc e) {
143             throw new MedorException(e.getMessage());
144         }
145     }
146
147     public QueryTree getQueryTree() {
148         return queryTree;
149     }
150
151     public String JavaDoc[] getOutPutDirectoryName() {
152         String JavaDoc[] dirs = new String JavaDoc[2];
153         dirs[0] = sourceDirectory;
154         dirs[1] = classDirectory;
155
156         return dirs;
157     }
158
159     /**
160      * Generate a typed QueryFilter corresponding to the old QueryTree's
161      * QueryFilter
162      * @throws MedorException if IO error
163      */

164     private void builtAllFilterSources() throws MedorException {
165         builtFilterSources(queryTree);
166     }
167
168     private void builtAllTCTypeSources() throws MedorException {
169         builtTCTypeSources(queryTree);
170     }
171
172     public void generateTCTypeClass() throws MedorException {
173         builtAllTCTypeSources();
174         //javac(queryFiltersHolder.iterator());
175
}
176
177     /*
178      * This method generate a java class code only for this QueryTree.
179      * @param : QueryTree
180      */

181     private void generateTCType(int[] indexes,
182                                 TupleStructure ts,
183                                 String JavaDoc javaFileName)
184             throws MedorException, Exception JavaDoc {
185         // try{
186
FileWriter JavaDoc fw = tcTypeHolder.getFileWriter(javaFileName + ".java");
187         byte b = 0;
188         Block bk = new BlockImpl(fw, b);
189         bk.writeLine("/**");
190         bk.writeLine(" * This class is generated by Medor Compilator");
191         bk.writeLine(" * It represents a TupleLoader Object");
192         bk.writeLine(" */");
193         bk.newLine();
194         bk.writeLine("package org.objectweb.medor.query.lib;");
195         bk.newLine();
196         bk.writeLine("import org.objectweb.medor.api.MedorException;");
197         bk.writeLine("import org.objectweb.medor.tuple.api.TupleLoader;");
198         bk.writeLine("import org.objectweb.medor.tuple.api.Tuple;");
199         bk.writeLine("import org.objectweb.medor.filter.api.VariableOperand;");
200         bk.newLine();
201         bk.openBlock("public final class " + javaFileName + " implements TupleLoader");
202         bk.openBlock("public void loadTuple(Tuple thisTuple, VariableOperand[] temp) throws MedorException");
203
204         PType type;
205         int size = indexes.length;
206         for (int i = 0; (i < size); i++) {
207             //bk.writeLine("VariableOperand temp1 = (VariableOperand) temp[i];
208
type = ts.getField(i + 1).getType();
209             if (indexes[i] != -1) {
210                 switch (type.getTypeCode()) {
211                     case QTypeTuple.TYPECODE_INT:
212                         bk.writeLine("temp[" + i + "].setValue(thisTuple.getInt(" + indexes[i] + ");");
213                         break;
214                     case QTypeTuple.TYPECODE_SHORT:
215                         bk.writeLine("temp[" + i + "].setValue(thisTuple.getShort(" + indexes[i] + ");");
216                         break;
217                     case QTypeTuple.TYPECODE_BYTE:
218                         bk.writeLine("temp[" + i + "].setValue(thisTuple.getByte(" + indexes[i] + ");");
219                         break;
220                     case QTypeTuple.TYPECODE_LONG:
221                         bk.writeLine("temp[" + i + "].setValue(thisTuple.getLong(" + indexes[i] + ");");
222                         break;
223                     case QTypeTuple.TYPECODE_DOUBLE:
224                         bk.writeLine("temp[" + i + "].setValue(thisTuple.getDouble(" + indexes[i] + ");");
225                         break;
226                     case QTypeTuple.TYPECODE_BOOLEAN:
227                         bk.writeLine("temp[" + i + "].setValue(thisTuple.getBoolean(" + indexes[i] + ");");
228                         break;
229                     case QTypeTuple.TYPECODE_FLOAT:
230                         bk.writeLine("temp[" + i + "].setValue(thisTuple.getFloat(" + indexes[i] + ");");
231                         break;
232                     case QTypeTuple.TYPECODE_STRING:
233                         bk.writeLine("temp[" + i + "].setValue(thisTuple.getString(" + indexes[i] + "));");
234                         break;
235                     case QTypeTuple.TYPECODE_CHAR:
236                         bk.writeLine("temp[" + i + "].setValue(thisTuple.getChar(" + indexes[i] + ");");
237                         break;
238                     case QTypeTuple.TYPECODE_DATE:
239                         bk.writeLine("temp[" + i + "].setValue(thisTuple.getDate(" + indexes[i] + ");");
240                         break;
241                         //TODO handle TupleCollections
242
default:
243                         if (type.getJormName().equals("collection"))
244                             bk.writeLine("temp[" + i + "].setValue(thisTuple.getTupleCollection(" + indexes[i] + ");");
245                         break;
246                         //default : throw new MedorException(TYPE_1,"Invalid Attribute type " + type);
247
}
248             } else {
249                 // Loading a CalculatedField
250
Expression calculExp = ((CalculatedField) ts.getField(i + 1)).getExpression();
251                 String JavaDoc filterExpression = parserGenerateFiltStringExp(eHelper.toStack(calculExp));
252                 bk.writeLine("temp[" + i + "].setValue(" + filterExpression + ");");
253             }
254         }
255         bk.closeBlock();
256         bk.closeBlock();
257         fw.close();
258     }
259
260     /*
261      * This method generate a java class code only for this QueryFilter.
262      * @param filter: PostFixeQueryFilter
263      */

264     private void generateFilter(Expression filter, String JavaDoc javaFileName) throws MedorException, Exception JavaDoc {
265
266         // try{
267
FileWriter JavaDoc fw = queryFiltersHolder.getFileWriter(javaFileName + ".java");
268         byte b = 0;
269         Block bk = new BlockImpl(fw, b);
270         bk.writeLine("/**");
271         bk.writeLine(" * This class is generated by Medor Compiler");
272         bk.writeLine(" * It represents a compiled Expression");
273         bk.writeLine(" */");
274         bk.newLine();
275         bk.writeLine("package org.objectweb.medor.filter.lib;"); // Not obliged
276
bk.newLine();
277         bk.writeLine("import org.objectweb.medor.expression.api.MalformedExpressionException;");
278         bk.writeLine("import org.objectweb.medor.filter.api.Expression;");
279         bk.writeLine("import org.objectweb.medor.expression.api.ParameterOperand;");
280         bk.writeLine("import org.objectweb.jorm.type.api.PType;");
281         bk.writeLine("import org.objectweb.medor.type.lib.PTypeSpaceMedor;");
282         bk.writeLine("import org.objectweb.medor.tuple.api.Tuple;");
283         bk.newLine();
284         bk.openBlock("public final class " + javaFileName + " implements Expression");
285         bk.newLine();
286
287         String JavaDoc[] parameters = eHelper.getParameterNames(filter);
288
289         for (int cpt = 0; (cpt < parameters.length); cpt++) {
290             bk.writeLine("public ParameterOperand " + parameters[cpt] + ";");
291         }
292
293         bk.openBlock("public boolean evaluate(ParameterOperand[] parameters,Tuple thisTuple) throws MalformedExpressionException");
294
295         String JavaDoc filterExpression = parserGenerateFiltStringExp(eHelper.toStack(filter));
296
297         bk.writeLine("return " + filterExpression + ";");
298         bk.closeBlock();
299
300         String JavaDoc ptype = "";
301         bk.newLine();
302         bk.openBlock("PType getType()");
303         switch (filter.getType().getTypeCode()) {
304             case QTypeTuple.TYPECODE_BYTE:
305                 ptype = "PTypeSpaceMedor.BYTE";
306                 break;
307             case QTypeTuple.TYPECODE_DOUBLE:
308                 ptype = "PTypeSpaceMedor.DOUBLE";
309                 break;
310             case QTypeTuple.TYPECODE_INT:
311                 ptype = "PTypeSpaceMedor.INT";
312                 break;
313             case QTypeTuple.TYPECODE_FLOAT:
314                 ptype = "PTypeSpaceMedor.FLOAT";
315                 break;
316             case QTypeTuple.TYPECODE_LONG:
317                 ptype = "PTypeSpaceMedor.LONG";
318                 break;
319             case QTypeTuple.TYPECODE_SHORT:
320                 ptype = "PTypeSpaceMedor.SHORT";
321                 break;
322             case QTypeTuple.TYPECODE_BOOLEAN:
323                 ptype = "PTypeSpaceMedor.BOOLEAN";
324                 break;
325             case QTypeTuple.TYPECODE_CHAR:
326                 ptype = "PTypeSpaceMedor.CHAR";
327                 break;
328             case QTypeTuple.TYPECODE_DATE:
329                 ptype = "PTypeSpaceMedor.DATE";
330                 break;
331         }
332         bk.writeLine("return " + ptype + ";");
333         bk.closeBlock();
334
335         bk.newLine();
336         bk.closeBlock();
337         fw.close();
338     }
339
340     private String JavaDoc parserGenerateFiltStringExp(Expression[] regularExp)
341             throws ExpressionException {
342         Object JavaDoc[] polonfpf = regularExp;
343         Stack JavaDoc popBuffer = new Stack JavaDoc();
344         int cpt = 0;
345         //PType currentType = null;
346
Comparator c;
347         BinaryLogicalOperator bLogicop;
348         BinaryArithmeticOperator bArithOp;
349         Object JavaDoc op1,op2;
350         String JavaDoc leftOp,rightOp,opExp = "";
351         String JavaDoc operator;
352
353         while (cpt < polonfpf.length) {
354             if (polonfpf[cpt] instanceof Operand)
355                 popBuffer.push(polonfpf[cpt]);
356             else if (polonfpf[cpt] instanceof Comparator) {
357                 op2 = popBuffer.pop();
358                 op1 = popBuffer.pop();
359                 c = (Comparator) polonfpf[cpt];
360                 operator = c.getOperatorString();
361                 if (op1 instanceof Operand) {
362                     leftOp = getStringOperandExp((Operand) op1);
363                     //currentType = ((Operand) op1).getType();
364
} else
365                     leftOp = ((String JavaDoc) op1);
366
367                 if (op2 instanceof Operand) {
368                     rightOp = getStringOperandExp((Operand) op2);
369                 } else
370                     rightOp = ((String JavaDoc) op2);
371
372                 if (!c.getType().isa(PTypeSpace.STRING)) {
373                     opExp = "(" + leftOp + operator + rightOp + ")";
374                 } else {
375                     opExp = "(" + leftOp + "compareTo(" + rightOp + ")" + operator + "0)";
376                 }
377                 popBuffer.push(opExp);
378
379             } else if (polonfpf[cpt] instanceof BelongOperator) {
380                 op2 = popBuffer.pop();
381                 op1 = popBuffer.pop();
382
383                 if (op1 instanceof Operand) {
384                     leftOp = getStringOperandExp((Operand) op1);
385                 } else
386                     leftOp = ((String JavaDoc) op1);
387
388                 if (op2 instanceof Operand) {
389                     rightOp = getStringOperandExp((Operand) op2);
390                 } else
391                     rightOp = ((String JavaDoc) op2);
392
393                 opExp = "(new InTupleCollection().evaluate(leftOp , rightOp)";
394                 popBuffer.push(opExp);
395
396             } else if (polonfpf[cpt] instanceof BinaryLogicalOperator) {
397                 op2 = popBuffer.pop();
398                 op1 = popBuffer.pop();
399                 bLogicop = (BinaryLogicalOperator) polonfpf[cpt];
400                 operator = bLogicop.getOperatorString();
401                 if (op1 instanceof Operand) {
402                     leftOp = getStringOperandExp((Operand) op1);
403                 } else
404                     leftOp = ((String JavaDoc) op1);
405
406                 if (op2 instanceof Operand) {
407                     rightOp = getStringOperandExp((Operand) op2);
408                 } else
409                     rightOp = ((String JavaDoc) op2);
410
411                 opExp = "(" + leftOp + operator + rightOp + ")";
412                 popBuffer.push(opExp);
413
414             } else if (polonfpf[cpt] instanceof UnaryLogicalOperator) {
415                 op1 = popBuffer.pop();
416                 if (op1 instanceof Operand) {
417                     leftOp = getStringOperandExp((Operand) op1);
418                 } else
419                     leftOp = ((String JavaDoc) op1);
420
421                 opExp = "(!" + leftOp + ")";
422                 popBuffer.push(opExp);
423
424             } else if (polonfpf[cpt] instanceof BinaryArithmeticOperator) {
425                 op2 = popBuffer.pop();
426                 op1 = popBuffer.pop();
427                 bArithOp = (BinaryArithmeticOperator) polonfpf[cpt];
428                 operator = bArithOp.getOperatorString() + "";
429                 if ((op1 instanceof Operand) & (op2 instanceof Operand)) {
430                     PType typer = bArithOp.getType();
431                     switch (typer.getTypeCode()) {
432                         case QTypeTuple.TYPECODE_BYTE:
433                             opExp = bArithOp.evaluate(((Operand) op1).getByte(), ((Operand) op2).getByte()) + "";
434                             break;
435                         case QTypeTuple.TYPECODE_DOUBLE:
436                             opExp = bArithOp.evaluate(((Operand) op1).getDouble(), ((Operand) op2).getDouble()) + "";
437                             break;
438                         case QTypeTuple.TYPECODE_INT:
439                             opExp = bArithOp.evaluate(((Operand) op1).getInt(), ((Operand) op2).getInt()) + "";
440                             break;
441                         case QTypeTuple.TYPECODE_FLOAT:
442                             opExp = bArithOp.evaluate(((Operand) op1).getFloat(), ((Operand) op2).getFloat()) + "";
443                             break;
444                         case QTypeTuple.TYPECODE_LONG:
445                             opExp = bArithOp.evaluate(((Operand) op1).getLong(), ((Operand) op2).getLong()) + "";
446                             break;
447                         case QTypeTuple.TYPECODE_SHORT:
448                             opExp = bArithOp.evaluate(((Operand) op1).getShort(), ((Operand) op2).getShort()) + "";
449                             break;
450                     }
451                 } else {
452
453                     if (op1 instanceof Operand) {
454                         leftOp = getStringOperandExp((Operand) op1);
455                     } else
456                         leftOp = ((String JavaDoc) op1);
457
458                     if (op2 instanceof Operand) {
459                         rightOp = getStringOperandExp((Operand) op2);
460                     } else
461                         rightOp = ((String JavaDoc) op2);
462
463                     opExp = "(" + leftOp + operator + rightOp + ")";
464                 }
465                 popBuffer.push(opExp);
466
467             } else if (polonfpf[cpt] instanceof UnaryArithmeticOperator) {
468                 UnaryArithmeticOperator unArith = (UnaryArithmeticOperator) polonfpf[cpt];
469                 op1 = popBuffer.pop();
470                 if (op1 instanceof Operand) {
471                     leftOp = getStringOperandExp((Operand) op1);
472                 } else
473                     leftOp = ((String JavaDoc) op1);
474
475                 opExp = "(" + unArith.getOperatorString() + leftOp + ")";
476                 popBuffer.push(opExp);
477             }
478             cpt++;
479         }
480         return (String JavaDoc) popBuffer.pop();
481     }
482
483     private String JavaDoc getStringOperandExp(Operand op)
484             throws ExpressionException {
485         String JavaDoc operandExp = "";
486         int range;
487         PType type = op.getType();
488         switch (type.getTypeCode()) {
489             case QTypeTuple.TYPECODE_INT:
490                 if (op instanceof ParameterOperand) {
491                     operandExp = ((ParameterOperand) op).getName() + ".getInt()";
492                 } else if (op instanceof FieldOperand) {
493                     range = ((FieldOperand) op).getIndex();
494                     operandExp = "thisTuple.getInt(" + range + ")";
495                 } else
496                     operandExp = op.getInt() + "";
497                 break;
498             case QTypeTuple.TYPECODE_SHORT:
499                 if (op instanceof ParameterOperand) {
500                     operandExp = ((ParameterOperand) op).getName() + ".getShort()";
501                 } else if (op instanceof Operand)
502                     operandExp = op.getShort() + "";
503                 else if (op instanceof FieldOperand) {
504                     range = ((FieldOperand) op).getIndex();
505                     operandExp = "thisTuple.getShort(" + range + ")";
506                 }
507                 break;
508
509             case QTypeTuple.TYPECODE_DATE:
510                 if (op instanceof ParameterOperand) {
511                     operandExp = ((ParameterOperand) op).getName() + ".getByte()";
512                 } else if (op instanceof Operand)
513                     operandExp = op.getByte() + "";
514                 else if (op instanceof FieldOperand) {
515                     range = ((FieldOperand) op).getIndex();
516                     operandExp = "thisTuple.getByte(" + range + ")";
517                 }
518                 break;
519
520             case QTypeTuple.TYPECODE_LONG:
521                 if (op instanceof ParameterOperand) {
522                     operandExp = ((ParameterOperand) op).getName() + ".getLong()";
523                 } else if (op instanceof Operand)
524                     operandExp = op.getLong() + "";
525                 else if (op instanceof FieldOperand) {
526                     range = ((FieldOperand) op).getIndex();
527                     operandExp = "thisTuple.getLong(" + range + ")";
528                 }
529                 break;
530
531             case QTypeTuple.TYPECODE_DOUBLE:
532                 if (op instanceof ParameterOperand) {
533                     operandExp = ((ParameterOperand) op).getName() + ".getDouble()";
534                 } else if (op instanceof Operand)
535                     operandExp = op.getDouble() + "";
536                 else if (op instanceof FieldOperand) {
537                     range = ((FieldOperand) op).getIndex();
538                     operandExp = "thisTuple.getDouble(" + range + ")";
539                 }
540                 break;
541
542             case QTypeTuple.TYPECODE_FLOAT:
543                 if (op instanceof ParameterOperand) {
544                     operandExp = ((ParameterOperand) op).getName() + ".getFloat()";
545                 } else if (op instanceof Operand)
546                     operandExp = op.getFloat() + "";
547                 else if (op instanceof FieldOperand) {
548                     range = ((FieldOperand) op).getIndex();
549                     operandExp = "thisTuple.getFloat(" + range + ")";
550                 }
551                 break;
552
553             case QTypeTuple.TYPECODE_BOOLEAN:
554                 if (op instanceof ParameterOperand) {
555                     operandExp = ((ParameterOperand) op).getName() + ".getBoolean()";
556                 } else if (op instanceof Operand)
557                     operandExp = op.getBoolean() + "";
558                 else if (op instanceof FieldOperand) {
559                     range = ((FieldOperand) op).getIndex();
560                     operandExp = "thisTuple.getBoolean(" + range + ")";
561                 }
562                 break;
563
564             case QTypeTuple.TYPECODE_CHAR:
565                 if (op instanceof ParameterOperand) {
566                     operandExp = ((ParameterOperand) op).getName() + ".getChar()";
567                 } else if (op instanceof Operand)
568                     operandExp = op.getChar() + "";
569                 else if (op instanceof FieldOperand) {
570                     range = ((FieldOperand) op).getIndex();
571                     operandExp = "thisTuple.getChar(" + range + ")";
572                 }
573                 break;
574
575             case QTypeTuple.TYPECODE_STRING:
576                 if (op instanceof ParameterOperand) {
577                     operandExp = ((ParameterOperand) op).getName() + ".getString()";
578                 } else if (op instanceof Operand)
579                     operandExp = op.getString();
580                 else if (op instanceof FieldOperand) {
581                     range = ((FieldOperand) op).getIndex();
582                     operandExp = "thisTuple.getString(" + range + ")";
583                 }
584                 break;
585
586             default:
587                 /* first case: TupleCollection */
588                 if (type.getJormName().equals("collection")) {
589                     if (op instanceof ParameterOperand) {
590                         operandExp = ((ParameterOperand) op).getName() + ".getTupleCollection()";
591                     } else if (op instanceof Operand)
592                         operandExp = op.getObject() + "";
593                     else if (op instanceof FieldOperand) {
594                         range = ((FieldOperand) op).getIndex();
595                         operandExp = "thisTuple.getTupleCollection(" + range + ")";
596                     }
597                     break;
598                 } else if (type.getJormName().equals("tuple")) {
599
600                     if (op instanceof ParameterOperand) {
601                         operandExp = ((ParameterOperand) op).getName() + ".getTuple()";
602                     } else if (op instanceof Operand)
603                         operandExp = op.getObject() + "";
604                     else if (op instanceof FieldOperand) {
605                         range = ((FieldOperand) op).getIndex();
606                         operandExp = "thisTuple.getTuple(" + range + ")";
607
608                     }
609                     break;
610                 }
611         }
612
613         return operandExp;
614     }
615
616     public Iterator JavaDoc getSourceFileIterator() {
617         return queryFiltersHolder.iterateFile();
618     }
619
620     /**
621      * In this case we will load the query filters generated class into the vm
622      * and reaffect them to the new QueryTree
623      */

624     public QueryTree transform(QueryTree query) throws MedorException {
625         this.queryTree = query;
626         //TODO ajouter l'appel ŕ la vérification des filter et des
627
//tuplestructure (voir interface QueryIndexGenerator).
628
//parcouring and changing the queryFilters
629
builtAllFilterSources();
630         builtAllTCTypeSources();
631         Vector JavaDoc list = new Vector JavaDoc();
632         Iterator JavaDoc i1 = queryFiltersHolder.iterateFile();
633         Iterator JavaDoc i2 = tcTypeHolder.iterateFile();
634         while (i1.hasNext()) {
635             list.add(i1.next());
636         }
637         while (i2.hasNext()) {
638             list.add(i2.next());
639         }
640         javac(list.elements());
641         //QueryTree copy = (QueryTree) queryTree.clone();
642
QueryTree copy = queryTree;
643         library.add(sourceDirectory);
644         mcl = new DirsCompileClassLoader(library);
645         nbrFilter = 0;
646         nbrQTType = 0;
647         compileFilters(copy, javaFilterName + nbrFilter);
648         compileQueryTreeType(copy, javaTCTypeFileName + nbrQTType);
649         //i++;
650
return copy;
651     }
652
653     private void compileFilters(QueryTree query, String JavaDoc fileName)
654             throws MedorException {
655         Class JavaDoc c = null;
656         try {
657             //int i = 0;
658
if ((query instanceof QueryNode) &&
659                     (((QueryNode) query).getQueryFilter() != null)) {
660                 nbrFilter++;
661                 c = mcl.loadClass("org.objectweb.medor.filter.lib.postFixeForm.generated." + fileName);
662                 Object JavaDoc o = c.newInstance();
663                 Expression predicate = (Expression) o;
664                 ((QueryNode) query).setQueryFilter(predicate);
665                 QueryTree[] qts = ((QueryNode) query).getChildren();
666
667                 for (int cpt = 0; (cpt < qts.length); cpt++) {
668
669                     compileFilters(qts[cpt], javaFilterName + nbrFilter);
670
671                 }
672             }
673         } catch (ClassNotFoundException JavaDoc exp) {
674             throw new MedorException("THIS CLASS NOT EXIST TRY TO COMPILE AT FIRST");
675         } catch (InstantiationException JavaDoc iexo) {
676         } catch (IllegalAccessException JavaDoc e) {
677         }
678     }
679
680     private void compileQueryTreeType(QueryTree query, String JavaDoc fileName)
681             throws MedorException {
682         Class JavaDoc c = null;
683         try {
684             //int i = 0;
685
if ((query instanceof QueryNode) &&
686                     ((QueryNode) query).getTupleLoader() != null) {
687                 nbrQTType++;
688                 c = mcl.loadClass("org.objectweb.medor.query.lib.generated." + fileName);
689                 Object JavaDoc o = c.newInstance();
690                 TupleLoader tLoader = (TupleLoader) o;
691                 ((QueryNode) query).setTupleLoader(tLoader);
692                 //TODO verifier que c'est un noeud
693
QueryTree[] qts = ((QueryNode) query).getChildren();
694
695                 for (int cpt = 0; (cpt < qts.length); cpt++) {
696                     compileQueryTreeType(qts[cpt], javaTCTypeFileName + nbrQTType);
697                 }
698             }
699         } catch (ClassNotFoundException JavaDoc exp) {
700             throw new MedorException("THIS CLASS May be NOT EXIST TRY TO COMPILE AT FIRST or correct the classpath");
701         } catch (InstantiationException JavaDoc iexo) {
702         } catch (IllegalAccessException JavaDoc e) {
703         }
704     }
705
706     /**
707      * Java compilation of all generated QueryFilter java Sources
708      * @param listFile the list of files to be compiled
709      */

710     private void javac(Enumeration JavaDoc listFile) {
711
712         Runtime JavaDoc rt = Runtime.getRuntime();
713         Process JavaDoc p;
714         // Compilation by javac or we can imagine an other compilator
715
try {
716             System.out.println("Launching javac ...");
717             String JavaDoc classpath = "";
718             String JavaDoc sourceFiles = sourceDirectory + File.separator;
719             Iterator JavaDoc i = library.iterator();
720             if (i.hasNext()) classpath = classpath + ((String JavaDoc) i.next());
721             while (i.hasNext()) {
722                 classpath = classpath + File.pathSeparator + ((String JavaDoc) i.next());
723             }
724
725             if (listFile.hasMoreElements()) {
726                 File JavaDoc f = (File JavaDoc) listFile.nextElement();
727                 String JavaDoc s = f.getName();
728                 sourceFiles = sourceFiles + s;
729             }
730
731             while (listFile.hasMoreElements()) {
732                 File JavaDoc f = (File JavaDoc) listFile.nextElement();
733                 String JavaDoc s = f.getName();
734                 sourceFiles = sourceFiles + " " + sourceDirectory + File.separator + s;// Only For Windows classpath
735
}
736
737             String JavaDoc cmd = "javac -classpath " + classpath + " " + "-d " + classDirectory + " " + sourceFiles;
738             System.out.println(cmd);
739             p = rt.exec(cmd);
740             p.waitFor();
741             System.out.println("Compilation finisched ...");
742
743         } catch (IOException JavaDoc e) {
744             System.err.println(" Compilation failed... " + e.getMessage());
745
746         } catch (InterruptedException JavaDoc e) {
747             System.err.println(" Compilation failed... " + e.getMessage());
748         }
749     }
750
751     public void addLibraryPath(String JavaDoc classpath) throws MedorException {
752
753         File JavaDoc tadir = new File JavaDoc(classpath);
754         if (!tadir.exists()) {
755             throw new MedorException("the path library " + classpath + "does not exist");
756         }
757         library.add(classpath);
758     }
759
760     public Iterator JavaDoc getPathsIterator() {
761         return library.iterator();
762     }
763 }
764
Popular Tags