From ba779c25edb88c233806b9052c33809374edef14 Mon Sep 17 00:00:00 2001
From: Nikolaus Huber <nikolaus.huber@uni-wuerzburg.de>
Date: Fri, 4 Jul 2014 09:46:59 +0000
Subject: [PATCH] switch to ObservationRepository

git-svn-id: https://se1.informatik.uni-wuerzburg.de/usvn/svn/code/DMM/trunk@16153 9e42b895-fcda-4063-8a3b-11be15eb1bbd
---
 .../AdaptationControl.launch                  |  15 --
 .../META-INF/MANIFEST.MF                      |   7 +-
 .../default.properties                        |  32 ---
 .../adaptation/AdaptationControl.java         |  11 +-
 .../descartes/adaptation/TacticExecutor.java  | 204 ------------------
 5 files changed, 10 insertions(+), 259 deletions(-)
 delete mode 100644 edu.kit.ipd.descartes.adaptation/AdaptationControl.launch
 delete mode 100644 edu.kit.ipd.descartes.adaptation/default.properties
 delete mode 100644 edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/TacticExecutor.java

diff --git a/edu.kit.ipd.descartes.adaptation/AdaptationControl.launch b/edu.kit.ipd.descartes.adaptation/AdaptationControl.launch
deleted file mode 100644
index d16e1300..00000000
--- a/edu.kit.ipd.descartes.adaptation/AdaptationControl.launch
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
-<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="edu.kit.ipd.descartes.adaptation.AdaptationControl"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="default.properties"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="edu.kit.ipd.descartes.adaptation"/>
-</launchConfiguration>
diff --git a/edu.kit.ipd.descartes.adaptation/META-INF/MANIFEST.MF b/edu.kit.ipd.descartes.adaptation/META-INF/MANIFEST.MF
index 95612fd7..df74038b 100644
--- a/edu.kit.ipd.descartes.adaptation/META-INF/MANIFEST.MF
+++ b/edu.kit.ipd.descartes.adaptation/META-INF/MANIFEST.MF
@@ -12,20 +12,15 @@ Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Import-Package: edu.kit.ipd.descartes.adaptation.evaluation.performance,
  edu.kit.ipd.descartes.adaptation.evaluation.performance.repository,
- edu.kit.ipd.descartes.adaptation.model,
- edu.kit.ipd.descartes.adaptation.model.adaptation,
  edu.kit.ipd.descartes.adaptation.model.adaptation.dmm,
  edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.util,
- edu.kit.ipd.descartes.adaptation.model.adaptation.exceptions,
  edu.kit.ipd.descartes.adaptation.model.analysis,
  edu.kit.ipd.descartes.adaptation.model.analysis.pcm,
  edu.kit.ipd.descartes.adaptation.model.dmm,
  edu.kit.ipd.descartes.ql.core.engine.query,
  edu.kit.ipd.descartes.ql.lang.descartesQL,
- edu.kit.ipd.descartes.ql.models.mapping.domain,
  edu.kit.ipd.descartes.ql.models.mapping.mapping,
  edu.kit.ipd.descartes.ql.models.repository,
  org.apache.log4j;version="1.2.15",
- org.eclipse.emf.ecore.xmi,
- org.eclipse.emf.ecore.xmi.impl
+ org.eclipse.emf.ecore.xmi
 Export-Package: edu.kit.ipd.descartes.adaptation
