edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty.java Source code

Java tutorial

Introduction

Here is the source code for edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty.java

Source

/* $This file is distributed under the terms of the license in /doc/license.txt$ */

package edu.cornell.mannlib.vitro.webapp.beans;

import java.beans.XMLEncoder;
import java.text.Collator;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.joda.time.DateTime;

import com.hp.hpl.jena.datatypes.xsd.XSDDatatype;

import edu.cornell.mannlib.vitro.webapp.auth.policy.bean.RoleRestrictedProperty;

/**
 * a class representing an object property
 *
 */
public class ObjectProperty extends Property
        implements Comparable<ObjectProperty>, ResourceBean, Cloneable, RoleRestrictedProperty {
    private static final Log log = LogFactory.getLog(ObjectProperty.class.getName());

    private String parentURI = null;

    private String domainVClassURI = null;
    private VClass domainVClass = null;
    private String domainEntityURI = null;
    private String domainPublic = null;

    private String rangeVClassURI = null;
    private VClass rangeVClass = null;
    private String rangeEntityURI = null;
    private String rangePublic = null;

    private boolean transitive = false;
    private boolean symmetric = false;
    private boolean functional = false;
    private boolean inverseFunctional = false;

    private List<ObjectPropertyStatement> objectPropertyStatements = null;
    private String example = null;
    private String description = null;
    private String publicDescription = null;

    private String URIInverse = null;
    private String namespaceInverse = null;
    private String localNameInverse = null;

    private String domainEntitySortDirection = null;
    private Integer domainDisplayTier = null;
    private Integer domainDisplayLimit = null;

    private String objectIndividualSortPropertyURI = null;

    private String rangeEntitySortDirection = null;
    private Integer rangeDisplayTier = null;
    private Integer rangeDisplayLimit = null;

    private boolean selectFromExisting = true;
    private boolean offerCreateNewOption = false;
    private boolean stubObjectRelation = false;

    private boolean collateBySubclass = false;

    public ObjectProperty() {
        super();
    }

    /** for debugging */
    public void xmlToSysOut() {
        XMLEncoder e = new XMLEncoder(System.out);
        e.writeObject(this);
    }

    @Override
    public String getDomainVClassURI() {
        return domainVClassURI;
    }

    @Override
    public void setDomainVClassURI(String domainClassURI) {
        this.domainVClassURI = domainClassURI;
    }

    public String getDomainEntityURI() {
        return domainEntityURI;
    }

    public void setDomainEntityURI(String domainEntityURI) {
        this.domainEntityURI = domainEntityURI;
    }

    public String getLabel() {
        return getDomainPublic();
    }

    public String getDomainPublic() {
        return domainPublic;
    }

    public void setDomainPublic(String domainPublic) {
        this.domainPublic = domainPublic;
    }

    public VClass getDomainVClass() {
        return domainVClass;
    }

    public void setDomainVClass(VClass domainVClass) {
        this.domainVClass = domainVClass;
    }

    public String getParentURI() {
        return parentURI;
    }

    public void setParentURI(String parentURI) {
        this.parentURI = parentURI;
    }

    @Override
    public String getRangeVClassURI() {
        return rangeVClassURI;
    }

    @Override
    public void setRangeVClassURI(String rangeClassURI) {
        this.rangeVClassURI = rangeClassURI;
    }

    public String getRangeEntityURI() {
        return rangeEntityURI;
    }

    public void setRangeEntityURI(String rangeEntityURI) {
        this.rangeEntityURI = rangeEntityURI;
    }

    public String getRangePublic() {
        return rangePublic;
    }

    public void setRangePublic(String rangePublic) {
        this.rangePublic = rangePublic;
    }

    public VClass getRangeVClass() {
        return rangeVClass;
    }

    public void setRangeVClass(VClass rangeVClass) {
        this.rangeVClass = rangeVClass;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getPublicDescription() {
        return publicDescription;
    }

    public void setPublicDescription(String s) {
        this.publicDescription = s;
    }

    public String getExample() {
        return example;
    }

    public void setExample(String example) {
        this.example = example;
    }

    public List<ObjectPropertyStatement> getObjectPropertyStatements() {
        return objectPropertyStatements;
    }

    public void setObjectPropertyStatements(List<ObjectPropertyStatement> objectPropertyStatements) {
        this.objectPropertyStatements = objectPropertyStatements;
    }

    public String getURIInverse() {
        return URIInverse;
    }

    public void setURIInverse(String URIInverse) {
        if (URIInverse == null) {
            this.URIInverse = null;
            this.namespaceInverse = null;
            this.localNameInverse = null;
        } else {
            this.URIInverse = URIInverse;
            BaseResourceBean uriInverse = new BaseResourceBean(URIInverse);
            this.namespaceInverse = uriInverse.getNamespace();
            this.localNameInverse = uriInverse.getLocalName();
        }
    }

    public String getNamespaceInverse() {
        return namespaceInverse;
    }

    public void setNamespaceInverse(String namespaceInverse) {
        this.namespaceInverse = namespaceInverse;
        if (namespaceInverse != null && localNameInverse != null) {
            this.URIInverse = namespaceInverse + localNameInverse;
        }
    }

    public String getLocalNameInverse() {
        return localNameInverse;
    }

    public void setLocalNameInverse(String localNameInverse) {
        this.localNameInverse = localNameInverse;
        if (namespaceInverse != null && localNameInverse != null) {
            this.URIInverse = namespaceInverse + localNameInverse;
        }
    }

    public boolean getTransitive() {
        return transitive;
    }

    public void setTransitive(boolean transitive) {
        this.transitive = transitive;
    }

    public boolean getSymmetric() {
        return symmetric;
    }

    public void setSymmetric(boolean symmetric) {
        this.symmetric = symmetric;
    }

    public boolean getFunctional() {
        return functional;
    }

    public void setFunctional(boolean functional) {
        this.functional = functional;
    }

    public boolean getInverseFunctional() {
        return inverseFunctional;
    }

    public void setInverseFunctional(boolean inverseFunctional) {
        this.inverseFunctional = inverseFunctional;
    }

    public void setCollateBySubclass(boolean collate) {
        collateBySubclass = collate;
    }

    public boolean getCollateBySubclass() {
        return collateBySubclass;
    }

    /**
     * adds a single ObjectPropertyStatement object to Property's object property statements List.
     * @param e2e
     */
    public final void addObjectPropertyStatement(ObjectPropertyStatement objPropertyStmt) {
        if (objPropertyStmt == null)
            return;
        if (getObjectPropertyStatements() == null)
            setObjectPropertyStatements(new LinkedList<ObjectPropertyStatement>());
        getObjectPropertyStatements().add(objPropertyStmt);
    }

    /**
     *  @return int for compatibility reasons.  Null values convert to -1.
     */
    public int getDomainDisplayLimit() {
        return (domainDisplayLimit == null) ? -1 : domainDisplayLimit;
    }

    /**
     * @return display limit, or null for an unset value
     */
    public Integer getDomainDisplayLimitInteger() {
        return domainDisplayLimit;
    }

    public void setDomainDisplayLimit(Integer domainDisplayLimit) {
        this.domainDisplayLimit = domainDisplayLimit;
    }

    /**
     *  @return int for compatibility reasons.  Null values convert to -1.
     */
    public int getDomainDisplayTier() {
        return (domainDisplayTier != null) ? domainDisplayTier : -1;
    }

    /**
     * @return display tier, or null for an unset value
     */
    public Integer getDomainDisplayTierInteger() {
        return domainDisplayTier;
    }

    public void setDomainDisplayTier(Integer domainDisplayTier) {
        this.domainDisplayTier = domainDisplayTier;
    }

    public String getDomainEntitySortDirection() {
        return domainEntitySortDirection;
    }

    public void setDomainEntitySortDirection(String domainEntitySortDirection) {
        this.domainEntitySortDirection = domainEntitySortDirection;
    }

    public String getObjectIndividualSortPropertyURI() {
        return this.objectIndividualSortPropertyURI;
    }

    public void setObjectIndividualSortPropertyURI(String objectIndividualSortPropertyURI) {
        this.objectIndividualSortPropertyURI = objectIndividualSortPropertyURI;
    }

    /**
     * @return int for compatibility reasons.  Null values convert to -1.
     */
    public int getRangeDisplayLimit() {
        return (rangeDisplayLimit == null) ? -1 : rangeDisplayLimit;
    }

    /**
     * @return display limit, or null for an unset value
     */
    public Integer getRangeDisplayLimitInteger() {
        return rangeDisplayLimit;
    }

    public void setRangeDisplayLimit(int rangeDisplayLimit) {
        this.rangeDisplayLimit = rangeDisplayLimit;
    }

    /**
     * @return int for compatibility reason.  Null values convert to -1.
     */
    public int getRangeDisplayTier() {
        return (rangeDisplayTier == null) ? -1 : rangeDisplayTier;
    }

    /**
     * @return display tier, or null for an unset value
     */
    public Integer getRangeDisplayTierInteger() {
        return rangeDisplayTier;
    }

    public void setRangeDisplayTier(Integer rangeDisplayTier) {
        this.rangeDisplayTier = rangeDisplayTier;
    }

    public String getRangeEntitySortDirection() {
        return rangeEntitySortDirection;
    }

    public void setRangeEntitySortDirection(String rangeEntitySortDirection) {
        this.rangeEntitySortDirection = rangeEntitySortDirection;
    }

    public boolean getSelectFromExisting() {
        return selectFromExisting;
    }

    public void setSelectFromExisting(boolean b) {
        this.selectFromExisting = b;
    }

    public boolean getOfferCreateNewOption() {
        return offerCreateNewOption;
    }

    public void setOfferCreateNewOption(boolean b) {
        this.offerCreateNewOption = b;
    }

    public boolean getStubObjectRelation() {
        return stubObjectRelation;
    }

    public void setStubObjectRelation(boolean b) {
        this.stubObjectRelation = b;
    }

    /**
     * Sorts alphabetically by public name
     */
    public int compareTo(ObjectProperty op) {
        Collator collator = Collator.getInstance();
        return collator.compare(this.getDomainPublic(), (op).getDomainPublic());
    }

    /**
     * Sorts Property objects, by property rank, then alphanumeric.
     * @author bdc34
     */
    public static class DisplayComparator implements Comparator {
        public int compare(Object o1, Object o2) {
            if (!(o1 instanceof ObjectProperty) && !(o2 instanceof ObjectProperty))
                return 0;
            Integer tier1 = ((ObjectProperty) o1).getDomainDisplayTier();
            Integer tier2 = ((ObjectProperty) o2).getDomainDisplayTier();
            tier1 = (tier1 == null) ? 0 : tier1;
            tier2 = (tier2 == null) ? 0 : tier2;
            return tier1 - tier2;
        }
    }

    /**
     * Sorts the object property statements taking into account the sort order.
     */
    public static List<ObjectPropertyStatement> sortObjectPropertyStatementsForDisplay(ObjectProperty prop,
            List objPropStmtsList) {

        if (objPropStmtsList == null) {
            log.error("incoming object property statement list is null; " + "returning null");
            return null;
        }
        if (objPropStmtsList.size() < 2) { // no need to sort
            return objPropStmtsList;
        }

        String tmpDirection = prop.getDomainEntitySortDirection();
        // Valid values are "desc" and "asc";
        // anything else will default to ascending.
        final boolean ascending = !"desc".equalsIgnoreCase(tmpDirection);

        String objIndivSortPropURI = prop.getObjectIndividualSortPropertyURI();
        if (prop.getObjectIndividualSortPropertyURI() == null
                || prop.getObjectIndividualSortPropertyURI().length() == 0) {
            log.debug("objectIndividualSortPropertyURI is null or blank " + "so sorting by name ");

            Comparator fieldComp = new Comparator() {

                public final int compare(Object o1, Object o2) {
                    ObjectPropertyStatement e2e1 = (ObjectPropertyStatement) o1,
                            e2e2 = (ObjectPropertyStatement) o2;
                    Individual e1, e2;
                    e1 = e2e1 != null ? e2e1.getObject() : null;
                    e2 = e2e2 != null ? e2e2.getObject() : null;

                    Object val1 = null, val2 = null;
                    if (e1 != null) {
                        val1 = e1.getName();
                    } else {
                        log.debug("PropertyWebapp.sortObjectPropertiesForDisplay() "
                                + "passed object property statement with no range entity.");
                    }
                    if (e2 != null) {
                        val2 = e2.getName();
                    } else {
                        log.debug("PropertyWebapp.sortObjectPropertyStatementsForDisplay "
                                + "passed object property statement with no range entity.");
                    }
                    int rv = 0;
                    try {
                        if (val1 instanceof String) {
                            if (val2 == null) {
                                rv = -1;
                            } else {
                                Collator collator = Collator.getInstance();
                                rv = collator.compare(((String) val1), ((String) val2));
                            }
                        } else if (val1 instanceof Date) {
                            DateTime dt1 = new DateTime((Date) val1);
                            DateTime dt2 = new DateTime((Date) val2);
                            rv = dt1.compareTo(dt2);
                        } else {
                            rv = 0;
                        }
                    } catch (NullPointerException e) {
                        e.printStackTrace();
                    }

                    if (ascending) {
                        return rv;
                    } else {
                        return rv * -1;
                    }
                }
            };
            try {
                Collections.sort(objPropStmtsList, fieldComp);
            } catch (Exception e) {
                log.error("Exception sorting object property statements for object property " + prop.getURI());
            }
        } else { // sort by specified range entity data property value instead of a property having a get() method in Individual.java
            log.debug("using data property " + prop.getObjectIndividualSortPropertyURI()
                    + " to sort related entities");
            final String objIndSortPropURI = prop.getObjectIndividualSortPropertyURI();
            Comparator dpComp = new Comparator() {
                final String cDatapropURI = objIndSortPropURI;

                public final int compare(Object o1, Object o2) {
                    ObjectPropertyStatement e2e1 = (ObjectPropertyStatement) o1,
                            e2e2 = (ObjectPropertyStatement) o2;
                    Individual e1, e2;
                    e1 = e2e1 != null ? e2e1.getObject() : null;
                    e2 = e2e2 != null ? e2e2.getObject() : null;

                    Object val1 = null, val2 = null;
                    if (e1 != null) {
                        try {
                            List<DataPropertyStatement> dataPropertyStatements = e1.getDataPropertyStatements();
                            for (DataPropertyStatement dps : dataPropertyStatements) {
                                if (cDatapropURI.equals(dps.getDatapropURI())) {
                                    if (dps.getData() != null && dps.getData().trim().length() > 0) {
                                        if (XSDDatatype.XSDint.getURI().equals(dps.getDatatypeURI())
                                                || XSDDatatype.XSDinteger.getURI().equals(dps.getDatatypeURI())) {
                                            val1 = Integer.parseInt(dps.getData());
                                        } else {
                                            val1 = dps.getData();
                                        }
                                    }
                                }
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } else
                        log.debug(
                                "PropertyWebapp.sortObjectPropertiesForDisplay passed object property statement with no range entity.");

                    if (e2 != null) {
                        try {
                            List<DataPropertyStatement> dataPropertyStatements = e2.getDataPropertyStatements();
                            for (DataPropertyStatement dps : dataPropertyStatements) {
                                if (cDatapropURI.equals(dps.getDatapropURI())) {
                                    if (dps.getData() != null && dps.getData().trim().length() > 0) {
                                        if (XSDDatatype.XSDint.getURI().equals(dps.getDatatypeURI())
                                                || XSDDatatype.XSDinteger.getURI().equals(dps.getDatatypeURI())) {
                                            val2 = Integer.parseInt(dps.getData());
                                        } else {
                                            val2 = dps.getData();
                                        }
                                    }
                                }
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } else {
                        log.debug(
                                "PropertyWebapp.sortObjectPropertyStatementsForDisplay passed object property statement with no range entity.");
                    }
                    int rv = 0;
                    try {
                        if (val1 == null && val2 == null) {
                            rv = 0;
                        } else if (val1 == null) {
                            rv = 1;
                        } else if (val2 == null) {
                            rv = -1;
                        } else {
                            if (val1 instanceof String) {
                                Collator collator = Collator.getInstance();
                                rv = collator.compare(((String) val1), ((String) val2)); //was rv = ((String)val1).compareTo((String)val2);
                            } else if (val1 instanceof Date) {
                                DateTime dt1 = new DateTime((Date) val1);
                                DateTime dt2 = new DateTime((Date) val2);
                                rv = dt1.compareTo(dt2);
                            } else if (val1 instanceof Integer) {
                                rv = ((Integer) val1) - ((Integer) val2);
                            } else {
                                rv = 0;
                            }
                        }
                    } catch (NullPointerException e) {
                        e.printStackTrace();
                    }

                    if (!ascending) {
                        rv = rv * -1;
                    }

                    // sort alphabetically by name if have same dataproperty value
                    if (rv == 0) {
                        String nameValue1 = (e1.getName() != null) ? e1.getName() : "";
                        String nameValue2 = (e2.getName() != null) ? e2.getName() : "";
                        rv = Collator.getInstance().compare(nameValue1, nameValue2);
                    }

                    return rv;
                }
            };
            try {
                Collections.sort(objPropStmtsList, dpComp);
            } catch (Exception e) {
                log.error("Exception sorting object property statements " + "for object property " + prop.getURI(),
                        e);
            }
        }
        return objPropStmtsList;
    }

    /**
     * Produces a string representation of the contents of this class
     * @return Readable text identifying this property's attributes
     */
    public String toString() {
        String list = "null";
        if (getObjectPropertyStatements() != null) {
            Iterator it = getObjectPropertyStatements().iterator();
            if (!it.hasNext())
                list = " none";
            while (it.hasNext()) {
                Object obj = it.next();
                if (obj != null && obj instanceof ObjectPropertyStatement) {
                    list += "\n\t\t" + ((ObjectPropertyStatement) obj).toString();
                } else {
                    list += "\n\t\t" + obj.toString();
                }
            }
        }
        return "* Property:" + "id: " + getURI() + "\n\t" + "domainDisplayLimit: " + getDomainDisplayLimit()
                + " \n\t" + "domainDisplayTier: " + getDomainDisplayTier() + "\n\t" + "domainEntityId: "
                + getDomainEntityURI() + "\n\t" + "domainEntitySortDirection: " + getDomainEntitySortDirection()
                + "\n\t" + "domainVClass: " + getDomainVClass() + "\n\t" + "domainClassId: " + getDomainVClassURI()
                + "\n\t" + "domainPublic: " + getDomainPublic() + "\n\t" + "parentId: " + getParentURI() + "\n\t"
                + "rangeDisplayLimit: " + getRangeDisplayLimit() + "\n\t" + "rangeDisplayTier: "
                + getRangeDisplayTier() + "\n\t" + "rangeEntityId: " + getRangeEntityURI() + "\n\t"
                + "rangeEntitySortDirection: " + getRangeEntitySortDirection() + "\n\t" + "rangeVClass: "
                + getRangeVClass() + "\n\t" + "rangeClassId: " + getRangeVClassURI() + "\n\t" + "rangePublic: "
                + getRangePublic() + "\n\t" + "customEntryForm" + getCustomEntryForm() + "\n\t"
                + "selectFromExisting" + getSelectFromExisting() + "\n\t" + "offerCreateNewOption"
                + getOfferCreateNewOption() + "\n\t" + "** object property statements: " + list + "\n";
    }

    @Override
    public ObjectProperty clone() {
        ObjectProperty clone = new ObjectProperty();
        clone.setAddLinkSuppressed(this.isAddLinkSuppressed());
        clone.setCollateBySubclass(this.getCollateBySubclass());
        clone.setCustomEntryForm(this.getCustomEntryForm());
        clone.setDeleteLinkSuppressed(this.isDeleteLinkSuppressed());
        clone.setDescription(this.getDescription());
        clone.setDomainDisplayLimit(this.getDomainDisplayLimitInteger());
        clone.setDomainDisplayTier(this.getDomainDisplayTier());
        clone.setDomainEntitySortDirection(this.getDomainEntitySortDirection());
        clone.setDomainEntityURI(this.getDomainEntityURI());
        clone.setDomainPublic(this.getDomainPublic());
        clone.setDomainVClass(this.getDomainVClass());
        clone.setDomainVClassURI(this.getDomainVClassURI());
        clone.setEditLinkSuppressed(this.isEditLinkSuppressed());
        clone.setExample(this.getExample());
        clone.setFunctional(this.getFunctional());
        clone.setGroupURI(this.getGroupURI());
        clone.setHiddenFromDisplayBelowRoleLevel(this.getHiddenFromDisplayBelowRoleLevel());
        clone.setHiddenFromPublishBelowRoleLevel(this.getHiddenFromPublishBelowRoleLevel());
        clone.setInverseFunctional(this.getInverseFunctional());
        clone.setLabel(this.getLabel());
        clone.setLocalName(this.getLocalName());
        clone.setLocalNameInverse(this.getLocalNameInverse());
        clone.setLocalNameWithPrefix(this.getLocalNameWithPrefix());
        clone.setNamespace(this.getNamespace());
        clone.setNamespaceInverse(this.getNamespaceInverse());
        clone.setObjectIndividualSortPropertyURI(this.getObjectIndividualSortPropertyURI());
        clone.setOfferCreateNewOption(this.getOfferCreateNewOption());
        clone.setParentURI(this.getParentURI());
        clone.setPickListName(this.getPickListName());
        clone.setProhibitedFromUpdateBelowRoleLevel(this.getProhibitedFromUpdateBelowRoleLevel());
        clone.setPublicDescription(this.getPublicDescription());
        clone.setRangeDisplayLimit(this.getRangeDisplayLimit());
        clone.setRangeDisplayTier(this.getRangeDisplayTier());
        clone.setRangeEntitySortDirection(this.getRangeEntitySortDirection());
        clone.setRangeEntityURI(this.getRangeEntityURI());
        clone.setRangePublic(this.getRangePublic());
        clone.setRangeVClass(this.getRangeVClass());
        clone.setRangeVClassURI(this.getRangeVClassURI());
        clone.setSelectFromExisting(this.getSelectFromExisting());
        clone.setStubObjectRelation(this.getStubObjectRelation());
        clone.setSymmetric(this.getSymmetric());
        clone.setTransitive(this.getTransitive());
        clone.setURI(this.getURI());
        clone.setURIInverse(this.getURIInverse());
        return clone;
    }
}