package org.codehaus.mojo.ibatis; /* * Copyright 2001-2007 The Codehaus. * * Licensed 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. */ import org.apache.ibatis.abator.api.Abator; import org.apache.ibatis.abator.config.AbatorConfiguration; import org.apache.ibatis.abator.config.AbatorContext; import org.apache.ibatis.abator.config.DAOGeneratorConfiguration; import org.apache.ibatis.abator.config.JDBCConnectionConfiguration; import org.apache.ibatis.abator.config.JavaModelGeneratorConfiguration; import org.apache.ibatis.abator.config.JavaTypeResolverConfiguration; import org.apache.ibatis.abator.config.ModelType; import org.apache.ibatis.abator.config.SqlMapGeneratorConfiguration; import org.apache.ibatis.abator.config.TableConfiguration; import org.apache.ibatis.abator.exception.InvalidConfigurationException; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.codehaus.plexus.util.FileUtils; import org.codehaus.plexus.util.StringUtils; import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * AbatorMojo * * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a> * @version $Id$ * * @goal abator * @phase generate-sources */ public class AbatorMojo extends AbstractMojo { private static final String CONTEXT_ID = "IbatisPluginId"; private static final String JDBC_DRIVER = "org.hsqldb.jdbcDriver"; private static final String JDBC_URL = "jdbc:hsqldb:mem:abator"; private static final String JDBC_USERNAME = "sa"; private static final String JDBC_PASSWORD = ""; /** * @parameter expression="${ibatis.sqlFile}" * default-value="${basedir}/src/main/ibatis/abator.sql" */ private File sqlFile; /** * @parameter expression="${ibatis.abator.target.package}" default-value="${project.groupId}" */ private String targetPackage; /** * @parameter expression="${ibatis.abator.output.directory}" default-value="${project.build.directory}/generated-sources/ibatis/src" */ private File generatedSourceDir; public void execute() throws MojoExecutionException, MojoFailureException { String sqlCommands = JDBC_PASSWORD; if( !generatedSourceDir.exists() ) { generatedSourceDir.mkdirs(); } try { sqlCommands = FileUtils.fileRead( sqlFile ); } catch ( IOException e ) { throw new MojoExecutionException( "Unable to read sql command file " + sqlFile.getAbsolutePath(), e ); } // Create HsqlDB try { Class.forName( JDBC_DRIVER ).newInstance(); Connection conn = DriverManager.getConnection( JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD ); Statement statement = conn.createStatement(); statement.execute( sqlCommands ); getLog().info( "SQL Update Count: " + statement.getUpdateCount() ); SQLWarning warning = statement.getWarnings(); if ( warning != null ) { getLog().warn( "Warnings ... " ); while ( warning != null ) { getLog().warn( "SQL State: " + warning.getSQLState() ); getLog().warn( "SQL Error Code: " + warning.getErrorCode() ); getLog().warn( warning.getMessage(), warning ); warning = warning.getNextWarning(); } } List tableNames = new ArrayList(); DatabaseMetaData dbMetaData = conn.getMetaData(); ResultSet rs = dbMetaData.getTables( conn.getCatalog(), null, null, null ); // check if the index database exists in the database while ( rs.next() ) { String dbTableName = rs.getString( "TABLE_NAME" ); if( !dbTableName.toLowerCase().startsWith( "system_") ) { tableNames.add( dbTableName ); } } AbatorConfiguration abatorConfig = createAbatorConfiguration( tableNames ); List abatorWarnings = new ArrayList(); Abator abator = new Abator( abatorConfig, null, abatorWarnings ); abator.generate( null ); for ( Iterator itwarnings = abatorWarnings.iterator(); itwarnings.hasNext(); ) { String warningMsg = (String) itwarnings.next(); getLog().warn( warningMsg ); } } catch ( InstantiationException e ) { throw new MojoExecutionException( "Unable to create SQL Database.", e ); } catch ( IllegalAccessException e ) { throw new MojoExecutionException( "Unable to create SQL Database.", e ); } catch ( ClassNotFoundException e ) { throw new MojoExecutionException( "Unable to create SQL Database.", e ); } catch ( SQLException e ) { throw new MojoExecutionException( "Unable to create SQL Database.", e ); } catch ( InvalidConfigurationException e ) { throw new MojoExecutionException( "Unable to generate ibatis sqlmap files: " + e.getMessage(), e ); } catch ( IOException e ) { throw new MojoExecutionException( "Unable to generate ibatis sqlmap files.", e ); } catch ( InterruptedException e ) { throw new MojoExecutionException( "Unable to generate ibatis sqlmap files.", e ); } } private AbatorConfiguration createAbatorConfiguration( List tableNames ) { /* <abatorConfiguration> */ AbatorConfiguration config = new AbatorConfiguration(); /* <abatorContext id="DB2Tables" generatorSet="Java2"> */ AbatorContext context = new AbatorContext( "Java2", ModelType.HIERARCHICAL ); context.setId( CONTEXT_ID ); /* * <jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver" * connectionURL="jdbc:db2:TEST" * userId="db2admin" * password="db2admin"> * <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" /> * </jdbcConnection> */ JDBCConnectionConfiguration jdbcConfig = new JDBCConnectionConfiguration(); jdbcConfig.setDriverClass( JDBC_DRIVER ); jdbcConfig.setConnectionURL( JDBC_URL ); jdbcConfig.setUserId( JDBC_USERNAME ); jdbcConfig.setPassword( JDBC_PASSWORD ); // Map pluginArtifactMap = ArtifactUtils.artifactMapByVersionlessId( pluginClasspathList ); // Artifact sqlArtifact = (Artifact) pluginArtifactMap.get( "hsqldb:hsqldb" ); // // jdbcConfig.addClasspathEntry( sqlArtifact.getFile().getAbsolutePath() ); context.setJdbcConnectionConfiguration( jdbcConfig ); /* * <javaTypeResolver > * <property name="forceBigDecimals" value="false" /> * </javaTypeResolver> */ JavaTypeResolverConfiguration javaTypeConfig = new JavaTypeResolverConfiguration(); javaTypeConfig.addProperty( "forceBigDecimals", "false" ); context.setJavaTypeResolverConfiguration( javaTypeConfig ); /* * <javaModelGenerator targetPackage="test.model" targetProject="\AbatorTestProject\src"> * <property name="enableSubPackages" value="true" /> * <property name="trimStrings" value="true" /> * </javaModelGenerator> */ JavaModelGeneratorConfiguration javaModelConfig = new JavaModelGeneratorConfiguration(); javaModelConfig.setTargetPackage( targetPackage ); javaModelConfig.setTargetProject( generatedSourceDir.getAbsolutePath() ); javaModelConfig.addProperty( "enableSubPackages", "true" ); javaModelConfig.addProperty( "trimStrings", "true" ); context.setJavaModelGeneratorConfiguration( javaModelConfig ); /* * <sqlMapGenerator targetPackage="test.xml" targetProject="\AbatorTestProject\src"> * <property name="enableSubPackages" value="true" /> * </sqlMapGenerator> */ SqlMapGeneratorConfiguration sqlMapConfig = new SqlMapGeneratorConfiguration(); sqlMapConfig.setTargetPackage( targetPackage ); sqlMapConfig.setTargetProject( generatedSourceDir.getAbsolutePath() ); sqlMapConfig.addProperty( "enableSubPackage", "true" ); context.setSqlMapGeneratorConfiguration( sqlMapConfig ); /* * <daoGenerator type="IBATIS" targetPackage="test.dao" targetProject="\AbatorTestProject\src"> * <property name="enableSubPackages" value="true" /> * </daoGenerator> */ DAOGeneratorConfiguration daoConfig = new DAOGeneratorConfiguration(); daoConfig.setConfigurationType( "IBATIS" ); daoConfig.setTargetPackage( targetPackage ); daoConfig.setTargetProject( generatedSourceDir.getAbsolutePath() ); context.setDaoGeneratorConfiguration( daoConfig ); /* * <table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" > * <property name="useActualColumnNames" value="true"/> * <generatedKey column="ID" sqlStatement="DB2" identity="true" /> * <columnOverride column="DATE_FIELD" property="startDate" /> * <ignoreColumn column="FRED" /> * <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> * </table> */ for ( Iterator itTableNames = tableNames.iterator(); itTableNames.hasNext(); ) { String tableName = (String) itTableNames.next(); TableConfiguration tableConfig = new TableConfiguration( context ); tableConfig.setTableName( tableName ); tableConfig.setDomainObjectName( StringUtils.capitalise( tableName.toLowerCase() ) ); tableConfig.addProperty( "useActualColumnNames", "true" ); context.addTableConfiguration( tableConfig ); } List errors = new ArrayList(); context.validate( errors ); for ( Iterator iter = errors.iterator(); iter.hasNext(); ) { String errorMsg = (String) iter.next(); getLog().error( errorMsg ); } /* </abatorContext> */ config.addAbatorContext( context ); /* </abatorConfiguration> */ return config; } }