diff --git a/edu.kit.ipd.descartes.adaptation/default.properties b/edu.kit.ipd.descartes.adaptation/default.properties
deleted file mode 100644
index 02ae99ca..00000000
--- a/edu.kit.ipd.descartes.adaptation/default.properties
+++ /dev/null
@@ -1,32 +0,0 @@
-#process.name=AdaptationEngine
-#adaptationprocess.instance=../edu.kit.ipd.descartes.adaptation.test/test_models/StaRepository.xmi
-#perfdatarepo.metamodel=edu.kit.ipd.descartes.perfdatarepo.PerformanceDataRepository
-#perfdatarepo.instance=../edu.kit.ipd.descartes.adaptation.test/test_models/PerformanceDataRepositoryDummy.xmi
-#process.maxiterations=2
-## The list of triggering events can be found in EventTypeEnum.java
-#event.type=
-
-#process.name=SEAMS_PushPull-v1
-#adaptationprocess.instance=../Examples/SEAMS_Case_Study/pushpull.adaptation
-#perfdatarepo.metamodel=edu.kit.ipd.descartes.perfdatarepo.PerformanceDataRepository
-#perfdatarepo.instance=../Examples/SEAMS_Case_Study/simucomresults.perfdatarepo
-#process.maxiterations=2
-## The list of triggering events can be found in EventTypeEnum.java
-#event.type=SlaViolatedEvent
-
-#process.name=SEAMS_PushPull-v2
-#adaptationprocess.instance=../edu.kit.ipd.descartes.adaptation.test/SEAMSv2_Case_Study/pushPullProcess.adaptation
-#perfdatarepo.metamodel=edu.kit.ipd.descartes.perfdatarepo.PerformanceDataRepository
-#perfdatarepo.instance=../edu.kit.ipd.descartes.adaptation.test/SEAMSv2_Case_Study/simucom-simulationResults.perfdatarepo
-#process.maxiterations=2
-## The list of triggering events can be found in EventTypeEnum.java
-#event.type=SlaViolatedEvent
-
-process.name=SEAMS_PushPull-v1
-adaptationprocess.instance=../Examples/SEAMS_Case_Study/pushpull.adaptation
-perfdatarepo.metamodel=edu.kit.ipd.descartes.perfdatarepo.PerformanceDataRepository
-perfdatarepo.instance=../Examples/SEAMS_Case_Study/simucomresults.perfdatarepo
-process.maxiterations=3
-# The list of triggering events can be found in EventTypeEnum.java
-event.type=SlaViolatedEvent
- #ScheduledOptimizationEvent
\ No newline at end of file
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java
index 06e5275b..22545bbe 100644
--- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java
@@ -17,11 +17,11 @@ import edu.kit.ipd.descartes.adaptation.evaluation.performance.WeightingFunction
 import edu.kit.ipd.descartes.adaptation.evaluation.performance.repository.IPerformanceDataRepositoryHandler;
 import edu.kit.ipd.descartes.adaptation.evaluation.performance.repository.ObservationRepositoryHelper;
 import edu.kit.ipd.descartes.adaptation.evaluation.performance.repository.PerfDataRepoConverter;
-import edu.kit.ipd.descartes.adaptation.evaluation.performance.repository.PerformanceDataRepositoryHandler;
 import edu.kit.ipd.descartes.adaptation.evaluation.performance.repository.PerformanceDataRepositoryHandlerFactory;
 import edu.kit.ipd.descartes.adaptation.event.EventTypeEnum;
 import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.BlueYonderExperimentTracker;
 import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.DmmModelActionHandler;
+import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.TacticExecutor;
 import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.TacticsHistory;
 import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.util.ObjectivesHelper;
 import edu.kit.ipd.descartes.adaptation.model.analysis.IModelAnalyzer;
