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++) {
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());
56 miscPutter.setWriter(writer);
57 methodPutter.setWriter(writer);
58
59
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
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 }
136
137
138
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 public void putHeader(String packagePrefix, String className) throws IOException {/package-summary.html">ong> 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 }
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