diff --git a/dspace-api/src/main/java/org/dspace/app/util/CollectionDropDown.java b/dspace-api/src/main/java/org/dspace/app/util/CollectionDropDown.java index 823f9390be..06f4ce5276 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/CollectionDropDown.java +++ b/dspace-api/src/main/java/org/dspace/app/util/CollectionDropDown.java @@ -12,7 +12,10 @@ import java.util.*; import org.dspace.content.Collection; import org.dspace.content.Community; +import org.dspace.content.factory.ContentServiceFactory; +import org.dspace.content.service.CommunityService; import org.dspace.core.ConfigurationManager; +import org.dspace.core.Context; /** * Utility class for lists of collections. @@ -20,6 +23,9 @@ import org.dspace.core.ConfigurationManager; public class CollectionDropDown { + + private static final CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); + /** * Get full path starting from a top-level community via subcommunities down to a collection. * The full path will not be truncated. @@ -29,9 +35,9 @@ public class CollectionDropDown { * @return Full path to the collection * @throws SQLException if database error */ - public static String collectionPath(Collection col) throws SQLException + public static String collectionPath(Context context, Collection col) throws SQLException { - return CollectionDropDown.collectionPath(col, 0); + return CollectionDropDown.collectionPath(context, col, 0); } /** @@ -45,7 +51,7 @@ public class CollectionDropDown { * @return Full path to the collection (truncated) * @throws SQLException if database error */ - public static String collectionPath(Collection col, int maxchars) throws SQLException + public static String collectionPath(Context context, Collection col, int maxchars) throws SQLException { String separator = ConfigurationManager.getProperty("subcommunity.separator"); if (separator == null) @@ -55,7 +61,7 @@ public class CollectionDropDown { List getCom = null; StringBuffer name = new StringBuffer(""); - getCom = col.getCommunities(); // all communities containing given collection + getCom = communityService.getAllParents(context, col); // all communities containing given collection for (Community com : getCom) { name.insert(0, com.getName() + separator); @@ -83,13 +89,13 @@ public class CollectionDropDown { * @return A sorted array of collection path entries (essentially collection/path pairs). * @throws SQLException In case there are problems annotating a collection with its path. */ - public static CollectionPathEntry[] annotateWithPaths(List collections) throws SQLException + public static CollectionPathEntry[] annotateWithPaths(Context context, List collections) throws SQLException { CollectionPathEntry[] result = new CollectionPathEntry[collections.size()]; for (int i = 0; i < collections.size(); i++) { Collection collection = collections.get(i); - CollectionPathEntry entry = new CollectionPathEntry(collection, collectionPath(collection)); + CollectionPathEntry entry = new CollectionPathEntry(collection, collectionPath(context, collection)); result[i] = entry; } Arrays.sort(result); diff --git a/dspace-api/src/main/java/org/dspace/content/BundleServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/BundleServiceImpl.java index f3c905be8c..7ef6d0b9f1 100644 --- a/dspace-api/src/main/java/org/dspace/content/BundleServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/BundleServiceImpl.java @@ -306,7 +306,7 @@ public class BundleServiceImpl extends DSpaceObjectServiceImpl implement collection = item.getOwningCollection(); if (collection != null) { - community = collection.getCommunities().iterator().next(); + community = collection.getCommunities().get(0); } } switch (action) diff --git a/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java index c55512d4d3..4c3c20d798 100644 --- a/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java @@ -628,7 +628,7 @@ public class CollectionServiceImpl extends DSpaceObjectServiceImpl i @Override public void canEdit(Context context, Collection collection, boolean useInheritance) throws SQLException, AuthorizeException { - List parents = collection.getCommunities(); + List parents = communityService.getAllParents(context, collection); for (Community parent : parents) { if (authorizeService.authorizeActionBoolean(context, parent, Constants.WRITE, useInheritance)) { @@ -803,7 +803,7 @@ public class CollectionServiceImpl extends DSpaceObjectServiceImpl i List communities = collection.getCommunities(); if (CollectionUtils.isNotEmpty(communities)) { - community = communities.iterator().next(); + community = communities.get(0); } switch (action) @@ -836,7 +836,7 @@ public class CollectionServiceImpl extends DSpaceObjectServiceImpl i public DSpaceObject getParentObject(Context context, Collection collection) throws SQLException { List communities = collection.getCommunities(); if(CollectionUtils.isNotEmpty(communities)){ - return communities.iterator().next(); + return communities.get(0); }else{ return null; } diff --git a/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java index b650715965..0002871a0a 100644 --- a/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java @@ -323,6 +323,17 @@ public class CommunityServiceImpl extends DSpaceObjectServiceImpl imp return parentList; } + @Override + public List getAllParents(Context context, Collection collection) throws SQLException { + List result = new ArrayList<>(); + List communities = collection.getCommunities(); + result.addAll(communities); + for (Community community : communities) { + result.addAll(getAllParents(context, community)); + } + return result; + } + @Override public List getAllCollections(Context context, Community community) throws SQLException { List collectionList = new ArrayList(); diff --git a/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java index 186de451e6..15f9691ae7 100644 --- a/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java @@ -241,11 +241,7 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl implements It List result = new ArrayList<>(); List collections = item.getCollections(); for (Collection collection : collections) { - List owningCommunities = collection.getCommunities(); - for (Community community : owningCommunities) { - result.add(community); - result.addAll(communityService.getAllParents(context, community)); - } + result.addAll(communityService.getAllParents(context, collection)); } return result; diff --git a/dspace-api/src/main/java/org/dspace/content/service/CommunityService.java b/dspace-api/src/main/java/org/dspace/content/service/CommunityService.java index ab45f0d637..020854b99b 100644 --- a/dspace-api/src/main/java/org/dspace/content/service/CommunityService.java +++ b/dspace-api/src/main/java/org/dspace/content/service/CommunityService.java @@ -189,6 +189,13 @@ public interface CommunityService extends DSpaceObjectService, DSpace */ public List getAllParents(Context context, Community community) throws SQLException; + /** + * Return an array of parent communities of this collection. + * + * @return an array of parent communities + */ + public List getAllParents(Context context, Collection collection) throws SQLException; + /** * Return an array of collections of this community and its subcommunities * diff --git a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java index cb71187c1f..ff7b4b1fc7 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java @@ -677,10 +677,10 @@ public class SolrServiceImpl implements SearchService, IndexingService { return locations; } - protected List getCollectionLocations(Collection target) throws SQLException { + protected List getCollectionLocations(Context context, Collection target) throws SQLException { List locations = new Vector(); // build list of community ids - List communities = target.getCommunities(); + List communities = communityService.getAllParents(context, target); // now put those into strings for (Community community : communities) @@ -798,7 +798,7 @@ public class SolrServiceImpl implements SearchService, IndexingService { */ protected void buildDocument(Context context, Collection collection) throws SQLException, IOException { - List locations = getCollectionLocations(collection); + List locations = getCollectionLocations(context, collection); // Create Lucene Document SolrInputDocument doc = buildDocument(Constants.COLLECTION, collection.getID(), diff --git a/dspace-api/src/main/java/org/dspace/health/ItemCheck.java b/dspace-api/src/main/java/org/dspace/health/ItemCheck.java index a0aae9392e..bdea65faae 100644 --- a/dspace-api/src/main/java/org/dspace/health/ItemCheck.java +++ b/dspace-api/src/main/java/org/dspace/health/ItemCheck.java @@ -128,7 +128,7 @@ public class ItemCheck extends Check { return sb.toString(); } - public String getCollectionSizesInfo(Context context) throws SQLException { + public String getCollectionSizesInfo(final Context context) throws SQLException { final StringBuffer ret = new StringBuffer(); List> colBitSizes = collectionService.getCollectionsWithBitstreamSizesTotal(context); long total_size = 0; @@ -137,8 +137,8 @@ public class ItemCheck extends Check { @Override public int compare(Map.Entry o1, Map.Entry o2) { try { - return CollectionDropDown.collectionPath(o1.getKey()).compareTo( - CollectionDropDown.collectionPath(o2.getKey()) + return CollectionDropDown.collectionPath(context, o1.getKey()).compareTo( + CollectionDropDown.collectionPath(context, o2.getKey()) ); } catch (Exception e) { ret.append(e.getMessage()); @@ -151,7 +151,7 @@ public class ItemCheck extends Check { total_size += size; Collection col = row.getKey(); ret.append(String.format( - "\t%s: %s\n", CollectionDropDown.collectionPath(col), FileUtils.byteCountToDisplaySize((long) size))); + "\t%s: %s\n", CollectionDropDown.collectionPath(context, col), FileUtils.byteCountToDisplaySize((long) size))); } ret.append(String.format( "Total size: %s\n", FileUtils.byteCountToDisplaySize(total_size))); diff --git a/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java b/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java index a75121ef71..83c9d91cbe 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java +++ b/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java @@ -377,7 +377,7 @@ implements ConverterPlugin } // add all parents - for (DSpaceObject parent : collection.getCommunities()) + for (DSpaceObject parent : communityService.getAllParents(context, collection)) { if (!RDFUtil.isPublicBoolean(context, parent)) { diff --git a/dspace-jspui/src/main/java/org/dspace/app/webui/jsptag/SelectCollectionTag.java b/dspace-jspui/src/main/java/org/dspace/app/webui/jsptag/SelectCollectionTag.java index af78aa72cd..e6d422dfe9 100644 --- a/dspace-jspui/src/main/java/org/dspace/app/webui/jsptag/SelectCollectionTag.java +++ b/dspace-jspui/src/main/java/org/dspace/app/webui/jsptag/SelectCollectionTag.java @@ -88,7 +88,7 @@ public class SelectCollectionTag extends TagSupport { sb.append(" selected=\"selected\""); } - sb.append(">").append(CollectionDropDown.collectionPath(coll)).append("\n"); + sb.append(">").append(CollectionDropDown.collectionPath(context, coll)).append("\n"); } sb.append("\n"); diff --git a/dspace-jspui/src/main/webapp/mydspace/subscriptions.jsp b/dspace-jspui/src/main/webapp/mydspace/subscriptions.jsp index 1cf02aced7..344da80ea5 100644 --- a/dspace-jspui/src/main/webapp/mydspace/subscriptions.jsp +++ b/dspace-jspui/src/main/webapp/mydspace/subscriptions.jsp @@ -30,6 +30,8 @@ <%@ page import="org.dspace.app.util.CollectionDropDown" %> <%@ page import="org.dspace.eperson.Subscription" %> <%@ page import="java.util.List" %> +<%@ page import="org.dspace.app.webui.util.UIUtil" %> +<%@ page import="org.dspace.core.Context" %> <% List availableSubscriptions = @@ -38,6 +40,7 @@ (List) request.getAttribute("subscriptions"); boolean updated = ((Boolean) request.getAttribute("updated")).booleanValue(); + Context context = UIUtil.obtainContext(request); %> <% } @@ -110,7 +113,7 @@ for (int i = 0; i < availableSubscriptions.size(); i++) - <%= CollectionDropDown.collectionPath(subscriptions.get(i).getCollection(),0) %> + <%= CollectionDropDown.collectionPath(context, subscriptions.get(i).getCollection(),0) %> diff --git a/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java b/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java index a4249f49a3..b7794d0692 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java @@ -237,7 +237,7 @@ public class XOAI { for (Collection col : item.getCollections()) doc.addField("item.collections", "col_" + col.getHandle().replace("/", "_")); - for (Community com : collectionsService.flatParentCommunities(item)) + for (Community com : collectionsService.flatParentCommunities(context, item)) doc.addField("item.communities", "com_" + com.getHandle().replace("/", "_")); diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/api/CollectionsService.java b/dspace-oai/src/main/java/org/dspace/xoai/services/api/CollectionsService.java index e1454f8100..50b593443c 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/api/CollectionsService.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/api/CollectionsService.java @@ -10,6 +10,7 @@ package org.dspace.xoai.services.api; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; +import org.dspace.core.Context; import org.dspace.xoai.services.api.context.ContextService; import java.sql.SQLException; @@ -20,5 +21,5 @@ public interface CollectionsService { List getAllSubCollections(ContextService contextService, UUID communityId) throws SQLException; List flatParentCommunities(Collection collection) throws SQLException; List flatParentCommunities(Community community) throws SQLException; - List flatParentCommunities(Item item) throws SQLException; + List flatParentCommunities(Context context, Item item) throws SQLException; } diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceCollectionsService.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceCollectionsService.java index 231611a2c7..182ad1ec50 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceCollectionsService.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceCollectionsService.java @@ -10,6 +10,7 @@ package org.dspace.xoai.services.impl; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; +import org.dspace.core.Context; import org.dspace.xoai.services.api.context.ContextService; import org.dspace.xoai.services.api.context.ContextServiceException; import org.dspace.xoai.services.api.CollectionsService; @@ -96,14 +97,14 @@ public class DSpaceCollectionsService implements CollectionsService { } @Override - public List flatParentCommunities(Item c) + public List flatParentCommunities(Context context, Item c) throws SQLException { Queue queue = new LinkedList<>(); List result = new ArrayList<>(); - for (Collection com : c.getCollections()) - queue.addAll(com.getCommunities()); + for (Collection collection : c.getCollections()) + queue.addAll(communityService.getAllParents(context, collection)); while (!queue.isEmpty()) { diff --git a/dspace-rest/src/main/java/org/dspace/rest/common/Collection.java b/dspace-rest/src/main/java/org/dspace/rest/common/Collection.java index 9599a21e50..e77bc0b16f 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/common/Collection.java +++ b/dspace-rest/src/main/java/org/dspace/rest/common/Collection.java @@ -10,6 +10,7 @@ package org.dspace.rest.common; import org.apache.log4j.Logger; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CollectionService; +import org.dspace.content.service.CommunityService; import org.dspace.content.service.ItemService; import org.dspace.core.Context; @@ -31,6 +32,7 @@ import java.util.List; */ @XmlRootElement(name = "collection") public class Collection extends DSpaceObject { + protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); protected ItemService itemService = ContentServiceFactory.getInstance().getItemService(); @@ -69,7 +71,7 @@ public class Collection extends DSpaceObject { this.setSidebarText(collectionService.getMetadata(collection, org.dspace.content.Collection.SIDEBAR_TEXT)); if(expandFields.contains("parentCommunityList") || expandFields.contains("all")) { - List parentCommunities = collection.getCommunities(); + List parentCommunities = communityService.getAllParents(context, collection); for(org.dspace.content.Community parentCommunity : parentCommunities) { this.addParentCommunityList(new Community(parentCommunity, servletContext, null, context)); } diff --git a/dspace-rest/src/main/java/org/dspace/rest/common/FilteredCollection.java b/dspace-rest/src/main/java/org/dspace/rest/common/FilteredCollection.java index 59d4d8aa92..563b30f03a 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/common/FilteredCollection.java +++ b/dspace-rest/src/main/java/org/dspace/rest/common/FilteredCollection.java @@ -77,7 +77,7 @@ public class FilteredCollection extends DSpaceObject { } if(expandFields.contains("parentCommunityList") || expandFields.contains("all")) { - List parentCommunities = collection.getCommunities(); + List parentCommunities = communityService.getAllParents(context, collection); List parentCommunityList = new ArrayList(); for(org.dspace.content.Community parentCommunity : parentCommunities) { parentCommunityList.add(new Community(parentCommunity, servletContext, null, context)); @@ -95,7 +95,7 @@ public class FilteredCollection extends DSpaceObject { } if(expandFields.contains("topCommunity") | expandFields.contains("all")) { - List parentCommunities = collection.getCommunities(); + List parentCommunities = communityService.getAllParents(context, collection); if (parentCommunities.size() > 0) { org.dspace.content.Community topCommunity = parentCommunities.get(parentCommunities.size()-1); this.setTopCommunity(new Community(topCommunity, servletContext, null, context)); diff --git a/dspace-xmlui/src/main/java/org/dspace/app/xmlui/aspect/administrative/batchimport/BatchImportMain.java b/dspace-xmlui/src/main/java/org/dspace/app/xmlui/aspect/administrative/batchimport/BatchImportMain.java index 381c201c48..6096dd853f 100644 --- a/dspace-xmlui/src/main/java/org/dspace/app/xmlui/aspect/administrative/batchimport/BatchImportMain.java +++ b/dspace-xmlui/src/main/java/org/dspace/app/xmlui/aspect/administrative/batchimport/BatchImportMain.java @@ -72,7 +72,7 @@ public class BatchImportMain extends AbstractDSpaceTransformer { select.addOption("",T_collection_default); for (Collection collection : collections) { - select.addOption(collection.getHandle(), CollectionDropDown.collectionPath(collection)); + select.addOption(collection.getHandle(), CollectionDropDown.collectionPath(context, collection)); } //Zip File Upload diff --git a/dspace-xmlui/src/main/java/org/dspace/app/xmlui/aspect/administrative/item/MoveItemForm.java b/dspace-xmlui/src/main/java/org/dspace/app/xmlui/aspect/administrative/item/MoveItemForm.java index e2a06d412d..03dc591598 100644 --- a/dspace-xmlui/src/main/java/org/dspace/app/xmlui/aspect/administrative/item/MoveItemForm.java +++ b/dspace-xmlui/src/main/java/org/dspace/app/xmlui/aspect/administrative/item/MoveItemForm.java @@ -97,7 +97,7 @@ public class MoveItemForm extends AbstractDSpaceTransformer { // Only add the item if it isn't already the owner if (!itemService.isOwningCollection(item, collection)) { - select.addOption(collection.equals(owningCollection), collection.getID().toString(), CollectionDropDown.collectionPath(collection)); + select.addOption(collection.equals(owningCollection), collection.getID().toString(), CollectionDropDown.collectionPath(context, collection)); } } diff --git a/dspace-xmlui/src/main/java/org/dspace/app/xmlui/aspect/eperson/EditProfile.java b/dspace-xmlui/src/main/java/org/dspace/app/xmlui/aspect/eperson/EditProfile.java index a7b2d88668..d81da241c2 100644 --- a/dspace-xmlui/src/main/java/org/dspace/app/xmlui/aspect/eperson/EditProfile.java +++ b/dspace-xmlui/src/main/java/org/dspace/app/xmlui/aspect/eperson/EditProfile.java @@ -385,7 +385,7 @@ public class EditProfile extends AbstractDSpaceTransformer subscriptions.enableDeleteOperation(); subscriptions.addOption(-1,T_select_collection); - CollectionDropDown.CollectionPathEntry[] possibleEntries = CollectionDropDown.annotateWithPaths(possibleList); + CollectionDropDown.CollectionPathEntry[] possibleEntries = CollectionDropDown.annotateWithPaths(context, possibleList); for (CollectionDropDown.CollectionPathEntry possible : possibleEntries) { subscriptions.addOption(possible.collection.getID().toString(), possible.path); diff --git a/dspace-xmlui/src/main/java/org/dspace/app/xmlui/aspect/submission/submit/SelectCollectionStep.java b/dspace-xmlui/src/main/java/org/dspace/app/xmlui/aspect/submission/submit/SelectCollectionStep.java index 9a17b8d782..ac7c8a63dd 100644 --- a/dspace-xmlui/src/main/java/org/dspace/app/xmlui/aspect/submission/submit/SelectCollectionStep.java +++ b/dspace-xmlui/src/main/java/org/dspace/app/xmlui/aspect/submission/submit/SelectCollectionStep.java @@ -105,7 +105,7 @@ public class SelectCollectionStep extends AbstractSubmissionStep select.setHelp(T_collection_help); select.addOption("",T_collection_default); - CollectionDropDown.CollectionPathEntry[] collectionPaths = CollectionDropDown.annotateWithPaths(collections); + CollectionDropDown.CollectionPathEntry[] collectionPaths = CollectionDropDown.annotateWithPaths(context, collections); for (CollectionDropDown.CollectionPathEntry entry : collectionPaths) { select.addOption(entry.collection.getHandle(), entry.path);