/*
* 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.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.EnumerationConstraint;
import org.modeldriven.fuml.test.load.profile.ValueConstraint;
/**
* Loads a Magic Draw (mdxml) 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 LoadMagicDrawProfileTestCase extends FUMLTest {
private static Log log = LogFactory.getLog(LoadMagicDrawProfileTestCase.class);
private static Environment environment; // JUnit creates a new test class
// for every test!
String FILE_URN = "TestProfileApplication_File";
String NAMESPACE_URI = "test/mdxml/TestProfileApplication_File";
public static Test suite() {
return FUMLTestSetup.newTestSetup(LoadMagicDrawProfileTestCase.class);
}
public void setUp() throws Exception {
if (environment == null) {
String filename = "./target/test-classes/mdxml/TestProfile.mdxml";
File file = new File(filename);
assertTrue("file '" + filename + "' does not exist", file.exists());
FileInputStream stream = new FileInputStream(file);
String PROFILE_NAMESPACE_URI = "http://www.magicdraw.com/schemas/Test_Profile.xmi";
String PROFILE_FILE_URN = "Test_Profile.mdxml";
ResourceArtifact 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("testLoadProfileApplication");
String filename = "./target/test-classes/mdxml/TestProfileApplication.mdxml";
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);
// test package qualified name
Classifier nodeClassifier = Repository.INSTANCE.findClassifier("model.org.modeldriven.test.data.Node");
assertTrue(nodeClassifier != null);
assertTrue(nodeClassifier instanceof Class_);
// test uri qualified name
nodeClassifier = Repository.INSTANCE.findClassifier(
NAMESPACE_URI + "#" + "Node");
assertTrue(nodeClassifier != null);
assertTrue(nodeClassifier instanceof Class_);
Class_ nodeClass = (Class_)nodeClassifier;
Property stringsFieldProp = nodeClass.getProperty("stringsField");
assertTrue(stringsFieldProp != null);
assertTrue(hasStereotype(stringsFieldProp, ValueConstraint.class));
ValueConstraint valueConstraint = (ValueConstraint)getStereotype(stringsFieldProp,
ValueConstraint.class).getDelegate();
assertTrue(Integer.parseInt(valueConstraint.getMaxLength()) == 30);
Property stringFieldProp = nodeClass.getProperty("stringField");
assertTrue(hasStereotype(stringFieldProp, EnumerationConstraint.class));
EnumerationConstraint enumConstraint = (EnumerationConstraint)getStereotype(stringFieldProp,
EnumerationConstraint.class).getDelegate();
fUML.Syntax.Classes.Kernel.Enumeration e = enumConstraint.getValue();
Enumeration repoEnum = (Enumeration)Repository.INSTANCE.findElementById(e.getXmiId());
assertTrue(repoEnum != null);
assertTrue("TestValues".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());
}
}