/* * Copyright (c) 2006, 2007 Borland Software Corporation * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Artem Tikhomirov (Borland) - initial API and implementation */ package org.eclipse.gmf.tests.setup; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EcoreFactory; import org.eclipse.emf.ecore.resource.impl.ResourceImpl; /** * TODO separate setup for case with subpackages * @author artem */ public class MultiplePackagesDomainModelSetup implements DomainModelSource { private EPackage myPrimaryPackage; private NodeData myNodeFirstPackage; private NodeData myNodeSecondPackage; private EClass myDiagramElement; private LinkData myLinkThirdPackage; private EReference myLinkFromFirstToSecond; public MultiplePackagesDomainModelSetup() { } public MultiplePackagesDomainModelSetup init() { myPrimaryPackage = createPackage("prim"); final EClass iElement = createEClass("IElement", null, true, true); myPrimaryPackage.getEClassifiers().add(iElement); final EClass iDiagramContainer = createEClass("IDiagramContainer", null, true, false); final EReference cr = createERef("all", true, iElement); iDiagramContainer.getEStructuralFeatures().add(cr); myPrimaryPackage.getEClassifiers().add(iDiagramContainer); final EPackage p2 = createPackage("first"); final EClass node1 = createEClass("Node1", iElement); p2.getEClassifiers().add(node1); final EPackage p3 = createPackage("second"); final EClass node2 = createEClass("Node2", iElement); p3.getEClassifiers().add(node2); final EPackage p4 = createPackage("third"); final EClass link = createEClass("Link", null); final EReference target = createERef("targetToN1", false, node1); link.getEStructuralFeatures().add(target); final EClass someThingToContain = createEClass("SomeThingToContain", null, true, true); final EClass diagramContainerImpl = createEClass("DiagramContainerImpl", iDiagramContainer, false, false); p4.getEClassifiers().add(link); p4.getEClassifiers().add(someThingToContain); p4.getEClassifiers().add(diagramContainerImpl); final EReference linkCont = createERef("links", true, link); node2.getEStructuralFeatures().add(linkCont); node1.getEStructuralFeatures().add(createERef("someThing", true, someThingToContain)); final EReference lnkNode2 = createERef("lnkNode2", false, node2); node1.getEStructuralFeatures().add(lnkNode2); // make sure p1 references p4 - just for fun iDiagramContainer.getEStructuralFeatures().add(createERef("anotherThing", true, someThingToContain)); // init fields myNodeFirstPackage = new NodeData(node1, null, cr); myNodeSecondPackage = new NodeData(node2, null, cr); myLinkFromFirstToSecond = lnkNode2; myLinkThirdPackage = new LinkData(link, target, linkCont); myDiagramElement = diagramContainerImpl; confineInResource("r1", Collections.singletonList(myPrimaryPackage)); confineInResource("r2", Arrays.asList(new EObject[] {p2, p3, p4})); return this; } private static EClass createEClass(String name, EClass superClass) { return createEClass(name, superClass, false, false); } private static EClass createEClass(String name, EClass superClass, boolean isA, boolean isI) { assert !isI || isA : "Interfaces should be abstract"; EClass rv = EcoreFactory.eINSTANCE.createEClass(); rv.setInterface(isI); rv.setAbstract(isA); rv.setName(name); if (superClass != null) { rv.getESuperTypes().add(superClass); } return rv; } private static EPackage createPackage(String name) { EPackage p = EcoreFactory.eINSTANCE.createEPackage(); p.setName(name); p.setNsPrefix("ns" + name); p.setNsURI("uri:/gmf/tests/multi/" + name); return p; } private static EReference createERef(String name, boolean isCont, EClass toContain) { EReference cr = EcoreFactory.eINSTANCE.createEReference(); cr.setContainment(isCont); cr.setName(name); cr.setEType(toContain); return cr; } private void confineInResource(String name, List<? extends EObject> toConfine) { new ResourceImpl(URI.createURI("uri://org.eclipse.gmf/tests/MultiPackSetup/" + name)).getContents().addAll(toConfine); } public EPackage getModel() { return myPrimaryPackage; } public NodeData getNodeA() { return myNodeSecondPackage; } public NodeData getNodeB() { return myNodeFirstPackage; } public LinkData getLinkAsClass() { return myLinkThirdPackage; } public EReference getLinkAsRef() { return myLinkFromFirstToSecond; } public EClass getDiagramElement() { return myDiagramElement; } }