[Jiemamy-notify:1809] commit [2982] カラムやキー削除した場合に、整合性をとる処理追加。

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2009年 3月 23日 (月) 19:14:20 JST


Revision: 2982
          http://svn.sourceforge.jp/view?root=jiemamy&view=rev&rev=2982
Author:   daisuke_m
Date:     2009-03-23 19:14:20 +0900 (Mon, 23 Mar 2009)

Log Message:
-----------
カラムやキー削除した場合に、整合性をとる処理追加。
Disablable機能の実装。
javadoc / refcactor

Modified Paths:
--------------
    artemis/trunk/jiemamy-core/pom.xml
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/dialect/DefaultSqlEmitter.java
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/dialect/generic/GenericDialect.java
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/JiemamyFacadeImpl.java
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/enhance/FactoryExtension.java
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/serializer/JiemamyDomParser.java
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/model/AttributeUtil.java
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/model/EntityUtil.java
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/model/ForeignKeyUtil.java
    artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/internal/JiemamyFacadeImplTest.java
    artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/internal/ReferenceResolverImplTest.java
    artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/model/ColumnUtilTest.java
    artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/model/DataSetUtilTest.java
    artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/model/RootModelUtilTest.java
    artemis/trunk/jiemamy-dialect-mysql/src/main/java/org/jiemamy/dialect/mysql/MySqlEmitter.java
    artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/PostgreSqlEmitter.java
    artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/IndexColumnOption.java
    artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/IndexMethodType.java
    artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/IndexOption.java
    artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/IndexOptionImpl.java
    artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/NullOrder.java
    artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/TableOption.java
    artemis/trunk/jiemamy-dialect-postgresql/src/test/java/org/jiemamy/dialect/postgresql/PostgresqlDialectTest.java
    artemis/trunk/jiemamy-view/src/main/java/org/jiemamy/internal/model/connection/ConnectionAdapterImpl.java
    hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/action/ExportAction.java
    hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/action/ImportAction.java
    hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/command/CreateConnectionCommand.java
    hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialog.java
    hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialogColumnTab.java
    hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/dialog/view/ViewEditDialog.java
    hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/utils/LabelStringUtil.java
    zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/Jiemamy.java
    zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/JiemamyFactory.java
    zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/facade/JiemamyFacade.java


-------------- next part --------------
Modified: artemis/trunk/jiemamy-core/pom.xml
===================================================================
--- artemis/trunk/jiemamy-core/pom.xml	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-core/pom.xml	2009-03-23 10:14:20 UTC (rev 2982)
@@ -143,7 +143,7 @@
       <!-- TODO ライセンス処理未完了 -->
       <groupId>net.sf.opencsv</groupId> 
       <artifactId>opencsv</artifactId> 
-      <version>1.8</version> 
+      <version>1.8</version>
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/dialect/DefaultSqlEmitter.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/dialect/DefaultSqlEmitter.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/dialect/DefaultSqlEmitter.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -57,6 +57,7 @@
 import org.jiemamy.model.sql.SqlStatement;
 import org.jiemamy.model.sql.Token;
 import org.jiemamy.utils.CollectionsUtil;
+import org.jiemamy.utils.Disablable;
 import org.jiemamy.utils.EntityDependencyCalculator;
 import org.jiemamy.utils.model.DataTypeUtil;
 import org.jiemamy.utils.model.ForeignKeyUtil;
