mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-07 10:04:21 +00:00
Merge pull request #1024 from mwoodiupui/DS-2701-oai-main
[DS-2701] dspace-oai
This commit is contained in:
@@ -207,6 +207,13 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
|
||||
return itemDAO.findAllByCollection(context, collection);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Item> findInArchiveOrWithdrawnDiscoverableModifiedSince(Context context, Date since)
|
||||
throws SQLException
|
||||
{
|
||||
return itemDAO.findAll(context, true, true, true, since);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateLastModified(Context context, Item item) throws SQLException, AuthorizeException {
|
||||
item.setLastModified(new Date());
|
||||
@@ -223,7 +230,7 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
|
||||
|
||||
@Override
|
||||
public List<Community> getCommunities(Context context, Item item) throws SQLException {
|
||||
List<Community> result = new ArrayList<Community>();
|
||||
List<Community> result = new ArrayList<>();
|
||||
List<Collection> collections = item.getCollections();
|
||||
for (Collection collection : collections) {
|
||||
List<Community> owningCommunities = collection.getCommunities();
|
||||
@@ -238,7 +245,7 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
|
||||
|
||||
@Override
|
||||
public List<Bundle> getBundles(Item item, String name) throws SQLException {
|
||||
List<Bundle> matchingBundles = new ArrayList<Bundle>();
|
||||
List<Bundle> matchingBundles = new ArrayList<>();
|
||||
// now only keep bundles with matching names
|
||||
List<Bundle> bunds = item.getBundles();
|
||||
for (Bundle bund : bunds) {
|
||||
@@ -316,7 +323,7 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
|
||||
|
||||
@Override
|
||||
public List<Bitstream> getNonInternalBitstreams(Context context, Item item) throws SQLException {
|
||||
List<Bitstream> bitstreamList = new ArrayList<Bitstream>();
|
||||
List<Bitstream> bitstreamList = new ArrayList<>();
|
||||
|
||||
// Go through the bundles and bitstreams picking out ones which aren't
|
||||
// of internal formats
|
||||
@@ -646,13 +653,7 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
|
||||
public boolean isOwningCollection(Item item, Collection collection) {
|
||||
Collection owningCollection = item.getOwningCollection();
|
||||
|
||||
if (owningCollection != null && collection.getID().equals(owningCollection.getID()))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// not the owner
|
||||
return false;
|
||||
return owningCollection != null && collection.getID().equals(owningCollection.getID());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -874,13 +875,7 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
|
||||
return true;
|
||||
}
|
||||
|
||||
// is this person an COLLECTION_EDITOR for the owning collection?
|
||||
if (collectionService.canEditBoolean(context, item.getOwningCollection(), false))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return collectionService.canEditBoolean(context, item.getOwningCollection(), false);
|
||||
}
|
||||
|
||||
|
||||
@@ -1132,4 +1127,11 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
|
||||
public Item findByLegacyId(Context context, int id) throws SQLException {
|
||||
return itemDAO.findByLegacyId(context, id, Item.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Item> findByLastModifiedSince(Context context, Date last)
|
||||
throws SQLException
|
||||
{
|
||||
return itemDAO.findByLastModifiedSince(context, last);
|
||||
}
|
||||
}
|
||||
|
@@ -102,4 +102,12 @@ public class MetadataValueServiceImpl implements MetadataValueService {
|
||||
public void deleteByMetadataField(Context context, MetadataField metadataField) throws SQLException {
|
||||
metadataValueDAO.deleteByMetadataField(context, metadataField);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MetadataValue getMinimum(Context context, int metadataFieldId)
|
||||
throws SQLException
|
||||
{
|
||||
return metadataValueDAO.getMinimum(context,
|
||||
metadataFieldId);
|
||||
}
|
||||
}
|
||||
|
@@ -14,6 +14,7 @@ import org.dspace.core.Context;
|
||||
import org.dspace.eperson.EPerson;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
@@ -29,6 +30,16 @@ public interface ItemDAO extends DSpaceObjectLegacySupportDAO<Item>
|
||||
|
||||
public Iterator<Item> findAll(Context context, boolean archived, boolean withdrawn) throws SQLException;
|
||||
|
||||
/**
|
||||
* Find all Items modified since a Date.
|
||||
*
|
||||
* @param context
|
||||
* @param since Earliest interesting last-modified date.
|
||||
* @return
|
||||
*/
|
||||
public Iterator<Item> findByLastModifiedSince(Context context, Date since)
|
||||
throws SQLException;
|
||||
|
||||
public Iterator<Item> findBySubmitter(Context context, EPerson eperson) throws SQLException;
|
||||
|
||||
public Iterator<Item> findBySubmitter(Context context, EPerson eperson, MetadataField metadataField, int limit) throws SQLException;
|
||||
@@ -42,4 +53,17 @@ public interface ItemDAO extends DSpaceObjectLegacySupportDAO<Item>
|
||||
public Iterator<Item> findAllByCollection(Context context, Collection collection) throws SQLException;
|
||||
|
||||
public int countItems(Context context, Collection collection, boolean includeArchived, boolean includeWithdrawn) throws SQLException;
|
||||
|
||||
/**
|
||||
* Get all Items installed or withdrawn, discoverable, and modified since a Date.
|
||||
* @param context
|
||||
* @param archived
|
||||
* @param withdrawn
|
||||
* @param discoverable
|
||||
* @param lastModified earliest interesting last-modified date.
|
||||
* @return
|
||||
*/
|
||||
public Iterator<Item> findAll(Context context, boolean archived,
|
||||
boolean withdrawn, boolean discoverable, Date lastModified)
|
||||
throws SQLException;
|
||||
}
|
||||
|
@@ -29,4 +29,7 @@ public interface MetadataValueDAO extends GenericDAO<MetadataValue> {
|
||||
public List<MetadataValue> findByValueLike(Context context, String value) throws SQLException;
|
||||
|
||||
public void deleteByMetadataField(Context context, MetadataField metadataField) throws SQLException;
|
||||
|
||||
public MetadataValue getMinimum(Context context, int metadataFieldId)
|
||||
throws SQLException;
|
||||
}
|
||||
|
@@ -18,6 +18,7 @@ import org.hibernate.Query;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
@@ -43,6 +44,22 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO<Item> implements ItemDA
|
||||
return iterate(query);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Item> findAll(Context context, boolean archived,
|
||||
boolean withdrawn, boolean discoverable, Date lastModified)
|
||||
throws SQLException
|
||||
{
|
||||
Query query = createQuery(context, "SELECT i FROM Item i"
|
||||
+ " WHERE (inArchive = :in_archive OR withdrawn = :withdrawn)"
|
||||
+ " AND discoverable = :discoverable"
|
||||
+ " AND last_modified > :last_modified");
|
||||
query.setParameter("in_archive", archived);
|
||||
query.setParameter("withdrawn", withdrawn);
|
||||
query.setParameter("discoverable", discoverable);
|
||||
query.setParameter("last_modified", lastModified);
|
||||
return iterate(query);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Item> findBySubmitter(Context context, EPerson eperson) throws SQLException {
|
||||
Query query = createQuery(context, "FROM Item WHERE inArchive= :in_archive and submitter= :submitter");
|
||||
@@ -126,4 +143,13 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO<Item> implements ItemDA
|
||||
|
||||
return count(query);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Item> findByLastModifiedSince(Context context, Date since)
|
||||
throws SQLException
|
||||
{
|
||||
Query query = createQuery(context, "SELECT i FROM item i WHERE last_modified > :last_modified");
|
||||
query.setParameter("last_modified", since);
|
||||
return iterate(query);
|
||||
}
|
||||
}
|
||||
|
@@ -55,4 +55,15 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO<MetadataValue> im
|
||||
query.setParameter("metadataField", metadataField);
|
||||
query.executeUpdate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public MetadataValue getMinimum(Context context, int metadataFieldId)
|
||||
throws SQLException
|
||||
{
|
||||
String queryString = "SELECT m FROM metadatavalue m WHERE metadata_field_id = :metadata_field_id ORDER BY value";
|
||||
Query query = createQuery(context, queryString);
|
||||
query.setParameter("metadata_field_id", metadataFieldId);
|
||||
query.setMaxResults(1);
|
||||
return (MetadataValue) query.uniqueResult();
|
||||
}
|
||||
}
|
||||
|
@@ -17,6 +17,7 @@ import org.dspace.eperson.Group;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
@@ -116,6 +117,15 @@ public interface ItemService extends DSpaceObjectService<Item>, DSpaceObjectLega
|
||||
*/
|
||||
public Iterator<Item> findByCollection(Context context, Collection collection, Integer limit, Integer offset) throws SQLException;
|
||||
|
||||
/**
|
||||
* Get all Items installed or withdrawn, discoverable, and modified since a Date.
|
||||
* @param context
|
||||
* @param since earliest interesting last-modified date, or null for no date test.
|
||||
* @return
|
||||
*/
|
||||
public Iterator<Item> findInArchiveOrWithdrawnDiscoverableModifiedSince(Context context, Date since)
|
||||
throws SQLException;
|
||||
|
||||
/**
|
||||
* Get all the items in this collection. The order is indeterminate.
|
||||
*
|
||||
@@ -429,4 +439,14 @@ public interface ItemService extends DSpaceObjectService<Item>, DSpaceObjectLega
|
||||
* @return total items
|
||||
*/
|
||||
public int countItems(Context context, Collection collection) throws SQLException;
|
||||
|
||||
/**
|
||||
* Find all Items modified since a Date.
|
||||
*
|
||||
* @param context
|
||||
* @param last Earliest interesting last-modified date.
|
||||
* @return
|
||||
*/
|
||||
public Iterator<Item> findByLastModifiedSince(Context context, Date last)
|
||||
throws SQLException;
|
||||
}
|
@@ -80,4 +80,15 @@ public interface MetadataValueService {
|
||||
public List<MetadataValue> findByValueLike(Context context, String value) throws SQLException;
|
||||
|
||||
public void deleteByMetadataField(Context context, MetadataField metadataField) throws SQLException;
|
||||
|
||||
/**
|
||||
* Get the minimum value of a given metadata field across all objects.
|
||||
*
|
||||
* @param context
|
||||
* @param metadataFieldId unique identifier of the interesting field.
|
||||
* @return
|
||||
* @throws SQLException
|
||||
*/
|
||||
public MetadataValue getMinimum(Context context, int metadataFieldId)
|
||||
throws SQLException;
|
||||
}
|
||||
|
@@ -8,10 +8,8 @@
|
||||
package org.dspace.core;
|
||||
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.dspace.core.GenericDAO;
|
||||
import org.hibernate.*;
|
||||
import org.hibernate.criterion.Projections;
|
||||
import org.hibernate.type.StandardBasicTypes;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.Iterator;
|
||||
@@ -19,7 +17,8 @@ import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* Hibernate implementation for generic DAO interface, also includes additional hibernate calls that are comonly used
|
||||
* Hibernate implementation for generic DAO interface. Also includes additional
|
||||
* Hibernate calls that are commonly used.
|
||||
* Each DAO should extend this class to prevent code duplication.
|
||||
*
|
||||
* @author kevinvandevelde at atmire.com
|
||||
@@ -83,6 +82,14 @@ public abstract class AbstractHibernateDAO<T> implements GenericDAO<T> {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a JPA Criteria query and return a collection of results.
|
||||
*
|
||||
* @param context
|
||||
* @param query
|
||||
* @return
|
||||
* @throws SQLException
|
||||
*/
|
||||
public List<T> findMany(Context context, Query query) throws SQLException {
|
||||
@SuppressWarnings("unchecked")
|
||||
List<T> result = (List<T>) query.list();
|
||||
@@ -116,8 +123,9 @@ public abstract class AbstractHibernateDAO<T> implements GenericDAO<T> {
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a unique result from the query, if multiple results CAN be retrieved an exception will be thrown
|
||||
* so only use when the criteria state uniqueness in the database
|
||||
* Retrieve a unique result from the query. If multiple results CAN be
|
||||
* retrieved an exception will be thrown,
|
||||
* so only use when the criteria state uniqueness in the database.
|
||||
* @param criteria
|
||||
* @return
|
||||
*/
|
||||
@@ -129,7 +137,8 @@ public abstract class AbstractHibernateDAO<T> implements GenericDAO<T> {
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a single result from the query, best used if you expect a single result but this isn't enforced on the database
|
||||
* Retrieve a single result from the query. Best used if you expect a
|
||||
* single result, but this isn't enforced on the database.
|
||||
* @param criteria
|
||||
* @return
|
||||
*/
|
||||
|
@@ -12,7 +12,7 @@ import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* Generic Database Access Object interface class that should be implemented by all DAO's.
|
||||
* Generic Database Access Object interface class that should be implemented by all DAOs.
|
||||
* It offers up a lot of general methods so these don't need to be declared again in each DAO.
|
||||
* The default hibernate implementation offers up a class that implements all these methods.
|
||||
*
|
||||
@@ -26,13 +26,37 @@ public interface GenericDAO<T>
|
||||
|
||||
public void delete(Context context, T t) throws SQLException;
|
||||
|
||||
/**
|
||||
* Fetch all persisted instances of a given object type.
|
||||
*
|
||||
* @param context
|
||||
* @param clazz the desired type.
|
||||
* @return
|
||||
* @throws SQLException
|
||||
*/
|
||||
public List<T> findAll(Context context, Class<T> clazz) throws SQLException;
|
||||
|
||||
/**
|
||||
* Execute a JPQL query returning a unique result.
|
||||
*
|
||||
* @param context
|
||||
* @param query
|
||||
* @return
|
||||
* @throws SQLException
|
||||
*/
|
||||
public T findUnique(Context context, String query) throws SQLException;
|
||||
|
||||
public T findByID(Context context, Class clazz, int id) throws SQLException;
|
||||
|
||||
public T findByID(Context context, Class clazz, UUID id) throws SQLException;
|
||||
|
||||
/**
|
||||
* Execute a JPQL query and return a collection of results.
|
||||
*
|
||||
* @param context
|
||||
* @param query
|
||||
* @return
|
||||
* @throws SQLException
|
||||
*/
|
||||
public List<T> findMany(Context context, String query) throws SQLException;
|
||||
}
|
||||
|
@@ -7,6 +7,14 @@
|
||||
*/
|
||||
package org.dspace.xoai.app;
|
||||
|
||||
import org.dspace.xoai.services.impl.DSpaceFieldResolver;
|
||||
import org.dspace.xoai.services.impl.DSpaceHandleResolver;
|
||||
import org.dspace.xoai.services.impl.DSpaceEarliestDateResolver;
|
||||
import org.dspace.xoai.services.impl.DSpaceCollectionsService;
|
||||
import org.dspace.xoai.services.api.EarliestDateResolver;
|
||||
import org.dspace.xoai.services.api.CollectionsService;
|
||||
import org.dspace.xoai.services.api.HandleResolver;
|
||||
import org.dspace.xoai.services.api.FieldResolver;
|
||||
import com.lyncode.xoai.dataprovider.services.api.ResourceResolver;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.dspace.xoai.services.api.cache.XOAICacheService;
|
||||
@@ -16,13 +24,11 @@ import org.dspace.xoai.services.api.config.ConfigurationService;
|
||||
import org.dspace.xoai.services.api.config.XOAIManagerResolver;
|
||||
import org.dspace.xoai.services.api.config.XOAIManagerResolverException;
|
||||
import org.dspace.xoai.services.api.context.ContextService;
|
||||
import org.dspace.xoai.services.api.database.*;
|
||||
import org.dspace.xoai.services.api.solr.SolrQueryResolver;
|
||||
import org.dspace.xoai.services.api.solr.SolrServerResolver;
|
||||
import org.dspace.xoai.services.api.xoai.DSpaceFilterResolver;
|
||||
import org.dspace.xoai.services.api.xoai.IdentifyResolver;
|
||||
import org.dspace.xoai.services.api.xoai.ItemRepositoryResolver;
|
||||
import org.dspace.xoai.services.api.xoai.SetRepositoryResolver;
|
||||
import org.dspace.xoai.services.impl.cache.DSpaceEmptyCacheService;
|
||||
import org.dspace.xoai.services.impl.cache.DSpaceXOAICacheService;
|
||||
import org.dspace.xoai.services.impl.cache.DSpaceXOAIItemCacheService;
|
||||
@@ -30,14 +36,12 @@ import org.dspace.xoai.services.impl.cache.DSpaceXOAILastCompilationCacheService
|
||||
import org.dspace.xoai.services.impl.config.DSpaceConfigurationService;
|
||||
import org.dspace.xoai.services.impl.context.DSpaceContextService;
|
||||
import org.dspace.xoai.services.impl.context.DSpaceXOAIManagerResolver;
|
||||
import org.dspace.xoai.services.impl.database.*;
|
||||
import org.dspace.xoai.services.impl.resources.DSpaceResourceResolver;
|
||||
import org.dspace.xoai.services.impl.solr.DSpaceSolrQueryResolver;
|
||||
import org.dspace.xoai.services.impl.solr.DSpaceSolrServerResolver;
|
||||
import org.dspace.xoai.services.impl.xoai.BaseDSpaceFilterResolver;
|
||||
import org.dspace.xoai.services.impl.xoai.DSpaceIdentifyResolver;
|
||||
import org.dspace.xoai.services.impl.xoai.DSpaceItemRepositoryResolver;
|
||||
import org.dspace.xoai.services.impl.xoai.DSpaceSetRepositoryResolver;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@@ -111,10 +115,6 @@ public class BasicConfiguration {
|
||||
return new DSpaceItemRepositoryResolver();
|
||||
}
|
||||
@Bean
|
||||
public SetRepositoryResolver setRepositoryResolver () {
|
||||
return new DSpaceSetRepositoryResolver();
|
||||
}
|
||||
@Bean
|
||||
public IdentifyResolver identifyResolver () {
|
||||
return new DSpaceIdentifyResolver();
|
||||
}
|
||||
@@ -126,7 +126,7 @@ public class BasicConfiguration {
|
||||
|
||||
@Bean
|
||||
public HandleResolver handleResolver () {
|
||||
return new DSpaceHandlerResolver();
|
||||
return new DSpaceHandleResolver();
|
||||
}
|
||||
|
||||
@Bean
|
||||
@@ -138,8 +138,4 @@ public class BasicConfiguration {
|
||||
public SolrQueryResolver solrQueryResolver () {
|
||||
return new DSpaceSolrQueryResolver();
|
||||
}
|
||||
@Bean
|
||||
public DatabaseQueryResolver databaseQueryResolver () {
|
||||
return new DSpaceDatabaseQueryResolver();
|
||||
}
|
||||
}
|
||||
|
@@ -23,14 +23,11 @@ import org.apache.solr.client.solrj.SolrServer;
|
||||
import org.apache.solr.client.solrj.SolrServerException;
|
||||
import org.apache.solr.common.SolrDocumentList;
|
||||
import org.apache.solr.common.SolrInputDocument;
|
||||
import org.dspace.authorize.AuthorizeException;
|
||||
import org.dspace.authorize.AuthorizeServiceImpl;
|
||||
import org.dspace.authorize.service.AuthorizeService;
|
||||
import org.dspace.content.*;
|
||||
import org.dspace.core.ConfigurationManager;
|
||||
import org.dspace.core.Constants;
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.storage.rdbms.DatabaseManager;
|
||||
import org.dspace.storage.rdbms.TableRowIterator;
|
||||
import org.dspace.xoai.exceptions.CompilingException;
|
||||
import org.dspace.xoai.services.api.cache.XOAICacheService;
|
||||
import org.dspace.xoai.services.api.cache.XOAIItemCacheService;
|
||||
@@ -38,7 +35,7 @@ import org.dspace.xoai.services.api.cache.XOAILastCompilationCacheService;
|
||||
import org.dspace.xoai.services.api.config.ConfigurationService;
|
||||
import org.dspace.xoai.services.api.config.XOAIManagerResolver;
|
||||
import org.dspace.xoai.services.api.context.ContextService;
|
||||
import org.dspace.xoai.services.api.database.CollectionsService;
|
||||
import org.dspace.xoai.services.api.CollectionsService;
|
||||
import org.dspace.xoai.services.api.solr.SolrServerResolver;
|
||||
import org.dspace.xoai.solr.DSpaceSolrSearch;
|
||||
import org.dspace.xoai.solr.exceptions.DSpaceSolrException;
|
||||
@@ -55,10 +52,12 @@ import java.text.ParseException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import javax.inject.Inject;
|
||||
import org.dspace.content.service.ItemService;
|
||||
|
||||
import static com.lyncode.xoai.dataprovider.core.Granularity.Second;
|
||||
import static org.dspace.content.Item.find;
|
||||
import static org.dspace.xoai.util.ItemUtils.retrieveMetadata;
|
||||
|
||||
/**
|
||||
@@ -68,9 +67,9 @@ import static org.dspace.xoai.util.ItemUtils.retrieveMetadata;
|
||||
public class XOAI {
|
||||
private static Logger log = LogManager.getLogger(XOAI.class);
|
||||
|
||||
private Context context;
|
||||
private final Context context;
|
||||
private boolean optimize;
|
||||
private boolean verbose;
|
||||
private final boolean verbose;
|
||||
private boolean clean;
|
||||
|
||||
@Autowired
|
||||
@@ -87,15 +86,19 @@ public class XOAI {
|
||||
private XOAIItemCacheService xoaiItemCacheService;
|
||||
@Autowired
|
||||
private CollectionsService collectionsService;
|
||||
@Inject
|
||||
private AuthorizeService authorizeService;
|
||||
@Inject
|
||||
private ItemService itemService;
|
||||
|
||||
|
||||
private static List<String> getFileFormats(Item item) {
|
||||
List<String> formats = new ArrayList<String>();
|
||||
private List<String> getFileFormats(Item item) {
|
||||
List<String> formats = new ArrayList<>();
|
||||
try {
|
||||
for (Bundle b : item.getBundles("ORIGINAL")) {
|
||||
for (Bitstream bs : b.getBitstreams()) {
|
||||
if (!formats.contains(bs.getFormat().getMIMEType())) {
|
||||
formats.add(bs.getFormat().getMIMEType());
|
||||
for (Bundle b : itemService.getBundles(item, "ORIGINAL")) {
|
||||
for (BundleBitstream bs : b.getBitstreams()) {
|
||||
if (!formats.contains(bs.getBitstream().getFormat(context).getMIMEType())) {
|
||||
formats.add(bs.getBitstream().getFormat(context).getMIMEType());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -154,11 +157,7 @@ public class XOAI {
|
||||
// Set last compilation date
|
||||
xoaiLastCompilationCacheService.put(new Date());
|
||||
return result;
|
||||
} catch (DSpaceSolrException ex) {
|
||||
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
|
||||
} catch (SolrServerException ex) {
|
||||
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
|
||||
} catch (IOException ex) {
|
||||
} catch (DSpaceSolrException | SolrServerException | IOException ex) {
|
||||
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
@@ -169,16 +168,9 @@ public class XOAI {
|
||||
+ last.toString());
|
||||
// Index both in_archive items AND withdrawn items. Withdrawn items will be flagged withdrawn
|
||||
// (in order to notify external OAI harvesters of their new status)
|
||||
String sqlQuery = "SELECT item_id FROM item WHERE (in_archive=TRUE OR withdrawn=TRUE) AND discoverable=TRUE AND last_modified > ?";
|
||||
if(DatabaseManager.isOracle()){
|
||||
sqlQuery = "SELECT item_id FROM item WHERE (in_archive=1 OR withdrawn=1) AND discoverable=1 AND last_modified > ?";
|
||||
}
|
||||
|
||||
try {
|
||||
TableRowIterator iterator = DatabaseManager
|
||||
.query(context,
|
||||
sqlQuery,
|
||||
new java.sql.Timestamp(last.getTime()));
|
||||
Iterator<Item> iterator = itemService.findInArchiveOrWithdrawnDiscoverableModifiedSince(
|
||||
context, last);
|
||||
return this.index(iterator);
|
||||
} catch (SQLException ex) {
|
||||
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
|
||||
@@ -190,38 +182,25 @@ public class XOAI {
|
||||
try {
|
||||
// Index both in_archive items AND withdrawn items. Withdrawn items will be flagged withdrawn
|
||||
// (in order to notify external OAI harvesters of their new status)
|
||||
String sqlQuery = "SELECT item_id FROM item WHERE (in_archive=TRUE OR withdrawn=TRUE) AND discoverable=TRUE";
|
||||
if(DatabaseManager.isOracle()){
|
||||
sqlQuery = "SELECT item_id FROM item WHERE (in_archive=1 OR withdrawn=1) AND discoverable=1";
|
||||
}
|
||||
|
||||
TableRowIterator iterator = DatabaseManager.query(context,
|
||||
sqlQuery);
|
||||
Iterator<Item> iterator = itemService.findInArchiveOrWithdrawnDiscoverableModifiedSince(
|
||||
context, null);
|
||||
return this.index(iterator);
|
||||
} catch (SQLException ex) {
|
||||
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
|
||||
private int index(TableRowIterator iterator)
|
||||
private int index(Iterator<Item> iterator)
|
||||
throws DSpaceSolrIndexerException {
|
||||
try {
|
||||
int i = 0;
|
||||
SolrServer server = solrServerResolver.getServer();
|
||||
while (iterator.hasNext()) {
|
||||
try {
|
||||
server.add(this.index(find(context, iterator.next().getIntColumn("item_id"))));
|
||||
context.clearCache();
|
||||
} catch (SQLException ex) {
|
||||
server.add(this.index(iterator.next()));
|
||||
} catch (SQLException | MetadataBindException | ParseException
|
||||
| XMLStreamException | WritingXmlException ex) {
|
||||
log.error(ex.getMessage(), ex);
|
||||
} catch (MetadataBindException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
} catch (ParseException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
} catch (XMLStreamException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
} catch (WritingXmlException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
i++;
|
||||
if (i % 100 == 0) System.out.println(i + " items imported so far...");
|
||||
@@ -229,11 +208,7 @@ public class XOAI {
|
||||
System.out.println("Total: " + i + " items");
|
||||
server.commit();
|
||||
return i;
|
||||
} catch (SQLException ex) {
|
||||
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
|
||||
} catch (SolrServerException ex) {
|
||||
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
|
||||
} catch (IOException ex) {
|
||||
} catch (SolrServerException | IOException ex) {
|
||||
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
@@ -257,17 +232,20 @@ public class XOAI {
|
||||
doc.addField("item.communities",
|
||||
"com_" + com.getHandle().replace("/", "_"));
|
||||
|
||||
Metadatum[] allData = item.getMetadata(Item.ANY, Item.ANY, Item.ANY,
|
||||
Item.ANY);
|
||||
for (Metadatum dc : allData) {
|
||||
String key = "metadata." + dc.schema + "." + dc.element;
|
||||
if (dc.qualifier != null) {
|
||||
key += "." + dc.qualifier;
|
||||
List<MetadataValue> allData = itemService.getMetadata(item,
|
||||
Item.ANY, Item.ANY, Item.ANY, Item.ANY);
|
||||
for (MetadataValue dc : allData) {
|
||||
MetadataField field = dc.getMetadataField();
|
||||
String key = "metadata."
|
||||
+ field.getMetadataSchema().getName() + "."
|
||||
+ field.getElement();
|
||||
if (field.getQualifier() != null) {
|
||||
key += "." + field.getQualifier();
|
||||
}
|
||||
doc.addField(key, dc.value);
|
||||
if (dc.authority != null) {
|
||||
doc.addField(key + ".authority", dc.authority);
|
||||
doc.addField(key + ".confidence", dc.confidence + "");
|
||||
doc.addField(key, dc.getValue());
|
||||
if (dc.getAuthority() != null) {
|
||||
doc.addField(key + ".authority", dc.getAuthority());
|
||||
doc.addField(key + ".confidence", dc.getConfidence() + "");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,10 +254,10 @@ public class XOAI {
|
||||
}
|
||||
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
XmlOutputContext context = XmlOutputContext.emptyContext(out, Second);
|
||||
retrieveMetadata(item).write(context);
|
||||
context.getWriter().flush();
|
||||
context.getWriter().close();
|
||||
XmlOutputContext xmlContext = XmlOutputContext.emptyContext(out, Second);
|
||||
retrieveMetadata(context, item).write(xmlContext);
|
||||
xmlContext.getWriter().flush();
|
||||
xmlContext.getWriter().close();
|
||||
doc.addField("item.compile", out.toString());
|
||||
|
||||
if (verbose) {
|
||||
@@ -294,7 +272,7 @@ public class XOAI {
|
||||
boolean pub = false;
|
||||
try {
|
||||
//Check if READ access allowed on this Item
|
||||
pub = AuthorizeManager.authorizeActionBoolean(context, item, Constants.READ);
|
||||
pub = authorizeService.authorizeActionBoolean(context, item, Constants.READ);
|
||||
} catch (SQLException ex) {
|
||||
log.error(ex.getMessage());
|
||||
}
|
||||
@@ -327,9 +305,7 @@ public class XOAI {
|
||||
solrServerResolver.getServer().deleteByQuery("*:*");
|
||||
solrServerResolver.getServer().commit();
|
||||
System.out.println("Index cleared");
|
||||
} catch (SolrServerException ex) {
|
||||
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
|
||||
} catch (IOException ex) {
|
||||
} catch (SolrServerException | IOException ex) {
|
||||
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
@@ -449,30 +425,26 @@ public class XOAI {
|
||||
}
|
||||
|
||||
private void compile() throws CompilingException {
|
||||
ItemIterator iterator;
|
||||
Iterator<Item> iterator;
|
||||
try {
|
||||
Date last = xoaiLastCompilationCacheService.get();
|
||||
|
||||
if (last == null) {
|
||||
System.out.println("Retrieving all items to be compiled");
|
||||
iterator = Item.findAll(context);
|
||||
iterator = itemService.findAll(context);
|
||||
} else {
|
||||
System.out.println("Retrieving items modified after " + last + " to be compiled");
|
||||
String query = "SELECT * FROM item WHERE last_modified>?";
|
||||
iterator = new ItemIterator(context, DatabaseManager.query(context, query, new java.sql.Date(last.getTime())));
|
||||
iterator = itemService.findByLastModifiedSince(context, last);
|
||||
}
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
Item item = iterator.next();
|
||||
if (verbose) System.out.println("Compiling item with handle: " + item.getHandle());
|
||||
xoaiItemCacheService.put(item, retrieveMetadata(item));
|
||||
context.clearCache();
|
||||
xoaiItemCacheService.put(item, retrieveMetadata(context, item));
|
||||
}
|
||||
|
||||
xoaiLastCompilationCacheService.put(new Date());
|
||||
} catch (SQLException e) {
|
||||
throw new CompilingException(e);
|
||||
} catch (IOException e) {
|
||||
} catch (SQLException | IOException e) {
|
||||
throw new CompilingException(e);
|
||||
}
|
||||
System.out.println("Items compiled");
|
||||
|
@@ -1,74 +0,0 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.data;
|
||||
|
||||
import com.lyncode.xoai.dataprovider.core.ItemMetadata;
|
||||
import com.lyncode.xoai.dataprovider.core.ReferenceSet;
|
||||
import com.lyncode.xoai.dataprovider.xml.xoai.Metadata;
|
||||
import org.apache.log4j.LogManager;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.dspace.content.Item;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Lyncode Development Team <dspace@lyncode.com>
|
||||
*/
|
||||
public class DSpaceDatabaseItem extends DSpaceItem
|
||||
{
|
||||
private static Logger log = LogManager.getLogger(DSpaceDatabaseItem.class);
|
||||
|
||||
private Item item;
|
||||
private List<ReferenceSet> sets;
|
||||
|
||||
public DSpaceDatabaseItem(Item item, Metadata metadata, List<ReferenceSet> sets)
|
||||
{
|
||||
this.item = item;
|
||||
this.metadata = new ItemMetadata(metadata);
|
||||
this.sets = sets;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date getDatestamp()
|
||||
{
|
||||
return item.getLastModified();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ReferenceSet> getSets()
|
||||
{
|
||||
return sets;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDeleted()
|
||||
{
|
||||
return item.isWithdrawn();
|
||||
}
|
||||
|
||||
private ItemMetadata metadata = null;
|
||||
|
||||
@Override
|
||||
public ItemMetadata getMetadata()
|
||||
{
|
||||
return metadata;
|
||||
}
|
||||
|
||||
public Item getItem()
|
||||
{
|
||||
return item;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getHandle()
|
||||
{
|
||||
return item.getHandle();
|
||||
}
|
||||
}
|
@@ -7,33 +7,19 @@
|
||||
*/
|
||||
package org.dspace.xoai.filter;
|
||||
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.xoai.data.DSpaceItem;
|
||||
import org.dspace.xoai.filter.results.DatabaseFilterResult;
|
||||
import org.dspace.xoai.filter.results.SolrFilterResult;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class AndFilter extends DSpaceFilter {
|
||||
private DSpaceFilter left;
|
||||
private DSpaceFilter right;
|
||||
private final DSpaceFilter left;
|
||||
private final DSpaceFilter right;
|
||||
|
||||
public AndFilter(DSpaceFilter left, DSpaceFilter right) {
|
||||
this.left = left;
|
||||
this.right = right;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseFilterResult buildDatabaseQuery(Context context) {
|
||||
DatabaseFilterResult leftResult = left.buildDatabaseQuery(context);
|
||||
DatabaseFilterResult rightResult = right.buildDatabaseQuery(context);
|
||||
List<Object> param = new ArrayList<Object>();
|
||||
param.addAll(leftResult.getParameters());
|
||||
param.addAll(rightResult.getParameters());
|
||||
return new DatabaseFilterResult("("+leftResult.getQuery()+") AND ("+ rightResult.getQuery() +")", param);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SolrFilterResult buildSolrQuery() {
|
||||
return new SolrFilterResult("("+left.buildSolrQuery().getQuery()+") AND ("+right.buildSolrQuery().getQuery()+")");
|
||||
|
@@ -8,7 +8,6 @@
|
||||
|
||||
package org.dspace.xoai.filter;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -16,12 +15,8 @@ import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.log4j.LogManager;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.apache.solr.client.solrj.util.ClientUtils;
|
||||
import org.dspace.core.Constants;
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.xoai.data.DSpaceItem;
|
||||
import org.dspace.xoai.exceptions.InvalidMetadataFieldException;
|
||||
import org.dspace.xoai.filter.data.DSpaceMetadataFilterOperator;
|
||||
import org.dspace.xoai.filter.results.DatabaseFilterResult;
|
||||
import org.dspace.xoai.filter.results.SolrFilterResult;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
@@ -34,7 +29,7 @@ import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.SimpleType;
|
||||
* @author Lyncode Development Team <dspace@lyncode.com>
|
||||
*/
|
||||
public class DSpaceAtLeastOneMetadataFilter extends DSpaceFilter {
|
||||
private static Logger log = LogManager.getLogger(DSpaceAtLeastOneMetadataFilter.class);
|
||||
private static final Logger log = LogManager.getLogger(DSpaceAtLeastOneMetadataFilter.class);
|
||||
|
||||
private String field;
|
||||
private DSpaceMetadataFilterOperator operator = DSpaceMetadataFilterOperator.UNDEF;
|
||||
@@ -53,7 +48,7 @@ public class DSpaceAtLeastOneMetadataFilter extends DSpaceFilter {
|
||||
if (parameterValue == null) parameterValue = getConfiguration().get("values");
|
||||
|
||||
if (parameterValue instanceof SimpleType) {
|
||||
values = new ArrayList<String>();
|
||||
values = new ArrayList<>();
|
||||
values.add(((SimpleType) parameterValue).asString());
|
||||
} else if (parameterValue instanceof ParameterList) {
|
||||
values = new ListBuilder<ParameterValue>()
|
||||
@@ -64,7 +59,7 @@ public class DSpaceAtLeastOneMetadataFilter extends DSpaceFilter {
|
||||
return elem.asSimpleType().asString();
|
||||
}
|
||||
});
|
||||
} else values = new ArrayList<String>();
|
||||
} else values = new ArrayList<>();
|
||||
}
|
||||
return values;
|
||||
}
|
||||
@@ -76,21 +71,6 @@ public class DSpaceAtLeastOneMetadataFilter extends DSpaceFilter {
|
||||
return operator;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseFilterResult buildDatabaseQuery(Context context) {
|
||||
if (this.getField() != null) {
|
||||
try {
|
||||
int id = fieldResolver.getFieldID(context, this.getField());
|
||||
return this.getWhere(id, this.getValues());
|
||||
} catch (InvalidMetadataFieldException ex) {
|
||||
log.error(ex.getMessage(), ex);
|
||||
} catch (SQLException ex) {
|
||||
log.error(ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
return new DatabaseFilterResult();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShown(DSpaceItem item) {
|
||||
if (this.getField() == null)
|
||||
@@ -138,65 +118,10 @@ public class DSpaceAtLeastOneMetadataFilter extends DSpaceFilter {
|
||||
return false;
|
||||
}
|
||||
|
||||
private DatabaseFilterResult getWhere(int mdid, List<String> values) {
|
||||
List<String> parts = new ArrayList<String>();
|
||||
List<Object> params = new ArrayList<Object>();
|
||||
params.add(mdid);
|
||||
for (String v : values)
|
||||
this.buildWhere(v, parts, params);
|
||||
if (parts.size() > 0) {
|
||||
String query = "EXISTS (SELECT tmp.* FROM metadatavalue tmp WHERE tmp.resource_id=i.item_id AND tmp.resource_type_id=" + Constants.ITEM+ " AND tmp.metadata_field_id=?"
|
||||
+ " AND ("
|
||||
+ StringUtils.join(parts.iterator(), " OR ")
|
||||
+ "))";
|
||||
return new DatabaseFilterResult(query, params);
|
||||
}
|
||||
return new DatabaseFilterResult();
|
||||
}
|
||||
|
||||
private void buildWhere(String value, List<String> parts,
|
||||
List<Object> params) {
|
||||
switch (this.getOperator()) {
|
||||
case ENDS_WITH:
|
||||
parts.add("(tmp.text_value LIKE ?)");
|
||||
params.add("%" + value);
|
||||
break;
|
||||
case STARTS_WITH:
|
||||
parts.add("(tmp.text_value LIKE ?)");
|
||||
params.add(value + "%");
|
||||
break;
|
||||
case EQUAL:
|
||||
parts.add("(tmp.text_value LIKE ?)");
|
||||
params.add(value);
|
||||
break;
|
||||
case GREATER:
|
||||
parts.add("(tmp.text_value > ?)");
|
||||
params.add(value);
|
||||
break;
|
||||
case LOWER:
|
||||
parts.add("(tmp.text_value < ?)");
|
||||
params.add(value);
|
||||
break;
|
||||
case LOWER_OR_EQUAL:
|
||||
parts.add("(tmp.text_value <= ?)");
|
||||
params.add(value);
|
||||
break;
|
||||
case GREATER_OR_EQUAL:
|
||||
parts.add("(tmp.text_value >= ?)");
|
||||
params.add(value);
|
||||
break;
|
||||
case CONTAINS:
|
||||
default:
|
||||
parts.add("(tmp.text_value LIKE ?)");
|
||||
params.add("%" + value + "%");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public SolrFilterResult buildSolrQuery() {
|
||||
String field = this.getField();
|
||||
List<String> parts = new ArrayList<String>();
|
||||
List<String> parts = new ArrayList<>();
|
||||
if (this.getField() != null) {
|
||||
for (String v : this.getValues())
|
||||
this.buildQuery("metadata." + field,
|
||||
|
@@ -9,18 +9,16 @@
|
||||
package org.dspace.xoai.filter;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.log4j.LogManager;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.dspace.authorize.AuthorizeManager;
|
||||
import org.dspace.authorize.factory.AuthorizeServiceFactory;
|
||||
import org.dspace.authorize.service.AuthorizeService;
|
||||
import org.dspace.content.Item;
|
||||
import org.dspace.core.Constants;
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.handle.HandleServiceImpl;
|
||||
import org.dspace.handle.factory.HandleServiceFactory;
|
||||
import org.dspace.handle.service.HandleService;
|
||||
import org.dspace.xoai.data.DSpaceItem;
|
||||
import org.dspace.xoai.filter.results.DatabaseFilterResult;
|
||||
import org.dspace.xoai.filter.results.SolrFilterResult;
|
||||
|
||||
/**
|
||||
@@ -29,20 +27,13 @@ import org.dspace.xoai.filter.results.SolrFilterResult;
|
||||
*/
|
||||
public class DSpaceAuthorizationFilter extends DSpaceFilter
|
||||
{
|
||||
private static Logger log = LogManager.getLogger(DSpaceAuthorizationFilter.class);
|
||||
private static final Logger log = LogManager.getLogger(DSpaceAuthorizationFilter.class);
|
||||
|
||||
@Override
|
||||
public DatabaseFilterResult buildDatabaseQuery(Context context)
|
||||
{
|
||||
List<Object> params = new ArrayList<Object>();
|
||||
return new DatabaseFilterResult("EXISTS (SELECT p.action_id FROM "
|
||||
+ "resourcepolicy p, " + "bundle2bitstream b, " + "bundle bu, "
|
||||
+ "item2bundle ib " + "WHERE " + "p.resource_type_id=0 AND "
|
||||
+ "p.resource_id=b.bitstream_id AND "
|
||||
+ "p.epersongroup_id=0 AND " + "b.bundle_id=ib.bundle_id AND "
|
||||
+ "bu.bundle_id=b.bundle_id AND " + "bu.name='ORIGINAL' AND "
|
||||
+ "ib.item_id=i.item_id)", params);
|
||||
}
|
||||
private static final AuthorizeService authorizeService
|
||||
= AuthorizeServiceFactory.getInstance().getAuthorizeService();
|
||||
|
||||
private static final HandleService handleService
|
||||
= HandleServiceFactory.getInstance().getHandleService();
|
||||
|
||||
@Override
|
||||
public boolean isShown(DSpaceItem item)
|
||||
@@ -54,12 +45,12 @@ public class DSpaceAuthorizationFilter extends DSpaceFilter
|
||||
String handle = DSpaceItem.parseHandle(item.getIdentifier());
|
||||
if (handle == null)
|
||||
return false;
|
||||
Item dspaceItem = (Item) HandleManager.resolveToObject(context, handle);
|
||||
Item dspaceItem = (Item) handleService.resolveToObject(context, handle);
|
||||
if (dspaceItem == null)
|
||||
return false;
|
||||
|
||||
// Check if READ access allowed on Item
|
||||
pub = AuthorizeManager.authorizeActionBoolean(context, dspaceItem, Constants.READ);
|
||||
pub = authorizeService.authorizeActionBoolean(context, dspaceItem, Constants.READ);
|
||||
}
|
||||
catch (SQLException ex)
|
||||
{
|
||||
|
@@ -13,9 +13,8 @@ import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterMap;
|
||||
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.xoai.data.DSpaceItem;
|
||||
import org.dspace.xoai.filter.results.DatabaseFilterResult;
|
||||
import org.dspace.xoai.filter.results.SolrFilterResult;
|
||||
import org.dspace.xoai.services.api.database.FieldResolver;
|
||||
import org.dspace.xoai.services.api.FieldResolver;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -32,7 +31,6 @@ public abstract class DSpaceFilter implements Filter
|
||||
/** The oai context */
|
||||
protected Context context;
|
||||
|
||||
public abstract DatabaseFilterResult buildDatabaseQuery(Context context);
|
||||
public abstract SolrFilterResult buildSolrQuery();
|
||||
public abstract boolean isShown(DSpaceItem item);
|
||||
|
||||
|
@@ -7,17 +7,12 @@
|
||||
*/
|
||||
package org.dspace.xoai.filter;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.log4j.LogManager;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.dspace.core.Constants;
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.xoai.data.DSpaceItem;
|
||||
import org.dspace.xoai.exceptions.InvalidMetadataFieldException;
|
||||
import org.dspace.xoai.filter.results.DatabaseFilterResult;
|
||||
import org.dspace.xoai.filter.results.SolrFilterResult;
|
||||
|
||||
import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterValue;
|
||||
@@ -34,7 +29,7 @@ import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.SimpleType;
|
||||
* @author Lyncode Development Team <dspace@lyncode.com>
|
||||
*/
|
||||
public class DSpaceMetadataExistsFilter extends DSpaceFilter {
|
||||
private static Logger log = LogManager
|
||||
private static final Logger log = LogManager
|
||||
.getLogger(DSpaceMetadataExistsFilter.class);
|
||||
|
||||
private List<String> fields;
|
||||
@@ -57,31 +52,6 @@ public class DSpaceMetadataExistsFilter extends DSpaceFilter {
|
||||
return fields;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseFilterResult buildDatabaseQuery(Context context) {
|
||||
try {
|
||||
List<String> fields = this.getFields();
|
||||
StringBuilder where = new StringBuilder();
|
||||
List<Object> args = new ArrayList<Object>(fields.size());
|
||||
where.append("(");
|
||||
for (int i = 0; i < fields.size(); i++) {
|
||||
where.append("EXISTS (SELECT tmp.* FROM metadatavalue tmp WHERE tmp.resource_id=i.item_id AND tmp.resource_type_id=" + Constants.ITEM+ " AND tmp.metadata_field_id=?)");
|
||||
args.add(fieldResolver.getFieldID(context, fields.get(i)));
|
||||
|
||||
if (i < fields.size() - 1)
|
||||
where.append(" OR ");
|
||||
}
|
||||
where.append(")");
|
||||
|
||||
return new DatabaseFilterResult(where.toString(), args);
|
||||
} catch (InvalidMetadataFieldException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
} catch (SQLException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
return new DatabaseFilterResult();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShown(DSpaceItem item) {
|
||||
for (String field : this.getFields()) {
|
||||
|
@@ -8,19 +8,14 @@
|
||||
package org.dspace.xoai.filter;
|
||||
|
||||
import com.lyncode.xoai.dataprovider.core.ReferenceSet;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.log4j.LogManager;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.apache.solr.client.solrj.util.ClientUtils;
|
||||
import org.dspace.content.DSpaceObject;
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.xoai.data.DSpaceItem;
|
||||
import org.dspace.xoai.filter.results.DatabaseFilterResult;
|
||||
import org.dspace.xoai.filter.results.SolrFilterResult;
|
||||
import org.dspace.xoai.services.api.database.CollectionsService;
|
||||
import org.dspace.xoai.services.api.database.HandleResolver;
|
||||
import org.dspace.xoai.services.api.CollectionsService;
|
||||
import org.dspace.xoai.services.api.HandleResolver;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -28,11 +23,11 @@ import java.util.List;
|
||||
*/
|
||||
public class DSpaceSetSpecFilter extends DSpaceFilter
|
||||
{
|
||||
private static Logger log = LogManager.getLogger(DSpaceSetSpecFilter.class);
|
||||
private static final Logger log = LogManager.getLogger(DSpaceSetSpecFilter.class);
|
||||
|
||||
private String setSpec;
|
||||
private HandleResolver handleResolver;
|
||||
private CollectionsService collectionsService;
|
||||
private final String setSpec;
|
||||
private final HandleResolver handleResolver;
|
||||
private final CollectionsService collectionsService;
|
||||
|
||||
public DSpaceSetSpecFilter(CollectionsService collectionsService, HandleResolver handleResolver, String spec)
|
||||
{
|
||||
@@ -41,46 +36,6 @@ public class DSpaceSetSpecFilter extends DSpaceFilter
|
||||
this.setSpec = spec;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseFilterResult buildDatabaseQuery(Context context)
|
||||
{
|
||||
if (setSpec.startsWith("col_"))
|
||||
{
|
||||
try
|
||||
{
|
||||
DSpaceObject dso = handleResolver.resolve(setSpec.replace("col_", "").replace("_", "/"));
|
||||
if(dso != null){
|
||||
return new DatabaseFilterResult(
|
||||
"EXISTS (SELECT tmp.* FROM collection2item tmp WHERE tmp.resource_id=i.item_id AND collection_id = ?)",
|
||||
dso.getID());
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.error(ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
else if (setSpec.startsWith("com_"))
|
||||
{
|
||||
try
|
||||
{
|
||||
DSpaceObject dso = handleResolver.resolve(setSpec.replace("com_", "").replace("_", "/"));
|
||||
if(dso != null){
|
||||
List<Integer> list = collectionsService.getAllSubCollections(dso.getID());
|
||||
String subCollections = StringUtils.join(list.iterator(), ",");
|
||||
return new DatabaseFilterResult(
|
||||
"EXISTS (SELECT tmp.* FROM collection2item tmp WHERE tmp.resource_id=i.item_id AND collection_id IN ("
|
||||
+ subCollections + "))");
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
return new DatabaseFilterResult();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShown(DSpaceItem item)
|
||||
{
|
||||
|
@@ -7,12 +7,7 @@
|
||||
*/
|
||||
package org.dspace.xoai.filter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.storage.rdbms.DatabaseManager;
|
||||
import org.dspace.xoai.data.DSpaceItem;
|
||||
import org.dspace.xoai.filter.results.DatabaseFilterResult;
|
||||
import org.dspace.xoai.filter.results.SolrFilterResult;
|
||||
|
||||
/**
|
||||
@@ -28,18 +23,6 @@ import org.dspace.xoai.filter.results.SolrFilterResult;
|
||||
*/
|
||||
public class DSpaceWithdrawnFilter extends DSpaceFilter {
|
||||
|
||||
@Override
|
||||
public DatabaseFilterResult buildDatabaseQuery(Context context)
|
||||
{
|
||||
List<Object> params = new ArrayList<Object>();
|
||||
|
||||
String filter = "i.withdrawn=TRUE";
|
||||
if(DatabaseManager.isOracle())
|
||||
filter = "i.withdrawn=1";
|
||||
|
||||
return new DatabaseFilterResult(filter, params);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShown(DSpaceItem item)
|
||||
{
|
||||
@@ -48,10 +31,7 @@ public class DSpaceWithdrawnFilter extends DSpaceFilter {
|
||||
// we can properly respond with a "deleted" status via OAI-PMH.
|
||||
// Don't worry, this does NOT make the metadata public for withdrawn items,
|
||||
// it merely provides an item "tombstone" via OAI-PMH.
|
||||
if (item.isDeleted())
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
return item.isDeleted();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -1,61 +0,0 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.filter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Lyncode Development Team <dspace@lyncode.com>
|
||||
*/
|
||||
public class DatabaseFilterResult
|
||||
{
|
||||
private String _where;
|
||||
|
||||
private List<Object> _params;
|
||||
|
||||
private boolean _nothing;
|
||||
|
||||
public DatabaseFilterResult()
|
||||
{
|
||||
_nothing = true;
|
||||
}
|
||||
|
||||
public DatabaseFilterResult(String where, Object... params)
|
||||
{
|
||||
_nothing = false;
|
||||
_where = where;
|
||||
_params = new ArrayList<Object>();
|
||||
for (Object obj : params)
|
||||
_params.add(obj);
|
||||
}
|
||||
|
||||
public DatabaseFilterResult(String where, List<Object> params)
|
||||
{
|
||||
_nothing = false;
|
||||
_where = where;
|
||||
_params = params;
|
||||
}
|
||||
|
||||
public boolean hasResult()
|
||||
{
|
||||
return !_nothing;
|
||||
}
|
||||
|
||||
public String getWhere()
|
||||
{
|
||||
return _where;
|
||||
}
|
||||
|
||||
public List<Object> getParameters()
|
||||
{
|
||||
return _params;
|
||||
}
|
||||
|
||||
}
|
@@ -11,9 +11,7 @@ import com.lyncode.builder.DateBuilder;
|
||||
import com.lyncode.xoai.dataprovider.services.api.DateProvider;
|
||||
import com.lyncode.xoai.dataprovider.services.impl.BaseDateProvider;
|
||||
import org.apache.solr.client.solrj.util.ClientUtils;
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.xoai.data.DSpaceItem;
|
||||
import org.dspace.xoai.filter.results.DatabaseFilterResult;
|
||||
import org.dspace.xoai.filter.results.SolrFilterResult;
|
||||
|
||||
import java.util.Date;
|
||||
@@ -23,21 +21,14 @@ import java.util.Date;
|
||||
* @author Lyncode Development Team <dspace@lyncode.com>
|
||||
*/
|
||||
public class DateFromFilter extends DSpaceFilter {
|
||||
private static DateProvider dateProvider = new BaseDateProvider();
|
||||
private Date date;
|
||||
private static final DateProvider dateProvider = new BaseDateProvider();
|
||||
private final Date date;
|
||||
|
||||
public DateFromFilter(Date date)
|
||||
{
|
||||
this.date = new DateBuilder(date).setMinMilliseconds().build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseFilterResult buildDatabaseQuery(Context context)
|
||||
{
|
||||
return new DatabaseFilterResult("i.last_modified >= ?",
|
||||
new java.sql.Date(date.getTime()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShown(DSpaceItem item)
|
||||
{
|
||||
|
@@ -11,9 +11,7 @@ import com.lyncode.builder.DateBuilder;
|
||||
import com.lyncode.xoai.dataprovider.services.api.DateProvider;
|
||||
import com.lyncode.xoai.dataprovider.services.impl.BaseDateProvider;
|
||||
import org.apache.solr.client.solrj.util.ClientUtils;
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.xoai.data.DSpaceItem;
|
||||
import org.dspace.xoai.filter.results.DatabaseFilterResult;
|
||||
import org.dspace.xoai.filter.results.SolrFilterResult;
|
||||
|
||||
import java.util.Date;
|
||||
@@ -24,20 +22,14 @@ import java.util.Date;
|
||||
*/
|
||||
public class DateUntilFilter extends DSpaceFilter
|
||||
{
|
||||
private static DateProvider dateProvider = new BaseDateProvider();
|
||||
private Date date;
|
||||
private static final DateProvider dateProvider = new BaseDateProvider();
|
||||
private final Date date;
|
||||
|
||||
public DateUntilFilter(Date date)
|
||||
{
|
||||
this.date = new DateBuilder(date).setMaxMilliseconds().build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseFilterResult buildDatabaseQuery(Context context)
|
||||
{
|
||||
return new DatabaseFilterResult("i.last_modified <= ?", new java.sql.Date(date.getTime()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShown(DSpaceItem item)
|
||||
{
|
||||
|
@@ -7,25 +7,16 @@
|
||||
*/
|
||||
package org.dspace.xoai.filter;
|
||||
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.xoai.data.DSpaceItem;
|
||||
import org.dspace.xoai.filter.results.DatabaseFilterResult;
|
||||
import org.dspace.xoai.filter.results.SolrFilterResult;
|
||||
|
||||
public class NotFilter extends DSpaceFilter {
|
||||
private DSpaceFilter inFilter;
|
||||
private final DSpaceFilter inFilter;
|
||||
|
||||
public NotFilter(DSpaceFilter inFilter) {
|
||||
this.inFilter = inFilter;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public DatabaseFilterResult buildDatabaseQuery(Context context) {
|
||||
DatabaseFilterResult result = inFilter.buildDatabaseQuery(context);
|
||||
return new DatabaseFilterResult("NOT ("+result.getQuery()+")", result.getParameters());
|
||||
}
|
||||
|
||||
@Override
|
||||
public SolrFilterResult buildSolrQuery() {
|
||||
return new SolrFilterResult("NOT("+inFilter.buildSolrQuery().getQuery()+")");
|
||||
|
@@ -7,33 +7,19 @@
|
||||
*/
|
||||
package org.dspace.xoai.filter;
|
||||
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.xoai.data.DSpaceItem;
|
||||
import org.dspace.xoai.filter.results.DatabaseFilterResult;
|
||||
import org.dspace.xoai.filter.results.SolrFilterResult;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class OrFilter extends DSpaceFilter {
|
||||
private DSpaceFilter left;
|
||||
private DSpaceFilter right;
|
||||
private final DSpaceFilter left;
|
||||
private final DSpaceFilter right;
|
||||
|
||||
public OrFilter(DSpaceFilter left, DSpaceFilter right) {
|
||||
this.left = left;
|
||||
this.right = right;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseFilterResult buildDatabaseQuery(Context context) {
|
||||
DatabaseFilterResult leftResult = left.buildDatabaseQuery(context);
|
||||
DatabaseFilterResult rightResult = right.buildDatabaseQuery(context);
|
||||
List<Object> param = new ArrayList<Object>();
|
||||
param.addAll(leftResult.getParameters());
|
||||
param.addAll(rightResult.getParameters());
|
||||
return new DatabaseFilterResult("("+leftResult.getQuery()+") OR ("+ rightResult.getQuery() +")", param);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SolrFilterResult buildSolrQuery() {
|
||||
return new SolrFilterResult("("+left.buildSolrQuery().getQuery()+") OR ("+right.buildSolrQuery().getQuery()+")");
|
||||
|
@@ -1,59 +0,0 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.filter.results;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Lyncode Development Team <dspace@lyncode.com>
|
||||
*/
|
||||
public class DatabaseFilterResult
|
||||
{
|
||||
private String where;
|
||||
private List<Object> parameters;
|
||||
private boolean nothing;
|
||||
|
||||
public DatabaseFilterResult()
|
||||
{
|
||||
nothing = true;
|
||||
}
|
||||
|
||||
public DatabaseFilterResult(String where, Object... params)
|
||||
{
|
||||
nothing = false;
|
||||
this.where = where;
|
||||
parameters = new ArrayList<Object>();
|
||||
for (Object obj : params)
|
||||
parameters.add(obj);
|
||||
}
|
||||
|
||||
public DatabaseFilterResult(String where, List<Object> params)
|
||||
{
|
||||
nothing = false;
|
||||
this.where = where;
|
||||
parameters = params;
|
||||
}
|
||||
|
||||
public boolean hasResult()
|
||||
{
|
||||
return !nothing;
|
||||
}
|
||||
|
||||
public String getQuery()
|
||||
{
|
||||
return where;
|
||||
}
|
||||
|
||||
public List<Object> getParameters()
|
||||
{
|
||||
return parameters;
|
||||
}
|
||||
|
||||
}
|
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.api.database;
|
||||
package org.dspace.xoai.services.api;
|
||||
|
||||
import org.dspace.content.Collection;
|
||||
import org.dspace.content.Community;
|
||||
@@ -13,9 +13,10 @@ import org.dspace.content.Item;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
public interface CollectionsService {
|
||||
List<Integer> getAllSubCollections(int communityId) throws SQLException;
|
||||
List<UUID> getAllSubCollections(UUID communityId) throws SQLException;
|
||||
List<Community> flatParentCommunities(Collection collection) throws SQLException;
|
||||
List<Community> flatParentCommunities(Community community) throws SQLException;
|
||||
List<Community> flatParentCommunities(Item item) throws SQLException;
|
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.api.database;
|
||||
package org.dspace.xoai.services.api;
|
||||
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.xoai.exceptions.InvalidMetadataFieldException;
|
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.api.database;
|
||||
package org.dspace.xoai.services.api;
|
||||
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.xoai.exceptions.InvalidMetadataFieldException;
|
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.api.database;
|
||||
package org.dspace.xoai.services.api;
|
||||
|
||||
import org.dspace.content.DSpaceObject;
|
||||
|
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.api.database;
|
||||
package org.dspace.xoai.services.api;
|
||||
|
||||
|
||||
public class HandleResolverException extends Exception {
|
@@ -1,72 +0,0 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.api.database;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.storage.rdbms.DatabaseManager;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class DatabaseQuery {
|
||||
private static Logger log = Logger.getLogger(DatabaseQuery.class);
|
||||
|
||||
private String query;
|
||||
private List<Object> parameters;
|
||||
private Context context;
|
||||
private Integer total;
|
||||
|
||||
private String countQuery;
|
||||
private List<Object> countParameters;
|
||||
|
||||
public DatabaseQuery(Context context) {
|
||||
this.context = context;
|
||||
this.parameters = new ArrayList<Object>();
|
||||
}
|
||||
|
||||
public String getQuery() {
|
||||
return query;
|
||||
}
|
||||
|
||||
public List<Object> getParameters() {
|
||||
return parameters;
|
||||
}
|
||||
|
||||
public DatabaseQuery withQuery (String query) {
|
||||
this.query = query;
|
||||
return this;
|
||||
}
|
||||
|
||||
public DatabaseQuery withParameters (List<Object> parameters) {
|
||||
this.parameters.addAll(parameters);
|
||||
return this;
|
||||
}
|
||||
|
||||
public DatabaseQuery withCountQuery (String query, List<Object> parameters) {
|
||||
this.countQuery = query;
|
||||
this.countParameters = parameters;
|
||||
return this;
|
||||
}
|
||||
|
||||
public int getTotal () {
|
||||
if (total == null) {
|
||||
try
|
||||
{
|
||||
total = DatabaseManager.querySingle(context, countQuery, countParameters).getIntColumn("count");
|
||||
}
|
||||
catch (SQLException e1)
|
||||
{
|
||||
log.error("Unable to retrieve number of items that match");
|
||||
total = -1;
|
||||
}
|
||||
}
|
||||
return total;
|
||||
}
|
||||
}
|
@@ -1,25 +0,0 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.api.database;
|
||||
|
||||
public class DatabaseQueryException extends Exception {
|
||||
public DatabaseQueryException() {
|
||||
}
|
||||
|
||||
public DatabaseQueryException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public DatabaseQueryException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public DatabaseQueryException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
}
|
@@ -1,16 +0,0 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.api.database;
|
||||
|
||||
import com.lyncode.xoai.dataprovider.filter.ScopedFilter;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface DatabaseQueryResolver {
|
||||
DatabaseQuery buildQuery (List<ScopedFilter> filters, int offset, int length) throws DatabaseQueryException;
|
||||
}
|
@@ -11,12 +11,7 @@ package org.dspace.xoai.services.api.xoai;
|
||||
import com.lyncode.xoai.dataprovider.filter.Scope;
|
||||
import com.lyncode.xoai.dataprovider.filter.conditions.Condition;
|
||||
import com.lyncode.xoai.dataprovider.services.api.FilterResolver;
|
||||
import org.dspace.xoai.services.api.context.ContextServiceException;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface DSpaceFilterResolver extends FilterResolver {
|
||||
String buildDatabaseQuery(Condition condition, List<Object> parameters, Scope scope) throws ContextServiceException;
|
||||
|
||||
String buildSolrQuery(Scope scope, Condition condition);
|
||||
}
|
||||
|
@@ -5,32 +5,38 @@
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.impl.database;
|
||||
package org.dspace.xoai.services.impl;
|
||||
|
||||
import org.dspace.content.Collection;
|
||||
import org.dspace.content.Community;
|
||||
import org.dspace.content.Item;
|
||||
import org.dspace.xoai.services.api.context.ContextService;
|
||||
import org.dspace.xoai.services.api.context.ContextServiceException;
|
||||
import org.dspace.xoai.services.api.database.CollectionsService;
|
||||
import org.dspace.xoai.services.api.CollectionsService;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Queue;
|
||||
import java.util.UUID;
|
||||
import org.dspace.content.factory.ContentServiceFactory;
|
||||
import org.dspace.content.service.CommunityService;
|
||||
|
||||
public class DSpaceCollectionsService implements CollectionsService {
|
||||
|
||||
private ContextService contextService;
|
||||
private static final CommunityService communityService
|
||||
= ContentServiceFactory.getInstance().getCommunityService();
|
||||
|
||||
public List<Integer> getAllSubCollections(int communityId)
|
||||
@Override
|
||||
public List<UUID> getAllSubCollections(UUID communityId)
|
||||
throws SQLException
|
||||
{
|
||||
Queue<Community> comqueue = new LinkedList<Community>();
|
||||
List<Integer> list = new ArrayList<Integer>();
|
||||
Queue<Community> comqueue = new LinkedList<>();
|
||||
List<UUID> list = new ArrayList<>();
|
||||
try {
|
||||
comqueue.add(Community.find(contextService.getContext(), communityId));
|
||||
comqueue.add(communityService.find(contextService.getContext(), communityId));
|
||||
} catch (ContextServiceException e) {
|
||||
throw new SQLException(e);
|
||||
}
|
||||
@@ -40,26 +46,27 @@ public class DSpaceCollectionsService implements CollectionsService {
|
||||
for (Community sub : c.getSubcommunities())
|
||||
comqueue.add(sub);
|
||||
for (Collection col : c.getCollections())
|
||||
if (!list.contains(col))
|
||||
if (!list.contains(col.getID()))
|
||||
list.add(col.getID());
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Community> flatParentCommunities(Collection c)
|
||||
throws SQLException
|
||||
{
|
||||
Queue<Community> queue = new LinkedList<Community>();
|
||||
List<Community> result = new ArrayList<Community>();
|
||||
Queue<Community> queue = new LinkedList<>();
|
||||
List<Community> result = new ArrayList<>();
|
||||
for (Community com : c.getCommunities())
|
||||
queue.add(com);
|
||||
|
||||
while (!queue.isEmpty())
|
||||
{
|
||||
Community p = queue.poll();
|
||||
Community par = p.getParentCommunity();
|
||||
List<Community> par = p.getParentCommunities();
|
||||
if (par != null)
|
||||
queue.add(par);
|
||||
queue.addAll(par);
|
||||
if (!result.contains(p))
|
||||
result.add(p);
|
||||
}
|
||||
@@ -67,20 +74,21 @@ public class DSpaceCollectionsService implements CollectionsService {
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Community> flatParentCommunities(Community c)
|
||||
throws SQLException
|
||||
{
|
||||
Queue<Community> queue = new LinkedList<Community>();
|
||||
List<Community> result = new ArrayList<Community>();
|
||||
Queue<Community> queue = new LinkedList<>();
|
||||
List<Community> result = new ArrayList<>();
|
||||
|
||||
queue.add(c);
|
||||
|
||||
while (!queue.isEmpty())
|
||||
{
|
||||
Community p = queue.poll();
|
||||
Community par = p.getParentCommunity();
|
||||
List<Community> par = p.getParentCommunities();
|
||||
if (par != null)
|
||||
queue.add(par);
|
||||
queue.addAll(par);
|
||||
if (!result.contains(p))
|
||||
result.add(p);
|
||||
}
|
||||
@@ -88,21 +96,22 @@ public class DSpaceCollectionsService implements CollectionsService {
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Community> flatParentCommunities(Item c)
|
||||
throws SQLException
|
||||
{
|
||||
Queue<Community> queue = new LinkedList<Community>();
|
||||
List<Community> result = new ArrayList<Community>();
|
||||
Queue<Community> queue = new LinkedList<>();
|
||||
List<Community> result = new ArrayList<>();
|
||||
|
||||
for (Community com : c.getCommunities())
|
||||
queue.add(com);
|
||||
for (Collection com : c.getCollections())
|
||||
queue.addAll(com.getCommunities());
|
||||
|
||||
while (!queue.isEmpty())
|
||||
{
|
||||
Community p = queue.poll();
|
||||
Community par = p.getParentCommunity();
|
||||
List<Community> par = p.getParentCommunities();
|
||||
if (par != null)
|
||||
queue.add(par);
|
||||
queue.addAll(par);
|
||||
if (!result.contains(p))
|
||||
result.add(p);
|
||||
}
|
@@ -5,21 +5,22 @@
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.impl.database;
|
||||
package org.dspace.xoai.services.impl;
|
||||
|
||||
import org.apache.log4j.LogManager;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.storage.rdbms.DatabaseManager;
|
||||
import org.dspace.storage.rdbms.TableRowIterator;
|
||||
import org.dspace.xoai.exceptions.InvalidMetadataFieldException;
|
||||
import org.dspace.xoai.services.api.database.EarliestDateResolver;
|
||||
import org.dspace.xoai.services.api.database.FieldResolver;
|
||||
import org.dspace.xoai.services.api.EarliestDateResolver;
|
||||
import org.dspace.xoai.services.api.FieldResolver;
|
||||
import org.dspace.xoai.util.DateUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.Date;
|
||||
import org.dspace.content.MetadataValue;
|
||||
import org.dspace.content.factory.ContentServiceFactory;
|
||||
import org.dspace.content.service.MetadataValueService;
|
||||
|
||||
public class DSpaceEarliestDateResolver implements EarliestDateResolver {
|
||||
private static final Logger log = LogManager.getLogger(DSpaceEarliestDateResolver.class);
|
||||
@@ -30,20 +31,13 @@ public class DSpaceEarliestDateResolver implements EarliestDateResolver {
|
||||
@Override
|
||||
public Date getEarliestDate(Context context) throws InvalidMetadataFieldException, SQLException {
|
||||
String query = "SELECT MIN(text_value) as value FROM metadatavalue WHERE metadata_field_id = ?";
|
||||
boolean postgres = ! DatabaseManager.isOracle();
|
||||
|
||||
if (!postgres) {
|
||||
query = "SELECT MIN(TO_CHAR(text_value)) as value FROM metadatavalue WHERE metadata_field_id = ?";
|
||||
}
|
||||
|
||||
TableRowIterator iterator = DatabaseManager
|
||||
.query(context,
|
||||
query,
|
||||
MetadataValueService metadataValueService = ContentServiceFactory.getInstance().getMetadataValueService();
|
||||
MetadataValue minimum = metadataValueService.getMinimum(context,
|
||||
fieldResolver.getFieldID(context, "dc.date.available"));
|
||||
|
||||
if (iterator.hasNext())
|
||||
if (null != minimum)
|
||||
{
|
||||
String str = iterator.next().getStringColumn("value");
|
||||
String str = minimum.getValue();
|
||||
try
|
||||
{
|
||||
Date d = DateUtils.parse(str);
|
@@ -5,20 +5,24 @@
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.impl.database;
|
||||
package org.dspace.xoai.services.impl;
|
||||
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.storage.rdbms.DatabaseManager;
|
||||
import org.dspace.storage.rdbms.TableRowIterator;
|
||||
import org.dspace.xoai.exceptions.InvalidMetadataFieldException;
|
||||
import org.dspace.xoai.services.api.database.FieldResolver;
|
||||
import org.dspace.xoai.services.api.FieldResolver;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.regex.Pattern;
|
||||
import org.dspace.content.MetadataField;
|
||||
import org.dspace.content.factory.ContentServiceFactory;
|
||||
import org.dspace.content.service.MetadataFieldService;
|
||||
|
||||
public class DSpaceFieldResolver implements FieldResolver {
|
||||
private MetadataFieldCache metadataFieldCache = null;
|
||||
|
||||
private static final MetadataFieldService metadataFieldService
|
||||
= ContentServiceFactory.getInstance().getMetadataFieldService();
|
||||
|
||||
@Override
|
||||
public int getFieldID(Context context, String field) throws InvalidMetadataFieldException, SQLException {
|
||||
if (metadataFieldCache == null)
|
||||
@@ -33,28 +37,11 @@ public class DSpaceFieldResolver implements FieldResolver {
|
||||
String qualifier = null;
|
||||
if (pieces.length > 2)
|
||||
qualifier = pieces[2];
|
||||
String query = "SELECT mfr.metadata_field_id as mid FROM metadatafieldregistry mfr, "
|
||||
+ "metadataschemaregistry msr WHERE mfr.metadata_schema_id=mfr.metadata_schema_id AND "
|
||||
+ "msr.short_id = ? AND mfr.element = ?";
|
||||
|
||||
TableRowIterator iterator;
|
||||
|
||||
if (qualifier == null)
|
||||
MetadataField metadataField = metadataFieldService.findByElement(context, schema, element, qualifier);
|
||||
if (null != metadataField)
|
||||
{
|
||||
query += " AND mfr.qualifier is NULL";
|
||||
iterator = DatabaseManager.query(context, query, schema,
|
||||
element);
|
||||
}
|
||||
else
|
||||
{
|
||||
query += " AND mfr.qualifier = ?";
|
||||
iterator = DatabaseManager.query(context, query, schema,
|
||||
element, qualifier);
|
||||
}
|
||||
|
||||
if (iterator.hasNext())
|
||||
{
|
||||
metadataFieldCache.add(field, iterator.next().getIntColumn("mid"));
|
||||
metadataFieldCache.add(field, metadataField.getFieldID());
|
||||
}
|
||||
else
|
||||
throw new InvalidMetadataFieldException();
|
@@ -5,30 +5,29 @@
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.impl.database;
|
||||
|
||||
|
||||
import org.dspace.content.DSpaceObject;
|
||||
import org.dspace.handle.HandleServiceImpl;
|
||||
import org.dspace.xoai.services.api.context.ContextService;
|
||||
import org.dspace.xoai.services.api.context.ContextServiceException;
|
||||
import org.dspace.xoai.services.api.database.HandleResolver;
|
||||
import org.dspace.xoai.services.api.database.HandleResolverException;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
package org.dspace.xoai.services.impl;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import javax.inject.Inject;
|
||||
import org.dspace.content.DSpaceObject;
|
||||
import org.dspace.handle.service.HandleService;
|
||||
import org.dspace.xoai.services.api.context.ContextService;
|
||||
import org.dspace.xoai.services.api.context.ContextServiceException;
|
||||
import org.dspace.xoai.services.api.HandleResolver;
|
||||
import org.dspace.xoai.services.api.HandleResolverException;
|
||||
|
||||
public class DSpaceHandlerResolver implements HandleResolver {
|
||||
@Autowired
|
||||
public class DSpaceHandleResolver implements HandleResolver {
|
||||
@Inject
|
||||
private ContextService contextService;
|
||||
|
||||
@Inject
|
||||
private HandleService handleService;
|
||||
|
||||
@Override
|
||||
public DSpaceObject resolve(String handle) throws HandleResolverException {
|
||||
try {
|
||||
return HandleServiceImpl.resolveToObject(contextService.getContext(), handle);
|
||||
} catch (ContextServiceException e) {
|
||||
throw new HandleResolverException(e);
|
||||
} catch (SQLException e) {
|
||||
return handleService.resolveToObject(contextService.getContext(), handle);
|
||||
} catch (ContextServiceException | SQLException e) {
|
||||
throw new HandleResolverException(e);
|
||||
}
|
||||
}
|
||||
@@ -36,10 +35,8 @@ public class DSpaceHandlerResolver implements HandleResolver {
|
||||
@Override
|
||||
public String getHandle(DSpaceObject object) throws HandleResolverException {
|
||||
try {
|
||||
return HandleServiceImpl.findHandle(contextService.getContext(), object);
|
||||
} catch (SQLException e) {
|
||||
throw new HandleResolverException(e);
|
||||
} catch (ContextServiceException e) {
|
||||
return handleService.findHandle(contextService.getContext(), object);
|
||||
} catch (SQLException | ContextServiceException e) {
|
||||
throw new HandleResolverException(e);
|
||||
}
|
||||
}
|
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.impl.database;
|
||||
package org.dspace.xoai.services.impl;
|
||||
|
||||
import org.apache.log4j.LogManager;
|
||||
import org.apache.log4j.Logger;
|
@@ -14,7 +14,6 @@ import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.sql.SQLException;
|
||||
|
||||
public class DSpaceContextService implements ContextService {
|
||||
private static final String OAI_CONTEXT = "OAI_CONTEXT";
|
||||
@@ -24,11 +23,7 @@ public class DSpaceContextService implements ContextService {
|
||||
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
|
||||
Object value = request.getAttribute(OAI_CONTEXT);
|
||||
if (value == null || !(value instanceof Context)) {
|
||||
try {
|
||||
request.setAttribute(OAI_CONTEXT, new Context());
|
||||
} catch (SQLException e) {
|
||||
throw new ContextServiceException(e);
|
||||
}
|
||||
}
|
||||
return (Context) request.getAttribute(OAI_CONTEXT);
|
||||
}
|
||||
|
@@ -1,107 +0,0 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.impl.database;
|
||||
|
||||
import com.lyncode.xoai.dataprovider.filter.Scope;
|
||||
import com.lyncode.xoai.dataprovider.filter.ScopedFilter;
|
||||
import com.lyncode.xoai.dataprovider.filter.conditions.Condition;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.log4j.LogManager;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.dspace.storage.rdbms.DatabaseManager;
|
||||
import org.dspace.xoai.services.api.config.ConfigurationService;
|
||||
import org.dspace.xoai.services.api.context.ContextService;
|
||||
import org.dspace.xoai.services.api.context.ContextServiceException;
|
||||
import org.dspace.xoai.services.api.database.DatabaseQuery;
|
||||
import org.dspace.xoai.services.api.database.DatabaseQueryException;
|
||||
import org.dspace.xoai.services.api.database.DatabaseQueryResolver;
|
||||
import org.dspace.xoai.services.api.xoai.DSpaceFilterResolver;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
public class DSpaceDatabaseQueryResolver implements DatabaseQueryResolver {
|
||||
private static final Logger log = LogManager.getLogger(DSpaceDatabaseQueryResolver.class);
|
||||
|
||||
@Autowired
|
||||
DSpaceFilterResolver filterResolver;
|
||||
|
||||
@Autowired
|
||||
ContextService contextService;
|
||||
|
||||
@Autowired
|
||||
ConfigurationService configurationService;
|
||||
|
||||
@Override
|
||||
public DatabaseQuery buildQuery(List<ScopedFilter> filters, int offset, int length) throws DatabaseQueryException {
|
||||
List<Object> parameters = new ArrayList<Object>();
|
||||
List<Object> countParameters = new ArrayList<Object>();
|
||||
String query = "SELECT i.* FROM item i ";
|
||||
String countQuery = "SELECT COUNT(*) as count FROM item i";
|
||||
|
||||
String where = null;
|
||||
try {
|
||||
where = this.buildCondition(filters, parameters);
|
||||
} catch (ContextServiceException e) {
|
||||
throw new DatabaseQueryException(e);
|
||||
}
|
||||
countParameters.addAll(parameters);
|
||||
|
||||
String whereInArchive = "WHERE i.in_archive=true";
|
||||
if(DatabaseManager.isOracle())
|
||||
{
|
||||
whereInArchive = "WHERE i.in_archive=1";
|
||||
}
|
||||
|
||||
if (!where.equals("")) {
|
||||
query += " " + whereInArchive + " AND " + where;
|
||||
countQuery += " " + whereInArchive + " AND " + where;
|
||||
} else {
|
||||
query += " " + whereInArchive;
|
||||
countQuery += " " + whereInArchive;
|
||||
}
|
||||
|
||||
query += " ORDER BY i.item_id";
|
||||
boolean postgres = ! DatabaseManager.isOracle();
|
||||
if (postgres)
|
||||
{
|
||||
query += " OFFSET ? LIMIT ?";
|
||||
}
|
||||
else
|
||||
{
|
||||
// Oracle
|
||||
query = "SELECT * FROM (" + query
|
||||
+ ") WHERE ROWNUM BETWEEN ? AND ?";
|
||||
length = length + offset;
|
||||
}
|
||||
parameters.add(offset);
|
||||
parameters.add(length);
|
||||
|
||||
try {
|
||||
return new DatabaseQuery(contextService.getContext())
|
||||
.withCountQuery(countQuery, countParameters)
|
||||
.withQuery(query)
|
||||
.withParameters(parameters);
|
||||
} catch (ContextServiceException e) {
|
||||
throw new DatabaseQueryException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private String buildQuery (Condition condition, Scope scope, List<Object> parameters) throws ContextServiceException {
|
||||
return filterResolver.buildDatabaseQuery(condition, parameters, scope);
|
||||
}
|
||||
|
||||
private String buildCondition (List<ScopedFilter> filters, List<Object> parameters) throws ContextServiceException {
|
||||
List<String> whereCond = new ArrayList<String>();
|
||||
for (ScopedFilter filter : filters)
|
||||
whereCond.add(this.buildQuery(filter.getCondition(), filter.getScope(), parameters));
|
||||
|
||||
return StringUtils.join(whereCond.iterator(), " AND ");
|
||||
}
|
||||
}
|
@@ -14,8 +14,8 @@ import org.dspace.content.DSpaceObject;
|
||||
import org.dspace.xoai.exceptions.InvalidSetSpecException;
|
||||
import org.dspace.xoai.services.api.config.ConfigurationService;
|
||||
import org.dspace.xoai.services.api.context.ContextService;
|
||||
import org.dspace.xoai.services.api.database.HandleResolver;
|
||||
import org.dspace.xoai.services.api.database.HandleResolverException;
|
||||
import org.dspace.xoai.services.api.HandleResolver;
|
||||
import org.dspace.xoai.services.api.HandleResolverException;
|
||||
import org.dspace.xoai.services.api.set.SetSpecResolver;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
|
@@ -13,16 +13,13 @@ import com.lyncode.xoai.dataprovider.filter.conditions.*;
|
||||
import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterMap;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.dspace.xoai.filter.*;
|
||||
import org.dspace.xoai.filter.results.DatabaseFilterResult;
|
||||
import org.dspace.xoai.filter.results.SolrFilterResult;
|
||||
import org.dspace.xoai.services.api.context.ContextService;
|
||||
import org.dspace.xoai.services.api.context.ContextServiceException;
|
||||
import org.dspace.xoai.services.api.database.FieldResolver;
|
||||
import org.dspace.xoai.services.api.FieldResolver;
|
||||
import org.dspace.xoai.services.api.xoai.DSpaceFilterResolver;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static com.lyncode.xoai.dataprovider.filter.Scope.MetadataFormat;
|
||||
|
||||
public class BaseDSpaceFilterResolver implements DSpaceFilterResolver {
|
||||
@@ -34,22 +31,6 @@ public class BaseDSpaceFilterResolver implements DSpaceFilterResolver {
|
||||
@Autowired
|
||||
ContextService contextService;
|
||||
|
||||
@Override
|
||||
public String buildDatabaseQuery(Condition condition, List<Object> parameters, Scope scope) throws ContextServiceException {
|
||||
DSpaceFilter filter = getFilter(condition);
|
||||
DatabaseFilterResult result = filter.buildDatabaseQuery(contextService.getContext());
|
||||
if (result.hasResult())
|
||||
{
|
||||
parameters.addAll(result.getParameters());
|
||||
if (scope == MetadataFormat)
|
||||
return "(item.deleted:true OR ("
|
||||
+ result.getQuery() + "))";
|
||||
else
|
||||
return "(" + result.getQuery() + ")";
|
||||
}
|
||||
return "true";
|
||||
}
|
||||
|
||||
public DSpaceFilter getFilter (Condition condition) {
|
||||
if (condition instanceof AndCondition) return (DSpaceFilter) getFilter((AndCondition) condition);
|
||||
else if (condition instanceof OrCondition) return (DSpaceFilter) getFilter((OrCondition) condition);
|
||||
|
@@ -11,7 +11,7 @@ import com.lyncode.xoai.dataprovider.services.api.RepositoryConfiguration;
|
||||
import org.dspace.xoai.services.api.config.ConfigurationService;
|
||||
import org.dspace.xoai.services.api.context.ContextService;
|
||||
import org.dspace.xoai.services.api.context.ContextServiceException;
|
||||
import org.dspace.xoai.services.api.database.EarliestDateResolver;
|
||||
import org.dspace.xoai.services.api.EarliestDateResolver;
|
||||
import org.dspace.xoai.services.api.xoai.IdentifyResolver;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
|
@@ -1,210 +0,0 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.impl.xoai;
|
||||
|
||||
import com.lyncode.xoai.dataprovider.core.ListItemIdentifiersResult;
|
||||
import com.lyncode.xoai.dataprovider.core.ListItemsResults;
|
||||
import com.lyncode.xoai.dataprovider.core.ReferenceSet;
|
||||
import com.lyncode.xoai.dataprovider.data.Item;
|
||||
import com.lyncode.xoai.dataprovider.data.ItemIdentifier;
|
||||
import com.lyncode.xoai.dataprovider.exceptions.IdDoesNotExistException;
|
||||
import com.lyncode.xoai.dataprovider.exceptions.OAIException;
|
||||
import com.lyncode.xoai.dataprovider.filter.ScopedFilter;
|
||||
import com.lyncode.xoai.dataprovider.xml.xoai.Metadata;
|
||||
import org.apache.log4j.LogManager;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.dspace.content.Collection;
|
||||
import org.dspace.content.Community;
|
||||
import org.dspace.content.DSpaceObject;
|
||||
import org.dspace.content.ItemIterator;
|
||||
import org.dspace.handle.HandleServiceImpl;
|
||||
import org.dspace.storage.rdbms.DatabaseManager;
|
||||
import org.dspace.storage.rdbms.TableRowIterator;
|
||||
import org.dspace.xoai.data.DSpaceDatabaseItem;
|
||||
import org.dspace.xoai.data.DSpaceSet;
|
||||
import org.dspace.xoai.services.api.cache.XOAIItemCacheService;
|
||||
import org.dspace.xoai.services.api.config.ConfigurationService;
|
||||
import org.dspace.xoai.services.api.context.ContextService;
|
||||
import org.dspace.xoai.services.api.context.ContextServiceException;
|
||||
import org.dspace.xoai.services.api.database.*;
|
||||
import org.dspace.xoai.util.ItemUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Lyncode Development Team <dspace@lyncode.com>
|
||||
* @author Domingo Iglesias <diglesias@ub.edu>
|
||||
*/
|
||||
public class DSpaceItemDatabaseRepository extends DSpaceItemRepository
|
||||
{
|
||||
|
||||
private static Logger log = LogManager.getLogger(DSpaceItemDatabaseRepository.class);
|
||||
|
||||
private XOAIItemCacheService cacheService;
|
||||
private boolean useCache;
|
||||
private DatabaseQueryResolver queryResolver;
|
||||
private ContextService context;
|
||||
private CollectionsService collectionsService;
|
||||
private ConfigurationService configurationService;
|
||||
|
||||
public DSpaceItemDatabaseRepository(ConfigurationService configurationService, CollectionsService collectionsService, HandleResolver handleResolver, XOAIItemCacheService cacheService, DatabaseQueryResolver queryResolver, ContextService context)
|
||||
{
|
||||
super(collectionsService, handleResolver);
|
||||
this.configurationService = configurationService;
|
||||
this.collectionsService = collectionsService;
|
||||
this.cacheService = cacheService;
|
||||
this.queryResolver = queryResolver;
|
||||
this.context = context;
|
||||
this.useCache = configurationService.getBooleanProperty("oai", "cache.enabled", true);
|
||||
}
|
||||
|
||||
private Metadata getMetadata (org.dspace.content.Item item) throws IOException {
|
||||
if (this.useCache) {
|
||||
if (!cacheService.hasCache(item))
|
||||
cacheService.put(item, ItemUtils.retrieveMetadata(item));
|
||||
|
||||
return cacheService.get(item);
|
||||
} else return ItemUtils.retrieveMetadata(item);
|
||||
}
|
||||
|
||||
private List<ReferenceSet> getSets(org.dspace.content.Item item)
|
||||
{
|
||||
List<ReferenceSet> sets = new ArrayList<ReferenceSet>();
|
||||
List<Community> coms = new ArrayList<Community>();
|
||||
try
|
||||
{
|
||||
Collection[] itemCollections = item.getCollections();
|
||||
for (Collection col : itemCollections)
|
||||
{
|
||||
ReferenceSet s = new DSpaceSet(col);
|
||||
sets.add(s);
|
||||
for (Community com : collectionsService.flatParentCommunities(col))
|
||||
if (!coms.contains(com))
|
||||
coms.add(com);
|
||||
}
|
||||
for (Community com : coms)
|
||||
{
|
||||
ReferenceSet s = new DSpaceSet(com);
|
||||
sets.add(s);
|
||||
}
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
return sets;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Item getItem(String id) throws IdDoesNotExistException, OAIException
|
||||
{
|
||||
try
|
||||
{
|
||||
String parts[] = id.split(Pattern.quote(":"));
|
||||
if (parts.length == 3)
|
||||
{
|
||||
DSpaceObject obj = HandleServiceImpl.resolveToObject(context.getContext(),
|
||||
parts[2]);
|
||||
if (obj == null)
|
||||
throw new IdDoesNotExistException();
|
||||
if (!(obj instanceof Item))
|
||||
throw new IdDoesNotExistException();
|
||||
|
||||
org.dspace.content.Item item = (org.dspace.content.Item) obj;
|
||||
return new DSpaceDatabaseItem(item, this.getMetadata(item), getSets(item));
|
||||
}
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
log.debug(e.getMessage(), e);
|
||||
throw new IdDoesNotExistException();
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
throw new OAIException(e);
|
||||
} catch (IOException e) {
|
||||
throw new OAIException(e);
|
||||
} catch (ContextServiceException e) {
|
||||
throw new OAIException(e);
|
||||
}
|
||||
throw new IdDoesNotExistException();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public ListItemsResults getItems(List<ScopedFilter> filters, int offset,
|
||||
int length) throws OAIException
|
||||
{
|
||||
List<Item> list = new ArrayList<Item>();
|
||||
try
|
||||
{
|
||||
DatabaseQuery databaseQuery = queryResolver.buildQuery(filters, offset, length);
|
||||
TableRowIterator rowIterator = DatabaseManager.queryTable(context.getContext(), "item",
|
||||
databaseQuery.getQuery(), databaseQuery.getParameters().toArray());
|
||||
ItemIterator iterator = new ItemIterator(context.getContext(), rowIterator);
|
||||
int i = 0;
|
||||
while (iterator.hasNext() && i < length)
|
||||
{
|
||||
org.dspace.content.Item it = iterator.next();
|
||||
list.add(new DSpaceDatabaseItem(it, this.getMetadata(it), getSets(it)));
|
||||
i++;
|
||||
}
|
||||
return new ListItemsResults((databaseQuery.getTotal() > offset + length), list, databaseQuery.getTotal());
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
log.error(e.getMessage(), e);
|
||||
} catch (DatabaseQueryException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
} catch (IOException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
} catch (ContextServiceException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
return new ListItemsResults(false, list, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListItemIdentifiersResult getItemIdentifiers(
|
||||
List<ScopedFilter> filters, int offset, int length) throws OAIException
|
||||
{
|
||||
|
||||
List<ItemIdentifier> list = new ArrayList<ItemIdentifier>();
|
||||
try
|
||||
{
|
||||
DatabaseQuery databaseQuery = queryResolver.buildQuery(filters, offset, length);
|
||||
TableRowIterator rowIterator = DatabaseManager.queryTable(context.getContext(), "item",
|
||||
databaseQuery.getQuery(), databaseQuery.getParameters().toArray());
|
||||
ItemIterator iterator = new ItemIterator(context.getContext(), rowIterator);
|
||||
int i = 0;
|
||||
while (iterator.hasNext() && i < length)
|
||||
{
|
||||
org.dspace.content.Item it = iterator.next();
|
||||
list.add(new DSpaceDatabaseItem(it, this.getMetadata(it), getSets(it)));
|
||||
i++;
|
||||
}
|
||||
return new ListItemIdentifiersResult((databaseQuery.getTotal() > offset + length), list, databaseQuery.getTotal());
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
log.error(e.getMessage(), e);
|
||||
} catch (DatabaseQueryException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
} catch (IOException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
} catch (ContextServiceException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
return new ListItemIdentifiersResult(false, list, 0);
|
||||
}
|
||||
}
|
@@ -18,8 +18,8 @@ import com.lyncode.xoai.dataprovider.services.api.ItemRepository;
|
||||
import org.dspace.xoai.filter.DSpaceSetSpecFilter;
|
||||
import org.dspace.xoai.filter.DateFromFilter;
|
||||
import org.dspace.xoai.filter.DateUntilFilter;
|
||||
import org.dspace.xoai.services.api.database.CollectionsService;
|
||||
import org.dspace.xoai.services.api.database.HandleResolver;
|
||||
import org.dspace.xoai.services.api.CollectionsService;
|
||||
import org.dspace.xoai.services.api.HandleResolver;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
@@ -9,13 +9,11 @@ package org.dspace.xoai.services.impl.xoai;
|
||||
|
||||
import com.lyncode.xoai.dataprovider.services.api.ItemRepository;
|
||||
import org.apache.solr.client.solrj.SolrServerException;
|
||||
import org.dspace.xoai.services.api.cache.XOAIItemCacheService;
|
||||
import org.dspace.xoai.services.api.config.ConfigurationService;
|
||||
import org.dspace.xoai.services.api.context.ContextService;
|
||||
import org.dspace.xoai.services.api.context.ContextServiceException;
|
||||
import org.dspace.xoai.services.api.database.CollectionsService;
|
||||
import org.dspace.xoai.services.api.database.DatabaseQueryResolver;
|
||||
import org.dspace.xoai.services.api.database.HandleResolver;
|
||||
import org.dspace.xoai.services.api.CollectionsService;
|
||||
import org.dspace.xoai.services.api.HandleResolver;
|
||||
import org.dspace.xoai.services.api.solr.SolrQueryResolver;
|
||||
import org.dspace.xoai.services.api.solr.SolrServerResolver;
|
||||
import org.dspace.xoai.services.api.xoai.ItemRepositoryResolver;
|
||||
@@ -31,13 +29,9 @@ public class DSpaceItemRepositoryResolver implements ItemRepositoryResolver {
|
||||
@Autowired
|
||||
SolrQueryResolver solrQueryResolver;
|
||||
@Autowired
|
||||
DatabaseQueryResolver databaseQueryResolver;
|
||||
@Autowired
|
||||
CollectionsService collectionsService;
|
||||
@Autowired
|
||||
private HandleResolver handleResolver;
|
||||
@Autowired
|
||||
private XOAIItemCacheService cacheService;
|
||||
|
||||
private ItemRepository itemRepository;
|
||||
|
||||
@@ -45,15 +39,15 @@ public class DSpaceItemRepositoryResolver implements ItemRepositoryResolver {
|
||||
@Override
|
||||
public ItemRepository getItemRepository() throws ContextServiceException {
|
||||
if (itemRepository == null) {
|
||||
String storage = configurationService.getProperty("oai", "storage");
|
||||
if (storage == null || !storage.trim().toLowerCase().equals("database")) {
|
||||
try {
|
||||
itemRepository = new DSpaceItemSolrRepository(solrServerResolver.getServer(), collectionsService, handleResolver, solrQueryResolver);
|
||||
itemRepository = new DSpaceItemSolrRepository(
|
||||
solrServerResolver.getServer(),
|
||||
collectionsService,
|
||||
handleResolver,
|
||||
solrQueryResolver);
|
||||
} catch (SolrServerException e) {
|
||||
throw new ContextServiceException(e.getMessage(), e);
|
||||
}
|
||||
} else
|
||||
itemRepository = new DSpaceItemDatabaseRepository(configurationService, collectionsService, handleResolver, cacheService, databaseQueryResolver, contextService);
|
||||
}
|
||||
|
||||
return itemRepository;
|
||||
|
@@ -22,8 +22,8 @@ import org.apache.solr.client.solrj.SolrServer;
|
||||
import org.apache.solr.common.SolrDocument;
|
||||
import org.apache.solr.common.SolrDocumentList;
|
||||
import org.dspace.xoai.data.DSpaceSolrItem;
|
||||
import org.dspace.xoai.services.api.database.CollectionsService;
|
||||
import org.dspace.xoai.services.api.database.HandleResolver;
|
||||
import org.dspace.xoai.services.api.CollectionsService;
|
||||
import org.dspace.xoai.services.api.HandleResolver;
|
||||
import org.dspace.xoai.services.api.solr.SolrQueryResolver;
|
||||
import org.dspace.xoai.solr.DSpaceSolrSearch;
|
||||
import org.dspace.xoai.solr.exceptions.DSpaceSolrException;
|
||||
|
@@ -16,7 +16,7 @@ import org.apache.log4j.Logger;
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.xoai.exceptions.InvalidMetadataFieldException;
|
||||
import org.dspace.xoai.services.api.config.ConfigurationService;
|
||||
import org.dspace.xoai.services.api.database.EarliestDateResolver;
|
||||
import org.dspace.xoai.services.api.EarliestDateResolver;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
|
||||
|
@@ -1,230 +0,0 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.impl.xoai;
|
||||
|
||||
import com.lyncode.xoai.dataprovider.core.ListSetsResult;
|
||||
import com.lyncode.xoai.dataprovider.core.Set;
|
||||
import com.lyncode.xoai.dataprovider.services.api.SetRepository;
|
||||
import org.apache.log4j.LogManager;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.dspace.content.Collection;
|
||||
import org.dspace.content.Community;
|
||||
import org.dspace.content.DSpaceObject;
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.handle.HandleServiceImpl;
|
||||
import org.dspace.storage.rdbms.DatabaseManager;
|
||||
import org.dspace.storage.rdbms.TableRow;
|
||||
import org.dspace.storage.rdbms.TableRowIterator;
|
||||
import org.dspace.xoai.data.DSpaceSet;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Lyncode Development Team <dspace@lyncode.com>
|
||||
*/
|
||||
public class DSpaceSetRepository implements SetRepository
|
||||
{
|
||||
private static final Logger log = LogManager.getLogger(DSpaceSetRepository.class);
|
||||
|
||||
private final Context _context;
|
||||
|
||||
public DSpaceSetRepository(Context context)
|
||||
{
|
||||
_context = context;
|
||||
}
|
||||
|
||||
private int getCommunityCount()
|
||||
{
|
||||
String query = "SELECT COUNT(*) as count FROM community";
|
||||
try
|
||||
{
|
||||
TableRowIterator iterator = DatabaseManager.query(_context, query);
|
||||
if (iterator.hasNext())
|
||||
return (int) iterator.next().getLongColumn("count");
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
private int getCollectionCount()
|
||||
{
|
||||
String query = "SELECT COUNT(*) as count FROM collection";
|
||||
try
|
||||
{
|
||||
TableRowIterator iterator = DatabaseManager.query(_context, query);
|
||||
if (iterator.hasNext())
|
||||
return (int) iterator.next().getLongColumn("count");
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Produce a list of DSpaceCommunitySet. The list is a segment of the full
|
||||
* list of Community ordered by ID.
|
||||
*
|
||||
* @param offset start this far down the list of Community.
|
||||
* @param length return up to this many Sets.
|
||||
* @return some Sets representing the Community list segment.
|
||||
*/
|
||||
private List<Set> community(int offset, int length)
|
||||
{
|
||||
List<Set> array = new ArrayList<Set>();
|
||||
StringBuffer query = new StringBuffer("SELECT community_id FROM community ORDER BY community_id");
|
||||
List<Serializable> params = new ArrayList<Serializable>();
|
||||
|
||||
DatabaseManager.applyOffsetAndLimit(query,params,offset,length);
|
||||
|
||||
try
|
||||
{
|
||||
TableRowIterator iterator = DatabaseManager.query(_context, query.toString(),
|
||||
params.toArray());
|
||||
int i = 0;
|
||||
while (iterator.hasNext() && i < length)
|
||||
{
|
||||
TableRow row = iterator.next();
|
||||
int communityID = row.getIntColumn("community_id");
|
||||
Community community = Community.find(_context, communityID);
|
||||
array.add(DSpaceSet.newDSpaceCommunitySet(
|
||||
community.getHandle(), community.getName()));
|
||||
i++;
|
||||
}
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Produce a list of DSpaceCollectionSet. The list is a segment of the full
|
||||
* list of Collection ordered by ID.
|
||||
*
|
||||
* @param offset start this far down the list of Collection.
|
||||
* @param length return up to this many Sets.
|
||||
* @return some Sets representing the Collection list segment.
|
||||
*/
|
||||
private List<Set> collection(int offset, int length)
|
||||
{
|
||||
List<Set> array = new ArrayList<Set>();
|
||||
StringBuffer query = new StringBuffer("SELECT collection_id FROM collection ORDER BY collection_id");
|
||||
List<Serializable> params = new ArrayList<Serializable>();
|
||||
|
||||
DatabaseManager.applyOffsetAndLimit(query,params,offset,length);
|
||||
|
||||
try
|
||||
{
|
||||
TableRowIterator iterator = DatabaseManager.query(_context, query.toString(),
|
||||
params.toArray());
|
||||
int i = 0;
|
||||
while (iterator.hasNext() && i < length)
|
||||
{
|
||||
TableRow row = iterator.next();
|
||||
int collectionID = row.getIntColumn("collection_id");
|
||||
Collection collection = Collection.find(_context, collectionID);
|
||||
array.add(DSpaceSet.newDSpaceCollectionSet(
|
||||
collection.getHandle(),
|
||||
collection.getName()));
|
||||
i++;
|
||||
}
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListSetsResult retrieveSets(int offset, int length)
|
||||
{
|
||||
// Only database sets (virtual sets are added by lyncode common library)
|
||||
log.debug("Querying sets. Offset: " + offset + " - Length: " + length);
|
||||
List<Set> array = new ArrayList<Set>();
|
||||
int communityCount = this.getCommunityCount();
|
||||
log.debug("Communities: " + communityCount);
|
||||
int collectionCount = this.getCollectionCount();
|
||||
log.debug("Collections: " + collectionCount);
|
||||
|
||||
if (offset < communityCount)
|
||||
{
|
||||
if (offset + length > communityCount)
|
||||
{
|
||||
// Add some collections
|
||||
List<Set> tmp = community(offset, length);
|
||||
array.addAll(tmp);
|
||||
array.addAll(collection(0, length - tmp.size()));
|
||||
}
|
||||
else
|
||||
array.addAll(community(offset, length));
|
||||
}
|
||||
else if (offset < communityCount + collectionCount)
|
||||
{
|
||||
array.addAll(collection(offset - communityCount, length));
|
||||
}
|
||||
log.debug("Has More Results: "
|
||||
+ ((offset + length < communityCount + collectionCount) ? "Yes"
|
||||
: "No"));
|
||||
return new ListSetsResult(offset + length < communityCount
|
||||
+ collectionCount, array, communityCount + collectionCount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportSets()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean exists(String setSpec)
|
||||
{
|
||||
if (setSpec.startsWith("col_"))
|
||||
{
|
||||
try
|
||||
{
|
||||
DSpaceObject dso = HandleServiceImpl.resolveToObject(_context,
|
||||
setSpec.replace("col_", "").replace("_", "/"));
|
||||
if (dso == null || !(dso instanceof Collection))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.error(ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
else if (setSpec.startsWith("com_"))
|
||||
{
|
||||
try
|
||||
{
|
||||
DSpaceObject dso = HandleServiceImpl.resolveToObject(_context,
|
||||
setSpec.replace("com_", "").replace("_", "/"));
|
||||
if (dso == null || !(dso instanceof Community))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.error(ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
@@ -1,24 +0,0 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.services.impl.xoai;
|
||||
|
||||
import com.lyncode.xoai.dataprovider.services.api.SetRepository;
|
||||
import org.dspace.xoai.services.api.context.ContextService;
|
||||
import org.dspace.xoai.services.api.context.ContextServiceException;
|
||||
import org.dspace.xoai.services.api.xoai.SetRepositoryResolver;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
public class DSpaceSetRepositoryResolver implements SetRepositoryResolver {
|
||||
@Autowired
|
||||
private ContextService contextService;
|
||||
|
||||
@Override
|
||||
public SetRepository getSetRepository() throws ContextServiceException {
|
||||
return new DSpaceSetRepository(contextService.getContext());
|
||||
}
|
||||
}
|
@@ -13,9 +13,7 @@ import com.lyncode.xoai.util.Base64Utils;
|
||||
import org.apache.log4j.LogManager;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.dspace.authorize.AuthorizeException;
|
||||
import org.dspace.content.Bitstream;
|
||||
import org.dspace.content.Bundle;
|
||||
import org.dspace.content.Metadatum;
|
||||
import org.dspace.content.Item;
|
||||
import org.dspace.content.authority.Choices;
|
||||
import org.dspace.core.ConfigurationManager;
|
||||
@@ -28,6 +26,13 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.sql.SQLException;
|
||||
import java.util.List;
|
||||
import org.dspace.content.BundleBitstream;
|
||||
import org.dspace.content.MetadataField;
|
||||
import org.dspace.content.MetadataValue;
|
||||
import org.dspace.content.factory.ContentServiceFactory;
|
||||
import org.dspace.content.service.BitstreamService;
|
||||
import org.dspace.content.service.ItemService;
|
||||
import org.dspace.core.Context;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -36,8 +41,13 @@ import java.util.List;
|
||||
@SuppressWarnings("deprecation")
|
||||
public class ItemUtils
|
||||
{
|
||||
private static Logger log = LogManager
|
||||
.getLogger(ItemUtils.class);
|
||||
private static final Logger log = LogManager.getLogger(ItemUtils.class);
|
||||
|
||||
private static final ItemService itemService
|
||||
= ContentServiceFactory.getInstance().getItemService();
|
||||
|
||||
private static final BitstreamService bitstreamService
|
||||
= ContentServiceFactory.getInstance().getBitstreamService();
|
||||
|
||||
private static Element getElement(List<Element> list, String name)
|
||||
{
|
||||
@@ -62,45 +72,45 @@ public class ItemUtils
|
||||
e.setName(name);
|
||||
return e;
|
||||
}
|
||||
public static Metadata retrieveMetadata (Item item) {
|
||||
public static Metadata retrieveMetadata (Context context, Item item) {
|
||||
Metadata metadata;
|
||||
|
||||
//DSpaceDatabaseItem dspaceItem = new DSpaceDatabaseItem(item);
|
||||
|
||||
// read all metadata into Metadata Object
|
||||
metadata = new Metadata();
|
||||
Metadatum[] vals = item.getMetadata(Item.ANY, Item.ANY, Item.ANY, Item.ANY);
|
||||
for (Metadatum val : vals)
|
||||
List<MetadataValue> vals = itemService.getMetadata(item, Item.ANY, Item.ANY, Item.ANY, Item.ANY);
|
||||
for (MetadataValue val : vals)
|
||||
{
|
||||
MetadataField field = val.getMetadataField();
|
||||
|
||||
Element valueElem = null;
|
||||
Element schema = getElement(metadata.getElement(), val.schema);
|
||||
Element schema = getElement(metadata.getElement(), field.getMetadataSchema().getName());
|
||||
if (schema == null)
|
||||
{
|
||||
schema = create(val.schema);
|
||||
schema = create(field.getMetadataSchema().getName());
|
||||
metadata.getElement().add(schema);
|
||||
}
|
||||
valueElem = schema;
|
||||
|
||||
// Has element.. with XOAI one could have only schema and value
|
||||
if (val.element != null && !val.element.equals(""))
|
||||
if (field.getElement() != null && !field.getElement().equals(""))
|
||||
{
|
||||
Element element = getElement(schema.getElement(),
|
||||
val.element);
|
||||
field.getElement());
|
||||
if (element == null)
|
||||
{
|
||||
element = create(val.element);
|
||||
element = create(field.getElement());
|
||||
schema.getElement().add(element);
|
||||
}
|
||||
valueElem = element;
|
||||
|
||||
// Qualified element?
|
||||
if (val.qualifier != null && !val.qualifier.equals(""))
|
||||
if (field.getQualifier() != null && !field.getQualifier().equals(""))
|
||||
{
|
||||
Element qualifier = getElement(element.getElement(),
|
||||
val.qualifier);
|
||||
field.getQualifier());
|
||||
if (qualifier == null)
|
||||
{
|
||||
qualifier = create(val.qualifier);
|
||||
qualifier = create(field.getQualifier());
|
||||
element.getElement().add(qualifier);
|
||||
}
|
||||
valueElem = qualifier;
|
||||
@@ -108,13 +118,13 @@ public class ItemUtils
|
||||
}
|
||||
|
||||
// Language?
|
||||
if (val.language != null && !val.language.equals(""))
|
||||
if (val.getLanguage() != null && !val.getLanguage().equals(""))
|
||||
{
|
||||
Element language = getElement(valueElem.getElement(),
|
||||
val.language);
|
||||
val.getLanguage());
|
||||
if (language == null)
|
||||
{
|
||||
language = create(val.language);
|
||||
language = create(val.getLanguage());
|
||||
valueElem.getElement().add(language);
|
||||
}
|
||||
valueElem = language;
|
||||
@@ -131,11 +141,11 @@ public class ItemUtils
|
||||
valueElem = language;
|
||||
}
|
||||
|
||||
valueElem.getField().add(createValue("value", val.value));
|
||||
if (val.authority != null) {
|
||||
valueElem.getField().add(createValue("authority", val.authority));
|
||||
if (val.confidence != Choices.CF_NOVALUE)
|
||||
valueElem.getField().add(createValue("confidence", val.confidence + ""));
|
||||
valueElem.getField().add(createValue("value", val.getValue()));
|
||||
if (val.getAuthority() != null) {
|
||||
valueElem.getField().add(createValue("authority", val.getAuthority()));
|
||||
if (val.getConfidence() != Choices.CF_NOVALUE)
|
||||
valueElem.getField().add(createValue("confidence", val.getConfidence() + ""));
|
||||
}
|
||||
}
|
||||
// Done! Metadata has been read!
|
||||
@@ -143,7 +153,7 @@ public class ItemUtils
|
||||
Element bundles = create("bundles");
|
||||
metadata.getElement().add(bundles);
|
||||
|
||||
Bundle[] bs;
|
||||
List<Bundle> bs;
|
||||
try
|
||||
{
|
||||
bs = item.getBundles();
|
||||
@@ -156,33 +166,33 @@ public class ItemUtils
|
||||
|
||||
Element bitstreams = create("bitstreams");
|
||||
bundle.getElement().add(bitstreams);
|
||||
Bitstream[] bits = b.getBitstreams();
|
||||
for (Bitstream bit : bits)
|
||||
List<BundleBitstream> bits = b.getBitstreams();
|
||||
for (BundleBitstream bit : bits)
|
||||
{
|
||||
Element bitstream = create("bitstream");
|
||||
bitstreams.getElement().add(bitstream);
|
||||
String url = "";
|
||||
String bsName = bit.getName();
|
||||
String sid = String.valueOf(bit.getSequenceID());
|
||||
String bsName = bit.getBitstream().getName();
|
||||
String sid = String.valueOf(bit.getBitstream().getSequenceID());
|
||||
String baseUrl = ConfigurationManager.getProperty("oai",
|
||||
"bitstream.baseUrl");
|
||||
String handle = null;
|
||||
// get handle of parent Item of this bitstream, if there
|
||||
// is one:
|
||||
Bundle[] bn = bit.getBundles();
|
||||
if (bn.length > 0)
|
||||
List<BundleBitstream> bn = bit.getBitstream().getBundles();
|
||||
if (!bn.isEmpty())
|
||||
{
|
||||
Item bi[] = bn[0].getItems();
|
||||
if (bi.length > 0)
|
||||
List<Item> bi = bn.get(0).getBundle().getItems();
|
||||
if (!bi.isEmpty())
|
||||
{
|
||||
handle = bi[0].getHandle();
|
||||
handle = bi.get(0).getHandle();
|
||||
}
|
||||
}
|
||||
if (bsName == null)
|
||||
{
|
||||
String ext[] = bit.getFormat().getExtensions();
|
||||
List<String> ext = bit.getBitstream().getFormat(context).getExtensions();
|
||||
bsName = "bitstream_" + sid
|
||||
+ (ext.length > 0 ? ext[0] : "");
|
||||
+ (ext.isEmpty() ? "" : ext.get(0));
|
||||
}
|
||||
if (handle != null && baseUrl != null)
|
||||
{
|
||||
@@ -196,11 +206,11 @@ public class ItemUtils
|
||||
url = URLUtils.encode(bsName);
|
||||
}
|
||||
|
||||
String cks = bit.getChecksum();
|
||||
String cka = bit.getChecksumAlgorithm();
|
||||
String oname = bit.getSource();
|
||||
String name = bit.getName();
|
||||
String description = bit.getDescription();
|
||||
String cks = bit.getBitstream().getChecksum();
|
||||
String cka = bit.getBitstream().getChecksumAlgorithm();
|
||||
String oname = bit.getBitstream().getSource();
|
||||
String name = bit.getBitstream().getName();
|
||||
String description = bit.getBitstream().getDescription();
|
||||
|
||||
if (name != null)
|
||||
bitstream.getField().add(
|
||||
@@ -212,17 +222,17 @@ public class ItemUtils
|
||||
bitstream.getField().add(
|
||||
createValue("description", description));
|
||||
bitstream.getField().add(
|
||||
createValue("format", bit.getFormat()
|
||||
createValue("format", bit.getBitstream().getFormat(context)
|
||||
.getMIMEType()));
|
||||
bitstream.getField().add(
|
||||
createValue("size", "" + bit.getSize()));
|
||||
createValue("size", "" + bit.getBitstream().getSize()));
|
||||
bitstream.getField().add(createValue("url", url));
|
||||
bitstream.getField().add(
|
||||
createValue("checksum", cks));
|
||||
bitstream.getField().add(
|
||||
createValue("checksumAlgorithm", cka));
|
||||
bitstream.getField().add(
|
||||
createValue("sid", bit.getSequenceID()
|
||||
createValue("sid", bit.getBitstream().getSequenceID()
|
||||
+ ""));
|
||||
}
|
||||
}
|
||||
@@ -257,21 +267,21 @@ public class ItemUtils
|
||||
|
||||
// Licensing info
|
||||
Element license = create("license");
|
||||
Bundle[] licBundles;
|
||||
List<Bundle> licBundles;
|
||||
try
|
||||
{
|
||||
licBundles = item.getBundles(Constants.LICENSE_BUNDLE_NAME);
|
||||
if (licBundles.length > 0)
|
||||
licBundles = itemService.getBundles(item, Constants.LICENSE_BUNDLE_NAME);
|
||||
if (!licBundles.isEmpty())
|
||||
{
|
||||
Bundle licBundle = licBundles[0];
|
||||
Bitstream[] licBits = licBundle.getBitstreams();
|
||||
if (licBits.length > 0)
|
||||
Bundle licBundle = licBundles.get(0);
|
||||
List<BundleBitstream> licBits = licBundle.getBitstreams();
|
||||
if (!licBits.isEmpty())
|
||||
{
|
||||
Bitstream licBit = licBits[0];
|
||||
BundleBitstream licBit = licBits.get(0);
|
||||
InputStream in;
|
||||
try
|
||||
{
|
||||
in = licBit.retrieve();
|
||||
in = bitstreamService.retrieve(context, licBit.getBitstream());
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
Utils.bufferedCopy(in, out);
|
||||
license.getField().add(
|
||||
@@ -279,15 +289,7 @@ public class ItemUtils
|
||||
Base64Utils.encode(out.toString())));
|
||||
metadata.getElement().add(license);
|
||||
}
|
||||
catch (AuthorizeException e)
|
||||
{
|
||||
log.warn(e.getMessage(), e);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
log.warn(e.getMessage(), e);
|
||||
}
|
||||
catch (SQLException e)
|
||||
catch (AuthorizeException | IOException | SQLException e)
|
||||
{
|
||||
log.warn(e.getMessage(), e);
|
||||
}
|
||||
|
@@ -9,7 +9,7 @@ package org.dspace.xoai.tests;
|
||||
|
||||
import org.dspace.xoai.services.api.config.ConfigurationService;
|
||||
import org.dspace.xoai.services.api.context.ContextService;
|
||||
import org.dspace.xoai.services.api.database.FieldResolver;
|
||||
import org.dspace.xoai.services.api.FieldResolver;
|
||||
import org.dspace.xoai.services.api.xoai.DSpaceFilterResolver;
|
||||
import org.dspace.xoai.services.impl.xoai.BaseDSpaceFilterResolver;
|
||||
import org.dspace.xoai.tests.helpers.stubs.StubbedConfigurationService;
|
||||
|
@@ -15,7 +15,7 @@ import org.dspace.xoai.services.api.cache.XOAICacheService;
|
||||
import org.dspace.xoai.services.api.config.XOAIManagerResolver;
|
||||
import org.dspace.xoai.services.api.context.ContextService;
|
||||
import org.dspace.xoai.services.api.context.ContextServiceException;
|
||||
import org.dspace.xoai.services.api.database.EarliestDateResolver;
|
||||
import org.dspace.xoai.services.api.EarliestDateResolver;
|
||||
import org.dspace.xoai.services.api.xoai.IdentifyResolver;
|
||||
import org.dspace.xoai.services.api.xoai.ItemRepositoryResolver;
|
||||
import org.dspace.xoai.services.api.xoai.SetRepositoryResolver;
|
||||
|
@@ -9,7 +9,7 @@ package org.dspace.xoai.tests.helpers.stubs;
|
||||
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.xoai.exceptions.InvalidMetadataFieldException;
|
||||
import org.dspace.xoai.services.api.database.EarliestDateResolver;
|
||||
import org.dspace.xoai.services.api.EarliestDateResolver;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.Date;
|
||||
|
@@ -9,7 +9,7 @@ package org.dspace.xoai.tests.helpers.stubs;
|
||||
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.xoai.exceptions.InvalidMetadataFieldException;
|
||||
import org.dspace.xoai.services.api.database.FieldResolver;
|
||||
import org.dspace.xoai.services.api.FieldResolver;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.HashMap;
|
||||
|
@@ -16,8 +16,8 @@ import org.apache.solr.client.solrj.SolrServer;
|
||||
import org.dspace.xoai.controller.DSpaceOAIDataProvider;
|
||||
import org.dspace.xoai.services.api.config.ConfigurationService;
|
||||
import org.dspace.xoai.services.api.config.XOAIManagerResolver;
|
||||
import org.dspace.xoai.services.api.database.EarliestDateResolver;
|
||||
import org.dspace.xoai.services.api.database.FieldResolver;
|
||||
import org.dspace.xoai.services.api.EarliestDateResolver;
|
||||
import org.dspace.xoai.services.api.FieldResolver;
|
||||
import org.dspace.xoai.tests.DSpaceTestConfiguration;
|
||||
import org.dspace.xoai.tests.helpers.stubs.*;
|
||||
import org.junit.After;
|
||||
|
@@ -10,9 +10,9 @@ package org.dspace.xoai.tests.unit.services.impl;
|
||||
import com.lyncode.builder.DateBuilder;
|
||||
import com.lyncode.xoai.dataprovider.services.impl.BaseDateProvider;
|
||||
import org.apache.solr.client.solrj.util.ClientUtils;
|
||||
import org.dspace.xoai.services.api.database.CollectionsService;
|
||||
import org.dspace.xoai.services.api.database.FieldResolver;
|
||||
import org.dspace.xoai.services.api.database.HandleResolver;
|
||||
import org.dspace.xoai.services.api.CollectionsService;
|
||||
import org.dspace.xoai.services.api.FieldResolver;
|
||||
import org.dspace.xoai.services.api.HandleResolver;
|
||||
import org.dspace.xoai.services.api.xoai.DSpaceFilterResolver;
|
||||
import org.dspace.xoai.tests.DSpaceBasicTestConfiguration;
|
||||
import org.dspace.xoai.tests.helpers.stubs.StubbedFieldResolver;
|
||||
|
@@ -1,214 +0,0 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.xoai.tests.unit.services.impl.database;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.dspace.core.Constants;
|
||||
import org.dspace.xoai.filter.DSpaceMetadataExistsFilter;
|
||||
import org.dspace.xoai.filter.DSpaceSetSpecFilter;
|
||||
import org.dspace.xoai.filter.DateFromFilter;
|
||||
import org.dspace.xoai.filter.DateUntilFilter;
|
||||
import org.dspace.xoai.services.api.database.DatabaseQuery;
|
||||
import org.dspace.xoai.services.impl.database.DSpaceDatabaseQueryResolver;
|
||||
import org.dspace.xoai.tests.unit.services.impl.AbstractQueryResolverTest;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.lyncode.builder.DateBuilder;
|
||||
import com.lyncode.xoai.dataprovider.data.Filter;
|
||||
import com.lyncode.xoai.dataprovider.filter.Scope;
|
||||
import com.lyncode.xoai.dataprovider.filter.ScopedFilter;
|
||||
import com.lyncode.xoai.dataprovider.filter.conditions.AndCondition;
|
||||
import com.lyncode.xoai.dataprovider.filter.conditions.Condition;
|
||||
import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterList;
|
||||
import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterMap;
|
||||
import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.StringValue;
|
||||
|
||||
public class DSpaceDatabaseQueryResolverTest extends AbstractQueryResolverTest {
|
||||
private static final Date DATE = new Date();
|
||||
private static final String SET = "col_testSet";
|
||||
private static final String FIELD_1 = "dc.title";
|
||||
private static final String FIELD_2 = "dc.type";
|
||||
private static final int START = 0;
|
||||
private static final int LENGTH = 100;
|
||||
|
||||
|
||||
private DSpaceDatabaseQueryResolver underTest = new DSpaceDatabaseQueryResolver();;
|
||||
|
||||
@Before
|
||||
public void autowire () {
|
||||
autowire(underTest);
|
||||
}
|
||||
|
||||
@After
|
||||
public void cleanup() {
|
||||
underTest = null;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void fromFilterQuery() throws Exception {
|
||||
List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>();
|
||||
scopedFilters.add(new ScopedFilter(new Condition() {
|
||||
@Override
|
||||
public Filter getFilter() {
|
||||
return new DateFromFilter(DATE);
|
||||
}
|
||||
}, Scope.Query));
|
||||
|
||||
DatabaseQuery result = underTest.buildQuery(scopedFilters, START, LENGTH);
|
||||
|
||||
assertThat(result.getQuery(), is("SELECT i.* FROM item i WHERE i.in_archive=true AND (i.last_modified >= ?) ORDER BY i.item_id OFFSET ? LIMIT ?"));
|
||||
assertThat(((java.sql.Date)result.getParameters().get(0)).getTime(), is(fromDate(DATE).getTime()));
|
||||
assertThat((Integer) result.getParameters().get(1), is(START));
|
||||
assertThat((Integer) result.getParameters().get(2), is(LENGTH));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void fromAndUntilFilterQuery() throws Exception {
|
||||
List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>();
|
||||
Condition fromCondition = new Condition() {
|
||||
@Override
|
||||
public Filter getFilter() {
|
||||
return new DateFromFilter(DATE);
|
||||
}
|
||||
};
|
||||
Condition untilCondition = new Condition() {
|
||||
@Override
|
||||
public Filter getFilter() {
|
||||
return new DateUntilFilter(DATE);
|
||||
}
|
||||
};
|
||||
scopedFilters.add(new ScopedFilter(new AndCondition(getFilterResolver(),
|
||||
fromCondition, untilCondition), Scope.Query));
|
||||
|
||||
DatabaseQuery result = underTest.buildQuery(scopedFilters, START, LENGTH);
|
||||
|
||||
assertThat(result.getQuery(), is("SELECT i.* FROM item i WHERE i.in_archive=true AND ((i.last_modified >= ?) AND (i.last_modified <= ?)) ORDER BY i.item_id OFFSET ? LIMIT ?"));
|
||||
assertThat(((java.sql.Date)result.getParameters().get(0)).getTime(), is(fromDate(DATE).getTime()));
|
||||
assertThat(((java.sql.Date)result.getParameters().get(1)).getTime(), is(untilDate(DATE).getTime()));
|
||||
assertThat((Integer) result.getParameters().get(2), is(START));
|
||||
assertThat((Integer) result.getParameters().get(3), is(LENGTH));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void customConditionForMetadataExistsFilterWithOneSingleValue() throws Exception {
|
||||
theFieldResolver().hasField(FIELD_1, 1);
|
||||
List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>();
|
||||
ParameterMap filterConfiguration = new ParameterMap().withValues(new StringValue()
|
||||
.withValue(FIELD_1)
|
||||
.withName("fields"));
|
||||
|
||||
final DSpaceMetadataExistsFilter metadataExistsFilter = new DSpaceMetadataExistsFilter();
|
||||
metadataExistsFilter.setConfiguration(filterConfiguration);
|
||||
metadataExistsFilter.setFieldResolver(theFieldResolver());
|
||||
scopedFilters.add(new ScopedFilter(new Condition()
|
||||
{
|
||||
@Override
|
||||
public Filter getFilter()
|
||||
{
|
||||
return metadataExistsFilter;
|
||||
}
|
||||
}, Scope.Query));
|
||||
|
||||
DatabaseQuery result = underTest.buildQuery(scopedFilters, START, LENGTH);
|
||||
|
||||
assertThat(result.getQuery(), is("SELECT i.* FROM item i WHERE i.in_archive=true AND ((EXISTS (SELECT tmp.* FROM metadatavalue tmp WHERE tmp.resource_id=i.item_id AND tmp.resource_type_id=" + Constants.ITEM + " AND tmp.metadata_field_id=?))) ORDER BY i.item_id OFFSET ? LIMIT ?"));
|
||||
assertThat(((Integer) result.getParameters().get(0)), is(1));
|
||||
assertThat((Integer) result.getParameters().get(1), is(START));
|
||||
assertThat((Integer) result.getParameters().get(2), is(LENGTH));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void customConditionForMetadataExistsFilterWithMultipleValues() throws Exception {
|
||||
theFieldResolver().hasField(FIELD_1, 1).hasField(FIELD_2, 2);
|
||||
List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>();
|
||||
ParameterMap filterConfiguration = new ParameterMap().withValues(new ParameterList()
|
||||
.withValues(
|
||||
new StringValue().withValue(FIELD_1),
|
||||
new StringValue().withValue(FIELD_2)
|
||||
)
|
||||
.withName("fields"));
|
||||
|
||||
final DSpaceMetadataExistsFilter metadataExistsFilter = new DSpaceMetadataExistsFilter();
|
||||
metadataExistsFilter.setConfiguration(filterConfiguration);
|
||||
metadataExistsFilter.setFieldResolver(theFieldResolver());
|
||||
scopedFilters.add(new ScopedFilter(new Condition()
|
||||
{
|
||||
@Override
|
||||
public Filter getFilter()
|
||||
{
|
||||
return metadataExistsFilter;
|
||||
}
|
||||
}, Scope.Query));
|
||||
|
||||
DatabaseQuery result = underTest.buildQuery(scopedFilters, START, LENGTH);
|
||||
|
||||
assertThat(result.getQuery(), is("SELECT i.* FROM item i WHERE i.in_archive=true AND ((EXISTS (SELECT tmp.* FROM metadatavalue tmp WHERE tmp.resource_id=i.item_id AND tmp.resource_type_id=" + Constants.ITEM + " AND tmp.metadata_field_id=?) OR EXISTS (SELECT tmp.* FROM metadatavalue tmp WHERE tmp.resource_id=i.item_id AND tmp.resource_type_id=" + Constants.ITEM + " AND tmp.metadata_field_id=?))) ORDER BY i.item_id OFFSET ? LIMIT ?"));
|
||||
assertThat(((Integer) result.getParameters().get(0)), is(1));
|
||||
assertThat(((Integer) result.getParameters().get(1)), is(2));
|
||||
assertThat((Integer) result.getParameters().get(2), is(START));
|
||||
assertThat((Integer) result.getParameters().get(3), is(LENGTH));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void fromFilterInMetadataFormatScope() throws Exception {
|
||||
List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>();
|
||||
scopedFilters.add(new ScopedFilter(new Condition() {
|
||||
@Override
|
||||
public Filter getFilter() {
|
||||
return new DateFromFilter(DATE);
|
||||
}
|
||||
}, Scope.MetadataFormat));
|
||||
|
||||
DatabaseQuery result = underTest.buildQuery(scopedFilters, START, LENGTH);
|
||||
|
||||
assertThat(result.getQuery(), is("SELECT i.* FROM item i WHERE i.in_archive=true AND (item.deleted:true OR (i.last_modified >= ?)) ORDER BY i.item_id OFFSET ? LIMIT ?"));
|
||||
assertThat(((java.sql.Date)result.getParameters().get(0)).getTime(), is(fromDate(DATE).getTime()));
|
||||
assertThat((Integer) result.getParameters().get(1), is(START));
|
||||
assertThat((Integer) result.getParameters().get(2), is(LENGTH));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void fromAndSetFilterQuery() throws Exception {
|
||||
List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>();
|
||||
scopedFilters.add(new ScopedFilter(new Condition() {
|
||||
@Override
|
||||
public Filter getFilter() {
|
||||
return new DateFromFilter(DATE);
|
||||
}
|
||||
}, Scope.Query));
|
||||
scopedFilters.add(new ScopedFilter(new Condition() {
|
||||
@Override
|
||||
public Filter getFilter() {
|
||||
return new DSpaceSetSpecFilter(collectionsService, handleResolver, SET);
|
||||
}
|
||||
}, Scope.Query));
|
||||
|
||||
DatabaseQuery result = underTest.buildQuery(scopedFilters, START, LENGTH);
|
||||
|
||||
assertThat(result.getQuery(), is("SELECT i.* FROM item i WHERE i.in_archive=true AND (i.last_modified >= ?) AND true ORDER BY i.item_id OFFSET ? LIMIT ?"));
|
||||
assertThat(((java.sql.Date)result.getParameters().get(0)).getTime(), is(fromDate(DATE).getTime()));
|
||||
assertThat((Integer) result.getParameters().get(1), is(START));
|
||||
assertThat((Integer) result.getParameters().get(2), is(LENGTH));
|
||||
}
|
||||
|
||||
private Date fromDate(Date date) {
|
||||
return new DateBuilder(date).setMinMilliseconds().build();
|
||||
}
|
||||
|
||||
private Date untilDate(Date date) {
|
||||
return new DateBuilder(date).setMaxMilliseconds().build();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user