blob: 55921befdac5cf304de1ea6cc023a0824a6837dd [file] [log] [blame]
/**
* Copyright (c) 2010 Henning Heitkoetter.
* 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:
* Henning Heitkoetter - initial API and implementation
*/
package org.eclipse.bpmn2.tests;
import static org.junit.Assert.*;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;
import org.eclipse.bpmn2.Bpmn2Factory;
import org.eclipse.bpmn2.Collaboration;
import org.eclipse.bpmn2.Definitions;
import org.eclipse.bpmn2.EventDefinition;
import org.eclipse.bpmn2.Import;
import org.eclipse.bpmn2.LinkEventDefinition;
import org.eclipse.bpmn2.Process;
import org.eclipse.bpmn2.StartEvent;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.common.util.WrappedException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.xmi.ClassNotFoundException;
import org.junit.Before;
import org.junit.Test;
/**
* Tests our QName (de)resolution mechanism both for intra- and inter-model references.
*
* This test uses XML serialization (no QNames in XMI).
* @author Henning Heitkoetter
*
*/
public class QNameReferenceTest extends Bpmn2SerializationTest {
protected Definitions A_model, B_model;
protected Collaboration A_collab, B_collab;
protected Process A_process, B_process;
protected Resource A_resource, B_resource;
@Before
public void setUpModels() {
A_model = TestHelper.initBasicModel("urn:modelA");
B_model = TestHelper.initBasicModel("urn:modelB");
A_collab = Bpmn2Factory.eINSTANCE.createCollaboration();
A_model.getRootElements().add(A_collab);
A_process = Bpmn2Factory.eINSTANCE.createProcess();
A_model.getRootElements().add(A_process);
B_collab = Bpmn2Factory.eINSTANCE.createCollaboration();
B_model.getRootElements().add(B_collab);
B_process = Bpmn2Factory.eINSTANCE.createProcess();
B_model.getRootElements().add(B_process);
}
@Override
protected String getFileExtension() {
return EXTENSION_BPMN2_XML;
}
/**
* Saves both models (A and B). Creates a import element in A pointing to B.
* Loads the created resources into {@link #A_resource} and {@link #B_resource}, respectively.
*
* @param name Part of the file name that is used to identify different tests.
* @throws IOException
*/
protected void saveAndLoadModels(String name) throws IOException {
Map<URI, EObject> uriToContentMap = new LinkedHashMap<URI, EObject>();
URI A_fileUri = URI.createFileURI("tmp/qname_" + name + "_A." + getFileExtension());
URI B_fileUri = URI.createFileURI("tmp/qname_" + name + "_B." + getFileExtension());
uriToContentMap.put(A_fileUri, A_model);
uriToContentMap.put(B_fileUri, B_model);
Import importBintoA = Bpmn2Factory.eINSTANCE.createImport();
importBintoA.setImportType("http://www.omg.org/spec/BPMN/20100524/MODEL");
importBintoA.setLocation(B_fileUri.toString());
importBintoA.setNamespace("urn:modelB");
A_model.getImports().add(importBintoA);
TestHelper.createResourcesWithContent(uriToContentMap);
createdFiles.add(A_fileUri);
createdFiles.add(B_fileUri);
A_resource = TestHelper.getResource(A_fileUri);
B_resource = TestHelper.getResource(B_fileUri);
}
/**
* Test proxy-resolving references (i.e. potentially cross-file references) when
* they point to objects within the same file.
* @throws IOException
*/
@Test
public void testIntraModelReferences() throws IOException {
// single @ XML attribute
A_process.setDefinitionalCollaborationRef(A_collab);
// many @ XML attribute - no cross-file reference available
// single @ XML element
LinkEventDefinition A_led1, A_led2;
A_led1 = Bpmn2Factory.eINSTANCE.createLinkEventDefinition();
A_model.getRootElements().add(A_led1);
A_led2 = Bpmn2Factory.eINSTANCE.createLinkEventDefinition();
A_model.getRootElements().add(A_led2);
A_led1.setTarget(A_led2);
// many @ XML element
Process A_process2 = Bpmn2Factory.eINSTANCE.createProcess();
A_model.getRootElements().add(A_process2);
A_process.getSupports().add(A_process2);
Resource res = saveAndLoadModel("qname_intra", A_model);
Process A_processNew = (Process) res.getEObject(A_process.getId());
LinkEventDefinition A_led1New = (LinkEventDefinition) res.getEObject(A_led1.getId());
assertFalse("Proxy could not be resolved (single attr)", A_processNew
.getDefinitionalCollaborationRef().eIsProxy());
assertEquals(A_collab.getId(), A_processNew.getDefinitionalCollaborationRef().getId());
assertFalse("Proxy could not be resolved (single elem)", A_led1New.getTarget().eIsProxy());
assertEquals(A_led2.getId(), A_led1New.getTarget().getId());
assertFalse("Proxy could not be resolved (many elem)", A_processNew.getSupports().get(0)
.eIsProxy());
assertEquals(A_process2.getId(), A_processNew.getSupports().get(0).getId());
}
/**
* Test a proxy-resolving intra-file reference with an abstract type.
* @throws Exception
*/
@Test
public void testReferenceToAbstractType() throws Exception {
EventDefinition A_eventDef = Bpmn2Factory.eINSTANCE.createSignalEventDefinition();
A_model.getRootElements().add(A_eventDef);
StartEvent A_event = Bpmn2Factory.eINSTANCE.createStartEvent();
A_event.getEventDefinitionRefs().add(A_eventDef);
A_process.getFlowElements().add(A_event);
try {
Resource res = saveAndLoadModel("qname_toAbstract", A_model);
StartEvent A_eventNew = (StartEvent) res.getEObject(A_event.getId());
assertFalse("Proxy could not be resolved (abstract)", A_eventNew
.getEventDefinitionRefs().get(0).eIsProxy());
assertEquals(A_eventDef.getId(), A_eventNew.getEventDefinitionRefs().get(0).getId());
} catch (WrappedException e) {
if (e.exception() instanceof ClassNotFoundException)
fail("Class EventDefinition was recognized as abstract.");
else
throw e;
} catch (IllegalArgumentException e) {
// different error in Eclipse 3.4
if (e.getMessage().endsWith("not a valid classifier"))
fail("Class EventDefinition was recognized as abstract.");
else
throw e;
}
}
/**
* Test cross-file references.
* @throws IOException
*/
@Test
public void testInterModelReferences() throws IOException {
// single @ XML attribute
A_process.setDefinitionalCollaborationRef(B_collab);
// many @ XML attribute - no cross-file reference available
// single @ XML element
LinkEventDefinition A_led, B_led;
A_led = Bpmn2Factory.eINSTANCE.createLinkEventDefinition();
A_model.getRootElements().add(A_led);
B_led = Bpmn2Factory.eINSTANCE.createLinkEventDefinition();
B_model.getRootElements().add(B_led);
A_led.setTarget(B_led);
// many @ XML element
A_process.getSupports().add(B_process);
saveAndLoadModels("inter");
Process A_processNew = (Process) A_resource.getEObject(A_process.getId());
LinkEventDefinition A_ledNew = (LinkEventDefinition) A_resource.getEObject(A_led.getId());
assertFalse("Proxy could not be resolved (single attr)", A_processNew
.getDefinitionalCollaborationRef().eIsProxy());
assertEquals(B_collab.getId(), A_processNew.getDefinitionalCollaborationRef().getId());
assertFalse("Proxy could not be resolved (single elem)", A_ledNew.getTarget().eIsProxy());
assertEquals(B_led.getId(), A_ledNew.getTarget().getId());
assertFalse("Proxy could not be resolved (many elem)", A_processNew.getSupports().get(0)
.eIsProxy());
assertEquals(B_process.getId(), A_processNew.getSupports().get(0).getId());
}
}