From 572cc85ddd9ce2e71ec151943913afb5a8ae272c Mon Sep 17 00:00:00 2001 From: Alexander Diewald <diewald@fortiss.org> Date: Thu, 8 Mar 2018 16:43:59 +0000 Subject: [PATCH] Exploration.alg: Implement the SuperSet export in the Transformation framework. * Simplify the Transformation Service interface. * Clean and simplify the base implementation of the Transformation Framework. * Introduce a container element that makes the Transformation almost agnostic to the fact if the inputs stem form DSE-internals or SuperSets. * Add a SuperSetMap transformation strategy. --- .../trunk/plugin.xml | 34 +++- .../alg/dse/CompositeExplorationSolution.java | 59 ++++-- .../problem/taskmapping/instantiate/.ratings | 4 +- .../FailSilentAbstractTaskMappingDecoder.java | 1 + ...ctionVotingAbstractTaskMappingDecoder.java | 1 + .../alg/dse/backend/opt4j/solution/.ratings | 2 +- .../opt4j/solution/ArchitectureSolution.java | 12 +- .../alg/dse/modeltransformation/.ratings | 2 +- .../ITransformationModule.java | 34 +--- .../alg/dse/modeltransformation/base/.ratings | 8 +- .../base/ElementTransformationModuleBase.java | 11 +- .../ElementTransformationStrategyBase.java | 34 ++-- .../base/TransformationModuleBase.java | 12 -- .../base/TransformationStrategyBase.java | 59 ++---- .../dse/modeltransformation/comparch/.ratings | 10 +- .../ComponentArchitectureFinalizer.java | 9 +- .../ComponentArchitectureInitializer.java | 19 +- .../ComponentArchitectureInserter.java | 9 +- .../ComponentArchitectureInstantiator.java | 12 +- .../ComponentArchitectureReplicator.java | 17 +- .../modeltransformation/deployment/.ratings | 8 +- .../deployment/DeploymentFinalizer.java | 24 +-- .../deployment/DeploymentInitializer.java | 18 +- .../deployment/DeploymentReplicator.java | 18 +- .../ExplorationSolutionToDeployment.java | 27 ++- .../modeltransformation/dseinternal/.ratings | 6 + .../ComponentExecutionUnitTransformation.java | 89 ++++++++ ...artitionToExecutionUnitTransformation.java | 80 ++++++++ .../dseinternal/PartitionTransformation.java | 73 +++++++ .../SuperSetTransformationBase.java | 68 +++++++ .../SuperSetTransformationStrategy.java | 121 +++++++++++ .../TaskToPartitionTransformation.java | 82 ++++++++ .../dse/modeltransformation/element/.ratings | 2 +- .../element/IElementTransformationModule.java | 13 +- .../modeltransformation/partition/.ratings | 2 +- .../partition/PartitionTransformer.java | 23 +-- .../dse/modeltransformation/safety/.ratings | 4 +- .../safety/SafetyChannelPortReplicator.java | 11 +- .../safety/SafetyDiagUnitRemover.java | 12 +- .../alg/graph/IDependencyModule.java | 2 +- .../af3/exploration/alg/plot/XYPlotter.java | 18 +- .../af3/exploration/alg/service/.ratings | 2 +- .../ExplorationTransformationInputs.java | 95 +++++++++ .../IExplorationTransformationService.java | 112 +---------- .../exploration/alg/service/internal/.ratings | 2 +- .../ExplorationTransformationService.java | 190 ++++-------------- 46 files changed, 908 insertions(+), 543 deletions(-) create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/.ratings create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/ComponentExecutionUnitTransformation.java create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/PartitionToExecutionUnitTransformation.java create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/PartitionTransformation.java create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/SuperSetTransformationBase.java create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/SuperSetTransformationStrategy.java create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/TaskToPartitionTransformation.java create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/ExplorationTransformationInputs.java diff --git a/org.fortiss.af3.exploration.alg/trunk/plugin.xml b/org.fortiss.af3.exploration.alg/trunk/plugin.xml index bca0988c..1aa145dc 100644 --- a/org.fortiss.af3.exploration.alg/trunk/plugin.xml +++ b/org.fortiss.af3.exploration.alg/trunk/plugin.xml @@ -203,17 +203,47 @@ </modelElementClass> </transformationModule> <transformationModule - module="org.fortiss.af3.exploration.alg.dse.modeltransformation.partition.PartitionTransformer"> + module="org.fortiss.af3.exploration.alg.dse.modeltransformation.partition.PartitionTransformationStrategy"> <modelElementClass modelElementClass="org.fortiss.af3.allocation.model.AllocationTableCollection"> </modelElementClass> </transformationModule> <transformationModule - module="org.fortiss.af3.exploration.alg.dse.modeltransformation.partition.PartitionTransformationStrategy"> + module="org.fortiss.af3.exploration.alg.dse.modeltransformation.partition.PartitionTransformer"> <modelElementClass modelElementClass="org.fortiss.af3.allocation.model.AllocationTableCollection"> </modelElementClass> </transformationModule> + <transformationModule + module="org.fortiss.af3.exploration.alg.dse.modeltransformation.dseinternal.SuperSetTransformationStrategy"> + <modelElementClass + modelElementClass="org.fortiss.af3.exploration.model.SuperSetMap"> + </modelElementClass> + </transformationModule> + <transformationModule + module="org.fortiss.af3.exploration.alg.dse.modeltransformation.dseinternal.ComponentExecutionUnitTransformation"> + <modelElementClass + modelElementClass="org.fortiss.af3.platform.model.allocation.ComponentToExecutionUnitAllocationEntry"> + </modelElementClass> + </transformationModule> + <transformationModule + module="org.fortiss.af3.exploration.alg.dse.modeltransformation.dseinternal.PartitionToExecutionUnitTransformation"> + <modelElementClass + modelElementClass="org.fortiss.af3.partition.model.allocation.PartitionToExecutionUnitAllocationEntry"> + </modelElementClass> + </transformationModule> + <transformationModule + module="org.fortiss.af3.exploration.alg.dse.modeltransformation.dseinternal.PartitionTransformation"> + <modelElementClass + modelElementClass="org.fortiss.af3.partition.model.Partition"> + </modelElementClass> + </transformationModule> + <transformationModule + module="org.fortiss.af3.exploration.alg.dse.modeltransformation.dseinternal.TaskToPartitionTransformation"> + <modelElementClass + modelElementClass="org.fortiss.af3.partition.model.allocation.TaskToPartitionAllocationEntry"> + </modelElementClass> + </transformationModule> </extension> <extension id="org.fortiss.af3.exploration.alg.transformationModule" diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/CompositeExplorationSolution.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/CompositeExplorationSolution.java index b03ba997..8e2d1728 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/CompositeExplorationSolution.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/CompositeExplorationSolution.java @@ -16,15 +16,20 @@ package org.fortiss.af3.exploration.alg.dse; import static org.fortiss.af3.allocation.utils.AllocationModelElementFactory.createAllocationEntry; +import static org.fortiss.af3.exploration.alg.service.ExplorationService.getService; +import static org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext.DSE_INTERNAL; import static org.fortiss.af3.exploration.util.DSMLModelElementFactory.createSuperSet; import static org.fortiss.af3.exploration.util.DesignSpaceExplorationModelElementFactory.createSingleExplorationSolution; import static org.fortiss.af3.partition.util.PartitionModelElementFactory.createPartition; import static org.fortiss.tooling.common.util.LambdaUtils.getFirst; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; +import org.eclipse.emf.ecore.EObject; import org.fortiss.af3.component.model.Component; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; @@ -36,8 +41,11 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.IExplorationSo import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.IScheduleSolution; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.StrictTTSchedule; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ITaskAdapter; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; +import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService; import org.fortiss.af3.exploration.dsl_v2.model.expression.SuperSet; import org.fortiss.af3.exploration.model.ExplorationTarget; +import org.fortiss.af3.exploration.model.SuperSetMap; import org.fortiss.af3.exploration.model.solutions.ExplorationResult; import org.fortiss.af3.exploration.model.solutions.ExplorationSolution; import org.fortiss.af3.exploration.model.solutions.SingleExplorationSolution; @@ -51,6 +59,9 @@ import org.fortiss.af3.task.model.Task; import org.fortiss.tooling.base.model.element.IModelElement; import org.opt4j.core.Value; +import com.google.common.collect.ClassToInstanceMap; +import com.google.common.collect.MutableClassToInstanceMap; + /** * Result of a DSE run, i.e. the {@link IExplorationSolution}s and {@link SolutionQuantification}s * for all pareto-optimal {@link IExplorationSolution}s. @@ -147,7 +158,8 @@ public class CompositeExplorationSolution<P extends Phenotype> { * . */ @SuppressWarnings("unchecked") - public <T> ExplorationSolution convertToExplorationSolution() throws Exception { + public <T, S extends IModelElement> ExplorationSolution convertToExplorationSolution() + throws Exception { ExplorationSolution expSol = org.fortiss.af3.exploration.util.DesignSpaceExplorationModelElementFactory .createExplorationSolution(); @@ -173,20 +185,41 @@ public class CompositeExplorationSolution<P extends Phenotype> { singleExpSolution.put((ExplorationTarget<?>)solEntry.getKey(), res); } + ClassToInstanceMap<Phenotype> internalSolutions = MutableClassToInstanceMap.create(); + for(Class<? extends Phenotype> solutionType : singleSolution + .getAllSubSolutionClasses()) { + internalSolutions.put(solutionType, singleSolution.getSubSolution(solutionType)); + } + // FIXME: HACK: Currently, only the Deployment exploration is used, whereas the solution // transformation framework is non-functional at the moment. - InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry> tm = - singleSolution.getSubSolution(InstantiatedTaskMappingEncoding.class); - PartitionMappingEncoding pmEncoding = - singleSolution.getSubSolution(PartitionMappingEncoding.class); - singleExpSolution.getSolutionSets().put(ComponentToExecutionUnitAllocationEntry.class, - createCompExecUnitAllocs(tm, pmEncoding)); - singleExpSolution.getSolutionSets().put(org.fortiss.af3.partition.model.Partition.class, - createPartitions(pmEncoding)); - singleExpSolution.getSolutionSets().put(PartitionToExecutionUnitAllocationEntry.class, - createPartitionToExecutionUnitAllocations(pmEncoding)); - singleExpSolution.getSolutionSets().put(TaskToPartitionAllocationEntry.class, - createTaskToExecutionUnitAllocations(tm)); + Collection<Class<?>> outputTypes = new ArrayList<>(); + // In a later stage, we would pass a list of generated "generatable" SuperSets derived + // from the Phenotypes. This is the inverse setup of the model-oriented transformations + // where we request desired types. Here, we'd calculate all types that can be produced. + outputTypes.add(SuperSetMap.class); + // outputTypes.add(org.fortiss.af3.partition.model.Partition.class); + // outputTypes.add(ComponentToExecutionUnitAllocationEntry.class); + // outputTypes.add(TaskToPartitionAllocationEntry.class); + // outputTypes.add(PartitionToExecutionUnitAllocationEntry.class); + ExplorationTransformationInputs inputs = + new ExplorationTransformationInputs(null, internalSolutions); + Map<Class<EObject>, ?> solutionModels = + getService(IExplorationTransformationService.class) + .getTransformedModels(DSE_INTERNAL, null, inputs, outputTypes, ""); + singleExpSolution.setSolutionSets((SuperSetMap)solutionModels.get(SuperSetMap.class)); + // InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry> tm = + // singleSolution.getSubSolution(InstantiatedTaskMappingEncoding.class); + // PartitionMappingEncoding pmEncoding = + // singleSolution.getSubSolution(PartitionMappingEncoding.class); + // singleExpSolution.getSolutionSets().put(ComponentToExecutionUnitAllocationEntry.class, + // createCompExecUnitAllocs(tm, pmEncoding)); + // singleExpSolution.getSolutionSets().put(org.fortiss.af3.partition.model.Partition.class, + // createPartitions(pmEncoding)); + // singleExpSolution.getSolutionSets().put(PartitionToExecutionUnitAllocationEntry.class, + // createPartitionToExecutionUnitAllocations(pmEncoding)); + // singleExpSolution.getSolutionSets().put(TaskToPartitionAllocationEntry.class, + // createTaskToExecutionUnitAllocations(tm)); // Invalid solutions are filtered before. singleExpSolution.setSolutionState(SolutionState.OPTIMIZED); diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/.ratings index 85f637ba..01dfb3ae 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/.ratings @@ -1,4 +1,4 @@ AbstractTaskMappingDecoder.java 2f3aa1860a3f10224bd8f5eab4ee07f136f44065 RED -FailSilentAbstractTaskMappingDecoder.java 5e93b07f400d697f318d029d00c674c715513422 RED -FaultDetectionVotingAbstractTaskMappingDecoder.java 8d3613f856787bf667ef2bcdae441375cdb9e989 RED +FailSilentAbstractTaskMappingDecoder.java 737f312502e0e41eb7de9e78985572436ec95ce9 RED +FaultDetectionVotingAbstractTaskMappingDecoder.java bf75917b2a858e77feb677957a6eb9333bf099d9 RED TaskInstanceResourceAlignmentDecoder.java 4e9e61817df2e869ef84b67943c4e9874bbd4f37 RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java index 2abf74f9..0d68a832 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java @@ -39,6 +39,7 @@ import org.fortiss.af3.exploration.moea.model.DseSpecification; * * @author diewald */ +// FIXME: The type hierarchy and naming of the classes is extremely confusing. FIX ASAP! public class FailSilentAbstractTaskMappingDecoder extends AbstractTaskMappingDecoder<FailSilentTaskMappingEntry, FailSilentTaskMappingEncoding> { diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FaultDetectionVotingAbstractTaskMappingDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FaultDetectionVotingAbstractTaskMappingDecoder.java index c8ec4052..91ad4881 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FaultDetectionVotingAbstractTaskMappingDecoder.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FaultDetectionVotingAbstractTaskMappingDecoder.java @@ -39,6 +39,7 @@ import org.opt4j.core.problem.Decoder; * * @author diewald */ +// FIXME: The type hierarchy and naming of the classes is extremely confusing. FIX ASAP! public class FaultDetectionVotingAbstractTaskMappingDecoder extends AbstractTaskMappingDecoder<FaultDetectionVotingTaskMappingEntry, FaultDetectionVotingTaskMappingEncoding> { diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/solution/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/solution/.ratings index de60db13..2d79db22 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/solution/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/solution/.ratings @@ -1,5 +1,5 @@ ArchExpSubSolution.java 3bb56206fe70f19f7cb6aee575eba552ce9bbc4e RED -ArchitectureSolution.java 8ba40ce339c4195641ed1b67c79718e297d66e4c RED +ArchitectureSolution.java 4403246ed4c40e907e5def4ff503001081f0f47d YELLOW IExplorationSolution.java a6153937197358907ceec46606a7f28620c26f2b RED IScheduleSolution.java 8a2959147bdca874fd43b1591bc5471b68c04333 RED StrictTTSchedule.java eec7ffce1047cec7b869a938fd428e56cd705163 RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/solution/ArchitectureSolution.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/solution/ArchitectureSolution.java index 890be805..3e476e72 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/solution/ArchitectureSolution.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/solution/ArchitectureSolution.java @@ -21,6 +21,7 @@ import java.util.LinkedList; import java.util.Queue; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.ArchitectureExplorationEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.ComposablePhenotype; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.CompositePhenotype; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.CompositePhenotypeBase; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; @@ -40,11 +41,14 @@ public class ArchitectureSolution extends CompositePhenotypeBase<ArchitectureExp @Override public Collection<Class<? extends ArchExpSubSolution<?>>> getAllSubSolutionClasses() { Collection<Class<? extends ArchExpSubSolution<?>>> subSolutionClasses = new ArrayList<>(); - Queue<Phenotype> traversalList = new LinkedList<>(); - traversalList.addAll(subPhenotypes.values()); + Queue<ComposablePhenotype<?>> traversalList = new LinkedList<>(); + traversalList + .addAll((Collection<? extends ComposablePhenotype<?>>)(Collection<?>)subPhenotypes + .values()); while(!traversalList.isEmpty()) { - Phenotype phenotype = traversalList.poll(); - subSolutionClasses.add((Class<? extends ArchExpSubSolution<?>>)phenotype.getClass()); + ComposablePhenotype<?> phenotype = traversalList.poll(); + subSolutionClasses + .add((Class<? extends ArchExpSubSolution<?>>)phenotype.getPTypeToRegister()); if(phenotype instanceof CompositePhenotype) { traversalList.addAll(((CompositePhenotype<?>)phenotype).getSubPhenotypes()); } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/.ratings index 137f111a..8b4b45e1 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/.ratings @@ -1,4 +1,4 @@ DeprecatedModelGeneratorBase.java 653a6413139120d4e8949880c6b951aad09fbeaf RED EMFModelConcurrencyHandler.java b488636059888b61c2b4af974c1752be1d5f3d3b RED -ITransformationModule.java 3ca96726e0eb6f4541be95cb9453d2de2ab99799 RED +ITransformationModule.java 5277a9d1fd452835dbe3fe8b7182bb83edd4c0e9 YELLOW ITransformationStrategy.java eb72568e6df58b44ac96418c8d59c3a98715dc5c RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/ITransformationModule.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/ITransformationModule.java index b541848e..f995cf6c 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/ITransformationModule.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/ITransformationModule.java @@ -24,11 +24,10 @@ import org.fortiss.af3.exploration.alg.exception.TransformationModuleException; import org.fortiss.af3.exploration.alg.graph.IDependencyModule; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; import org.fortiss.af3.exploration.alg.guava.TypedBiMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; import org.fortiss.af3.exploration.alg.service.IExplorationModule; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; -import org.fortiss.af3.exploration.model.SuperSetMap; import org.fortiss.tooling.kernel.service.base.IEObjectAware; import com.google.common.collect.Multimap; @@ -43,7 +42,7 @@ import com.google.common.collect.Multimap; * when being launched as a submodule if the required inputs are not available. * * The method - * {@link #transform(TransformationState, TransformationContext, SubClassToInstanceMap, ExplorationEncodingMap, SubClassToInstanceMap, EObject)} + * {@link #transform(TransformationState, TransformationContext, ExplorationTransformationInputs, SubClassToInstanceMap, EObject)} * actually triggers the * transformation using the * module itself and its submodules. @@ -179,25 +178,6 @@ public interface ITransformationModule<T extends EObject> /** Predicates whether the execution of is required or optional. */ boolean isOptional(); - /** - * Loads the given association maps into {@code this} {@link ITransformationModule}. Typically, - * these maps are passed from the parent {@link ITransformationModule}. - * - * @param encEntryToGenElemAssocs - * Associates entries of {@link IExplorationEncoding}s with model elements. - * @param origToGenElemAssocs - * Associates original input model elements with generated ones. - * @param genToOrigElemAssocs - * Associates generated model elements with those provided by the input models. - * @param genToGenElemAssocs - * Map that defines which elements from previous steps are related to which elements - * from one of the successor steps (1:n relation). - */ - void loadElementAssociations(TypedBiMap<Object, EObject> encEntryToGenElemAssocs, - Multimap<EObject, EObject> origToGenElemAssocs, - Map<EObject, EObject> genToOrigElemAssocs, - Multimap<EObject, EObject> genToGenElemAssocs); - /** * Updates the given associative maps that allow to trace objects between the original and the * transformed model, and between the entries of and exploration encoding and the elements of @@ -260,10 +240,8 @@ public interface ITransformationModule<T extends EObject> * The state of the transformation engine, e.g., replication. * @param context * The model context. - * @param baseModels - * Input EMF models. - * @param explorationEncodings - * {@link IExplorationEncoding}s resulting from the DSE. + * @param inputs + * Input types. * @param transformedModels * Container map of all the transformed models. * @param outputModel @@ -275,9 +253,7 @@ public interface ITransformationModule<T extends EObject> * If the transformation fails at {@code this} {@link ITransformationModule}. */ <N extends EObject, S extends EObject> T transform(TransformationState state, - TransformationContext context, SubClassToInstanceMap<S> baseModels, - SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, + TransformationContext context, ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels, EObject outputModel) throws TransformationModuleException; diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/.ratings index 71fb71cb..9139ba4a 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/.ratings @@ -1,4 +1,4 @@ -ElementTransformationModuleBase.java c533bd1998cfef5926e1e7be47611701f9e538bc RED -ElementTransformationStrategyBase.java 24c08064677ec7f793e6dda8ec329dbce7b8a443 RED -TransformationModuleBase.java 31eb1ab26b606a8416f69203a0bfb6fd54450c66 RED -TransformationStrategyBase.java 1b2ef090b47d89e2109d16dc16bfbf8e54123d72 YELLOW +ElementTransformationModuleBase.java 812658d8643df59a7ebd799c85085d762ed8cfde RED +ElementTransformationStrategyBase.java 468380f3421f4e0e39ddfa1f8ac6138b07baf1cc RED +TransformationModuleBase.java 62c310e26a9933b668f99c657aef250bffc5fe10 RED +TransformationStrategyBase.java 4d042b75cbdd0d2f79b0cec79e627c0e9630e512 RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/ElementTransformationModuleBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/ElementTransformationModuleBase.java index 2a0cebe8..bc5f586f 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/ElementTransformationModuleBase.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/ElementTransformationModuleBase.java @@ -24,10 +24,8 @@ import org.fortiss.af3.exploration.alg.dse.modeltransformation.ITransformationMo import org.fortiss.af3.exploration.alg.dse.modeltransformation.element.IElementTransformationModule; import org.fortiss.af3.exploration.alg.exception.TransformationModuleException; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; -import org.fortiss.af3.exploration.model.SuperSetMap; import org.fortiss.tooling.base.model.element.IModelElement; /** @@ -41,9 +39,7 @@ public abstract class ElementTransformationModuleBase<T extends EObject, O exten /** {@inheritDoc} */ @Override public <N extends EObject, S extends EObject> T transform(TransformationState state, - TransformationContext context, SubClassToInstanceMap<S> baseModels, - SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, + TransformationContext context, ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels, EObject outputModel) throws TransformationModuleException { if(outputModel == null) { @@ -55,8 +51,7 @@ public abstract class ElementTransformationModuleBase<T extends EObject, O exten @SuppressWarnings("unchecked") O tempCastedOutputModel = (O)outputModel; Collection<T> elements = getChildrenWithType(outputModel, getElementClass()); for(T currElement : elements) { - transformElement(currElement, baseModels, explorationEncodings, transformedModels, - tempCastedOutputModel); + transformElement(currElement, inputs, transformedModels, tempCastedOutputModel); } @SuppressWarnings("unchecked") T castedOutputModel = (T)outputModel; diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/ElementTransformationStrategyBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/ElementTransformationStrategyBase.java index b292bbf0..1dc8dc3a 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/ElementTransformationStrategyBase.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/ElementTransformationStrategyBase.java @@ -31,10 +31,8 @@ import org.fortiss.af3.exploration.alg.dse.modeltransformation.ITransformationSt import org.fortiss.af3.exploration.alg.dse.modeltransformation.element.IElementTransformationModule; import org.fortiss.af3.exploration.alg.exception.TransformationModuleException; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; -import org.fortiss.af3.exploration.model.SuperSetMap; import org.fortiss.af3.project.model.FileProject; import org.fortiss.tooling.kernel.extension.data.ITopLevelElement; @@ -51,9 +49,7 @@ public abstract class ElementTransformationStrategyBase<T extends EObject, O ext /** {@inheritDoc} */ @Override public <N extends EObject, S extends EObject> T transform(TransformationState state, - TransformationContext context, SubClassToInstanceMap<S> baseModels, - SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, + TransformationContext context, ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels, EObject outputModel) throws TransformationModuleException { // TODO: Consider using generics to define the allowed sub-module types. @@ -69,8 +65,8 @@ public abstract class ElementTransformationStrategyBase<T extends EObject, O ext for(IElementTransformationModule<? extends EObject, O> subModule : execOrder) { if(subModule.getActivationStage() == state || subModule instanceof ElementTransformationStrategyBase) { - if(subModule.isOptional() && !canExecuteModule(baseModels, transformedModels, - explorationEncodings, subModule)) { + if(subModule.isOptional() && + !canExecuteModule(inputs, transformedModels, subModule)) { break; } @@ -83,10 +79,9 @@ public abstract class ElementTransformationStrategyBase<T extends EObject, O ext @SuppressWarnings("unchecked") O tempCastedOutputModel = (O)transformedModels.get(subModule.getElementContainerType()); - subModule.loadElementAssociations(encEntryModelElemAssoc, origToGenAssocMap, - genToOrigAssocMap, genToGenAssocMap); - T transformedModel = transformElements(subModule, baseModels, explorationEncodings, - transformedModels, tempCastedOutputModel); + subModule.applyAssociationUpdates(this); + T transformedModel = transformElements(subModule, inputs, transformedModels, + tempCastedOutputModel); if(transformedModel == null) { throw new TransformationModuleException(subModule, "The submodule did not return the transformed model. It is required by the framework."); @@ -106,7 +101,7 @@ public abstract class ElementTransformationStrategyBase<T extends EObject, O ext executeSubModules( filterSet(getSubModules(), e -> !(e instanceof IElementTransformationModule<?, ?>)), - context, baseModels, superSets, explorationEncodings, transformedModels, state); + context, inputs, transformedModels, state); @SuppressWarnings("unchecked") Class<N> tempTransformedModelType = (Class<N>)transformedModel.getClass().getInterfaces()[0]; @@ -178,10 +173,8 @@ public abstract class ElementTransformationStrategyBase<T extends EObject, O ext * * @param subModule * {@link IElementTransformationModule} implementing the element-wise transformation. - * @param baseModels + * @param inputs * Original input models containing information for the transformation. - * @param explorationEncodings - * Original (DSE) encodings containing information for the transformation. * @param transformedModels * Optional map of transformed/generated models in the transformation process. * @param outputModel @@ -192,15 +185,12 @@ public abstract class ElementTransformationStrategyBase<T extends EObject, O ext */ protected <N extends EObject, S extends EObject> T transformElements( IElementTransformationModule<? extends EObject, O> subModule, - Map<Class<? extends S>, S> baseModels, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, - Map<Class<? extends N>, N> transformedModels, O outputModel) - throws TransformationModuleException { + ExplorationTransformationInputs inputs, Map<Class<? extends N>, N> transformedModels, + O outputModel) throws TransformationModuleException { Collection<? extends EObject> typedElements = getChildrenWithType(outputModel, subModule.getElementClass()); for(EObject element : typedElements) { - subModule.transformElement(element, baseModels, explorationEncodings, transformedModels, - outputModel); + subModule.transformElement(element, inputs, transformedModels, outputModel); } @SuppressWarnings("unchecked") T castedOutputModel = (T)outputModel; diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/TransformationModuleBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/TransformationModuleBase.java index bf7cb5f6..0142ab07 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/TransformationModuleBase.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/TransformationModuleBase.java @@ -118,18 +118,6 @@ public abstract class TransformationModuleBase<T extends EObject> return moduleInstance; } - /** {@inheritDoc} */ - @Override - public void loadElementAssociations(TypedBiMap<Object, EObject> encEntryToGenElemAssocs, - Multimap<EObject, EObject> origToGenElemAssocs, - Map<EObject, EObject> genToOrigElemAssocs, - Multimap<EObject, EObject> genToGenElemAssocs) { - this.encEntryModelElemAssoc = encEntryToGenElemAssocs; - this.genToOrigAssocMap = genToOrigElemAssocs; - this.origToGenAssocMap = origToGenElemAssocs; - this.genToGenAssocMap = genToGenElemAssocs; - } - /** {@inheritDoc} */ @Override public void applyAssociationUpdates(ITransformationModule<?> subModule) { diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/TransformationStrategyBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/TransformationStrategyBase.java index a4ac3536..5d9fe2c8 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/TransformationStrategyBase.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/base/TransformationStrategyBase.java @@ -34,13 +34,9 @@ import org.fortiss.af3.exploration.alg.dse.modeltransformation.ITransformationSt import org.fortiss.af3.exploration.alg.dse.modeltransformation.element.IElementTransformationModule; import org.fortiss.af3.exploration.alg.exception.TransformationModuleException; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; import org.fortiss.af3.exploration.alg.service.internal.ExplorationTransformationService; -import org.fortiss.af3.exploration.dsl_v2.model.expression.SuperSet; -import org.fortiss.af3.exploration.model.SuperSetMap; -import org.fortiss.af3.exploration.model.solutions.SingleExplorationSolution; import org.fortiss.af3.project.model.FileProject; import org.fortiss.tooling.kernel.extension.data.ITopLevelElement; import org.fortiss.tooling.kernel.introspection.IIntrospectionItem; @@ -98,9 +94,7 @@ public abstract class TransformationStrategyBase<T extends EObject> */ @Override public <N extends EObject, S extends EObject> T transform(TransformationState state, - TransformationContext context, SubClassToInstanceMap<S> baseModels, - SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, + TransformationContext context, ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels, EObject outputModel) throws TransformationModuleException { if(transformedModels == null) { @@ -108,8 +102,7 @@ public abstract class TransformationStrategyBase<T extends EObject> "The map which will contain all transformed models must be passed."); } - transformedModel = transformInternal(state, context, baseModels, superSets, - explorationEncodings, transformedModels); + transformedModel = transformInternal(state, context, inputs, transformedModels); if(launchedAsSubModule) { doSetModelName(); @@ -151,8 +144,7 @@ public abstract class TransformationStrategyBase<T extends EObject> * s. * <p/> * Parameters are detailed in - * {@link ExplorationTransformationService#getTransformedModel(TransformationContext, ITopLevelElement, SingleExplorationSolution, SubClassToInstanceMap, - * SuperSetMap , Class , String )} + * {@link ExplorationTransformationService#getTransformedModels(TransformationContext, ITopLevelElement, ExplorationTransformationInputs, Collection, String)} * . * * @throws TransformationModuleException @@ -161,9 +153,8 @@ public abstract class TransformationStrategyBase<T extends EObject> // TODO update doc "state" protected <N extends EObject, S extends EObject> T transformInternal( @SuppressWarnings("unused") TransformationState state, TransformationContext context, - SubClassToInstanceMap<S> baseModels, SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, - SubClassToInstanceMap<N> transformedModels) throws TransformationModuleException { + ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels) + throws TransformationModuleException { @SuppressWarnings("unchecked") T castedTransformedBaseModel = (T)transformedModels.get(getOutputType()); this.transformedModel = castedTransformedBaseModel; @@ -179,8 +170,7 @@ public abstract class TransformationStrategyBase<T extends EObject> genToGenAssocMap.clear(); } - executeSubModules(getSubModules(), context, baseModels, superSets, explorationEncodings, - transformedModels, currentState); + executeSubModules(getSubModules(), context, inputs, transformedModels, currentState); } // Suppressed warnings: Generics are used here to ensure compatibility between the type @@ -202,12 +192,8 @@ public abstract class TransformationStrategyBase<T extends EObject> * Collection of {@link ITransformationModule}s to (possibly) execute. * @param context * Whether or not to export the resulting models into the corresponding project. - * @param baseModels + * @param inputs * Input set of original models. - * @param superSets - * Map of {@link SuperSet}s generated by the DSE. - * @param explorationEncodings - * DSE internal encoding inputs for the transformation. * @param transformedModels * Set of models that result from the transformation (output). * @param currentState @@ -218,9 +204,7 @@ public abstract class TransformationStrategyBase<T extends EObject> */ protected <N extends EObject, S extends EObject> void executeSubModules( Collection<ITransformationModule<? extends EObject>> subModules, - TransformationContext context, SubClassToInstanceMap<S> baseModels, - SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, + TransformationContext context, ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels, TransformationState currentState) throws TransformationModuleException { @@ -234,8 +218,8 @@ public abstract class TransformationStrategyBase<T extends EObject> if(subModule.getActivationStage() == currentState || (currentState.ordinal() >= subModule.getActivationStage().ordinal() && subModule instanceof ElementTransformationStrategyBase)) { - if(subModule.isOptional() && !canExecuteModule(baseModels, transformedModels, - explorationEncodings, subModule)) { + if(subModule.isOptional() && + !canExecuteModule(inputs, transformedModels, subModule)) { continue; } @@ -244,11 +228,10 @@ public abstract class TransformationStrategyBase<T extends EObject> ((ITransformationStrategy<?>)subModule).setModelName(transformedModelName); ((ITransformationStrategy<?>)subModule).setLaunchedAsSubModule(true); } - subModule.loadElementAssociations(encEntryModelElemAssoc, origToGenAssocMap, - genToOrigAssocMap, genToGenAssocMap); + subModule.applyAssociationUpdates(this); @SuppressWarnings("unchecked") T transformedModel = - (T)subModule.transform(currentState, context, baseModels, superSets, - explorationEncodings, transformedModels, this.transformedModel); + (T)subModule.transform(currentState, context, inputs, transformedModels, + this.transformedModel); if(transformedModel == null) { throw new TransformationModuleException(subModule, "The submodule did not return the transformed model. It is required by the framework."); @@ -273,19 +256,13 @@ public abstract class TransformationStrategyBase<T extends EObject> * input set. */ protected <N extends EObject, S extends EObject> boolean canExecuteModule( - Map<Class<? extends S>, S> baseModels, Map<Class<? extends N>, N> transformedModels, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, + ExplorationTransformationInputs inputs, Map<Class<? extends N>, N> transformedModels, ITransformationModule<? extends EObject> subModule) { for(Class<?> reqInput : subModule.getRequiredTypes()) { - // This cast is required since the explorationEncodings only accept - // exploration types -> it is just used for presence checking of a - // corresponding type. During runtime, the type is erased anyway. - @SuppressWarnings("unchecked") Class<? extends IExplorationEncoding> explReqInput = - (Class<? extends IExplorationEncoding>)reqInput; - if(!(baseModels.keySet().stream().anyMatch(m -> m.isAssignableFrom(reqInput))) && + if(!(inputs.keySet().stream() + .anyMatch(m -> ((Class<?>)m).isAssignableFrom(reqInput))) && !(transformedModels.keySet().stream() - .anyMatch(m -> m.isAssignableFrom(reqInput))) && - !(explorationEncodings.containsEncoding(explReqInput))) { + .anyMatch(m -> m.isAssignableFrom(reqInput)))) { return false; } } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/.ratings index 06e0097b..b6753592 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/.ratings @@ -1,6 +1,6 @@ -ComponentArchitectureFinalizer.java ec0e29b2ed27aecccae28bab0253b8e068276a17 RED -ComponentArchitectureInitializer.java 52d1f756c194774a4ac5b96ac4f2014dc9b5a6b7 RED -ComponentArchitectureInserter.java 9ab94811d460d06fa1ce2f72e40911beb7982e94 RED -ComponentArchitectureInstantiator.java 41fddd490e8b45b39bb3725d1e2a93a63b737169 RED -ComponentArchitectureReplicator.java 59ee5ee2ad6331150b53293e1a549b788a52ee00 RED +ComponentArchitectureFinalizer.java dc9aaaa71d783537cd7ea9c0b2521932b3a5d95c RED +ComponentArchitectureInitializer.java b3bdadb89c08659b5892564a4d37d682bb3bb23f RED +ComponentArchitectureInserter.java 5ffe3b556a71e15b562a8a28694da830dc269b5e RED +ComponentArchitectureInstantiator.java 0acdb5c6039f53fa01446da5af6c5bb50a854e80 RED +ComponentArchitectureReplicator.java 72ca8f9428506f489be79b980a0c966a7b388d71 RED ComponentArchitectureTransformer.java f4a1ea1337dcb3aeaa99900034dd9ada9b9ee5a7 RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureFinalizer.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureFinalizer.java index 8c7f511c..8aa3c64b 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureFinalizer.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureFinalizer.java @@ -31,10 +31,8 @@ import org.fortiss.af3.exploration.alg.dse.modeltransformation.base.Transformati import org.fortiss.af3.exploration.alg.exception.InvalidTimingModelException; import org.fortiss.af3.exploration.alg.exception.TransformationModuleException; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; -import org.fortiss.af3.exploration.model.SuperSetMap; import org.fortiss.af3.exploration.moea.model.ImplementsComponentRef; import org.fortiss.af3.exploration.moea.model.MoeaFactory; import org.fortiss.tooling.base.model.element.IModelElementSpecification; @@ -96,9 +94,8 @@ public class ComponentArchitectureFinalizer @Override public <N extends EObject, S extends EObject> ComponentArchitecture transform( TransformationState state, TransformationContext context, - SubClassToInstanceMap<S> baseModels, SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, - SubClassToInstanceMap<N> transformedModels, EObject outputModel) + ExplorationTransformationInputs baseModels, SubClassToInstanceMap<N> transformedModels, + EObject outputModel) throws TransformationModuleException { // Install the back reference specification to the components in the "150%/125% model". try { diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureInitializer.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureInitializer.java index e2374411..5a005c23 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureInitializer.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureInitializer.java @@ -32,11 +32,9 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ITaskAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.IMappingEntry; import org.fortiss.af3.exploration.alg.exception.TransformationModuleException; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; import org.fortiss.af3.exploration.alg.util.ExplorationEcoreUtils; -import org.fortiss.af3.exploration.model.SuperSetMap; import org.fortiss.af3.project.model.FileProject; import com.google.common.collect.HashMultimap; @@ -99,19 +97,18 @@ public class ComponentArchitectureInitializer @Override public <N extends EObject, S extends EObject> ComponentArchitecture transform( TransformationState state, TransformationContext context, - SubClassToInstanceMap<S> baseModels, SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, - SubClassToInstanceMap<N> transformedModels, EObject outputModel) - throws TransformationModuleException { - ComponentArchitecture origCA = - (ComponentArchitecture)baseModels.get(ComponentArchitecture.class); + ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels, + EObject outputModel) throws TransformationModuleException { + // FIXME: Non-functional, since complete architectures are not referenced by the input set + // any more. + ComponentArchitecture origCA = null;// inputs.getEncoding(ComponentArchitecture.class); if(origCA == null) { throw new TransformationModuleException(this, "Could not retrieve the original Component Architecture from the set of base models."); } - AbstractTaskMappingEncoding mapping = - explorationEncodings.getEncoding(AbstractTaskMappingEncoding.class); + AbstractTaskMappingEncoding mapping = null; + // inputs.getEncoding(AbstractTaskMappingEncoding.class); if(mapping == null) { throw new TransformationModuleException(this, "An IMappingEncoding is required for this module to operate properly."); diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureInserter.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureInserter.java index 7f6a18f2..3ecef8e8 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureInserter.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureInserter.java @@ -44,10 +44,8 @@ import org.fortiss.af3.exploration.alg.dse.modeltransformation.ITransformationMo import org.fortiss.af3.exploration.alg.dse.modeltransformation.base.TransformationModuleBase; import org.fortiss.af3.exploration.alg.exception.TransformationModuleException; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; -import org.fortiss.af3.exploration.model.SuperSetMap; import org.fortiss.af3.platform.model.IPlatformResource; import org.fortiss.tooling.base.model.layout.Point; @@ -106,9 +104,8 @@ public class ComponentArchitectureInserter extends TransformationModuleBase<Comp @Override public <N extends EObject, S extends EObject> ComponentArchitecture transform( TransformationState state, TransformationContext context, - SubClassToInstanceMap<S> baseModels, SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, - SubClassToInstanceMap<N> transformedModels, EObject outputModel) + ExplorationTransformationInputs baseModels, SubClassToInstanceMap<N> transformedModels, + EObject outputModel) throws TransformationModuleException { ComponentArchitecture genCA = (ComponentArchitecture)outputModel; if(genCA == null) { diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureInstantiator.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureInstantiator.java index 7f30c41e..15a4c9ca 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureInstantiator.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureInstantiator.java @@ -44,10 +44,8 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ITaskAdapter; import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.IMappingEntry; import org.fortiss.af3.exploration.alg.exception.TransformationModuleException; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; -import org.fortiss.af3.exploration.model.SuperSetMap; import org.fortiss.af3.platform.model.ExecutionUnit; import org.fortiss.tooling.base.model.element.IConnector; import org.fortiss.tooling.kernel.utils.EcoreUtils; @@ -108,12 +106,10 @@ public class ComponentArchitectureInstantiator @Override public <N extends EObject, S extends EObject> ComponentArchitecture transform( TransformationState state, TransformationContext context, - SubClassToInstanceMap<S> baseModels, SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, - SubClassToInstanceMap<N> transformedModels, EObject outputModel) - throws TransformationModuleException { + ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels, + EObject outputModel) throws TransformationModuleException { - mapping = explorationEncodings.getEncoding(InstantiatedTaskMappingEncoding.class); + mapping = null;// inputs.getEncoding(InstantiatedTaskMappingEncoding.class); if(mapping == null) { throw new TransformationModuleException(this, "An IMappingEncoding is required for this module to operate properly."); diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureReplicator.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureReplicator.java index af050af0..704781b1 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureReplicator.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/comparch/ComponentArchitectureReplicator.java @@ -64,10 +64,8 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.IMappingEntry; import org.fortiss.af3.exploration.alg.exception.InvalidTimingModelException; import org.fortiss.af3.exploration.alg.exception.TransformationModuleException; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; -import org.fortiss.af3.exploration.model.SuperSetMap; import org.fortiss.af3.platform.model.ExecutionUnit; import org.fortiss.af3.platform.model.IPlatformResource; import org.fortiss.tooling.kernel.model.INamedElement; @@ -143,23 +141,22 @@ public class ComponentArchitectureReplicator @Override public <N extends EObject, S extends EObject> ComponentArchitecture transform( TransformationState state, TransformationContext context, - SubClassToInstanceMap<S> baseModels, SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, - SubClassToInstanceMap<N> transformedModels, EObject outputModel) - throws TransformationModuleException { + ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels, + EObject outputModel) throws TransformationModuleException { ComponentArchitecture genCA = (ComponentArchitecture)outputModel; if(genCA == null) { throw new TransformationModuleException(this, "Could not retrieve the generated Component Architecture."); } - originalCA = (ComponentArchitecture)baseModels.get(ComponentArchitecture.class); + // FIXME: Currently broken functionality, as the input set does not contain full + // architecture models. + originalCA = null;// inputs.getEncoding(ComponentArchitecture.class); if(originalCA == null) { throw new TransformationModuleException(this, "Could not retrieve the original Component Architecture from the set of base models."); } - AbstractTaskMappingEncoding mapping = - explorationEncodings.getEncoding(AbstractTaskMappingEncoding.class); + AbstractTaskMappingEncoding mapping = null;// inputs.getEncoding(AbstractTaskMappingEncoding.class); if(mapping == null) { throw new TransformationModuleException(this, "An IMappingEncoding is required for this module to operate properly."); diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/.ratings index 593fb265..e55b25f7 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/.ratings @@ -1,4 +1,4 @@ -DeploymentFinalizer.java af4b595914e455ac80b12561ec2d3c5147ede8c8 RED -DeploymentInitializer.java 9d5023ee12fc92185bb418c735f1d6c5196dcab8 RED -DeploymentReplicator.java 7c65dd646ca37477be592bb620536f15c48fa1f8 RED -ExplorationSolutionToDeployment.java 6fb7c9bcdaf4371a2251193fad66aa61c7e511d2 RED +DeploymentFinalizer.java ce2c53558f008636c3c9f3bddd8432518c0545f1 RED +DeploymentInitializer.java e190b0fe5af29c887ed59e011d68cdda5f59cf1d RED +DeploymentReplicator.java 6877c3626ef0ee56db14b0af8688e7ec107290bb RED +ExplorationSolutionToDeployment.java 157b59dd1ae63fb4b51738a013945e055bbfaa4f RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/DeploymentFinalizer.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/DeploymentFinalizer.java index 6631dae7..23dceff0 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/DeploymentFinalizer.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/DeploymentFinalizer.java @@ -48,10 +48,8 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.IMappingEncoding; import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.IMappingEntry; import org.fortiss.af3.exploration.alg.exception.TransformationModuleException; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; -import org.fortiss.af3.exploration.model.SuperSetMap; import org.fortiss.af3.platform.model.ExecutionUnit; import org.fortiss.af3.platform.model.PlatformArchitecture; import org.fortiss.af3.project.model.FileProject; @@ -110,13 +108,11 @@ public class DeploymentFinalizer extends TransformationModuleBase<Deployment> { /** {@inheritDoc} */ @Override public <N extends EObject, S extends EObject> Deployment transform(TransformationState state, - TransformationContext context, SubClassToInstanceMap<S> baseModels, - SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, + TransformationContext context, ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels, EObject outputModel) throws TransformationModuleException { @SuppressWarnings("unchecked") IMappingEncoding<ITaskAdapter<?>, IExecutionUnitAdapter<?>, IMappingEntry<ITaskAdapter<?>, IExecutionUnitAdapter<?>>> mapping = - explorationEncodings.getEncoding(IMappingEncoding.class); + null;// inputs.getEncoding(IMappingEncoding.class); if(mapping == null) { throw new TransformationModuleException(this, "An IMappingEncoding is required for this module to operate properly."); @@ -125,22 +121,26 @@ public class DeploymentFinalizer extends TransformationModuleBase<Deployment> { ComponentArchitecture transformedCA = (ComponentArchitecture)transformedModels.get(ComponentArchitecture.class); if(transformedCA == null) { - transformedCA = (ComponentArchitecture)baseModels.get(ComponentArchitecture.class); + // FIXME: Currently broken functionality, as the input set does not contain full + // architecture models. + transformedCA = null;// inputs.getEncoding(ComponentArchitecture.class); if(transformedCA == null) { throw new TransformationModuleException(this, "Neither a transformed, nor an input component architecture has been found that shall be referenced by the transformed deployment."); } } - ComponentArchitecture originalCA = - (ComponentArchitecture)baseModels.get(ComponentArchitecture.class); + // FIXME: Currently broken functionality, as the input set does not contain full + // architecture models. + ComponentArchitecture originalCA = null;// inputs.getEncoding(ComponentArchitecture.class); if(originalCA == null) { throw new TransformationModuleException(this, "Could not retrieve the original component architecture from the set of base models. Be sure to add it to the required input types."); } - PlatformArchitecture originalPA = - (PlatformArchitecture)baseModels.get(PlatformArchitecture.class); + // FIXME: Currently broken functionality, as the input set does not contain full + // architecture models. + PlatformArchitecture originalPA = null;// inputs.getEncoding(PlatformArchitecture.class); if(originalPA == null) { throw new TransformationModuleException(this, "Could not retrieve the original platform architecture from the set of base models. Be sure to add it to the required input types."); diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/DeploymentInitializer.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/DeploymentInitializer.java index 79cbba58..b776e12b 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/DeploymentInitializer.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/DeploymentInitializer.java @@ -32,10 +32,8 @@ import org.fortiss.af3.exploration.alg.dse.modeltransformation.ITransformationMo import org.fortiss.af3.exploration.alg.dse.modeltransformation.base.TransformationModuleBase; import org.fortiss.af3.exploration.alg.exception.TransformationModuleException; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; -import org.fortiss.af3.exploration.model.SuperSetMap; import org.fortiss.af3.platform.model.PlatformArchitecture; /** @@ -90,20 +88,20 @@ public class DeploymentInitializer extends TransformationModuleBase<Deployment> /** {@inheritDoc} */ @Override public <N extends EObject, S extends EObject> Deployment transform(TransformationState state, - TransformationContext context, SubClassToInstanceMap<S> baseModels, - SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, + TransformationContext context, ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels, EObject outputModel) throws TransformationModuleException { - ComponentArchitecture originalCA = - (ComponentArchitecture)baseModels.get(ComponentArchitecture.class); + // FIXME: Currently broken functionality, as the input set does not contain full + // architecture models. + ComponentArchitecture originalCA = null;// inputs.getEncoding(ComponentArchitecture.class); if(originalCA == null) { throw new TransformationModuleException(this, "Could not retrieve the original component architecture from the set of base models. Be sure to add it to the required input types."); } - PlatformArchitecture originalPA = - (PlatformArchitecture)baseModels.get(PlatformArchitecture.class); + // FIXME: Currently broken functionality, as the input set does not contain full + // architecture models. + PlatformArchitecture originalPA = null;// inputs.getEncoding(PlatformArchitecture.class); if(originalPA == null) { throw new TransformationModuleException(this, "Could not retrieve the original platform architecture from the set of base models. Be sure to add it to the required input types."); diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/DeploymentReplicator.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/DeploymentReplicator.java index 11babfd6..d717aabf 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/DeploymentReplicator.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/DeploymentReplicator.java @@ -28,10 +28,8 @@ import org.fortiss.af3.exploration.alg.dse.modeltransformation.base.Transformati import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.IMappingEntry; import org.fortiss.af3.exploration.alg.exception.TransformationModuleException; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; -import org.fortiss.af3.exploration.model.SuperSetMap; import org.fortiss.af3.platform.model.PlatformArchitecture; /** @@ -87,20 +85,20 @@ public class DeploymentReplicator extends TransformationModuleBase<Deployment> { /** {@inheritDoc} */ @Override public <N extends EObject, S extends EObject> Deployment transform(TransformationState state, - TransformationContext context, SubClassToInstanceMap<S> baseModels, - SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, + TransformationContext context, ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels, EObject outputModel) throws TransformationModuleException { - ComponentArchitecture originalCA = - (ComponentArchitecture)baseModels.get(ComponentArchitecture.class); + // FIXME: Currently broken functionality, as the input set does not contain full + // architecture models. + ComponentArchitecture originalCA = null;// inputs.getEncoding(ComponentArchitecture.class); if(originalCA == null) { throw new TransformationModuleException(this, "Could not retrieve the original component architecture from the set of base models. Be sure to add it to the required input types."); } - PlatformArchitecture originalPA = - (PlatformArchitecture)baseModels.get(PlatformArchitecture.class); + // FIXME: Currently broken functionality, as the input set does not contain full + // architecture models. + PlatformArchitecture originalPA = null;// inputs.getEncoding(PlatformArchitecture.class); if(originalPA == null) { throw new TransformationModuleException(this, "Could not retrieve the original platform architecture from the set of base models. Be sure to add it to the required input types."); diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/ExplorationSolutionToDeployment.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/ExplorationSolutionToDeployment.java index 8305f86d..21d84f19 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/ExplorationSolutionToDeployment.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/deployment/ExplorationSolutionToDeployment.java @@ -20,7 +20,6 @@ import static org.fortiss.af3.platform.utils.PlatformArchitectureUtils.getPhysic import java.util.Collection; import java.util.Collections; import java.util.HashSet; -import java.util.Map; import org.eclipse.emf.ecore.EObject; import org.fortiss.af3.component.model.Component; @@ -35,10 +34,8 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.IMappingEncoding; import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.IMappingEntry; import org.fortiss.af3.exploration.alg.exception.TransformationModuleException; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; -import org.fortiss.af3.exploration.model.SuperSetMap; import org.fortiss.af3.platform.model.PlatformArchitecture; /** @@ -63,16 +60,19 @@ public class ExplorationSolutionToDeployment extends TransformationStrategyBase< * Helper method to set the architecture model references that were provided as an input to the * DSE. */ - private <S extends EObject> void setArchModels(Map<Class<? extends S>, S> baseModels) + private <S extends EObject> void setArchModels(ExplorationTransformationInputs inputs) throws TransformationModuleException { - af3ComponentArchitecture = - (ComponentArchitecture)baseModels.get(ComponentArchitecture.class); + // FIXME: Currently broken functionality, as the input set does not contain full + // architecture models. + af3ComponentArchitecture = null;// inputs.getEncoding(ComponentArchitecture.class); if(af3ComponentArchitecture == null) { throw new TransformationModuleException(this, "An ComponentArchitecture is required for this module to operate properly."); } - af3PlatformArchitecture = (PlatformArchitecture)baseModels.get(PlatformArchitecture.class); + // FIXME: Currently broken functionality, as the input set does not contain full + // architecture models. + af3PlatformArchitecture = null;// inputs.getEncoding(PlatformArchitecture.class); if(af3PlatformArchitecture == null) { throw new TransformationModuleException(this, "An PlatformArchitecture is required for this module to operate properly."); @@ -88,14 +88,12 @@ public class ExplorationSolutionToDeployment extends TransformationStrategyBase< */ @Override public <N extends EObject, S extends EObject> Deployment transform(TransformationState state, - TransformationContext context, SubClassToInstanceMap<S> baseModels, - SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, + TransformationContext context, ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels, EObject outputModel) throws TransformationModuleException { if(state == TransformationState.INITIALIZING) { @SuppressWarnings("unchecked") IMappingEncoding<ITaskAdapter<?>, ?, IMappingEntry<ITaskAdapter<?>, ?>> mapping = - explorationEncodings.getEncoding(IMappingEncoding.class); + null;// inputs.getEncoding(IMappingEncoding.class); if(mapping == null) { throw new TransformationModuleException(this, "An IMappingEncoding is required for this module to operate properly."); @@ -106,11 +104,10 @@ public class ExplorationSolutionToDeployment extends TransformationStrategyBase< addBlacklistedModule(ComponentArchitectureTransformer.class); } - setArchModels(baseModels); + setArchModels(inputs); } - return super.transform(state, context, baseModels, superSets, explorationEncodings, - transformedModels, outputModel); + return super.transform(state, context, inputs, transformedModels, outputModel); } /** diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/.ratings new file mode 100644 index 00000000..12b66ab7 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/.ratings @@ -0,0 +1,6 @@ +ComponentExecutionUnitTransformation.java b4a88521187c8b114fa50bf239a17213add9f746 YELLOW +PartitionToExecutionUnitTransformation.java 0d93bf39fed3af7f1b0b018bb14893c67ad038ae YELLOW +PartitionTransformation.java e4f6120eaa59bf853c08918de821382b9390b18b YELLOW +SuperSetTransformationBase.java 166ece983c1e010f18ed69dc072bd66e9cc94d08 YELLOW +SuperSetTransformationStrategy.java 305d149e8e7044ea307738f1da2b483af689a726 YELLOW +TaskToPartitionTransformation.java 12a5e5cc4031e590819970d781b88966dcac31b6 YELLOW diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/ComponentExecutionUnitTransformation.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/ComponentExecutionUnitTransformation.java new file mode 100644 index 00000000..7eaeba02 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/ComponentExecutionUnitTransformation.java @@ -0,0 +1,89 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 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.dse.modeltransformation.dseinternal; + +import static org.fortiss.af3.allocation.utils.AllocationModelElementFactory.createAllocationEntry; +import static org.fortiss.af3.exploration.util.DSMLModelElementFactory.createSuperSet; +import static org.fortiss.tooling.common.util.LambdaUtils.getFirst; + +import java.util.Collection; +import java.util.HashSet; + +import org.eclipse.emf.ecore.EObject; +import org.fortiss.af3.component.model.Component; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEntry; +import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ITaskAdapter; +import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; +import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; +import org.fortiss.af3.exploration.dsl_v2.model.expression.SuperSet; +import org.fortiss.af3.platform.model.allocation.ComponentToExecutionUnitAllocationEntry; +import org.fortiss.tooling.base.model.element.IModelElement; + +/** + * Transforms a {@link TaskMappingEncoding} and a {@link PartitionMappingEncoding} to a + * {@link SuperSet} of AF3 {@link ComponentToExecutionUnitAllocationEntry}s. + * + * @author diewald + */ +public class ComponentExecutionUnitTransformation + extends SuperSetTransformationBase<ComponentToExecutionUnitAllocationEntry> { + /** {@inheritDoc} */ + @Override + public <N extends EObject, S extends EObject> SuperSet<ComponentToExecutionUnitAllocationEntry> + transform(TransformationState state, TransformationContext context, + ExplorationTransformationInputs inputs, + SubClassToInstanceMap<N> transformedModels, EObject outputModel) { + @SuppressWarnings("unchecked") InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry> tm = + inputs.getEncoding(InstantiatedTaskMappingEncoding.class); + PartitionMappingEncoding pmEncoding = inputs.getEncoding(PartitionMappingEncoding.class); + + SuperSet<ComponentToExecutionUnitAllocationEntry> compExecUnitAllocs = createSuperSet( + "Optimized_Allocations", ComponentToExecutionUnitAllocationEntry.class); + for(Partition resource : tm.getResources()) { + for(ITaskAdapter<?> task : tm.getRequesters(resource)) { + Component af3Component = task.getAssignedComponent(); + ComponentToExecutionUnitAllocationEntry allocEntry = + createAllocationEntry(ComponentToExecutionUnitAllocationEntry.class); + allocEntry.getSourceElements().add(af3Component); + allocEntry.setTargetElement( + (IModelElement)getFirst(pmEncoding.getAllocatedResourcesFor(resource)).get() + .getObject()); + compExecUnitAllocs.getEntries().add(allocEntry); + } + } + return compExecUnitAllocs; + } + + /** {@inheritDoc} */ + @Override + public Collection<Class<?>> getRequiredTypes() { + Collection<Class<?>> inputTypes = new HashSet<>(); + inputTypes.add(InstantiatedTaskMappingEncoding.class); + inputTypes.add(PartitionMappingEncoding.class); + return inputTypes; + } + + /** {@inheritDoc} */ + @Override + public Class<ComponentToExecutionUnitAllocationEntry> getOutputType() { + return ComponentToExecutionUnitAllocationEntry.class; + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/PartitionToExecutionUnitTransformation.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/PartitionToExecutionUnitTransformation.java new file mode 100644 index 00000000..c94d7e45 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/PartitionToExecutionUnitTransformation.java @@ -0,0 +1,80 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 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.dse.modeltransformation.dseinternal; + +import static org.fortiss.af3.allocation.utils.AllocationModelElementFactory.createAllocationEntry; +import static org.fortiss.af3.exploration.util.DSMLModelElementFactory.createSuperSet; + +import java.util.Collection; +import java.util.HashSet; + +import org.eclipse.emf.ecore.EObject; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEntry; +import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; +import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; +import org.fortiss.af3.exploration.dsl_v2.model.expression.SuperSet; +import org.fortiss.af3.partition.model.Partition; +import org.fortiss.af3.partition.model.allocation.PartitionToExecutionUnitAllocationEntry; +import org.fortiss.af3.platform.model.ExecutionUnit; + +/** + * Transforms a {@link PartitionMappingEncoding} to a {@link SuperSet} of AF3 + * {@link PartitionToExecutionUnitAllocationEntry}s. + * + * @author diewald + */ +public class PartitionToExecutionUnitTransformation + extends SuperSetTransformationBase<PartitionToExecutionUnitAllocationEntry> { + /** {@inheritDoc} */ + @Override + public <N extends EObject, S extends EObject> SuperSet<PartitionToExecutionUnitAllocationEntry> + transform(TransformationState state, TransformationContext context, + ExplorationTransformationInputs inputs, + SubClassToInstanceMap<N> transformedModels, EObject outputModel) { + PartitionMappingEncoding pmEncoding = inputs.getEncoding(PartitionMappingEncoding.class); + + SuperSet<PartitionToExecutionUnitAllocationEntry> allocations = + createSuperSet("PartToExU", PartitionToExecutionUnitAllocationEntry.class); + for(PartitionMappingEntry entry : pmEncoding.getMappingEntries()) { + org.fortiss.af3.partition.model.Partition af3Partition = + (Partition)encEntryModelElemAssoc.get(entry.getSource(), + org.fortiss.af3.partition.model.Partition.class); + assert (af3Partition != null) : "Error in the mapping of internal Partitions --> AF3 Partitions."; + PartitionToExecutionUnitAllocationEntry af3AllocEntry = + createAllocationEntry(PartitionToExecutionUnitAllocationEntry.class); + af3AllocEntry.setSourceElement(af3Partition); + af3AllocEntry.getTargetElements().add((ExecutionUnit)entry.getTarget().getObject()); + allocations.getEntries().add(af3AllocEntry); + } + return allocations; + } + + /** {@inheritDoc} */ + @Override + public Collection<Class<?>> getRequiredTypes() { + Collection<Class<?>> inputTypes = new HashSet<>(); + inputTypes.add(PartitionMappingEncoding.class); + return inputTypes; + } + + /** {@inheritDoc} */ + @Override + public Class<PartitionToExecutionUnitAllocationEntry> getOutputType() { + return PartitionToExecutionUnitAllocationEntry.class; + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/PartitionTransformation.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/PartitionTransformation.java new file mode 100644 index 00000000..840b975e --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/PartitionTransformation.java @@ -0,0 +1,73 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 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.dse.modeltransformation.dseinternal; + +import static org.fortiss.af3.exploration.util.DSMLModelElementFactory.createSuperSet; +import static org.fortiss.af3.partition.util.PartitionModelElementFactory.createPartition; + +import java.util.Collection; +import java.util.HashSet; + +import org.eclipse.emf.ecore.EObject; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding; +import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; +import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; +import org.fortiss.af3.exploration.dsl_v2.model.expression.SuperSet; + +/** + * Transforms a {@link PartitionMappingEncoding} to a {@link SuperSet} of AF3 Partitions. + * + * @author diewald + */ +public class PartitionTransformation + extends SuperSetTransformationBase<org.fortiss.af3.partition.model.Partition> { + /** {@inheritDoc} */ + @Override + public <N extends EObject, S extends EObject> + SuperSet<org.fortiss.af3.partition.model.Partition> transform(TransformationState state, + TransformationContext context, ExplorationTransformationInputs inputs, + SubClassToInstanceMap<N> transformedModels, EObject outputModel) { + PartitionMappingEncoding pmEncoding = inputs.getEncoding(PartitionMappingEncoding.class); + + SuperSet<org.fortiss.af3.partition.model.Partition> partitions = + createSuperSet("Partitions", org.fortiss.af3.partition.model.Partition.class); + int i = 0; + for(Partition internalPartition : pmEncoding.getRequesters()) { + org.fortiss.af3.partition.model.Partition af3Partition = + createPartition("Partition_" + i++); + encEntryModelElemAssoc.put(internalPartition, + org.fortiss.af3.partition.model.Partition.class, af3Partition, Partition.class); + partitions.getEntries().add(af3Partition); + } + return partitions; + } + + /** {@inheritDoc} */ + @Override + public Collection<Class<?>> getRequiredTypes() { + Collection<Class<?>> inputTypes = new HashSet<>(); + inputTypes.add(PartitionMappingEncoding.class); + return inputTypes; + } + + /** {@inheritDoc} */ + @Override + public Class<org.fortiss.af3.partition.model.Partition> getOutputType() { + return org.fortiss.af3.partition.model.Partition.class; + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/SuperSetTransformationBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/SuperSetTransformationBase.java new file mode 100644 index 00000000..f7454498 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/SuperSetTransformationBase.java @@ -0,0 +1,68 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 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.dse.modeltransformation.dseinternal; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; + +import org.fortiss.af3.exploration.alg.dse.modeltransformation.ITransformationModule; +import org.fortiss.af3.exploration.alg.dse.modeltransformation.base.TransformationModuleBase; +import org.fortiss.af3.exploration.dsl_v2.model.expression.SuperSet; +import org.fortiss.tooling.base.model.element.IModelElement; + +/** + * Base class for transforming inner solution representations of the DSE to {@link SuperSet}s. + * + * @author diewald + */ +public abstract class SuperSetTransformationBase<T extends IModelElement> + extends TransformationModuleBase<SuperSet<T>> { + /** {@inheritDoc} */ + @Override + public boolean isOptional() { + return false; + } + + /** + * {@inheritDoc} + * + * NOTE: Currently, we neglect states in exporting DSE results: Transformations to SuperSets are + * typically simple, so stages are typically adding unneeded complexity. + */ + @Override + public TransformationState getActivationStage() { + return TransformationState.INITIALIZING; + } + + /** + * {@inheritDoc} + * + * NOTE: Currently, we neglect hierarchies in exporting DSE results. + */ + @Override + public Collection<Class<? extends ITransformationModule<?>>> getParentModules() { + Collection<Class<? extends ITransformationModule<?>>> parentModules = new ArrayList<>(); + parentModules.add(SuperSetTransformationStrategy.class); + return parentModules; + } + + /** {@inheritDoc} */ + @Override + public Collection<Class<?>> getOptionalTypes() { + return Collections.emptySet(); + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/SuperSetTransformationStrategy.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/SuperSetTransformationStrategy.java new file mode 100644 index 00000000..0f658d7b --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/SuperSetTransformationStrategy.java @@ -0,0 +1,121 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 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.dse.modeltransformation.dseinternal; + +import static org.fortiss.af3.exploration.util.DesignSpaceExplorationModelElementFactory.createSuperSetMap; +import static org.fortiss.tooling.common.util.LambdaUtils.getFirst; + +import java.util.Collection; +import java.util.Collections; + +import org.eclipse.emf.ecore.EObject; +import org.fortiss.af3.exploration.alg.dse.modeltransformation.ITransformationModule; +import org.fortiss.af3.exploration.alg.dse.modeltransformation.base.TransformationStrategyBase; +import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; +import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; +import org.fortiss.af3.exploration.dsl_v2.model.expression.SuperSet; +import org.fortiss.af3.exploration.model.SuperSetMap; + +/** + * Transforms the DSE-internal solution representations into {@link SuperSet}s and stores them in a + * {@link SuperSetMap}. + * The current implementation is fairly static and shall be replaced by a version built on a + * dependency system. + * + * @author diewald + */ +public class SuperSetTransformationStrategy extends TransformationStrategyBase<SuperSetMap> { + /** + * Holds the generated {@link SuperSetMap} and keeps it over the different + * {@link org.fortiss.af3.exploration.alg.dse.modeltransformation.ITransformationModule.TransformationState}s + */ + SuperSetMap superSets; + + /** {@inheritDoc} */ + @Override + public <N extends EObject, S extends EObject> SuperSetMap transform(TransformationState state, + TransformationContext context, ExplorationTransformationInputs inputs, + SubClassToInstanceMap<N> transformedModels, EObject outputModel) { + if(state == TransformationState.INITIALIZING) { + superSets = createSuperSetMap(); + + ComponentExecutionUnitTransformation cToExUModule = + (ComponentExecutionUnitTransformation)getFirst(subModules, + m -> m instanceof ComponentExecutionUnitTransformation).get(); + superSets.put(cToExUModule.getOutputType(), + cToExUModule.transform(state, context, inputs, transformedModels, outputModel)); + + PartitionTransformation partModule = (PartitionTransformation)getFirst(subModules, + m -> m instanceof PartitionTransformation).get(); + superSets.put(partModule.getOutputType(), + partModule.transform(state, context, inputs, transformedModels, outputModel)); + applyAssociationUpdates(partModule); + + // Allocations depending on the partition architecture. + TaskToPartitionTransformation tToPModule = + (TaskToPartitionTransformation)getFirst(subModules, + m -> m instanceof TaskToPartitionTransformation).get(); + tToPModule.applyAssociationUpdates(this); + superSets.put(tToPModule.getOutputType(), + tToPModule.transform(state, context, inputs, transformedModels, outputModel)); + + PartitionToExecutionUnitTransformation pToExUModule = + (PartitionToExecutionUnitTransformation)getFirst(subModules, + m -> m instanceof PartitionToExecutionUnitTransformation).get(); + pToExUModule.applyAssociationUpdates(this); + superSets.put(pToExUModule.getOutputType(), + pToExUModule.transform(state, context, inputs, transformedModels, outputModel)); + } + return superSets; + } + + /** {@inheritDoc} */ + @Override + public boolean isOptional() { + return false; + } + + /** {@inheritDoc} */ + @Override + public TransformationState getActivationStage() { + return TransformationState.INITIALIZING; + } + + /** {@inheritDoc} */ + @Override + public Collection<Class<? extends ITransformationModule<?>>> getParentModules() { + return Collections.emptySet(); + } + + /** {@inheritDoc} */ + @Override + public Collection<Class<?>> getRequiredTypes() { + return Collections.emptySet(); + } + + /** {@inheritDoc} */ + @Override + public Collection<Class<?>> getOptionalTypes() { + return Collections.emptySet(); + } + + /** {@inheritDoc} */ + @Override + public Class<SuperSetMap> getOutputType() { + return SuperSetMap.class; + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/TaskToPartitionTransformation.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/TaskToPartitionTransformation.java new file mode 100644 index 00000000..5c91f8b4 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/dseinternal/TaskToPartitionTransformation.java @@ -0,0 +1,82 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 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.dse.modeltransformation.dseinternal; + +import static org.fortiss.af3.allocation.utils.AllocationModelElementFactory.createAllocationEntry; +import static org.fortiss.af3.exploration.util.DSMLModelElementFactory.createSuperSet; + +import java.util.Collection; +import java.util.HashSet; + +import org.eclipse.emf.ecore.EObject; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding; +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEntry; +import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; +import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; +import org.fortiss.af3.exploration.dsl_v2.model.expression.SuperSet; +import org.fortiss.af3.partition.model.Partition; +import org.fortiss.af3.partition.model.allocation.TaskToPartitionAllocationEntry; +import org.fortiss.af3.task.model.Task; + +/** + * Transforms a {@link TaskMappingEncoding} to a {@link SuperSet} of AF3 + * {@link TaskToPartitionAllocationEntry}s. + * + * @author diewald + */ +public class TaskToPartitionTransformation + extends SuperSetTransformationBase<TaskToPartitionAllocationEntry> { + + /** {@inheritDoc} */ + @Override + public <N extends EObject, S extends EObject> SuperSet<TaskToPartitionAllocationEntry> + transform(TransformationState state, TransformationContext context, + ExplorationTransformationInputs inputs, + SubClassToInstanceMap<N> transformedModels, EObject outputModel) { + @SuppressWarnings("unchecked") InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry> taskMapping = + inputs.getEncoding(InstantiatedTaskMappingEncoding.class); + SuperSet<TaskToPartitionAllocationEntry> allocations = + createSuperSet("TaskToPart", TaskToPartitionAllocationEntry.class); + for(InstantiatedTaskMappingEntry entry : taskMapping.getMappingEntries()) { + org.fortiss.af3.partition.model.Partition af3Partition = + (Partition)encEntryModelElemAssoc.get(entry.getTarget(), + org.fortiss.af3.partition.model.Partition.class); + assert (af3Partition != null) : "Error in the mapping of internal Partitions --> AF3 Partitions."; + TaskToPartitionAllocationEntry af3AllocEntry = + createAllocationEntry(TaskToPartitionAllocationEntry.class); + af3AllocEntry.getSourceElements().add((Task)entry.getSource().getObject()); + af3AllocEntry.setTargetElement(af3Partition); + allocations.getEntries().add(af3AllocEntry); + } + return allocations; + } + + /** {@inheritDoc} */ + @Override + public Collection<Class<?>> getRequiredTypes() { + Collection<Class<?>> inputTypes = new HashSet<>(); + inputTypes.add(InstantiatedTaskMappingEncoding.class); + return inputTypes; + } + + /** {@inheritDoc} */ + @Override + public Class<TaskToPartitionAllocationEntry> getOutputType() { + return TaskToPartitionAllocationEntry.class; + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/element/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/element/.ratings index 7e3a7b14..b949ac98 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/element/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/element/.ratings @@ -1,2 +1,2 @@ -IElementTransformationModule.java 925a20d09b2f0b457786986fdee808505a307e02 RED +IElementTransformationModule.java 74944b50aa164aaa00a760c43674e5c7c5b168f7 RED M2MCopier.java 06c90ca296218bf0d5a39215e4200eeb41abd22e RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/element/IElementTransformationModule.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/element/IElementTransformationModule.java index 2ae4c7f5..214929f1 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/element/IElementTransformationModule.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/element/IElementTransformationModule.java @@ -21,8 +21,7 @@ import org.eclipse.emf.ecore.EObject; import org.fortiss.af3.exploration.alg.dse.modeltransformation.ITransformationModule; import org.fortiss.af3.exploration.alg.exception.TransformationModuleException; import org.fortiss.af3.exploration.alg.graph.IDependencyModule; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; /** * Interface for operations that are common to all Element Generation/Transformation Modules. @@ -47,10 +46,8 @@ public interface IElementTransformationModule<T extends EObject, O extends EObje * * @param inputElement * Model element to be transformed. - * @param baseModels + * @param inputs * Set of (original) base models. - * @param explorationEncodings - * Encodings calculated by the DSE. * @param transformedModels * Set of transformed/already manipulated models. * @param outputModel @@ -64,8 +61,6 @@ public interface IElementTransformationModule<T extends EObject, O extends EObje // for now to avoid a compile error in ElementTransformtationStrategy for now but this // workaround is not type safe. <N extends EObject, S extends EObject> O transformElement(EObject inputElement, - Map<Class<? extends S>, S> baseModels, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, - Map<Class<? extends N>, N> transformedModels, O outputModel) - throws TransformationModuleException; + ExplorationTransformationInputs inputs, Map<Class<? extends N>, N> transformedModels, + O outputModel) throws TransformationModuleException; } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/partition/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/partition/.ratings index bd6c2a8d..08a954b4 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/partition/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/partition/.ratings @@ -1,2 +1,2 @@ PartitionTransformationStrategy.java 220d5175ac8ff958f82c053a934095880540fcd3 YELLOW -PartitionTransformer.java 8e0cfe41579eea4c45d24ef768799f47e6751743 YELLOW +PartitionTransformer.java b2f9f2dc793c73b35bef529646e449012f747750 RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/partition/PartitionTransformer.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/partition/PartitionTransformer.java index 38ed01d4..57f0b38e 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/partition/PartitionTransformer.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/partition/PartitionTransformer.java @@ -34,11 +34,9 @@ import org.fortiss.af3.deployment.model.Deployment; import org.fortiss.af3.exploration.alg.dse.modeltransformation.ITransformationModule; import org.fortiss.af3.exploration.alg.dse.modeltransformation.base.TransformationModuleBase; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; import org.fortiss.af3.exploration.dsl_v2.model.expression.SuperSet; -import org.fortiss.af3.exploration.model.SuperSetMap; import org.fortiss.af3.partition.model.Partition; import org.fortiss.af3.partition.model.PartitionArchitecture; import org.fortiss.af3.partition.model.allocation.PartitionToExecutionUnitAllocationEntry; @@ -79,17 +77,16 @@ public class PartitionTransformer extends TransformationModuleBase<AllocationTab @Override public <N extends EObject, S extends EObject> AllocationTableCollection transform( TransformationState state, TransformationContext context, - SubClassToInstanceMap<S> baseModels, SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, - SubClassToInstanceMap<N> transformedModels, EObject outputModel) { + ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels, + EObject outputModel) { platfromArchitecture = getArchitectureOfAllocSuperSet( - superSets.get(PartitionToExecutionUnitAllocationEntry.class), + inputs.getSuperSet(PartitionToExecutionUnitAllocationEntry.class), PlatformArchitecture.class); taskArchitecture = getArchitectureOfAllocSuperSet( - superSets.get(TaskToPartitionAllocationEntry.class), TaskArchitecture.class); + inputs.getSuperSet(TaskToPartitionAllocationEntry.class), TaskArchitecture.class); SuperSet<PartitionToExecutionUnitAllocationEntry> partToExU = - superSets.get(PartitionToExecutionUnitAllocationEntry.class); + inputs.getSuperSet(PartitionToExecutionUnitAllocationEntry.class); // Get a random entry to retrieve the model context. PartitionToExecutionUnitAllocationEntry entry = LambdaUtils.getFirst(partToExU.getEntries()).get(); @@ -98,18 +95,18 @@ public class PartitionTransformer extends TransformationModuleBase<AllocationTab ITopLevelElement modelContext = IPersistencyService.getInstance().getTopLevelElementFor(fp); // TODO: The following step should be performed in a separate module. - createPartitionArchitecture(superSets.get(Partition.class), modelContext); - modelContext.runAsNonDirtyingCommand(() -> fp.getRootElements().add(platfromArchitecture)); + createPartitionArchitecture(inputs.getSuperSet(Partition.class), modelContext); + modelContext.runAsNonDirtyingCommand(() -> fp.getRootElements().add(partitionArchitecture)); // Create the allocations. allocTableCollection = createAllocationTableCollection("Generated Allocations"); TaskToPartitionAllocationTable taskExUTable = createTaskToExecutionUnitAllocationTable( - superSets.get(TaskToPartitionAllocationEntry.class)); + inputs.getSuperSet(TaskToPartitionAllocationEntry.class)); modelContext.runAsNonDirtyingCommand( () -> allocTableCollection.getContainedElements().add(taskExUTable)); PartitionToExecutionUnitAllocationTable partExUTable = createPartitionToExecutionUnitAllocationTable( - superSets.get(PartitionToExecutionUnitAllocationEntry.class)); + inputs.getSuperSet(PartitionToExecutionUnitAllocationEntry.class)); modelContext.runAsNonDirtyingCommand( () -> allocTableCollection.getContainedElements().add(partExUTable)); diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/safety/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/safety/.ratings index 9998a3ec..bd0ee265 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/safety/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/safety/.ratings @@ -1,2 +1,2 @@ -SafetyChannelPortReplicator.java 691c953255a126c817b29b822ba52fa70422c866 RED -SafetyDiagUnitRemover.java 082f3e2cab9b3c4ce1f4fc96ab3690ffa51be4f1 RED +SafetyChannelPortReplicator.java 6fc6a909be6baa4d73501cd6d9759b5a47870057 RED +SafetyDiagUnitRemover.java b3ce9c265511692802ce3c519c5ae2820e5d8ae0 RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/safety/SafetyChannelPortReplicator.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/safety/SafetyChannelPortReplicator.java index e5ee589a..5990480f 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/safety/SafetyChannelPortReplicator.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/safety/SafetyChannelPortReplicator.java @@ -36,10 +36,8 @@ import org.fortiss.af3.exploration.alg.dse.modeltransformation.base.Transformati import org.fortiss.af3.exploration.alg.dse.modeltransformation.comparch.ComponentArchitectureTransformer; import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ITaskAdapter; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; -import org.fortiss.af3.exploration.model.SuperSetMap; /** * @@ -71,11 +69,10 @@ public class SafetyChannelPortReplicator extends TransformationModuleBase<Compon @Override public <N extends EObject, S extends EObject> ComponentArchitecture transform( ITransformationModule.TransformationState state, TransformationContext context, - SubClassToInstanceMap<S> baseModels, SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, - SubClassToInstanceMap<N> transformedModels, EObject outputModel) { + ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels, + EObject outputModel) { @SuppressWarnings("unchecked") SafetyFunctionArchEncoding<Component> sfaEnc = - explorationEncodings.getEncoding(SafetyFunctionArchEncoding.class); + inputs.getEncoding(SafetyFunctionArchEncoding.class); Collection<Component> sfComponents = new HashSet<>(); for(SafetyFunctionArchEntry<Component> sfaEntry : sfaEnc.getAllEntries()) { diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/safety/SafetyDiagUnitRemover.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/safety/SafetyDiagUnitRemover.java index 3a1b0e50..b1a08fa2 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/safety/SafetyDiagUnitRemover.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/modeltransformation/safety/SafetyDiagUnitRemover.java @@ -32,10 +32,8 @@ import org.fortiss.af3.exploration.alg.dse.modeltransformation.comparch.Componen import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ITaskAdapter; import org.fortiss.af3.exploration.alg.exception.TransformationModuleException; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; -import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService.TransformationContext; -import org.fortiss.af3.exploration.model.SuperSetMap; /** * Module that deletes diagnostic {@link Component}s from a generated {@link ComponentArchitecture} @@ -90,10 +88,8 @@ public class SafetyDiagUnitRemover extends TransformationModuleBase<ComponentArc @Override public <N extends EObject, S extends EObject> ComponentArchitecture transform( TransformationState state, TransformationContext context, - SubClassToInstanceMap<S> baseModels, SuperSetMap superSets, - ExplorationEncodingMap<IExplorationEncoding> explorationEncodings, - SubClassToInstanceMap<N> transformedModels, EObject outputModel) - throws TransformationModuleException { + ExplorationTransformationInputs inputs, SubClassToInstanceMap<N> transformedModels, + EObject outputModel) throws TransformationModuleException { ComponentArchitecture genCA = (ComponentArchitecture)outputModel; if(genCA == null) { throw new TransformationModuleException(this, @@ -101,7 +97,7 @@ public class SafetyDiagUnitRemover extends TransformationModuleBase<ComponentArc } @SuppressWarnings("unchecked") SafetyFunctionArchEncoding<Component> sfaEnc = - explorationEncodings.getEncoding(SafetyFunctionArchEncoding.class); + inputs.getEncoding(SafetyFunctionArchEncoding.class); if(sfaEnc == null) { throw new TransformationModuleException(this, "A SafetyFunctionArchEncoding is required for this module to operate properly."); diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/IDependencyModule.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/IDependencyModule.java index 4189a901..8db4ecbd 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/IDependencyModule.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/IDependencyModule.java @@ -42,5 +42,5 @@ public interface IDependencyModule<I, O> { Collection<Class<?>> getOptionalTypes(); /** Returns the resulting type of {@code this} operation. */ - Class<? super O> getOutputType(); + Class<?> getOutputType(); } diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/plot/XYPlotter.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/plot/XYPlotter.java index f65690b5..e6d38d79 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/plot/XYPlotter.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/plot/XYPlotter.java @@ -53,8 +53,7 @@ import org.fortiss.af3.component.model.ComponentArchitecture; import org.fortiss.af3.deployment.model.Deployment; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding; import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEntry; -import org.fortiss.af3.exploration.alg.guava.MutableSubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService; import org.fortiss.af3.exploration.dsl_v2.model.expression.SuperSet; import org.fortiss.af3.exploration.model.ExplorationConstraint; @@ -84,8 +83,6 @@ import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; import org.jfree.ui.RectangleEdge; -import com.google.common.collect.ClassToInstanceMap; - /** * This class is responsible for creating a dialog that is used to display the identified * pareto-optimal solution of the design space exploration. It offers a 2D graph that visualizes the @@ -619,7 +616,7 @@ public class XYPlotter extends JFrame implements ChartMouseListener, ActionListe deploymentName = "_Deployment"; } - SubClassToInstanceMap<EObject> baseModels = MutableSubClassToInstanceMap.create(); + // SubClassToInstanceMap<EObject> baseModels = MutableSubClassToInstanceMap.create(); // TODO: instead of querying the systemModelAdapter here, we should use the // explorationResult -> input models. // ComponentArchitecture compArch = @@ -645,19 +642,20 @@ public class XYPlotter extends JFrame implements ChartMouseListener, ActionListe ITopLevelElement modelContext = IPersistencyService.getInstance() .getTopLevelElementFor(LambdaUtils.getFirst(entry.getTargetElements()).get()); - Collection<Class<? extends EObject>> solutionModelTypes = new HashSet<>(); + Collection<Class<?>> solutionModelTypes = new HashSet<>(); // solutionModelTypes.add(Deployment.class); solutionModelTypes.add(AllocationTableCollection.class); if(generateSCSpec) { // solutionModelTypes.add(SafetyComplianceSpecification.class); } + ExplorationTransformationInputs inputs = + new ExplorationTransformationInputs(solutionMap.getSolutionSets(), null); AllocationTableCollection deployment = null; - ClassToInstanceMap<EObject> solutionModels = + Map<Class<EObject>, ?> solutionModels = getService(IExplorationTransformationService.class).getTransformedModels(EXPORT, - modelContext, solutionMap, baseModels, solutionMap.getSolutionSets(), - solutionModelTypes, deploymentName); - deployment = solutionModels.getInstance(AllocationTableCollection.class); + modelContext, inputs, solutionModelTypes, deploymentName); + deployment = (AllocationTableCollection)solutionModels.get(AllocationTableCollection.class); // Derive the ComponentType from the Voter Specification. // for(VoterType voterSpec : getChildrenWithType(compArch, VoterType.class)) { diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/.ratings index 986a963e..2145bca6 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/.ratings @@ -8,5 +8,5 @@ IExplorationModule.java 8990c654e649f043fa9813b8bf9113ac7bd42d27 RED IExplorationRepairService.java e923c43c49e0c83daef71707d5fdb66444f859f8 RED IExplorationService.java 891b8c4ce01e40ab31bf69231a63fd61c57ac98e RED IExplorationTargetEvaluator.java 9b39b44f64ad8195583b00f8e3852bbc912f75fc RED -IExplorationTransformationService.java e0b50a382efcb1f84841ed4693077e8427031816 YELLOW +IExplorationTransformationService.java 5430b63426e704516b560d142b46ae702e07f726 RED IRepairModule.java 498a5b0ff519482af41db2916b1eefd1142cc9df RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/ExplorationTransformationInputs.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/ExplorationTransformationInputs.java new file mode 100644 index 00000000..3374ce60 --- /dev/null +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/ExplorationTransformationInputs.java @@ -0,0 +1,95 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 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.service; + +import static org.fortiss.af3.exploration.util.DesignSpaceExplorationModelElementFactory.createSuperSetMap; + +import java.util.HashSet; +import java.util.Set; + +import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; +import org.fortiss.af3.exploration.dsl_v2.model.expression.SuperSet; +import org.fortiss.af3.exploration.model.SuperSetMap; +import org.fortiss.tooling.base.model.element.IModelElement; + +import com.google.common.collect.ClassToInstanceMap; +import com.google.common.collect.MutableClassToInstanceMap; + +/** + * Container class that provides inputs from a DSE to the transformation framework. + * + * @author diewald + */ +// TODO: Instead of wrapping, we could also use subclassing: Encodings for DSE internal instances, +// SuperSets for the external world. +public class ExplorationTransformationInputs { + /** References the input {@link SuperSet}s. */ + private SuperSetMap superSets; + /** References the internal inputs from the DSE. */ + // TODO(AD): This explicit declaration of the Phenotype parameter can be avoided by + // subclassing... + private ClassToInstanceMap<Phenotype> dseEncodings; + + /** Constructor. */ + public ExplorationTransformationInputs(SuperSetMap superSets, + ClassToInstanceMap<Phenotype> dseEncodings) { + if(superSets != null) { + this.superSets = superSets; + } else { + this.superSets = createSuperSetMap(); + } + if(dseEncodings != null) { + this.dseEncodings = dseEncodings; + } else { + this.dseEncodings = MutableClassToInstanceMap.create(); + } + } + + /** + * Returns an instance of the given class from the encodings of a DSE. + * + * @param type + * of the instance to be returned. + * @return instance of the class obtained from the above mentioned containers, or {@code null} + * if it is not found. + */ + public <T extends Phenotype> T getEncoding(Class<T> type) { + return dseEncodings.getInstance(type); + } + + /** + * Returns the {@link SuperSet} which references elements of the given type. + * + * @param type + * of the {@link SuperSet} to be returned. + * @return {@link SuperSet} of the given type or {@code null} if no corresponding + * {@link SuperSet} is not found. + */ + public <S extends IModelElement> SuperSet<S> getSuperSet(Class<S> type) { + return superSets.get(type); + } + + /** + * Returns the types of all instances of DSE results wrapped in this container (encodings or + * {@link SuperSet}s). + */ + public Set<Class<?>> keySet() { + Set<Class<?>> allTypes = new HashSet<>(); + allTypes.addAll(dseEncodings.keySet()); + allTypes.addAll(superSets.keySet()); + return allTypes; + } +} diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/IExplorationTransformationService.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/IExplorationTransformationService.java index 49c98f5e..b16fb771 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/IExplorationTransformationService.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/IExplorationTransformationService.java @@ -16,21 +16,16 @@ package org.fortiss.af3.exploration.alg.service; import java.util.Collection; +import java.util.Map; import org.eclipse.emf.ecore.EObject; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap; -import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype; import org.fortiss.af3.exploration.alg.dse.modeltransformation.ITransformationModule; import org.fortiss.af3.exploration.alg.dse.modeltransformation.ITransformationStrategy; -import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; import org.fortiss.af3.exploration.alg.service.internal.ExplorationTransformationService; import org.fortiss.af3.exploration.dsl_v2.model.expression.SuperSet; -import org.fortiss.af3.exploration.model.SuperSetMap; import org.fortiss.af3.exploration.model.solutions.SingleExplorationSolution; import org.fortiss.tooling.kernel.extension.data.ITopLevelElement; -import com.google.common.collect.ClassToInstanceMap; - /** * {@link IExplorationService} interface of the {@link IExplorationTransformationService}. * It enables users to obtain transformed EMF models of a given type from a provided (candidate) @@ -94,12 +89,8 @@ public interface IExplorationTransformationService * by the user to export a solution. * @param modelContext * Model context in which the transformed models would be stored. - * @param solution - * {@link SingleExplorationSolution} containing the solution models. - * @param baseModels - * EMF models used as a basis to generate the transformed model. - * @param superSets - * {@link SuperSet}s (= "models") calculated by the DSE. + * @param inputs + * DSE encodings and {@link SuperSet}s as a basis to generate the transformed model. * @param transformedModelTypes * Type of the transformed models that shall be returned. * @param transformedModelName @@ -109,104 +100,11 @@ public interface IExplorationTransformationService * If no {@link ITransformationModule} has been registered which can produce the * demanded model, or if some required solution encoding was not passed. */ - <U extends EObject, S extends EObject> ClassToInstanceMap<U> getTransformedModels( + <U extends EObject, S extends EObject> Map<Class<U>, S> getTransformedModels( TransformationContext context, ITopLevelElement modelContext, - SingleExplorationSolution solution, SubClassToInstanceMap<S> baseModels, - SuperSetMap superSets, Collection<Class<? extends EObject>> transformedModelTypes, + ExplorationTransformationInputs inputs, Collection<Class<?>> transformedModelTypes, String transformedModelName) throws Exception; - /** - * Generates a model of the requested type ({@code transformedModelType}) using the set of - * solution models contained in the given {@link SingleExplorationSolution} and the - * collection of given {@code baseModel}s. - * - * @param context - * Defines whether the model transformation is executed DSE-internally or triggered - * by the user to export a solution. - * @param modelContext - * Model context in which the transformed models would be stored. - * @param solution - * {@link SingleExplorationSolution} containing the solution models. - * @param baseModels - * EMF models used as a basis to generate the transformed model. - * @param superSets - * {@link SuperSet}s (= "models") calculated by the DSE. - * @param transformedModelType - * Type of the transformed model. - * @param transformedModelName - * name of the transformed model, used when the model shall be exported. - * @return The transformed model. - * @throws Exception - * If no {@link ITransformationModule} has been registered which can produce the - * demanded model, or if some required solution encoding was not passed. - */ - <U extends EObject, S extends EObject> U getTransformedModel(TransformationContext context, - ITopLevelElement modelContext, SingleExplorationSolution solution, - SubClassToInstanceMap<S> baseModels, SuperSetMap superSets, - Class<U> transformedModelType, String transformedModelName) throws Exception; - - /** - * Generates models of the requested types ({@code transformedModelTypes}) using the set of - * solution models contained in the given {@link SingleExplorationSolution} and the - * collection of given {@code baseModel}s. - * - * @param context - * Defines whether the model transformation is executed DSE-internally or triggered - * by the user to export a solution. - * @param modelContext - * Model context in which the transformed models would be stored. - * @param encodings - * {@link SingleExplorationSolution} containing the solution models. - * @param baseModels - * EMF models used as a basis to generate the transformed model. - * @param superSets - * {@link SuperSet}s (= "models") calculated by the DSE. - * @param transformedModelTypes - * Type of the transformed models that shall be returned. - * @param transformedModelName - * name of the transformed model, used when the model shall be exported. - * @return The transformed models which were requested. - * @throws Exception - * If no {@link ITransformationModule} has been registered which can produce the - * demanded model, or if some required solution encoding was not passed. - */ - <U extends EObject, S extends EObject> ClassToInstanceMap<U> getTransformedModels( - TransformationContext context, ITopLevelElement modelContext, - ExplorationEncodingMap<IExplorationEncoding> encodings, - SubClassToInstanceMap<S> baseModels, SuperSetMap superSets, - Collection<Class<? extends EObject>> transformedModelTypes, String transformedModelName) - throws Exception; - - /** - * Generates a model of the requested type ({@code transformedModelType}) using the set of - * {@link Phenotype}s contained in the given {@link FlatPhenotypeMap} and the - * collection of given {@code baseModel}s. - * - * @param context - * Defines whether the model transformation is executed DSE-internally or triggered - * by the user to export a solution. - * @param modelContext - * Model context in which the transformed models would be stored. - * @param encodings - * {@link SingleExplorationSolution} containing the solution models. - * @param baseModels - * EMF models used as a basis to generate the transformed model. - * @param superSets - * {@link SuperSet}s (= "models") calculated by the DSE. - * @param transformedModelType - * Type of the transformed model. - * @param transformedModelName - * name of the transformed model, used when the model shall be exported. - * @return The transformed model. - * @throws Exception - * If no {@link ITransformationModule} has been registered which can produce the - * demanded model, or if some required solution encoding was not passed. - */ - <U extends EObject, S extends EObject> U getTransformedModel(TransformationContext context, - ITopLevelElement modelContext, ExplorationEncodingMap<IExplorationEncoding> encodings, - SubClassToInstanceMap<S> baseModels, SuperSetMap superSets, - Class<U> transformedModelType, String transformedModelName) throws Exception; - /** * Resets the lists of {@link ITransformationModule}s registered at {@code this} * {@link ExplorationTransformationService}. diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/internal/.ratings b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/internal/.ratings index 6b6be46f..91a95e28 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/internal/.ratings +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/internal/.ratings @@ -1,4 +1,4 @@ ExplorationConstraintTransformationService.java 80031ad626c327df10bc00859a4036844544553b RED ExplorationEvaluationService.java 259ace09d86990428fb2ff9cfbff552cb4a69be8 RED ExplorationRepairService.java ac50a5e53792c6793ff4b8ad5aa9812141990f5c RED -ExplorationTransformationService.java e9dae52c7d57d7e694f5696a4808b6eacbab1b96 RED +ExplorationTransformationService.java 44817e9380c88d538b094b0930b88b2ce0f03b89 RED diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/internal/ExplorationTransformationService.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/internal/ExplorationTransformationService.java index f442e619..36e2368d 100644 --- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/internal/ExplorationTransformationService.java +++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/service/internal/ExplorationTransformationService.java @@ -37,11 +37,9 @@ import org.fortiss.af3.exploration.alg.dse.modeltransformation.ITransformationMo import org.fortiss.af3.exploration.alg.dse.modeltransformation.ITransformationStrategy; import org.fortiss.af3.exploration.alg.guava.MutableSubClassToInstanceMap; import org.fortiss.af3.exploration.alg.guava.SubClassToInstanceMap; -import org.fortiss.af3.exploration.alg.service.ExplorationEncodingMap; +import org.fortiss.af3.exploration.alg.service.ExplorationTransformationInputs; import org.fortiss.af3.exploration.alg.service.IExplorationEncoding; import org.fortiss.af3.exploration.alg.service.IExplorationTransformationService; -import org.fortiss.af3.exploration.model.SuperSetMap; -import org.fortiss.af3.exploration.model.solutions.SingleExplorationSolution; import org.fortiss.af3.project.model.FileProject; import org.fortiss.af3.project.utils.ProjectUtils; import org.fortiss.tooling.kernel.extension.data.ITopLevelElement; @@ -49,10 +47,8 @@ import org.fortiss.tooling.kernel.model.INamedElement; import org.fortiss.tooling.kernel.service.ITransformationService; import org.fortiss.tooling.kernel.service.base.EObjectAwareServiceBase; -import com.google.common.collect.ClassToInstanceMap; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; -import com.google.common.collect.MutableClassToInstanceMap; /** * Implementation of the {@link ITransformationService} that manages model transformations from @@ -173,15 +169,15 @@ public class ExplorationTransformationService<T extends ITransformationModule<?> * the given {@link ITransformationModule} has already been registered. */ protected void registerTransformationModuleInternal(T module) throws Exception { - // if(modulesByOutput.containsKey(module.getOutputType())) { - // throw new Exception( - // "An ITransformationModule has already been registered to produce the target model type " - // + - // module.getOutputType() + - // " (currently registered ITransformationModule: " + - // module.getClass().getSimpleName() + - // ". It is only allowed to register one ITransformationModule per target model type."); - // } + if(module instanceof ITransformationStrategy && + modulesByOutput.containsKey(module.getOutputType())) { + throw new Exception( + "An ITransformationModule has already been registered to produce the target" + + "model type " + module.getOutputType() + " (currently registered" + + " ITransformationStrategy: " + module.getClass().getSimpleName() + + ". It is only allowed to register one ITransformationModule per " + + "target model type."); + } if(inputTypesOfModules.containsKey(module)) { inputTypesOfModules.removeAll(module); @@ -191,20 +187,6 @@ public class ExplorationTransformationService<T extends ITransformationModule<?> modulesByOutput.put(module.getOutputType(), module); } - /** {@inheritDoc} */ - @Override - public <U extends EObject, S extends EObject> U getTransformedModel( - TransformationContext context, ITopLevelElement modelContext, - SingleExplorationSolution solution, SubClassToInstanceMap<S> baseModels, - SuperSetMap superSets, Class<U> transformedModelType, String transformedModelName) - throws Exception { - Collection<Class<? extends EObject>> reqType = new ArrayList<>(); - reqType.add(transformedModelType); - ClassToInstanceMap<U> retMap = getTransformedModels(context, modelContext, solution, - baseModels, superSets, reqType, transformedModelName); - return retMap.getInstance(transformedModelType); - } - /** {@inheritDoc} */ @Override public boolean canTransformOutputType(Class<?> transformedModelType) { @@ -213,18 +195,18 @@ public class ExplorationTransformationService<T extends ITransformationModule<?> /** {@inheritDoc} */ @Override - public <U extends EObject, S extends EObject> ClassToInstanceMap<U> getTransformedModels( + // FIXME: Merge with the above method: Code duplication!!! + public <U extends EObject, S extends EObject> Map<Class<U>, S> getTransformedModels( TransformationContext context, ITopLevelElement modelContext, - SingleExplorationSolution solution, SubClassToInstanceMap<S> baseModels, - SuperSetMap superSets, Collection<Class<? extends EObject>> transformedModelTypes, + ExplorationTransformationInputs inputs, Collection<Class<?>> transformedModelTypes, String transformedModelName) throws Exception { // First, collect all transformation modules which would generate the requested output. Collection<ITransformationModule<?>> topLvlModules = new HashSet<>(); - for(Class<? extends EObject> tModelType : transformedModelTypes) { + for(Class<?> tModelType : transformedModelTypes) { ITransformationModule<?> module = modulesByOutput.get(tModelType); if(module == null) { throw new Exception( - "No ITransformationModule has been registerd which prduces the demanded output model type. Aborting."); + "No ITransformationModule has been registerd which produces the demanded output model type. Aborting."); } topLvlModules.add(module); } @@ -233,23 +215,20 @@ public class ExplorationTransformationService<T extends ITransformationModule<?> // and its sub-Modules are present. // TODO: instead of triggering the transformations here, use a threaded implementation in // the ITransformation's base class. - ExplorationEncodingMap<IExplorationEncoding> solutionEncodings = - new ExplorationEncodingMap<>(); Queue<ITransformationModule<?>> moduleTraversalList = new LinkedList<>(); moduleTraversalList.addAll(topLvlModules); while(!moduleTraversalList.isEmpty()) { ITransformationModule<?> currentModule = moduleTraversalList.poll(); - for(Class<IExplorationEncoding> solutionType : pickSubTypesOf( - IExplorationEncoding.class, currentModule.getRequiredTypes())) { - Object solutionModel = null; // solution.getSolutionModel(solutionType); - // TODO(#3285): Reinclude. - if(solutionModel != null) { - solutionEncodings.putEncoding(solutionType, - (IExplorationEncoding)solutionModel); - } else if(!currentModule.isOptional()) { + // FIXME: This part of the code does not consider SuperSets yet. + for(Class<Phenotype> inputType : pickSubTypesOf(Phenotype.class, + currentModule.getRequiredTypes())) { + if(!currentModule.isOptional() && !(inputs.keySet().contains(inputType) || + transformedModelTypes.contains(inputType))) { throw new Exception("The required solution encoding " + - solutionType.getSimpleName() + - " could not be found in the given set of solutions. Please check whether all required solution model have been requested from the DSE."); + inputType.getSimpleName() + + " could not be found in the given set of solutions. Please check" + + " whether all required solution model have been requested from the" + + " DSE."); } } @@ -257,99 +236,9 @@ public class ExplorationTransformationService<T extends ITransformationModule<?> currentModule.getSubModules().forEach(m -> topLvlModules.remove(m)); } - // TODO: Add a meaningful TransformationException here. - assert (topLvlModules.size() == 1); - - ITransformationModule<?> rootModule = topLvlModules.stream().findAny().get(); - ITransformationModule<?> moduleInstance = rootModule.createModuleInstance(); - if(moduleInstance instanceof ITransformationStrategy) { - ((ITransformationStrategy<?>)moduleInstance).setModelContext(modelContext); - ((ITransformationStrategy<?>)moduleInstance).setModelName(transformedModelName); - } - - annotationUpdateEnabled = isUpdateEnabled(); - setUpdateEnabled(false); - - SubClassToInstanceMap<U> transformedModels = MutableSubClassToInstanceMap.create(); - moduleInstance.transform(TransformationState.INITIALIZING, context, baseModels, superSets, - solutionEncodings, transformedModels, null); - - if(context == TransformationContext.EXPORT && - moduleInstance instanceof ITransformationStrategy) { - FileProject fp = ProjectUtils.getFileProject(modelContext.getRootModelElement()); - ((ITransformationStrategy<?>)moduleInstance).addModelToProject(fp, modelContext); - } - - // Re-enable Annotation view updates if needed - setUpdateEnabled(annotationUpdateEnabled); - - ClassToInstanceMap<U> retModels = MutableClassToInstanceMap.create(); - for(Class<? extends EObject> retType : transformedModelTypes) { - assert (transformedModels.get(retType) != null); - @SuppressWarnings("unchecked") Class<? extends U> castedRetType = - (Class<? extends U>)retType; - retModels.put(castedRetType, transformedModels.get(retType)); - } - - return retModels; - } - - /** {@inheritDoc} */ - @Override - public <U extends EObject, S extends EObject> U getTransformedModel( - TransformationContext context, ITopLevelElement modelContext, - ExplorationEncodingMap<IExplorationEncoding> phenotypes, - SubClassToInstanceMap<S> baseModels, SuperSetMap superSets, - Class<U> transformedModelType, String transformedModelName) throws Exception { - Collection<Class<? extends EObject>> reqType = new ArrayList<>(); - reqType.add(transformedModelType); - ClassToInstanceMap<U> retMap = getTransformedModels(context, modelContext, phenotypes, - baseModels, superSets, reqType, transformedModelName); - return retMap.getInstance(transformedModelType); - } - - /** {@inheritDoc} */ - @Override - public <U extends EObject, S extends EObject> ClassToInstanceMap<U> getTransformedModels( - TransformationContext context, ITopLevelElement modelContext, - ExplorationEncodingMap<IExplorationEncoding> phenotypes, - SubClassToInstanceMap<S> baseModels, SuperSetMap superSets, - Collection<Class<? extends EObject>> transformedModelTypes, String transformedModelName) - throws Exception { - // First, collect all transformation modules which would generate the requested output. - Collection<ITransformationModule<?>> topLvlModules = new HashSet<>(); - for(Class<? extends EObject> tModelType : transformedModelTypes) { - ITransformationModule<?> module = modulesByOutput.get(tModelType); - if(module == null) { - throw new Exception( - "No ITransformationModule has been registerd which produces the demanded output model type. Aborting."); - } - topLvlModules.add(module); - } - - // Then, we check whether all required inputs for the corresponding ITransformationModule - // and its sub-Modules are present. - // TODO: instead of triggering the transformations here, use a threaded implementation in - // the ITransformation's base class. - ExplorationEncodingMap<IExplorationEncoding> encodings = new ExplorationEncodingMap<>(); - Queue<ITransformationModule<?>> moduleTraversalList = new LinkedList<>(); - moduleTraversalList.addAll(topLvlModules); - while(!moduleTraversalList.isEmpty()) { - ITransformationModule<?> currentModule = moduleTraversalList.poll(); - for(Class<Phenotype> solutionType : pickSubTypesOf(Phenotype.class, - currentModule.getRequiredTypes())) { - IExplorationEncoding phenotype = phenotypes.getEncoding(solutionType); - if(phenotype != null) { - encodings.putEncoding(solutionType, phenotype); - } else if(!currentModule.isOptional()) { - throw new Exception("The required phenotype encoding " + - solutionType.getSimpleName() + - " could not be found in the given set of phenotypes. Please check whether all required phenotypes have been requested from the DSE."); - } - } - - moduleTraversalList.addAll(currentModule.getSubModules()); - currentModule.getSubModules().forEach(m -> topLvlModules.remove(m)); + if(context == TransformationContext.EXPORT) { + annotationUpdateEnabled = isUpdateEnabled(); + setUpdateEnabled(false); } // TODO: Add a meaningful TransformationException here. @@ -364,19 +253,28 @@ public class ExplorationTransformationService<T extends ITransformationModule<?> } SubClassToInstanceMap<U> transformedModels = MutableSubClassToInstanceMap.create(); @SuppressWarnings("unchecked") U transformedModel = - (U)moduleInstance.transform(TransformationState.INITIALIZING, context, baseModels, - superSets, encodings, transformedModels, null); + (U)moduleInstance.transform(TransformationState.INITIALIZING, context, inputs, + transformedModels, null); if(transformedModel instanceof INamedElement) { ((INamedElement)transformedModel).setName(transformedModelName); } - ClassToInstanceMap<U> retModels = MutableClassToInstanceMap.create(); - for(Class<? extends EObject> retType : transformedModelTypes) { - assert (transformedModels.get(retType) != null); - @SuppressWarnings("unchecked") Class<? extends U> castedRetType = - (Class<? extends U>)retType; - retModels.put(castedRetType, transformedModels.get(retType)); + Map<Class<U>, S> retModels = new HashMap<>(); + for(Class<?> retType : transformedModelTypes) { + // FIMXE: These are VERY dirty casts to allow returning wrapped types (--> SuperSets). + // Reconsider!!! + @SuppressWarnings("unchecked") Class<U> castedRetType = (Class<U>)retType; + @SuppressWarnings("unchecked") S castedModel = (S)transformedModel; + retModels.put(castedRetType, castedModel); + } + + if(context == TransformationContext.EXPORT) { + FileProject fp = ProjectUtils.getFileProject(modelContext.getRootModelElement()); + ((ITransformationStrategy<?>)moduleInstance).addModelToProject(fp, modelContext); + + // Re-enable Annotation view updates if needed + setUpdateEnabled(annotationUpdateEnabled); } return retModels; -- GitLab