From 75d0b66ba9afdd937404af2004abdb3617ebafc9 Mon Sep 17 00:00:00 2001 From: Nikolaus Huber <nikolaus.huber@uni-wuerzburg.de> Date: Wed, 22 May 2013 08:07:22 +0000 Subject: [PATCH] connection of ObservationRepository git-svn-id: https://se1.informatik.uni-wuerzburg.de/usvn/svn/code/code/DMM/trunk@11674 9e42b895-fcda-4063-8a3b-11be15eb1bbd --- .../adaptation/AdaptationControl.java | 8 +- .../dmm/AdaptationProcessModelLoader.java | 8 +- .../model/dmm/DmmModelActionHandler.java | 6 +- .../dmm/util/WeightingFunctionHelper.java | 68 ++++++++-------- .../ObservationRepositoryHandler.java | 12 +-- .../ObservationRepositoryModelLoader.java | 32 +++++++- .../perfdatarepo/PerfDataRepoConverter.java | 77 +++++++++++++++++++ .../PerformanceDataRepositoryHandler.java | 6 +- 8 files changed, 169 insertions(+), 48 deletions(-) create mode 100644 edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoConverter.java 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 6f59d31f..c6fd914d 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 @@ -8,6 +8,7 @@ import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.xmi.DanglingHREFException; import edu.kit.ipd.descartes.adaptation.evaluation.WeightingFunctionEvaluator; import edu.kit.ipd.descartes.adaptation.model.analysis.IModelAnalyzer; @@ -116,8 +117,11 @@ public class AdaptationControl { logger.debug("Saving tactics evaluation results..."); adaptationProcessModelLoader.saveAll(); } catch (IOException e) { - logger.error("Error while persisting evaluation results.", e); - } + if (e.getCause() instanceof DanglingHREFException) + logger.error("Error while persisting results because of dangling references. Probably not all changes have been saved"); + else + logger.error("Error while persisting evaluation results.", e); + } iteration++; } diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/AdaptationProcessModelLoader.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/AdaptationProcessModelLoader.java index 44b98432..92a40c7c 100644 --- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/AdaptationProcessModelLoader.java +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/AdaptationProcessModelLoader.java @@ -47,9 +47,10 @@ public class AdaptationProcessModelLoader extends AbstractEcoreModelLoader { public void saveAll() throws IOException { EList<Resource> resources = getResourceSet().getResources(); - Map<String, Boolean> options = new HashMap<String, Boolean>(); - options.put(XMIResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE); - options.put(XMIResource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER, Boolean.TRUE); + Map<String, String> options = new HashMap<String, String>(); + options.put(XMIResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE.toString()); + options.put(XMIResource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER, Boolean.TRUE.toString()); + options.put(XMIResource.OPTION_PROCESS_DANGLING_HREF, XMIResource.OPTION_PROCESS_DANGLING_HREF_THROW); for (Resource res : resources) { res.save(options); @@ -68,7 +69,6 @@ public class AdaptationProcessModelLoader extends AbstractEcoreModelLoader { for (EPackage ePackage : DMM_EPACKAGES) { getResourceSet().getResourceFactoryRegistry().getExtensionToFactoryMap().put(ePackage.getNsURI(), ePackage); } - } public static DistributedDataCenter getDistributedDataCenter() { diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/DmmModelActionHandler.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/DmmModelActionHandler.java index f64acec4..03f67e36 100644 --- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/DmmModelActionHandler.java +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/DmmModelActionHandler.java @@ -7,6 +7,7 @@ import org.apache.log4j.Logger; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.emf.ecore.xmi.DanglingHREFException; import edu.kit.ipd.descartes.adaptation.IActionHandler; import edu.kit.ipd.descartes.adaptation.exceptions.OperationNotPerformedException; @@ -44,7 +45,10 @@ public class DmmModelActionHandler implements IActionHandler { try { adaptProcessModelMgr.saveAll(); } catch (IOException e) { - logger.error("Error while saving models", e); + if (e.getCause() instanceof DanglingHREFException) + logger.error("Error while persisting results because of dangling references. Probably not all changes have been saved"); + else + logger.error("Error while saving models", e); } } diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/WeightingFunctionHelper.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/WeightingFunctionHelper.java index 4e92239f..c0770084 100644 --- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/WeightingFunctionHelper.java +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/WeightingFunctionHelper.java @@ -15,37 +15,43 @@ public class WeightingFunctionHelper { * * @param function * @param metricType - * @return - * Returns the weight of the {@code meticType} of the given {@code function}.<br> - * Returns {@code Double.NaN} if the {@code metricType} was not found. + * @return Returns the weight of the {@code meticType} of the given {@code function}.<br> + * Returns {@code Double.NaN} if the {@code metricType} was not found. */ - public static double getWeightForMetricType(WeightingFunction function, MetricType metricType) { - EList<WeightedMetric> weightedMetrics = function.getWeightedMetrics(); - - for (WeightedMetric weightedMetric : weightedMetrics) { - if (EcoreUtil.equals(weightedMetric.getMetricType(), metricType)) - return weightedMetric.getWeight(); - } - - return Double.NaN; - } - - /** - * Searches the {@link MetricValue} of the given {@link MetricType} in the - * {@link Result} <code>resultBefore</code> - * - * @param metricType The type of the metric to find - * @param resultBefore The result to search - * @return - */ - public static double getValueForMetricType(MetricType metricType, Result resultBefore) { - EList<MetricValue> metricValues = resultBefore.getMetricValues(); - - for (MetricValue metricValue : metricValues) { - if (metricValue.getMetricType().equals(metricType)) - return metricValue.getValue(); - } - return Double.NaN; - } + public static double getWeightForMetricType(WeightingFunction function, MetricType metricType) { + EList<WeightedMetric> weightedMetrics = function.getWeightedMetrics(); + for (WeightedMetric weightedMetric : weightedMetrics) { + if (EcoreUtil.equals(weightedMetric.getMetricType(), metricType)) + return weightedMetric.getWeight(); + } + + return Double.NaN; + } + + /** + * Searches the {@link MetricValue} of the given {@link MetricType} in the {@link Result} + * <code>resultBefore</code> + * + * @param metricType + * The type of the metric to find + * @param resultBefore + * The result to search + * @return + */ + public static double getValueForMetricType(MetricType metricType, Result resultBefore) { + EList<MetricValue> metricValues = resultBefore.getMetricValues(); + + for (MetricValue metricValue : metricValues) { + if (sameMetricType(metricValue, metricType)) + return metricValue.getValue(); + } + return Double.NaN; + } + + public static boolean sameMetricType(MetricValue metricValue, MetricType metricType) { +// return metricValue.getMetricType().equals(metricType); + return (metricValue.getMetricType().getName().equals(metricType.getName()) + && metricValue.getMetricType().getId().equals(metricType.getId())); + } } diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHandler.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHandler.java index 49047fbe..c2022c92 100644 --- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHandler.java +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHandler.java @@ -1,5 +1,7 @@ package edu.kit.ipd.descartes.adaptation.model.perfdatarepo; +import static edu.kit.ipd.descartes.adaptation.model.perfdatarepo.PerfDataRepoConverter.convertObservableImpact; + import org.apache.log4j.Logger; import org.eclipse.emf.common.util.URI; @@ -15,19 +17,19 @@ public class ObservationRepositoryHandler implements IPerformanceDataRepositoryH public ObservationRepositoryHandler() { modelLoader = new ObservationRepositoryModelLoader(); - logger.debug("ObservationRepositoryHandler instantiated."); + logger.debug("ObservationRepositoryHandler loaded."); } @Override public Impact getLatestImpact() { - // TODO Auto-generated method stub - return null; + return convertObservableImpact(repository.getLatestImpact()); } @Override public Impact getImpactAt(int position) { - // TODO Auto-generated method stub - return null; + if (position > repository.getImpacts().size() - 1) + return null; + return convertObservableImpact(repository.getImpacts().get(position)); } @Override diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryModelLoader.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryModelLoader.java index e53ffb32..8eeb911d 100644 --- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryModelLoader.java +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryModelLoader.java @@ -1,15 +1,45 @@ package edu.kit.ipd.descartes.adaptation.model.perfdatarepo; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; +import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; import edu.kit.ipd.descartes.adaptation.model.AbstractEcoreModelLoader; +import edu.kit.ipd.descartes.ql.models.repository.RepositoryPackage; public class ObservationRepositoryModelLoader extends AbstractEcoreModelLoader { + public static final EPackage[] OBSERVATION_REPO_EPACKAGES = new EPackage[] { + RepositoryPackage.eINSTANCE + }; + + private static ObservationRepositoryModelLoader instance = null; + + public static ObservationRepositoryModelLoader getInstance() { + if (instance == null) { + instance = new ObservationRepositoryModelLoader(); + } + return instance; + } + + public ObservationRepositoryModelLoader() { + initializeResourceSet(new ResourceSetImpl()); + } + @Override public void initializeResourceSet(ResourceSet resourceSet) { - // TODO Auto-generated method stub + setResourceSet(resourceSet); + + /* Register the default resource factory -- only needed for stand-alone! */ + getResourceSet().getResourceFactoryRegistry().getExtensionToFactoryMap() + .put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl()); + /* Register also the packages needed for the DMM meta model */ + for (EPackage ePackage : OBSERVATION_REPO_EPACKAGES) { + getResourceSet().getResourceFactoryRegistry().getExtensionToFactoryMap().put(ePackage.getNsURI(), ePackage); + } } } diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoConverter.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoConverter.java new file mode 100644 index 00000000..4905024b --- /dev/null +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoConverter.java @@ -0,0 +1,77 @@ +package edu.kit.ipd.descartes.adaptation.model.perfdatarepo; + +import java.util.ArrayList; +import java.util.Collection; + +import edu.kit.ipd.descartes.perfdatarepo.Impact; +import edu.kit.ipd.descartes.perfdatarepo.MeasuredEntity; +import edu.kit.ipd.descartes.perfdatarepo.MetricType; +import edu.kit.ipd.descartes.perfdatarepo.MetricValue; +import edu.kit.ipd.descartes.perfdatarepo.PerfdatarepoFactory; +import edu.kit.ipd.descartes.perfdatarepo.Result; +import edu.kit.ipd.descartes.ql.models.mapping.domain.DecimalResult; +import edu.kit.ipd.descartes.ql.models.mapping.domain.Entity; +import edu.kit.ipd.descartes.ql.models.mapping.domain.Probe; +import edu.kit.ipd.descartes.ql.models.mapping.domain.Resource; +import edu.kit.ipd.descartes.ql.models.mapping.domain.Service; +import edu.kit.ipd.descartes.ql.models.mapping.mapping.EntityMapping; +import edu.kit.ipd.descartes.ql.models.repository.ObservableImpact; +import edu.kit.ipd.descartes.ql.models.repository.Observation; + +public class PerfDataRepoConverter { + + public static Impact convertObservableImpact(ObservableImpact o) { + Impact impact = PerfdatarepoFactory.eINSTANCE.createImpact(); + impact.setId(o.getIdentifier()); + impact.setName("ObservableImpact (ID: " + o.getIdentifier() + ")"); + impact.setBefore(convertResult(o.getBefore())); + impact.setAfter(convertResult(o.getAfter())); + return impact; + } + + public static Result convertResult(Observation o) { + Result result = PerfdatarepoFactory.eINSTANCE.createResult(); + result.setId(o.getIdentifier()); + result.setName("Observation (ID: " + o.getIdentifier() + ")"); + Collection<MetricValue> values = convertMapping(o.getObservation()); + result.getMetricValues().addAll(values); + return result; + } + + public static Collection<MetricValue> convertMapping(EntityMapping observation) { + Collection<MetricValue> values = new ArrayList<MetricValue>(); + + for (Resource r : observation.getResources()) { + values.addAll(convertProbes(r)); + } + + for (Service s : observation.getServices()) { + values.addAll(convertProbes(s)); + } + + return values; + } + + private static Collection<MetricValue> convertProbes(Entity e) { + Collection<MetricValue> values = new ArrayList<MetricValue>(); + MetricType mType = PerfdatarepoFactory.eINSTANCE.createMetricType(); + mType.setName(e.getProbes().get(0).getMetricName()); + mType.setId(e.getProbes().get(0).getMetricName()); + MeasuredEntity entity = PerfdatarepoFactory.eINSTANCE.createMeasuredEntity(); + entity.setName(e.getAlias()); + entity.setId(e.getIdentifier()); + + for (Probe p : e.getProbes()) { + DecimalResult r = (DecimalResult) p; + MetricValue value = PerfdatarepoFactory.eINSTANCE.createMetricValue(); + value.setMeasuredEntity(entity); + value.setName(e.getAlias() + ": " + r.getMetricName()); + value.setMetricType(mType); + value.setValue(r.getValue().doubleValue()); + values.add(value); + } + + return values; + } + +} diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerformanceDataRepositoryHandler.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerformanceDataRepositoryHandler.java index ab913c1c..72305a2d 100644 --- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerformanceDataRepositoryHandler.java +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerformanceDataRepositoryHandler.java @@ -24,14 +24,12 @@ public class PerformanceDataRepositoryHandler implements IPerformanceDataReposit @Override public Impact getLatestImpact() { - // TODO Auto-generated method stub - return null; + return PerfDataRepoHelper.getLatestImpact(repository); } @Override public Impact getImpactAt(int position) { - // TODO Auto-generated method stub - return null; + return PerfDataRepoHelper.getImpactAt(repository, position); } } -- GitLab