[Jiemamy-notify:2502] commit [3488] [CORE-135] artemis-test内のEventBrokerImplTest内のテストを別のテストケースに分散させた。

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2009年 8月 28日 (金) 12:18:44 JST


Revision: 3488
          http://sourceforge.jp/projects/jiemamy/svn/view?view=rev&revision=3488
Author:   shin1
Date:     2009-08-28 12:18:44 +0900 (Fri, 28 Aug 2009)

Log Message:
-----------
[CORE-135] artemis-test内のEventBrokerImplTest内のテストを別のテストケースに分散させた。

Modified Paths:
--------------
    artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/internal/EventBrokerImplTest.java
    artemis/trunk/jiemamy-view/src/test/java/org/jiemamy/ArtemisViewTest.java

Added Paths:
-----------
    artemis/trunk/jiemamy-view/src/test/resources/datafiles/
    artemis/trunk/jiemamy-view/src/test/resources/datafiles/shin1ogawa.jer

Removed Paths:
-------------
    artemis/trunk/jiemamy-artemis-test/src/test/java/org/jiemamy/internal/EventBrokerImplTest.java

Deleted: artemis/trunk/jiemamy-artemis-test/src/test/java/org/jiemamy/internal/EventBrokerImplTest.java
===================================================================
--- artemis/trunk/jiemamy-artemis-test/src/test/java/org/jiemamy/internal/EventBrokerImplTest.java	2009-08-27 03:34:40 UTC (rev 3487)
+++ artemis/trunk/jiemamy-artemis-test/src/test/java/org/jiemamy/internal/EventBrokerImplTest.java	2009-08-28 03:18:44 UTC (rev 3488)
@@ -1,353 +0,0 @@
-/*
- * Copyright 2007-2009 Jiemamy Project and the Others.
- * Created on 2009/02/14
- *
- * This file is part of Jiemamy.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
- * either express or implied. See the License for the specific language
- * governing permissions and limitations under the License.
- */
-package org.jiemamy.internal;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.junit.Assert.assertThat;
-
-import java.io.InputStream;
-import java.util.List;
-
-import org.apache.commons.io.IOUtils;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.jiemamy.Artemis;
-import org.jiemamy.ArtemisView;
-import org.jiemamy.DispatchStrategy;
-import org.jiemamy.EventBroker;
-import org.jiemamy.Jiemamy;
-import org.jiemamy.JiemamyFactory;
-import org.jiemamy.JiemamyViewProperty.DiagramPresentationProperty;
-import org.jiemamy.editcommand.Command;
-import org.jiemamy.editcommand.CommandListener;
-import org.jiemamy.facade.JiemamyViewFacade;
-import org.jiemamy.facade.SavePoint;
-import org.jiemamy.internal.editcommand.AddAttributeCommand;
-import org.jiemamy.internal.editcommand.AddColumnToColumnRefListCommand;
-import org.jiemamy.internal.editcommand.AddEntityToRootCommand;
-import org.jiemamy.internal.editcommand.ModifyModelPropertyCommand;
-import org.jiemamy.model.DiagramPresentationModel;
-import org.jiemamy.model.DiagramPresentations;
-import org.jiemamy.model.JiemamyElement;
-import org.jiemamy.model.NodeProfile;
-import org.jiemamy.model.RootModel;
-import org.jiemamy.model.attribute.ColumnModel;
-import org.jiemamy.model.attribute.constraint.PrimaryKey;
-import org.jiemamy.model.entity.EntityModel;
-import org.jiemamy.model.entity.TableModel;
-import org.jiemamy.model.geometory.JmRectangle;
-import org.jiemamy.model.node.NodeAdapter;
-import org.jiemamy.serializer.JiemamySerializer;
-import org.jiemamy.serializer.SerializationException;
-import org.jiemamy.utils.CollectionsUtil;
-
-/**
- * j-core, j-viewを使った{@link EventBrokerImpl}のテスト。
- * 
- * @author shin1ogawa
- */
-public class EventBrokerImplTest {
-	
-	static final Logger LOGGER = LoggerFactory.getLogger(EventBrokerImplTest.class);
-	
-	private JiemamyFactory factory;
-	
-	private Jiemamy jiemamy;
-	
-	private EventBroker eventBroker;
-	
-
-	/**
-	 * テストを初期化する。
-	 * 
-	 * @throws Exception 例外が発生した場合
-	 */
-	@Before
-	public void setUp() throws Exception {
-		jiemamy = Jiemamy.newInstance(new Artemis(new ArtemisView()));
-		factory = jiemamy.getFactory();
-		eventBroker = jiemamy.getEventBroker();
-	}
-	
-	/**
-	 * テストの情報を破棄する。
-	 * 
-	 * @throws Exception 例外が発生した場合
-	 */
-	@After
-	public void tearDown() throws Exception {
-		jiemamy = null;
-		factory = null;
-		eventBroker = null;
-	}
-	
-	/**
-	 * j-coreの{@link RootModel}に対してj-viewの{@link DiagramPresentationModel}をAdaptし、
-	 * AdaptされたModelに対して変更コマンドを実行したときにj-coreの{@link EventBroker}が通知できるか。
-	 * @throws Exception 例外が発生した場合
-	 */
-	@Test
-	public void test01_AdaptされたDiaglramPresentationModelに対する変更が通知される() throws Exception {
-		RootModel rootModel = factory.getRootModel();
-		
-		TableModel tableModel = factory.newModel(TableModel.class);
-		new AddEntityToRootCommand(eventBroker, rootModel, tableModel).execute();
-		ColumnModel columnModel1 = factory.newModel(ColumnModel.class);
-		new AddAttributeCommand(eventBroker, tableModel, columnModel1).execute();
-		ColumnModel columnModel2 = factory.newModel(ColumnModel.class);
-		new AddAttributeCommand(eventBroker, tableModel, columnModel2).execute();
-		
-		DiagramPresentationModel presentation = factory.newModel(DiagramPresentationModel.class);
-		presentation.setName("testPresentation");
-		rootModel.getAdapter(DiagramPresentations.class).add(presentation);
-		
-		// RootModelを監視対象とするリスナを作成し、EventBrokerへ登録する。
-		CommandListenerMock rootModelListener = new CommandListenerMock(rootModel);
-		eventBroker.addListener(rootModelListener);
-		
-		// DiagramPresentationModelを変更する。
-		
-		new ModifyModelPropertyCommand<DiagramPresentationModel>(eventBroker, presentation,
-				DiagramPresentationProperty.name, "newName").execute();
-		assertThat(rootModelListener.commandList.size(), is(1));
-	}
-	
-	/**
-	 * 必要な通知のみが行われて、不必要な通知が行われていないかを確認する。
-	 */
-	@Test
-	public void test02_関係ないEntityへのEditコマンドの実行通知は受けない() {
-		RootModel rootModel = factory.getRootModel();
-		TableModel tableModel1 = factory.newModel(TableModel.class);
-		new AddEntityToRootCommand(eventBroker, rootModel, tableModel1).execute();
-		TableModel tableModel2 = factory.newModel(TableModel.class);
-		new AddEntityToRootCommand(eventBroker, rootModel, tableModel2).execute();
-		
-		CommandListenerMock rootModelListener = new CommandListenerMock(rootModel);
-		eventBroker.addListener(rootModelListener);
-		CommandListenerMock tableModel1Listener = new CommandListenerMock(tableModel1);
-		eventBroker.addListener(tableModel1Listener);
-		CommandListenerMock tableModel2Listener = new CommandListenerMock(tableModel2);
-		eventBroker.addListener(tableModel2Listener);
-		
-		ColumnModel columnModel1a = factory.newModel(ColumnModel.class);
-		new AddAttributeCommand(eventBroker, tableModel1, columnModel1a).execute();
-		ColumnModel columnModel1b = factory.newModel(ColumnModel.class);
-		new AddAttributeCommand(eventBroker, tableModel1, columnModel1b).execute();
-		ColumnModel columnModel2a = factory.newModel(ColumnModel.class);
-		new AddAttributeCommand(eventBroker, tableModel2, columnModel2a).execute();
-		
-		assertThat(rootModelListener.commandList.size(), is(3));
-		assertThat(tableModel1Listener.commandList.size(), is(2));
-		assertThat(tableModel2Listener.commandList.size(), is(1));
-	}
-	
-	/**
-	 * リスナとセットにして登録する、カスタマイズされたDispatchStrategyが適用されている事を確認する。
-	 */
-	@Test
-	public void test03_カスタマイズされたDispatchStrategyを適用する() {
-		RootModel rootModel = factory.getRootModel();
-		TableModel tableModel = factory.newModel(TableModel.class);
-		new AddEntityToRootCommand(eventBroker, rootModel, tableModel).execute();
-		
-		CommandListenerMock rootModelListener = new CommandListenerMock(rootModel);
-		eventBroker.addListener(rootModelListener);
-		CommandListenerMock tableModelListener1 = new CommandListenerMock(tableModel);
-		eventBroker.addListener(tableModelListener1);
-		CommandListenerMock tableModelListener2 = new CommandListenerMock(tableModel);
-		eventBroker.addListener(tableModelListener2, new TableDispatchStrategySample(tableModel));
-		
-		// TableModelを操作するEditCommand
-		ColumnModel columnModel = factory.newModel(ColumnModel.class);
-		new AddAttributeCommand(eventBroker, tableModel, columnModel).execute();
-		PrimaryKey primaryKey = factory.newModel(PrimaryKey.class);
-		new AddAttributeCommand(eventBroker, tableModel, primaryKey).execute();
-		new AddColumnToColumnRefListCommand(eventBroker, primaryKey, primaryKey.getKeyColumns(), columnModel).execute();
-		
-		assertThat(rootModelListener.commandList.size(), is(3));
-		assertThat(tableModelListener1.commandList.size(), is(3)); // column, primaryKey, columnRef[to primaryKey]
-		assertThat(tableModelListener2.commandList.size(), is(2)); // column, primaryKey
-	}
-	
-	/**
-	 * Entityの位置の変更が正しく通知されるか。
-	 * <p>EclipsePlugin側で無差別ディスパッチをはずすと、Entityの移動すら再描画されない、
-	 * という問題の再現を試みたい。再現する=このTestが通らないはず。</p>
-	 * <p>…と思うのだが、RootModelにはイベントが届いているよぅだ。</p>
-	 * <p>ちなみに、NodeProfileを保持している状態は以下のかたち?</p>
-	 * <pre>RootModel
-	 *   <-(Adapter)-DiagramPresentations(Collection)
-	 *     <--DiagramPresentationModel(その要素)
-	 *       <-(Field)-nodeProfiles(NodeAdapterをキーにしたMap)
-	 *         <--nodeProfile(その要素)</pre>
-	 * <p>これであれば、NodeProfileを変更しても、該当するTableModelにはイベントは飛んでこないはず!</p>
-	 * <p>例えばこの例のNodeProfileのような、Adapterを介した先の遠回りすぎるModelに対する編集コマンド
-	 * を監視する事が多数あるならば、DefaultDispatchStrategyを作り替える対応が必要。</p>
-	 * <p>まれなのであれば、NodeProfileの場合専用のDispatchStrategyを作ってしまうか。</p>
-	 * <p>どっちにしろ、カスタマイズされた無駄の少ないDispatchStrategyを作る為の仕様が必要ですねー。</p>
-	 * <p>仕様とは:何が変更された時にイベントを受け取りたいか?という仕様で、編集コマンドを軸に
-	 * 洗い出していくのがラクなのかも。</p>
-	 * 
-	 * @throws SerializationException デシリアライズに失敗した場合
-	 */
-	@Test
-	public void test04_changeNodeBoundary() throws SerializationException {
-		Jiemamy jiemamy = Jiemamy.newInstance(new Artemis(new ArtemisView()));
-		JiemamySerializer serializer = jiemamy.getSerializer();
-		InputStream in = null;
-		final RootModel rootModel;
-		try {
-			in = EventBrokerImplTest.class.getResourceAsStream("/datafiles/shin1ogawa.jer");
-			rootModel = serializer.deserialize(in);
-		} finally {
-			IOUtils.closeQuietly(in);
-		}
-		assertThat(rootModel, is(notNullValue()));
-		
-		// 念のため、EventBrokerにDefaultDispatchStrategyを設定する。
-		jiemamy.getEventBroker().setStrategy(new EventBrokerImpl.DefaultDispatchStrategy());
-//		jiemamy.getEventBroker().setStrategy(new DispatchStrategy() {
-//			
-//			// EventBroker#DefaultDispatchStrategyと同じ実装。
-//			public boolean needToDispatch(CommandListener listener, Command command) {
-//				UUID uuid = command.getTarget().getId();
-//				JiemamyElement targetModel = listener.getTargetModel();
-//				return ReferenceResolverImpl.isDescendFromElement(targetModel, uuid);
-//			}
-//		});
-		
-		CommandListenerMock rootModelListener = new CommandListenerMock(rootModel);
-		jiemamy.getEventBroker().addListener(rootModelListener);
-		
-		final DiagramPresentationModel presentation = rootModel.getAdapter(DiagramPresentations.class).get(0);
-		assertThat(presentation, is(notNullValue()));
-		
-		final EntityModel firstEntity = rootModel.getEntities().first();
-		LOGGER.debug("firstEntity=" + firstEntity.getName());
-		CommandListenerMock firstEntityListener1 = new CommandListenerMock(firstEntity);
-		jiemamy.getEventBroker().addListener(firstEntityListener1);
-		CommandListenerMock firstEntityListener2 = new CommandListenerMock(firstEntity);
-		jiemamy.getEventBroker().addListener(firstEntityListener2, new DispatchStrategy() {
-			
-			// 自身に関係するNodeProfileの変更を受け取る事ができるリスナのサンプル。
-			
-			NodeAdapter nodeAdapter;
-			
-			{
-				nodeAdapter = firstEntity.getAdapter(NodeAdapter.class);
-			}
-			
-
-			public boolean needToDispatch(CommandListener listener, Command command) {
-				JiemamyElement target = command.getTarget();
-				if (target instanceof NodeProfile) {
-					if (presentation.getNodeProfiles().get(nodeAdapter) == target) {
-						return true;
-					}
-				}
-				return false;
-			}
-		});
-		
-		EntityModel lastEntity = rootModel.getEntities().last();
-		LOGGER.debug("lastEntity=" + lastEntity.getName());
-		CommandListenerMock lastEntityListener = new CommandListenerMock(lastEntity);
-		jiemamy.getEventBroker().addListener(lastEntityListener);
-		
-		NodeAdapter nodeAdapter = firstEntity.getAdapter(NodeAdapter.class);
-		assertThat(nodeAdapter, is(notNullValue()));
-		NodeProfile nodeProfile = presentation.getNodeProfiles().get(nodeAdapter);
-		assertThat(nodeProfile, is(notNullValue()));
-		
-		// entityの位置の移動をエミュレート。移動するのはfirstEntity
-		JiemamyViewFacade facade = jiemamy.getFactory().newFacade(JiemamyViewFacade.class);
-		SavePoint savePoint = facade.save();
-		facade.changeNodeBoundary(0, nodeAdapter, new JmRectangle(10, 10));
-		assertThat(rootModelListener.commandList.size(), is(1));
-//		assertThat(firstEntityListener1.commandList.size(), is(1)); JavaDocに記述した理由で、イベントが届かない!
-		assertThat(firstEntityListener2.commandList.size(), is(1));
-		assertThat(lastEntityListener.commandList.size(), is(0)); // 影響を受けない
-		System.out.println(rootModelListener.commandList.get(0));
-		facade.rollback(savePoint);
-		assertThat(rootModelListener.commandList.size(), is(2));
-//		assertThat(firstEntityListener1.commandList.size(), is(2)); JavaDocに記述した理由で、イベントが届かない!
-		assertThat(firstEntityListener2.commandList.size(), is(2));
-		assertThat(lastEntityListener.commandList.size(), is(0)); // 影響を受けない
-		System.out.println(rootModelListener.commandList.get(1));
-	}
-	
-
-	/**
-	 * {@link CommandListener}のテスト用モッククラス。
-	 * 
-	 * @author shin1ogawa
-	 */
-	public static class CommandListenerMock implements CommandListener {
-		
-		/** 監視対象モデル */
-		JiemamyElement target;
-		
-		/** リスナのリスト */
-		List<Command> commandList = CollectionsUtil.newArrayList();
-		
-
-		/**
-		 * インスタンスを生成する。
-		 * 
-		 * @param target 監視対象モデル
-		 */
-		public CommandListenerMock(JiemamyElement target) {
-			this.target = target;
-		}
-		
-		public void commandExecuted(Command command) {
-			commandList.add(command);
-		}
-		
-		public JiemamyElement getTargetModel() {
-			return target;
-		}
-	}
-	
-	/**
-	 * EDITコマンドリスナと、EDITコマンド通知戦略のカスタマイズ登録のテスト用のクラス
-	 * 
-	 * @author shin1ogawa
-	 */
-	private static class TableDispatchStrategySample implements DispatchStrategy {
-		
-		TableModel tableModel;
-		
-
-		public TableDispatchStrategySample(TableModel tableModel) {
-			this.tableModel = tableModel;
-		}
-		
-		public boolean needToDispatch(CommandListener listener, Command command) {
-			// コマンドのtargetが自身である時のみ通知をしてもらう。
-			return command.getTarget() == tableModel;
-		}
-	}
-}

