Return-Path: Delivered-To: apmail-incubator-empire-db-commits-archive@minotaur.apache.org Received: (qmail 9047 invoked from network); 17 Nov 2009 23:57:20 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 17 Nov 2009 23:57:20 -0000 Received: (qmail 54891 invoked by uid 500); 17 Nov 2009 23:57:20 -0000 Delivered-To: apmail-incubator-empire-db-commits-archive@incubator.apache.org Received: (qmail 54874 invoked by uid 500); 17 Nov 2009 23:57:20 -0000 Mailing-List: contact empire-db-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: empire-db-dev@incubator.apache.org Delivered-To: mailing list empire-db-commits@incubator.apache.org Received: (qmail 54864 invoked by uid 99); 17 Nov 2009 23:57:20 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 17 Nov 2009 23:57:20 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 17 Nov 2009 23:57:10 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id A9CA423888FD; Tue, 17 Nov 2009 23:56:48 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r881628 - in /incubator/empire-db/trunk/empire-db-codegen/src: main/java/org/apache/empire/db/codegen/ main/java/org/apache/empire/db/codegen/util/ test/java/org/apache/empire/db/codegen/util/ Date: Tue, 17 Nov 2009 23:56:48 -0000 To: empire-db-commits@incubator.apache.org From: francisdb@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20091117235648.A9CA423888FD@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: francisdb Date: Tue Nov 17 23:56:48 2009 New Revision: 881628 URL: http://svn.apache.org/viewvc?rev=881628&view=rev Log: EMPIREDB-52 - Split up the actual application and the code generator service + some other cleanup Added: incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenApp.java Modified: incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGen.java incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/util/DBUtil.java incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/util/ParserUtil.java incubator/empire-db/trunk/empire-db-codegen/src/test/java/org/apache/empire/db/codegen/util/DBUtilTest.java incubator/empire-db/trunk/empire-db-codegen/src/test/java/org/apache/empire/db/codegen/util/FileUtilsTest.java Modified: incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGen.java URL: http://svn.apache.org/viewvc/incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGen.java?rev=881628&r1=881627&r2=881628&view=diff ============================================================================== --- incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGen.java (original) +++ incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGen.java Tue Nov 17 23:56:48 2009 @@ -27,9 +27,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.empire.commons.ErrorObject; import org.apache.empire.db.DBDatabase; import org.apache.empire.db.DBTable; +import org.apache.empire.db.codegen.util.DBUtil; import org.apache.empire.db.codegen.util.FileUtils; import org.apache.empire.db.codegen.util.ParserUtil; import org.apache.velocity.Template; @@ -43,19 +43,22 @@ * database schema. It uses the Empire DB open-source framework to build a java * persistence layer for an application. The Apache Velocity template engine is * used to create the output interfaces and classes. - * + *

* The Empire DB framework doesn't try to hide the underlying database and data * model but instead embraces its power by modeling it within java. The result * is a persistence layer that uses a more "object-oriented, type safe" SQL to * access persistent data. - * - * NOTE: THIS VERSION HAS SEVERE RESTRICTIONS: 1. Only tables are currently - * modeled (we'll add views to a later version). 2. Table indexes are not yet - * modeled (exception is primary key). Again, this will be added to later - * editions. 3. It is assumed that each table has a single INTEGER - * auto-generated primary key column that has the same name for all tables. 4. - * It is assumed that each table has a single TIMESTAMP optimistic locking - * column that has the same name for all tables. + *

