diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/fields/IndividualsViaObjectPropetyOptions.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/fields/IndividualsViaObjectPropetyOptions.java index fd9ff67b1..7668d41e8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/fields/IndividualsViaObjectPropetyOptions.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/fields/IndividualsViaObjectPropetyOptions.java @@ -66,16 +66,29 @@ public class IndividualsViaObjectPropetyOptions implements FieldOptions { Individual subject = wDaoFact.getIndividualDao().getIndividualByURI(subjectUri); ObjectProperty objProp = wDaoFact.getObjectPropertyDao().getObjectPropertyByURI(predicateUri); - List vclasses = wDaoFact.getVClassDao().getVClassesForProperty(subject.getVClassURI(), predicateUri); + //get all vclasses applicable to the individual subject + List subjectVClasses = subject.getVClasses(); + //using hashset to prevent duplicates + HashSet vclassesURIs = new HashSet(); + //Get the range vclasses applicable for the property and each vclass for the subject + for(VClass subjectVClass: subjectVClasses) { + List vclasses = wDaoFact.getVClassDao().getVClassesForProperty(subjectVClass.getURI(), predicateUri); + //add range vclass to hash + if(vclasses != null) { + for(VClass v: vclasses) { + vclassesURIs.add(v.getURI()); + } + } + } - if (vclasses == null || vclasses.size() == 0) { + if (vclassesURIs.size() == 0) { return optionsMap; } List individuals = new ArrayList(); HashSet uriSet = new HashSet(); - for (VClass vclass : vclasses) { - List inds = wDaoFact.getIndividualDao().getIndividualsByVClassURI(vclass.getURI(), -1, -1); + for (String vclassURI: vclassesURIs) { + List inds = wDaoFact.getIndividualDao().getIndividualsByVClassURI(vclassURI, -1, -1); for (Individual ind : inds) { if (!uriSet.contains(ind.getURI())) { uriSet.add(ind.getURI()); @@ -88,7 +101,7 @@ public class IndividualsViaObjectPropetyOptions implements FieldOptions { individuals = removeIndividualsAlreadyInRange( individuals, stmts, predicateUri, objectUri); - // Collections.sort(individuals,new compareIndividualsByName()); + // Collections.sort(individuals,new compareIndividualsByName());a for (Individual ind : individuals) { String uri = ind.getURI(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultObjectPropertyFormGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultObjectPropertyFormGenerator.java index 378e4069e..a6ea9e704 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultObjectPropertyFormGenerator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultObjectPropertyFormGenerator.java @@ -7,6 +7,7 @@ import static edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary.*; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; @@ -101,15 +102,23 @@ public class DefaultObjectPropertyFormGenerator implements EditConfigurationGene } protected List getRangeTypes(VitroRequest vreq) { - Individual subject = EditConfigurationUtils.getSubjectIndividual(vreq); - String predicateUri = EditConfigurationUtils.getPredicateUri(vreq); + Individual subject = EditConfigurationUtils.getSubjectIndividual(vreq); + String predicateUri = EditConfigurationUtils.getPredicateUri(vreq); WebappDaoFactory wDaoFact = vreq.getWebappDaoFactory(); List types = new ArrayList(); - List vclasses = new ArrayList(); - vclasses = wDaoFact.getVClassDao().getVClassesForProperty(subject.getVClassURI(),predicateUri); - for(VClass v: vclasses) { - types.add(v.getURI()); - } + //Get all vclasses applicable to subject + List vClasses = subject.getVClasses(); + HashSet typesHash = new HashSet(); + for(VClass vclass: vClasses) { + List rangeVclasses = wDaoFact.getVClassDao().getVClassesForProperty(vclass.getURI(),predicateUri); + if(rangeVclasses != null) { + for(VClass range: rangeVclasses) { + //a hash will keep a unique list of types and so prevent duplicates + typesHash.add(range.getURI()); + } + } + } + types.addAll(typesHash); return types; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditConfigurationTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditConfigurationTemplateModel.java index f9735eb4c..3beda0c8a 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditConfigurationTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/edit/EditConfigurationTemplateModel.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -504,6 +505,7 @@ public class EditConfigurationTemplateModel extends BaseTemplateModel { //TODO:Check where this logic should actually go, copied from input element formatting tag + //Updating to enable multiple vclasses applicable to subject to be analyzed to understand possible range of types public Map getOfferTypesCreateNew() { WebappDaoFactory wdf = vreq.getWebappDaoFactory(); ObjectProperty op = @@ -513,9 +515,34 @@ public class EditConfigurationTemplateModel extends BaseTemplateModel { wdf.getIndividualDao().getIndividualByURI(editConfig.getSubjectUri()); List vclasses = null; - vclasses = wdf.getVClassDao().getVClassesForProperty(sub.getVClassURI(), op.getURI()); - if( vclasses == null ) + List subjectVClasses = sub.getVClasses(); + if( subjectVClasses == null ) { vclasses = wdf.getVClassDao().getAllVclasses(); + } + else { + //this hash is used to make sure there are no duplicates in the vclasses + //a more elegant method may look at overriding equals/hashcode to enable a single hashset of VClass objects + HashSet vclassesURIs = new HashSet(); + vclasses = new ArrayList(); + //Get the range vclasses applicable for the property and each vclass for the subject + for(VClass subjectVClass: subjectVClasses) { + List rangeVclasses = wdf.getVClassDao().getVClassesForProperty(subjectVClass.getURI(), op.getURI()); + //add range vclass to hash + if(rangeVclasses != null) { + for(VClass v: rangeVclasses) { + if(!vclassesURIs.contains(v.getURI())) { + vclassesURIs.add(v.getURI()); + vclasses.add(v); + } + } + } + } + } + //if each subject vclass resulted in null being returned for range vclasses, then size of vclasses would be zero + if(vclasses.size() == 0) { + vclasses = wdf.getVClassDao().getAllVclasses(); + } + HashMap types = new HashMap(); for( VClass vclass : vclasses ){