| /***************************************************************************** |
| * Copyright (c) 2013, 2014 CEA LIST. |
| * |
| * 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: |
| * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation |
| *****************************************************************************/ |
| import org.eclipse.papyrus.uml.m2m.qvto.common.utils.UI; |
| import org.eclipse.papyrus.interoperability.rsa.ProfileBaseHelper; |
| import org.eclipse.papyrus.uml.m2m.qvto.common.blackboxes.emf.EMFResource; |
| import libraries.EclipseUI; |
| |
| modeltype uml "strict" uses 'http://www.eclipse.org/uml2/5.0.0/UML'; |
| modeltype notation "strict" uses 'http://www.eclipse.org/gmf/runtime/1.0.2/notation'; |
| modeltype defaultProfile "strict" uses 'http://www.eclipse.org/papyrus/profile/default'; |
| modeltype documentation "strict" uses 'http://www.eclipse.org/papyrus/documentation'; |
| modeltype validation "strict" uses 'http://www.eclipse.org/papyrus/dsmlvalidation'; |
| modeltype profileBase "strict" uses 'http://www.eclipse.org/papyrus/profile/profilebase'; |
| modeltype ecore "strict" uses 'http://www.eclipse.org/emf/2002/Ecore'; |
| modeltype config "strict" uses 'http:///RSAToPapyrusParameters.ecore'; |
| |
| transformation RSAProfilesToPapyrus(inout semantics : uml, inout notationModel : notation, in papyrusProfiles : /* Profiles + EObjects (Stereotype applications) */ uml, in profileDefinitions : /* EPackage */ ecore, in param : config); |
| |
| property validationURI : String = 'http://www.eclipse.org/papyrus/dsmlvalidation'; |
| |
| property documentationURI : String = 'http://www.eclipse.org/papyrus/documentation'; |
| |
| property profileBaseURI : String = 'pathmap://UML2_MSL_PROFILES/ProfileBase.epx'; |
| |
| property defaultProfileURI : String = 'pathmap://UML2_MSL_PROFILES/Default.epx'; |
| |
| main() { |
| semantics.objectsOfType(defaultProfile::URL).map toHyperlink(); |
| |
| semantics.objectsOfType(ProfileApplication).map toPapyrusValidationProfile(); |
| semantics.objectsOfType(profileBase::ProfileConstraint).map toValidationRule(); |
| |
| semantics.objectsOfType(ProfileApplication).map toPapyrusDocumentationProfile(); |
| semantics.objectsOfType(defaultProfile::Documentation).map toDocumentation(); |
| |
| if param.rootObjects()[Config]->any(true).removeUnmappedProfilesAndStereotypes then { |
| |
| //unapply deployment profile |
| |
| semantics.objectsOfType(ProfileApplication).map removeDeploymentProfile(); |
| |
| //remove DefaultLanguage stereotype |
| |
| semantics.rootObjects()[DefaultLanguage].map delete(); |
| |
| } endif; |
| } |
| |
| mapping ProfileApplication::removeDeploymentProfile() when { |
| self.appliedProfile.oclAsType(EObject).getURI().startsWith('pathmap://UML2_MSL_PROFILES/Deployment.epx'); |
| }{ |
| self.oclAsType(EObject).forceDelete(false); |
| } |
| |
| mapping DefaultLanguage::delete() { |
| //semantics.removeElement(self); |
| } |
| |
| query ProfileApplication::getDefinitionAnnotation() : EAnnotation { |
| return self.getEAnnotation('http://www.eclipse.org/uml2/2.0.0/UML'); |
| } |
| |
| query ProfileApplication::getDefinition() : EPackage { |
| return self.getDefinitionAnnotation()._references->any(oclIsKindOf(EPackage)).oclAsType(EPackage); |
| } |
| |
| /** Profile Base -> Validation **/ |
| |
| mapping inout ProfileApplication::toPapyrusValidationProfile() when { |
| self.getDefinition().oclAsType(EObject).getURI().startsWith(profileBaseURI); |
| }{ |
| self.appliedProfile := getValidationProfile(); |
| self.getDefinitionAnnotation()._references := profileDefinitions.rootObjects()[EPackage]->any(nsURI = validationURI).oclAsType(EObject); |
| |
| self.eAnnotations := self.getDefinitionAnnotation(); //Remove all other annotations |
| } |
| |
| mapping ProfileConstraint::toValidationRule() : ValidationRule { |
| result.severity := self.severity.toSeverityCode(); |
| result.mode := self.evaluationMode.toEvaluationMode(); |
| result.isEnabledByDefault := true; |
| result.base_Constraint := self.base_Constraint; |
| result.statusCode := self.severity.toStatusCode(); |
| result.message := self.getConstraintMessage(); |
| //result.description := null; |
| //result.target := null; |
| //result._class := null; |
| //result.id := null; |
| |
| //semantics.removeElement(self); //To be deleted programatically |
| } |
| |
| query defaultProfile::Severity::toSeverityCode() : validation::Severity{ |
| return switch { |
| case (self = defaultProfile::Severity::error) validation::Severity::ERROR; |
| case (self = defaultProfile::Severity::warning) validation::Severity::WARNING; |
| case (self = defaultProfile::Severity::info) validation::Severity::INFO; |
| }; |
| |
| } |
| |
| query defaultProfile::Mode::toEvaluationMode() : validation::Mode { |
| return if self = defaultProfile::Mode::batch then validation::Mode::Batch else validation::Mode::Live endif; |
| } |
| |
| query defaultProfile::Severity::toStatusCode() : Integer { |
| return switch { |
| case (self = defaultProfile::Severity::error) 3; |
| case (self = defaultProfile::Severity::warning) 2; |
| case (self = defaultProfile::Severity::info) 1; |
| }; |
| } |
| |
| query getValidationProfile() : Profile { |
| return papyrusProfiles.rootObjects()[Profile]->any(URI = validationURI); |
| } |
| |
| /** Default Profile -> Documentation **/ |
| |
| mapping inout ProfileApplication::toPapyrusDocumentationProfile() when { |
| self.getDefinition().oclAsType(EObject).getURI().startsWith(defaultProfileURI); |
| }{ |
| self.appliedProfile := getDocumentationProfile(); |
| self.getDefinitionAnnotation()._references := profileDefinitions.rootObjects()[EPackage]->any(nsURI = documentationURI).oclAsType(EObject); |
| |
| self.eAnnotations := self.getDefinitionAnnotation(); //Remove all other annotations |
| } |
| |
| mapping defaultProfile::Documentation::toDocumentation() : documentation::Documentation { |
| result.base_Comment := self.base_Comment; |
| |
| //semantics.removeElement(self); |
| } |
| |
| query getDocumentationProfile() : Profile { |
| return papyrusProfiles.objectsOfType(Profile)->any(URI = documentationURI); //DocumentationProfile is not a root profile |
| } |
| |
| /** Default Profile : Link/URL -> Hyperlink **/ |
| |
| mapping inout URL::toHyperlink() { |
| var comment := self.base_Comment; |
| |
| var commentDisplays := notationModel.objectsOfType(Shape)->select(element = comment.oclAsType(EObject)); //All views representing the comment |
| |
| var label := self.displayName; |
| var url := comment.body; |
| |
| /** In RSA, the body holds the URL, and the Stereotype holds the label */ |
| /** In Papyrus, the body holds the label, and the EAnnotation holds the URL */ |
| |
| comment.body := label; |
| |
| commentDisplays.map createHyperlinkAnnotation(url); |
| |
| end { |
| //semantics.removeElement(self); |
| } |
| } |
| |
| mapping Shape::createHyperlinkAnnotation(url : String) : EAnnotation { |
| result.eModelElement := self; |
| result.source := 'PapyrusHyperLink__web'; |
| |
| result.details += object EStringToStringMapEntry { |
| key := "tooltip_text"; |
| value := url; |
| }; |
| |
| result.details += object EStringToStringMapEntry { |
| key := "link"; |
| value := url; |
| }; |
| |
| result.details += object EStringToStringMapEntry { |
| key := "is_default_navigation"; |
| value := "true"; |
| }; |
| } |