Modified: artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/internal/EventBrokerImplTest.java
===================================================================
--- artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/internal/EventBrokerImplTest.java	2009-08-27 03:34:40 UTC (rev 3487)
+++ artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/internal/EventBrokerImplTest.java	2009-08-28 03:18:44 UTC (rev 3488)
@@ -32,6 +32,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.jiemamy.DispatchStrategy;
 import org.jiemamy.EventBroker;
 import org.jiemamy.Jiemamy;
 import org.jiemamy.JiemamyFactory;
@@ -327,7 +328,80 @@
 		assertThat(primaryKey.getKeyColumns().size(), is(1)); // [ref]column2。
 	}
 	
+	/**
+	 * 必要な通知のみが行われて、不必要な通知が行われていないかを確認する。
+	 */
+	@Test
+	public void test04_関係ないEntityへのEditコマンドの実行通知は受けない() {
+		TableModel tableModel1 = factory.newModel(TableModel.class);
+		new AddEntityToRootCommand(eventBroker, rootModel, tableModel1).execute();
+		TableModel tableModel2 = factory.newModel(TableModel.class);
+		new AddEntityToRootCommand(eventBroker, rootModel, tableModel2).execute();
+		
+		CommandListenerMock rootModelListener = new CommandListenerMock(rootModel);
+		eventBroker.addListener(rootModelListener);
+		CommandListenerMock tableModel1Listener = new CommandListenerMock(tableModel1);
+		eventBroker.addListener(tableModel1Listener);
+		CommandListenerMock tableModel2Listener = new CommandListenerMock(tableModel2);
+		eventBroker.addListener(tableModel2Listener);
+		
+		ColumnModel columnModel1a = factory.newModel(ColumnModel.class);
+		new AddAttributeCommand(eventBroker, tableModel1, columnModel1a).execute();
+		ColumnModel columnModel1b = factory.newModel(ColumnModel.class);
+		new AddAttributeCommand(eventBroker, tableModel1, columnModel1b).execute();
+		ColumnModel columnModel2a = factory.newModel(ColumnModel.class);
+		new AddAttributeCommand(eventBroker, tableModel2, columnModel2a).execute();
+		
+		assertThat(rootModelListener.commandList.size(), is(3));
+		assertThat(tableModel1Listener.commandList.size(), is(2));
+		assertThat(tableModel2Listener.commandList.size(), is(1));
+	}
+	
+	/**
+	 * リスナとセットにして登録する、カスタマイズされたDispatchStrategyが適用されている事を確認する。
+	 */
+	@Test
+	public void test05_カスタマイズされたDispatchStrategyを適用する() {
+		
+		class TableDispatchStrategySample implements DispatchStrategy {
+			
+			TableModel tableModel;
+			
 
+			public TableDispatchStrategySample(TableModel tableModel) {
+				this.tableModel = tableModel;
+			}
+			
+			public boolean needToDispatch(CommandListener listener, Command command) {
+				// コマンドのtargetが自身である時のみ通知をしてもらう。
+				return command.getTarget() == tableModel;
+			}
+		}
+		
+		RootModel rootModel = factory.getRootModel();
+		TableModel tableModel = factory.newModel(TableModel.class);
+		new AddEntityToRootCommand(eventBroker, rootModel, tableModel).execute();
+		
+		CommandListenerMock rootModelListener = new CommandListenerMock(rootModel);
+		eventBroker.addListener(rootModelListener);
+		CommandListenerMock tableModelListener1 = new CommandListenerMock(tableModel);
+		eventBroker.addListener(tableModelListener1);
+		CommandListenerMock tableModelListener2 = new CommandListenerMock(tableModel);
+		eventBroker.addListener(tableModelListener2, new TableDispatchStrategySample(tableModel));
+		
+		// TableModelを操作するEditCommand
+		ColumnModel columnModel = factory.newModel(ColumnModel.class);
+		new AddAttributeCommand(eventBroker, tableModel, columnModel).execute();
+		PrimaryKey primaryKey = factory.newModel(PrimaryKey.class);
+		new AddAttributeCommand(eventBroker, tableModel, primaryKey).execute();
+		new AddColumnToColumnRefListCommand(eventBroker, primaryKey, primaryKey.getKeyColumns(), columnModel).execute();
+		
+		assertThat(rootModelListener.commandList.size(), is(3));
+		assertThat(tableModelListener1.commandList.size(), is(3)); // column, primaryKey, columnRef[to primaryKey]
+		assertThat(tableModelListener2.commandList.size(), is(2)); // column, primaryKey
+	}
+	
+
 	/**
 	 * {@link CommandListener}のテスト用モッククラス。
 	 * 

Modified: artemis/trunk/jiemamy-view/src/test/java/org/jiemamy/ArtemisViewTest.java
===================================================================
--- artemis/trunk/jiemamy-view/src/test/java/org/jiemamy/ArtemisViewTest.java	2009-08-27 03:34:40 UTC (rev 3487)
+++ artemis/trunk/jiemamy-view/src/test/java/org/jiemamy/ArtemisViewTest.java	2009-08-28 03:18:44 UTC (rev 3488)
@@ -26,12 +26,29 @@
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
 
+import java.io.InputStream;
+import java.util.List;
+
+import org.apache.commons.io.IOUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import org.jiemamy.JiemamyViewProperty.DiagramPresentationProperty;
+import org.jiemamy.editcommand.Command;
+import org.jiemamy.editcommand.CommandListener;
+import org.jiemamy.facade.JiemamyViewFacade;
+import org.jiemamy.facade.SavePoint;
+import org.jiemamy.internal.EventBrokerImpl;
+import org.jiemamy.internal.editcommand.AddAttributeCommand;
+import org.jiemamy.internal.editcommand.AddEntityToRootCommand;
+import org.jiemamy.internal.editcommand.ModifyModelPropertyCommand;
 import org.jiemamy.model.DiagramPresentationModel;
 import org.jiemamy.model.DiagramPresentations;
+import org.jiemamy.model.JiemamyElement;
+import org.jiemamy.model.NodeProfile;
 import org.jiemamy.model.RootModel;
 import org.jiemamy.model.attribute.ColumnModel;
 import org.jiemamy.model.attribute.ColumnRef;
@@ -46,14 +63,18 @@
 import org.jiemamy.model.dataset.RecordModel;
 import org.jiemamy.model.datatype.DomainModel;
 import org.jiemamy.model.datatype.DomainRef;
+import org.jiemamy.model.entity.EntityModel;
 import org.jiemamy.model.entity.TableModel;
 import org.jiemamy.model.entity.TableRef;
 import org.jiemamy.model.entity.ViewModel;
+import org.jiemamy.model.geometory.JmRectangle;
 import org.jiemamy.model.index.IndexColumnModel;
 import org.jiemamy.model.index.IndexModel;
 import org.jiemamy.model.node.NodeAdapter;
 import org.jiemamy.model.node.StickyModel;
 import org.jiemamy.serializer.JiemamySerializer;
+import org.jiemamy.serializer.SerializationException;
+import org.jiemamy.utils.CollectionsUtil;
 
 /**
  * {@link ArtemisView}のテストクラス。
@@ -62,6 +83,8 @@
  */
 public class ArtemisViewTest {
 	
+	static final Logger LOGGER = LoggerFactory.getLogger(ArtemisViewTest.class);
+	
 	private Jiemamy jiemamy;
 	
 	private Jiemamy jiemamyWithView;
@@ -232,4 +255,177 @@
 		
 		assertThat(serializerWithView.getClass(), is(not(instanceOf(serializer.getClass()))));
 	}
