/*
* Initial version copyright 2008 Lockheed Martin Corporation, except
* as stated in the file entitled Licensing-Information.
*
* Modifications:
* Copyright 2009 Data Access Technologies, Inc.
* Copyright 2013 Ivar Jacobson International SA
*
* Licensed under the Academic Free License version 3.0
* (http://www.opensource.org/licenses/afl-3.0.php), except as stated
* in the file entitled Licensing-Information.
*
* Contributors:
* MDS - initial API and implementation
* IJI
*
*/
package org.modeldriven.fuml.test.load;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;
import junit.framework.Test;
import org.junit.After;
import org.junit.Before;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.modeldriven.fuml.Fuml;
import org.modeldriven.fuml.environment.Environment;
import org.modeldriven.fuml.io.ResourceArtifact;
import org.modeldriven.fuml.repository.Class_;
import org.modeldriven.fuml.repository.Classifier;
import org.modeldriven.fuml.repository.Element;
import org.modeldriven.fuml.repository.Enumeration;
import org.modeldriven.fuml.repository.Property;
import org.modeldriven.fuml.repository.Repository;
import org.modeldriven.fuml.repository.Stereotype;
import org.modeldriven.fuml.test.FUMLTest;
import org.modeldriven.fuml.test.FUMLTestSetup;
import org.modeldriven.fuml.test.load.profile.Alias;
import org.modeldriven.fuml.test.load.profile.EnumerationConstraint;
import org.modeldriven.fuml.test.load.profile.ValueConstraint;
/**
* Loads an Eclipse Papyrus UML profile example on test setup, then loads a document annotated with the
* profile and tests for the existence of various stereotypes and their values tied to specific
* properties and other elements.
*/
public class LoadPapyrusProfileTestCase extends FUMLTest {
private static Log log = LogFactory.getLog(LoadPapyrusProfileTestCase.class);
private static Environment environment; // JUnit creates a new test class
// for every test!
String FILE_URN = "TestPapyrusProfileApplication_File";
String NAMESPACE_URI = "test/uml/TestPapyrusProfileApplication_File";
public static Test suite() {
return FUMLTestSetup.newTestSetup(LoadPapyrusProfileTestCase.class);
}
public void setUp() throws Exception {
if (environment == null) {
String filename = "./target/test-classes/uml/TestPapyrus.profile.uml";
File file = new File(filename);
assertTrue("file '" + filename + "' does not exist", file.exists());
FileInputStream stream = new FileInputStream(file);
String PROFILE_NAMESPACE_URI = "http:///schemas/TestProfile/_Cvni8DqeEeSIqNFH5qbSSw/28";
String PROFILE_FILE_URN = "Test.profile.uml";
ResourceArtifact artifact = new ResourceArtifact(PROFILE_FILE_URN,
PROFILE_NAMESPACE_URI, stream);
Fuml.load(artifact);
filename = "./target/test-classes/uml/TestPapyrusDataTypes.uml";
file = new File(filename);
assertTrue("file '" + filename + "' does not exist", file.exists());
stream = new FileInputStream(file);
PROFILE_NAMESPACE_URI = "http:///schemas/TestDataTypes";
PROFILE_FILE_URN = "TestDataTypes.uml";
artifact = new ResourceArtifact(PROFILE_FILE_URN,
PROFILE_NAMESPACE_URI, stream);
Fuml.load(artifact);
environment = Environment.getInstance();
}
}
@org.junit.Test
public void testLoadProfileApplication() throws Exception {
log.info("testLoadPapyrusProfileApplication");
String filename = "./target/test-classes/uml/TestPapyrusProfileApplication.uml";
File file = new File(filename);
assertTrue("file '" + filename + "' does not exist", file.exists());
FileInputStream stream = new FileInputStream(file);
ResourceArtifact artifact = new ResourceArtifact(FILE_URN,
NAMESPACE_URI, stream);
Fuml.load(artifact);
Classifier personClassifier = Repository.INSTANCE.findClassifier(
NAMESPACE_URI + "#" + "Person");
assertTrue(personClassifier != null);
assertTrue(personClassifier instanceof Class_);
Class_ personClass = (Class_)personClassifier;
Property firstNameProp = personClass.getProperty("firstName");
assertTrue(firstNameProp != null);
assertTrue(hasStereotype(firstNameProp, Alias.class));
Alias alias = (Alias)getStereotype(firstNameProp,
Alias.class).getDelegate();
assertTrue("FRST_NM".equals(alias.getPhysicalName()));
Classifier orgClassifier = Repository.INSTANCE.findClassifier(
NAMESPACE_URI + "#" + "Org");
assertTrue(orgClassifier != null);
assertTrue(orgClassifier instanceof Class_);
Class_ orgClass = (Class_)orgClassifier;
Property dunsProp = orgClass.getProperty("dunsNumber");
assertTrue(dunsProp != null);
assertTrue(hasStereotype(dunsProp, EnumerationConstraint.class));
EnumerationConstraint enumConstraint = (EnumerationConstraint)getStereotype(dunsProp,
EnumerationConstraint.class).getDelegate();
fUML.Syntax.Classes.Kernel.Enumeration e = enumConstraint.getValue();
Enumeration repoEnum = (Enumeration)Repository.INSTANCE.findElementById(e.getXmiId());
assertTrue(repoEnum != null);
assertTrue("DUNSType".equals(repoEnum.getName()));
assertTrue(repoEnum.getOwnedLiteral() != null);
}
private boolean hasStereotype(Element elem, Class<?> stereotypeClass) {
List<Stereotype> list = Repository.INSTANCE.getStereotypes(elem);
for (Stereotype s : list) {
if (stereotypeClass.isAssignableFrom(s.getDelegate().getClass()))
return true;
}
return false;
}
private Stereotype getStereotype(Element elem, Class<?> stereotypeClass) {
List<Stereotype> list = Repository.INSTANCE.getStereotypes(elem);
for (Stereotype s : list) {
if (stereotypeClass.isAssignableFrom(s.getDelegate().getClass()))
return s;
}
throw new IllegalArgumentException("no stereotype class found for, " + stereotypeClass.getName());
}
}