/******************************************************************************* | |
* Copyright (c) 2010, 2012 David A Carlson and others. | |
* 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: | |
* David A Carlson (XMLmodeling.com) - initial API and implementation | |
* Christian W. Damus - Generate OCL for enumeration properties (artf3099) | |
* Rama Ramakrishnan - Increased the maximum limit of allowable enumerations to 400 | |
* | |
* $Id$ | |
*******************************************************************************/ | |
package org.eclipse.mdht.uml.term.core.util; | |
import java.util.ArrayList; | |
import java.util.List; | |
import org.eclipse.emf.common.util.URI; | |
import org.eclipse.emf.ecore.resource.Resource; | |
import org.eclipse.emf.ecore.resource.ResourceSet; | |
import org.eclipse.emf.ecore.util.EcoreUtil; | |
import org.eclipse.mdht.uml.term.core.profile.CodeSystemConstraint; | |
import org.eclipse.mdht.uml.term.core.profile.CodeSystemVersion; | |
import org.eclipse.mdht.uml.term.core.profile.ConceptDomainConstraint; | |
import org.eclipse.mdht.uml.term.core.profile.Context; | |
import org.eclipse.mdht.uml.term.core.profile.ValueSetCode; | |
import org.eclipse.mdht.uml.term.core.profile.ValueSetConstraint; | |
import org.eclipse.mdht.uml.term.core.profile.ValueSetConstraints; | |
import org.eclipse.mdht.uml.term.core.profile.ValueSetVersion; | |
import org.eclipse.uml2.uml.Classifier; | |
import org.eclipse.uml2.uml.Element; | |
import org.eclipse.uml2.uml.Enumeration; | |
import org.eclipse.uml2.uml.EnumerationLiteral; | |
import org.eclipse.uml2.uml.NamedElement; | |
import org.eclipse.uml2.uml.Profile; | |
import org.eclipse.uml2.uml.Property; | |
import org.eclipse.uml2.uml.Stereotype; | |
import org.eclipse.uml2.uml.UMLPackage; | |
import org.eclipse.uml2.uml.util.UMLUtil; | |
public class TermProfileUtil { | |
/** | |
* Applies stereotype if it is not already applied to given model element, | |
* and applies Terminology profile if necessary. | |
*/ | |
public static Stereotype applyStereotype(Element element, String stereotypeName) { | |
Stereotype stereotype = null; | |
Profile profile = getTerminologyProfile(element.eResource().getResourceSet()); | |
if (profile != null) { | |
stereotype = profile.getOwnedStereotype(stereotypeName); | |
if (stereotype != null && !element.isStereotypeApplied(stereotype)) { | |
UMLUtil.safeApplyStereotype(element, stereotype); | |
} | |
} | |
return stereotype; | |
} | |
/** | |
* Check all containing packages for applied profile. | |
*/ | |
public static Profile getAppliedProfile(Element element) { | |
return org.eclipse.mdht.uml.common.util.UMLUtil.getAppliedProfile(TermResource.TERM_PROFILE_URI, element); | |
} | |
/** | |
* Returns stereotype if applied, or first sub-stereotype applied that is a | |
* specialization of the given stereotype. | |
* | |
* @return stereotype, or null if not applied | |
*/ | |
public static Stereotype getAppliedStereotype(Element element, String stereotypeName) { | |
Stereotype stereotype = null; | |
if (element != null && element.eResource() != null) { | |
Profile profile = getTerminologyProfile(element.eResource().getResourceSet()); | |
if (profile != null) { | |
stereotype = profile.getOwnedStereotype(stereotypeName); | |
if (stereotype != null) { | |
if (!element.isStereotypeApplied(stereotype)) { | |
List<Stereotype> stereotypes = element.getAppliedSubstereotypes(stereotype); | |
if (!stereotypes.isEmpty()) { | |
stereotype = stereotypes.get(0); | |
} | |
} | |
} | |
} | |
return element.isStereotypeApplied(stereotype) | |
? stereotype | |
: null; | |
} else { | |
return null; | |
} | |
} | |
public static CodeSystemConstraint getCodeSystemConstraint(Property property) { | |
CodeSystemConstraint codeSystemConstraint = null; | |
Stereotype stereotype = TermProfileUtil.getAppliedStereotype( | |
property, ITermProfileConstants.CODE_SYSTEM_CONSTRAINT); | |
if (stereotype != null) { | |
codeSystemConstraint = (CodeSystemConstraint) property.getStereotypeApplication(stereotype); | |
} | |
return codeSystemConstraint; | |
} | |
public static CodeSystemVersion getCodeSystemVersion(Enumeration umlEnumeration) { | |
for (Object foo : umlEnumeration.getStereotypeApplications()) { | |
System.out.println("aaaaa " + foo.getClass().getCanonicalName()); | |
} | |
CodeSystemVersion codeSystemVersion = null; | |
Stereotype stereotype = TermProfileUtil.getAppliedStereotype( | |
umlEnumeration, ITermProfileConstants.CODE_SYSTEM_VERSION); | |
if (stereotype != null) { | |
codeSystemVersion = (CodeSystemVersion) umlEnumeration.getStereotypeApplication(stereotype); | |
} | |
return codeSystemVersion; | |
} | |
public static ConceptDomainConstraint getConceptDomainConstraint(Property property) { | |
ConceptDomainConstraint conceptDomainConstraint = null; | |
Stereotype stereotype = TermProfileUtil.getAppliedStereotype( | |
property, ITermProfileConstants.CONCEPT_DOMAIN_CONSTRAINT); | |
if (stereotype != null) { | |
conceptDomainConstraint = (ConceptDomainConstraint) property.getStereotypeApplication(stereotype); | |
} | |
return conceptDomainConstraint; | |
} | |
/** | |
* Load Terminology profile into provided resource set and return Profile. | |
*/ | |
public static Profile getTerminologyProfile(ResourceSet resourceSet) { | |
Profile profile = null; | |
Resource profileResource = resourceSet.getResource(URI.createURI(TermResource.TERM_PROFILE_URI), true); | |
if (profileResource != null) { | |
profile = (Profile) EcoreUtil.getObjectByType( | |
profileResource.getContents(), UMLPackage.eINSTANCE.getProfile()); | |
} | |
return profile; | |
} | |
public static ValueSetCode getValueSetCode(EnumerationLiteral literal) { | |
ValueSetCode valueSetCode = null; | |
Stereotype stereotype = TermProfileUtil.getAppliedStereotype(literal, ITermProfileConstants.VALUE_SET_CODE); | |
if (stereotype != null) { | |
valueSetCode = (ValueSetCode) literal.getStereotypeApplication(stereotype); | |
} | |
return valueSetCode; | |
} | |
public static ValueSetConstraint getValueSetConstraint(Property property) { | |
ValueSetConstraint valueSetConstraint = null; | |
Stereotype stereotype = TermProfileUtil.getAppliedStereotype( | |
property, ITermProfileConstants.VALUE_SET_CONSTRAINT); | |
if (stereotype != null) { | |
valueSetConstraint = (ValueSetConstraint) property.getStereotypeApplication(stereotype); | |
} | |
return valueSetConstraint; | |
} | |
public static Context getContext(Enumeration property) { | |
Context context = null; | |
Stereotype stereotype = TermProfileUtil.getAppliedStereotype(property, ITermProfileConstants.CONTEXT); | |
if (stereotype != null) { | |
context = (Context) property.getStereotypeApplication(stereotype); | |
} | |
return context; | |
} | |
public static ValueSetVersion getValueSetVersion(Enumeration umlEnumeration) { | |
ValueSetVersion valueSetVersion = null; | |
Stereotype stereotype = TermProfileUtil.getAppliedStereotype( | |
umlEnumeration, ITermProfileConstants.VALUE_SET_VERSION); | |
if (stereotype != null) { | |
valueSetVersion = (ValueSetVersion) umlEnumeration.getStereotypeApplication(stereotype); | |
} | |
return valueSetVersion; | |
} | |
public static void unapplyStereotype(Element element, String stereotypeName) { | |
String qname = ITermProfileConstants.TERM_PROFILE_NAME + NamedElement.SEPARATOR + stereotypeName; | |
Stereotype stereotype = element.getApplicableStereotype(qname); | |
if (stereotype != null && element.isStereotypeApplied(stereotype)) { | |
element.unapplyStereotype(stereotype); | |
} | |
} | |
public static boolean isCSType(Property property) { | |
Classifier type = (Classifier) property.getType(); | |
if (type != null) { | |
List<Classifier> allTypes = new ArrayList<Classifier>(type.allParents()); | |
allTypes.add(0, type); | |
for (Classifier classifier : allTypes) { | |
if ("datatypes::CS".equals(classifier.getQualifiedName())) { | |
return true; | |
} | |
} | |
} | |
return false; | |
} | |
/** | |
* This method returns enumerations only if the enumerations are less than 400. | |
* A discussion on this number is available at | |
* https://www.projects.openhealthtools.org/sf/discussion/do/listPosts/projects.mdht/discussion.forum1118.topc12096 | |
* | |
* @param enumeration | |
* @return | |
*/ | |
static Iterable<EnumerationLiteral> getSmallEnumeration(Enumeration enumeration) { | |
List<EnumerationLiteral> literals = enumeration.getOwnedLiterals(); | |
return ((literals.size() > 0) && (literals.size() < 400)) | |
? literals | |
: null; | |
} | |
/** | |
* @param property | |
*/ | |
public static ValueSetConstraints getValueSetConstraints(Property property) { | |
ValueSetConstraints valueSetConstraints = null; | |
Stereotype stereotype = TermProfileUtil.getAppliedStereotype( | |
property, ITermProfileConstants.VALUE_SET_CONSTRAINTS); | |
if (stereotype != null) { | |
valueSetConstraints = (ValueSetConstraints) property.getStereotypeApplication(stereotype); | |
} | |
return valueSetConstraints; | |
} | |
} |