diff --git a/org.fortiss.af3.exploration.alg/trunk/META-INF/MANIFEST.MF b/org.fortiss.af3.exploration.alg/trunk/META-INF/MANIFEST.MF index 159677370066403059d63ba15f3272fa9abf4767..5c1f250feb2f52074eefc55edcdf71e6fdc954b7 100644 --- a/org.fortiss.af3.exploration.alg/trunk/META-INF/MANIFEST.MF +++ b/org.fortiss.af3.exploration.alg/trunk/META-INF/MANIFEST.MF @@ -23,9 +23,18 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-Activator: org.fortiss.af3.exploration.alg.ExplorationAlgActivator Require-Bundle: org.fortiss.tooling.base.ui;visibility:=reexport, - org.fortiss.af3.safety;bundle-version="2.9.0";visibility:=reexport, + org.fortiss.af3.safety;visibility:=reexport;bundle-version="2.9.0", + org.fortiss.tooling.kernel;visibility:=reexport, org.fortiss.af3.schedule;visibility:=reexport, - org.fortiss.af3.exploration;bundle-version="2.10.0";visibility:=reexport + org.eclipse.core.runtime, + org.eclipse.emf.ecore;visibility:=reexport, + org.fortiss.tooling.base;visibility:=reexport, + org.fortiss.af3.component;visibility:=reexport, + org.fortiss.af3.exploration.alg;visibility:=reexport, + org.fortiss.af3.exploration;visibility:=reexport;bundle-version="2.10.0", + org.fortiss.af3.expression;visibility:=reexport, + org.fortiss.af3.platform;visibility:=reexport, + org.fortiss.af3.project;visibility:=reexport Export-Package: com.google.common.annotations, com.google.common.base, com.google.common.base.internal, @@ -105,6 +114,9 @@ Export-Package: com.google.common.annotations, org.fortiss.af3.exploration.model.time.util, org.fortiss.af3.exploration.model.util, org.fortiss.af3.exploration.moea.model, + org.fortiss.af3.exploration.moea.model.annotation, + org.fortiss.af3.exploration.moea.model.annotation.impl, + org.fortiss.af3.exploration.moea.model.annotation.util, org.fortiss.af3.exploration.moea.model.feature, org.fortiss.af3.exploration.moea.model.feature.impl, org.fortiss.af3.exploration.moea.model.feature.util, diff --git a/org.fortiss.af3.exploration.alg/trunk/model/moea.ecore b/org.fortiss.af3.exploration.alg/trunk/model/moea.ecore index 6e5ba39085c403df4ce4c7029cdb36fbaf5e0569..d4aa8ab91f7408805fc0e8a4bd29c4cbac8a2452 100644 --- a/org.fortiss.af3.exploration.alg/trunk/model/moea.ecore +++ b/org.fortiss.af3.exploration.alg/trunk/model/moea.ecore @@ -52,6 +52,16 @@ <eClassifiers xsi:type="ecore:EClass" name="VoterType" eSuperTypes="platform:/resource/org.fortiss.tooling.base/model/base.ecore#//element/IHiddenSpecification"> <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" lowerBound="1" eType="#//VoterType_t"/> </eClassifiers> + <eSubpackages name="annotation" nsURI="http://www.fortiss.org/af3/exploration/moea/annotation" + nsPrefix="org-fortiss-af3-exploration-moea-annotation"> + <eClassifiers xsi:type="ecore:EClass" name="ComponentDiverseImplRef" eSuperTypes="platform:/resource/org.fortiss.tooling.base/model/base.ecore#//element/IAnnotatedSpecification platform:/resource/org.fortiss.tooling.base/model/base.ecore#//element/IHiddenSpecification"> + <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> + <details key="documentation" value="{@link IAnnotatedSpecification} providing a reference to a set of differing implementations of the specified {@link Component}, hence providing diverse implementations."/> + </eAnnotations> + <eStructuralFeatures xsi:type="ecore:EReference" name="componentRef" upperBound="-1" + eType="ecore:EClass platform:/resource/org.fortiss.af3.component/model/component.ecore#//Component"/> + </eClassifiers> + </eSubpackages> <eSubpackages name="feature" nsURI="http://www.fortiss.org/af3/exploration/moea/feature" nsPrefix="org-fortiss-af3-exploration-moea-feature"> <eClassifiers xsi:type="ecore:EClass" name="SafetyExploration" eSuperTypes="platform:/resource/org.fortiss.af3.exploration/model/exploration.ecore#//IExplorationFeature"> diff --git a/org.fortiss.af3.exploration.alg/trunk/model/moea.genmodel b/org.fortiss.af3.exploration.alg/trunk/model/moea.genmodel index 2317cdc3115bcf7c5060fc24d3cfd7fbadad1828..288aa08132ceb2f7a83b41d3934563460fabf482 100644 --- a/org.fortiss.af3.exploration.alg/trunk/model/moea.genmodel +++ b/org.fortiss.af3.exploration.alg/trunk/model/moea.genmodel @@ -28,6 +28,13 @@ <genClasses ecoreClass="moea.ecore#//VoterType"> <genFeatures createChild="false" ecoreFeature="ecore:EAttribute moea.ecore#//VoterType/type"/> </genClasses> + <nestedGenPackages prefix="Annotation" basePackage="org.fortiss.af3.exploration.moea.model" + disposableProviderFactory="true" ecorePackage="moea.ecore#//annotation"> + <genClasses ecoreClass="moea.ecore#//annotation/ComponentDiverseImplRef"> + <genFeatures notify="false" createChild="false" propertySortChoices="true" + ecoreFeature="ecore:EReference moea.ecore#//annotation/ComponentDiverseImplRef/componentRef"/> + </genClasses> + </nestedGenPackages> <nestedGenPackages prefix="Feature" basePackage="org.fortiss.af3.exploration.moea.model" disposableProviderFactory="true" ecorePackage="moea.ecore#//feature"> <genDataTypes ecoreDataType="moea.ecore#//feature/ISafetyFunctionAdapter"/> diff --git a/org.fortiss.af3.exploration.alg/trunk/plugin.xml b/org.fortiss.af3.exploration.alg/trunk/plugin.xml index b6a2a783715ba1a3238552b650dfb8da952ef6d3..661feb6808d45a64dc32703cc0c63db366634ca5 100644 --- a/org.fortiss.af3.exploration.alg/trunk/plugin.xml +++ b/org.fortiss.af3.exploration.alg/trunk/plugin.xml @@ -13,6 +13,8 @@ <extension-point id="evaluator" name="Evaluator" schema="schema/evaluator.exsd"/> <extension-point id="repairModule" name="RepairModule" schema="schema/repairModule.exsd"/> <extension-point id="constraintTransformationModule" name="Constraint Transformation Module" schema="schema/constraintTransformationModule.exsd"/> + + <!-- Value providers for the annotation classes --> <extension point="org.fortiss.tooling.base.annotation"> <annotation @@ -21,6 +23,9 @@ modelElementClass="org.fortiss.af3.platform.model.ExecutionUnit"> </modelElementClass> </annotation> + <annotation binding="org.fortiss.af3.exploration.alg.annotation.valueprovider.ComponentImplDiversityRefValueProvider"> + <modelElementClass modelElementClass="org.fortiss.af3.component.model.Component"/> + </annotation> </extension> <extension @@ -78,6 +83,14 @@ genModel="model/moea.genmodel"/> </extension> + <extension point="org.eclipse.emf.ecore.generated_package"> + <!-- @generated moea --> + <package + uri="http://www.fortiss.org/af3/exploration/moea/annotation" + class="org.fortiss.af3.exploration.moea.model.annotation.AnnotationPackage" + genModel="model/moea.genmodel"/> + </extension> + <extension point="org.eclipse.emf.ecore.generated_package"> <!-- @generated moea --> <package diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/annotation/valueprovider/ComponentImplDiversityRefValueProvider.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/annotation/valueprovider/ComponentImplDiversityRefValueProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..4c9301869305ee8f01583bfcadf42eae80804e59 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/annotation/valueprovider/ComponentImplDiversityRefValueProvider.java @@ -0,0 +1,148 @@ +/*--------------------------------------------------------------------------+ +$Id: ComponentImplDiversityRefValueProvider.java 1804 2015-11-19 14:28:47Z barner $ +| | +| Copyright 2014 ForTISS GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.af3.exploration.alg.annotation.valueprovider; + +import static org.fortiss.tooling.kernel.utils.KernelModelElementUtils.getParentElement; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.fortiss.af3.component.model.Component; +import org.fortiss.af3.component.model.ComponentArchitecture; +import org.fortiss.af3.component.utils.ComponentArchitectureUtils; +import org.fortiss.af3.exploration.moea.model.annotation.AnnotationPackage; +import org.fortiss.af3.exploration.moea.model.annotation.ComponentDiverseImplRef; +import org.fortiss.tooling.base.annotation.valueprovider.EStructuralFeatureDescriptor; +import org.fortiss.tooling.base.annotation.valueprovider.EStructuralFeatureValueProviderBase; +import org.fortiss.tooling.base.annotation.valueprovider.IAnnotationValueProvider; +import org.fortiss.tooling.base.model.element.IAnnotatedSpecification; + +/** + * {@link IAnnotationValueProvider} for referencing {@link Component}s that represent a diverse + * implementation of a component that is part of a functional description of a + * {@link ComponentArchitecture} + * + * @author barner + * @author $Author: barner $ + * @version $Rev: 1804 $ + * @ConQAT.Rating YELLOW Hash: FA4D4457C9F251312DCA6CA2AEF45DA0 + */ +public class ComponentImplDiversityRefValueProvider extends + EStructuralFeatureValueProviderBase<ComponentDiverseImplRef> { + + /** + * {@link EStructuralFeatureDescriptor} that filters the available objects to be selected for + * the reference provided by this annotation. + */ + private static class DiversityRefFilterEStructuralFeatureDescriptor extends + EStructuralFeatureDescriptor { + + /** Constructs a new {@link DiversityRefFilterEStructuralFeatureDescriptor}. */ + public DiversityRefFilterEStructuralFeatureDescriptor(EReference eReference, + EReferenceScope eReferenceScope) { + super(eReference, eReferenceScope); + } + + /** {@inheritDoc} */ + @Override + public boolean isAvailableObject(EObject obj, IAnnotatedSpecification specification, + EObject modelElement) { + + // Only offer only Components + if(!(obj instanceof Component)) { + return false; + } + Component refComponent = (Component)obj; + + // Allow references to Components implementing diversity only if the "abstract", i.e. + // the referencing, Component is atomic. + if(modelElement instanceof Component && + ComponentArchitectureUtils.isAtomicComponent((Component)modelElement)) { + + ComponentArchitecture targetCompArch = + getParentElement(obj, ComponentArchitecture.class, false); + + // Check, whether the the parent ComponentArchitcture is the component pool (via the + // name of the top-level Component). + if(targetCompArch != null && + targetCompArch.getTopComponent().getName().contains("Component Pool")) { + // Do not allow self references inside the component pool. + ComponentArchitecture sourceCompArch = + getParentElement(modelElement, ComponentArchitecture.class, false); + if(sourceCompArch != null && sourceCompArch != targetCompArch) { + // Only return diverse Component implementations if the referenced Component + // is a sub-element of a Component in the Component Pool. (2nd layer) + if(getDistToTopLevel(refComponent, targetCompArch) == 1) { + return true; + } + } + } + } + return false; + } + } + + /** + * Returns the "level" in the hierarchy of a "pure" {@link ComponentArchitecture} i.e. a + * {@link ComponentArchitecture} consisting only of {@link Component}s. The {@link Component}s + * contained in the top level component are considered to be at level 0. + */ + private static int getDistToTopLevel(Component comp, ComponentArchitecture compArch) { + if(comp == compArch.getTopComponent()) { + return -1; + } + + Component parentComp = comp.getParentComponent(); + int level = 0; + while(parentComp != null && parentComp != compArch.getTopComponent()) { + parentComp = parentComp.getParentComponent(); + level++; + } + + return level; + } + + /** {@link EStructuralFeature}s managed by this {@link IAnnotationValueProvider}. */ + private static Map<String, EStructuralFeatureDescriptor> createStructuralFeatureDescriptorMap() { + Map<String, EStructuralFeatureDescriptor> rval = + new HashMap<String, EStructuralFeatureDescriptor>(); + + rval.put(IAnnotationValueProvider.DEFAULT_KEY, + new DiversityRefFilterEStructuralFeatureDescriptor( + AnnotationPackage.Literals.COMPONENT_DIVERSE_IMPL_REF__COMPONENT_REF, + EStructuralFeatureDescriptor.EReferenceScope.PROJECT)); + + return Collections.unmodifiableMap(rval); + } + + /** Constructs a value provider for the (derived) {@link ComponentDiverseImplRef} annotation. */ + public ComponentImplDiversityRefValueProvider() { + super(AnnotationPackage.Literals.COMPONENT_DIVERSE_IMPL_REF, + createStructuralFeatureDescriptorMap()); + } + + /** {@inheritDoc} */ + @Override + public String getAnnotationName(ComponentDiverseImplRef specification) { + return "Diverse Implementations"; + } +}