diff --git a/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java index 80c6a4953c..6fc05c8c9a 100644 --- a/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java @@ -207,6 +207,13 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl implements It return itemDAO.findAllByCollection(context, collection); } + @Override + public Iterator 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 implements It @Override public List getCommunities(Context context, Item item) throws SQLException { - List result = new ArrayList(); + List result = new ArrayList<>(); List collections = item.getCollections(); for (Collection collection : collections) { List owningCommunities = collection.getCommunities(); @@ -238,7 +245,7 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl implements It @Override public List getBundles(Item item, String name) throws SQLException { - List matchingBundles = new ArrayList(); + List matchingBundles = new ArrayList<>(); // now only keep bundles with matching names List bunds = item.getBundles(); for (Bundle bund : bunds) { @@ -316,7 +323,7 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl implements It @Override public List getNonInternalBitstreams(Context context, Item item) throws SQLException { - List bitstreamList = new ArrayList(); + List 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 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 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 implements It public Item findByLegacyId(Context context, int id) throws SQLException { return itemDAO.findByLegacyId(context, id, Item.class); } + + @Override + public Iterator findByLastModifiedSince(Context context, Date last) + throws SQLException + { + return itemDAO.findByLastModifiedSince(context, last); + } } diff --git a/dspace-api/src/main/java/org/dspace/content/MetadataValueServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/MetadataValueServiceImpl.java index 10a317c324..49abb3aae2 100644 --- a/dspace-api/src/main/java/org/dspace/content/MetadataValueServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/MetadataValueServiceImpl.java @@ -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); + } } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/ItemDAO.java b/dspace-api/src/main/java/org/dspace/content/dao/ItemDAO.java index 4459c65a0b..1f7fdd0add 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/ItemDAO.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/ItemDAO.java @@ -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 public Iterator 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 findByLastModifiedSince(Context context, Date since) + throws SQLException; + public Iterator findBySubmitter(Context context, EPerson eperson) throws SQLException; public Iterator findBySubmitter(Context context, EPerson eperson, MetadataField metadataField, int limit) throws SQLException; @@ -42,4 +53,17 @@ public interface ItemDAO extends DSpaceObjectLegacySupportDAO public Iterator 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 findAll(Context context, boolean archived, + boolean withdrawn, boolean discoverable, Date lastModified) + throws SQLException; } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/MetadataValueDAO.java b/dspace-api/src/main/java/org/dspace/content/dao/MetadataValueDAO.java index 819f95b049..fc7d9c1186 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/MetadataValueDAO.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/MetadataValueDAO.java @@ -29,4 +29,7 @@ public interface MetadataValueDAO extends GenericDAO { public List 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; } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java index f0516d50b1..f7a7f582d3 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java @@ -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 implements ItemDA return iterate(query); } + @Override + public Iterator 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 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 implements ItemDA return count(query); } + + @Override + public Iterator 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); + } } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java index b8d9637e82..c976018f4d 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java @@ -55,4 +55,15 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO 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(); + } } diff --git a/dspace-api/src/main/java/org/dspace/content/service/ItemService.java b/dspace-api/src/main/java/org/dspace/content/service/ItemService.java index 4252918351..45505a5399 100644 --- a/dspace-api/src/main/java/org/dspace/content/service/ItemService.java +++ b/dspace-api/src/main/java/org/dspace/content/service/ItemService.java @@ -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, DSpaceObjectLega */ public Iterator 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 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, 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 findByLastModifiedSince(Context context, Date last) + throws SQLException; } \ No newline at end of file diff --git a/dspace-api/src/main/java/org/dspace/content/service/MetadataValueService.java b/dspace-api/src/main/java/org/dspace/content/service/MetadataValueService.java index 9ed5e5c2f8..15615979f6 100644 --- a/dspace-api/src/main/java/org/dspace/content/service/MetadataValueService.java +++ b/dspace-api/src/main/java/org/dspace/content/service/MetadataValueService.java @@ -80,4 +80,15 @@ public interface MetadataValueService { public List 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; } diff --git a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java index baa17a125a..85d2b5689e 100644 --- a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java +++ b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java @@ -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 implements GenericDAO { return result; } + /** + * Execute a JPA Criteria query and return a collection of results. + * + * @param context + * @param query + * @return + * @throws SQLException + */ public List findMany(Context context, Query query) throws SQLException { @SuppressWarnings("unchecked") List result = (List) query.list(); @@ -116,8 +123,9 @@ public abstract class AbstractHibernateDAO implements GenericDAO { } /** - * 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 implements GenericDAO { } /** - * 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 */ diff --git a/dspace-api/src/main/java/org/dspace/core/GenericDAO.java b/dspace-api/src/main/java/org/dspace/core/GenericDAO.java index a27c77b4f9..5139526b43 100644 --- a/dspace-api/src/main/java/org/dspace/core/GenericDAO.java +++ b/dspace-api/src/main/java/org/dspace/core/GenericDAO.java @@ -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 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 findAll(Context context, Class 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 findMany(Context context, String query) throws SQLException; } diff --git a/dspace-oai/src/main/java/org/dspace/xoai/app/BasicConfiguration.java b/dspace-oai/src/main/java/org/dspace/xoai/app/BasicConfiguration.java index b332112fd1..a397c905a2 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/app/BasicConfiguration.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/app/BasicConfiguration.java @@ -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(); - } } diff --git a/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java b/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java index 702e61497d..35637b0edb 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java @@ -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 getFileFormats(Item item) { - List formats = new ArrayList(); + private List getFileFormats(Item item) { + List 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 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 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 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 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 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"); diff --git a/dspace-oai/src/main/java/org/dspace/xoai/data/DSpaceDatabaseItem.java b/dspace-oai/src/main/java/org/dspace/xoai/data/DSpaceDatabaseItem.java deleted file mode 100644 index 5a6030d1dc..0000000000 --- a/dspace-oai/src/main/java/org/dspace/xoai/data/DSpaceDatabaseItem.java +++ /dev/null @@ -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 - */ -public class DSpaceDatabaseItem extends DSpaceItem -{ - private static Logger log = LogManager.getLogger(DSpaceDatabaseItem.class); - - private Item item; - private List sets; - - public DSpaceDatabaseItem(Item item, Metadata metadata, List sets) - { - this.item = item; - this.metadata = new ItemMetadata(metadata); - this.sets = sets; - } - - @Override - public Date getDatestamp() - { - return item.getLastModified(); - } - - @Override - public List 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(); - } -} diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/AndFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/AndFilter.java index 2730c81735..32486b73ce 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/AndFilter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/AndFilter.java @@ -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 param = new ArrayList(); - 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()+")"); diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAtLeastOneMetadataFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAtLeastOneMetadataFilter.java index d7f6fb6d23..fbbb4aa533 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAtLeastOneMetadataFilter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAtLeastOneMetadataFilter.java @@ -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 */ 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(); + values = new ArrayList<>(); values.add(((SimpleType) parameterValue).asString()); } else if (parameterValue instanceof ParameterList) { values = new ListBuilder() @@ -64,7 +59,7 @@ public class DSpaceAtLeastOneMetadataFilter extends DSpaceFilter { return elem.asSimpleType().asString(); } }); - } else values = new ArrayList(); + } 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 values) { - List parts = new ArrayList(); - List params = new ArrayList(); - 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 parts, - List 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 parts = new ArrayList(); + List parts = new ArrayList<>(); if (this.getField() != null) { for (String v : this.getValues()) this.buildQuery("metadata." + field, diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAuthorizationFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAuthorizationFilter.java index 1ee1369d1e..405c0d9bdb 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAuthorizationFilter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAuthorizationFilter.java @@ -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 params = new ArrayList(); - 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) { diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceFilter.java index fa3f7838bf..3a7a641e70 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceFilter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceFilter.java @@ -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); diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceMetadataExistsFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceMetadataExistsFilter.java index 1577a6f90b..5d5ea12b35 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceMetadataExistsFilter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceMetadataExistsFilter.java @@ -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 */ public class DSpaceMetadataExistsFilter extends DSpaceFilter { - private static Logger log = LogManager + private static final Logger log = LogManager .getLogger(DSpaceMetadataExistsFilter.class); private List fields; @@ -57,31 +52,6 @@ public class DSpaceMetadataExistsFilter extends DSpaceFilter { return fields; } - @Override - public DatabaseFilterResult buildDatabaseQuery(Context context) { - try { - List fields = this.getFields(); - StringBuilder where = new StringBuilder(); - List args = new ArrayList(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()) { diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceSetSpecFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceSetSpecFilter.java index 4e88f2da63..20f68ecf90 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceSetSpecFilter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceSetSpecFilter.java @@ -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 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) { diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceWithdrawnFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceWithdrawnFilter.java index 1488141646..75b9c8b1a7 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceWithdrawnFilter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceWithdrawnFilter.java @@ -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 params = new ArrayList(); - - 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 diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DatabaseFilterResult.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DatabaseFilterResult.java deleted file mode 100644 index 5f9b726bd5..0000000000 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DatabaseFilterResult.java +++ /dev/null @@ -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 - */ -public class DatabaseFilterResult -{ - private String _where; - - private List _params; - - private boolean _nothing; - - public DatabaseFilterResult() - { - _nothing = true; - } - - public DatabaseFilterResult(String where, Object... params) - { - _nothing = false; - _where = where; - _params = new ArrayList(); - for (Object obj : params) - _params.add(obj); - } - - public DatabaseFilterResult(String where, List params) - { - _nothing = false; - _where = where; - _params = params; - } - - public boolean hasResult() - { - return !_nothing; - } - - public String getWhere() - { - return _where; - } - - public List getParameters() - { - return _params; - } - -} diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DateFromFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DateFromFilter.java index 20e96c36af..412965a304 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DateFromFilter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DateFromFilter.java @@ -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 */ 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) { diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DateUntilFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DateUntilFilter.java index 1995fc0dfc..4ac85e9e96 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DateUntilFilter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DateUntilFilter.java @@ -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) { diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/NotFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/NotFilter.java index 5235949084..f0eeed6c0a 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/NotFilter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/NotFilter.java @@ -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()+")"); diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/OrFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/OrFilter.java index d3eb3366ac..c9dcf1a376 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/OrFilter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/OrFilter.java @@ -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 param = new ArrayList(); - 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()+")"); diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/results/DatabaseFilterResult.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/results/DatabaseFilterResult.java deleted file mode 100644 index 4c417eac1c..0000000000 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/results/DatabaseFilterResult.java +++ /dev/null @@ -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 - */ -public class DatabaseFilterResult -{ - private String where; - private List parameters; - private boolean nothing; - - public DatabaseFilterResult() - { - nothing = true; - } - - public DatabaseFilterResult(String where, Object... params) - { - nothing = false; - this.where = where; - parameters = new ArrayList(); - for (Object obj : params) - parameters.add(obj); - } - - public DatabaseFilterResult(String where, List params) - { - nothing = false; - this.where = where; - parameters = params; - } - - public boolean hasResult() - { - return !nothing; - } - - public String getQuery() - { - return where; - } - - public List getParameters() - { - return parameters; - } - -} diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/CollectionsService.java b/dspace-oai/src/main/java/org/dspace/xoai/services/api/CollectionsService.java similarity index 83% rename from dspace-oai/src/main/java/org/dspace/xoai/services/api/database/CollectionsService.java rename to dspace-oai/src/main/java/org/dspace/xoai/services/api/CollectionsService.java index 1488e90296..398a1aab6f 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/CollectionsService.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/api/CollectionsService.java @@ -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 getAllSubCollections(int communityId) throws SQLException; + List getAllSubCollections(UUID communityId) throws SQLException; List flatParentCommunities(Collection collection) throws SQLException; List flatParentCommunities(Community community) throws SQLException; List flatParentCommunities(Item item) throws SQLException; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/EarliestDateResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/api/EarliestDateResolver.java similarity index 91% rename from dspace-oai/src/main/java/org/dspace/xoai/services/api/database/EarliestDateResolver.java rename to dspace-oai/src/main/java/org/dspace/xoai/services/api/EarliestDateResolver.java index 9a08a20258..b3d5eadeb4 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/EarliestDateResolver.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/api/EarliestDateResolver.java @@ -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; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/FieldResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/api/FieldResolver.java similarity index 91% rename from dspace-oai/src/main/java/org/dspace/xoai/services/api/database/FieldResolver.java rename to dspace-oai/src/main/java/org/dspace/xoai/services/api/FieldResolver.java index b4cb57821e..d8599cbd57 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/FieldResolver.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/api/FieldResolver.java @@ -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; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/HandleResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/api/HandleResolver.java similarity index 90% rename from dspace-oai/src/main/java/org/dspace/xoai/services/api/database/HandleResolver.java rename to dspace-oai/src/main/java/org/dspace/xoai/services/api/HandleResolver.java index c46e10c721..02e0537f1a 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/HandleResolver.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/api/HandleResolver.java @@ -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; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/HandleResolverException.java b/dspace-oai/src/main/java/org/dspace/xoai/services/api/HandleResolverException.java similarity index 92% rename from dspace-oai/src/main/java/org/dspace/xoai/services/api/database/HandleResolverException.java rename to dspace-oai/src/main/java/org/dspace/xoai/services/api/HandleResolverException.java index 2402102ac1..10191f15dd 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/HandleResolverException.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/api/HandleResolverException.java @@ -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 { diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/DatabaseQuery.java b/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/DatabaseQuery.java deleted file mode 100644 index 3e5b27856d..0000000000 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/DatabaseQuery.java +++ /dev/null @@ -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 parameters; - private Context context; - private Integer total; - - private String countQuery; - private List countParameters; - - public DatabaseQuery(Context context) { - this.context = context; - this.parameters = new ArrayList(); - } - - public String getQuery() { - return query; - } - - public List getParameters() { - return parameters; - } - - public DatabaseQuery withQuery (String query) { - this.query = query; - return this; - } - - public DatabaseQuery withParameters (List parameters) { - this.parameters.addAll(parameters); - return this; - } - - public DatabaseQuery withCountQuery (String query, List 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; - } -} diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/DatabaseQueryException.java b/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/DatabaseQueryException.java deleted file mode 100644 index 3857a7124d..0000000000 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/DatabaseQueryException.java +++ /dev/null @@ -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); - } -} diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/DatabaseQueryResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/DatabaseQueryResolver.java deleted file mode 100644 index 324e75da66..0000000000 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/api/database/DatabaseQueryResolver.java +++ /dev/null @@ -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 filters, int offset, int length) throws DatabaseQueryException; -} diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/api/xoai/DSpaceFilterResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/api/xoai/DSpaceFilterResolver.java index 4b72af566b..526e439683 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/api/xoai/DSpaceFilterResolver.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/api/xoai/DSpaceFilterResolver.java @@ -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 parameters, Scope scope) throws ContextServiceException; - String buildSolrQuery(Scope scope, Condition condition); } diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/DSpaceCollectionsService.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceCollectionsService.java similarity index 61% rename from dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/DSpaceCollectionsService.java rename to dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceCollectionsService.java index 7ce9ff9b0b..2143698239 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/DSpaceCollectionsService.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceCollectionsService.java @@ -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 getAllSubCollections(int communityId) + @Override + public List getAllSubCollections(UUID communityId) throws SQLException { - Queue comqueue = new LinkedList(); - List list = new ArrayList(); + Queue comqueue = new LinkedList<>(); + List 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 flatParentCommunities(Collection c) throws SQLException { - Queue queue = new LinkedList(); - List result = new ArrayList(); + Queue queue = new LinkedList<>(); + List result = new ArrayList<>(); for (Community com : c.getCommunities()) queue.add(com); while (!queue.isEmpty()) { Community p = queue.poll(); - Community par = p.getParentCommunity(); + List 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 flatParentCommunities(Community c) throws SQLException { - Queue queue = new LinkedList(); - List result = new ArrayList(); + Queue queue = new LinkedList<>(); + List result = new ArrayList<>(); queue.add(c); while (!queue.isEmpty()) { Community p = queue.poll(); - Community par = p.getParentCommunity(); + List 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 flatParentCommunities(Item c) throws SQLException { - Queue queue = new LinkedList(); - List result = new ArrayList(); + Queue queue = new LinkedList<>(); + List 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 par = p.getParentCommunities(); if (par != null) - queue.add(par); + queue.addAll(par); if (!result.contains(p)) result.add(p); } diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/DSpaceEarliestDateResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceEarliestDateResolver.java similarity index 62% rename from dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/DSpaceEarliestDateResolver.java rename to dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceEarliestDateResolver.java index 8a5dcccc01..797b7b0448 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/DSpaceEarliestDateResolver.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceEarliestDateResolver.java @@ -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, - fieldResolver.getFieldID(context, "dc.date.available")); - - if (iterator.hasNext()) + MetadataValueService metadataValueService = ContentServiceFactory.getInstance().getMetadataValueService(); + MetadataValue minimum = metadataValueService.getMinimum(context, + fieldResolver.getFieldID(context, "dc.date.available")); + if (null != minimum) { - String str = iterator.next().getStringColumn("value"); + String str = minimum.getValue(); try { Date d = DateUtils.parse(str); diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/DSpaceFieldResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceFieldResolver.java similarity index 54% rename from dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/DSpaceFieldResolver.java rename to dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceFieldResolver.java index edcc34292a..35547c7acc 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/DSpaceFieldResolver.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceFieldResolver.java @@ -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(); diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/DSpaceHandlerResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceHandleResolver.java similarity index 50% rename from dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/DSpaceHandlerResolver.java rename to dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceHandleResolver.java index 662c7afad9..31459cfb3e 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/DSpaceHandlerResolver.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceHandleResolver.java @@ -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); } } diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/MetadataFieldCache.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/MetadataFieldCache.java similarity index 95% rename from dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/MetadataFieldCache.java rename to dspace-oai/src/main/java/org/dspace/xoai/services/impl/MetadataFieldCache.java index 66a2256d20..408dc8ecc8 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/MetadataFieldCache.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/MetadataFieldCache.java @@ -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; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/context/DSpaceContextService.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/context/DSpaceContextService.java index 9cdd0a9703..3501a59a75 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/context/DSpaceContextService.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/context/DSpaceContextService.java @@ -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); - } + request.setAttribute(OAI_CONTEXT, new Context()); } return (Context) request.getAttribute(OAI_CONTEXT); } diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/DSpaceDatabaseQueryResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/DSpaceDatabaseQueryResolver.java deleted file mode 100644 index 1e1ea57d96..0000000000 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/database/DSpaceDatabaseQueryResolver.java +++ /dev/null @@ -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 filters, int offset, int length) throws DatabaseQueryException { - List parameters = new ArrayList(); - List countParameters = new ArrayList(); - 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 parameters) throws ContextServiceException { - return filterResolver.buildDatabaseQuery(condition, parameters, scope); - } - - private String buildCondition (List filters, List parameters) throws ContextServiceException { - List whereCond = new ArrayList(); - for (ScopedFilter filter : filters) - whereCond.add(this.buildQuery(filter.getCondition(), filter.getScope(), parameters)); - - return StringUtils.join(whereCond.iterator(), " AND "); - } -} diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/set/DSpaceSetSpecResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/set/DSpaceSetSpecResolver.java index 1bb97a4677..368cc11834 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/set/DSpaceSetSpecResolver.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/set/DSpaceSetSpecResolver.java @@ -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; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/BaseDSpaceFilterResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/BaseDSpaceFilterResolver.java index a076c62f3b..15bb5333e2 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/BaseDSpaceFilterResolver.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/BaseDSpaceFilterResolver.java @@ -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 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); diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceIdentifyResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceIdentifyResolver.java index fb95513773..19cc1edc80 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceIdentifyResolver.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceIdentifyResolver.java @@ -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; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemDatabaseRepository.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemDatabaseRepository.java deleted file mode 100644 index fd4e92d761..0000000000 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemDatabaseRepository.java +++ /dev/null @@ -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 - * @author Domingo Iglesias - */ -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 getSets(org.dspace.content.Item item) - { - List sets = new ArrayList(); - List coms = new ArrayList(); - 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 filters, int offset, - int length) throws OAIException - { - List list = new ArrayList(); - 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 filters, int offset, int length) throws OAIException - { - - List list = new ArrayList(); - 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); - } -} diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemRepository.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemRepository.java index 95bfb689a4..7b4fb470f9 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemRepository.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemRepository.java @@ -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; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemRepositoryResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemRepositoryResolver.java index 9e169cb2b8..9c74a7a895 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemRepositoryResolver.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemRepositoryResolver.java @@ -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); - } catch (SolrServerException e) { - throw new ContextServiceException(e.getMessage(), e); - } - } else - itemRepository = new DSpaceItemDatabaseRepository(configurationService, collectionsService, handleResolver, cacheService, databaseQueryResolver, contextService); + try { + itemRepository = new DSpaceItemSolrRepository( + solrServerResolver.getServer(), + collectionsService, + handleResolver, + solrQueryResolver); + } catch (SolrServerException e) { + throw new ContextServiceException(e.getMessage(), e); + } } return itemRepository; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemSolrRepository.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemSolrRepository.java index 2e4d3bcf62..3d52d5ab2c 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemSolrRepository.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemSolrRepository.java @@ -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; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceRepositoryConfiguration.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceRepositoryConfiguration.java index 5aba41bf1f..f006b183a7 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceRepositoryConfiguration.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceRepositoryConfiguration.java @@ -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; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceSetRepository.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceSetRepository.java deleted file mode 100644 index a4887e8f4e..0000000000 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceSetRepository.java +++ /dev/null @@ -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 - */ -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 community(int offset, int length) - { - List array = new ArrayList(); - StringBuffer query = new StringBuffer("SELECT community_id FROM community ORDER BY community_id"); - List params = new ArrayList(); - - 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 collection(int offset, int length) - { - List array = new ArrayList(); - StringBuffer query = new StringBuffer("SELECT collection_id FROM collection ORDER BY collection_id"); - List params = new ArrayList(); - - 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 array = new ArrayList(); - 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 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; - } - -} diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceSetRepositoryResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceSetRepositoryResolver.java deleted file mode 100644 index c5551d0f93..0000000000 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceSetRepositoryResolver.java +++ /dev/null @@ -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()); - } -} diff --git a/dspace-oai/src/main/java/org/dspace/xoai/util/ItemUtils.java b/dspace-oai/src/main/java/org/dspace/xoai/util/ItemUtils.java index 7ffd48ad75..d256823faa 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/util/ItemUtils.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/util/ItemUtils.java @@ -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 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 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 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 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 bn = bit.getBitstream().getBundles(); + if (!bn.isEmpty()) { - Item bi[] = bn[0].getItems(); - if (bi.length > 0) + List 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 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 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 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); } diff --git a/dspace-oai/src/test/java/org/dspace/xoai/tests/DSpaceBasicTestConfiguration.java b/dspace-oai/src/test/java/org/dspace/xoai/tests/DSpaceBasicTestConfiguration.java index 9fc140099c..104e9dceb6 100644 --- a/dspace-oai/src/test/java/org/dspace/xoai/tests/DSpaceBasicTestConfiguration.java +++ b/dspace-oai/src/test/java/org/dspace/xoai/tests/DSpaceBasicTestConfiguration.java @@ -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; diff --git a/dspace-oai/src/test/java/org/dspace/xoai/tests/DSpaceTestConfiguration.java b/dspace-oai/src/test/java/org/dspace/xoai/tests/DSpaceTestConfiguration.java index 70aa8c0a8c..64e42bb9a8 100644 --- a/dspace-oai/src/test/java/org/dspace/xoai/tests/DSpaceTestConfiguration.java +++ b/dspace-oai/src/test/java/org/dspace/xoai/tests/DSpaceTestConfiguration.java @@ -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; diff --git a/dspace-oai/src/test/java/org/dspace/xoai/tests/helpers/stubs/StubbedEarliestDateResolver.java b/dspace-oai/src/test/java/org/dspace/xoai/tests/helpers/stubs/StubbedEarliestDateResolver.java index 8271ce0c8c..fb6e9192b3 100644 --- a/dspace-oai/src/test/java/org/dspace/xoai/tests/helpers/stubs/StubbedEarliestDateResolver.java +++ b/dspace-oai/src/test/java/org/dspace/xoai/tests/helpers/stubs/StubbedEarliestDateResolver.java @@ -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; diff --git a/dspace-oai/src/test/java/org/dspace/xoai/tests/helpers/stubs/StubbedFieldResolver.java b/dspace-oai/src/test/java/org/dspace/xoai/tests/helpers/stubs/StubbedFieldResolver.java index 08e92eb0fc..86e73cf8e4 100644 --- a/dspace-oai/src/test/java/org/dspace/xoai/tests/helpers/stubs/StubbedFieldResolver.java +++ b/dspace-oai/src/test/java/org/dspace/xoai/tests/helpers/stubs/StubbedFieldResolver.java @@ -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; diff --git a/dspace-oai/src/test/java/org/dspace/xoai/tests/integration/xoai/AbstractDSpaceTest.java b/dspace-oai/src/test/java/org/dspace/xoai/tests/integration/xoai/AbstractDSpaceTest.java index fabaa12136..5dae28bb79 100644 --- a/dspace-oai/src/test/java/org/dspace/xoai/tests/integration/xoai/AbstractDSpaceTest.java +++ b/dspace-oai/src/test/java/org/dspace/xoai/tests/integration/xoai/AbstractDSpaceTest.java @@ -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; diff --git a/dspace-oai/src/test/java/org/dspace/xoai/tests/unit/services/impl/AbstractQueryResolverTest.java b/dspace-oai/src/test/java/org/dspace/xoai/tests/unit/services/impl/AbstractQueryResolverTest.java index 819a35d84b..4bf9bea100 100644 --- a/dspace-oai/src/test/java/org/dspace/xoai/tests/unit/services/impl/AbstractQueryResolverTest.java +++ b/dspace-oai/src/test/java/org/dspace/xoai/tests/unit/services/impl/AbstractQueryResolverTest.java @@ -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; diff --git a/dspace-oai/src/test/java/org/dspace/xoai/tests/unit/services/impl/database/DSpaceDatabaseQueryResolverTest.java b/dspace-oai/src/test/java/org/dspace/xoai/tests/unit/services/impl/database/DSpaceDatabaseQueryResolverTest.java deleted file mode 100644 index a1539cc2e4..0000000000 --- a/dspace-oai/src/test/java/org/dspace/xoai/tests/unit/services/impl/database/DSpaceDatabaseQueryResolverTest.java +++ /dev/null @@ -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 scopedFilters = new ArrayList(); - 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 scopedFilters = new ArrayList(); - 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 scopedFilters = new ArrayList(); - 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 scopedFilters = new ArrayList(); - 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 scopedFilters = new ArrayList(); - 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 scopedFilters = new ArrayList(); - 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(); - } -}