@@ -131,6 +131,8 @@ public class AdaptationControl {
             // Execute the strategie's tactic with the currently highest weight
             WeightedTactic currentTactic = currentStrategy.getTacticWithHighestWeight();
 
+            logger.debug("=============================");
+            logger.debug("Starting iteration number " + (iteration + 1));
             applyTactic(currentTactic);
             analyzeModel();
             evaluate();
@@ -148,6 +150,10 @@ public class AdaptationControl {
 
             iteration++;
         }
+        
+        if(iteration >= maxIterations){
+        	logger.info("Adaptation process has been aborted. Maximum iterations " + iteration + " reached!");
+        }
 
         printLogInformation();
 
@@ -164,7 +170,7 @@ public class AdaptationControl {
         Result currentSystemState = perfDataRepoHandler.getCurrentSystemState();
         // TODO: Blue Yonder specific, introduce abstraction layer
         WeightedTactic latestTactic = TacticsHistory.getInstance().getLatestAppliedTactic();
-        if (latestTactic != null && !(perfDataRepoHandler instanceof PerformanceDataRepositoryHandler)) {
+        if (latestTactic != null && ((ObservationRepository) perfDataRepoHandler.getRepository()).getIdentifier().contains("Blue Yonder") ) {
               String expName = BlueYonderExperimentTracker.getInstance()
                       .getExperimentNameForDistributedDataCenter(DmlModelLoader.getDistributedDataCenter());
               logger.debug("Searching for result of " + expName);
@@ -198,6 +204,7 @@ public class AdaptationControl {
 
         if (TacticsHistory.getInstance().wasLatestTacticSuccessful()) {
             modelAnalyzer.analyze();
+            perfDataRepoHandler.setNewSystemState();
             Impact latestImpact = modelAnalyzer.getLatestImpact();
             if (latestImpact != null)
                 tactic.setLastImpact(latestImpact);
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/TacticExecutor.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/TacticExecutor.java
deleted file mode 100644
index 1d9451c4..00000000
--- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/TacticExecutor.java
+++ /dev/null
@@ -1,204 +0,0 @@
-package edu.kit.ipd.descartes.adaptation;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.change.ChangeDescription;
-
-import edu.kit.ipd.descartes.adaptation.model.adaptation.IActionHandler;
-import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.BlueYonderExperimentTracker;
-import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.IObserver;
-import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.TacticsHistory;
-import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.util.OclEvaluationHelper;
-import edu.kit.ipd.descartes.adaptation.model.adaptation.exceptions.InvalidAdaptationPlan;
-import edu.kit.ipd.descartes.adaptation.model.adaptation.exceptions.OperationNotPerformedException;
-import edu.kit.ipd.descartes.adaptation.model.dmm.DmlModelLoader;
-import edu.kit.ipd.descartes.mm.adaptation.AbstractControlFlowElement;
-import edu.kit.ipd.descartes.mm.adaptation.Action;
-import edu.kit.ipd.descartes.mm.adaptation.ActionReference;
-import edu.kit.ipd.descartes.mm.adaptation.AdaptationPlan;
-import edu.kit.ipd.descartes.mm.adaptation.BranchAction;
-import edu.kit.ipd.descartes.mm.adaptation.LoopAction;
-import edu.kit.ipd.descartes.mm.adaptation.Parameter;
-import edu.kit.ipd.descartes.mm.adaptation.StartAction;
-import edu.kit.ipd.descartes.mm.adaptation.StopAction;
-import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic;
-import edu.kit.ipd.descartes.mm.adaptationpoints.AdaptationPoint;
-import edu.kit.ipd.descartes.mm.containerrepository.ContainerrepositoryPackage;
-import edu.kit.ipd.descartes.mm.resourcelandscape.ResourcelandscapePackage;
-
-public class TacticExecutor {
-
-    private static Logger logger = Logger.getLogger(TacticExecutor.class);
-    private List<IObserver> observers = new ArrayList<IObserver>();
-
-    private IActionHandler dmmModelActionHandler;
-    private TacticsHistory hist;
-    private ChangeDescription changeDescription = null;
-
-    public TacticExecutor(IActionHandler actionExecutor) {
-        dmmModelActionHandler = actionExecutor;
-        hist = TacticsHistory.getInstance();
-        register(BlueYonderExperimentTracker.getInstance()); // TODO implement clean observer
-                                                             // pattern
-    }
-
-    /**
-     * Applies the the given tactic.
-     * 
-     * @param currentTactic
-     *            The tactic to execute
-     * @return
-     */
-    public void applyTactic(WeightedTactic weightedTactic) {
-        try {
-            logger.info("Applying tactic " + weightedTactic.getUsedTactic().getName() + ", ID: "
-                    + weightedTactic.getUsedTactic().getId() + ".");
-            DmlModelLoader.startRecording();
-            executeAdaptationPlan(weightedTactic.getUsedTactic().getImplementedPlan());
-            logger.info("Tactic " + weightedTactic.getUsedTactic().getName() + " successfully applied.");
-            hist.add(weightedTactic, TacticsHistory.NO_RESULT, true);
-
-            // if this point is reached everything was fine, so persist them (save the models)
-            dmmModelActionHandler.persistActions();
-            changeDescription = DmlModelLoader.endRecording();
-            return;
-        } catch (OperationNotPerformedException e) {
-            logger.error("Tactic " + weightedTactic.getUsedTactic().getName()
-                    + " could not be executed. Please check adaptation plan and/or log files for errors.", e);
-            hist.add(weightedTactic, TacticsHistory.NO_RESULT, false);
-            /*
-             * TODO Something went wrong. 1) Detect error 2) reevaluate tactics 3) apply different
-             * tactic.
-             */
-        }
-    }
-
-    private StartAction findStartAction(AdaptationPlan plan) {
-        for (AbstractControlFlowElement abstractControlFlowElement : plan.getSteps()) {
-            // Find start of adaptation plan
-            if (abstractControlFlowElement instanceof StartAction) {
-                return (StartAction) abstractControlFlowElement;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Executes the given {@link AdaptationPlan}.
-     * 
-     * @param plan
-     *            The adaptation plan to execute
-     * @throws IOException
-     * @throws OperationNotPerformedException
-     */
-    private void executeAdaptationPlan(AdaptationPlan plan) throws OperationNotPerformedException {
-
-        StartAction start = findStartAction(plan);
-        if (start == null)
-            throw new OperationNotPerformedException("No start action for adaptation plan " + plan.getName()
-                    + " found.");
-
-        try {
-            executeNextStep(start.getSuccessor());
-        } catch (InvalidAdaptationPlan e) {
-            logger.error(
-                    "Invalid adaptation plan <<" + plan.getName() + ">> when executing action with ID <<"
-                            + start.getId() + ">>.", e);
-        }
-    }
-
-    private void executeNextStep(AbstractControlFlowElement step) throws OperationNotPerformedException,
-            InvalidAdaptationPlan {
-
-        if (step == null)
-            throw new InvalidAdaptationPlan("Current AbstractControlFlowElement is null!");
-
-        if (step instanceof StopAction) {
-            return;
-        } else if (step instanceof BranchAction) {
-            executeBranchAction(step);
-        } else if (step instanceof LoopAction) {
-            execLoopAction(step);
-        } else if (step instanceof ActionReference) {
-            executeReferredAction(step);
-        } else
-            // Handle invalid actions and control flow elements
-            throw new OperationNotPerformedException("No valid control flow element " + step.toString());
-
-        // in any case (except stop action)
-        // continue with the next step
-        executeNextStep(step.getSuccessor());
-    }
-
-    private void executeReferredAction(AbstractControlFlowElement step) throws OperationNotPerformedException {
-        ActionReference ref = (ActionReference) step;
-        Action action = ref.getRefersTo();
-        logger.info("Executing action <<" + action.getName() + ">>.");
-        AdaptationPoint currentAdaptationPoint = action.getReferredAdaptationPoint();
-
-        dmmModelActionHandler.execute(currentAdaptationPoint, action.getAdaptationActionOperation());
-    }
-
-    private void executeBranchAction(AbstractControlFlowElement branchAction) throws OperationNotPerformedException {
-        BranchAction branch = (BranchAction) branchAction;
-        if (isBranchConditionTrue(branch.getContext(), branch.getCondition()))
-            executeAdaptationPlan(branch.getConditionTrueBranch());
-        else
-            executeAdaptationPlan(branch.getConditionFalseBranch());
-    }
-
-    private void execLoopAction(AbstractControlFlowElement loopAction) throws OperationNotPerformedException {
-        LoopAction loop = (LoopAction) loopAction;
-        Parameter counter = loop.getCounter();
-        int counterValue = Integer.parseInt(counter.getValue());
-
-        int i = 1;
-
-        while (i <= counterValue) {
-            logger.debug("Executing iteration " + i + " of loop action " + loop.getBody().getName());
-            executeAdaptationPlan(loop.getBody());
-            i++;
-        }
-    }
-
-    private boolean isBranchConditionTrue(EObject obj, String branchCondition) {
-
-        EClass context = null;
-
-        switch (obj.eClass().getClassifierID()) {
-        case ResourcelandscapePackage.RUNTIME_ENVIRONMENT:
-            context = ResourcelandscapePackage.Literals.RUNTIME_ENVIRONMENT;
-            break;
-        case ContainerrepositoryPackage.CONTAINER_TEMPLATE:
-            context = ContainerrepositoryPackage.Literals.CONTAINER_TEMPLATE;
-            break;
-        // TODO add further contexts if necessary
-        default:
-            logger.error("Could not set context for eClass " + obj.getClass());
-            return false;
-        }
-
-        boolean invariant = OclEvaluationHelper.evaluateOclConstraint(obj, branchCondition, context);
-        return invariant;
-    }
-
-    public void undoPreviousTactic() {
-        logger.info("Reverting model to previous state");
-        if (changeDescription != null)
-            changeDescription.apply();
-    }
-
-    public void register(IObserver observer) {
-        observers.add(observer);
-    }
-
-    public void remove(IObserver observer) {
-        observers.remove(observer);
-    }
-
-}
-- 
GitLab