+	
+	/**
+	 * j-coreの{@link RootModel}に対してj-viewの{@link DiagramPresentationModel}をAdaptし、
+	 * AdaptされたModelに対して変更コマンドを実行したときにj-coreの{@link EventBroker}が通知できるか。
+	 * @throws Exception 例外が発生した場合
+	 */
+	@Test
+	public void test04_AdaptされたDiaglramPresentationModelに対する変更が通知される() throws Exception {
+		JiemamyFactory factory = jiemamyWithView.getFactory();
+		RootModel rootModel = factory.newModel(RootModel.class);
+		EventBroker eventBroker = jiemamyWithView.getEventBroker();
+		
+		TableModel tableModel = factory.newModel(TableModel.class);
+		new AddEntityToRootCommand(eventBroker, rootModel, tableModel).execute();
+		ColumnModel columnModel1 = factory.newModel(ColumnModel.class);
+		new AddAttributeCommand(eventBroker, tableModel, columnModel1).execute();
+		ColumnModel columnModel2 = factory.newModel(ColumnModel.class);
+		new AddAttributeCommand(eventBroker, tableModel, columnModel2).execute();
+		
+		DiagramPresentationModel presentation = factory.newModel(DiagramPresentationModel.class);
+		presentation.setName("testPresentation");
+		rootModel.getAdapter(DiagramPresentations.class).add(presentation);
+		
+		// RootModelを監視対象とするリスナを作成し、EventBrokerへ登録する。
+		CommandListenerMock rootModelListener = new CommandListenerMock(rootModel);
+		eventBroker.addListener(rootModelListener);
+		
+		// DiagramPresentationModelを変更する。
+		
+		new ModifyModelPropertyCommand<DiagramPresentationModel>(eventBroker, presentation,
+				DiagramPresentationProperty.name, "newName").execute();
+		assertThat(rootModelListener.commandList.size(), is(1));
+	}
+	
+	/**
+	 * Entityの位置の変更が正しく通知されるか。
+	 * <p>EclipsePlugin側で無差別ディスパッチをはずすと、Entityの移動すら再描画されない、
+	 * という問題の再現を試みたい。再現する=このTestが通らないはず。</p>
+	 * <p>…と思うのだが、RootModelにはイベントが届いているよぅだ。</p>
+	 * <p>ちなみに、NodeProfileを保持している状態は以下のかたち?</p>
+	 * <pre>RootModel
+	 *   <-(Adapter)-DiagramPresentations(Collection)
+	 *     <--DiagramPresentationModel(その要素)
+	 *       <-(Field)-nodeProfiles(NodeAdapterをキーにしたMap)
+	 *         <--nodeProfile(その要素)</pre>
+	 * <p>これであれば、NodeProfileを変更しても、該当するTableModelにはイベントは飛んでこないはず!</p>
+	 * <p>例えばこの例のNodeProfileのような、Adapterを介した先の遠回りすぎるModelに対する編集コマンド
+	 * を監視する事が多数あるならば、DefaultDispatchStrategyを作り替える対応が必要。</p>
+	 * <p>まれなのであれば、NodeProfileの場合専用のDispatchStrategyを作ってしまうか。</p>
+	 * <p>どっちにしろ、カスタマイズされた無駄の少ないDispatchStrategyを作る為の仕様が必要ですねー。</p>
+	 * <p>仕様とは:何が変更された時にイベントを受け取りたいか?という仕様で、編集コマンドを軸に
+	 * 洗い出していくのがラクなのかも。</p>
+	 * 
+	 * @throws SerializationException デシリアライズに失敗した場合
+	 */
+	@Test
+	public void test05_changeNodeBoundary() throws SerializationException {
+		Jiemamy jiemamy = Jiemamy.newInstance(new Artemis(new ArtemisView()));
+		JiemamySerializer serializer = jiemamy.getSerializer();
+		InputStream in = null;
+		final RootModel rootModel;
+		try {
+			in = ArtemisViewTest.class.getResourceAsStream("/datafiles/shin1ogawa.jer");
+			rootModel = serializer.deserialize(in);
+		} finally {
+			IOUtils.closeQuietly(in);
+		}
+		assertThat(rootModel, is(notNullValue()));
+		
+		// 念のため、EventBrokerにDefaultDispatchStrategyを設定する。
+		jiemamy.getEventBroker().setStrategy(new EventBrokerImpl.DefaultDispatchStrategy());
+//		jiemamy.getEventBroker().setStrategy(new DispatchStrategy() {
+//			
+//			// EventBroker#DefaultDispatchStrategyと同じ実装。
+//			public boolean needToDispatch(CommandListener listener, Command command) {
+//				UUID uuid = command.getTarget().getId();
+//				JiemamyElement targetModel = listener.getTargetModel();
+//				return ReferenceResolverImpl.isDescendFromElement(targetModel, uuid);
+//			}
+//		});
+		
+		CommandListenerMock rootModelListener = new CommandListenerMock(rootModel);
+		jiemamy.getEventBroker().addListener(rootModelListener);
+		
+		final DiagramPresentationModel presentation = rootModel.getAdapter(DiagramPresentations.class).get(0);
+		assertThat(presentation, is(notNullValue()));
+		
+		final EntityModel firstEntity = rootModel.getEntities().first();
+		LOGGER.debug("firstEntity=" + firstEntity.getName());
+		CommandListenerMock firstEntityListener1 = new CommandListenerMock(firstEntity);
+		jiemamy.getEventBroker().addListener(firstEntityListener1);
+		CommandListenerMock firstEntityListener2 = new CommandListenerMock(firstEntity);
+		jiemamy.getEventBroker().addListener(firstEntityListener2, new DispatchStrategy() {
+			
+			// 自身に関係するNodeProfileの変更を受け取る事ができるリスナのサンプル。
+			
+			NodeAdapter nodeAdapter;
+			
+			{
+				nodeAdapter = firstEntity.getAdapter(NodeAdapter.class);
+			}
+			
+
+			public boolean needToDispatch(CommandListener listener, Command command) {
+				JiemamyElement target = command.getTarget();
+				if (target instanceof NodeProfile) {
+					if (presentation.getNodeProfiles().get(nodeAdapter) == target) {
+						return true;
+					}
+				}
+				return false;
+			}
+		});
+		
+		EntityModel lastEntity = rootModel.getEntities().last();
+		LOGGER.debug("lastEntity=" + lastEntity.getName());
+		CommandListenerMock lastEntityListener = new CommandListenerMock(lastEntity);
+		jiemamy.getEventBroker().addListener(lastEntityListener);
+		
+		NodeAdapter nodeAdapter = firstEntity.getAdapter(NodeAdapter.class);
+		assertThat(nodeAdapter, is(notNullValue()));
+		NodeProfile nodeProfile = presentation.getNodeProfiles().get(nodeAdapter);
+		assertThat(nodeProfile, is(notNullValue()));
+		
+		// entityの位置の移動をエミュレート。移動するのはfirstEntity
+		JiemamyViewFacade facade = jiemamy.getFactory().newFacade(JiemamyViewFacade.class);
+		SavePoint savePoint = facade.save();
+		facade.changeNodeBoundary(0, nodeAdapter, new JmRectangle(10, 10));
+		assertThat(rootModelListener.commandList.size(), is(1));
+//		assertThat(firstEntityListener1.commandList.size(), is(1)); JavaDocに記述した理由で、イベントが届かない!
+		assertThat(firstEntityListener2.commandList.size(), is(1));
+		assertThat(lastEntityListener.commandList.size(), is(0)); // 影響を受けない
+		System.out.println(rootModelListener.commandList.get(0));
+		facade.rollback(savePoint);
+		assertThat(rootModelListener.commandList.size(), is(2));
+//		assertThat(firstEntityListener1.commandList.size(), is(2)); JavaDocに記述した理由で、イベントが届かない!
+		assertThat(firstEntityListener2.commandList.size(), is(2));
+		assertThat(lastEntityListener.commandList.size(), is(0)); // 影響を受けない
+		System.out.println(rootModelListener.commandList.get(1));
+	}
+	
+
+	/**
+	 * {@link CommandListener}のテスト用モッククラス。
+	 * 
+	 * @author shin1ogawa
+	 */
+	public static class CommandListenerMock implements CommandListener {
+		
+		/** 監視対象モデル */
+		JiemamyElement target;
+		
+		/** リスナのリスト */
+		List<Command> commandList = CollectionsUtil.newArrayList();
+		
+
+		/**
+		 * インスタンスを生成する。
+		 * 
+		 * @param target 監視対象モデル
+		 */
+		public CommandListenerMock(JiemamyElement target) {
+			this.target = target;
+		}
+		
+		public void commandExecuted(Command command) {
+			commandList.add(command);
+		}
+		
+		public JiemamyElement getTargetModel() {
+			return target;
+		}
+	}
 }

