[Jiemamy-notify:2087] commit [3187] なんとなくDataTypeを作ってみる

Back to archive index

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());
 	}
 }



Jiemamy-notify メーリングリストの案内
Back to archive index