97248: Find DSO based configurations recursively through parent objects

This commit is contained in:
Yana De Pauw
2022-12-06 12:37:21 +01:00
parent 8e2ada65b1
commit 3e651af760
7 changed files with 89 additions and 31 deletions

View File

@@ -18,6 +18,7 @@ import org.dspace.content.Collection;
import org.dspace.content.DSpaceObject; import org.dspace.content.DSpaceObject;
import org.dspace.content.Item; import org.dspace.content.Item;
import org.dspace.content.WorkspaceItem; import org.dspace.content.WorkspaceItem;
import org.dspace.core.Context;
import org.dspace.discovery.configuration.DiscoveryConfiguration; import org.dspace.discovery.configuration.DiscoveryConfiguration;
import org.dspace.discovery.configuration.DiscoveryConfigurationService; import org.dspace.discovery.configuration.DiscoveryConfigurationService;
import org.dspace.kernel.ServiceManager; import org.dspace.kernel.ServiceManager;
@@ -60,28 +61,32 @@ public class SearchUtils {
} }
public static DiscoveryConfiguration getDiscoveryConfiguration() { public static DiscoveryConfiguration getDiscoveryConfiguration() {
return getDiscoveryConfiguration(null, null); return getDiscoveryConfiguration(null, null, null);
} }
public static DiscoveryConfiguration getDiscoveryConfiguration(DSpaceObject dso) { public static DiscoveryConfiguration getDiscoveryConfiguration(final Context context,
return getDiscoveryConfiguration(null, dso); DSpaceObject dso) {
return getDiscoveryConfiguration(context, null, dso);
} }
/** /**
* Return the discovery configuration to use in a specific scope for the king of search identified by the prefix. A * Return the discovery configuration to use in a specific scope for the king of search identified by the prefix. A
* null prefix mean the normal query, other predefined values are workspace or workflow * null prefix mean the normal query, other predefined values are workspace or workflow
* *
*
* @param context
* @param prefix * @param prefix
* the namespace of the configuration to lookup if any * the namespace of the configuration to lookup if any
* @param dso * @param dso
* the DSpaceObject * the DSpaceObject
* @return the discovery configuration for the specified scope * @return the discovery configuration for the specified scope
*/ */
public static DiscoveryConfiguration getDiscoveryConfiguration(String prefix, DSpaceObject dso) { public static DiscoveryConfiguration getDiscoveryConfiguration(final Context context, String prefix,
DSpaceObject dso) {
if (prefix != null) { if (prefix != null) {
return getDiscoveryConfigurationByName(dso != null ? prefix + "." + dso.getHandle() : prefix); return getDiscoveryConfigurationByName(dso != null ? prefix + "." + dso.getHandle() : prefix);
} else { } else {
return getDiscoveryConfigurationByName(dso != null ? dso.getHandle() : null); return getDiscoveryConfigurationByDSO(context, dso);
} }
} }
@@ -98,6 +103,11 @@ public class SearchUtils {
return configurationService.getDiscoveryConfiguration(configurationName); return configurationService.getDiscoveryConfiguration(configurationName);
} }
public static DiscoveryConfiguration getDiscoveryConfigurationByDSO(
Context context, DSpaceObject dso) {
DiscoveryConfigurationService configurationService = getConfigurationService();
return configurationService.getDiscoveryDSOConfiguration(context, dso);
}
public static DiscoveryConfigurationService getConfigurationService() { public static DiscoveryConfigurationService getConfigurationService() {
ServiceManager manager = DSpaceServicesFactory.getInstance().getServiceManager(); ServiceManager manager = DSpaceServicesFactory.getInstance().getServiceManager();
@@ -114,45 +124,54 @@ public class SearchUtils {
* A configuration object can be returned for each parent community/collection * A configuration object can be returned for each parent community/collection
* *
* @param item the DSpace item * @param item the DSpace item
* @param context
* @return a list of configuration objects * @return a list of configuration objects
* @throws SQLException An exception that provides information on a database access error or other errors. * @throws SQLException An exception that provides information on a database access error or other errors.
*/ */
public static List<DiscoveryConfiguration> getAllDiscoveryConfigurations(Item item) throws SQLException { public static List<DiscoveryConfiguration> getAllDiscoveryConfigurations(Item item,
final Context context) throws SQLException {
List<Collection> collections = item.getCollections(); List<Collection> collections = item.getCollections();
return getAllDiscoveryConfigurations(null, collections, item); return getAllDiscoveryConfigurations(context, null, collections, item);
} }
/** /**
* Return all the discovery configuration applicable to the provided workspace item * Return all the discovery configuration applicable to the provided workspace item
*
* @param context
* @param witem a workspace item * @param witem a workspace item
* @return a list of discovery configuration * @return a list of discovery configuration
* @throws SQLException * @throws SQLException
*/ */
public static List<DiscoveryConfiguration> getAllDiscoveryConfigurations(WorkspaceItem witem) throws SQLException { public static List<DiscoveryConfiguration> getAllDiscoveryConfigurations(final Context context,
WorkspaceItem witem) throws SQLException {
List<Collection> collections = new ArrayList<Collection>(); List<Collection> collections = new ArrayList<Collection>();
collections.add(witem.getCollection()); collections.add(witem.getCollection());
return getAllDiscoveryConfigurations("workspace", collections, witem.getItem()); return getAllDiscoveryConfigurations(context, "workspace", collections, witem.getItem());
} }
/** /**
* Return all the discovery configuration applicable to the provided workflow item * Return all the discovery configuration applicable to the provided workflow item
*
* @param context
* @param witem a workflow item * @param witem a workflow item
* @return a list of discovery configuration * @return a list of discovery configuration
* @throws SQLException * @throws SQLException
*/ */
public static List<DiscoveryConfiguration> getAllDiscoveryConfigurations(WorkflowItem witem) throws SQLException { public static List<DiscoveryConfiguration> getAllDiscoveryConfigurations(final Context context,
WorkflowItem witem) throws SQLException {
List<Collection> collections = new ArrayList<Collection>(); List<Collection> collections = new ArrayList<Collection>();
collections.add(witem.getCollection()); collections.add(witem.getCollection());
return getAllDiscoveryConfigurations("workflow", collections, witem.getItem()); return getAllDiscoveryConfigurations(context, "workflow", collections, witem.getItem());
} }
private static List<DiscoveryConfiguration> getAllDiscoveryConfigurations(String prefix, private static List<DiscoveryConfiguration> getAllDiscoveryConfigurations(final Context context,
String prefix,
List<Collection> collections, Item item) List<Collection> collections, Item item)
throws SQLException { throws SQLException {
Set<DiscoveryConfiguration> result = new HashSet<>(); Set<DiscoveryConfiguration> result = new HashSet<>();
for (Collection collection : collections) { for (Collection collection : collections) {
DiscoveryConfiguration configuration = getDiscoveryConfiguration(prefix, collection); DiscoveryConfiguration configuration = getDiscoveryConfiguration(context, prefix, collection);
result.add(configuration); result.add(configuration);
} }

View File

@@ -7,12 +7,20 @@
*/ */
package org.dspace.discovery.configuration; package org.dspace.discovery.configuration;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dspace.content.DSpaceObject;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.DSpaceObjectService;
import org.dspace.core.Context;
import org.dspace.core.ReloadableEntity;
import org.dspace.discovery.IndexableObject; import org.dspace.discovery.IndexableObject;
import org.dspace.discovery.indexobject.IndexableDSpaceObject; import org.dspace.discovery.indexobject.IndexableDSpaceObject;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
@@ -22,6 +30,8 @@ import org.dspace.services.factory.DSpaceServicesFactory;
*/ */
public class DiscoveryConfigurationService { public class DiscoveryConfigurationService {
private static final Logger log = LogManager.getLogger();
private Map<String, DiscoveryConfiguration> map; private Map<String, DiscoveryConfiguration> map;
private Map<Integer, List<String>> toIgnoreMetadataFields = new HashMap<>(); private Map<Integer, List<String>> toIgnoreMetadataFields = new HashMap<>();
@@ -41,25 +51,53 @@ public class DiscoveryConfigurationService {
this.toIgnoreMetadataFields = toIgnoreMetadataFields; this.toIgnoreMetadataFields = toIgnoreMetadataFields;
} }
public DiscoveryConfiguration getDiscoveryConfiguration(IndexableObject dso) { public DiscoveryConfiguration getDiscoveryConfiguration(final Context context,
IndexableObject dso) {
String name; String name;
if (dso == null) { if (dso == null) {
name = "default"; name = "default";
} else if (dso instanceof IndexableDSpaceObject) { } else if (dso instanceof IndexableDSpaceObject) {
name = ((IndexableDSpaceObject) dso).getIndexedObject().getHandle(); return getDiscoveryDSOConfiguration(context, ((IndexableDSpaceObject) dso).getIndexedObject());
} else { } else {
name = dso.getUniqueIndexID(); name = dso.getUniqueIndexID();
} }
return getDiscoveryConfiguration(name); return getDiscoveryConfiguration(name);
} }
public DiscoveryConfiguration getDiscoveryDSOConfiguration(final Context context,
DSpaceObject dso) {
String name;
if (dso == null) {
name = "default";
} else {
name = dso.getHandle();
}
DiscoveryConfiguration configuration = getDiscoveryConfiguration(name, false);
if (configuration != null) {
return configuration;
}
DSpaceObjectService<DSpaceObject> dSpaceObjectService =
ContentServiceFactory.getInstance().getDSpaceObjectService(dso);
DSpaceObject parentObject = null;
try {
parentObject = dSpaceObjectService.getParentObject(context, dso);
} catch (SQLException e) {
log.error(e);
}
return getDiscoveryDSOConfiguration(context, parentObject);
}
public DiscoveryConfiguration getDiscoveryConfiguration(final String name) { public DiscoveryConfiguration getDiscoveryConfiguration(final String name) {
return getDiscoveryConfiguration(name, true);
}
public DiscoveryConfiguration getDiscoveryConfiguration(final String name, boolean useDefault) {
DiscoveryConfiguration result; DiscoveryConfiguration result;
result = StringUtils.isBlank(name) ? null : getMap().get(name); result = StringUtils.isBlank(name) ? null : getMap().get(name);
if (result == null) { if (result == null && useDefault) {
//No specific configuration, get the default one //No specific configuration, get the default one
result = getMap().get("default"); result = getMap().get("default");
} }
@@ -68,11 +106,12 @@ public class DiscoveryConfigurationService {
} }
public DiscoveryConfiguration getDiscoveryConfigurationByNameOrDso(final String configurationName, public DiscoveryConfiguration getDiscoveryConfigurationByNameOrDso(final String configurationName,
final Context context,
final IndexableObject dso) { final IndexableObject dso) {
if (StringUtils.isNotBlank(configurationName) && getMap().containsKey(configurationName)) { if (StringUtils.isNotBlank(configurationName) && getMap().containsKey(configurationName)) {
return getMap().get(configurationName); return getMap().get(configurationName);
} else { } else {
return getDiscoveryConfiguration(dso); return getDiscoveryConfiguration(context, dso);
} }
} }

View File

@@ -86,7 +86,7 @@ public class CollectionIndexFactoryImpl extends DSpaceObjectIndexFactoryImpl<Ind
final Collection collection = indexableCollection.getIndexedObject(); final Collection collection = indexableCollection.getIndexedObject();
// Retrieve configuration // Retrieve configuration
DiscoveryConfiguration discoveryConfiguration = SearchUtils.getDiscoveryConfiguration(collection); DiscoveryConfiguration discoveryConfiguration = SearchUtils.getDiscoveryConfiguration(context, collection);
DiscoveryHitHighlightingConfiguration highlightingConfiguration = discoveryConfiguration DiscoveryHitHighlightingConfiguration highlightingConfiguration = discoveryConfiguration
.getHitHighlightingConfiguration(); .getHitHighlightingConfiguration();
List<String> highlightedMetadataFields = new ArrayList<>(); List<String> highlightedMetadataFields = new ArrayList<>();
@@ -173,4 +173,4 @@ public class CollectionIndexFactoryImpl extends DSpaceObjectIndexFactoryImpl<Ind
return locations; return locations;
} }
} }

View File

@@ -69,7 +69,7 @@ public class CommunityIndexFactoryImpl extends DSpaceObjectIndexFactoryImpl<Inde
final Community community = indexableObject.getIndexedObject(); final Community community = indexableObject.getIndexedObject();
// Retrieve configuration // Retrieve configuration
DiscoveryConfiguration discoveryConfiguration = SearchUtils.getDiscoveryConfiguration(community); DiscoveryConfiguration discoveryConfiguration = SearchUtils.getDiscoveryConfiguration(context, community);
DiscoveryHitHighlightingConfiguration highlightingConfiguration = discoveryConfiguration DiscoveryHitHighlightingConfiguration highlightingConfiguration = discoveryConfiguration
.getHitHighlightingConfiguration(); .getHitHighlightingConfiguration();
List<String> highlightedMetadataFields = new ArrayList<>(); List<String> highlightedMetadataFields = new ArrayList<>();
@@ -135,4 +135,4 @@ public class CommunityIndexFactoryImpl extends DSpaceObjectIndexFactoryImpl<Inde
return locations; return locations;
} }
} }