+ * NOTE: THIS VERSION HAS SEVERE RESTRICTIONS: + *

    + *
  1. Only tables are currently modeled (we'll add views to a later version).
  2. + *
  3. Table indexes are not yet modeled (exception is primary key). Again, + * this will be added to later editions.
  4. + *
  5. It is assumed that each table has a single INTEGER auto-generated primary + * key column that has the same name for all tables.
  6. + *
  7. It is assumed that each table has a single TIMESTAMP optimistic locking + * column that has the same name for all tables.
  8. + *
*/ public class CodeGen { @@ -69,8 +72,11 @@ public static final String BASE_RECORD_TEMPLATE = "BaseRecord.vm"; public static final String RECORD_TEMPLATE = "Record.vm"; + // Services + private final ParserUtil pUtil; + // Properties - private CodeGenConfig config; + private final CodeGenConfig config; private File baseDir; private File tableDir; private File recordDir; @@ -78,80 +84,46 @@ /** * Constructor */ - public CodeGen() { + public CodeGen(CodeGenConfig config) { try { Velocity.init(); } catch (Exception e) { log.fatal(e); throw new RuntimeException(e); } + this.pUtil = new ParserUtil(config); + this.config = config; } /** - *
-	 * This is the entry point of the Empire-DB Sample Application
-	 * Please check the config.xml configuration file for Database and Connection settings.
-	 * 
- * - * @param args - * arguments + * Generates the code according to the provided configuration file + * @param config */ - public static void main(String[] args) { - Connection conn = null; - try { - // Init Configuration - CodeGenConfig config = new CodeGenConfig(); - config.init((args.length > 0 ? args[0] : "config.xml")); - - // Enable Exceptions - ErrorObject.setExceptionsEnabled(true); + public void generate(){ + Connection conn = null; + try { // Get a JDBC Connection - conn = getJDBCConnection(config); - - // List options - log.info("Database connection successful. Config options are:"); - log.info("SchemaName=" + String.valueOf(config.getDbSchema())); - log.info("TimestampColumn=" - + String.valueOf(config.getTimestampColumn())); - log.info("TargetFolder=" + config.getTargetFolder()); - log.info("PackageName=" + config.getPackageName()); - log.info("DbClassName=" + config.getDbClassName()); - log.info("TableBaseName=" + config.getTableBaseName()); - log.info("ViewBaseName=" + config.getViewBaseName()); - log.info("RecordBaseName=" + config.getRecordBaseName()); - log.info("TableClassPrefix=" + config.getTableClassPrefix()); - log.info("ViewClassPrefi=" + config.getViewClassPrefix()); - log.info("NestTable=" + config.isNestTables()); - log.info("NestViews=" + config.isNestViews()); - log.info("CreateRecordProperties=" - + config.isCreateRecordProperties()); - - if (config.getTableClassPrefix() == null) - config.setTableClassPrefix(""); - - if (config.getTableClassSuffix() == null) - config.setTableClassSuffix(""); - - CodeGen codeGen = new CodeGen(); - // create the database in the memory - DBDatabase db = codeGen.parseDataModel(conn, config); - + conn = getJDBCConnection(); + + // create the database in memory + DBDatabase db = parseDataModel(conn); + // create the source-code for that database - codeGen.generateCodeFiles(db, config); - + generateCodeFiles(db); + log.info("Code generation completed sucessfully!"); - - } catch (Exception e) { - // Error + } + catch (Exception e) + { log.error(e.getMessage(), e); - } finally { - // done - if (conn != null) - close(conn); + } + finally + { + DBUtil.close(conn, log); } } - + /** *
 	 * Opens and returns a JDBC-Connection.
@@ -159,7 +131,7 @@
 	 * Please use the config.xml file to change connection params.
 	 * 
*/ - private static Connection getJDBCConnection(CodeGenConfig config) { + private Connection getJDBCConnection() { // Establish a new database connection Connection conn = null; log.info("Connecting to Database'" + config.getJdbcURL() + "' / User=" @@ -183,27 +155,13 @@ return conn; } - /** - * Closes a JDBC-Connection. - */ - private static void close(Connection conn) { - log.info("Closing database connection"); - try { - conn.close(); - } catch (Exception e) { - log.fatal("Error closing connection", e); - } - } - - public DBDatabase parseDataModel(Connection conn, CodeGenConfig config) { - this.config = config; + public DBDatabase parseDataModel(Connection conn) { CodeGenParser cgp = new CodeGenParser(conn, config); DBDatabase memoryDB = cgp.getDb(); return memoryDB; } - public void generateCodeFiles(DBDatabase db, CodeGenConfig config) { - this.config = config; + public void generateCodeFiles(DBDatabase db) { // Prepare directories for generated source files this.initDirectories(config.getTargetFolder(), config.getPackageName()); @@ -217,7 +175,8 @@ // Create base record class this.createBaseRecordClass(db); // Create table classes, record interfaces and record classes - for (DBTable table : db.getTables()) { + for (DBTable table : db.getTables()) + { this.createTableClass(db, table); this.createRecordClass(db, table); } @@ -250,7 +209,6 @@ } private void createDatabaseClass(DBDatabase db) { - ParserUtil pUtil = new ParserUtil(config); File file = new File(baseDir, config.getDbClassName() + ".java"); VelocityContext context = new VelocityContext(); context.put("parser", pUtil); @@ -271,7 +229,6 @@ } private void createTableClass(DBDatabase db, DBTable table) { - ParserUtil pUtil = new ParserUtil(config); File file = new File(tableDir, pUtil.getTableClassName(table.getName()) + ".java"); VelocityContext context = new VelocityContext(); @@ -296,7 +253,6 @@ } private void createRecordClass(DBDatabase db, DBTable table) { - ParserUtil pUtil = new ParserUtil(config); File file = new File(recordDir, pUtil.getRecordClassName(table .getName()) + ".java"); Added: incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenApp.java URL: http://svn.apache.org/viewvc/incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenApp.java?rev=881628&view=auto ============================================================================== --- incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenApp.java (added) +++ incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/CodeGenApp.java Tue Nov 17 23:56:48 2009 @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.empire.db.codegen; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.empire.commons.ErrorObject; + +/** + * Console code generator application, takes the config file as first argument. + * + */ +public class CodeGenApp { + + private static final Log log = LogFactory.getLog(CodeGenApp.class); + + private static final String DEFAULT_CONFIG_FILE = "config.xml"; + + + /** + * This is the entry point of the Code generator Sample Application. + * Please check the config.xml configuration file for Database and Connection settings. + * + * @param args + * arguments + */ + public static void main(String[] args) { + CodeGenApp app = new CodeGenApp(); + app.start((args.length > 0 ? args[0] : DEFAULT_CONFIG_FILE)); + } + + /** + * Starts the actual generation according to the provided config file + */ + private void start(final String file){ + // load configuration file + CodeGenConfig config = loadConfig(file); + + // log all options + listOptions(config); + + CodeGen codeGen = new CodeGen(config); + codeGen.generate(); + } + + /** + * Loads the configuration file and + * @param configFile + * @return + */ + private CodeGenConfig loadConfig(String configFile){ + // Init Configuration + CodeGenConfig config = new CodeGenConfig(); + config.init(configFile); + + // Enable Exceptions + ErrorObject.setExceptionsEnabled(true); + + if (config.getTableClassPrefix() == null) + config.setTableClassPrefix(""); + + if (config.getTableClassSuffix() == null) + config.setTableClassSuffix(""); + + return config; + } + + private void listOptions(CodeGenConfig config){ + // List options + log.info("Database connection successful. Config options are:"); + log.info("SchemaName=" + String.valueOf(config.getDbSchema())); + log.info("TimestampColumn=" + String.valueOf(config.getTimestampColumn())); + log.info("TargetFolder=" + config.getTargetFolder()); + log.info("PackageName=" + config.getPackageName()); + log.info("DbClassName=" + config.getDbClassName()); + log.info("TableBaseName=" + config.getTableBaseName()); + log.info("ViewBaseName=" + config.getViewBaseName()); + log.info("RecordBaseName=" + config.getRecordBaseName()); + log.info("TableClassPrefix=" + config.getTableClassPrefix()); + log.info("ViewClassPrefi=" + config.getViewClassPrefix()); + log.info("NestTable=" + config.isNestTables()); + log.info("NestViews=" + config.isNestViews()); + log.info("CreateRecordProperties=" + config.isCreateRecordProperties()); + } +} Modified: incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/util/DBUtil.java URL: http://svn.apache.org/viewvc/incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/util/DBUtil.java?rev=881628&r1=881627&r2=881628&view=diff ============================================================================== --- incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/util/DBUtil.java (original) +++ incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/util/DBUtil.java Tue Nov 17 23:56:48 2009 @@ -18,6 +18,7 @@ */ package org.apache.empire.db.codegen.util; +import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; @@ -32,7 +33,7 @@ } /** - * Closes a sql resultset and logs exceptions + * Closes a sql resultset and logs exceptions. * * @param rs the resultset to close * @param log the logger instance to use for logging @@ -45,8 +46,22 @@ rs.close(); b = true; } catch (SQLException e) { - log.error("The resultset could not bel closed!", e); + log.error("The resultset could not be closed!", e); } return b; } + + /** + * Closes a JDBC-Connection and logs exceptions. + */ + public static void close(Connection conn, Log log) { + if(conn != null){ + log.info("Closing database connection"); + try { + conn.close(); + } catch (Exception e) { + log.fatal("Error closing connection", e); + } + } + } } Modified: incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/util/ParserUtil.java URL: http://svn.apache.org/viewvc/incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/util/ParserUtil.java?rev=881628&r1=881627&r2=881628&view=diff ============================================================================== --- incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/util/ParserUtil.java (original) +++ incubator/empire-db/trunk/empire-db-codegen/src/main/java/org/apache/empire/db/codegen/util/ParserUtil.java Tue Nov 17 23:56:48 2009 @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.empire.db.codegen.util; import org.apache.commons.logging.Log; @@ -32,9 +31,10 @@ */ public class ParserUtil { - private CodeGenConfig config; private static final Log log = LogFactory.getLog(ParserUtil.class); + private CodeGenConfig config; + public ParserUtil(CodeGenConfig config) { this.config = config; Modified: incubator/empire-db/trunk/empire-db-codegen/src/test/java/org/apache/empire/db/codegen/util/DBUtilTest.java URL: http://svn.apache.org/viewvc/incubator/empire-db/trunk/empire-db-codegen/src/test/java/org/apache/empire/db/codegen/util/DBUtilTest.java?rev=881628&r1=881627&r2=881628&view=diff ============================================================================== --- incubator/empire-db/trunk/empire-db-codegen/src/test/java/org/apache/empire/db/codegen/util/DBUtilTest.java (original) +++ incubator/empire-db/trunk/empire-db-codegen/src/test/java/org/apache/empire/db/codegen/util/DBUtilTest.java Tue Nov 17 23:56:48 2009 @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.empire.db.codegen.util; import static org.junit.Assert.assertFalse; @@ -16,7 +34,7 @@ public void testCloseResultSet() throws SQLException { // null Log log = Mockito.mock(Log.class); - boolean succes = DBUtil.close(null, log); + boolean succes = DBUtil.close((ResultSet)null, log); assertTrue(succes); // normal @@ -30,7 +48,7 @@ Mockito.doThrow(exception).when(rsFail).close(); boolean succes3 = DBUtil.close(rsFail, log); assertFalse(succes3); - Mockito.verify(log).error("The resultset could not bel closed!", exception); + Mockito.verify(log).error("The resultset could not be closed!", exception); } } Modified: incubator/empire-db/trunk/empire-db-codegen/src/test/java/org/apache/empire/db/codegen/util/FileUtilsTest.java URL: http://svn.apache.org/viewvc/incubator/empire-db/trunk/empire-db-codegen/src/test/java/org/apache/empire/db/codegen/util/FileUtilsTest.java?rev=881628&r1=881627&r2=881628&view=diff ============================================================================== --- incubator/empire-db/trunk/empire-db-codegen/src/test/java/org/apache/empire/db/codegen/util/FileUtilsTest.java (original) +++ incubator/empire-db/trunk/empire-db-codegen/src/test/java/org/apache/empire/db/codegen/util/FileUtilsTest.java Tue Nov 17 23:56:48 2009 @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.empire.db.codegen.util; import static org.junit.Assert.assertEquals;