@@ -97,6 +98,10 @@
 		}
 		
 		for (EntityModel entityModel : EntityDependencyCalculator.getSortedEntityList(rootModel)) {
+			if (entityModel.hasAdapter(Disablable.class)
+					&& entityModel.getAdapter(Disablable.class).isDisabled() == Boolean.TRUE) {
+				continue;
+			}
 			if (StringUtils.isEmpty(entityModel.getBeginScript()) == false) {
 				result.add(new SqlStatementImpl(Literal.of(entityModel.getBeginScript(), LiteralType.FRAGMENT)));
 			}
@@ -110,6 +115,10 @@
 			if (entityModel instanceof TableModel) {
 				TableModel tableModel = (TableModel) entityModel;
 				for (IndexModel indexModel : tableModel.getIndexes()) {
+					if (indexModel.hasAdapter(Disablable.class)
+							&& indexModel.getAdapter(Disablable.class).isDisabled() == Boolean.TRUE) {
+						continue;
+					}
 					if (config.emitDropStatements()) {
 						result.add(emitDropIndexStatement(indexModel));
 					}
@@ -166,6 +175,7 @@
 		List<IndexColumnModel> indexColumns = indexModel.getIndexColumns();
 		for (IndexColumnModel indexColumnModel : indexColumns) {
 			tokens.addAll(emitIndexColumnClause(indexColumnModel));
+			tokens.add(Separator.COMMA);
 		}
 		tokens.remove(tokens.size() - 1);
 		tokens.add(Separator.RIGHT_PAREN);
@@ -229,10 +239,10 @@
 	}
 	
 	/**
-	 * TODO for daisuke
+	 * インデックスカラムの定義句を出力する。
 	 * 
-	 * @param indexColumnModel
-	 * @return 
+	 * @param indexColumnModel 対象インデックスカラム
+	 * @return トークンシーケンス
 	 */
 	protected List<Token> emitIndexColumnClause(IndexColumnModel indexColumnModel) {
 		List<Token> tokens = CollectionsUtil.newArrayList();
@@ -242,7 +252,6 @@
 		tokens.add(Identifier.of(columnModel.getName()));
 		SortOrder sortOrder = indexColumnModel.getSortOrder();
 		tokens.addAll(tokenResolver.resolve(sortOrder));
-		tokens.add(Separator.COMMA);
 		return tokens;
 	}
 	
@@ -538,6 +547,10 @@
 				tokens.add(Identifier.of(tableModel.getName()));
 				tokens.add(Separator.LEFT_PAREN);
 				for (AttributeModel attributeModel : tableModel.getAttributes()) {
+					if (attributeModel.hasAdapter(Disablable.class)
+							&& attributeModel.getAdapter(Disablable.class).isDisabled() == Boolean.TRUE) {
+						continue;
+					}
 					AttributeEmitStrategy strategy = AttributeEmitStrategy.fromAttribute(attributeModel);
 					List<Token> attributes = strategy.emit(attributeModel, resolver, tokenResolver);
 					tokens.addAll(attributes);

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/dialect/generic/GenericDialect.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/dialect/generic/GenericDialect.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/dialect/generic/GenericDialect.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -48,7 +48,7 @@
  * 全てのSQL方言に対応し得る、最大公約数的なSQL方言実装クラス。
  * @author  daisuke
  */
-public class GenericDialect implements Dialect {
+public final class GenericDialect implements Dialect {
 	
 	private DataTypeResolver dataTypeResolver = new DefaultDataTypeResolver(this);
 	

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/JiemamyFacadeImpl.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/JiemamyFacadeImpl.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/JiemamyFacadeImpl.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -21,9 +21,11 @@
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.Validate;
 
 import org.jiemamy.Jiemamy;
+import org.jiemamy.JiemamyFactory;
 import org.jiemamy.JiemamyProperty;
 import org.jiemamy.editcommand.Command;
 import org.jiemamy.editcommand.CommandProcessor;
@@ -53,6 +55,7 @@
 import org.jiemamy.model.attribute.ColumnRef;
 import org.jiemamy.model.attribute.constraint.ForeignKey;
 import org.jiemamy.model.attribute.constraint.KeyConstraint;
+import org.jiemamy.model.attribute.constraint.LocalKeyConstraint;
 import org.jiemamy.model.dataset.DataSetModel;
 import org.jiemamy.model.dataset.RecordModel;
 import org.jiemamy.model.datatype.DomainModel;
@@ -64,6 +67,7 @@
 import org.jiemamy.utils.CollectionsUtil;
 import org.jiemamy.utils.EssentialStack;
 import org.jiemamy.utils.EssentialStacks;
+import org.jiemamy.utils.model.AttributeUtil;
 import org.jiemamy.utils.model.EntityUtil;
 import org.jiemamy.utils.model.ForeignKeyUtil;
 import org.jiemamy.utils.model.TableUtil;
@@ -186,6 +190,33 @@
 	}
 	
 	public void removeAttribute(TableModel tableModel, AttributeModel attributeModel) {
+		if (attributeModel instanceof LocalKeyConstraint) {
+			LocalKeyConstraint localKeyConstraint = (LocalKeyConstraint) attributeModel;
+			TableModel definedTable = AttributeUtil.getDefinedTable(localKeyConstraint);
+			Collection<EntityModel> dependentEntities = EntityUtil.getDependentEntities(definedTable, false);
+			for (EntityModel entityModel : dependentEntities) {
+				if (entityModel instanceof TableModel) {
+					TableModel dependentTable = (TableModel) entityModel;
+					List<ForeignKey> foreignKeys = TableUtil.getAttributes(dependentTable, ForeignKey.class);
+					for (ForeignKey foreignKey : foreignKeys) {
+						if (ForeignKeyUtil.getReferenceKeyConstraint(foreignKey) == null) {
+							removeAttribute(dependentTable, foreignKey);
+						}
+					}
+				} else {
+					// TODO
+				}
+			}
+		}
+		
+		if (attributeModel instanceof ColumnModel) {
+			ColumnModel columnModel = (ColumnModel) attributeModel;
+			List<KeyConstraint> keys = TableUtil.getAttributes(tableModel, KeyConstraint.class, true);
+			for (KeyConstraint keyConstraint : keys) {
+				removeKeyColumn(keyConstraint, columnModel);
+			}
+		}
+		
 		RemoveAttributeCommand command = new RemoveAttributeCommand(tableModel, attributeModel);
 		command.execute(getCommandProcessor());
 		undoStack.push(command.getNegateCommand());
@@ -241,11 +272,35 @@
 	}
 	
 	public void removeKeyColumn(KeyConstraint keyConstraint, ColumnModel columnModel) {
+		JiemamyFactory factory = jiemamy.getFactory();
+		int index = keyConstraint.getKeyColumns().indexOf(factory.newReference(columnModel));
+		if (index == ArrayUtils.INDEX_NOT_FOUND) {
+			return;
+		}
+		
 		RemoveColumnFromColumnRefListCommand command =
 				new RemoveColumnFromColumnRefListCommand(keyConstraint, keyConstraint.getKeyColumns(), columnModel);
 		command.execute(getCommandProcessor());
 		undoStack.push(command.getNegateCommand());
 		
+		// キーカラムが空になってしまったキー制約は意味を成さない為、テーブルからも削除する。
+		if (keyConstraint.getKeyColumns().size() == 0) {
+			TableModel definedTable = AttributeUtil.getDefinedTable(keyConstraint);
+			if (definedTable != null) {
+				removeAttribute(definedTable, keyConstraint);
+			}
+		}
+		
+		// 外部キーであった場合は、対応する参照カラムも削除する。
+		if (keyConstraint instanceof ForeignKey) {
+			ForeignKey foreignKey = (ForeignKey) keyConstraint;
+			ColumnRef columnRef = foreignKey.getReferenceColumns().get(index);
+			ColumnModel columnModel2 = jiemamy.getReferenceResolver().resolve(columnRef);
+			RemoveColumnFromColumnRefListCommand command2 =
+					new RemoveColumnFromColumnRefListCommand(foreignKey, foreignKey.getReferenceColumns(), columnModel2);
+			command2.execute(getCommandProcessor());
+			undoStack.push(command2.getNegateCommand());
+		}
 	}
 	
 	public void rollback(SavePoint savePoint) {

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/enhance/FactoryExtension.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/enhance/FactoryExtension.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/enhance/FactoryExtension.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -268,10 +268,11 @@
 			
 			@Override
 			public <T>T newInstance(Jiemamy jiemamy, UUID id) {
+				JiemamyFactory factory = jiemamy.getFactory();
 				TableModelImpl tableModel = new TableModelImpl(jiemamy, id);
 				tableModel.setAttributes(new ArrayList<AttributeModel>());
 				tableModel.setIndexes(new ArrayList<IndexModel>());
-				tableModel.registerAdapter(new DisablableImpl());
+				tableModel.registerAdapter(factory.newAdapter(Disablable.class));
 				return (T) tableModel;
 			}
 		},
@@ -280,8 +281,9 @@
 			
 			@Override
 			public <T>T newInstance(Jiemamy jiemamy, UUID id) {
+				JiemamyFactory factory = jiemamy.getFactory();
 				ViewModelImpl viewModel = new ViewModelImpl(jiemamy, id);
-				viewModel.registerAdapter(new DisablableImpl());
+				viewModel.registerAdapter(factory.newAdapter(Disablable.class));
 				return (T) viewModel;
 			}
 		},
@@ -290,9 +292,10 @@
 			
 			@Override
 			public <T>T newInstance(Jiemamy jiemamy, UUID id) {
+				JiemamyFactory factory = jiemamy.getFactory();
 				ColumnModelImpl columnModel = new ColumnModelImpl(jiemamy, id);
-				columnModel.registerAdapter(new RepresentationAdapter());
-				columnModel.registerAdapter(new DisablableImpl());
+				columnModel.registerAdapter(factory.newAdapter(RepresentationAdapter.class));
+				columnModel.registerAdapter(factory.newAdapter(Disablable.class));
 				return (T) columnModel;
 			}
 		},
@@ -301,9 +304,10 @@
 			
 			@Override
 			public <T>T newInstance(Jiemamy jiemamy, UUID id) {
+				JiemamyFactory factory = jiemamy.getFactory();
 				PrimaryKeyImpl primaryKey = new PrimaryKeyImpl(jiemamy, id);
 				primaryKey.setKeyColumns(new ArrayList<ColumnRef>());
-				primaryKey.registerAdapter(new DisablableImpl());
+				primaryKey.registerAdapter(factory.newAdapter(Disablable.class));
 				return (T) primaryKey;
 			}
 		},
@@ -312,9 +316,10 @@
 			
 			@Override
 			public <T>T newInstance(Jiemamy jiemamy, UUID id) {
+				JiemamyFactory factory = jiemamy.getFactory();
 				UniqueKeyImpl uniqueKey = new UniqueKeyImpl(jiemamy, id);
 				uniqueKey.setKeyColumns(new ArrayList<ColumnRef>());
-				uniqueKey.registerAdapter(new DisablableImpl());
+				uniqueKey.registerAdapter(factory.newAdapter(Disablable.class));
 				return (T) uniqueKey;
 			}
 		},
