KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > compiere > util > GenerateModel


1 /******************************************************************************
2  * The contents of this file are subject to the Compiere License Version 1.1
3  * ("License"); You may not use this file except in compliance with the License
4  * You may obtain a copy of the License at http://www.compiere.org/license.html
5  * Software distributed under the License is distributed on an "AS IS" basis,
6  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
7  * the specific language governing rights and limitations under the License.
8  * The Original Code is Compiere ERP & CRM Smart Business Solution
9  * The Initial Developer of the Original Code is Jorg Janke and ComPiere, Inc.
10  * Portions created by Jorg Janke are Copyright (C) 1999-2003 Jorg Janke, parts
11  * created by ComPiere are Copyright (C) ComPiere, Inc.; All Rights Reserved.
12  * Contributor(s): ______________________________________.
13  *****************************************************************************/

14 package org.compiere.util;
15
16 import java.sql.*;
17 import java.io.*;
18 import java.math.*;
19
20 /**
21  * Generate Model Classes extending PO.
22  * Base class for CMP interface - will be extended to create byte code directly
23  *
24  * @author Jorg Janke
25  * @version $Id: GenerateModel.java,v 1.9 2003/10/31 05:30:56 jjanke Exp $
26  */

27 public class GenerateModel
28 {
29     /**
30      * Generate PO Class
31      * @param AD_Table_ID table id
32      * @param directory directory with \ or / at the end.
33      */

34     public GenerateModel (int AD_Table_ID, String JavaDoc directory)
35     {
36         // create column access methods
37
StringBuffer JavaDoc mandatory = new StringBuffer JavaDoc();
38         StringBuffer JavaDoc sb = createColumns(AD_Table_ID, mandatory);
39         // add header stuff
40
String JavaDoc tableName = createHeader(AD_Table_ID, sb, mandatory);
41         // Save it
42
writeToFile (sb, directory + tableName + ".java");
43     } // GenerateModel
44

45     /**
46      * Add Header info to buffer
47      * @param AD_Table_ID table
48      * @param sb buffer
49      * @param mandatory init call for mandatory columns
50      * @return class name
51      */

52     private String JavaDoc createHeader (int AD_Table_ID, StringBuffer JavaDoc sb, StringBuffer JavaDoc mandatory)
53     {
54         String JavaDoc tableName = "";
55         String JavaDoc sql = "SELECT TableName FROM AD_Table WHERE AD_Table_ID=?";
56         PreparedStatement pstmt = null;
57         try
58         {
59             pstmt = DB.prepareStatement(sql);
60             pstmt.setInt(1, AD_Table_ID);
61             ResultSet rs = pstmt.executeQuery();
62             if (rs.next())
63                 tableName = rs.getString(1);
64             rs.close();
65             pstmt.close();
66             pstmt = null;
67         }
68         catch (Exception JavaDoc e)
69         {
70             Log.error("GenerateModel.createHeader", e);
71         }
72         finally
73         {
74             try
75             {
76                 if (pstmt != null)
77                     pstmt.close ();
78             }
79             catch (Exception JavaDoc e)
80             {}
81             pstmt = null;
82         }
83         if (tableName == null)
84             throw new RuntimeException JavaDoc ("TableName not found for ID=" + AD_Table_ID);
85         //
86
String JavaDoc keyColumn = tableName + "_ID";
87         String JavaDoc className = "X_" + tableName;
88         //
89
StringBuffer JavaDoc start = new StringBuffer JavaDoc ()
90             .append (
91             "/** Generated Model - DO NOT CHANGE - Copyright (C) 1999-2003 Jorg Janke **/\n"
92             + "package org.compiere.model;"
93             + "import java.util.*;"
94             + "import java.sql.*;"
95             + "import java.math.*;"
96             + "import java.io.Serializable;"
97             + "import org.compiere.util.*;"
98             // Constructor
99
+ "/** Generated Model for ").append(tableName).append("\n"
100             + " ** @version $Id: GenerateModel.java,v 1.9 2003/10/31 05:30:56 jjanke Exp $ **/\n"
101             + "public class ").append(className).append(" extends PO"
102             + "{"
103             //
104
+ "/** Standard Constructor **/\n"
105             + "public ").append(className).append(" (Properties ctx, int ").append(keyColumn).append(")"
106             + "{"
107             + "super (ctx, ").append(keyColumn).append(");"
108             + "/** if (").append(keyColumn).append(" == 0)"
109             + "{").append(mandatory).append("} **/\n"
110             + "}" // Constructor End
111
// Load Constructor
112
+ "/** Load Constructor **/\n"
113             + "public ").append(className).append(" (Properties ctx, ResultSet rs)"
114             + "{"
115             + "super (ctx, rs);"
116             + "}" // Load Constructor End
117
//
118
+ "/** Load Meta Data **/\n"
119             + "protected POInfo initPO (Properties ctx)"
120             + "{"
121             + "int AD_Table_ID = ").append(AD_Table_ID).append(";"
122             + "POInfo poi = POInfo.getPOInfo (ctx, AD_Table_ID);"
123             + "return poi;"
124             + "}" // initPO
125
//
126
+ "public String toString()"
127             + "{"
128             + "StringBuffer sb = new StringBuffer (\"").append(className).append("[\")"
129             + ".append(getID()).append(\"]\");"
130             + "return sb.toString();"
131             + "}");
132
133         StringBuffer JavaDoc end = new StringBuffer JavaDoc ("}");
134         //
135
sb.insert(0, start);
136         sb.append(end);
137
138         return className;
139     } // createHeader
140

141
142     /**
143      * Create Column access methods
144      * @param AD_Table_ID table
145      * @param mandatory init call for mandatory columns
146      * @return set/get method
147      */

148     private StringBuffer JavaDoc createColumns (int AD_Table_ID, StringBuffer JavaDoc mandatory)
149     {
150         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
151         String JavaDoc sql = "SELECT c.ColumnName, c.IsUpdateable, c.IsMandatory,"
152             + " c.AD_Reference_ID, c.AD_Reference_Value_ID "
153             + "FROM AD_Column c "
154             + "WHERE c.AD_Table_ID=?"
155             + " AND c.ColumnName <> 'AD_Client_ID'"
156             + " AND c.ColumnName <> 'AD_Org_ID'"
157             + " AND c.ColumnName <> 'IsActive'"
158             + " AND c.ColumnName NOT LIKE 'Created%'"
159             + " AND c.ColumnName NOT LIKE 'Updated%' "
160             + "ORDER BY c.ColumnName";
161         PreparedStatement pstmt = null;
162         try
163         {
164             pstmt = DB.prepareStatement(sql);
165             pstmt.setInt(1, AD_Table_ID);
166             ResultSet rs = pstmt.executeQuery();
167             while (rs.next())
168             {
169                 String JavaDoc columnName = rs.getString(1);
170                 boolean isUpdateable = "Y".equals(rs.getString(2));
171                 boolean isMandatory = "Y".equals(rs.getString(3));
172                 int displayType = rs.getInt(4);
173                 int AD_Reference_Value_ID = rs.getInt(5);
174                 //
175
sb.append(createMethods (mandatory,
176                   columnName, isUpdateable, isMandatory, displayType, AD_Reference_Value_ID));
177             }
178             rs.close();
179             pstmt.close();
180             pstmt = null;
181         }
182         catch (Exception JavaDoc e)
183         {
184             Log.error("GenerateModel.createColumns", e);
185         }
186         finally
187         {
188             try
189             {
190                 if (pstmt != null)
191                     pstmt.close ();
192             }
193             catch (Exception JavaDoc e)
194             {}
195             pstmt = null;
196         }
197         return sb;
198     } // createColumns
199

200     /**
201      * Create set/get methods
202      * @param mandatory init call for mandatory columns
203      * @param columnName column name
204      * @param isUpdateable updateable
205      * @param isMandatory mandatory
206      * @param displayType display type
207      * @param AD_Reference_ID validation reference
208      * @return set/get method
209      */

210     private String JavaDoc createMethods (StringBuffer JavaDoc mandatory,
211         String JavaDoc columnName, boolean isUpdateable, boolean isMandatory,
212         int displayType, int AD_Reference_ID)
213     {
214         Class JavaDoc clazz = DisplayType.getClass(displayType, true);
215         // Handle Posted
216
if (columnName.equalsIgnoreCase("Posted"))
217         {
218             clazz = Boolean JavaDoc.class;
219             AD_Reference_ID = 0;
220         }
221         // Record_ID
222
else if (columnName.equalsIgnoreCase("Record_ID"))
223         {
224             clazz = Integer JavaDoc.class;
225             AD_Reference_ID = 0;
226         }
227         // String Key
228
else if (DisplayType.isID(displayType) && // MInstance_Para.SeqNo is a Key
229
!((columnName.endsWith("_ID") || columnName.endsWith("No"))))
230             clazz = String JavaDoc.class;
231             
232         // Data Type
233
String JavaDoc dataType = clazz.getName();
234         dataType = dataType.substring(dataType.lastIndexOf('.')+1);
235         if (dataType.equals("Boolean"))
236             dataType = "boolean";
237         else if (dataType.equals("Integer"))
238             dataType = "int";
239
240         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
241
242         // Set ********
243
String JavaDoc setValue = "setValue";
244         // public void setColumn (xxx variable)
245
if (isUpdateable)
246             sb.append("public ");
247         else
248             setValue = "setValueNoCheck";
249         sb.append("void set").append(columnName).append(" (").append(dataType).append(" ").append(columnName).append(")"
250             + "{");
251         // List Validation
252
if (AD_Reference_ID != 0)
253         {
254             String JavaDoc staticVar = addListValidation (sb, AD_Reference_ID, columnName);
255             sb.insert(0, staticVar);
256         }
257         // setValue ("ColumnName", xx);
258
if (clazz.equals(Integer JavaDoc.class))
259         {
260             if (columnName.endsWith("_ID") && !isMandatory) // set uptional _ID to null if 0
261
sb.append("if (").append (columnName).append (" == 0) ")
262                     .append(setValue).append(" (\"").append(columnName).append("\", null); else \n");
263             sb.append(setValue).append(" (\"").append(columnName).append("\", new Integer(").append(columnName).append("));");
264         }
265         else if (clazz.equals(Boolean JavaDoc.class))
266             sb.append(setValue).append(" (\"").append(columnName).append("\", new Boolean(").append(columnName).append("));");
267         else
268         {
269             if (isMandatory) // does not apply to int/boolean
270
sb.append ("if (").append (columnName).append (" == null)"
271                   + " throw new IllegalArgumentException (\"").append(columnName).append(" is mandatory\");");
272             //
273
sb.append (setValue).append(" (\"").append (columnName).append ("\", ")
274                 .append (columnName).append (");");
275         }
276         sb.append("}");
277
278         // Mandatory call in constructor
279
if (isMandatory)
280         {
281             mandatory.append("set").append(columnName).append(" (");
282             if (clazz.equals(Integer JavaDoc.class))
283                 mandatory.append("0");
284             else if (clazz.equals(Boolean JavaDoc.class))
285                 mandatory.append("false");
286             else if (clazz.equals(BigDecimal.class))
287                 mandatory.append("Env.ZERO");
288             else if (clazz.equals(Timestamp.class))
289                 mandatory.append("new Timestamp(System.currentTimeMillis())");
290             else
291                 mandatory.append("null");
292             mandatory.append(");");
293         }
294
295         // Get ********
296
sb.append("public ").append(dataType);
297         if (clazz.equals(Boolean JavaDoc.class))
298         {
299             sb.append(" is");
300             if (columnName.toLowerCase().startsWith("is"))
301                 sb.append(columnName.substring(2));
302             else
303                 sb.append(columnName);
304         }
305         else
306             sb.append(" get").append(columnName);
307         sb.append("() {");
308         if (clazz.equals(Integer JavaDoc.class))
309             sb.append("Integer ii = (Integer)getValue(\"").append(columnName).append("\");"
310                 + "if (ii == null)"
311                 + " return 0;"
312                 + "return ii.intValue();");
313         else if (clazz.equals(BigDecimal.class))
314             sb.append("BigDecimal bd = (BigDecimal)getValue(\"").append(columnName).append("\");"
315                 + "if (bd == null)"
316                 + " return Env.ZERO;"
317                 + "return bd;");
318         else if (clazz.equals(Boolean JavaDoc.class))
319             sb.append("Boolean bb = (Boolean)getValue(\"").append(columnName).append("\");"
320                 + "if (bb != null)"
321                 + " return bb.booleanValue();"
322                 + "return false;");
323         else if (dataType.equals("Object"))
324             sb.append("return getValue(\"").append(columnName).append("\");");
325         else
326             sb.append("return (").append(dataType).append(")getValue(\"").append(columnName).append("\");");
327         sb.append("}");
328         //
329
return sb.toString();
330     } // createMethods
331

332     /**
333      * Add List Validation
334      * @param sb buffer
335      * @param AD_Reference_ID reference
336      * @param columnName column
337      * @return static parameter
338      */

339     private String JavaDoc addListValidation (StringBuffer JavaDoc sb, int AD_Reference_ID, String JavaDoc columnName)
340     {
341         StringBuffer JavaDoc retValue = new StringBuffer JavaDoc();
342         //
343
boolean found = false;
344         StringBuffer JavaDoc values = new StringBuffer JavaDoc("Reference_ID=")
345             .append(AD_Reference_ID);
346         StringBuffer JavaDoc statement = new StringBuffer JavaDoc();
347         String JavaDoc sql = "SELECT Value, Name FROM AD_Ref_List WHERE AD_Reference_ID=?";
348         PreparedStatement pstmt = null;
349         try
350         {
351             pstmt = DB.prepareStatement(sql);
352             pstmt.setInt(1, AD_Reference_ID);
353             ResultSet rs = pstmt.executeQuery();
354             while (rs.next())
355             {
356                 String JavaDoc value = rs.getString(1);
357                 values.append(" - ").append(value);
358                 if (statement.length() == 0)
359                     statement.append("if (").append(columnName).append(".equals(\"").append(value).append("\")");
360                 else
361                     statement.append(" || ").append(columnName).append(".equals(\"").append(value).append("\")");
362                 found = true;
363                 // Name (SmallTalkNotation)
364
String JavaDoc name = rs.getString(2);
365                 char[] nameArray = name.toCharArray();
366                 StringBuffer JavaDoc nameClean = new StringBuffer JavaDoc();
367                 boolean initCap = true;
368                 for (int i = 0; i < nameArray.length; i++)
369                 {
370                     char c = nameArray[i];
371                     if (Character.isJavaIdentifierPart(c))
372                     {
373                         if (initCap)
374                             nameClean.append(Character.toUpperCase(c));
375                         else
376                             nameClean.append(c);
377                         initCap = false;
378                     }
379                     else
380                     {
381                         if (c == '+')
382                             nameClean.append("Plus");
383                         else if (c == '-')
384                             nameClean.append("Minus");
385                         else if (c == '>')
386                             nameClean.append("Gt");
387                         else if (c == '<')
388                             nameClean.append("Le");
389                         else if (c == '=')
390                             nameClean.append("Eq");
391                         else if (c == '~')
392                             nameClean.append("Like");
393                         initCap = true;
394                     }
395                 }
396                 retValue.append("public static final String ").append(columnName.toUpperCase())
397                     .append("_").append(nameClean)
398                     .append(" = \"").append(value).append("\";");
399             }
400             rs.close();
401             pstmt.close();
402             pstmt = null;
403         }
404         catch (Exception JavaDoc e)
405         {
406             Log.error("GenerateMethod.addListValidation", e);
407             found = false;
408         }
409         finally
410         {
411             try
412             {
413                 if (pstmt != null)
414                     pstmt.close ();
415             }
416             catch (Exception JavaDoc e)
417             {}
418             pstmt = null;
419         }
420         statement.append(")"
421             + "; "
422             + "else "
423             + "throw new IllegalArgumentException (\"").append(columnName)
424             .append(" Invalid value - ").append(values).append("\");");
425         //
426
if (found)
427             sb.append (statement);
428         return retValue.toString();
429     } // addListValidation
430

431     /*************************************************************************/
432
433     /**
434      * Write to file
435      * @param sb string buffer
436      * @param fileName file name
437      */

438     private void writeToFile (StringBuffer JavaDoc sb, String JavaDoc fileName)
439     {
440         boolean wroteCR = false;
441
442         try
443         {
444             File out = new File (fileName);
445             FileWriter fw = new FileWriter (out);
446             for (int i = 0; i < sb.length(); i++)
447             {
448                 char c = sb.charAt(i);
449                 // after
450
if (c == ';' || c == '}')
451                 {
452                     fw.write (c);
453                     fw.write(Env.NL);
454                 }
455                 // before & after
456
else if (c == '{')
457                 {
458                     fw.write(Env.NL);
459                     fw.write (c);
460                     fw.write(Env.NL);
461                 }
462                 else
463                     fw.write (c);
464             }
465             fw.flush ();
466             fw.close ();
467             float size = out.length();
468             size /= 1024;
469             Log.trace(Log.l1_User, out.getAbsolutePath() + " - " + size + " kB");
470         }
471         catch (Exception JavaDoc ex)
472         {
473             Log.error("GenerateModel.writeToFile", ex);
474         }
475     } // writeToFile
476

477     /**
478      * String representation
479      * @return string representation
480      */

481     public String JavaDoc toString()
482     {
483         StringBuffer JavaDoc sb = new StringBuffer JavaDoc ("GenerateModel[")
484             .append("]");
485         return sb.toString();
486     } // toString
487

488
489
490     /*************************************************************************/
491
492     /**
493      * Generate PO Model Class.
494      * @param args directory entityType
495      * Example java GenerateModel.class mydirectory UA
496      * would generate entity type User and Application classes into mydirectory
497      */

498     public static void main (String JavaDoc[] args)
499     {
500         // first parameter
501
String JavaDoc directory = "C:\\Compiere\\compiere-all2\\dbPort\\src\\org\\compiere\\model\\";
502         if (args.length > 0)
503             directory = args[0];
504         if (directory == null || directory.length() == 0)
505         {
506             System.err.println("No Directory");
507             System.exit(1);
508         }
509         
510         // second parameter
511
String JavaDoc entityType = "DC"; // Directory & Compiere
512
if (args.length > 1)
513             entityType = args[1];
514         if (entityType == null || entityType.length() == 0)
515         {
516             System.err.println("No EntityType");
517             System.exit(1);
518         }
519         StringBuffer JavaDoc sql = new StringBuffer JavaDoc("EntityType IN (");
520         for (int i = 0; i < entityType.length(); i++)
521         {
522             if (i > 0)
523                 sql.append(",");
524             sql.append("'").append(entityType.charAt(i)).append("'");
525         }
526         sql.append(")"); // close IN
527
System.out.println("Generate Model to " + directory + " for " + sql);
528         System.out.println("-----------------------------------------------");
529         
530         // complete sql
531
sql.insert(0, "SELECT AD_Table_ID "
532             + "FROM AD_Table "
533             + "WHERE IsView='N' AND TableName NOT LIKE '%_Trl' AND ");
534         sql.append(" ORDER BY TableName");
535         
536         //
537
org.compiere.Compiere.startupClient();
538         int count = 0;
539         PreparedStatement pstmt = null;
540         try
541         {
542             pstmt = DB.prepareStatement(sql.toString());
543             ResultSet rs = pstmt.executeQuery();
544             while (rs.next())
545             {
546                 new GenerateModel(rs.getInt(1), directory);
547                 count++;
548             }
549             rs.close();
550             pstmt.close();
551             pstmt = null;
552         }
553         catch (Exception JavaDoc e)
554         {
555             System.err.println("GenerateModel.main - " + e);
556         }
557         finally
558         {
559             try
560             {
561                 if (pstmt != null)
562                     pstmt.close ();
563             }
564             catch (Exception JavaDoc e)
565             {}
566             pstmt = null;
567         }
568         System.out.println("Generated = " + count);
569
570     } // main
571

572 } // GenerateModel
573
Popular Tags