View File

@@ -73,11 +73,11 @@ public abstract class InprogressSubmissionIndexFactoryImpl
// Add item metadata // Add item metadata
List<DiscoveryConfiguration> discoveryConfigurations; List<DiscoveryConfiguration> discoveryConfigurations;
if (inProgressSubmission instanceof WorkflowItem) { if (inProgressSubmission instanceof WorkflowItem) {
discoveryConfigurations = SearchUtils.getAllDiscoveryConfigurations((WorkflowItem) inProgressSubmission); discoveryConfigurations = SearchUtils.getAllDiscoveryConfigurations(context, (WorkflowItem) inProgressSubmission);
} else if (inProgressSubmission instanceof WorkspaceItem) { } else if (inProgressSubmission instanceof WorkspaceItem) {
discoveryConfigurations = SearchUtils.getAllDiscoveryConfigurations((WorkspaceItem) inProgressSubmission); discoveryConfigurations = SearchUtils.getAllDiscoveryConfigurations(context, (WorkspaceItem) inProgressSubmission);
} else { } else {
discoveryConfigurations = SearchUtils.getAllDiscoveryConfigurations(item); discoveryConfigurations = SearchUtils.getAllDiscoveryConfigurations(item, context);
} }
indexableItemService.addDiscoveryFields(doc, context, item, discoveryConfigurations); indexableItemService.addDiscoveryFields(doc, context, item, discoveryConfigurations);
indexableCollectionService.storeCommunityCollectionLocations(doc, locations); indexableCollectionService.storeCommunityCollectionLocations(doc, locations);