@@ -323,10 +328,11 @@
 			
 			@Override
 			public <T>T newInstance(Jiemamy jiemamy, UUID id) {
+				JiemamyFactory factory = jiemamy.getFactory();
 				ForeignKeyImpl foreignKey = new ForeignKeyImpl(jiemamy, id);
 				foreignKey.setKeyColumns(new ArrayList<ColumnRef>());
 				foreignKey.setReferenceColumns(new ArrayList<ColumnRef>());
-				foreignKey.registerAdapter(new DisablableImpl());
+				foreignKey.registerAdapter(factory.newAdapter(Disablable.class));
 				return (T) foreignKey;
 			}
 		},
@@ -344,8 +350,9 @@
 			
 			@Override
 			public <T>T newInstance(Jiemamy jiemamy, UUID id) {
+				JiemamyFactory factory = jiemamy.getFactory();
 				TableCheckConstraintImpl checkConstraint = new TableCheckConstraintImpl(jiemamy, id);
-				checkConstraint.registerAdapter(new DisablableImpl());
+				checkConstraint.registerAdapter(factory.newAdapter(Disablable.class));
 				return (T) checkConstraint;
 			}
 		},
@@ -354,8 +361,9 @@
 			
 			@Override
 			public <T>T newInstance(Jiemamy jiemamy, UUID id) {
+				JiemamyFactory factory = jiemamy.getFactory();
 				ColumnCheckConstraintImpl checkConstraint = new ColumnCheckConstraintImpl(jiemamy, id);
-				checkConstraint.registerAdapter(new DisablableImpl());
+				checkConstraint.registerAdapter(factory.newAdapter(Disablable.class));
 				return (T) checkConstraint;
 			}
 		},
@@ -364,8 +372,9 @@
 			
 			@Override
 			public <T>T newInstance(Jiemamy jiemamy, UUID id) {
+				JiemamyFactory factory = jiemamy.getFactory();
 				NotNullConstraintImpl nnModel = new NotNullConstraintImpl(jiemamy, id);
-				nnModel.registerAdapter(new DisablableImpl());
+				nnModel.registerAdapter(factory.newAdapter(Disablable.class));
 				return (T) nnModel;
 			}
 		},
@@ -404,9 +413,10 @@
 			
 			@Override
 			public <T>T newInstance(Jiemamy jiemamy, UUID id) {
+				JiemamyFactory factory = jiemamy.getFactory();
 				IndexModelImpl indexModel = new IndexModelImpl(jiemamy, id);
 				indexModel.setColumns(new ArrayList<IndexColumnModel>());
-				indexModel.registerAdapter(new DisablableImpl());
+				indexModel.registerAdapter(factory.newAdapter(Disablable.class));
 				return (T) indexModel;
 			}
 		},

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/serializer/JiemamyDomParser.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/serializer/JiemamyDomParser.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/serializer/JiemamyDomParser.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -387,8 +387,7 @@
 			DomainModel domainModel = factory.newModel(DomainModel.class, DomUtil.getUUID(domainNode, CoreQName.ID));
 			domainModel.setName(XpathUtil.getTextContent(domainNode, "core:name"));
 			domainModel.setLogicalName(XpathUtil.getTextContent(domainNode, "core:logicalName"));
-			domainModel.setDataType((BuiltinDataType) getDataType((Element) XpathUtil.getNode(domainNode,
-					"core:dataType")));
+			domainModel.setDataType(getDataType((Element) XpathUtil.getNode(domainNode, "core:dataType")));
 			
 			Node nnNode = XpathUtil.getNode(domainNode, "core:notNull");
 			if (nnNode != null) {

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/model/AttributeUtil.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/model/AttributeUtil.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/model/AttributeUtil.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -85,7 +85,7 @@
 	 * この属性が所属するテーブルを取得する。
 	 * 
 	 * @param attribute 対象属性モデル
-	 * @return この属性が所属するテーブル
+	 * @return この属性が所属するテーブル. どのテーブルにも所属していない場合は{@code null}
 	 * @throws ModelConsistenceException
 	 * @throws IllegalArgumentException 引数に{@code null}を与えた場合
 	 */
@@ -99,8 +99,6 @@
 				return tableModel;
 			}
 		}
-		// THINK nullにするか例外にするか。
-//		throw new JiemamyRuntimeException();
 		return null;
 	}
 	

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/model/EntityUtil.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/model/EntityUtil.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/model/EntityUtil.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -129,6 +129,9 @@
 					ColumnRef columnRef = foreignKey.getReferenceColumns().get(0);
 					ColumnModel columnModel = resolver.resolve(columnRef);
 					TableModel referenceTableModel = AttributeUtil.getDefinedTable(columnModel);
+					if (referenceTableModel == null) {
+						continue;
+					}
 					if (referenceTableModel.getId().equals(standardEntity.getId())) {
 						dependents.add(dependentTableModel);
 					}

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/model/ForeignKeyUtil.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/model/ForeignKeyUtil.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/model/ForeignKeyUtil.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -92,7 +92,7 @@
 	 * この外部キーが参照するエンティティを取得する。
 	 * 
 	 * @param foreignKey 対象外部キー
-	 * @return この外部キーが参照するエンティティ
+	 * @return この外部キーが参照するエンティティ. 参照エンティティが見つからない場合は{@code null}
 	 * @throws ModelConsistenceException
 	 * @throws IllegalArgumentException 引数に{@code null}を与えた場合
 	 */
@@ -113,8 +113,6 @@
 				}
 			}
 		}
-		// THINK nullにするか例外にするか。
-//		throw new JiemamyRuntimeException();
 		return null;
 	}
 	

