eu.planets_project.tb.impl.services.EvaluationTestbedServiceTemplateImpl.java Source code

Java tutorial

Introduction

Here is the source code for eu.planets_project.tb.impl.services.EvaluationTestbedServiceTemplateImpl.java

Source

/*******************************************************************************
 * Copyright (c) 2007, 2010 The Planets Project Partners.
 *
 * All rights reserved. This program and the accompanying 
 * materials are made available under the terms of the 
 * Apache License, Version 2.0 which accompanies 
 * this distribution, and is available at 
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 *******************************************************************************/
package eu.planets_project.tb.impl.services;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Lob;
import javax.persistence.Transient;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import eu.planets_project.tb.api.model.benchmark.BenchmarkGoal;
import eu.planets_project.tb.api.model.benchmark.BenchmarkGoalsHandler;
import eu.planets_project.tb.impl.model.benchmark.BenchmarkGoalsHandlerImpl;
import eu.planets_project.tb.impl.model.eval.mockup.TecRegMockup;
import eu.planets_project.tb.impl.persistency.ExperimentPersistencyImpl;

/**
 * @author lindleya
 * This class provides information on the structure of the underlying evalution service
 * and how to access it's relevant information in it's service responds and beyond this
 * contains methods to apply this on a given DOM document.
 * 
 * for example a XCDL structure 
 * <property id="2" name="imageHeight" unit="pixel" compStatus="complete">
 *         <values type="int">
 *            <src>32</src>
 *            <tar>32</tar>
 *         </values>
 *         <metric id="200" name="equal" result="true"/>
 *         <metric id="201" name="intDiff" result="0"/>
 *         <metric id="210" name="percDev" result="0.000000"/>
 * </property>
 * The structure should of individual BMGoals used within this class must be the same
 */
