View Javadoc

1   package pl.aislib.tools.mapping.generators;
2   
3   import java.io.File;
4   import java.io.FileWriter;
5   import java.io.IOException;
6   import java.io.Writer;
7   import java.util.Iterator;
8   import java.util.List;
9   
10  import pl.aislib.tools.mapping.Generator;
11  import pl.aislib.tools.mapping.structure.Field;
12  import pl.aislib.tools.mapping.structure.Fields;
13  import pl.aislib.tools.mapping.structure.JavaClass;
14  import pl.aislib.tools.mapping.structure.JavaField;
15  import pl.aislib.tools.mapping.structure.Structure;
16  
17  /***
18   * <CODE>handlers</CODE> (describe/populate) generator.
19   *
20   * @author Milosz Tylenda, AIS.PL (milosz@ais.pl)
21   * $Revision: 1.8 $
22   */
23  public class MapHelperGenerator extends Generator {
24  
25    private File baseDir;
26  
27    private MiscPutter miscPutter     = new MiscPutter();
28    private MethodPutter methodPutter = new MethodPutter();
29    private Writer writer;
30  
31    private File initDirectory(File destinationDir) throws IOException {
32      File dir = new File(destinationDir.getPath() + File.separator + mapHandlersSubdir);
33      if (!dir.exists()) {
34        dir.mkdirs();
35      }
36      return dir;
37    }
38  
39    private void initWriter(String className) throws IOException {
40      writer = new FileWriter(baseDir.getPath() + File.separator + className + "Handler.java");
41    }
42  
43    private void closeWriter() throws IOException {
44      writer.close();
45    }
46  
47    public void generate() throws IOException {
48      baseDir = initDirectory(destinationDir);
49      List structureList = database.getStructureList();
50      for (int i = 0, size = structureList.size() ; i < size ; i++) {  // all structures
51        Structure structure = (Structure) structureList.get(i);
52        JavaClass javaClass = structure.getJavaClass();
53        Fields    fields    = structure.getFields();
54        methodPutter.setProperties(javaClass, fields);
55        initWriter(javaClass.getName());    // open file
56        miscPutter.setWriter(writer);       // set writer on each putter
57        methodPutter.setWriter(writer);
58  
59        // Now we flush all the source code to a file
60        miscPutter.putHeader(packageName, javaClass.getName());
61        methodPutter.put();
62        miscPutter.putClassEndBrace();
63        closeWriter();
64      }
65      log(structureList.size() + " " + mapHandlersSubpackage + ".XHandler class(es) generated");
66    }
67  
68  
69    //#############################  POPULATE/DESCRIBE  ###########################
70    /***
71     * Puts <code>describe/populate/carefulPopulate</code> methods.
72     * @author Milosz Tylenda, AIS.PL
73     */
74    class MethodPutter {
75  
76      private Writer writer;
77      private JavaClass javaClass;
78      private Fields    fields;
79  
80      public void setWriter(Writer awriter) {
81        writer = awriter;
82      }
83  
84      public void put() throws IOException {
85        String className = javaClass.getName();
86        List fieldList = fields.getFieldList();
87        writer.write("\n");
88        writer.write("  public static Map describe(" + className + " object) {\n");
89        writer.write("    Map result = new HashMap(" + fieldList.size() + ");\n");
90        for (Iterator fieldIter = fieldList.listIterator() ; fieldIter.hasNext() ; ) {
91          Field field         = (Field) fieldIter.next();
92          JavaField javaField = field.getJavaField();
93          String name         = javaField.getName();
94          String capName      = Utils.capitalize(name);
95          writer.write("    if (object.get" + capName + "() != null) {\n");
96          writer.write("      result.put(\"" + name + "\", object.get" + capName + "());\n");
97          writer.write("    }\n");
98        }
99        writer.write("    return result;\n");
100       writer.write("  }\n");
101 
102       writer.write("  public static void populate(" + className + " object, Map properties) {\n");
103       for (Iterator fieldIter = fieldList.listIterator() ; fieldIter.hasNext() ; ) {
104         Field field         = (Field) fieldIter.next();
105         JavaField javaField = field.getJavaField();
106         String name         = javaField.getName();
107         String type         = javaField.getType();
108         String capName      = Utils.capitalize(name);
109         writer.write("    if (properties.containsKey(\"" + name + "\")) {\n");
110         writer.write("      object.set" + capName + "((" + type + ") properties.get(\"" + name + "\"));\n");
111         writer.write("    }\n");
112       }
113       writer.write("  }\n");
114 
115       writer.write("  public static void carefulPopulate(" + className + " object, Map properties) {\n");
116       for (Iterator fieldIter = fieldList.listIterator() ; fieldIter.hasNext() ; ) {
117         Field field         = (Field) fieldIter.next();
118         JavaField javaField = field.getJavaField();
119         String name         = javaField.getName();
120         String type         = javaField.getType();
121         String capName      = Utils.capitalize(name);
122         writer.write("    if ((properties.containsKey(\"" + name + "\"))\n");
123         writer.write("      && (properties.get(\"" + name + "\") instanceof ");
124         writer.write(type + ")) {\n");
125         writer.write("      object.set" + capName + "((" + type + ") properties.get(\"" + name + "\"));\n");
126         writer.write("    }\n");
127       }
128       writer.write("  }\n");
129     }
130 
131     public void setProperties(JavaClass javaClass, Fields fields) {
132       this.javaClass = javaClass;
133       this.fields = fields;
134     }
135   } // class MethodPutter
136 
137 
138   //#############################  MISC  ###########################
139   /***
140    * Puts some little things like a <CODE>package</CODE> string and a class ending brace.
141    * @author Milosz Tylenda, AIS.PL
142    */
143   class MiscPutter {
144 
145     private Writer writer;
146 
147     public void setWriter(Writer awriter) {
148       writer = awriter;
149     }
150 
151     publicong> void putHeader(String packagePrefix, String className) throws IOException {
152       writer.write("package " + packagePrefix + "." + mapHandlersSubpackage + ";\n\n");
153       writer.write("// THIS FILE HAS BEEN GENERATED AUTOMAGICALLY. DO NOT EDIT!\n\n");
154       writer.write("import java.math.BigDecimal;\n\n");
155       writer.write("import java.sql.Array;\n");
156       writer.write("import java.sql.Timestamp;\n\n");
157       writer.write("import java.util.Map;\n");
158       writer.write("import java.util.HashMap;\n\n");
159       writer.write("import " + packagePrefix + "." + objectsSubpackage + "." + className + ";\n\n");
160       writer.write("public class " + className + "Handler {\n");
161     }
162 
163     public void putClassEndBrace() throws IOException {
164       writer.write("}\n");
165     }
166   } // class MiscPutter
167 
168 
169 }
170 
171 /***
172  * $Log: MapHelperGenerator.java,v $
173  * Revision 1.8  2004/08/11 12:41:01  wswiatek
174  * Database and map handlers location are now parametrizable.
175  * Maven plugin version changed to 1.0.1
176  *
177  * Revision 1.7  2004/06/17 06:37:12  milosz
178  * Added missing import of java.sql.Array to generated code.
179  *
180  * Revision 1.6  2003/10/29 11:47:02  pikus
181  * use ant logger where possible
182  *
183  * Revision 1.5  2003/07/11 13:08:14  milosz
184  * objectsSubpackage property added.
185  *
186  * Revision 1.4  2003/05/26 08:36:03  pikus
187  * cleanup imports
188  *
189  * Revision 1.3  2002/10/08 08:27:10  milosz
190  * Generators became AntTasks(?). Ufff...
191  *
192  * Revision 1.2  2002/10/04 13:07:22  milosz
193  * Reaching old mapping's functionality.
194  *
195  */
196