Modified: artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/internal/JiemamyFacadeImplTest.java
===================================================================
--- artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/internal/JiemamyFacadeImplTest.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/internal/JiemamyFacadeImplTest.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -84,7 +84,7 @@
 	}
 	
 	/**
-	 * {@link JiemamyFacadeImpl#addAttribute(TableModel, org.jiemamy.internal.model.attribute.AttributeModel)}のテスト。
+	 * {@link JiemamyFacadeImpl#addAttribute(TableModel, org.jiemamy.model.attribute.AttributeModel)}のテスト。
 	 */
 	@Test
 	public void test_addAttribute() {
@@ -126,7 +126,7 @@
 	}
 	
 	/**
-	 * {@link JiemamyFacadeImpl#addEntity(org.jiemamy.internal.model.entity.EntityModel)}のテスト。
+	 * {@link JiemamyFacadeImpl#addEntity(org.jiemamy.model.entity.EntityModel)}のテスト。
 	 */
 	@Test
 	public void test_addEntity() {
@@ -148,7 +148,7 @@
 	}
 	
 	/**
-	 * {@link JiemamyFacadeImpl#addKeyColumn(org.jiemamy.internal.model.attribute.constraint.KeyConstraint, ColumnModel)}のテスト。
+	 * {@link JiemamyFacadeImpl#addKeyColumn(org.jiemamy.model.attribute.constraint.KeyConstraint, ColumnModel)}のテスト。
 	 */
 	@Test
 	public void test_addKeyColumn() {
@@ -195,7 +195,7 @@
 	}
 	
 	/**
-	 * {@link JiemamyFacadeImpl#removeKeyColumn(org.jiemamy.internal.model.attribute.constraint.KeyConstraint, ColumnModel)}の例外テスト。
+	 * {@link JiemamyFacadeImpl#removeKeyColumn(org.jiemamy.model.attribute.constraint.KeyConstraint, ColumnModel)}の例外テスト。
 	 */
 	@Test(expected = IllegalArgumentException.class)
 	@Ignore

Modified: artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/internal/ReferenceResolverImplTest.java
===================================================================
--- artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/internal/ReferenceResolverImplTest.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/internal/ReferenceResolverImplTest.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -118,7 +118,7 @@
 	}
 	
 	/**
-	 * {@link ReferenceResolverImpl#isDescendFromElement(org.jiemamy.internal.model.JiemamyElement, java.util.UUID)}
+	 * {@link ReferenceResolverImpl#isDescendFromElement(org.jiemamy.model.JiemamyElement, java.util.UUID)}
 	 * 
 	 * @throws Exception 例外が発生した場合
 	 */

Modified: artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/model/ColumnUtilTest.java
===================================================================
--- artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/model/ColumnUtilTest.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/model/ColumnUtilTest.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -64,7 +64,7 @@
 	}
 	
 	/**
-	 * {@link ColumnUtil#isPartOfPrimaryKeyColumns(org.jiemamy.internal.model.attribute.ColumnModel)}のテスト。
+	 * {@link ColumnUtil#isPartOfPrimaryKeyColumns(org.jiemamy.model.attribute.ColumnModel)}のテスト。
 	 * 
 	 * @throws Exception 例外が発生した場合
 	 */

Modified: artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/model/DataSetUtilTest.java
===================================================================
--- artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/model/DataSetUtilTest.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/model/DataSetUtilTest.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -87,7 +87,7 @@
 	}
 	
 	/**
-	 * {@link DataSetUtil#exportToCsv(DataSetModel, org.jiemamy.internal.model.entity.TableModel, java.io.OutputStream)}のテスト。
+	 * {@link DataSetUtil#exportToCsv(DataSetModel, org.jiemamy.model.entity.TableModel, java.io.OutputStream)}のテスト。
 	 * 
 	 * @throws Exception 例外が発生した場合
 	 */
@@ -104,7 +104,7 @@
 	}
 	
 	/**
-	 * {@link DataSetUtil#importFromCsv(DataSetModel, org.jiemamy.internal.model.entity.TableModel, java.io.InputStream)}のテスト。
+	 * {@link DataSetUtil#importFromCsv(DataSetModel, org.jiemamy.model.entity.TableModel, java.io.InputStream)}のテスト。
 	 * 
 	 * @throws Exception 例外が発生した場合
 	 */

Modified: artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/model/RootModelUtilTest.java
===================================================================
--- artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/model/RootModelUtilTest.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/model/RootModelUtilTest.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -71,7 +71,7 @@
 	}
 	
 	/**
-	 * {@link RootModelUtil#getDialect(org.jiemamy.internal.model.RootModel)}のテスト。
+	 * {@link RootModelUtil#getDialect(org.jiemamy.model.RootModel)}のテスト。
 	 * 
 	 * @throws Exception 例外が発生した場合
 	 */
@@ -124,7 +124,7 @@
 	}
 	
 	/**
-	 * {@link RootModelUtil#normalize(org.jiemamy.internal.model.RootModel)}のテスト。
+	 * {@link RootModelUtil#normalize(org.jiemamy.model.RootModel)}のテスト。
 	 * 
 	 * @throws Exception 例外が発生した場合
 	 */

Modified: artemis/trunk/jiemamy-dialect-mysql/src/main/java/org/jiemamy/dialect/mysql/MySqlEmitter.java
===================================================================
--- artemis/trunk/jiemamy-dialect-mysql/src/main/java/org/jiemamy/dialect/mysql/MySqlEmitter.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-dialect-mysql/src/main/java/org/jiemamy/dialect/mysql/MySqlEmitter.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -41,6 +41,7 @@
 import org.jiemamy.model.sql.SqlStatement;
 import org.jiemamy.model.sql.Token;
 import org.jiemamy.utils.CollectionsUtil;
+import org.jiemamy.utils.Disablable;
 
 /**
  * MySQL用の{@link SqlEmitter}実装クラス。
@@ -97,6 +98,10 @@
 				tokens.add(Identifier.of(tableModel.getName()));
 				tokens.add(Separator.LEFT_PAREN);
 				for (AttributeModel attributeModel : tableModel.getAttributes()) {
+					if (attributeModel.hasAdapter(Disablable.class)
+							&& attributeModel.getAdapter(Disablable.class).isDisabled() == Boolean.TRUE) {
+						continue;
+					}
 					AttributeEmitStrategy strategy = AttributeEmitStrategy.fromAttribute(attributeModel);
 					List<Token> attributes = strategy.emit(attributeModel, dataTypeResolver, tokenResolver);
 					tokens.addAll(attributes);

Modified: artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/PostgreSqlEmitter.java
===================================================================
--- artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/PostgreSqlEmitter.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/PostgreSqlEmitter.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -153,7 +153,6 @@
 				}
 			}
 			
-			tokens.add(Separator.COMMA);
 			return tokens;
 		} else {
 			return super.emitIndexColumnClause(indexColumnModel);

Modified: artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/IndexColumnOption.java
===================================================================
--- artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/IndexColumnOption.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/IndexColumnOption.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -18,24 +18,25 @@
  */
 package org.jiemamy.dialect.postgresql.adapter;
 
