svnno****@sourc*****
svnno****@sourc*****
2009年 4月 8日 (水) 19:39:47 JST
Revision: 3187 http://svn.sourceforge.jp/view?root=jiemamy&view=rev&rev=3187 Author: j5ik2o Date: 2009-04-08 19:39:47 +0900 (Wed, 08 Apr 2009) Log Message: ----------- なんとなくDataTypeを作ってみる Modified Paths: -------------- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/DefaultColumnModelConverter.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/DefaultJpaImportConfig.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/JpaImportConfig.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/JpaImporter.java charon/jiemamy-jpa-importer/trunk/src/test/java/org/jiemamy/composer/importer/JpaImporterTest.java -------------- next part -------------- Modified: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/DefaultColumnModelConverter.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/DefaultColumnModelConverter.java 2009-04-08 08:39:32 UTC (rev 3186) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/DefaultColumnModelConverter.java 2009-04-08 10:39:47 UTC (rev 3187) @@ -18,16 +18,32 @@ */ package org.jiemamy.composer.importer; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.sql.Timestamp; +import java.util.Calendar; +import java.util.Date; +import java.util.Map; + import org.apache.commons.lang.Validate; import org.jiemamy.JiemamyFactory; import org.jiemamy.composer.importer.meta.PropertyMeta; import org.jiemamy.composer.importer.meta.PropertyMetaUtil; +import org.jiemamy.dialect.BuiltinDataTypeMold; +import org.jiemamy.dialect.Dialect; +import org.jiemamy.exception.JiemamyError; import org.jiemamy.model.RootModel; import org.jiemamy.model.attribute.ColumnModel; import org.jiemamy.model.attribute.constraint.NotNullConstraint; import org.jiemamy.model.attribute.constraint.PrimaryKey; import org.jiemamy.model.attribute.constraint.UniqueKey; +import org.jiemamy.model.datatype.BuiltinDataType; +import org.jiemamy.model.datatype.DataTypeCategory; +import org.jiemamy.model.datatype.adapter.PrecisionedDataTypeAdapter; +import org.jiemamy.model.datatype.adapter.SerialDataTypeAdapter; +import org.jiemamy.model.datatype.adapter.SizedDataTypeAdapter; +import org.jiemamy.utils.CollectionsUtil; /** * {@link ColumnModelConverter}のデフォルト実装 @@ -36,6 +52,62 @@ */ public class DefaultColumnModelConverter implements ColumnModelConverter { + private static class DataTypeMeta { + + DataTypeCategory dataTypeCategory; + + String typeName; + + + public DataTypeMeta(DataTypeCategory dataTypeCategory) { + this.dataTypeCategory = dataTypeCategory; + } + + public DataTypeMeta(DataTypeCategory dataTypeCategory, String typeName) { + this.dataTypeCategory = dataTypeCategory; + this.typeName = typeName; + } + } + + + private Dialect dialect; + + protected static final Map<Class<?>, DataTypeCategory> DATA_TYPE_CATEGORIES = CollectionsUtil.newHashMap(); + + static { + DATA_TYPE_CATEGORIES.put(boolean.class, DataTypeCategory.BOOLEAN); + DATA_TYPE_CATEGORIES.put(Boolean.class, DataTypeCategory.BOOLEAN); + DATA_TYPE_CATEGORIES.put(char.class, DataTypeCategory.CHARACTER); + DATA_TYPE_CATEGORIES.put(Character.class, DataTypeCategory.CHARACTER); + DATA_TYPE_CATEGORIES.put(byte.class, DataTypeCategory.SMALLINT); + DATA_TYPE_CATEGORIES.put(Byte.class, DataTypeCategory.SMALLINT); + DATA_TYPE_CATEGORIES.put(short.class, DataTypeCategory.SMALLINT); + DATA_TYPE_CATEGORIES.put(Short.class, DataTypeCategory.SMALLINT); + DATA_TYPE_CATEGORIES.put(int.class, DataTypeCategory.INTEGER); + DATA_TYPE_CATEGORIES.put(Integer.class, DataTypeCategory.INTEGER); + DATA_TYPE_CATEGORIES.put(long.class, DataTypeCategory.NUMERIC); + DATA_TYPE_CATEGORIES.put(Long.class, DataTypeCategory.NUMERIC); + DATA_TYPE_CATEGORIES.put(float.class, DataTypeCategory.FLOAT); + DATA_TYPE_CATEGORIES.put(Float.class, DataTypeCategory.FLOAT); + DATA_TYPE_CATEGORIES.put(double.class, DataTypeCategory.DOUBLE); + DATA_TYPE_CATEGORIES.put(Double.class, DataTypeCategory.DOUBLE); + DATA_TYPE_CATEGORIES.put(BigDecimal.class, DataTypeCategory.NUMERIC); + DATA_TYPE_CATEGORIES.put(BigInteger.class, DataTypeCategory.NUMERIC); + DATA_TYPE_CATEGORIES.put(java.sql.Date.class, DataTypeCategory.DATE); + DATA_TYPE_CATEGORIES.put(java.sql.Time.class, DataTypeCategory.TIME); + DATA_TYPE_CATEGORIES.put(Timestamp.class, DataTypeCategory.TIMESTAMP); + } + + + /** + * インスタンスを生成する。 + * + * @param dialect {@link Dialect} + */ + public DefaultColumnModelConverter(Dialect dialect) { + this.dialect = dialect; + } + public ColumnModel convert(RootModel rootModel, PropertyMeta propertyMeta) { Validate.notNull(rootModel); Validate.notNull(propertyMeta); @@ -49,14 +121,83 @@ if (propertyMeta.isId()) { cm.setPrimaryKey(factory.newModel(PrimaryKey.class)); } + if (propertyMeta.getColumnMeta().isNullable() == false) { cm.setNotNullConstraint(factory.newModel(NotNullConstraint.class)); } if (propertyMeta.getColumnMeta().isUnique()) { cm.setUniqueKey(factory.newModel(UniqueKey.class)); } - //TODO cm.setDataType(dataType); - //TODO cm.setDefaultValue(defaultValue); + DataTypeMeta dtm = toDataTypeMeta(propertyMeta); + BuiltinDataTypeMold bdtm = dialect.findDataTypeMold(dtm.dataTypeCategory, dtm.typeName); + BuiltinDataType dt = factory.newDataType(bdtm); + if (propertyMeta.hasIdGenerator()) { + if (propertyMeta.getIdentityIdGenerator() != null) { + dt.getAdapter(SerialDataTypeAdapter.class).setSerial(true); + } + } + if (dt.hasAdapter(SizedDataTypeAdapter.class) && propertyMeta.getColumnMeta().getLength() != null) { + dt.getAdapter(SizedDataTypeAdapter.class).setSize(propertyMeta.getColumnMeta().getLength()); + } + if (dt.hasAdapter(PrecisionedDataTypeAdapter.class) && propertyMeta.getColumnMeta().getPrecision() != null) { + dt.getAdapter(PrecisionedDataTypeAdapter.class).setPrecision(propertyMeta.getColumnMeta().getPrecision()); + } + cm.setDataType(dt); return cm; } + + private DataTypeMeta toDataTypeMeta(PropertyMeta propertyMeta) { + Class<?> propertyClass = propertyMeta.getPropertyClass(); + DataTypeCategory dataTypeCategory = DATA_TYPE_CATEGORIES.get(propertyClass); + String typeName = null; + if (dataTypeCategory != null) { + return new DataTypeMeta(dataTypeCategory); + } + if (propertyClass == String.class) { + if (propertyMeta.isLob()) { + dataTypeCategory = DataTypeCategory.CLOB; + } else { + dataTypeCategory = DataTypeCategory.VARCHAR; + } + } + if (propertyClass == byte[].class) { + if (propertyMeta.isLob()) { + dataTypeCategory = DataTypeCategory.BLOB; + } else { + dataTypeCategory = DataTypeCategory.VARCHAR; + typeName = "BYTE"; + } + } + if (propertyClass == Date.class) { + switch (propertyMeta.getTemporalType()) { + case DATE: + dataTypeCategory = DataTypeCategory.DATE; + break; + case TIME: + dataTypeCategory = DataTypeCategory.TIME; + break; + case TIMESTAMP: + dataTypeCategory = DataTypeCategory.TIMESTAMP; + break; + default: + throw new JiemamyError("不到達ポイント"); + } + } + if (propertyClass == Calendar.class) { + switch (propertyMeta.getTemporalType()) { + case DATE: + dataTypeCategory = DataTypeCategory.DATE; + break; + case TIME: + dataTypeCategory = DataTypeCategory.TIME; + break; + case TIMESTAMP: + dataTypeCategory = DataTypeCategory.TIMESTAMP; + break; + default: + throw new JiemamyError("不到達ポイント"); + } + } + return new DataTypeMeta(dataTypeCategory, typeName); + } } Modified: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/DefaultJpaImportConfig.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/DefaultJpaImportConfig.java 2009-04-08 08:39:32 UTC (rev 3186) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/DefaultJpaImportConfig.java 2009-04-08 10:39:47 UTC (rev 3187) @@ -20,6 +20,8 @@ import java.util.List; +import org.jiemamy.dialect.Dialect; + /** * {@link JpaImporter}に関する設定情報保持クラス。 * @@ -33,7 +35,7 @@ private String rootPackageName; - private List<String> javaFileSrcDirs; + private List<String> javaSrcFileDirs; private String javaFileEncoding; @@ -47,6 +49,8 @@ private ColumnModelConverter columnModelConverter; + private Dialect dialect; + public List<String> getClassPathDirs() { return classPathDirs; @@ -56,6 +60,10 @@ return columnModelConverter; } + public Dialect getDialect() { + return dialect; + } + public List<String> getEntityClassNamePatterns() { return entityClassNamePatterns; } @@ -73,7 +81,7 @@ } public List<String> getJavaFileSrcDirs() { - return javaFileSrcDirs; + return javaSrcFileDirs; } public String getRootPackageName() { @@ -116,6 +124,15 @@ } /** + * SQL方言を設定する。 + * + * @param dialect SQL方言 + */ + public void setDialect(Dialect dialect) { + this.dialect = dialect; + } + + /** * 採用するエンティティクラス名のパターンを設定する。 * * @param entityClassNamePatterns 採用するエンティティクラス名のパターンのリスト @@ -156,8 +173,8 @@ * * @param javaFileSrcDirs Javaソースファイルのディレクトリのリスト */ - public void setJavaFileSrcDirs(List<String> javaFileSrcDirs) { - this.javaFileSrcDirs = javaFileSrcDirs; + public void setJavaSrcFileDirs(List<String> javaFileSrcDirs) { + javaSrcFileDirs = javaFileSrcDirs; } /** Modified: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/JpaImportConfig.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/JpaImportConfig.java 2009-04-08 08:39:32 UTC (rev 3186) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/JpaImportConfig.java 2009-04-08 10:39:47 UTC (rev 3187) @@ -21,6 +21,7 @@ import java.util.List; import org.jiemamy.composer.ImportConfig; +import org.jiemamy.dialect.Dialect; /** * {@link JpaImporter}に関する設定情報インターフェイス。 @@ -44,6 +45,13 @@ ColumnModelConverter getColumnModelConverter(); /** + * SQL方言を取得する。 + * + * @return SQL方言. 未設定の場合は{@code null} + */ + Dialect getDialect(); + + /** * 採用するエンティティクラス名のパターンを取得する。 * * @return エンティティクラス名のパターン Modified: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/JpaImporter.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/JpaImporter.java 2009-04-08 08:39:32 UTC (rev 3186) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/JpaImporter.java 2009-04-08 10:39:47 UTC (rev 3187) @@ -36,6 +36,8 @@ import org.jiemamy.composer.importer.meta.impl.EntityMetaReaderImpl; import org.jiemamy.composer.importer.meta.impl.PropertyMetaFactoryImpl; import org.jiemamy.composer.importer.meta.impl.TableMetaFactoryImpl; +import org.jiemamy.dialect.Dialect; +import org.jiemamy.dialect.generic.GenericDialect; import org.jiemamy.model.RootModel; import org.jiemamy.model.attribute.ColumnModel; import org.jiemamy.model.entity.TableModel; @@ -55,9 +57,11 @@ private static final Logger LOG = LoggerFactory.getLogger(JpaImporter.class); + private static final Dialect DEFAULT_DIALECT = new GenericDialect(); + private static final TableModelConverter DEFALUT_TABLE_CONVETER = new DefaultTableModelConverter(); - private static final ColumnModelConverter DEFALUT_COLUMN_CONVETER = new DefaultColumnModelConverter(); + private static ColumnModelConverter DEFALUT_COLUMN_CONVETER; /** @@ -70,9 +74,23 @@ if (config.getColumnModelConverter() != null) { return config.getColumnModelConverter(); } + if (DEFALUT_COLUMN_CONVETER == null) { + Dialect dialect = getDialect(config); + DEFALUT_COLUMN_CONVETER = new DefaultColumnModelConverter(dialect); + } return DEFALUT_COLUMN_CONVETER; } + /** + * TODO for junichi + * + * @param config + * @return + */ + protected Dialect getDialect(JpaImportConfig config) { + return DEFAULT_DIALECT; + } + public String getName() { return IMPORTER_NAME; } Modified: charon/jiemamy-jpa-importer/trunk/src/test/java/org/jiemamy/composer/importer/JpaImporterTest.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/test/java/org/jiemamy/composer/importer/JpaImporterTest.java 2009-04-08 08:39:32 UTC (rev 3186) +++ charon/jiemamy-jpa-importer/trunk/src/test/java/org/jiemamy/composer/importer/JpaImporterTest.java 2009-04-08 10:39:47 UTC (rev 3187) @@ -64,12 +64,11 @@ /** * Test method for {@link org.jiemamy.composer.importer.JpaImporter#importModel(org.jiemamy.model.RootModel, org.jiemamy.composer.importer.JpaImportConfig)}. * @throws IOException 入出力エラーが発生した場合 + * @throws ImportException インポートに失敗した場合 */ @Test - public void testImportModel() throws IOException { - + public void testImportModel() throws IOException, ImportException { String buildDir = JpaImporterTestUtil.getBuildDirNoException(); - DefaultJpaImportConfig config = new DefaultJpaImportConfig(); List<String> classPathDirs = new ArrayList<String>(); classPathDirs.add(buildDir); @@ -77,12 +76,11 @@ config.setEntityPackageName("entity"); config.setClassPathDirs(classPathDirs); config.setJavaFileEncoding("UTF-8"); - try { - jpaImporter.importModel(rootModel, config); - } catch (ImportException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - + config.setApplyJavaComment(true); + List<String> javaSrcFileDirs = new ArrayList<String>(); + javaSrcFileDirs.add("src/test/java"); + config.setJavaSrcFileDirs(javaSrcFileDirs); + jpaImporter.importModel(rootModel, config); + LOG.debug(rootModel.toString()); } }