diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/FauxObjectPropertyWrapper.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/FauxObjectPropertyWrapper.java new file mode 100644 index 000000000..e01ce0f09 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/FauxObjectPropertyWrapper.java @@ -0,0 +1,650 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual; + +import java.util.List; +import java.util.Objects; + +import com.hp.hpl.jena.rdf.model.ResourceFactory; + +import edu.cornell.mannlib.vitro.webapp.beans.FauxProperty; +import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; +import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement; +import edu.cornell.mannlib.vitro.webapp.beans.VClass; + +/** + * An ObjectProperty that has some of its values overridden by a FauxProperty. + * + * TODO This is a horrible kluge that should be discarded as soon as we can + * rewrite GroupedPropertyList. + */ +public class FauxObjectPropertyWrapper extends ObjectProperty { + private final ObjectProperty innerOP; + private final FauxProperty faux; + + public FauxObjectPropertyWrapper(ObjectProperty inner, FauxProperty faux) { + this.innerOP = inner; + this.faux = faux; + } + + // ---------------------------------------------------------------------- + // Methods where FauxProperty overrides. + // ---------------------------------------------------------------------- + + @Override + public String getGroupURI() { + String uri = faux.getGroupURI(); + if (uri != null) { + return uri; + } + return innerOP.getGroupURI(); + } + + @Override + public void setGroupURI(String groupUri) { + faux.setGroupURI(groupUri); + innerOP.setGroupURI(groupUri); + } + + // ------- + + @Override + public String getDomainVClassURI() { + String uri = faux.getDomainVClassURI(); + if (uri != null) { + return uri; + } + return innerOP.getDomainVClassURI(); + } + + @Override + public void setDomainVClassURI(String domainClassURI) { + faux.setDomainURI(domainClassURI); + innerOP.setDomainVClassURI(domainClassURI); + } + + // ------- + + @Override + public String getRangeVClassURI() { + String uri = faux.getRangeVClassURI(); + if (uri != null) { + return uri; + } + return innerOP.getRangeVClassURI(); + } + + @Override + public void setRangeVClassURI(String rangeClassURI) { + faux.setRangeURI(rangeClassURI); + innerOP.setRangeVClassURI(rangeClassURI); + } + + // ------- + + @Override + public String getCustomEntryForm() { + String s = faux.getCustomEntryForm(); + if (s != null) { + return s; + } + return innerOP.getCustomEntryForm(); + } + + @Override + public void setCustomEntryForm(String s) { + faux.setCustomEntryForm(s); + innerOP.setCustomEntryForm(s); + } + + // ------- + + @Override + public boolean getSelectFromExisting() { + return faux.isSelectFromExisting(); + } + + @Override + public void setSelectFromExisting(boolean b) { + faux.setSelectFromExisting(b); + innerOP.setSelectFromExisting(b); + } + + // ------- + + @Override + public void setOfferCreateNewOption(boolean b) { + faux.setOfferCreateNewOption(b); + innerOP.setOfferCreateNewOption(b); + } + + @Override + public boolean getOfferCreateNewOption() { + return faux.isOfferCreateNewOption(); + } + + // ------- + + @Override + public void setCollateBySubclass(boolean collate) { + faux.setCollateBySubclass(collate); + innerOP.setCollateBySubclass(collate); + } + + @Override + public boolean getCollateBySubclass() { + return faux.isCollateBySubclass(); + } + + // ------- + + @Override + public String getPublicDescription() { + String s = faux.getPublicDescription(); + if (s != null) { + return s; + } + return innerOP.getPublicDescription(); + } + + @Override + public void setPublicDescription(String s) { + faux.setPublicDescription(s); + innerOP.setPublicDescription(s); + } + + // ------- + + @Override + public String getPickListName() { + String name = faux.getDisplayName(); + if (name != null) { + return name; + } + return innerOP.getPickListName(); + } + + @Override + public void setPickListName(String pickListName) { + faux.setDisplayName(pickListName); + innerOP.setPickListName(pickListName); + } + + // ---------------------------------------------------------------------- + // Methods from ObjectProperty + // ---------------------------------------------------------------------- + + @Override + public void xmlToSysOut() { + innerOP.xmlToSysOut(); + } + + @Override + public String getDomainEntityURI() { + return innerOP.getDomainEntityURI(); + } + + @Override + public void setDomainEntityURI(String domainEntityURI) { + innerOP.setDomainEntityURI(domainEntityURI); + } + + @Override + public String getLabel() { + return innerOP.getLabel(); + } + + @Override + public String getDomainPublic() { + return innerOP.getDomainPublic(); + } + + @Override + public void setDomainPublic(String domainPublic) { + innerOP.setDomainPublic(domainPublic); + } + + @Override + public VClass getDomainVClass() { + return innerOP.getDomainVClass(); + } + + @Override + public void setDomainVClass(VClass domainVClass) { + innerOP.setDomainVClass(domainVClass); + } + + @Override + public String getParentURI() { + return innerOP.getParentURI(); + } + + @Override + public void setParentURI(String parentURI) { + innerOP.setParentURI(parentURI); + } + + @Override + public String getRangeEntityURI() { + return innerOP.getRangeEntityURI(); + } + + @Override + public void setRangeEntityURI(String rangeEntityURI) { + innerOP.setRangeEntityURI(rangeEntityURI); + } + + @Override + public String getRangePublic() { + return innerOP.getRangePublic(); + } + + @Override + public void setRangePublic(String rangePublic) { + innerOP.setRangePublic(rangePublic); + } + + @Override + public VClass getRangeVClass() { + return innerOP.getRangeVClass(); + } + + @Override + public void setRangeVClass(VClass rangeVClass) { + innerOP.setRangeVClass(rangeVClass); + } + + @Override + public String getDescription() { + return innerOP.getDescription(); + } + + @Override + public void setDescription(String description) { + innerOP.setDescription(description); + } + + @Override + public String getExample() { + return innerOP.getExample(); + } + + @Override + public void setExample(String example) { + innerOP.setExample(example); + } + + @Override + public List getObjectPropertyStatements() { + return innerOP.getObjectPropertyStatements(); + } + + @Override + public void setObjectPropertyStatements( + List objectPropertyStatements) { + innerOP.setObjectPropertyStatements(objectPropertyStatements); + } + + @Override + public String getURIInverse() { + return innerOP.getURIInverse(); + } + + @Override + public void setURIInverse(String URIInverse) { + innerOP.setURIInverse(URIInverse); + } + + @Override + public String getNamespaceInverse() { + return innerOP.getNamespaceInverse(); + } + + @Override + public void setNamespaceInverse(String namespaceInverse) { + innerOP.setNamespaceInverse(namespaceInverse); + } + + @Override + public String getLocalNameInverse() { + return innerOP.getLocalNameInverse(); + } + + @Override + public void setLocalNameInverse(String localNameInverse) { + innerOP.setLocalNameInverse(localNameInverse); + } + + @Override + public boolean getTransitive() { + return innerOP.getTransitive(); + } + + @Override + public void setTransitive(boolean transitive) { + innerOP.setTransitive(transitive); + } + + @Override + public boolean getSymmetric() { + return innerOP.getSymmetric(); + } + + @Override + public void setSymmetric(boolean symmetric) { + innerOP.setSymmetric(symmetric); + } + + @Override + public boolean getFunctional() { + return innerOP.getFunctional(); + } + + @Override + public void setFunctional(boolean functional) { + innerOP.setFunctional(functional); + } + + @Override + public boolean getInverseFunctional() { + return innerOP.getInverseFunctional(); + } + + @Override + public void setInverseFunctional(boolean inverseFunctional) { + innerOP.setInverseFunctional(inverseFunctional); + } + + @Override + public int getDomainDisplayLimit() { + return innerOP.getDomainDisplayLimit(); + } + + @Override + public Integer getDomainDisplayLimitInteger() { + return innerOP.getDomainDisplayLimitInteger(); + } + + @Override + public void setDomainDisplayLimit(Integer domainDisplayLimit) { + innerOP.setDomainDisplayLimit(domainDisplayLimit); + } + + @Override + public int getDomainDisplayTier() { + return innerOP.getDomainDisplayTier(); + } + + @Override + public Integer getDomainDisplayTierInteger() { + return innerOP.getDomainDisplayTierInteger(); + } + + @Override + public void setDomainDisplayTier(Integer domainDisplayTier) { + innerOP.setDomainDisplayTier(domainDisplayTier); + } + + @Override + public String getDomainEntitySortDirection() { + return innerOP.getDomainEntitySortDirection(); + } + + @Override + public void setDomainEntitySortDirection(String domainEntitySortDirection) { + innerOP.setDomainEntitySortDirection(domainEntitySortDirection); + } + + @Override + public String getObjectIndividualSortPropertyURI() { + return innerOP.getObjectIndividualSortPropertyURI(); + } + + @Override + public void setObjectIndividualSortPropertyURI( + String objectIndividualSortPropertyURI) { + innerOP.setObjectIndividualSortPropertyURI(objectIndividualSortPropertyURI); + } + + @Override + public int getRangeDisplayLimit() { + return innerOP.getRangeDisplayLimit(); + } + + @Override + public Integer getRangeDisplayLimitInteger() { + return innerOP.getRangeDisplayLimitInteger(); + } + + @Override + public void setRangeDisplayLimit(int rangeDisplayLimit) { + innerOP.setRangeDisplayLimit(rangeDisplayLimit); + } + + @Override + public int getRangeDisplayTier() { + return innerOP.getRangeDisplayTier(); + } + + @Override + public Integer getRangeDisplayTierInteger() { + return innerOP.getRangeDisplayTierInteger(); + } + + @Override + public void setRangeDisplayTier(Integer rangeDisplayTier) { + innerOP.setRangeDisplayTier(rangeDisplayTier); + } + + @Override + public String getRangeEntitySortDirection() { + return innerOP.getRangeEntitySortDirection(); + } + + @Override + public void setRangeEntitySortDirection(String rangeEntitySortDirection) { + innerOP.setRangeEntitySortDirection(rangeEntitySortDirection); + } + + @Override + public boolean getStubObjectRelation() { + return innerOP.getStubObjectRelation(); + } + + @Override + public void setStubObjectRelation(boolean b) { + innerOP.setStubObjectRelation(b); + } + + @Override + public int compareTo(ObjectProperty op) { + return innerOP.compareTo(op); + } + + @Override + public ObjectProperty clone() { + return innerOP.clone(); + } + + @Override + public void setLabel(String label) { + innerOP.setLabel(label); + } + + @Override + public boolean isSubjectSide() { + return innerOP.isSubjectSide(); + } + + @Override + public boolean isEditLinkSuppressed() { + return innerOP.isEditLinkSuppressed(); + } + + @Override + public boolean isAddLinkSuppressed() { + return innerOP.isAddLinkSuppressed(); + } + + @Override + public boolean isDeleteLinkSuppressed() { + return innerOP.isDeleteLinkSuppressed(); + } + + @Override + public void setEditLinkSuppressed(boolean editLinkSuppressed) { + innerOP.setEditLinkSuppressed(editLinkSuppressed); + } + + @Override + public void setAddLinkSuppressed(boolean addLinkSuppressed) { + innerOP.setAddLinkSuppressed(addLinkSuppressed); + } + + @Override + public void setDeleteLinkSuppressed(boolean deleteLinkSuppressed) { + innerOP.setDeleteLinkSuppressed(deleteLinkSuppressed); + } + + @Override + public boolean isAnonymous() { + return innerOP.isAnonymous(); + } + + @Override + public String getURI() { + return innerOP.getURI(); + } + + @Override + public void setURI(String URI) { + innerOP.setURI(URI); + } + + @Override + public String getNamespace() { + return innerOP.getNamespace(); + } + + @Override + public void setNamespace(String namespace) { + innerOP.setNamespace(namespace); + } + + @Override + public String getLocalName() { + return innerOP.getLocalName(); + } + + @Override + public void setLocalName(String localName) { + innerOP.setLocalName(localName); + } + + @Override + public String getLocalNameWithPrefix() { + return innerOP.getLocalNameWithPrefix(); + } + + @Override + public void setLocalNameWithPrefix(String prefixedLocalName) { + innerOP.setLocalNameWithPrefix(prefixedLocalName); + } + + @Override + public RoleLevel getHiddenFromDisplayBelowRoleLevel() { + return innerOP.getHiddenFromDisplayBelowRoleLevel(); + } + + @Override + public void setHiddenFromDisplayBelowRoleLevel(RoleLevel level) { + innerOP.setHiddenFromDisplayBelowRoleLevel(level); + } + + @Override + public void setHiddenFromDisplayBelowRoleLevelUsingRoleUri(String roleUri) { + innerOP.setHiddenFromDisplayBelowRoleLevelUsingRoleUri(roleUri); + } + + @Override + public RoleLevel getProhibitedFromUpdateBelowRoleLevel() { + return innerOP.getProhibitedFromUpdateBelowRoleLevel(); + } + + @Override + public void setProhibitedFromUpdateBelowRoleLevel(RoleLevel level) { + innerOP.setProhibitedFromUpdateBelowRoleLevel(level); + } + + @Override + public void setProhibitedFromUpdateBelowRoleLevelUsingRoleUri(String roleUri) { + innerOP.setProhibitedFromUpdateBelowRoleLevelUsingRoleUri(roleUri); + } + + @Override + public RoleLevel getHiddenFromPublishBelowRoleLevel() { + return innerOP.getHiddenFromPublishBelowRoleLevel(); + } + + @Override + public void setHiddenFromPublishBelowRoleLevel(RoleLevel level) { + innerOP.setHiddenFromPublishBelowRoleLevel(level); + } + + @Override + public void setHiddenFromPublishBelowRoleLevelUsingRoleUri(String roleUri) { + innerOP.setHiddenFromPublishBelowRoleLevelUsingRoleUri(roleUri); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((faux == null) ? 0 : faux.hashCode()); + result = prime * result + ((innerOP == null) ? 0 : innerOP.hashCode()); + return Objects.hash(innerOP, faux); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!super.equals(obj)) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + FauxObjectPropertyWrapper that = (FauxObjectPropertyWrapper) obj; + return Objects.equals(this.innerOP, that.innerOP) + && Objects.equals(this.faux, that.faux); + } + + @Override + public String toString() { + return String.format("FauxObjectPropertyWrapper[ %s <==> %s | %s ==> %s ==> %s, statementCount=%d, group=%s, customEntryForm=%s ]", + getDomainPublic(), getRangePublic(), + localName(getDomainVClassURI()), localName(getURI()), localName(getRangeVClassURI()), + (getObjectPropertyStatements() == null ? 0: getObjectPropertyStatements().size()), + localName(getGroupURI()), + simpleName(getCustomEntryForm())); + } + + private Object simpleName(String classname) { + if (classname == null) { + return null; + } else { + return classname.substring(classname.lastIndexOf(".") + 1); + } + } + + private Object localName(String uri) { + if (uri == null) { + return null; + } else { + return ResourceFactory.createResource(uri).getLocalName(); + } + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java index fa81a6705..687fa6707 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java @@ -2,6 +2,9 @@ package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual; +import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption.LANGUAGE_NEUTRAL; +import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.PolicyOption.POLICY_NEUTRAL; + import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -15,6 +18,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import edu.cornell.mannlib.vitro.webapp.beans.DataProperty; +import edu.cornell.mannlib.vitro.webapp.beans.FauxProperty; import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; import edu.cornell.mannlib.vitro.webapp.beans.Property; @@ -22,12 +26,14 @@ import edu.cornell.mannlib.vitro.webapp.beans.PropertyGroup; import edu.cornell.mannlib.vitro.webapp.beans.PropertyInstance; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.dao.DataPropertyDao; +import edu.cornell.mannlib.vitro.webapp.dao.FauxPropertyDao; import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDao; import edu.cornell.mannlib.vitro.webapp.dao.PropertyDao.FullPropertyKey; import edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDao; import edu.cornell.mannlib.vitro.webapp.dao.PropertyInstanceDao; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; +import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess; import edu.cornell.mannlib.vitro.webapp.utils.ApplicationConfigurationOntologyUtils; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.BaseTemplateModel; @@ -239,8 +245,7 @@ public class GroupedPropertyList extends BaseTemplateModel { if (pi != null) { // use the language-aware wdf because redundancy check // for display will depend on public label match - ObjectProperty piOp = wdf.getObjectPropertyDao().getObjectPropertyByURIs( - pi.getPropertyURI(), pi.getDomainClassURI(), pi.getRangeClassURI()); + ObjectProperty piOp = assembleObjectProperty(pi); if (piOp == null) { continue; } @@ -272,8 +277,30 @@ public class GroupedPropertyList extends BaseTemplateModel { return propertyList; } + + private ObjectProperty assembleObjectProperty(PropertyInstance pi) { + WebappDaoFactory rawWadf = ModelAccess.on(vreq).getWebappDaoFactory( + LANGUAGE_NEUTRAL, POLICY_NEUTRAL); + ObjectPropertyDao opDao = rawWadf.getObjectPropertyDao(); + FauxPropertyDao fpDao = rawWadf.getFauxPropertyDao(); + + String base = pi.getPropertyURI(); + String domain = pi.getDomainClassURI(); + String range = pi.getRangeClassURI(); + + ObjectProperty op = opDao.getObjectPropertyByURIs(base, domain, range); + try { + FauxProperty fp = fpDao.getFauxPropertyByUris(domain, base, range); + if (fp != null) { + return new FauxObjectPropertyWrapper(op, fp); + } + } catch (Exception e) { + log.warn("Couldn't look up the faux property", e); + } + return op; + } - private boolean redundant(ObjectProperty op, ObjectProperty op2) { + private boolean redundant(ObjectProperty op, ObjectProperty op2) { return new FullPropertyKey((Property)op).equals(new FullPropertyKey((Property)op2)); }