\r
<path id="classpath">\r
<pathelement path="${classpathdir}"/>\r
+ <pathelement path="target/test-classes"/>\r
<pathelement path="${common-classpathdir}"/>\r
<pathelement path="${dao-classpathdir}"/>\r
<fileset dir="lib">\r
<artifactId>ea2ddl-dao</artifactId>\r
<version>${project.version}</version>\r
</dependency>\r
+ <dependency>\r
+ <groupId>${project.groupId}</groupId>\r
+ <artifactId>ea2ddl-common</artifactId>\r
+ <version>${project.version}</version>\r
+ </dependency>\r
\r
<dependency>\r
<groupId>org.freemarker</groupId>\r
--- /dev/null
+/**\r
+ * \r
+ */\r
+package jp.sourceforge.ea2ddl.ddl;\r
+\r
+/**\r
+ * @author taktos\r
+ * \r
+ */\r
+public class ConfigKey {\r
+\r
+ public static final String ER_PACKAGE_TREE = "er.package.tree";\r
+ public static final String USE_SCHEMA = "use.schema";\r
+\r
+}\r
--- /dev/null
+/**\r
+ * \r
+ */\r
+package jp.sourceforge.ea2ddl.ddl;\r
+\r
+/**\r
+ * @author taktos\r
+ * \r
+ */\r
+public class Constants {\r
+\r
+ public static final String STEREOTYPE_TABLE = "table";\r
+ public static final String STEREOTYPE_PRIMARY_KEY = "PK";\r
+ public static final String STEREOTYPE_FOREIGN_KEY = "FK";\r
+ public static final String STEREOTYPE_UNIQUE = "unique";\r
+ public static final String STEREOTYPE_INDEX = "index";\r
+\r
+ public static final String OBJECT_PROPERTIES_OWNER = "OWNER";\r
+\r
+ public static final String OBJECT_TYPE_NOTE = "Note";\r
+\r
+ public static final String SUPPRESS_COMMON_COLUMN = "SUPPRESS_COMMON_COLUMN";\r
+}\r
private Logger _logger = Logger.getLogger(TemplateCommand.class);\r
\r
protected String _factoryClassName;\r
- protected String _templateFileDir = "target/classes";\r
+ protected String _templateFileDir = "templates";\r
protected String _templateFileName;\r
protected String _templateFileEncoding = "UTF-8";\r
protected String _outputDirName = "output";\r
import jp.sourceforge.ea2ddl.dao.exbhv.TPackageBhv;\r
import jp.sourceforge.ea2ddl.dao.exentity.TObject;\r
import jp.sourceforge.ea2ddl.dao.exentity.TPackage;\r
+import jp.sourceforge.ea2ddl.ddl.ConfigKey;\r
+import jp.sourceforge.ea2ddl.ddl.Constants;\r
import jp.sourceforge.ea2ddl.ddl.factory.ModelFactory;\r
import jp.sourceforge.ea2ddl.ddl.model.ClassificationModel;\r
import jp.sourceforge.ea2ddl.ddl.model.Model;\r
*/\r
public Model create() {\r
final ClassificationModel model = new ClassificationModel();\r
- final List<TObject> noteList = _tObjectBhv.selectList(_config.getProperty("er.package.tree"), null, "Note");\r
+ final List<TObject> noteList = _tObjectBhv.selectList(_config.getProperty(ConfigKey.ER_PACKAGE_TREE), null,\r
+ Constants.OBJECT_TYPE_NOTE);\r
for (TObject note : noteList) {\r
model.addClassification(note.getNote());\r
}\r
import jp.sourceforge.ea2ddl.dao.exbhv.TAttributeBhv;\r
import jp.sourceforge.ea2ddl.dao.exbhv.TConnectorBhv;\r
import jp.sourceforge.ea2ddl.dao.exbhv.TObjectBhv;\r
+import jp.sourceforge.ea2ddl.dao.exbhv.TObjectconstraintBhv;\r
import jp.sourceforge.ea2ddl.dao.exbhv.TObjectpropertiesBhv;\r
import jp.sourceforge.ea2ddl.dao.exbhv.TOperationBhv;\r
import jp.sourceforge.ea2ddl.dao.exbhv.TOperationparamsBhv;\r
import jp.sourceforge.ea2ddl.dao.exentity.TOperation;\r
import jp.sourceforge.ea2ddl.dao.exentity.TOperationparams;\r
import jp.sourceforge.ea2ddl.dao.exentity.TPackage;\r
+import jp.sourceforge.ea2ddl.ddl.ConfigKey;\r
+import jp.sourceforge.ea2ddl.ddl.Constants;\r
import jp.sourceforge.ea2ddl.ddl.factory.ModelFactory;\r
import jp.sourceforge.ea2ddl.ddl.model.ColumnModel;\r
import jp.sourceforge.ea2ddl.ddl.model.DatabaseModel;\r
import jp.sourceforge.ea2ddl.ddl.model.ForeignKeyModel;\r
+import jp.sourceforge.ea2ddl.ddl.model.IndexModel;\r
import jp.sourceforge.ea2ddl.ddl.model.PrimaryKeyModel;\r
import jp.sourceforge.ea2ddl.ddl.model.TableModel;\r
import jp.sourceforge.ea2ddl.ddl.model.UniqueModel;\r
private TPackageBhv _tPackageBhv;\r
private TObjectBhv _tObjectBhv;\r
private TObjectpropertiesBhv _tObjectpropertiesBhv;\r
+ private TObjectconstraintBhv _tObjectconstraintBhv;\r
private TAttributeBhv _tAttributeBhv;\r
private TConnectorBhv _tConnectorBhv;\r
private TOperationBhv _tOperationBhv;\r
}\r
\r
@Binding\r
+ public void setTObjectconstraintBhv(TObjectconstraintBhv objectconstraintBhv) {\r
+ _tObjectconstraintBhv = objectconstraintBhv;\r
+ }\r
+\r
+ @Binding\r
public void setTAttributeBhv(TAttributeBhv attributeBhv) {\r
_tAttributeBhv = attributeBhv;\r
}\r
*/\r
public DatabaseModel create() {\r
final DatabaseModel dbModel = new DatabaseModel();\r
- final TPackage pkg = getPackage(_config.getProperty("er.package.tree"));\r
- final List<TObject> objectList = _tObjectBhv.selectListByStereotype(pkg, "table");\r
+ final TPackage pkg = getPackage();\r
+ final List<TObject> objectList = _tObjectBhv.selectListByStereotype(pkg, Constants.STEREOTYPE_TABLE);\r
_log.debug(objectList.size());\r
\r
for (TObject object : objectList) {\r
return dbModel;\r
}\r
\r
- protected TPackage getPackage(String packageTree) {\r
- return _tPackageBhv.selectPackage(packageTree);\r
+ protected TPackage getPackage() {\r
+ return _tPackageBhv.selectPackage(_config.getProperty(ConfigKey.ER_PACKAGE_TREE));\r
}\r
\r
protected TableModel generateTableModel(TObject tobject) {\r
table.setName(tobject.getName());\r
table.setAlias(tobject.getAlias());\r
table.setNote(tobject.getNote());\r
- if (_config.getBoolean("use.schema")) {\r
- table.setSchema(_tObjectpropertiesBhv.getValue(tobject, "OWNER"));\r
+ if (_config.getBoolean(_config.getProperty(ConfigKey.USE_SCHEMA))) {\r
+ table.setSchema(_tObjectpropertiesBhv.getValue(tobject, Constants.OBJECT_PROPERTIES_OWNER));\r
}\r
+ table.setSuppressCommonColumn(_tObjectconstraintBhv.hasConstraint(tobject, Constants.SUPPRESS_COMMON_COLUMN));\r
generateColumnModel(table, tobject);\r
generatePKModel(table, tobject);\r
generateFKModel(table, tobject);\r
generateUniqueModel(table, tobject);\r
+ generateIndexModel(table, tobject);\r
\r
return table;\r
}\r
}\r
\r
protected void generatePKModel(TableModel table, TObject tobject) {\r
- final ListResultBean<TOperation> pkList = _tOperationBhv.selectOperation(tobject, "PK");\r
+ final ListResultBean<TOperation> pkList = _tOperationBhv.selectOperation(tobject,\r
+ Constants.STEREOTYPE_PRIMARY_KEY);\r
if (pkList.isEmpty()) {\r
return;\r
}\r
}\r
\r
protected void generateFKModel(TableModel table, TObject tobject) {\r
- final ListResultBean<TOperation> fkList = _tOperationBhv.selectOperation(tobject, "FK");\r
+ final ListResultBean<TOperation> fkList = _tOperationBhv.selectOperation(tobject,\r
+ Constants.STEREOTYPE_FOREIGN_KEY);\r
for (TOperation opeFK : fkList) {\r
final ForeignKeyModel fkModel = new ForeignKeyModel();\r
fkModel.setName(opeFK.getName());\r
protected void generateUniqueModel(TableModel table, TObject tobject) {\r
final TOperationCB cb = new TOperationCB();\r
cb.query().setObjectId_Equal(tobject.getObjectId());\r
- cb.query().setStereotype_Equal("unique");\r
+ cb.query().setStereotype_Equal(Constants.STEREOTYPE_UNIQUE);\r
final ListResultBean<TOperation> uniqueList = _tOperationBhv.selectList(cb);\r
for (TOperation unique : uniqueList) {\r
final UniqueModel uniqueModel = new UniqueModel();\r
table.addUnique(uniqueModel);\r
}\r
}\r
+\r
+ protected void generateIndexModel(TableModel table, TObject tobject) {\r
+ final ListResultBean<TOperation> indexList = _tOperationBhv.selectOperation(tobject, "index");\r
+ for (TOperation index : indexList) {\r
+ final IndexModel indexModel = new IndexModel();\r
+ indexModel.setName(index.getName());\r
+ final ListResultBean<TOperationparams> params = _tOperationparamsBhv.selectOperationParams(index);\r
+ for (TOperationparams param : params) {\r
+ indexModel.addColumn(param.getName());\r
+ }\r
+ table.addIndex(indexModel);\r
+ }\r
+ }\r
+\r
}\r
import java.io.Serializable;\r
\r
/**\r
- * @author takiguchi\r
+ * @author taktos\r
* \r
*/\r
public class ColumnModel implements Serializable {\r
package jp.sourceforge.ea2ddl.ddl.model;\r
\r
import java.io.Serializable;\r
+import java.util.ArrayList;\r
import java.util.List;\r
\r
/**\r
}\r
\r
public List<String> getColumnList() {\r
+ if (_columnList == null) {\r
+ synchronized (this) {\r
+ if (_columnList == null) {\r
+ _columnList = new ArrayList<String>();\r
+ }\r
+ }\r
+ }\r
return _columnList;\r
}\r
\r
public void setColumnList(List<String> columnList) {\r
_columnList = columnList;\r
}\r
+\r
+ public void addColumn(String column) {\r
+ getColumnList().add(column);\r
+ }\r
}\r
private String note;\r
private String schema;\r
\r
+ private boolean suppressCommonColumn = false;\r
+\r
private List<ColumnModel> _columnList;\r
private PrimaryKeyModel _primaryKey;\r
private List<UniqueModel> _uniqueList;\r
this.schema = schema;\r
}\r
\r
+ public boolean isSuppressCommonColumn() {\r
+ return suppressCommonColumn;\r
+ }\r
+\r
+ public void setSuppressCommonColumn(boolean suppressCommonColumn) {\r
+ this.suppressCommonColumn = suppressCommonColumn;\r
+ }\r
+\r
public List<ColumnModel> getColumnList() {\r
if (_columnList == null) {\r
synchronized (this) {\r
}\r
\r
public List<IndexModel> getIndexList() {\r
+ if (_indexList == null) {\r
+ synchronized (this) {\r
+ if (_indexList == null) {\r
+ _indexList = new ArrayList<IndexModel>();\r
+ }\r
+ }\r
+ }\r
return _indexList;\r
}\r
\r
_indexList = indexList;\r
}\r
\r
+ public void addIndex(IndexModel indexModel) {\r
+ getIndexList().add(indexModel);\r
+ }\r
}\r
<component name="config"\r
class="jp.sourceforge.ea2ddl.common.config.impl.ConfigImpl">\r
<initMethod name="load">\r
- <arg>"app.properties"</arg>\r
+ <arg>"ea2ddl.properties"</arg>\r
</initMethod>\r
</component>\r
</components>
\ No newline at end of file
--- /dev/null
+package jp.sourceforge.ea2ddl.ddl.factory.impl;\r
+\r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertNotNull;\r
+import jp.sourceforge.ea2ddl.dao.exentity.TPackage;\r
+import jp.sourceforge.ea2ddl.ddl.model.DatabaseModel;\r
+\r
+import org.junit.Test;\r
+import org.junit.runner.RunWith;\r
+import org.seasar.framework.unit.Seasar2;\r
+import org.seasar.framework.unit.annotation.RootDicon;\r
+\r
+@RunWith(Seasar2.class)\r
+@RootDicon("ea2ddl.dicon")\r
+public class DatabaseModelFactoryImplTest {\r
+\r
+ DatabaseModelFactoryImpl factory;\r
+\r
+ @Test\r
+ public void testCreate() {\r
+ final DatabaseModel model = factory.create();\r
+ assertNotNull(model);\r
+ }\r
+\r
+ @Test\r
+ public void testGetPackage() {\r
+ final TPackage pkg = factory.getPackage();\r
+ assertNotNull(pkg);\r
+ assertEquals("EXAMPLEDB", pkg.getName());\r
+ }\r
+\r
+}\r
-er.package.tree=\u30d3\u30e5\u30fc/\u30af\u30e9\u30b9\u30d3\u30e5\u30fc/ER\u56f3/EXAMPLEDB
\ No newline at end of file
+er.package.tree=\u30d3\u30e5\u30fc/\u30af\u30e9\u30b9\u30d3\u30e5\u30fc/ER\u56f3/EXAMPLEDB\r
+use.schema=false
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"\r
+ "http://www.seasar.org/dtd/components24.dtd">\r
+<components namespace="jdbc">\r
+ <include path="jta.dicon"/>\r
+\r
+ <!-- for MS-Access -->\r
+ <component name="xaDataSource"\r
+ class="org.seasar.extension.dbcp.impl.XADataSourceImpl">\r
+ <property name="driverClassName">\r
+ "sun.jdbc.odbc.JdbcOdbcDriver"\r
+ </property>\r
+ <property name="URL">\r
+ "jdbc:odbc:exampledb"\r
+ </property>\r
+ <property name="user">"sa"</property>\r
+ <property name="password">""</property>\r
+ <initMethod name="addProperty">\r
+ <arg>"charSet"</arg>\r
+ <arg>"MS932"</arg>\r
+ </initMethod>\r
+ </component>\r
+\r
+ <component name="connectionPool"\r
+ class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">\r
+ <property name="timeout">600</property>\r
+ <property name="maxPoolSize">10</property>\r
+ <property name="allowLocalTx">true</property>\r
+ <destroyMethod name="close"/>\r
+ </component>\r
+\r
+ <component name="DataSource"\r
+ class="org.seasar.extension.dbcp.impl.DataSourceImpl"\r
+ />\r
+\r
+ <!-- from JNDI -->\r
+ <!--\r
+ <component name="DataSource"\r
+ class="javax.sql.DataSource">\r
+ @org.seasar.extension.j2ee.JndiResourceLocator@lookup("java:comp/env/jdbc/DataSource")\r
+ </component>\r
+ -->\r
+\r
+ <!--\r
+ <component name="dataSource"\r
+ class="org.seasar.extension.datasource.impl.SelectableDataSourceProxy"/>\r
+ -->\r
+</components>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"\r
+ "http://www.seasar.org/dtd/components24.dtd">\r
+<components namespace="s2junit4">\r
+ \r
+ <component name="context" class="org.seasar.framework.unit.impl.InternalTestContextImpl"/>\r
+\r
+ <component class="org.seasar.framework.unit.impl.DataAccessorImpl"/>\r
+\r
+ <component class="org.seasar.framework.unit.impl.ConfigFileIncluderImpl">\r
+ <initMethod name="addConfigFile">\r
+ <arg>"j2ee.dicon"</arg>\r
+ </initMethod>\r
+ <initMethod name="addConfigFile">\r
+ <arg>context.testClassShortName + ".dicon"</arg>\r
+ </initMethod>\r
+ </component>\r
+\r
+ <component class="org.seasar.framework.unit.impl.TestDataPreparerImpl">\r
+ <initMethod name="addTestDataXlsPath">\r
+ <arg>context.testClassShortName + "_" + context.testMethodName + ".xls"</arg>\r
+ </initMethod>\r
+ <initMethod name="addTestDataXlsPath">\r
+ <arg>context.testClassShortName + ".xls"</arg>\r
+ </initMethod>\r
+ </component>\r
+\r
+ <component class="org.seasar.framework.unit.impl.ExpectedDataReaderImpl">\r
+ <initMethod name="addExpectedDataXlsPath">\r
+ <arg>context.testClassShortName + "_" + context.testMethodName + "_Expected" + ".xls"</arg>\r
+ </initMethod>\r
+ </component>\r
+</components>
\ No newline at end of file
CREATE TABLE ${table.name} (\r
<#list table.columnList as column> ${column.name} ${column.definition}<#if column_has_next>,</#if>\r
</#list>\r
+<#if !table.suppressCommonColumn>\r
+ , CREATE_USER VARCHAR2(20) NOT NULL\r
+ , CREATE_DATETIME DATE NOT NULL\r
+ , UPDATE_USER VARCHAR2(20) NOT NULL\r
+ , UPDATE_DATETIME DATE NOT NULL\r
+ , VERSION_NO NUMBER(8) NOT NULL\r
+</#if>\r
)\r
;\r
<#if table.primaryKey??>ALTER TABLE ${table.name} ADD CONSTRAINT ${table.primaryKey.name}\r
UNIQUE (<#list unique.columnNameList as columnName>${columnName}<#if columnName_has_next>,</#if></#list>)\r
;\r
</#list>\r
+<#list table.indexList as index>CREATE INDEX ${index.name} ON ${table.name}\r
+ (<#list index.columnList as columnName>${columnName}<#if columnName_has_next>,</#if></#list>)\r
+;\r
+</#list>\r
<#if table.alias?? || table.note??>\r
COMMENT ON TABLE ${table.name} IS '<#if table.alias??>${table.alias}:</#if><#if table.note??>${table.note}</#if>'\r
;\r