Added: artemis/trunk/jiemamy-view/src/test/resources/datafiles/shin1ogawa.jer
===================================================================
--- artemis/trunk/jiemamy-view/src/test/resources/datafiles/shin1ogawa.jer	                        (rev 0)
+++ artemis/trunk/jiemamy-view/src/test/resources/datafiles/shin1ogawa.jer	2009-08-28 03:18:44 UTC (rev 3488)
@@ -0,0 +1,658 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jiemamy xmlns="http://jiemamy.org/xml/ns/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="a7243a6c-716a-4642-b6da-33a0a71b35cd" version="0.3" xsi:schemaLocation="http://jiemamy.org/xml/ns/core http://jiemamy.org/xml/0.2.0/jiemamy-core.xsd http://jiemamy.org/xml/ns/view null">
+  <dialect>org.jiemamy.dialect.generic.GenericDialect</dialect>
+  <domains/>
+  <entities>
+    <table id="d2901430-27bc-428e-aefd-ffd4eb4b4fe7">
+      <name>TimeLineTypes</name>
+      <attributes>
+        <column id="fd725b85-219d-4a5f-b79f-7e371e445e18">
+          <name>id</name>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="56e1e283-947d-4aa5-b465-c0f2a70ae965"/>
+        </column>
+        <primaryKey id="277d0580-2660-4c72-a3fc-e693cbee746d">
+          <columnRefs>
+            <columnRef ref="fd725b85-219d-4a5f-b79f-7e371e445e18"/>
+          </columnRefs>
+        </primaryKey>
+        <column id="f83db387-877a-4968-ad99-f1550fabf078">
+          <name>name</name>
+          <dataType>
+            <typeCategory>VARCHAR</typeCategory>
+            <typeName>VARCHAR</typeName>
+            <adapter class="org.jiemamy.model.datatype.adapter.SizedDataTypeAdapter">
+              <size>64</size>
+            </adapter>
+          </dataType>
+          <notNull id="fc81bedf-0dcb-473b-904d-9972efdf222d"/>
+        </column>
+        <column id="3f609bb2-28c8-4c38-8095-fd38236270f7">
+          <name>adapterFQCN</name>
+          <dataType>
+            <typeCategory>VARCHAR</typeCategory>
+            <typeName>VARCHAR</typeName>
+            <adapter class="org.jiemamy.model.datatype.adapter.SizedDataTypeAdapter">
+              <size>64</size>
+            </adapter>
+          </dataType>
+          <notNull id="f25ba87d-8e7b-40ee-b4df-d6d2fc6b492d"/>
+        </column>
+      </attributes>
+      <indexes/>
+    </table>
+    <table id="db70da7f-5b9e-4152-96b3-e53bcd54af32">
+      <name>Tasks</name>
+      <logicalName>Tasks</logicalName>
+      <attributes>
+        <column id="f714bdc0-0c9a-490c-91b8-183849fbcf25">
+          <name>projectId</name>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="7b5242cc-7494-4ff0-8681-b63a0df68e6c"/>
+        </column>
+        <primaryKey id="51c9267b-573f-4423-933c-8454f6adcda1">
+          <columnRefs>
+            <columnRef ref="d4cd11d8-6082-4bef-b9a7-87427a37004a"/>
+          </columnRefs>
+        </primaryKey>
+        <column id="d4cd11d8-6082-4bef-b9a7-87427a37004a">
+          <name>id</name>
+          <logicalName>id</logicalName>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="458e15c1-3578-4187-be1b-7660affcc87f"/>
+        </column>
+        <column id="4a0d452c-860c-426e-8f04-8dd89647d70a">
+          <name>name</name>
+          <logicalName>name</logicalName>
+          <dataType>
+            <typeCategory>VARCHAR</typeCategory>
+            <typeName>VARCHAR</typeName>
+            <adapter class="org.jiemamy.model.datatype.adapter.SizedDataTypeAdapter">
+              <size>64</size>
+            </adapter>
+          </dataType>
+          <notNull id="a8e0166c-c6e1-40a9-bdd0-93de1a8dbb81"/>
+        </column>
+        <foreignKey id="0a1d4672-a1c2-46f0-8ce9-7f73c4d079b7">
+          <columnRefs>
+            <columnRef ref="f714bdc0-0c9a-490c-91b8-183849fbcf25"/>
+          </columnRefs>
+          <referenceColumns>
+            <columnRef ref="5fa5ce02-0765-4e71-8abc-bb74d7243b49"/>
+          </referenceColumns>
+        </foreignKey>
+      </attributes>
+      <indexes/>
+    </table>
+    <table id="f2798e8a-2dd0-4895-a940-fad6b2408a76">
+      <name>ProjectTimeline</name>
+      <attributes>
+        <column id="be1b41fc-9768-4113-b4ec-ce8d313e0e72">
+          <name>userId</name>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="45ba64a9-2099-41cf-bdb4-3b0e5392ff9e"/>
+        </column>
+        <column id="5b1e9a87-d7af-4f7e-9d37-06498d33037d">
+          <name>projectId</name>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="cccef729-788b-43bd-90ba-10214e164913"/>
+        </column>
+        <column id="dfb6e532-6754-4155-8cf8-7266739014cb">
+          <name>timelineId</name>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="e64769ae-a578-4bc0-851e-9ae53055cbe0"/>
+        </column>
+        <column id="78b92a9c-5440-41ca-9c05-f4742297a630">
+          <name>id</name>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="02b01a3d-46ca-4f4d-b8a5-3298e736e273"/>
+        </column>
+        <primaryKey id="5cfae11d-93e0-4537-ae87-75b027ed8d37">
+          <columnRefs>
+            <columnRef ref="78b92a9c-5440-41ca-9c05-f4742297a630"/>
+          </columnRefs>
+        </primaryKey>
+        <foreignKey id="54e7ac9e-8343-4ec3-9052-fc4def6d5517">
+          <columnRefs>
+            <columnRef ref="be1b41fc-9768-4113-b4ec-ce8d313e0e72"/>
+          </columnRefs>
+          <referenceColumns>
+            <columnRef ref="53480099-1d9f-48f8-a261-c69b4bcbd34e"/>
+          </referenceColumns>
+        </foreignKey>
+        <foreignKey id="c805d2f7-bc51-4b6e-a831-a946715b7593">
+          <columnRefs>
+            <columnRef ref="dfb6e532-6754-4155-8cf8-7266739014cb"/>
+          </columnRefs>
+          <referenceColumns>
+            <columnRef ref="66d84139-e9d4-4443-8f97-6571fd443b98"/>
+          </referenceColumns>
+        </foreignKey>
+        <foreignKey id="72746510-94de-44c3-a053-d9db1b04a2e5">
+          <columnRefs>
+            <columnRef ref="5b1e9a87-d7af-4f7e-9d37-06498d33037d"/>
+          </columnRefs>
+          <referenceColumns>
+            <columnRef ref="5fa5ce02-0765-4e71-8abc-bb74d7243b49"/>
+          </referenceColumns>
+        </foreignKey>
+      </attributes>
+      <indexes/>
+    </table>
+    <table id="06db6e2f-4ffb-4984-8566-d8aeaa145f5c">
+      <name>ProjectTypes</name>
+      <attributes>
+        <column id="3da99cd2-af80-4c0e-a384-e94ceea1536e">
+          <name>id</name>
+          <logicalName>id</logicalName>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="dd38cb33-b736-4e59-bf3d-3d0d2a60041b"/>
+        </column>
+        <primaryKey id="ca149e6c-dd21-408a-9c9d-24a07ab0bd3c">
+          <columnRefs>
+            <columnRef ref="3da99cd2-af80-4c0e-a384-e94ceea1536e"/>
+          </columnRefs>
+        </primaryKey>
+        <column id="1415b83a-5c79-4f50-bb9f-5a3791839d50">
+          <name>name</name>
+          <logicalName>name</logicalName>
+          <dataType>
+            <typeCategory>VARCHAR</typeCategory>
+            <typeName>VARCHAR</typeName>
+            <adapter class="org.jiemamy.model.datatype.adapter.SizedDataTypeAdapter">
+              <size>64</size>
+            </adapter>
+          </dataType>
+          <notNull id="063bbb23-0deb-4697-b44d-03c8b6749461"/>
+        </column>
+        <column id="da40c5ea-7ed5-427c-bb55-21c8009f9bf5">
+          <name>adapterFQCN</name>
+          <logicalName>adapterFQCN</logicalName>
+          <description>拡張クラスのFQCN</description>
+          <dataType>
+            <typeCategory>VARCHAR</typeCategory>
+            <typeName>VARCHAR</typeName>
+            <adapter class="org.jiemamy.model.datatype.adapter.SizedDataTypeAdapter">
+              <size>64</size>
+            </adapter>
+          </dataType>
+          <notNull id="2f167570-8157-4d9e-af46-5b106e36ff9e"/>
+        </column>
+      </attributes>
+      <indexes/>
+    </table>
+    <table id="09471b7e-e3df-433b-a851-0b5db3f71d1b">
+      <name>TimeLines</name>
+      <attributes>
+        <column id="207ca3d3-434a-4af8-b2a4-949d3623b928">
+          <name>userId</name>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="94537864-d50d-4735-9a42-eb77dfc4dfda"/>
+        </column>
+        <primaryKey id="eeb036ff-9b04-40df-a992-cf694e1fbc3a">
+          <columnRefs>
+            <columnRef ref="66d84139-e9d4-4443-8f97-6571fd443b98"/>
+          </columnRefs>
+        </primaryKey>
+        <column id="66d84139-e9d4-4443-8f97-6571fd443b98">
+          <name>id</name>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="a0c9630b-5eab-4ba7-b972-f32041c7af90"/>
+        </column>
+        <column id="c8e6d98a-f07d-4f33-a0b9-523b968a560d">
+          <name>name</name>
+          <dataType>
+            <typeCategory>VARCHAR</typeCategory>
+            <typeName>VARCHAR</typeName>
+            <adapter class="org.jiemamy.model.datatype.adapter.SizedDataTypeAdapter">
+              <size>64</size>
+            </adapter>
+          </dataType>
+          <notNull id="b8e1b4cc-0246-4000-bdff-c88b54b6bb55"/>
+        </column>
+        <column id="056dc558-79f7-41c3-a0db-2e89518cba38">
+          <name>timelineType</name>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="81f9a1ab-998b-4f0f-8d12-a990ad0ab202"/>
+        </column>
+        <foreignKey id="a438ad99-a0c3-4f67-8df1-39500669dfb2">
+          <columnRefs>
+            <columnRef ref="056dc558-79f7-41c3-a0db-2e89518cba38"/>
+          </columnRefs>
+          <referenceColumns>
+            <columnRef ref="fd725b85-219d-4a5f-b79f-7e371e445e18"/>
+          </referenceColumns>
+        </foreignKey>
+        <foreignKey id="767d2609-f6e5-4b5d-a169-f6b1af8e4caa">
+          <columnRefs>
+            <columnRef ref="207ca3d3-434a-4af8-b2a4-949d3623b928"/>
+          </columnRefs>
+          <referenceColumns>
+            <columnRef ref="53480099-1d9f-48f8-a261-c69b4bcbd34e"/>
+          </referenceColumns>
+        </foreignKey>
+      </attributes>
+      <indexes/>
+    </table>
+    <table id="22186f2c-0f25-4e9a-aa11-8cf41138002f">
+      <name>Projects</name>
+      <logicalName>projects</logicalName>
+      <attributes>
+        <column id="18e88623-5dcc-4645-a67e-0c46e84765fd">
+          <name>userId</name>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="51898e08-671c-4c26-8e04-2cb2093be568"/>
+        </column>
+        <primaryKey id="9537746f-cb4b-49d0-ae9e-6e2ece0a47f6">
+          <columnRefs>
+            <columnRef ref="5fa5ce02-0765-4e71-8abc-bb74d7243b49"/>
+          </columnRefs>
+        </primaryKey>
+        <column id="5fa5ce02-0765-4e71-8abc-bb74d7243b49">
+          <name>id</name>
+          <logicalName>id</logicalName>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="9bf5e9d6-4314-4649-a3ec-d0910c7c27c6"/>
+        </column>
+        <column id="0b277c35-8a74-4bb1-a390-2d1dd1cada7d">
+          <name>name</name>
+          <logicalName>name</logicalName>
+          <dataType>
+            <typeCategory>VARCHAR</typeCategory>
+            <typeName>VARCHAR</typeName>
+            <adapter class="org.jiemamy.model.datatype.adapter.SizedDataTypeAdapter">
+              <size>64</size>
+            </adapter>
+          </dataType>
+          <notNull id="89a6fe60-e9b3-48ea-a0ec-6d082f83792b"/>
+        </column>
+        <column id="d7dd9959-3929-4eeb-b971-b34bb86c7d2b">
+          <name>typeId</name>
+          <logicalName>typeId</logicalName>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="176c3adf-a326-4c0e-9745-1635d0b33fee"/>
+        </column>
+        <foreignKey id="241fa723-1588-4b40-9d4b-50a827287c08">
+          <columnRefs>
+            <columnRef ref="18e88623-5dcc-4645-a67e-0c46e84765fd"/>
+          </columnRefs>
+          <referenceColumns>
+            <columnRef ref="53480099-1d9f-48f8-a261-c69b4bcbd34e"/>
+          </referenceColumns>
+        </foreignKey>
+        <foreignKey id="d7414456-dfaf-4ebd-8981-8527ef7faf68">
+          <columnRefs>
+            <columnRef ref="d7dd9959-3929-4eeb-b971-b34bb86c7d2b"/>
+          </columnRefs>
+          <referenceColumns>
+            <columnRef ref="3da99cd2-af80-4c0e-a384-e94ceea1536e"/>
+          </referenceColumns>
+        </foreignKey>
+      </attributes>
+      <indexes/>
+    </table>
+    <table id="2ca37ceb-1528-445e-a4e5-835bb3692f58">
+      <name>Users</name>
+      <attributes>
+        <column id="53480099-1d9f-48f8-a261-c69b4bcbd34e">
+          <name>id</name>
+          <logicalName>id</logicalName>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="56707480-1daf-426a-b2a3-1f3c7b7ad630"/>
+        </column>
+        <primaryKey id="f6f34ea2-ce7b-4219-8fb0-b822652e6db7">
+          <columnRefs>
+            <columnRef ref="53480099-1d9f-48f8-a261-c69b4bcbd34e"/>
+          </columnRefs>
+        </primaryKey>
+        <column id="414a5d6e-4463-4636-9a2e-9e2162fc8fb9">
+          <name>password</name>
+          <dataType>
+            <typeCategory>VARCHAR</typeCategory>
+            <typeName>VARCHAR</typeName>
+            <adapter class="org.jiemamy.model.datatype.adapter.SizedDataTypeAdapter">
+              <size>64</size>
+            </adapter>
+          </dataType>
+          <notNull id="a5f67853-6955-4959-861c-d7c756f1dbc0"/>
+        </column>
+        <column id="725e4dfe-8a24-4c1f-b916-df726f5e3689">
+          <name>name</name>
+          <dataType>
+            <typeCategory>VARCHAR</typeCategory>
+            <typeName>VARCHAR</typeName>
+            <adapter class="org.jiemamy.model.datatype.adapter.SizedDataTypeAdapter">
+              <size>64</size>
+            </adapter>
+          </dataType>
+          <notNull id="e1c3d445-0680-421a-8286-afde83595d3f"/>
+        </column>
+        <column id="ad25b917-e2d3-4b32-b9bb-2dd5c2f8a8d2">
+          <name>email</name>
+          <dataType>
+            <typeCategory>VARCHAR</typeCategory>
+            <typeName>VARCHAR</typeName>
+            <adapter class="org.jiemamy.model.datatype.adapter.SizedDataTypeAdapter">
+              <size>64</size>
+            </adapter>
+          </dataType>
+          <notNull id="fef299ec-bad0-4782-87d6-8a78fe01a2f2"/>
+        </column>
+      </attributes>
+      <indexes/>
+    </table>
+    <table id="3fa93bac-5b34-4805-a192-7ff2b0df7f72">
+      <name>TimeEntries</name>
+      <logicalName>TimeEntries</logicalName>
+      <attributes>
+        <column id="e52a7bee-9d01-4abb-8429-d1826b9671a3">
+          <name>userId</name>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="90126e69-25b2-4d3b-9578-02da44d91e3c"/>
+        </column>
+        <column id="e40b1fb3-2b78-4af8-aa3b-dd2215f95958">
+          <name>taskId</name>
+          <logicalName>taskId</logicalName>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="c41993ac-6fff-42b4-b1df-55b8278c5f8a"/>
+        </column>
+        <primaryKey id="260cd5d5-8dd3-4760-9ead-388a24f73155">
+          <columnRefs>
+            <columnRef ref="4d7351e8-360e-4dc2-8d18-f0b1fcf796f0"/>
+          </columnRefs>
+        </primaryKey>
+        <column id="4d7351e8-360e-4dc2-8d18-f0b1fcf796f0">
+          <name>id</name>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="c63bd81a-3374-41ae-a6ba-abab0725f2ea"/>
+        </column>
+        <column id="f8896f13-3d90-416e-aabd-b73ed6be54c0">
+          <name>startTime</name>
+          <dataType>
+            <typeCategory>OTHER</typeCategory>
+            <typeName>DATETIME</typeName>
+          </dataType>
+          <notNull id="c2bf2d77-6318-4e90-bb1d-1c009ced6912"/>
+        </column>
+        <foreignKey id="36a2b457-f230-48b4-8b66-012b2b127bf5">
+          <columnRefs>
+            <columnRef ref="e52a7bee-9d01-4abb-8429-d1826b9671a3"/>
+          </columnRefs>
+          <referenceColumns>
+            <columnRef ref="53480099-1d9f-48f8-a261-c69b4bcbd34e"/>
+          </referenceColumns>
+        </foreignKey>
+        <column id="fc9fc313-e0da-489a-ad4a-2d0f58c3b907">
+          <name>endTime</name>
+          <dataType>
+            <typeCategory>OTHER</typeCategory>
+            <typeName>DATETIME</typeName>
+          </dataType>
+        </column>
+        <foreignKey id="1509aae6-908f-43a5-8dbc-50deda1998ce">
+          <columnRefs>
+            <columnRef ref="e40b1fb3-2b78-4af8-aa3b-dd2215f95958"/>
+          </columnRefs>
+          <referenceColumns>
+            <columnRef ref="d4cd11d8-6082-4bef-b9a7-87427a37004a"/>
+          </referenceColumns>
+        </foreignKey>
+      </attributes>
+      <indexes/>
+    </table>
+    <table id="5ee3bd92-aa96-41bb-a11c-45723f62292d">
+      <name>TimelinePropertis</name>
+      <attributes>
+        <column id="566cc6ca-b453-4ab7-a0c3-89209301842a">
+          <name>timeLineId</name>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="988e021f-eba6-4122-8d04-ee329b1fd05b"/>
+        </column>
+        <column id="d2b955f5-b167-4ea2-a1e8-8e86cf3e5b6a">
+          <name>id</name>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="302b12a7-47fa-47f1-a3fe-e53d65379f75"/>
+        </column>
+        <primaryKey id="31a8d131-d551-4d08-bc72-2a34d5c40704">
+          <columnRefs>
+            <columnRef ref="d2b955f5-b167-4ea2-a1e8-8e86cf3e5b6a"/>
+          </columnRefs>
+        </primaryKey>
+        <column id="2bd2e070-ce16-404d-9e4a-4fe1c392fa08">
+          <name>key</name>
+          <dataType>
+            <typeCategory>VARCHAR</typeCategory>
+            <typeName>VARCHAR</typeName>
+            <adapter class="org.jiemamy.model.datatype.adapter.SizedDataTypeAdapter">
+              <size>64</size>
+            </adapter>
+          </dataType>
+          <notNull id="fc56674e-514c-42e2-873c-4f0a5af51110"/>
+        </column>
+        <column id="e50aacf4-ba6f-4cce-b377-0e2dd36bef86">
+          <name>value</name>
+          <dataType>
+            <typeCategory>VARCHAR</typeCategory>
+            <typeName>VARCHAR</typeName>
+            <adapter class="org.jiemamy.model.datatype.adapter.SizedDataTypeAdapter">
+              <size>64</size>
+            </adapter>
+          </dataType>
+        </column>
+        <foreignKey id="2060dc98-e78f-44e7-80c3-a532bd3e38c4">
+          <columnRefs>
+            <columnRef ref="566cc6ca-b453-4ab7-a0c3-89209301842a"/>
+          </columnRefs>
+          <referenceColumns>
+            <columnRef ref="66d84139-e9d4-4443-8f97-6571fd443b98"/>
+          </referenceColumns>
+        </foreignKey>
+      </attributes>
+      <indexes/>
+    </table>
+    <table id="713b95f2-8805-4ffb-9db4-eb1716ac3a78">
+      <name>ProjectProperties</name>
+      <attributes>
+        <column id="93193e6d-11f1-489c-91ed-28282a661783">
+          <name>projetId</name>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="aa6ecced-edbf-40e1-874d-e518e941a5e3"/>
+        </column>
+        <column id="69f0cd77-a62b-415f-ab7d-4a984875bd95">
+          <name>id</name>
+          <dataType>
+            <typeCategory>INTEGER</typeCategory>
+            <typeName>INTEGER</typeName>
+          </dataType>
+          <notNull id="22d08f6f-f044-4463-b23a-7c6f4f8c2eb0"/>
+        </column>
+        <primaryKey id="c8da8f88-feaf-430c-a829-8ff6b935ff6f">
+          <columnRefs>
+            <columnRef ref="69f0cd77-a62b-415f-ab7d-4a984875bd95"/>
+          </columnRefs>
+        </primaryKey>
+        <column id="557a8b6c-c73b-4aec-aa4e-c3b00597222b">
+          <name>key</name>
+          <dataType>
+            <typeCategory>VARCHAR</typeCategory>
+            <typeName>VARCHAR</typeName>
+            <adapter class="org.jiemamy.model.datatype.adapter.SizedDataTypeAdapter">
+              <size>64</size>
+            </adapter>
+          </dataType>
+          <notNull id="666e5b82-2266-4619-bd68-1bb20b563f4a"/>
+        </column>
+        <column id="dc41c859-c5b8-4c01-89fc-d9a851572165">
+          <name>value</name>
+          <dataType>
+            <typeCategory>VARCHAR</typeCategory>
+            <typeName>VARCHAR</typeName>
+            <adapter class="org.jiemamy.model.datatype.adapter.SizedDataTypeAdapter">
+              <size>64</size>
+            </adapter>
+          </dataType>
+        </column>
+        <foreignKey id="17991065-590f-4855-b40a-141792c577b9">
+          <columnRefs>
+            <columnRef ref="93193e6d-11f1-489c-91ed-28282a661783"/>
+          </columnRefs>
+          <referenceColumns>
+            <columnRef ref="5fa5ce02-0765-4e71-8abc-bb74d7243b49"/>
+          </referenceColumns>
+        </foreignKey>
+      </attributes>
+      <indexes/>
+    </table>
+  </entities>
+  <dataSets/>
+  <view:diagramPresentations xmlns:view="http://jiemamy.org/xml/ns/view">
+    <view:diagramPresentation id="1e2a67a7-22ce-42da-8a2e-a1994e566691">
+      <name>default</name>
+      <view:mode>PHYSICAL</view:mode>
+      <view:level>ATTRTYPE</view:level>
+      <view:nodeProfiles>
+        <view:nodeProfile id="1f54ee48-4e63-4d21-a871-31a65c79e0d0">
+          <view:nodeObjectRef ref="d2901430-27bc-428e-aefd-ffd4eb4b4fe7"/>
+          <view:boundary height="-1" width="-1" x="744" y="677"/>
+        </view:nodeProfile>
+        <view:nodeProfile id="0135dfaf-c345-4bc0-b025-f2ed31fd80d7">
+          <view:nodeObjectRef ref="db70da7f-5b9e-4152-96b3-e53bcd54af32"/>
+          <view:boundary height="-1" width="-1" x="263" y="269"/>
+        </view:nodeProfile>
+        <view:nodeProfile id="796d1627-d4bb-4bef-af03-f966ca0b0439">
+          <view:nodeObjectRef ref="f2798e8a-2dd0-4895-a940-fad6b2408a76"/>
+          <view:boundary height="-1" width="-1" x="494" y="269"/>
+        </view:nodeProfile>
+        <view:nodeProfile id="5f8d26cf-3559-4f66-8519-a74b1965db38">
+          <view:nodeObjectRef ref="06db6e2f-4ffb-4984-8566-d8aeaa145f5c"/>
+          <view:boundary height="-1" width="-1" x="248" y="677"/>
+        </view:nodeProfile>
+        <view:nodeProfile id="78cae801-a8aa-485d-8456-de866f84785b">
+          <view:nodeObjectRef ref="09471b7e-e3df-433b-a851-0b5db3f71d1b"/>
+          <view:boundary height="-1" width="-1" x="740" y="473"/>
+        </view:nodeProfile>
+        <view:nodeProfile id="6a8df5f7-114e-422a-abd9-4909eaf5a5c7">
+          <view:nodeObjectRef ref="22186f2c-0f25-4e9a-aa11-8cf41138002f"/>
+          <view:boundary height="-1" width="-1" x="271" y="473"/>
+        </view:nodeProfile>
+        <view:nodeProfile id="832dbbdd-5854-419f-9c02-d7307b832d79">
+          <view:nodeObjectRef ref="2ca37ceb-1528-445e-a4e5-835bb3692f58"/>
+          <view:boundary height="-1" width="-1" x="509" y="677"/>
+        </view:nodeProfile>
+        <view:nodeProfile id="5d5c04b5-809d-495b-9979-a849b32a4773">
+          <view:nodeObjectRef ref="3fa93bac-5b34-4805-a192-7ff2b0df7f72"/>
+          <view:boundary height="-1" width="-1" x="609" y="40"/>
+        </view:nodeProfile>
+        <view:nodeProfile id="01d98efd-5d31-4c0f-8a04-e0b3b7fe9624">
+          <view:nodeObjectRef ref="5ee3bd92-aa96-41bb-a11c-45723f62292d"/>
+          <view:boundary height="-1" width="-1" x="746" y="269"/>
+        </view:nodeProfile>
+        <view:nodeProfile id="7c4478a9-70ec-43ca-ad27-5db954ca9a0c">
+          <view:nodeObjectRef ref="713b95f2-8805-4ffb-9db4-eb1716ac3a78"/>
+          <view:boundary height="-1" width="-1" x="66" y="144"/>
+        </view:nodeProfile>
+      </view:nodeProfiles>
+      <view:connectionProfiles>
+        <view:connectionProfile id="80427445-22e9-40d8-ac0f-b229312e3e51">
+          <view:connectionObjectRef ref="a438ad99-a0c3-4f67-8df1-39500669dfb2"/>
+        </view:connectionProfile>
+        <view:connectionProfile id="3fde629b-650c-4c4d-b68b-fc4b6f2060c5">
+          <view:connectionObjectRef ref="c805d2f7-bc51-4b6e-a831-a946715b7593"/>
+        </view:connectionProfile>
+        <view:connectionProfile id="d1e75282-92f4-4c47-9c5e-d1c5553528a5">
+          <view:connectionObjectRef ref="d7414456-dfaf-4ebd-8981-8527ef7faf68"/>
+        </view:connectionProfile>
+        <view:connectionProfile id="8334e893-195b-4af0-a082-314f0daf2cd3">
+          <view:connectionObjectRef ref="0a1d4672-a1c2-46f0-8ce9-7f73c4d079b7"/>
+        </view:connectionProfile>
+        <view:connectionProfile id="e5f494ae-fdc5-4726-9812-9697a1fc3fb3">
+          <view:connectionObjectRef ref="1509aae6-908f-43a5-8dbc-50deda1998ce"/>
+        </view:connectionProfile>
+        <view:connectionProfile id="3cf50ef2-eb12-42dd-ac65-635a6b7c5722">
+          <view:connectionObjectRef ref="17991065-590f-4855-b40a-141792c577b9"/>
+        </view:connectionProfile>
+        <view:connectionProfile id="76031a5b-c38d-404d-bc18-c6e7a012e671">
+          <view:connectionObjectRef ref="2060dc98-e78f-44e7-80c3-a532bd3e38c4"/>
+        </view:connectionProfile>
+        <view:connectionProfile id="9f710d76-0bee-47d7-b41c-2994278b995d">
+          <view:connectionObjectRef ref="241fa723-1588-4b40-9d4b-50a827287c08"/>
+        </view:connectionProfile>
+        <view:connectionProfile id="85821185-18da-4acc-a343-3e8a4914664c">
+          <view:connectionObjectRef ref="36a2b457-f230-48b4-8b66-012b2b127bf5"/>
+        </view:connectionProfile>
+        <view:connectionProfile id="15954528-1d60-43d8-9912-263f6acc4a7b">
+          <view:connectionObjectRef ref="54e7ac9e-8343-4ec3-9052-fc4def6d5517"/>
+        </view:connectionProfile>
+        <view:connectionProfile id="3cac7818-a857-44c1-a49f-95d92303b682">
+          <view:connectionObjectRef ref="72746510-94de-44c3-a053-d9db1b04a2e5"/>
+        </view:connectionProfile>
+        <view:connectionProfile id="d2519807-65ca-4724-b26e-4f3e1760bea5">
+          <view:connectionObjectRef ref="767d2609-f6e5-4b5d-a169-f6b1af8e4caa"/>
+        </view:connectionProfile>
+      </view:connectionProfiles>
+    </view:diagramPresentation>
+  </view:diagramPresentations>
+</jiemamy>




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