@Entity
public class EvaluationTestbedServiceTemplateImpl extends TestbedServiceTemplateImpl
        implements Serializable, Cloneable {

    /** */
    private static final long serialVersionUID = 6394812915770350751L;

    //contains a mapping of the TB BenchmarkGoalID to the ID(name) used within the service's BMGoal result
    @Lob
    @Column(columnDefinition = ExperimentPersistencyImpl.BLOB_TYPE)
    private HashMap<String, String> mappingGoalIDToPropertyID = new HashMap<String, String>();
    private String sXPathForBMGoalRootNodes = "/*//property";
    //the extracted property's name
    private String sXPathForBMGoalName = "@name";
    private String sSrcXpath = "./values/src";
    private String sTarXpath = "./values/tar";
    private String sMetric = "./metric";
    private String sMetricName = "@name";
    private String sMetricResult = "@result";
    // This annotation specifies that the property or field is not persistent.
    @Transient
    @XmlTransient
    private static Log log = LogFactory.getLog(EvaluationTestbedServiceTemplateImpl.class);

    /** */
    public EvaluationTestbedServiceTemplateImpl() {
    }

    //the default (as used in XCDL) for compStatus success and failure
    public static String sCompStatusSuccess = "complete";
    private String sCompStatusXpath = "@compStatus";

    /**
     * Defines the Xpath Statement to look up the root note of a given TB Benchmark Goal
     * where all evaluation information can be found beneath - within the service's output
     * @param xPath
     */
    public void setXPathForBMGoalRootNodes(String xPath) {
        //in this example: <property>
        this.sXPathForBMGoalRootNodes = xPath;
    }

    public String getXPathForBMGoalRootNodes() {
        return sXPathForBMGoalRootNodes;
    }

    /**
     * Method for applying the XPathForBMGoalRootNodes on a given DOM Document
     * @param doc
     * @return
     * @throws XPathExpressionException
     */
    public NodeList getAllEvalResultsRootNodes(Document doc) throws XPathExpressionException {
        XPath xpath = XPathFactory.newInstance().newXPath();
        NodeList nodes = (NodeList) xpath.evaluate(sXPathForBMGoalRootNodes, doc, XPathConstants.NODESET);
        return nodes;
    }

    /**
     * Returns the root node containing all evaluation results for a given TB Benchmarkgoal
     * in the default case e.g. <property> would be returned
     * @param bmGoal
     */
    /*public void getBMGoalRootNode(BenchmarkGoal bmGoal){
           
    }*/

    /**
     * Defines the Xpath Statement to look up the name of a given TB Benchmark Goal
     * starting from the BMGoalRootNode. 
     * [no absolute path, relative to the property's root node]
     * @param xPath
     */
    public void setXPathForName(String xPath) {
        //in this example attribute: 'name'
        sXPathForBMGoalName = xPath;
    }

    public String getXPathForNameConfig() {
        return sXPathForBMGoalName;
    }

    /**
     * @param node a Node obtained by getAllEvalResultsRootNodes()
     * @return
     * @throws XPathExpressionException
     */
    public String getEvalResultName(Node node) throws XPathExpressionException {
        XPath xpath = XPathFactory.newInstance().newXPath();
        String result = (String) xpath.evaluate(sXPathForBMGoalName, node, XPathConstants.STRING);
        return result;
    }

    /**
     * Defines an XPath how to look up the value of of the src file within the service's output.
     * [no absolute path, relative to the property's root node]
     * @param xPath
     */
    public void setXPathForSrcValue(String xPath) {
        this.sSrcXpath = xPath;

    }

    public String getXPathForSrcConfig() {
        return sSrcXpath;
    }

    /**
     * @param node a Node obtained by getAllEvalResultsRootNodes()
     * @return
     * @throws XPathExpressionException
     */
    public String getEvalResultSrcValue(Node node) throws XPathExpressionException {
        XPath xpath = XPathFactory.newInstance().newXPath();
        String result = (String) xpath.evaluate(sSrcXpath, node, XPathConstants.STRING);
        return result;
    }

    /**
     * Defines an XPath how to look up the value of of the tar file within the service's output.
     * [no absolute path, relative to the property's root node]
     * @param xPath
     */
    public void setXPathForTarValue(String xPath) {
        this.sTarXpath = xPath;

    }

    public String getXPathForTarConfig() {
        return sTarXpath;
    }

    /**
     * @param node a Node obtained by getAllEvalResultsRootNodes()
     * @return
     * @throws XPathExpressionException
     */
    public String getEvalResultTarValue(Node node) throws XPathExpressionException {
        XPath xpath = XPathFactory.newInstance().newXPath();
        String result = (String) xpath.evaluate(sTarXpath, node, XPathConstants.STRING);
        return result;
    }

    /**
     * Defines an XPath how to look up the status of the computation for a property within the service's output.
     * [no absolute path, relative to the property's root node]
     * @param xPath
     */
    public void setXPathToCompStatus(String xPath) {
        sCompStatusXpath = xPath;
    }

    public String getXPathToCompStatus() {
        return sCompStatusXpath;
    }

    /**
     * @param node a Node obtained by getAllEvalResultsRootNodes()
     * @return
     * @throws XPathExpressionException
     */
    public String getEvalResultCompStatus(Node node) throws XPathExpressionException {
        XPath xpath = XPathFactory.newInstance().newXPath();
        String result = (String) xpath.evaluate(sCompStatusXpath, node, XPathConstants.STRING);
        return result;
    }

    /**
     * The string used to indicate success e.g. "complete" to compare the status of a property
     * within the extracted service output.
     * @param complete
     */
    public void setStringForCompStatusSuccess(String complete) {
        sCompStatusSuccess = complete;
    }

    public String getStringForCompStatusSuccess() {
        return sCompStatusSuccess;
    }

    /**
     * Defines an XPath how to look up the value of metric within the service's output.
     * [no absolute path, relative to the metrics's root node]
     * @param xPath
     */
    public void setXPathToMetricValue(String xPath) {
        sMetricResult = xPath;
    }

    public String getXPathToMetricResultConfig() {
        return sMetricResult;
    }

    /**
     * Defines an XPath how to look up the metric nodes within the service's output for a given property
     * [no absolute path, relative to the properties's root node]
     * @param xPath
     */
    public void setXPathToMetricNode(String xPath) {
        sMetric = xPath;
    }

    public String getXPathToMetricNodeConfig() {
        return sMetric;
    }

    /**
     * Defines an XPath how to look up the value of metric within the service's output.
     * [no absolute path, relative to the metrics's root node]
     * @param xPath
     */
    public void setXPathToMetricName(String xPath) {
        sMetricName = xPath;
    }

    public String getXPathToMetricNameConfig() {
        return sMetricName;
    }

    /**
     * @param node a Node obtained by getAllEvalResultsRootNodes()
     * @return LinkedHashMap<MetricName,MetricResult>
     * @throws XPathExpressionException
     */
    public Map<String, String> getEvalResultMetricNamesAndValues(Node node) throws XPathExpressionException {
        //get all metric nodes for this property
        NodeList metrics = getEvalResultMetricNodes(node);

        Map<String, String> ret = new LinkedHashMap<String, String>();

        if ((metrics != null) && (metrics.getLength() > 0)) {
            for (int i = 0; i < metrics.getLength(); i++) {
                //metric node
                Node n = metrics.item(i);

                //query the name
                XPath xpathName = XPathFactory.newInstance().newXPath();
                String name = (String) xpathName.evaluate(sMetricName, n, XPathConstants.STRING);
                //query the result
                XPath xpathResult = XPathFactory.newInstance().newXPath();
                String value = (String) xpathResult.evaluate(sMetricResult, n, XPathConstants.STRING);
                ret.put(name, value);

            }
        }
        return ret;
    }

    /**
     * @param node a Node obtained by getAllEvalResultsRootNodes()
     * @return
     * @throws XPathExpressionException
     */
    public NodeList getEvalResultMetricNodes(Node node) throws XPathExpressionException {
        XPath xpath = XPathFactory.newInstance().newXPath();
        NodeList result = (NodeList) xpath.evaluate(sMetric, node, XPathConstants.NODESET);
        return result;
    }

    /**
     * Specifies a mapping between a TB Benchmark Goal object (identified through it's name + id) and a PropertyName(=Metric)
     * Please note: the TB BMGoal must be available on this TB instance to create this mapping
     * @param BMGoalName
     * @param BMGoalID
     * @param PropertyName
     */
    public void setBMGoalPropertyNameMapping(String BMGoalName, String BMGoalID, String PropertyName) {
        BenchmarkGoalsHandler handler = BenchmarkGoalsHandlerImpl.getInstance();
        List<String> ids = handler.getAllBenchmarkGoalIDs();
        if (ids.contains(BMGoalID)) {
            BenchmarkGoal goal = handler.getBenchmarkGoal(BMGoalID);
            if (goal.getName().equals(BMGoalName)) {
                //now store the mapping
                this.mappingGoalIDToPropertyID.put(goal.getID(), PropertyName);
            } else {
                //ignore - TB internal BM goals are different ones.
                return;
            }
        } else {
            //ignore - BM Goal not supported on this machine
            return;
        }
    }

    /**
     * Returns a list of all BenchmarkGoalsIDs that contain a parameter mapping
     * within the service's output
     * @return Collection<BenchmarkGoalID>
     */
    public Collection<String> getAllMappedBenchmarkGoalIDs() {
        return this.mappingGoalIDToPropertyID.keySet();
    }

    /**
     * Returns a list of all available metrics for a specified bmGoal
     * NOTE: This is currently uses a mock implementation of the tec.registry to query parameters and values
     * e.g. xcdl properties, their metrics and fully qualified names of their return types
     * @param bmGoalID
     * @return <PropertyName,List<Map<keyword,value>>> 
     */
    public Map<String, List<Map<String, String>>> getAllAvailableMetricsForBMGoal(String bmGoalID) {

        Map<String, List<Map<String, String>>> ret = new HashMap<String, List<Map<String, String>>>();
        //BenchmarkGoalsHandler bmGoalHandler = BenchmarkGoalsHandlerImpl.getInstance();
        //BenchmarkGoal bmGoal = bmGoalHandler.getBenchmarkGoal(bmGoalID);

        //e.g. the xcdl property name
        String sPropName = this.getMappedPropertyName(bmGoalID);
        List<Map<String, String>> l = new ArrayList<Map<String, String>>();
        if (!sPropName.equals("")) {
            log.info("Looking for property: " + sPropName);

            //now query the technical registry for all details on this property
            String[] sMetricNames = (String[]) TecRegMockup
                    .getParameterVal(TecRegMockup.URI_XCDL_PROP_ROOT + sPropName + "/metrics");

            if (sMetricNames != null) {
                for (String sMname : sMetricNames) {
                    Map<String, String> m = new HashMap<String, String>();
                    String retType = (String) TecRegMockup.getParameterVal(
                            TecRegMockup.URI_XCDL_METRIC_ROOT + sMname + "/returndatatype/javaobjecttype");
                    String descr = (String) TecRegMockup
                            .getParameterVal(TecRegMockup.URI_XCDL_METRIC_ROOT + sMname + "/description");
                    if (retType != null) {
                        //e.g. "equal"
                        m.put("metricName", sMname);
                        m.put("javaobjecttype", retType);
                        if (descr != null) {
                            //the metric's description
                            m.put("metricDescription", descr);
                        }
                    }
                    l.add(m);
                }
                ret.put(sPropName, l);
            }
        }
        //else - don't add any information - e.g. registry broken, wrong bmGoal mapping, etc.

        return ret;
    }

    /**
     * Returns a list of all Metrics available for a certain BMGoal
     * @param BMGoalID
     * @return
     */
    public String getMappedPropertyName(String BMGoalID) {
        if (this.mappingGoalIDToPropertyID.containsKey(BMGoalID)) {
            return this.mappingGoalIDToPropertyID.get(BMGoalID);
        }
        return "";
    }

    public EvaluationTestbedServiceTemplateImpl clone() {
        EvaluationTestbedServiceTemplateImpl template = new EvaluationTestbedServiceTemplateImpl();
        template = (EvaluationTestbedServiceTemplateImpl) super.clone();

        return template;
    }

}