+
 /**
- * TODO for daisuke
+ * {@link IndexColumnOption}に対するオプションモデル。
  * 
  * @author daisuke
  */
 public interface IndexColumnOption {
 	
 	/**
-	 * TODO for daisuke
+	 * ソートの際のNULLの扱いを取得する。
 	 * 
-	 * @return
+	 * @return ソートの際のNULLの扱い
 	 */
 	NullOrder getNullOrder();
 	
 	/**
-	 * TODO for daisuke
+	 * ソートの際のNULLの扱いを設定する。
 	 * 
-	 * @param nullOrder
+	 * @param nullOrder ソートの際のNULLの扱い
 	 */
 	void setNullOrder(NullOrder nullOrder);
 	

Modified: artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/IndexMethodType.java
===================================================================
--- artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/IndexMethodType.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/IndexMethodType.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -19,16 +19,16 @@
 package org.jiemamy.dialect.postgresql.adapter;
 
 /**
- * TODO for daisuke
+ * インデックス構築アルゴリズムを示すインターフェイス。
  * 
  * @author daisuke
  */
 public interface IndexMethodType {
 	
 	/**
-	 * TODO for daisuke
+	 * インデックス構築アルゴリズムの文字列表現。SQL上で直接使用される。
 	 * 
-	 * @return
+	 * @return インデックス構築アルゴリズム
 	 */
 	String toString();
 }

Modified: artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/IndexOption.java
===================================================================
--- artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/IndexOption.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/IndexOption.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -40,16 +40,16 @@
 	Integer getFillfactor();
 	
 	/**
-	 * TODO for daisuke
+	 * インデックス構築アルゴリズムを取得する。
 	 * 
-	 * @return
+	 * @return インデックス構築アルゴリズム
 	 */
 	IndexMethodType getIndexMethodType();
 	
 	/**
-	 * TODO for daisuke
+	 * 部分インデックス生成用条件を取得する。
 	 * 
-	 * @return
+	 * @return 部分インデックス生成用条件
 	 */
 	String getPredicate();
 	
@@ -68,16 +68,16 @@
 	void setFillfactor(Integer fillfactor);
 	
 	/**
-	 * TODO for daisuke
+	 * インデックス構築アルゴリズムを設定する。
 	 * 
-	 * @param indexMethodType
+	 * @param indexMethodType インデックス構築アルゴリズム
 	 */
 	void setIndexMethodType(IndexMethodType indexMethodType);
 	
 	/**
-	 * TODO for daisuke
+	 * 部分インデックス生成用条件を設定する。
 	 * 
-	 * @param predicate
+	 * @param predicate 部分インデックス生成用条件
 	 */
 	void setPredicate(String predicate);
 	

Modified: artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/IndexOptionImpl.java
===================================================================
--- artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/IndexOptionImpl.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/IndexOptionImpl.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -29,6 +29,7 @@
 @Adapter(AdapterType.MODEL)
 public class IndexOptionImpl extends AbstractPostgresObjectOption implements IndexOption {
 	
+	/** インデックス構築アルゴリズム */
 	private IndexMethodType indexMethodType;
 	
 	private Boolean concurrently;

Modified: artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/NullOrder.java
===================================================================
--- artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/NullOrder.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/NullOrder.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -19,7 +19,7 @@
 package org.jiemamy.dialect.postgresql.adapter;
 
 /**
- * TODO for daisuke
+ * ソートの際のNULLの扱いを示す列挙型。
  * 
  * @author daisuke
  */

Modified: artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/TableOption.java
===================================================================
--- artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/TableOption.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-dialect-postgresql/src/main/java/org/jiemamy/dialect/postgresql/adapter/TableOption.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -18,15 +18,27 @@
  */
 package org.jiemamy.dialect.postgresql.adapter;
 
+import org.jiemamy.model.entity.TableModel;
+
 /**
- * TODO for daisuke
+ * {@link TableModel}に対するオプションモデル。
  * 
  * @author daisuke
  */
 public interface TableOption extends PostgresObjectOption {
 	
+	/**
+	 * TODO for daisuke
+	 * 
+	 * @return
+	 */
 	CommitAction getCommitAction();
 	
+	/**
+	 * TODO for daisuke
+	 * 
+	 * @return
+	 */
 	Boolean isTemporary();
 	
 }

Modified: artemis/trunk/jiemamy-dialect-postgresql/src/test/java/org/jiemamy/dialect/postgresql/PostgresqlDialectTest.java
===================================================================
--- artemis/trunk/jiemamy-dialect-postgresql/src/test/java/org/jiemamy/dialect/postgresql/PostgresqlDialectTest.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-dialect-postgresql/src/test/java/org/jiemamy/dialect/postgresql/PostgresqlDialectTest.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -63,6 +63,7 @@
 	public DataSource dataSource;
 	
 	/** JDBCドライバ */
+	@SuppressWarnings("unused")
 	private Driver driver;
 	
 	private Dialect dialect;

Modified: artemis/trunk/jiemamy-view/src/main/java/org/jiemamy/internal/model/connection/ConnectionAdapterImpl.java
===================================================================
--- artemis/trunk/jiemamy-view/src/main/java/org/jiemamy/internal/model/connection/ConnectionAdapterImpl.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ artemis/trunk/jiemamy-view/src/main/java/org/jiemamy/internal/model/connection/ConnectionAdapterImpl.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -88,9 +88,9 @@
 	public String toString() {
 		StringBuilder sb = new StringBuilder();
 		sb.append("ConnectionAdapter(S=");
-		sb.append(getSource());
+		sb.append(coreForeignKey.getKeyColumns().size() > 0 ? getSource() : "UNKNOWN");
 		sb.append(", T=");
-		sb.append(getTarget());
+		sb.append(coreForeignKey.getReferenceColumns().size() > 0 ? getTarget() : "UNKNOWN");
 		sb.append(")");
 		return sb.toString();
 //		return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);

Modified: hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/action/ExportAction.java
===================================================================
--- hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/action/ExportAction.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/action/ExportAction.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -18,8 +18,10 @@
  */
 package org.jiemamy.eclipse.action;
 
+import java.io.IOException;
 import java.util.List;
 
+import org.apache.commons.lang.SystemUtils;
 import org.apache.commons.lang.Validate;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.ResourcesPlugin;
@@ -39,6 +41,7 @@
 import org.jiemamy.composer.ExportConfig;
 import org.jiemamy.composer.ExportException;
 import org.jiemamy.composer.Exporter;
+import org.jiemamy.composer.exporter.FileExportConfig;
 import org.jiemamy.eclipse.editor.JiemamyEditor;
 import org.jiemamy.eclipse.ui.ExporterWizard;
 import org.jiemamy.eclipse.utils.ExceptionHandler;
@@ -114,9 +117,26 @@
 			ExportConfig config = wizard.getConfig();
 			
 			// 実行
-			exporter.exportModel(rootModel, config);
+			boolean success = exporter.exportModel(rootModel, config);
 			
-			MessageDialog.openInformation(null, "export succeeded", "エクスポートが正常に完了しました。"); // RESOURCE
+			if (success) {
+				if (SystemUtils.IS_OS_WINDOWS && config instanceof FileExportConfig) {
+					FileExportConfig fileExportConfig = (FileExportConfig) config;
+					boolean result = MessageDialog.openQuestion(null, "Success", "エクスポートが完了しました。ファイルを開きますか?"); // RESOURCE
+					if (result) {
+						try {
+							Runtime.getRuntime().exec(
+									"cmd /c \"" + fileExportConfig.getOutputFile().getAbsolutePath() + "\"");
+						} catch (IOException e) {
+							MessageDialog.openError(shell, "Failed", "ファイルが開けませんでした。"); // RESOURCE
+						}
+					}
+				} else {
+					MessageDialog.openInformation(shell, "export succeeded", "エクスポートが正常に完了しました。"); // RESOURCE
+				}
+			} else {
+				MessageDialog.openWarning(shell, "export aborted", "エクスポートは行われませんでした。"); // RESOURCE
+			}
 		} catch (ExportException e) {
 			ExceptionHandler.handleException(e);
 		} finally {

Modified: hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/action/ImportAction.java
===================================================================
--- hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/action/ImportAction.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/action/ImportAction.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -113,9 +113,13 @@
 			ImportConfig config = wizard.getConfig();
 			
 			// 実行
-			importer.importModel(rootModel, config);
+			boolean success = importer.importModel(rootModel, config);
 			
-			MessageDialog.openInformation(null, "import succeeded", "インポートが正常に完了しました。"); // RESOURCE
+			if (success) {
+				MessageDialog.openInformation(shell, "import succeeded", "インポートが正常に完了しました。"); // RESOURCE
+			} else {
+				MessageDialog.openWarning(shell, "import aborted", "インポートは行われませんでした。"); // RESOURCE
+			}
 		} catch (ImportException e) {
 			ExceptionHandler.handleException(e);
 		} finally {

Modified: hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/command/CreateConnectionCommand.java
===================================================================
--- hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/command/CreateConnectionCommand.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/command/CreateConnectionCommand.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -22,6 +22,7 @@
 
 import org.eclipse.draw2d.geometry.Dimension;
 import org.eclipse.gef.commands.Command;
+import org.eclipse.jface.dialogs.MessageDialog;
 import org.seasar.eclipse.common.util.LogUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -88,13 +89,13 @@
 	@Override
 	public boolean canExecute() {
 		logger.debug(LogMarker.LIFECYCLE, "canExecute");
-		//		try {
-		//			source = connection.getSource();
-		//			target = connection.getTarget();
-		//		} catch (ModelConsistenceException e) {
-		//			logger.debug("ModelConsistenceException");
-		//			return false;
-		//		}
+//		try {
+//			source = connection.getSource();
+//			target = connection.getTarget();
+//		} catch (ModelConsistenceException e) {
+//			logger.debug("ModelConsistenceException");
+//			return false;
+//		}
 		
 		if (source == null || target == null) {
 			logger.debug("source or target is null: " + source + " " + target);
@@ -103,12 +104,14 @@
 		
 		// Viewとはコネクションが貼れない
 		if (source.unwrap() instanceof ViewModel || target.unwrap() instanceof ViewModel) {
+			MessageDialog.openError(null, "", "VIEWに対して外部キーを作成することはできません。");
 			LogUtil.log(JiemamyUIPlugin.getDefault(), "attempt to connect with VIEW"); // RESOURCE
 			return false;
 		}
 		
 		// 現状、付箋とはコネクションが貼れない
 		if (source.unwrap() instanceof StickyModel || target.unwrap() instanceof StickyModel) {
+			MessageDialog.openError(null, "", "付箋に対して外部キーを作成することはできません。");
 			LogUtil.log(JiemamyUIPlugin.getDefault(), "attempt to connect with STICKY"); // RESOURCE
 			return false;
 		}
@@ -121,20 +124,21 @@
 		
 		// ローカルキーが1つもないテーブルへは外部キーが貼れない
 		if (getKey((TableModel) target.unwrap()) == null) {
+			MessageDialog.openError(null, "", "キーが存在しないテーブルを参照する外部キーを作成することはできません。");
 			LogUtil.log(JiemamyUIPlugin.getDefault(), "attempt to connect to TABLE without local keys"); // RESOURCE
 			return false;
 		}
 		
 		// THINK 違うキー同士で参照してる可能性は?
-		//		if (connection.unwrap() != null) {
-		//			// 循環参照の禁止(ターゲットの親に自分がいたら、参照不可)
-		//			
-		//			Collection<EntityModel> refs = EntityUtil.getReferenceEntities(target.unwrap(), true);
-		//			if (refs.contains(source.unwrap())) {
-		//				LogUtil.log(JiemamyPlugin.getDefault(), "attempt to create cyclic connection"); // RESOURCE
-		//				return false;
-		//			}
-		//		}
+//		if (connection.unwrap() != null) {
+//			// 循環参照の禁止(ターゲットの親に自分がいたら、参照不可)
+//			
+//			Collection<EntityModel> refs = EntityUtil.getReferenceEntities(target.unwrap(), true);
+//			if (refs.contains(source.unwrap())) {
+//				LogUtil.log(JiemamyPlugin.getDefault(), "attempt to create cyclic connection"); // RESOURCE
+//				return false;
+//			}
+//		}
 		
 		return true;
 	}

Modified: hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialog.java
===================================================================
--- hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialog.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialog.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -41,6 +41,7 @@
 import org.eclipse.swt.widgets.TabFolder;
 import org.eclipse.swt.widgets.Text;
 
+import org.jiemamy.JiemamyFactory;
 import org.jiemamy.JiemamyProperty.EntityProperty;
 import org.jiemamy.eclipse.Images;
 import org.jiemamy.eclipse.JiemamyUIPlugin;
@@ -55,6 +56,7 @@
 import org.jiemamy.model.entity.EntityModel;
 import org.jiemamy.model.entity.TableModel;
 import org.jiemamy.model.node.NodeAdapter;
+import org.jiemamy.utils.Disablable;
 import org.jiemamy.utils.model.JiemamyPropertyUtil;
 import org.jiemamy.utils.model.TableUtil;
 
@@ -117,7 +119,7 @@
 		
 		// ---- A. 最上段名称欄
 		Composite composite = (Composite) super.createDialogArea(parent);
-		composite.setLayout(new GridLayout(6, false));
+		composite.setLayout(new GridLayout(7, false));
 		
 		// ---- A-1. テーブル名
 		Label label = new Label(composite, SWT.NONE);
@@ -168,10 +170,29 @@
 			}
 		});
 		
+		final Button btnDisable = new Button(composite, SWT.CHECK);
+		btnDisable.setText("無効"); // RESOURCE
+		btnDisable.addSelectionListener(new SelectionAdapter() {
+			
+			@Override
+			public void widgetSelected(SelectionEvent evt) {
+				if (tableModel.hasAdapter(Disablable.class) == false) {
+					JiemamyFactory factory = tableModel.getJiemamy().getFactory();
+					tableModel.registerAdapter(factory.newAdapter(Disablable.class));
+				}
+				tableModel.getAdapter(Disablable.class).setDisabled(btnDisable.getSelection());
+			}
+			
+		});
+		if (tableModel.hasAdapter(Disablable.class)
+				&& tableModel.getAdapter(Disablable.class).isDisabled() == Boolean.TRUE) {
+			btnDisable.setSelection(true);
+		}
+		
 		// ---- B. タブ
 		TabFolder tabFolder = new TabFolder(composite, SWT.NULL);
 		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 6;
+		gd.horizontalSpan = 7;
 		tabFolder.setLayoutData(gd);
 		
 		// ---- B-1. カラム

Modified: hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialogColumnTab.java
===================================================================
--- hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialogColumnTab.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialogColumnTab.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -100,6 +100,7 @@
 import org.jiemamy.model.datatype.DomainRef;
 import org.jiemamy.model.entity.TableModel;
 import org.jiemamy.utils.CollectionsUtil;
+import org.jiemamy.utils.Disablable;
 import org.jiemamy.utils.LogMarker;
 import org.jiemamy.utils.model.ColumnUtil;
 import org.jiemamy.utils.model.JiemamyPropertyUtil;
@@ -293,6 +294,8 @@
 		
 		private Button chkIsPK;
 		
+		private Button chkIsDisabled;
+		
 		//		private Button chkIsRepresentation;
 		
 		private Text txtDescription;
@@ -377,6 +380,8 @@
 			
 			chkIsNotNull.addSelectionListener(editListener);
 			
+			chkIsDisabled.addSelectionListener(editListener);
+			
 //			chkIsRepresentation.addSelectionListener(editListener);
 			
 			txtDefaultValue.addFocusListener(new TextSelectionAdapter(txtDefaultValue));
@@ -528,6 +533,9 @@
 			chkIsNotNull = new Button(cmpChecks, SWT.CHECK);
 			chkIsNotNull.setText("NOT NULL(&N)"); // RESOURCE
 			
+			chkIsDisabled = new Button(cmpChecks, SWT.CHECK);
+			chkIsDisabled.setText("無効"); // RESOURCE
+			
 //			chkIsRepresentation = new Button(cmpChecks, SWT.CHECK);
 //			chkIsRepresentation.setText("代表"); // RESOURCE
 			
@@ -622,7 +630,8 @@
 			cmbDataType.setText(StringUtils.EMPTY);
 			chkIsPK.setSelection(false);
 			chkIsNotNull.setSelection(false);
-			//			chkIsRepresentation.setSelection(false);
+			chkIsDisabled.setSelection(false);
+//			chkIsRepresentation.setSelection(false);
 			txtDefaultValue.setText(StringUtils.EMPTY);
 			txtDescription.setText(StringUtils.EMPTY);
 			
@@ -633,7 +642,8 @@
 			cmbDataType.setEnabled(false);
 			chkIsPK.setEnabled(false);
 			chkIsNotNull.setEnabled(false);
-			//			chkIsRepresentation.setEnabled(false);
+			chkIsDisabled.setEnabled(false);
+//			chkIsRepresentation.setEnabled(false);
 			txtDefaultValue.setEnabled(false);
 			txtDescription.setEnabled(false);
 			
@@ -655,6 +665,7 @@
 			txtDescription.setEnabled(true);
 			chkIsPK.setEnabled(true);
 			chkIsNotNull.setEnabled(true);
+			chkIsDisabled.setEnabled(true);
 //			chkIsRepresentation.setEnabled(true);
 			
 			DataType dataType = columnModel.getDataType();
@@ -708,6 +719,13 @@
 			
 			chkIsPK.setSelection(ColumnUtil.isPartOfPrimaryKeyColumns(columnModel));
 			
+			if (columnModel.hasAdapter(Disablable.class)
+					&& columnModel.getAdapter(Disablable.class).isDisabled() == Boolean.TRUE) {
+				chkIsDisabled.setSelection(true);
+			} else {
+				chkIsDisabled.setSelection(false);
+			}
+			
 //			chkIsTypical.setSelection(column.getConstraint(DefinitionModel.CONSTRAINT_TYPICAL));
 		}
 		
