Package eu.planets_project.tb.gui.backing.data

Source Code of eu.planets_project.tb.gui.backing.data.DigitalObjectCompare

/*******************************************************************************
* 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.gui.backing.data;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.faces.model.SelectItem;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import eu.planets_project.ifr.core.storage.api.DataRegistry;
import eu.planets_project.ifr.core.storage.api.DataRegistryFactory;
import eu.planets_project.services.characterise.Characterise;
import eu.planets_project.services.characterise.CharacteriseResult;
import eu.planets_project.services.compare.Compare;
import eu.planets_project.services.compare.CompareResult;
import eu.planets_project.services.compare.PropertyComparison;
import eu.planets_project.services.compare.PropertyComparison.Equivalence;
import eu.planets_project.services.datatypes.Property;
import eu.planets_project.services.datatypes.ServiceDescription;
import eu.planets_project.services.datatypes.ServiceReport;
import eu.planets_project.services.identify.Identify;
import eu.planets_project.services.identify.IdentifyResult;
import eu.planets_project.tb.api.properties.ManuallyMeasuredProperty;
import eu.planets_project.tb.gui.UserBean;
import eu.planets_project.tb.gui.backing.ExperimentBean;
import eu.planets_project.tb.gui.backing.ServiceBrowser;
import eu.planets_project.tb.gui.backing.exp.ExperimentInspector;
import eu.planets_project.tb.gui.backing.exp.MeasuredComparisonEventBean;
import eu.planets_project.tb.gui.backing.exp.ResultsForDigitalObjectBean;
import eu.planets_project.tb.gui.backing.exp.utils.ManualMeasurementBackingBean;
import eu.planets_project.tb.gui.backing.exp.view.MeasuredComparisonBean;
import eu.planets_project.tb.gui.util.JSFUtil;
import eu.planets_project.tb.impl.model.eval.PropertyEvaluation;
import eu.planets_project.tb.impl.model.exec.ExecutionRecordImpl;
import eu.planets_project.tb.impl.model.measure.MeasurementAgent;
import eu.planets_project.tb.impl.model.measure.MeasurementEventImpl;
import eu.planets_project.tb.impl.model.measure.MeasurementImpl;
import eu.planets_project.tb.impl.model.measure.MeasurementTarget;
import eu.planets_project.tb.impl.model.measure.MeasurementAgent.AgentType;
import eu.planets_project.tb.impl.model.measure.MeasurementTarget.TargetType;
import eu.planets_project.tb.impl.properties.ManuallyMeasuredPropertyHandlerImpl;
import eu.planets_project.tb.impl.services.mockups.workflow.IdentifyWorkflow;
import eu.planets_project.tb.impl.services.wrappers.CharacteriseWrapper;
import eu.planets_project.tb.impl.services.wrappers.CompareWrapper;
import eu.planets_project.tb.impl.services.wrappers.IdentifyWrapper;

/**
* @author AnJackson
*
*/
public class DigitalObjectCompare {
   
    static private Log log = LogFactory.getLog(DigitalObjectCompare.class);
   
    // The data sources are managed here:
    DataRegistry dataRegistry = DataRegistryFactory.getDataRegistry();
   
    private String dobUri1;
    private String dobUri2;


    /**
     * @return the dob1
     */
    public String getDobUri1() {
        return dobUri1;
    }

    /**
     * @param dobUri the dobUri to set
     */
    public void setDobUri1(String dobUri1) {
        dobUri1 = DigitalObjectInspector.uriEncoder(dobUri1).toASCIIString();
        this.dobUri1 = dobUri1;
    }
   
    /**
     * @return the dob1
     */
    public String getDobUri2() {
        return dobUri2;
    }

    /**
     * @param dobUri the dobUri to set
     */
    public void setDobUri2(String dobUri2) {
        dobUri2 = DigitalObjectInspector.uriEncoder(dobUri2).toASCIIString();
        this.dobUri2 = dobUri2;
    }
   
    /**
     * @param dobUri
     * @return
     */
    static public DigitalObjectTreeNode lookupDob( String dobUri ) {
        if( dobUri == null ) return null;
        // Create as a URI:
        URI item;
        try {
            item = new URI(dobUri);
        } catch (URISyntaxException e) {
            e.printStackTrace();
            return null;
        }
        // Lookup and return:
        DigitalObjectTreeNode itemNode = new DigitalObjectTreeNode(item, DataRegistryFactory.getDataRegistry() );
        return itemNode;
    }
   
    public DigitalObjectTreeNode getDob1() {
        return lookupDob(this.dobUri1);
    }
   
