Package eu.planets_project.tb.gui.backing.exp.view

Source Code of eu.planets_project.tb.gui.backing.exp.view.MeasuredComparisonBean

/*******************************************************************************
* 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.exp.view;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

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

import eu.planets_project.services.compare.PropertyComparison.Equivalence;
import eu.planets_project.services.datatypes.Property;
import eu.planets_project.tb.gui.backing.exp.ExperimentInspector;
import eu.planets_project.tb.gui.backing.exp.MeasurementBean;
import eu.planets_project.tb.impl.model.eval.PropertyEvaluation;
import eu.planets_project.tb.impl.model.eval.PropertyEvaluation.EquivalenceStatement;
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.TargetType;

/**
*
* @author Andrew.Jackson@bl.uk
*
*/
public class MeasuredComparisonBean
                    implements Serializable, Comparable<MeasuredComparisonBean> {
   
    private static final long serialVersionUID = 8134383234470113727L;

    static private Log log = LogFactory.getLog(MeasuredComparisonBean.class);
   
    private Property property;
    private PropertyEvaluation propertyEvaluation;
   
    protected List<MeasurementBean> first = new ArrayList<MeasurementBean>();
    protected List<MeasurementBean> second = new ArrayList<MeasurementBean>();
    protected List<MeasurementBean> compared = new ArrayList<MeasurementBean>();

    /**
     * @param propertyUri
     */
    public MeasuredComparisonBean( Property property, PropertyEvaluation propertyEvaluation ) {
        this.property = property;
        this.propertyEvaluation = propertyEvaluation;
    }
       
    public boolean isEqual() {
        if( this.getUserEquivalence() == EquivalenceStatement.EQUAL ) {
            return true;
        }
        return false;
    }
   
    /**
     * @return the property
     */
    public Property getProperty() {
        return property;
    }

    /**
     * @return the compared
     */
    public List<MeasurementBean> getCompared() {
        return compared;
    }

    /**
     * @return the firstMeasured
     */
    public List<MeasurementBean> getFirst() {
        return first;
    }

    /**
     * @return the secondMeasured
     */
    public List<MeasurementBean> getSecond() {
        return second;
    }

    /* (non-Javadoc)
     * @see java.lang.Comparable#compareTo(java.lang.Object)
     */
    public int compareTo(MeasuredComparisonBean o) {
        if( o.getProperty() != null && o.getProperty().getName() != null ) {
            if( this.getProperty() != null && this.getProperty().getName() != null ) {
                return this.getProperty().getName().compareTo( o.getProperty().getName() );
            }
        }
        return 0;
    }
   
    /**
     * @return
     */
    public List<MeasurementBean> getAllFirstMeasured() {
        List<MeasurementBean> mb = new ArrayList<MeasurementBean>(this.first);
        for( MeasurementBean cm : compared ) {
            if( cm.getTarget().getDigitalObjectProperties(0) != null &&
                cm.getTarget().getDigitalObjectProperties(0).size() > 0 )
             mb.add( new MeasurementBean( cm.getEvent(),
                     new MeasurementImpl( cm.getEvent(), cm.getTarget().getDigitalObjectProperties(0).get(0) ) ) );
        }
        return mb;
    }
   
    /**
     * @return
     */
    public List<MeasurementBean> getAllSecondMeasured() {
        List<MeasurementBean> mb = new ArrayList<MeasurementBean>(this.second);
        for( MeasurementBean cm : compared ) {
            if( cm.getTarget().getDigitalObjectProperties(1) != null &&
                cm.getTarget().getDigitalObjectProperties(1).size() > 1 )
             mb.add( new MeasurementBean( cm.getEvent(),
                     new MeasurementImpl( cm.getEvent(), cm.getTarget().getDigitalObjectProperties(1).get(1) ) ) );
        }
        return mb;
    }

    /**
     * @return
     */
    public List<MeasurementBean> getAllCompared() {
        // FIXME Add dumb comparisons of properties here?
        return compared;
    }
   
    /**
     * @return
     */
    public boolean isAllComparedEmpty() {
        if( this.compared == null || this.compared.size() == 0 ) return true;
        return false;
    }
   
    /**
     * @return
     */
    public EquivalenceStatement getUserEquivalence() {
        return getPropertyEvaluation().getUserEquivalence();
    }
   
    /**
     * @return
     */
    public void setUserEquivalence( EquivalenceStatement es ) {
        // Update if needed.
        if( getPropertyEvaluation().getUserEquivalence() != es ) {
            getPropertyEvaluation().setUserEquivalence(es);
            ExperimentInspector.persistExperiment();
        }
    }
   
    /**
     * @return
     */
    public String getUserEquivalenceComment() {
        if( getPropertyEvaluation() == null ) return "";
        return getPropertyEvaluation().getUserEquivalenceComment();
    }

    /**
     * @param me
     * @param dobUri1
     * @param dobUri2
     * @param peval
     * @return
     */
    public static List<MeasuredComparisonBean> createFromEvents(
            String dobUri1, String dobUri2, Vector<PropertyEvaluation> pevals, MeasurementEventImpl ... mes ) {
        Map<String,MeasuredComparisonBean> cmp = new HashMap<String,MeasuredComparisonBean>();
        for( MeasurementEventImpl me : mes ) {
            if( me.getMeasurements() != null ) {
                log.info("Looking for comparisons out of "+me.getMeasurements().size());
                for( MeasurementImpl m : me.getMeasurements() ) {
                    // Create the comparison object:
                    if(m.getTarget().getType() == TargetType.DIGITAL_OBJECT_PAIR ) {
                        MeasuredComparisonBean mb = new MeasuredComparisonBean(
                                m.getProperty(),
                                findPropertyEvaluation(pevals,m) );
                        mb.getCompared().add(new MeasurementBean(me, m) );
                        cmp.put( m.getIdentifier(), mb );
                    } else if( m.getTarget().getType() == TargetType.DIGITAL_OBJECT ) {
                        MeasuredComparisonBean mcb = cmp.get(m.getIdentifier());
                        if( mcb == null ) {
                            mcb = new MeasuredComparisonBean(
                                    m.getProperty(),
                                    findPropertyEvaluation(pevals,m) );
                            cmp.put(m.getIdentifier(), mcb);
                        }
                        if( dobUri1.equals(m.getTarget().getDigitalObjects().firstElement())) {
                            mcb.getFirst().add(new MeasurementBean(me,m));
                        } else if( dobUri2.equals(m.getTarget().getDigitalObjects().firstElement())) {
                            mcb.getSecond().add(new MeasurementBean(me,m));
                        }
                    }
                }
            }
        }
        // Extract:
        List<MeasuredComparisonBean> cms = new ArrayList<MeasuredComparisonBean>(cmp.values());
        // Sort:
        Collections.sort(cms);
        return cms;
    }
   
    private static PropertyEvaluation findPropertyEvaluation( Vector<PropertyEvaluation> pevals, MeasurementImpl m ) {
        for( PropertyEvaluation peval : pevals ) {
            if( peval.getPropertyUri().equals( m.getIdentifierUri() ) ) return peval;
        }
        // Or make a new one:
        PropertyEvaluation peval = new PropertyEvaluation(m.getIdentifierUri());
        pevals.add(peval);
        return peval;
    }
   
    /**
     * @return
     */
    private PropertyEvaluation getPropertyEvaluation() {
        // Look up the property evaluation associated with this.
        if( this.propertyEvaluation == null ) {
            propertyEvaluation = new PropertyEvaluation( this.getProperty().getUri() );
        }
        // If not set, default to the equivalence from the measurement.
        if( propertyEvaluation.getUserEquivalence() == null ) {
            Equivalence eqv = this.getEquivalence();
            if( eqv == Equivalence.EQUAL ) {
                propertyEvaluation.setUserEquivalence( EquivalenceStatement.EQUAL );
            } else if( eqv == Equivalence.DIFFERENT ) {
                propertyEvaluation.setUserEquivalence( EquivalenceStatement.DIFFERENT );
            } else if( eqv == Equivalence.MISSING ) {
                propertyEvaluation.setUserEquivalence( EquivalenceStatement.MISSING );
            }
        }
        return propertyEvaluation;
    }

    /**
     * @return
     */
    public Equivalence getEquivalence() {
        // Default to the first comparison property:
        if( this.compared != null && this.compared.size() > 0 ) {
            log.info("Compared: "+this.compared.size()+" "+this.compared.get(0).getName()+" "+this.compared.get(0).getEquivalence());
            return this.compared.get(0).getEquivalence();
        }
        // Otherwise, look at the property sets
        if( this.first != null && this.second !=null ) {
            if( this.first.size() == this.second.size() ) {
                // Clone the second list, so we can remove them as the matches come.
                List<MeasurementBean> secondClone = new ArrayList<MeasurementBean>(second);
                // Now look for matches and differences:
                int diffs = 0;
                int misses = 0;
                for( MeasurementBean m1 : first ) {
                    // Look for matching MeasurementBean
                    boolean matched = false;
                    MeasurementBean match = null;
                    for( MeasurementBean m2 : secondClone ) {
                        if( m1.getProperty().getUri().equals( m2.getProperty().getUri()) ) {
                            matched = true;
                            match = m2;
                            if( ! m1.getValue().equals( m2.getValue()) ) {
                                diffs++;
                            }
                            break;
                        }
                    }
                    if( matched ) secondClone.remove(match);
                    if( !matched ) misses++;
                }
                if( misses > 0 ) return Equivalence.MISSING;
                if( diffs > 0 ) return Equivalence.DIFFERENT;
                return Equivalence.EQUAL;
            } else {
                return Equivalence.MISSING;
            }
        }
        log.info("Compared: "+this.compared);
        return Equivalence.UNKNOWN;
    }
   
}
TOP

Related Classes of eu.planets_project.tb.gui.backing.exp.view.MeasuredComparisonBean

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.