@@ -873,11 +891,7 @@
 				// ignore
 			}
 			if (chkIsPK.getSelection() == false && primaryKey != null) {
-				try {
-					jiemamyFacade.removeKeyColumn(primaryKey, columnModel);
-				} catch (IllegalArgumentException e) {
-					// ignore
-				}
+				jiemamyFacade.removeKeyColumn(primaryKey, columnModel);
 			} else {
 				if (primaryKey == null) {
 					primaryKey = factory.newModel(PrimaryKey.class);
@@ -901,6 +915,15 @@
 				jiemamyFacade.changeModelProperty(checkConstraint, CheckConstraintProperty.expression, expression);
 			}
 			
+			if (chkIsDisabled.getSelection() == false && columnModel.hasAdapter(Disablable.class)) {
+				columnModel.unregisterAdapter(Disablable.class);
+			} else {
+				if (columnModel.hasAdapter(Disablable.class) == false) {
+					columnModel.registerAdapter(factory.newAdapter(Disablable.class));
+				}
+				columnModel.getAdapter(Disablable.class).setDisabled(true);
+			}
+			
 //			RepresentationAdapter representationAdapter = tableModel.getAdapter(RepresentationAdapter.class);
 //			if (chkIsRepresentation.getSelection()) {
 //				representationAdapter.setRepresentation(true);

Modified: hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/dialog/view/ViewEditDialog.java
===================================================================
--- hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/dialog/view/ViewEditDialog.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/dialog/view/ViewEditDialog.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -36,6 +36,7 @@
 import org.eclipse.swt.widgets.TabFolder;
 import org.eclipse.swt.widgets.Text;
 
+import org.jiemamy.JiemamyFactory;
 import org.jiemamy.JiemamyProperty.EntityProperty;
 import org.jiemamy.JiemamyProperty.ViewProperty;
 import org.jiemamy.eclipse.Images;
@@ -47,6 +48,7 @@
 import org.jiemamy.facade.JiemamyViewFacade;
 import org.jiemamy.model.entity.ViewModel;
 import org.jiemamy.model.node.NodeAdapter;
+import org.jiemamy.utils.Disablable;
 import org.jiemamy.utils.model.JiemamyPropertyUtil;
 
 /**
@@ -113,7 +115,7 @@
 		getShell().setText(Messages.Dialog_Title);
 		
 		Composite composite = (Composite) super.createDialogArea(parent);
-		composite.setLayout(new GridLayout(6, false));
+		composite.setLayout(new GridLayout(7, false));
 		
 		// ---- A-1. ビュー名
 		Label label = new Label(composite, SWT.NULL);
@@ -164,6 +166,24 @@
 			}
 		});
 		
+		final Button btnDisable = new Button(composite, SWT.CHECK);
+		btnDisable.setText("無効"); // RESOURCE
+		btnDisable.addSelectionListener(new SelectionAdapter() {
+			
+			@Override
+			public void widgetSelected(SelectionEvent evt) {
+				if (viewModel.hasAdapter(Disablable.class) == false) {
+					JiemamyFactory factory = viewModel.getJiemamy().getFactory();
+					viewModel.registerAdapter(factory.newAdapter(Disablable.class));
+				}
+				viewModel.getAdapter(Disablable.class).setDisabled(btnDisable.getSelection());
+			}
+			
+		});
+		if (viewModel.hasAdapter(Disablable.class) && viewModel.getAdapter(Disablable.class).isDisabled()) {
+			btnDisable.setSelection(true);
+		}
+		
 		// ---- A-4. ラベル
 		label = new Label(composite, SWT.NULL);
 		label.setText(Messages.Message);
@@ -174,7 +194,7 @@
 		// ---- B. タブ
 		TabFolder tabFolder = new TabFolder(composite, SWT.NONE);
 		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 6;
+		gd.horizontalSpan = 7;
 		tabFolder.setLayoutData(gd);
 		
 		// ---- B-1. Definition

Modified: hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/utils/LabelStringUtil.java
===================================================================
--- hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/utils/LabelStringUtil.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ hestia/trunk/org.jiemamy.eclipse.ui/src/main/java/org/jiemamy/eclipse/editor/utils/LabelStringUtil.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -45,7 +45,7 @@
  * @author daisuke
  */
 public class LabelStringUtil {
-
+	
 	/**
 	 * DataTypeに対する表示用文字列を取得する。
 	 * 
@@ -74,7 +74,7 @@
 			return DataTypeUtil.toBuiltinDataType(dataType, resolver).getTypeName();
 		}
 	}
-
+	
 	/**
 	 * JiemamyElementに対する表示用文字列を取得する。
 	 * 
@@ -108,30 +108,38 @@
 			ForeignKey foreignKey = (ForeignKey) targetElement;
 			ReferenceResolver resolver = rootModel.getJiemamy().getReferenceResolver();
 			StringBuilder sb = new StringBuilder();
-
+			
 			if (foreignKey.getName() != null) {
 				sb.append(foreignKey.getName()).append("\n");
 			}
-
-			int size = foreignKey.getReferenceColumns().size();
+			
+			int size = Math.max(foreignKey.getReferenceColumns().size(), foreignKey.getKeyColumns().size());
 			for (int i = 0; i < size; i++) {
 				if (i != 0) {
 					sb.append("\n");
 				}
-				ColumnRef keyColumnRef = foreignKey.getKeyColumns().get(i);
-				ColumnRef referenceColumnRef = foreignKey.getReferenceColumns().get(i);
-				ColumnModel keyColumn = resolver.resolve(keyColumnRef);
-				ColumnModel referenceColumn = resolver.resolve(referenceColumnRef);
-				sb.append(keyColumn.getName());
+				if (foreignKey.getKeyColumns().size() > i) {
+					ColumnRef keyColumnRef = foreignKey.getKeyColumns().get(i);
+					ColumnModel keyColumn = resolver.resolve(keyColumnRef);
+					sb.append(keyColumn.getName());
+				} else {
+					sb.append("UNKNOWN");
+				}
 				sb.append(" -> ");
-				sb.append(referenceColumn.getName());
+				if (foreignKey.getReferenceColumns().size() > i) {
+					ColumnRef referenceColumnRef = foreignKey.getReferenceColumns().get(i);
+					ColumnModel referenceColumn = resolver.resolve(referenceColumnRef);
+					sb.append(referenceColumn.getName());
+				} else {
+					sb.append("UNKNOWN");
+				}
 			}
-
+			
 			return sb.toString();
 		}
 		return "unknown label: " + targetElement.getClass().getName();
 	}
-
+	
 	private LabelStringUtil() {
 	}
 }

Modified: zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/Jiemamy.java
===================================================================
--- zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/Jiemamy.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/Jiemamy.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -246,10 +246,11 @@
 	}
 	
 	/**
-	 * TODO for daisuke
+	 * 新しいファサードインスタンスを生成し、取得する。
 	 * 
-	 * @param <T>
-	 * @return
+	 * @param <T> 取得するファサードの型
+	 * @param clazz 取得するファサードの型
+	 * @return 新しいファサード
 	 * @since 0.2
 	 */
 	public <T extends JiemamyFacade>T newFacade(Class<T> clazz) {

Modified: zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/JiemamyFactory.java
===================================================================
--- zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/JiemamyFactory.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/JiemamyFactory.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -143,11 +143,11 @@
 	<T extends DataType>T newDataType(DataTypeMold<T> mold);
 	
 	/**
-	 * TODO for daisuke
+	 * 新しいファサードのインスタンスを生成し、取得する。
 	 * 
-	 * @param <T> 
-	 * @param clazz 
-	 * @return
+	 * @param <T> 取得するファサードの型
+	 * @param clazz 取得するファサードの型
+	 * @return 新しいファサード
 	 * @since 0.2
 	 */
 	<T extends JiemamyFacade>T newFacade(Class<T> clazz);

Modified: zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/facade/JiemamyFacade.java
===================================================================
--- zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/facade/JiemamyFacade.java	2009-03-23 05:04:57 UTC (rev 2981)
+++ zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/facade/JiemamyFacade.java	2009-03-23 10:14:20 UTC (rev 2982)
@@ -243,6 +243,8 @@
 	/**
 	 * {@link KeyConstraint}のキーカラム要素からカラムを削除する。
 	 * 
+	 * <p>削除の結果、キーカラムの数が0になった場合、キー制約自体を所属テーブルから削除する。</p>
+	 * 
 	 * @param keyConstraint 対象のキー制約
 	 * @param columnModel 削除するカラム
 	 * @since 0.2



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