    public DigitalObjectTreeNode getDob2() {
        return lookupDob(this.dobUri2);
    }
   
    /* -------------------- Additional code for deeper inspection --------------------- */

    /** */
    private String compareService;
    private ServiceReport compareServiceReport;
    private String compareServiceException;
    private String compareServiceStackTrace;
    private MeasurementEventImpl me;

    /**
     * @return the compareService
     */
    public String getCompareService() {
        return compareService;
    }

    /**
     * @param compareService the compareService to set
     */
    public void setCompareService(String compareService) {
        this.compareService = compareService;
    }
   
    public void runCompareService() {
        log.info("Looking for properties using: "+this.getCompareService());
       
        // Reset:
        this.compareServiceReport = null;
        this.compareServiceException = null;
        this.compareServiceStackTrace = null;
       
        // Return nothing if no service is selected:
        if( this.getCompareService() == null ) return;
       
        // Run the service:
        try {
            URL surl = new URL(this.getCompareService());
           
            Map<URL, ServiceDescription> compareServices = this.getCompareServices();
            ServiceDescription sd = compareServices.get(surl);
           
            if( sd.getType().equals(Compare.class.getCanonicalName()) ) {

                Compare chr = new CompareWrapper(surl);
                CompareResult cr = chr.compare( this.getDob1().getDob(), this.getDob2().getDob(), null);
                this.compareServiceReport = cr.getReport();

                me = this.createMeasurementEvent();
                if( me != null ) {
                    this.fillComparisonEvent(me, chr, cr);
                    ExperimentInspector.persistExperiment();
                }
               
            } else if(sd.getType().equals(Identify.class.getCanonicalName())) {
                Identify idf = new IdentifyWrapper(surl);
                IdentifyResult ir1 = idf.identify( this.getDob1().getDob(), null);
                this.compareServiceReport = ir1.getReport();
                IdentifyResult ir2 = idf.identify( this.getDob2().getDob(), null);
                this.compareServiceReport = ir2.getReport();
               
                me = this.createMeasurementEvent();
                if( me != null ) {
                    me.setAgent(new MeasurementAgent(idf.describe()));
                    me.setDate(Calendar.getInstance());
                    this.recordIdentifyComparison(me, ir1, this.getDobUri1(), ir2, this.getDobUri2() );
                   
                    ExperimentInspector.persistExperiment();
                }
               
            } else if(sd.getType().equals(Characterise.class.getCanonicalName())) {
                Characterise chr = new CharacteriseWrapper( surl );
                CharacteriseResult cr1 = chr.characterise( this.getDob1().getDob(), null);
                this.compareServiceReport = cr1.getReport();
                CharacteriseResult cr2 = chr.characterise( this.getDob2().getDob(), null);
                this.compareServiceReport = cr2.getReport();
               
                me = this.createMeasurementEvent();
                if( me != null ) {
                    me.setAgent(new MeasurementAgent(chr.describe()));
                    me.setDate(Calendar.getInstance());
                    this.recordPropertyComparison(me, cr1.getProperties(), this.getDobUri1(), cr2.getProperties(), this.getDobUri2() );
                   
                    ExperimentInspector.persistExperiment();
                }
               
            } else {
                this.compareServiceException = "ERROR: Do not know how to invoke this service!";
                log.error("Could not invoke service: "+this.getCompareService());
            }
           
            return;
        } catch( Exception e ) {
            log.error("FAILED! "+e);
            this.compareServiceException = e.toString();
           
            this.compareServiceStackTrace = this.stackTraceToString(e);
            e.printStackTrace();
           
            return;
        }
    }
   
    /**
     * @param me
     * @param chr
     * @param cr
     */
    private void fillComparisonEvent(MeasurementEventImpl me, Compare chr, CompareResult cr) {
        me.setAgent(new MeasurementAgent(chr.describe()));
        me.setDate(Calendar.getInstance());
        for( PropertyComparison pc : cr.getComparisons() ) {
            MeasurementImpl m = new MeasurementImpl( me, pc.getComparison());
            MeasurementTarget mt = new MeasurementTarget();
            mt.setType(TargetType.DIGITAL_OBJECT_PAIR);
            // Get data on the first object:
            mt.getDigitalObjects().add(0, this.getDobUri1() );
            mt.setDigitalObjectProperties(0, pc.getFirstProperties());
            log.info("Got PC1: "+pc.getFirstProperties());
            // Get data on the second object:
            mt.getDigitalObjects().add(1, this.getDobUri2() );
            mt.setDigitalObjectProperties(1, pc.getSecondProperties());
            log.info("Got PC2: "+pc.getSecondProperties());
            // Add to the measurement:
            m.setTarget( mt );
            // Equivalence Data:
            m.setEquivalence(pc.getEquivalence());
            me.addMeasurement(m);
        }
    }

