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>