fr.inria.wimmics.prissma.selection.entities.ContextUnit.java Source code

Java tutorial

Introduction

Here is the source code for fr.inria.wimmics.prissma.selection.entities.ContextUnit.java

Source

/**
 * PRISSMA is a presentation-level framework for Linked Data adaptation.
 *
 * Copyright (C) 2013 Luca Costabello, v1.0
 * 
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
 * for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, see <http://www.gnu.org/licenses/>.
 */

package fr.inria.wimmics.prissma.selection.entities;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.Period;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;
import org.joda.time.format.ISOPeriodFormat;
import org.joda.time.format.PeriodFormatter;

import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.Statement;

import fr.inria.wimmics.prissma.selection.PrissmaProperties;
import fr.inria.wimmics.prissma.selection.exceptions.ContextUnitException;

public class ContextUnit {

    public CtxUnitType type;
    public RDFNode instance;

    public ContextUnit(CtxUnitType type) {
        this.type = type;
    }

    public String toString() {
        return instance + ", type: " + type;
    }

    /**
     * Retrieves the specified property value from the context unit.
     * Used by GEO and TIME context units.
     * @param prop
     * @return
     * @throws ContextUnitException
     */
    public double getComplexCtxUnitProp(Property prop) throws ContextUnitException {

        if (!instance.isResource())
            throw new ContextUnitException();

        if (this.type != CtxUnitType.GEO && this.type != CtxUnitType.TIME && instance.isResource())
            throw new ContextUnitException();
        else {
            Statement stat = ((Resource) instance).getProperty(prop);
            if (stat == null)
                throw new ContextUnitException();

            // TIME conversions
            if (prop.equals(PrissmaProperties.pStart)) {
                String timeStr = stat.getLiteral().getString();
                DateTimeFormatter dtf = ISODateTimeFormat.timeParser();
                DateTime startTime = dtf.withZone(DateTimeZone.UTC).parseDateTime(timeStr); // UTC by default
                long millis = startTime.getMillis();
                long seconds = millis / 1000;
                return seconds;
            } else if (prop.equals(PrissmaProperties.pDuration)) {
                String durationStr = stat.getLiteral().getString();
                PeriodFormatter pf = ISOPeriodFormat.standard();
                Period period = pf.parsePeriod(durationStr);
                int seconds = period.toStandardSeconds().getSeconds();
                return seconds;
            }
            return stat.getLiteral().getDouble();
        }
    }

    @Override
    public boolean equals(Object obj) {

        if (!obj.getClass().equals(ContextUnit.class))
            return false;

        ContextUnit unitToComp = (ContextUnit) obj;

        if (this.type == unitToComp.type) {

            if (this.type.equals(CtxUnitType.GEO) || this.type.equals(CtxUnitType.TIME)) {
                if (this.instance.getModel().containsAll(unitToComp.instance.getModel()))
                    return true;
                else
                    return false;
            }

            if (this.instance.equals(unitToComp.instance))
                return true;
            else
                return false;
        }

        else
            return false;
    }

    //   @Override
    //   public boolean equals(Object obj) {
    //      
    //      if (!obj.getClass().equals(ContextUnit.class))
    //            return false;
    //      
    //      ContextUnit unitToComp = (ContextUnit) obj;
    //      
    //      if (this.type == unitToComp.type){
    //         
    //         if (this.type.equals(CtxUnitType.GEO) || this.type.equals(CtxUnitType.TIME)){
    //            // does not care about URI of geo/time ctxunit root.
    //            Model unitToCompModel = unitToComp.instance.getModel();
    //            StmtIterator it = this.instance.getModel().listStatements();
    //            while (it.hasNext()){
    //               Statement stat = it.next();
    //               RDFNode object = stat.getObject();
    //               Property pred = stat.getPredicate();
    //               if (!unitToCompModel.contains((Resource)null, pred, object))
    //                  return false;
    //            }
    //            return true;
    //            
    //         }
    //         
    //         
    //         if (this.instance.equals(unitToComp.instance))
    //            return true;
    //         else
    //            return false;
    //      }
    //         
    //      else
    //         return false;
    //   }

    public int hashCode() {
        return new String(type.toString() + instance.toString()).hashCode();
    }

}