    /**
     */
    private void recordIdentifyComparison(MeasurementEventImpl me,
            IdentifyResult ir1, String dobUri1, IdentifyResult ir2,
            String dobUri2) {
        this.recordIdentifyMeasurement(me, ir1, dobUri1);
        this.recordIdentifyMeasurement(me, ir2, dobUri2);
    }

    private void recordIdentifyMeasurement( MeasurementEventImpl me, IdentifyResult ir, String dob ) {
        for( URI fmt : ir.getTypes() ) {
            MeasurementImpl m = new MeasurementImpl(IdentifyWorkflow.MEASURE_IDENTIFY_FORMAT);
            m.setValue(fmt.toASCIIString());
            m.setTarget( new MeasurementTarget() );
            m.getTarget().setType(TargetType.DIGITAL_OBJECT);
            m.getTarget().getDigitalObjects().add( dob );
            me.addMeasurement(m);

        }
        // Also record the method:
        if( ir.getMethod() != null ) {
            MeasurementImpl m = new MeasurementImpl(IdentifyWorkflow.MEASURE_IDENTIFY_METHOD);
            m.setValue(ir.getMethod().name());
            m.setTarget( new MeasurementTarget() );
            m.getTarget().setType(TargetType.DIGITAL_OBJECT);
            m.getTarget().getDigitalObjects().add( dob );
            me.addMeasurement(m);
        }
    }
   
    private void recordPropertyComparison(MeasurementEventImpl me,
            List<Property> properties1, String dobUri1,
            List<Property> properties2, String dobUri2) {
        this.recordPropertyMeasurements(me, properties1, dobUri1);
        this.recordPropertyMeasurements(me, properties2, dobUri2);
    }

    private void recordPropertyMeasurements( MeasurementEventImpl me, List<Property> props, String dob ) {
        for( Property p : props ) {
            MeasurementImpl m = new MeasurementImpl(me,p);
            m.setTarget( new MeasurementTarget() );
            m.getTarget().setType(TargetType.DIGITAL_OBJECT);
            m.getTarget().getDigitalObjects().add(dob);
            me.addMeasurement(m);
        }
    }
   
    /**
     * @return
     */
    public ServiceReport getCompareServiceReport() {
        return compareServiceReport;
    }

    /**
     * @return the compareServiceException
     */
    public String getCompareServiceException() {
        return compareServiceException;
    }

    /**
     * @return the compareServiceStackTrace
     */
    public String getCompareServiceStackTrace() {
        return compareServiceStackTrace;
    }

    /**
     * @return
     */
    public MeasurementEventImpl getMeasurementEvent() {
        return this.me;
    }

    /**
     * @return
     */
    public List<SelectItem> getCompareServiceList() {
        log.info("IN: getCompareServiceList");
/*
        String input = this.getInputFormat();
        if( ! this.isInputSet() ) input = null;
        String output = this.getOutputFormat();
        if( ! this.isOutputSet() ) output = null;
*/
        List<ServiceDescription> sdl = new ArrayList<ServiceDescription>(this.getCompareServices().values());

        return ServiceBrowser.mapServicesToSelectList( sdl);
    }
   
    private Map<URL,ServiceDescription> getCompareServices() {
        Map<URL,ServiceDescription> map = new HashMap<URL,ServiceDescription>();
       
        // Find all services:
        ServiceBrowser sb = (ServiceBrowser)JSFUtil.getManagedObject("ServiceBrowser");
        List<ServiceDescription> sdl = sb.getCompareServices();
        sdl.addAll(sb.getCharacteriseServices());
        sdl.addAll(sb.getIdentifyServices());

        // Create map:
        for( ServiceDescription sd : sdl ) {
            map.put(sd.getEndpoint(), sd);
        }
       
        return map;
    }
   
    /* ------------------------------------------ */