View File

@@ -147,7 +147,7 @@ public class ItemIndexFactoryImpl extends DSpaceObjectIndexFactoryImpl<Indexable
} }
// Add the item metadata // Add the item metadata
List<DiscoveryConfiguration> discoveryConfigurations = SearchUtils.getAllDiscoveryConfigurations(item); List<DiscoveryConfiguration> discoveryConfigurations = SearchUtils.getAllDiscoveryConfigurations(item, context);
addDiscoveryFields(doc, context, indexableItem.getIndexedObject(), discoveryConfigurations); addDiscoveryFields(doc, context, indexableItem.getIndexedObject(), discoveryConfigurations);
//mandatory facet to show status on mydspace //mandatory facet to show status on mydspace

View File

@@ -84,7 +84,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository {
IndexableObject scopeObject = scopeResolver.resolveScope(context, dsoScope); IndexableObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
DiscoveryConfiguration discoveryConfiguration = searchConfigurationService DiscoveryConfiguration discoveryConfiguration = searchConfigurationService
.getDiscoveryConfigurationByNameOrDso(configuration, scopeObject); .getDiscoveryConfigurationByNameOrDso(configuration, context, scopeObject);
return discoverConfigurationConverter.convert(discoveryConfiguration, utils.obtainProjection()); return discoverConfigurationConverter.convert(discoveryConfiguration, utils.obtainProjection());
} }
@@ -96,7 +96,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository {
Context context = obtainContext(); Context context = obtainContext();
IndexableObject scopeObject = scopeResolver.resolveScope(context, dsoScope); IndexableObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
DiscoveryConfiguration discoveryConfiguration = searchConfigurationService DiscoveryConfiguration discoveryConfiguration = searchConfigurationService
.getDiscoveryConfigurationByNameOrDso(configuration, scopeObject); .getDiscoveryConfigurationByNameOrDso(configuration, context, scopeObject);
DiscoverResult searchResult = null; DiscoverResult searchResult = null;
DiscoverQuery discoverQuery = null; DiscoverQuery discoverQuery = null;
@@ -121,7 +121,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository {
IndexableObject scopeObject = scopeResolver.resolveScope(context, dsoScope); IndexableObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
DiscoveryConfiguration discoveryConfiguration = searchConfigurationService DiscoveryConfiguration discoveryConfiguration = searchConfigurationService
.getDiscoveryConfigurationByNameOrDso(configuration, scopeObject); .getDiscoveryConfigurationByNameOrDso(configuration, context, scopeObject);
return discoverFacetConfigurationConverter.convert(configuration, dsoScope, discoveryConfiguration); return discoverFacetConfigurationConverter.convert(configuration, dsoScope, discoveryConfiguration);
} }
@@ -138,7 +138,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository {
IndexableObject scopeObject = scopeResolver.resolveScope(context, dsoScope); IndexableObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
DiscoveryConfiguration discoveryConfiguration = searchConfigurationService DiscoveryConfiguration discoveryConfiguration = searchConfigurationService
.getDiscoveryConfigurationByNameOrDso(configuration, scopeObject); .getDiscoveryConfigurationByNameOrDso(configuration, context, scopeObject);
DiscoverQuery discoverQuery = queryBuilder.buildFacetQuery(context, scopeObject, discoveryConfiguration, prefix, DiscoverQuery discoverQuery = queryBuilder.buildFacetQuery(context, scopeObject, discoveryConfiguration, prefix,
query, searchFilters, dsoTypes, page, facetName); query, searchFilters, dsoTypes, page, facetName);
@@ -157,7 +157,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository {
Pageable page = PageRequest.of(1, 1); Pageable page = PageRequest.of(1, 1);
IndexableObject scopeObject = scopeResolver.resolveScope(context, dsoScope); IndexableObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
DiscoveryConfiguration discoveryConfiguration = searchConfigurationService DiscoveryConfiguration discoveryConfiguration = searchConfigurationService
.getDiscoveryConfigurationByNameOrDso(configuration, scopeObject); .getDiscoveryConfigurationByNameOrDso(configuration, context, scopeObject);
DiscoverResult searchResult = null; DiscoverResult searchResult = null;
DiscoverQuery discoverQuery = null; DiscoverQuery discoverQuery = null;