    protected String stackTraceToString( Exception e ) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        e.printStackTrace(pw);
        return sw.toString();
    }
   
   
    /**
     * Truncates the property values at a max. fixed length of 500 chars
     * @return
     */
    private static List<Property> truncatePropertyValues(List<Property> in){
      List<Property> ret = new ArrayList<Property>();
       //iterate over the properties and truncate when more than 500 chars
        if((in==null)||(in.size()<=0)){
          return ret;
        }
      for(Property p : in){
          if(p.getValue().length()>500){
            //add a truncated value String
            ret.add(new Property(p.getUri(),p.getName(),p.getValue().substring(0, 500)+"[..]"));
          }else{
            //add the original result
            ret.add(p);
          }
        }
      return ret;
    }
   
    /**
     * @return
     */
    public List<MeasuredComparisonBean> getMeasurementComparisons() {
        List<MeasuredComparisonBean> ms = new ArrayList<MeasuredComparisonBean>();
        ResultsForDigitalObjectBean res = new ResultsForDigitalObjectBean(this.getDobUri1());
        if( res == null || res.getExecutionRecord() == null ) {
            if( this.me != null ) {
                log.info("Pulling getExperimentMeasurements from the temporary space.");
                ms.addAll( MeasuredComparisonBean.createFromEvents( this.getDobUri1(), this.getDobUri2(), null, this.me ) );
            }
            log.info("Got getExperimentMeasurements "+ms.size());
            return ms;
        }
        // Otherwise, pull from DB:
        log.info("Pulling getExperimentMeasurements from the DB.");
        Set<MeasurementEventImpl> measurementEvents = res.getExecutionRecord().getMeasurementEvents();
        List<MeasurementEventImpl> mevl = new ArrayList<MeasurementEventImpl>(measurementEvents);
        Collections.sort(mevl, Collections.reverseOrder());
        ms.addAll( MeasuredComparisonBean.createFromEvents( this.getDobUri1(), this.getDobUri2(), res.getExecutionRecord().getPropertyEvaluation(), mevl.toArray(new MeasurementEventImpl[mevl.size()] ) ) );
        log.info("Got getExperimentMeasurements from Events, "+ms.size()+" out of "+mevl.size());
        return ms;
    }
   
    /**
     * Get any stored measurements:
     *
     * @return
     */
    public List<MeasurementEventImpl> getMeasurementEvents() {
        List<MeasurementEventImpl> ms = new ArrayList<MeasurementEventImpl>();
        ResultsForDigitalObjectBean res = new ResultsForDigitalObjectBean(this.getDobUri1());
        if( res == null || res.getExecutionRecord() == null ) {
            if( this.me != null ) {
                log.info("Pulling getExperimentMeasurements from the temporary space.");
                ms.add(this.me);
            }
            log.info("Got getExperimentMeasurements "+ms.size());
            return ms;
        }
        // Otherwise, pull from DB:
        log.info("Pulling getExperimentMeasurements from the DB.");
        Set<MeasurementEventImpl> measurementEvents = res.getExecutionRecord().getMeasurementEvents();
        ms.addAll(measurementEvents);
        return ms;
    }
   
    /**
     * @return
     */
    public MeasuredComparisonEventBean getManualMeasurementEventBean() {
        MeasurementEventImpl me = this.getManualMeasurementEvent();
        MeasuredComparisonEventBean meb = new MeasuredComparisonEventBean( me, this.getDobUri1(), this.getDobUri2() );
        return meb;
    }
   
    /**
     * @return
     */
    private MeasurementEventImpl getManualMeasurementEvent() {
        MeasurementEventImpl me = null;
        ResultsForDigitalObjectBean res = new ResultsForDigitalObjectBean(this.getDobUri1());
        if( res == null || res.getExecutionRecord() == null ) return null;
        Set<MeasurementEventImpl> measurementEvents = res.getExecutionRecord().getMeasurementEvents();
        for( MeasurementEventImpl mee : measurementEvents ) {
            if( mee.getAgent() != null && mee.getAgent().getType() == AgentType.USER ) {
                me = mee;
            }
        }
        // If none, create one and pass it back.
        if( me == null ) {
            log.info("Creating Manual Measurement Event.");
            me = this.createMeasurementEvent();
            UserBean user = (UserBean)JSFUtil.getManagedObject("UserBean");
            me.setAgent( new MeasurementAgent( user ));
            ExperimentInspector.persistExperiment();
        }
        return me;
    }
   
    private String newManVal1;
    private String newManVal2;
    //private String newManCmp;
    //private EquivalenceStatement newManEqu;
   
    /**
     * @return the newManVal1
     */
    public String getNewManVal1() {
        return newManVal1;
    }

    /**
     * @param newManVal1 the newManVal1 to set
     */
    public void setNewManVal1(String newManVal1) {
        this.newManVal1 = newManVal1;
    }

    /**
     * @return the newManVal2
     */
    public String getNewManVal2() {
        return newManVal2;
    }

    /**
     * @param newManVal2 the newManVal2 to set
     */
    public void setNewManVal2(String newManVal2) {
        this.newManVal2 = newManVal2;
    }


    /**
     */
    public void storeManualMeasurement() {
        // Look up the definition:
        ManuallyMeasuredPropertyHandlerImpl mm = ManuallyMeasuredPropertyHandlerImpl.getInstance();
        UserBean user = (UserBean)JSFUtil.getManagedObject("UserBean");
        ManualMeasurementBackingBean mmbb = (ManualMeasurementBackingBean)JSFUtil.getManagedObject("ManualMeasurementBackingBean");
        List<ManuallyMeasuredProperty> mps = mm.loadAllManualProperties(user.getUserid());
        ManuallyMeasuredProperty mp = null;
        for( ManuallyMeasuredProperty amp : mps ) {
            if( amp.getURI().equals(mmbb.getNewManProp()) ) mp = amp;
        }
        if( mp == null ) {
            log.error("No property ["+mmbb.getNewManProp()+"] found!");
            return;
        }
        // Lookup the event:
        MeasurementEventImpl mev = this.getManualMeasurementEvent();
        // Make the property
        Property p = new Property.Builder( URI.create(mp.getURI()) ).description(mp.getDescription()).name(mp.getName()).build();
        DigitalObjectCompare.createMeasurement(mev, p, this.dobUri1, this.newManVal1 );
        DigitalObjectCompare.createMeasurement(mev, p, this.dobUri2, this.newManVal2 );
        ExperimentInspector.persistExperiment();
    }

    /**
     */
    public void updateManualMeasurementEnvironment() {
        ExperimentInspector.persistExperiment();
    }
   
    /**
     * A single-property measurement:
     * @param p
     * @param dobUri
     * @param value
     */
    public static void createMeasurement(MeasurementEventImpl mev, Property p, String dobUri, String value ) {
        // Make
        MeasurementImpl m = new MeasurementImpl(mev);
        // Create a property from the manual one:
        m.setProperty( new Property.Builder(p).build() );
        //m.setUserEquivalence(this.newManEqu);
        m.setEquivalence( Equivalence.UNKNOWN );
        m.setValue(value);
        MeasurementTarget target = new MeasurementTarget();
        target.setType(TargetType.DIGITAL_OBJECT);
        target.getDigitalObjects().add(0, dobUri);
        /*
        target.setDigitalObjectProperty( 0,
                    new Property.Builder( p ).value(value).build()
                );
        */
        m.setTarget(target);
        // And add it, and persist:
        mev.addMeasurement(m);
    }
   
   
    /**
     * @return
     */
    public String getManualMeasurementEnvironment() {
        if( this.getManualMeasurementEvent() == null ) return "";
        return this.getManualMeasurementEvent().getAgent().getUserEnvironmentDescription();
    }
   
    public void setManualMeasurementEnvironment( String env ) {
        this.getManualMeasurementEvent().getAgent().setUserEnvironmentDescription(env);
    }

    /**
     * @return
     */
    private MeasurementEventImpl createMeasurementEvent() {
        ResultsForDigitalObjectBean res = new ResultsForDigitalObjectBean(this.getDobUri1());
        // If there is no experiment, return a non-DB event:
        if( res == null ) return new MeasurementEventImpl((ExecutionRecordImpl)null);
        if( res.getExecutionRecord() == null ) return new MeasurementEventImpl((ExecutionRecordImpl)null);
       
        // Otherwise, create an event that is attached to the experiment:
        MeasurementEventImpl me = new MeasurementEventImpl(res.getExecutionRecord());
        res.getExecutionRecord().getMeasurementEvents().add(me);
        return me;
    }   

    /**
     *
     */
    public void redirectBackToCompare() {
        ExperimentBean expBean = (ExperimentBean)JSFUtil.getManagedObject("ExperimentBean");
        if( expBean == null ) {
            JSFUtil.redirect("/reader/dob_compare.faces?eid=dobUri1="+this.getDobUri1()+"&dobUri2="+this.getDobUri2());
        }
        JSFUtil.redirect("/exp/dob_compare.faces?eid="+expBean.getExperiment().getEntityID()+"&dobUri1="+this.getDobUri1()+"&dobUri2="+this.getDobUri2());
   }

    /**
     * @return
     */
    public List<SelectItem> getEquivalenceOptions() {
        return PropertyEvaluation.getEquivalenceOptions();
    }
}
TOP

Related Classes of eu.planets_project.tb.gui.backing.data.DigitalObjectCompare

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.