Merge pull request #1024 from mwoodiupui/DS-2701-oai-main

[DS-2701] dspace-oai
This commit is contained in:
Kevin Van de Velde
2015-08-31 12:34:41 +02:00
60 changed files with 428 additions and 1694 deletions

View File

@@ -207,6 +207,13 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
return itemDAO.findAllByCollection(context, collection);
}
@Override
public Iterator<Item> findInArchiveOrWithdrawnDiscoverableModifiedSince(Context context, Date since)
throws SQLException
{
return itemDAO.findAll(context, true, true, true, since);
}
@Override
public void updateLastModified(Context context, Item item) throws SQLException, AuthorizeException {
item.setLastModified(new Date());
@@ -223,7 +230,7 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
@Override
public List<Community> getCommunities(Context context, Item item) throws SQLException {
List<Community> result = new ArrayList<Community>();
List<Community> result = new ArrayList<>();
List<Collection> collections = item.getCollections();
for (Collection collection : collections) {
List<Community> owningCommunities = collection.getCommunities();
@@ -238,7 +245,7 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
@Override
public List<Bundle> getBundles(Item item, String name) throws SQLException {
List<Bundle> matchingBundles = new ArrayList<Bundle>();
List<Bundle> matchingBundles = new ArrayList<>();
// now only keep bundles with matching names
List<Bundle> bunds = item.getBundles();
for (Bundle bund : bunds) {
@@ -316,7 +323,7 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
@Override
public List<Bitstream> getNonInternalBitstreams(Context context, Item item) throws SQLException {
List<Bitstream> bitstreamList = new ArrayList<Bitstream>();
List<Bitstream> bitstreamList = new ArrayList<>();
// Go through the bundles and bitstreams picking out ones which aren't
// of internal formats
@@ -646,13 +653,7 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
public boolean isOwningCollection(Item item, Collection collection) {
Collection owningCollection = item.getOwningCollection();
if (owningCollection != null && collection.getID().equals(owningCollection.getID()))
{
return true;
}
// not the owner
return false;
return owningCollection != null && collection.getID().equals(owningCollection.getID());
}
@Override
@@ -874,13 +875,7 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
return true;
}
// is this person an COLLECTION_EDITOR for the owning collection?
if (collectionService.canEditBoolean(context, item.getOwningCollection(), false))
{
return true;
}
return false;
return collectionService.canEditBoolean(context, item.getOwningCollection(), false);
}
@@ -1132,4 +1127,11 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
public Item findByLegacyId(Context context, int id) throws SQLException {
return itemDAO.findByLegacyId(context, id, Item.class);
}
@Override
public Iterator<Item> findByLastModifiedSince(Context context, Date last)
throws SQLException
{
return itemDAO.findByLastModifiedSince(context, last);
}
}

View File

@@ -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);
}
}

View File

@@ -14,6 +14,7 @@ import org.dspace.core.Context;
import org.dspace.eperson.EPerson;
import java.sql.SQLException;
import java.util.Date;
import java.util.Iterator;
/**
@@ -29,6 +30,16 @@ public interface ItemDAO extends DSpaceObjectLegacySupportDAO<Item>
public Iterator<Item> findAll(Context context, boolean archived, boolean withdrawn) throws SQLException;
/**
* Find all Items modified since a Date.
*
* @param context
* @param since Earliest interesting last-modified date.
* @return
*/
public Iterator<Item> findByLastModifiedSince(Context context, Date since)
throws SQLException;
public Iterator<Item> findBySubmitter(Context context, EPerson eperson) throws SQLException;
public Iterator<Item> findBySubmitter(Context context, EPerson eperson, MetadataField metadataField, int limit) throws SQLException;
@@ -42,4 +53,17 @@ public interface ItemDAO extends DSpaceObjectLegacySupportDAO<Item>
public Iterator<Item> findAllByCollection(Context context, Collection collection) throws SQLException;
public int countItems(Context context, Collection collection, boolean includeArchived, boolean includeWithdrawn) throws SQLException;
/**
* Get all Items installed or withdrawn, discoverable, and modified since a Date.
* @param context
* @param archived
* @param withdrawn
* @param discoverable
* @param lastModified earliest interesting last-modified date.
* @return
*/
public Iterator<Item> findAll(Context context, boolean archived,
boolean withdrawn, boolean discoverable, Date lastModified)
throws SQLException;
}

View File

@@ -29,4 +29,7 @@ public interface MetadataValueDAO extends GenericDAO<MetadataValue> {
public List<MetadataValue> findByValueLike(Context context, String value) throws SQLException;
public void deleteByMetadataField(Context context, MetadataField metadataField) throws SQLException;
public MetadataValue getMinimum(Context context, int metadataFieldId)
throws SQLException;
}

View File

@@ -18,6 +18,7 @@ import org.hibernate.Query;
import java.sql.SQLException;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
/**
@@ -43,6 +44,22 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO<Item> implements ItemDA
return iterate(query);
}
@Override
public Iterator<Item> findAll(Context context, boolean archived,
boolean withdrawn, boolean discoverable, Date lastModified)
throws SQLException
{
Query query = createQuery(context, "SELECT i FROM Item i"
+ " WHERE (inArchive = :in_archive OR withdrawn = :withdrawn)"
+ " AND discoverable = :discoverable"
+ " AND last_modified > :last_modified");
query.setParameter("in_archive", archived);
query.setParameter("withdrawn", withdrawn);
query.setParameter("discoverable", discoverable);
query.setParameter("last_modified", lastModified);
return iterate(query);
}
@Override
public Iterator<Item> findBySubmitter(Context context, EPerson eperson) throws SQLException {
Query query = createQuery(context, "FROM Item WHERE inArchive= :in_archive and submitter= :submitter");
@@ -126,4 +143,13 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO<Item> implements ItemDA
return count(query);
}
@Override
public Iterator<Item> findByLastModifiedSince(Context context, Date since)
throws SQLException
{
Query query = createQuery(context, "SELECT i FROM item i WHERE last_modified > :last_modified");
query.setParameter("last_modified", since);
return iterate(query);
}
}

View File

@@ -55,4 +55,15 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO<MetadataValue> im
query.setParameter("metadataField", metadataField);
query.executeUpdate();
}
@Override
public MetadataValue getMinimum(Context context, int metadataFieldId)
throws SQLException
{
String queryString = "SELECT m FROM metadatavalue m WHERE metadata_field_id = :metadata_field_id ORDER BY value";
Query query = createQuery(context, queryString);
query.setParameter("metadata_field_id", metadataFieldId);
query.setMaxResults(1);
return (MetadataValue) query.uniqueResult();
}
}

View File

@@ -17,6 +17,7 @@ import org.dspace.eperson.Group;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
@@ -116,6 +117,15 @@ public interface ItemService extends DSpaceObjectService<Item>, DSpaceObjectLega
*/
public Iterator<Item> findByCollection(Context context, Collection collection, Integer limit, Integer offset) throws SQLException;
/**
* Get all Items installed or withdrawn, discoverable, and modified since a Date.
* @param context
* @param since earliest interesting last-modified date, or null for no date test.
* @return
*/
public Iterator<Item> findInArchiveOrWithdrawnDiscoverableModifiedSince(Context context, Date since)
throws SQLException;
/**
* Get all the items in this collection. The order is indeterminate.
*
@@ -429,4 +439,14 @@ public interface ItemService extends DSpaceObjectService<Item>, DSpaceObjectLega
* @return total items
*/
public int countItems(Context context, Collection collection) throws SQLException;
/**
* Find all Items modified since a Date.
*
* @param context
* @param last Earliest interesting last-modified date.
* @return
*/
public Iterator<Item> findByLastModifiedSince(Context context, Date last)
throws SQLException;
}

View File

@@ -80,4 +80,15 @@ public interface MetadataValueService {
public List<MetadataValue> findByValueLike(Context context, String value) throws SQLException;
public void deleteByMetadataField(Context context, MetadataField metadataField) throws SQLException;
/**
* Get the minimum value of a given metadata field across all objects.
*
* @param context
* @param metadataFieldId unique identifier of the interesting field.
* @return
* @throws SQLException
*/
public MetadataValue getMinimum(Context context, int metadataFieldId)
throws SQLException;
}

View File

@@ -8,10 +8,8 @@
package org.dspace.core;
import org.apache.commons.collections.CollectionUtils;
import org.dspace.core.GenericDAO;
import org.hibernate.*;
import org.hibernate.criterion.Projections;
import org.hibernate.type.StandardBasicTypes;
import java.sql.SQLException;
import java.util.Iterator;
@@ -19,7 +17,8 @@ import java.util.List;
import java.util.UUID;
/**
* Hibernate implementation for generic DAO interface, also includes additional hibernate calls that are comonly used
* Hibernate implementation for generic DAO interface. Also includes additional
* Hibernate calls that are commonly used.
* Each DAO should extend this class to prevent code duplication.
*
* @author kevinvandevelde at atmire.com
@@ -83,6 +82,14 @@ public abstract class AbstractHibernateDAO<T> implements GenericDAO<T> {
return result;
}
/**
* Execute a JPA Criteria query and return a collection of results.
*
* @param context
* @param query
* @return
* @throws SQLException
*/
public List<T> findMany(Context context, Query query) throws SQLException {
@SuppressWarnings("unchecked")
List<T> result = (List<T>) query.list();
@@ -116,8 +123,9 @@ public abstract class AbstractHibernateDAO<T> implements GenericDAO<T> {
}
/**
* Retrieve a unique result from the query, if multiple results CAN be retrieved an exception will be thrown
* so only use when the criteria state uniqueness in the database
* Retrieve a unique result from the query. If multiple results CAN be
* retrieved an exception will be thrown,
* so only use when the criteria state uniqueness in the database.
* @param criteria
* @return
*/
@@ -129,7 +137,8 @@ public abstract class AbstractHibernateDAO<T> implements GenericDAO<T> {
}
/**
* Retrieve a single result from the query, best used if you expect a single result but this isn't enforced on the database
* Retrieve a single result from the query. Best used if you expect a
* single result, but this isn't enforced on the database.
* @param criteria
* @return
*/

View File

@@ -12,7 +12,7 @@ import java.util.List;
import java.util.UUID;
/**
* Generic Database Access Object interface class that should be implemented by all DAO's.
* Generic Database Access Object interface class that should be implemented by all DAOs.
* It offers up a lot of general methods so these don't need to be declared again in each DAO.
* The default hibernate implementation offers up a class that implements all these methods.
*
@@ -26,13 +26,37 @@ public interface GenericDAO<T>
public void delete(Context context, T t) throws SQLException;
/**
* Fetch all persisted instances of a given object type.
*
* @param context
* @param clazz the desired type.
* @return
* @throws SQLException
*/
public List<T> findAll(Context context, Class<T> clazz) throws SQLException;
/**
* Execute a JPQL query returning a unique result.
*
* @param context
* @param query
* @return
* @throws SQLException
*/
public T findUnique(Context context, String query) throws SQLException;
public T findByID(Context context, Class clazz, int id) throws SQLException;
public T findByID(Context context, Class clazz, UUID id) throws SQLException;
/**
* Execute a JPQL query and return a collection of results.
*
* @param context
* @param query
* @return
* @throws SQLException
*/
public List<T> findMany(Context context, String query) throws SQLException;
}

View File

@@ -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();
}
}

View File

@@ -23,14 +23,11 @@ import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.dspace.authorize.AuthorizeException;
import org.dspace.authorize.AuthorizeServiceImpl;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.content.*;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.storage.rdbms.DatabaseManager;
import org.dspace.storage.rdbms.TableRowIterator;
import org.dspace.xoai.exceptions.CompilingException;
import org.dspace.xoai.services.api.cache.XOAICacheService;
import org.dspace.xoai.services.api.cache.XOAIItemCacheService;
@@ -38,7 +35,7 @@ import org.dspace.xoai.services.api.cache.XOAILastCompilationCacheService;
import org.dspace.xoai.services.api.config.ConfigurationService;
import org.dspace.xoai.services.api.config.XOAIManagerResolver;
import org.dspace.xoai.services.api.context.ContextService;
import org.dspace.xoai.services.api.database.CollectionsService;
import org.dspace.xoai.services.api.CollectionsService;
import org.dspace.xoai.services.api.solr.SolrServerResolver;
import org.dspace.xoai.solr.DSpaceSolrSearch;
import org.dspace.xoai.solr.exceptions.DSpaceSolrException;
@@ -55,10 +52,12 @@ import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.inject.Inject;
import org.dspace.content.service.ItemService;
import static com.lyncode.xoai.dataprovider.core.Granularity.Second;
import static org.dspace.content.Item.find;
import static org.dspace.xoai.util.ItemUtils.retrieveMetadata;
/**
@@ -68,9 +67,9 @@ import static org.dspace.xoai.util.ItemUtils.retrieveMetadata;
public class XOAI {
private static Logger log = LogManager.getLogger(XOAI.class);
private Context context;
private final Context context;
private boolean optimize;
private boolean verbose;
private final boolean verbose;
private boolean clean;
@Autowired
@@ -87,15 +86,19 @@ public class XOAI {
private XOAIItemCacheService xoaiItemCacheService;
@Autowired
private CollectionsService collectionsService;
@Inject
private AuthorizeService authorizeService;
@Inject
private ItemService itemService;
private static List<String> getFileFormats(Item item) {
List<String> formats = new ArrayList<String>();
private List<String> getFileFormats(Item item) {
List<String> formats = new ArrayList<>();
try {
for (Bundle b : item.getBundles("ORIGINAL")) {
for (Bitstream bs : b.getBitstreams()) {
if (!formats.contains(bs.getFormat().getMIMEType())) {
formats.add(bs.getFormat().getMIMEType());
for (Bundle b : itemService.getBundles(item, "ORIGINAL")) {
for (BundleBitstream bs : b.getBitstreams()) {
if (!formats.contains(bs.getBitstream().getFormat(context).getMIMEType())) {
formats.add(bs.getBitstream().getFormat(context).getMIMEType());
}
}
}
@@ -154,11 +157,7 @@ public class XOAI {
// Set last compilation date
xoaiLastCompilationCacheService.put(new Date());
return result;
} catch (DSpaceSolrException ex) {
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
} catch (SolrServerException ex) {
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
} catch (IOException ex) {
} catch (DSpaceSolrException | SolrServerException | IOException ex) {
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
}
}
@@ -169,16 +168,9 @@ public class XOAI {
+ last.toString());
// Index both in_archive items AND withdrawn items. Withdrawn items will be flagged withdrawn
// (in order to notify external OAI harvesters of their new status)
String sqlQuery = "SELECT item_id FROM item WHERE (in_archive=TRUE OR withdrawn=TRUE) AND discoverable=TRUE AND last_modified > ?";
if(DatabaseManager.isOracle()){
sqlQuery = "SELECT item_id FROM item WHERE (in_archive=1 OR withdrawn=1) AND discoverable=1 AND last_modified > ?";
}
try {
TableRowIterator iterator = DatabaseManager
.query(context,
sqlQuery,
new java.sql.Timestamp(last.getTime()));
Iterator<Item> iterator = itemService.findInArchiveOrWithdrawnDiscoverableModifiedSince(
context, last);
return this.index(iterator);
} catch (SQLException ex) {
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
@@ -190,38 +182,25 @@ public class XOAI {
try {
// Index both in_archive items AND withdrawn items. Withdrawn items will be flagged withdrawn
// (in order to notify external OAI harvesters of their new status)
String sqlQuery = "SELECT item_id FROM item WHERE (in_archive=TRUE OR withdrawn=TRUE) AND discoverable=TRUE";
if(DatabaseManager.isOracle()){
sqlQuery = "SELECT item_id FROM item WHERE (in_archive=1 OR withdrawn=1) AND discoverable=1";
}
TableRowIterator iterator = DatabaseManager.query(context,
sqlQuery);
Iterator<Item> iterator = itemService.findInArchiveOrWithdrawnDiscoverableModifiedSince(
context, null);
return this.index(iterator);
} catch (SQLException ex) {
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
}
}
private int index(TableRowIterator iterator)
private int index(Iterator<Item> iterator)
throws DSpaceSolrIndexerException {
try {
int i = 0;
SolrServer server = solrServerResolver.getServer();
while (iterator.hasNext()) {
try {
server.add(this.index(find(context, iterator.next().getIntColumn("item_id"))));
context.clearCache();
} catch (SQLException ex) {
server.add(this.index(iterator.next()));
} catch (SQLException | MetadataBindException | ParseException
| XMLStreamException | WritingXmlException ex) {
log.error(ex.getMessage(), ex);
} catch (MetadataBindException e) {
log.error(e.getMessage(), e);
} catch (ParseException e) {
log.error(e.getMessage(), e);
} catch (XMLStreamException e) {
log.error(e.getMessage(), e);
} catch (WritingXmlException e) {
log.error(e.getMessage(), e);
}
i++;
if (i % 100 == 0) System.out.println(i + " items imported so far...");
@@ -229,11 +208,7 @@ public class XOAI {
System.out.println("Total: " + i + " items");
server.commit();
return i;
} catch (SQLException ex) {
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
} catch (SolrServerException ex) {
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
} catch (IOException ex) {
} catch (SolrServerException | IOException ex) {
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
}
}
@@ -257,17 +232,20 @@ public class XOAI {
doc.addField("item.communities",
"com_" + com.getHandle().replace("/", "_"));
Metadatum[] allData = item.getMetadata(Item.ANY, Item.ANY, Item.ANY,
Item.ANY);
for (Metadatum dc : allData) {
String key = "metadata." + dc.schema + "." + dc.element;
if (dc.qualifier != null) {
key += "." + dc.qualifier;
List<MetadataValue> allData = itemService.getMetadata(item,
Item.ANY, Item.ANY, Item.ANY, Item.ANY);
for (MetadataValue dc : allData) {
MetadataField field = dc.getMetadataField();
String key = "metadata."
+ field.getMetadataSchema().getName() + "."
+ field.getElement();
if (field.getQualifier() != null) {
key += "." + field.getQualifier();
}
doc.addField(key, dc.value);
if (dc.authority != null) {
doc.addField(key + ".authority", dc.authority);
doc.addField(key + ".confidence", dc.confidence + "");
doc.addField(key, dc.getValue());
if (dc.getAuthority() != null) {
doc.addField(key + ".authority", dc.getAuthority());
doc.addField(key + ".confidence", dc.getConfidence() + "");
}
}
@@ -276,10 +254,10 @@ public class XOAI {
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
XmlOutputContext context = XmlOutputContext.emptyContext(out, Second);
retrieveMetadata(item).write(context);
context.getWriter().flush();
context.getWriter().close();
XmlOutputContext xmlContext = XmlOutputContext.emptyContext(out, Second);
retrieveMetadata(context, item).write(xmlContext);
xmlContext.getWriter().flush();
xmlContext.getWriter().close();
doc.addField("item.compile", out.toString());
if (verbose) {
@@ -294,7 +272,7 @@ public class XOAI {
boolean pub = false;
try {
//Check if READ access allowed on this Item
pub = AuthorizeManager.authorizeActionBoolean(context, item, Constants.READ);
pub = authorizeService.authorizeActionBoolean(context, item, Constants.READ);
} catch (SQLException ex) {
log.error(ex.getMessage());
}
@@ -327,9 +305,7 @@ public class XOAI {
solrServerResolver.getServer().deleteByQuery("*:*");
solrServerResolver.getServer().commit();
System.out.println("Index cleared");
} catch (SolrServerException ex) {
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
} catch (IOException ex) {
} catch (SolrServerException | IOException ex) {
throw new DSpaceSolrIndexerException(ex.getMessage(), ex);
}
}
@@ -449,30 +425,26 @@ public class XOAI {
}
private void compile() throws CompilingException {
ItemIterator iterator;
Iterator<Item> iterator;
try {
Date last = xoaiLastCompilationCacheService.get();
if (last == null) {
System.out.println("Retrieving all items to be compiled");
iterator = Item.findAll(context);
iterator = itemService.findAll(context);
} else {
System.out.println("Retrieving items modified after " + last + " to be compiled");
String query = "SELECT * FROM item WHERE last_modified>?";
iterator = new ItemIterator(context, DatabaseManager.query(context, query, new java.sql.Date(last.getTime())));
iterator = itemService.findByLastModifiedSince(context, last);
}
while (iterator.hasNext()) {
Item item = iterator.next();
if (verbose) System.out.println("Compiling item with handle: " + item.getHandle());
xoaiItemCacheService.put(item, retrieveMetadata(item));
context.clearCache();
xoaiItemCacheService.put(item, retrieveMetadata(context, item));
}
xoaiLastCompilationCacheService.put(new Date());
} catch (SQLException e) {
throw new CompilingException(e);
} catch (IOException e) {
} catch (SQLException | IOException e) {
throw new CompilingException(e);
}
System.out.println("Items compiled");

View File

@@ -1,74 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.xoai.data;
import com.lyncode.xoai.dataprovider.core.ItemMetadata;
import com.lyncode.xoai.dataprovider.core.ReferenceSet;
import com.lyncode.xoai.dataprovider.xml.xoai.Metadata;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.dspace.content.Item;
import java.util.Date;
import java.util.List;
/**
*
* @author Lyncode Development Team <dspace@lyncode.com>
*/
public class DSpaceDatabaseItem extends DSpaceItem
{
private static Logger log = LogManager.getLogger(DSpaceDatabaseItem.class);
private Item item;
private List<ReferenceSet> sets;
public DSpaceDatabaseItem(Item item, Metadata metadata, List<ReferenceSet> sets)
{
this.item = item;
this.metadata = new ItemMetadata(metadata);
this.sets = sets;
}
@Override
public Date getDatestamp()
{
return item.getLastModified();
}
@Override
public List<ReferenceSet> getSets()
{
return sets;
}
@Override
public boolean isDeleted()
{
return item.isWithdrawn();
}
private ItemMetadata metadata = null;
@Override
public ItemMetadata getMetadata()
{
return metadata;
}
public Item getItem()
{
return item;
}
@Override
protected String getHandle()
{
return item.getHandle();
}
}

View File

@@ -7,33 +7,19 @@
*/
package org.dspace.xoai.filter;
import org.dspace.core.Context;
import org.dspace.xoai.data.DSpaceItem;
import org.dspace.xoai.filter.results.DatabaseFilterResult;
import org.dspace.xoai.filter.results.SolrFilterResult;
import java.util.ArrayList;
import java.util.List;
public class AndFilter extends DSpaceFilter {
private DSpaceFilter left;
private DSpaceFilter right;
private final DSpaceFilter left;
private final DSpaceFilter right;
public AndFilter(DSpaceFilter left, DSpaceFilter right) {
this.left = left;
this.right = right;
}
@Override
public DatabaseFilterResult buildDatabaseQuery(Context context) {
DatabaseFilterResult leftResult = left.buildDatabaseQuery(context);
DatabaseFilterResult rightResult = right.buildDatabaseQuery(context);
List<Object> param = new ArrayList<Object>();
param.addAll(leftResult.getParameters());
param.addAll(rightResult.getParameters());
return new DatabaseFilterResult("("+leftResult.getQuery()+") AND ("+ rightResult.getQuery() +")", param);
}
@Override
public SolrFilterResult buildSolrQuery() {
return new SolrFilterResult("("+left.buildSolrQuery().getQuery()+") AND ("+right.buildSolrQuery().getQuery()+")");

View File

@@ -8,7 +8,6 @@
package org.dspace.xoai.filter;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
@@ -16,12 +15,8 @@ import org.apache.commons.lang.StringUtils;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.util.ClientUtils;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.xoai.data.DSpaceItem;
import org.dspace.xoai.exceptions.InvalidMetadataFieldException;
import org.dspace.xoai.filter.data.DSpaceMetadataFilterOperator;
import org.dspace.xoai.filter.results.DatabaseFilterResult;
import org.dspace.xoai.filter.results.SolrFilterResult;
import com.google.common.base.Function;
@@ -34,7 +29,7 @@ import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.SimpleType;
* @author Lyncode Development Team <dspace@lyncode.com>
*/
public class DSpaceAtLeastOneMetadataFilter extends DSpaceFilter {
private static Logger log = LogManager.getLogger(DSpaceAtLeastOneMetadataFilter.class);
private static final Logger log = LogManager.getLogger(DSpaceAtLeastOneMetadataFilter.class);
private String field;
private DSpaceMetadataFilterOperator operator = DSpaceMetadataFilterOperator.UNDEF;
@@ -53,7 +48,7 @@ public class DSpaceAtLeastOneMetadataFilter extends DSpaceFilter {
if (parameterValue == null) parameterValue = getConfiguration().get("values");
if (parameterValue instanceof SimpleType) {
values = new ArrayList<String>();
values = new ArrayList<>();
values.add(((SimpleType) parameterValue).asString());
} else if (parameterValue instanceof ParameterList) {
values = new ListBuilder<ParameterValue>()
@@ -64,7 +59,7 @@ public class DSpaceAtLeastOneMetadataFilter extends DSpaceFilter {
return elem.asSimpleType().asString();
}
});
} else values = new ArrayList<String>();
} else values = new ArrayList<>();
}
return values;
}
@@ -76,21 +71,6 @@ public class DSpaceAtLeastOneMetadataFilter extends DSpaceFilter {
return operator;
}
@Override
public DatabaseFilterResult buildDatabaseQuery(Context context) {
if (this.getField() != null) {
try {
int id = fieldResolver.getFieldID(context, this.getField());
return this.getWhere(id, this.getValues());
} catch (InvalidMetadataFieldException ex) {
log.error(ex.getMessage(), ex);
} catch (SQLException ex) {
log.error(ex.getMessage(), ex);
}
}
return new DatabaseFilterResult();
}
@Override
public boolean isShown(DSpaceItem item) {
if (this.getField() == null)
@@ -138,65 +118,10 @@ public class DSpaceAtLeastOneMetadataFilter extends DSpaceFilter {
return false;
}
private DatabaseFilterResult getWhere(int mdid, List<String> values) {
List<String> parts = new ArrayList<String>();
List<Object> params = new ArrayList<Object>();
params.add(mdid);
for (String v : values)
this.buildWhere(v, parts, params);
if (parts.size() > 0) {
String query = "EXISTS (SELECT tmp.* FROM metadatavalue tmp WHERE tmp.resource_id=i.item_id AND tmp.resource_type_id=" + Constants.ITEM+ " AND tmp.metadata_field_id=?"
+ " AND ("
+ StringUtils.join(parts.iterator(), " OR ")
+ "))";
return new DatabaseFilterResult(query, params);
}
return new DatabaseFilterResult();
}
private void buildWhere(String value, List<String> parts,
List<Object> params) {
switch (this.getOperator()) {
case ENDS_WITH:
parts.add("(tmp.text_value LIKE ?)");
params.add("%" + value);
break;
case STARTS_WITH:
parts.add("(tmp.text_value LIKE ?)");
params.add(value + "%");
break;
case EQUAL:
parts.add("(tmp.text_value LIKE ?)");
params.add(value);
break;
case GREATER:
parts.add("(tmp.text_value > ?)");
params.add(value);
break;
case LOWER:
parts.add("(tmp.text_value < ?)");
params.add(value);
break;
case LOWER_OR_EQUAL:
parts.add("(tmp.text_value <= ?)");
params.add(value);
break;
case GREATER_OR_EQUAL:
parts.add("(tmp.text_value >= ?)");
params.add(value);
break;
case CONTAINS:
default:
parts.add("(tmp.text_value LIKE ?)");
params.add("%" + value + "%");
break;
}
}
@Override
public SolrFilterResult buildSolrQuery() {
String field = this.getField();
List<String> parts = new ArrayList<String>();
List<String> parts = new ArrayList<>();
if (this.getField() != null) {
for (String v : this.getValues())
this.buildQuery("metadata." + field,

View File

@@ -9,18 +9,16 @@
package org.dspace.xoai.filter;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.dspace.authorize.AuthorizeManager;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.content.Item;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.handle.HandleServiceImpl;
import org.dspace.handle.factory.HandleServiceFactory;
import org.dspace.handle.service.HandleService;
import org.dspace.xoai.data.DSpaceItem;
import org.dspace.xoai.filter.results.DatabaseFilterResult;
import org.dspace.xoai.filter.results.SolrFilterResult;
/**
@@ -29,20 +27,13 @@ import org.dspace.xoai.filter.results.SolrFilterResult;
*/
public class DSpaceAuthorizationFilter extends DSpaceFilter
{
private static Logger log = LogManager.getLogger(DSpaceAuthorizationFilter.class);
private static final Logger log = LogManager.getLogger(DSpaceAuthorizationFilter.class);
@Override
public DatabaseFilterResult buildDatabaseQuery(Context context)
{
List<Object> params = new ArrayList<Object>();
return new DatabaseFilterResult("EXISTS (SELECT p.action_id FROM "
+ "resourcepolicy p, " + "bundle2bitstream b, " + "bundle bu, "
+ "item2bundle ib " + "WHERE " + "p.resource_type_id=0 AND "
+ "p.resource_id=b.bitstream_id AND "
+ "p.epersongroup_id=0 AND " + "b.bundle_id=ib.bundle_id AND "
+ "bu.bundle_id=b.bundle_id AND " + "bu.name='ORIGINAL' AND "
+ "ib.item_id=i.item_id)", params);
}
private static final AuthorizeService authorizeService
= AuthorizeServiceFactory.getInstance().getAuthorizeService();
private static final HandleService handleService
= HandleServiceFactory.getInstance().getHandleService();
@Override
public boolean isShown(DSpaceItem item)
@@ -54,12 +45,12 @@ public class DSpaceAuthorizationFilter extends DSpaceFilter
String handle = DSpaceItem.parseHandle(item.getIdentifier());
if (handle == null)
return false;
Item dspaceItem = (Item) HandleManager.resolveToObject(context, handle);
Item dspaceItem = (Item) handleService.resolveToObject(context, handle);
if (dspaceItem == null)
return false;
// Check if READ access allowed on Item
pub = AuthorizeManager.authorizeActionBoolean(context, dspaceItem, Constants.READ);
pub = authorizeService.authorizeActionBoolean(context, dspaceItem, Constants.READ);
}
catch (SQLException ex)
{

View File

@@ -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);

View File

@@ -7,17 +7,12 @@
*/
package org.dspace.xoai.filter;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.xoai.data.DSpaceItem;
import org.dspace.xoai.exceptions.InvalidMetadataFieldException;
import org.dspace.xoai.filter.results.DatabaseFilterResult;
import org.dspace.xoai.filter.results.SolrFilterResult;
import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterValue;
@@ -34,7 +29,7 @@ import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.SimpleType;
* @author Lyncode Development Team <dspace@lyncode.com>
*/
public class DSpaceMetadataExistsFilter extends DSpaceFilter {
private static Logger log = LogManager
private static final Logger log = LogManager
.getLogger(DSpaceMetadataExistsFilter.class);
private List<String> fields;
@@ -57,31 +52,6 @@ public class DSpaceMetadataExistsFilter extends DSpaceFilter {
return fields;
}
@Override
public DatabaseFilterResult buildDatabaseQuery(Context context) {
try {
List<String> fields = this.getFields();
StringBuilder where = new StringBuilder();
List<Object> args = new ArrayList<Object>(fields.size());
where.append("(");
for (int i = 0; i < fields.size(); i++) {
where.append("EXISTS (SELECT tmp.* FROM metadatavalue tmp WHERE tmp.resource_id=i.item_id AND tmp.resource_type_id=" + Constants.ITEM+ " AND tmp.metadata_field_id=?)");
args.add(fieldResolver.getFieldID(context, fields.get(i)));
if (i < fields.size() - 1)
where.append(" OR ");
}
where.append(")");
return new DatabaseFilterResult(where.toString(), args);
} catch (InvalidMetadataFieldException e) {
log.error(e.getMessage(), e);
} catch (SQLException e) {
log.error(e.getMessage(), e);
}
return new DatabaseFilterResult();
}
@Override
public boolean isShown(DSpaceItem item) {
for (String field : this.getFields()) {

View File

@@ -8,19 +8,14 @@
package org.dspace.xoai.filter;
import com.lyncode.xoai.dataprovider.core.ReferenceSet;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.util.ClientUtils;
import org.dspace.content.DSpaceObject;
import org.dspace.core.Context;
import org.dspace.xoai.data.DSpaceItem;
import org.dspace.xoai.filter.results.DatabaseFilterResult;
import org.dspace.xoai.filter.results.SolrFilterResult;
import org.dspace.xoai.services.api.database.CollectionsService;
import org.dspace.xoai.services.api.database.HandleResolver;
import org.dspace.xoai.services.api.CollectionsService;
import org.dspace.xoai.services.api.HandleResolver;
import java.util.List;
/**
*
@@ -28,11 +23,11 @@ import java.util.List;
*/
public class DSpaceSetSpecFilter extends DSpaceFilter
{
private static Logger log = LogManager.getLogger(DSpaceSetSpecFilter.class);
private static final Logger log = LogManager.getLogger(DSpaceSetSpecFilter.class);
private String setSpec;
private HandleResolver handleResolver;
private CollectionsService collectionsService;
private final String setSpec;
private final HandleResolver handleResolver;
private final CollectionsService collectionsService;
public DSpaceSetSpecFilter(CollectionsService collectionsService, HandleResolver handleResolver, String spec)
{
@@ -41,46 +36,6 @@ public class DSpaceSetSpecFilter extends DSpaceFilter
this.setSpec = spec;
}
@Override
public DatabaseFilterResult buildDatabaseQuery(Context context)
{
if (setSpec.startsWith("col_"))
{
try
{
DSpaceObject dso = handleResolver.resolve(setSpec.replace("col_", "").replace("_", "/"));
if(dso != null){
return new DatabaseFilterResult(
"EXISTS (SELECT tmp.* FROM collection2item tmp WHERE tmp.resource_id=i.item_id AND collection_id = ?)",
dso.getID());
}
}
catch (Exception ex)
{
log.error(ex.getMessage(), ex);
}
}
else if (setSpec.startsWith("com_"))
{
try
{
DSpaceObject dso = handleResolver.resolve(setSpec.replace("com_", "").replace("_", "/"));
if(dso != null){
List<Integer> list = collectionsService.getAllSubCollections(dso.getID());
String subCollections = StringUtils.join(list.iterator(), ",");
return new DatabaseFilterResult(
"EXISTS (SELECT tmp.* FROM collection2item tmp WHERE tmp.resource_id=i.item_id AND collection_id IN ("
+ subCollections + "))");
}
}
catch (Exception e)
{
log.error(e.getMessage(), e);
}
}
return new DatabaseFilterResult();
}
@Override
public boolean isShown(DSpaceItem item)
{

View File

@@ -7,12 +7,7 @@
*/
package org.dspace.xoai.filter;
import java.util.ArrayList;
import java.util.List;
import org.dspace.core.Context;
import org.dspace.storage.rdbms.DatabaseManager;
import org.dspace.xoai.data.DSpaceItem;
import org.dspace.xoai.filter.results.DatabaseFilterResult;
import org.dspace.xoai.filter.results.SolrFilterResult;
/**
@@ -28,18 +23,6 @@ import org.dspace.xoai.filter.results.SolrFilterResult;
*/
public class DSpaceWithdrawnFilter extends DSpaceFilter {
@Override
public DatabaseFilterResult buildDatabaseQuery(Context context)
{
List<Object> params = new ArrayList<Object>();
String filter = "i.withdrawn=TRUE";
if(DatabaseManager.isOracle())
filter = "i.withdrawn=1";
return new DatabaseFilterResult(filter, params);
}
@Override
public boolean isShown(DSpaceItem item)
{
@@ -48,10 +31,7 @@ public class DSpaceWithdrawnFilter extends DSpaceFilter {
// we can properly respond with a "deleted" status via OAI-PMH.
// Don't worry, this does NOT make the metadata public for withdrawn items,
// it merely provides an item "tombstone" via OAI-PMH.
if (item.isDeleted())
return true;
else
return false;
return item.isDeleted();
}
@Override

View File

@@ -1,61 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.xoai.filter;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Lyncode Development Team <dspace@lyncode.com>
*/
public class DatabaseFilterResult
{
private String _where;
private List<Object> _params;
private boolean _nothing;
public DatabaseFilterResult()
{
_nothing = true;
}
public DatabaseFilterResult(String where, Object... params)
{
_nothing = false;
_where = where;
_params = new ArrayList<Object>();
for (Object obj : params)
_params.add(obj);
}
public DatabaseFilterResult(String where, List<Object> params)
{
_nothing = false;
_where = where;
_params = params;
}
public boolean hasResult()
{
return !_nothing;
}
public String getWhere()
{
return _where;
}
public List<Object> getParameters()
{
return _params;
}
}

View File

@@ -11,9 +11,7 @@ import com.lyncode.builder.DateBuilder;
import com.lyncode.xoai.dataprovider.services.api.DateProvider;
import com.lyncode.xoai.dataprovider.services.impl.BaseDateProvider;
import org.apache.solr.client.solrj.util.ClientUtils;
import org.dspace.core.Context;
import org.dspace.xoai.data.DSpaceItem;
import org.dspace.xoai.filter.results.DatabaseFilterResult;
import org.dspace.xoai.filter.results.SolrFilterResult;
import java.util.Date;
@@ -23,21 +21,14 @@ import java.util.Date;
* @author Lyncode Development Team <dspace@lyncode.com>
*/
public class DateFromFilter extends DSpaceFilter {
private static DateProvider dateProvider = new BaseDateProvider();
private Date date;
private static final DateProvider dateProvider = new BaseDateProvider();
private final Date date;
public DateFromFilter(Date date)
{
this.date = new DateBuilder(date).setMinMilliseconds().build();
}
@Override
public DatabaseFilterResult buildDatabaseQuery(Context context)
{
return new DatabaseFilterResult("i.last_modified >= ?",
new java.sql.Date(date.getTime()));
}
@Override
public boolean isShown(DSpaceItem item)
{

View File

@@ -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)
{

View File

@@ -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()+")");

View File

@@ -7,33 +7,19 @@
*/
package org.dspace.xoai.filter;
import org.dspace.core.Context;
import org.dspace.xoai.data.DSpaceItem;
import org.dspace.xoai.filter.results.DatabaseFilterResult;
import org.dspace.xoai.filter.results.SolrFilterResult;
import java.util.ArrayList;
import java.util.List;
public class OrFilter extends DSpaceFilter {
private DSpaceFilter left;
private DSpaceFilter right;
private final DSpaceFilter left;
private final DSpaceFilter right;
public OrFilter(DSpaceFilter left, DSpaceFilter right) {
this.left = left;
this.right = right;
}
@Override
public DatabaseFilterResult buildDatabaseQuery(Context context) {
DatabaseFilterResult leftResult = left.buildDatabaseQuery(context);
DatabaseFilterResult rightResult = right.buildDatabaseQuery(context);
List<Object> param = new ArrayList<Object>();
param.addAll(leftResult.getParameters());
param.addAll(rightResult.getParameters());
return new DatabaseFilterResult("("+leftResult.getQuery()+") OR ("+ rightResult.getQuery() +")", param);
}
@Override
public SolrFilterResult buildSolrQuery() {
return new SolrFilterResult("("+left.buildSolrQuery().getQuery()+") OR ("+right.buildSolrQuery().getQuery()+")");

View File

@@ -1,59 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.xoai.filter.results;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Lyncode Development Team <dspace@lyncode.com>
*/
public class DatabaseFilterResult
{
private String where;
private List<Object> parameters;
private boolean nothing;
public DatabaseFilterResult()
{
nothing = true;
}
public DatabaseFilterResult(String where, Object... params)
{
nothing = false;
this.where = where;
parameters = new ArrayList<Object>();
for (Object obj : params)
parameters.add(obj);
}
public DatabaseFilterResult(String where, List<Object> params)
{
nothing = false;
this.where = where;
parameters = params;
}
public boolean hasResult()
{
return !nothing;
}
public String getQuery()
{
return where;
}
public List<Object> getParameters()
{
return parameters;
}
}

View File

@@ -5,7 +5,7 @@
*
* http://www.dspace.org/license/
*/
package org.dspace.xoai.services.api.database;
package org.dspace.xoai.services.api;
import org.dspace.content.Collection;
import org.dspace.content.Community;
@@ -13,9 +13,10 @@ import org.dspace.content.Item;
import java.sql.SQLException;
import java.util.List;
import java.util.UUID;
public interface CollectionsService {
List<Integer> getAllSubCollections(int communityId) throws SQLException;
List<UUID> getAllSubCollections(UUID communityId) throws SQLException;
List<Community> flatParentCommunities(Collection collection) throws SQLException;
List<Community> flatParentCommunities(Community community) throws SQLException;
List<Community> flatParentCommunities(Item item) throws SQLException;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 {

View File

@@ -1,72 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.xoai.services.api.database;
import org.apache.log4j.Logger;
import org.dspace.core.Context;
import org.dspace.storage.rdbms.DatabaseManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class DatabaseQuery {
private static Logger log = Logger.getLogger(DatabaseQuery.class);
private String query;
private List<Object> parameters;
private Context context;
private Integer total;
private String countQuery;
private List<Object> countParameters;
public DatabaseQuery(Context context) {
this.context = context;
this.parameters = new ArrayList<Object>();
}
public String getQuery() {
return query;
}
public List<Object> getParameters() {
return parameters;
}
public DatabaseQuery withQuery (String query) {
this.query = query;
return this;
}
public DatabaseQuery withParameters (List<Object> parameters) {
this.parameters.addAll(parameters);
return this;
}
public DatabaseQuery withCountQuery (String query, List<Object> parameters) {
this.countQuery = query;
this.countParameters = parameters;
return this;
}
public int getTotal () {
if (total == null) {
try
{
total = DatabaseManager.querySingle(context, countQuery, countParameters).getIntColumn("count");
}
catch (SQLException e1)
{
log.error("Unable to retrieve number of items that match");
total = -1;
}
}
return total;
}
}

View File

@@ -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);
}
}

View File

@@ -1,16 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.xoai.services.api.database;
import com.lyncode.xoai.dataprovider.filter.ScopedFilter;
import java.util.List;
public interface DatabaseQueryResolver {
DatabaseQuery buildQuery (List<ScopedFilter> filters, int offset, int length) throws DatabaseQueryException;
}

View File

@@ -11,12 +11,7 @@ package org.dspace.xoai.services.api.xoai;
import com.lyncode.xoai.dataprovider.filter.Scope;
import com.lyncode.xoai.dataprovider.filter.conditions.Condition;
import com.lyncode.xoai.dataprovider.services.api.FilterResolver;
import org.dspace.xoai.services.api.context.ContextServiceException;
import java.util.List;
public interface DSpaceFilterResolver extends FilterResolver {
String buildDatabaseQuery(Condition condition, List<Object> parameters, Scope scope) throws ContextServiceException;
String buildSolrQuery(Scope scope, Condition condition);
}

View File

@@ -5,32 +5,38 @@
*
* http://www.dspace.org/license/
*/
package org.dspace.xoai.services.impl.database;
package org.dspace.xoai.services.impl;
import org.dspace.content.Collection;
import org.dspace.content.Community;
import org.dspace.content.Item;
import org.dspace.xoai.services.api.context.ContextService;
import org.dspace.xoai.services.api.context.ContextServiceException;
import org.dspace.xoai.services.api.database.CollectionsService;
import org.dspace.xoai.services.api.CollectionsService;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.UUID;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.CommunityService;
public class DSpaceCollectionsService implements CollectionsService {
private ContextService contextService;
private static final CommunityService communityService
= ContentServiceFactory.getInstance().getCommunityService();
public List<Integer> getAllSubCollections(int communityId)
@Override
public List<UUID> getAllSubCollections(UUID communityId)
throws SQLException
{
Queue<Community> comqueue = new LinkedList<Community>();
List<Integer> list = new ArrayList<Integer>();
Queue<Community> comqueue = new LinkedList<>();
List<UUID> list = new ArrayList<>();
try {
comqueue.add(Community.find(contextService.getContext(), communityId));
comqueue.add(communityService.find(contextService.getContext(), communityId));
} catch (ContextServiceException e) {
throw new SQLException(e);
}
@@ -40,26 +46,27 @@ public class DSpaceCollectionsService implements CollectionsService {
for (Community sub : c.getSubcommunities())
comqueue.add(sub);
for (Collection col : c.getCollections())
if (!list.contains(col))
if (!list.contains(col.getID()))
list.add(col.getID());
}
return list;
}
@Override
public List<Community> flatParentCommunities(Collection c)
throws SQLException
{
Queue<Community> queue = new LinkedList<Community>();
List<Community> result = new ArrayList<Community>();
Queue<Community> queue = new LinkedList<>();
List<Community> result = new ArrayList<>();
for (Community com : c.getCommunities())
queue.add(com);
while (!queue.isEmpty())
{
Community p = queue.poll();
Community par = p.getParentCommunity();
List<Community> par = p.getParentCommunities();
if (par != null)
queue.add(par);
queue.addAll(par);
if (!result.contains(p))
result.add(p);
}
@@ -67,20 +74,21 @@ public class DSpaceCollectionsService implements CollectionsService {
return result;
}
@Override
public List<Community> flatParentCommunities(Community c)
throws SQLException
{
Queue<Community> queue = new LinkedList<Community>();
List<Community> result = new ArrayList<Community>();
Queue<Community> queue = new LinkedList<>();
List<Community> result = new ArrayList<>();
queue.add(c);
while (!queue.isEmpty())
{
Community p = queue.poll();
Community par = p.getParentCommunity();
List<Community> par = p.getParentCommunities();
if (par != null)
queue.add(par);
queue.addAll(par);
if (!result.contains(p))
result.add(p);
}
@@ -88,21 +96,22 @@ public class DSpaceCollectionsService implements CollectionsService {
return result;
}
@Override
public List<Community> flatParentCommunities(Item c)
throws SQLException
{
Queue<Community> queue = new LinkedList<Community>();
List<Community> result = new ArrayList<Community>();
Queue<Community> queue = new LinkedList<>();
List<Community> result = new ArrayList<>();
for (Community com : c.getCommunities())
queue.add(com);
for (Collection com : c.getCollections())
queue.addAll(com.getCommunities());
while (!queue.isEmpty())
{
Community p = queue.poll();
Community par = p.getParentCommunity();
List<Community> par = p.getParentCommunities();
if (par != null)
queue.add(par);
queue.addAll(par);
if (!result.contains(p))
result.add(p);
}

View File

@@ -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);

View File

@@ -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();

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -1,107 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.xoai.services.impl.database;
import com.lyncode.xoai.dataprovider.filter.Scope;
import com.lyncode.xoai.dataprovider.filter.ScopedFilter;
import com.lyncode.xoai.dataprovider.filter.conditions.Condition;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.dspace.storage.rdbms.DatabaseManager;
import org.dspace.xoai.services.api.config.ConfigurationService;
import org.dspace.xoai.services.api.context.ContextService;
import org.dspace.xoai.services.api.context.ContextServiceException;
import org.dspace.xoai.services.api.database.DatabaseQuery;
import org.dspace.xoai.services.api.database.DatabaseQueryException;
import org.dspace.xoai.services.api.database.DatabaseQueryResolver;
import org.dspace.xoai.services.api.xoai.DSpaceFilterResolver;
import org.springframework.beans.factory.annotation.Autowired;
public class DSpaceDatabaseQueryResolver implements DatabaseQueryResolver {
private static final Logger log = LogManager.getLogger(DSpaceDatabaseQueryResolver.class);
@Autowired
DSpaceFilterResolver filterResolver;
@Autowired
ContextService contextService;
@Autowired
ConfigurationService configurationService;
@Override
public DatabaseQuery buildQuery(List<ScopedFilter> filters, int offset, int length) throws DatabaseQueryException {
List<Object> parameters = new ArrayList<Object>();
List<Object> countParameters = new ArrayList<Object>();
String query = "SELECT i.* FROM item i ";
String countQuery = "SELECT COUNT(*) as count FROM item i";
String where = null;
try {
where = this.buildCondition(filters, parameters);
} catch (ContextServiceException e) {
throw new DatabaseQueryException(e);
}
countParameters.addAll(parameters);
String whereInArchive = "WHERE i.in_archive=true";
if(DatabaseManager.isOracle())
{
whereInArchive = "WHERE i.in_archive=1";
}
if (!where.equals("")) {
query += " " + whereInArchive + " AND " + where;
countQuery += " " + whereInArchive + " AND " + where;
} else {
query += " " + whereInArchive;
countQuery += " " + whereInArchive;
}
query += " ORDER BY i.item_id";
boolean postgres = ! DatabaseManager.isOracle();
if (postgres)
{
query += " OFFSET ? LIMIT ?";
}
else
{
// Oracle
query = "SELECT * FROM (" + query
+ ") WHERE ROWNUM BETWEEN ? AND ?";
length = length + offset;
}
parameters.add(offset);
parameters.add(length);
try {
return new DatabaseQuery(contextService.getContext())
.withCountQuery(countQuery, countParameters)
.withQuery(query)
.withParameters(parameters);
} catch (ContextServiceException e) {
throw new DatabaseQueryException(e);
}
}
private String buildQuery (Condition condition, Scope scope, List<Object> parameters) throws ContextServiceException {
return filterResolver.buildDatabaseQuery(condition, parameters, scope);
}
private String buildCondition (List<ScopedFilter> filters, List<Object> parameters) throws ContextServiceException {
List<String> whereCond = new ArrayList<String>();
for (ScopedFilter filter : filters)
whereCond.add(this.buildQuery(filter.getCondition(), filter.getScope(), parameters));
return StringUtils.join(whereCond.iterator(), " AND ");
}
}

View File

@@ -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;

View File

@@ -13,16 +13,13 @@ import com.lyncode.xoai.dataprovider.filter.conditions.*;
import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterMap;
import org.apache.log4j.Logger;
import org.dspace.xoai.filter.*;
import org.dspace.xoai.filter.results.DatabaseFilterResult;
import org.dspace.xoai.filter.results.SolrFilterResult;
import org.dspace.xoai.services.api.context.ContextService;
import org.dspace.xoai.services.api.context.ContextServiceException;
import org.dspace.xoai.services.api.database.FieldResolver;
import org.dspace.xoai.services.api.FieldResolver;
import org.dspace.xoai.services.api.xoai.DSpaceFilterResolver;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
import static com.lyncode.xoai.dataprovider.filter.Scope.MetadataFormat;
public class BaseDSpaceFilterResolver implements DSpaceFilterResolver {
@@ -34,22 +31,6 @@ public class BaseDSpaceFilterResolver implements DSpaceFilterResolver {
@Autowired
ContextService contextService;
@Override
public String buildDatabaseQuery(Condition condition, List<Object> parameters, Scope scope) throws ContextServiceException {
DSpaceFilter filter = getFilter(condition);
DatabaseFilterResult result = filter.buildDatabaseQuery(contextService.getContext());
if (result.hasResult())
{
parameters.addAll(result.getParameters());
if (scope == MetadataFormat)
return "(item.deleted:true OR ("
+ result.getQuery() + "))";
else
return "(" + result.getQuery() + ")";
}
return "true";
}
public DSpaceFilter getFilter (Condition condition) {
if (condition instanceof AndCondition) return (DSpaceFilter) getFilter((AndCondition) condition);
else if (condition instanceof OrCondition) return (DSpaceFilter) getFilter((OrCondition) condition);

View File

@@ -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;

View File

@@ -1,210 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.xoai.services.impl.xoai;
import com.lyncode.xoai.dataprovider.core.ListItemIdentifiersResult;
import com.lyncode.xoai.dataprovider.core.ListItemsResults;
import com.lyncode.xoai.dataprovider.core.ReferenceSet;
import com.lyncode.xoai.dataprovider.data.Item;
import com.lyncode.xoai.dataprovider.data.ItemIdentifier;
import com.lyncode.xoai.dataprovider.exceptions.IdDoesNotExistException;
import com.lyncode.xoai.dataprovider.exceptions.OAIException;
import com.lyncode.xoai.dataprovider.filter.ScopedFilter;
import com.lyncode.xoai.dataprovider.xml.xoai.Metadata;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.dspace.content.Collection;
import org.dspace.content.Community;
import org.dspace.content.DSpaceObject;
import org.dspace.content.ItemIterator;
import org.dspace.handle.HandleServiceImpl;
import org.dspace.storage.rdbms.DatabaseManager;
import org.dspace.storage.rdbms.TableRowIterator;
import org.dspace.xoai.data.DSpaceDatabaseItem;
import org.dspace.xoai.data.DSpaceSet;
import org.dspace.xoai.services.api.cache.XOAIItemCacheService;
import org.dspace.xoai.services.api.config.ConfigurationService;
import org.dspace.xoai.services.api.context.ContextService;
import org.dspace.xoai.services.api.context.ContextServiceException;
import org.dspace.xoai.services.api.database.*;
import org.dspace.xoai.util.ItemUtils;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
/**
*
* @author Lyncode Development Team <dspace@lyncode.com>
* @author Domingo Iglesias <diglesias@ub.edu>
*/
public class DSpaceItemDatabaseRepository extends DSpaceItemRepository
{
private static Logger log = LogManager.getLogger(DSpaceItemDatabaseRepository.class);
private XOAIItemCacheService cacheService;
private boolean useCache;
private DatabaseQueryResolver queryResolver;
private ContextService context;
private CollectionsService collectionsService;
private ConfigurationService configurationService;
public DSpaceItemDatabaseRepository(ConfigurationService configurationService, CollectionsService collectionsService, HandleResolver handleResolver, XOAIItemCacheService cacheService, DatabaseQueryResolver queryResolver, ContextService context)
{
super(collectionsService, handleResolver);
this.configurationService = configurationService;
this.collectionsService = collectionsService;
this.cacheService = cacheService;
this.queryResolver = queryResolver;
this.context = context;
this.useCache = configurationService.getBooleanProperty("oai", "cache.enabled", true);
}
private Metadata getMetadata (org.dspace.content.Item item) throws IOException {
if (this.useCache) {
if (!cacheService.hasCache(item))
cacheService.put(item, ItemUtils.retrieveMetadata(item));
return cacheService.get(item);
} else return ItemUtils.retrieveMetadata(item);
}
private List<ReferenceSet> getSets(org.dspace.content.Item item)
{
List<ReferenceSet> sets = new ArrayList<ReferenceSet>();
List<Community> coms = new ArrayList<Community>();
try
{
Collection[] itemCollections = item.getCollections();
for (Collection col : itemCollections)
{
ReferenceSet s = new DSpaceSet(col);
sets.add(s);
for (Community com : collectionsService.flatParentCommunities(col))
if (!coms.contains(com))
coms.add(com);
}
for (Community com : coms)
{
ReferenceSet s = new DSpaceSet(com);
sets.add(s);
}
}
catch (SQLException e)
{
log.error(e.getMessage(), e);
}
return sets;
}
@Override
public Item getItem(String id) throws IdDoesNotExistException, OAIException
{
try
{
String parts[] = id.split(Pattern.quote(":"));
if (parts.length == 3)
{
DSpaceObject obj = HandleServiceImpl.resolveToObject(context.getContext(),
parts[2]);
if (obj == null)
throw new IdDoesNotExistException();
if (!(obj instanceof Item))
throw new IdDoesNotExistException();
org.dspace.content.Item item = (org.dspace.content.Item) obj;
return new DSpaceDatabaseItem(item, this.getMetadata(item), getSets(item));
}
}
catch (NumberFormatException e)
{
log.debug(e.getMessage(), e);
throw new IdDoesNotExistException();
}
catch (SQLException e)
{
throw new OAIException(e);
} catch (IOException e) {
throw new OAIException(e);
} catch (ContextServiceException e) {
throw new OAIException(e);
}
throw new IdDoesNotExistException();
}
@Override
public ListItemsResults getItems(List<ScopedFilter> filters, int offset,
int length) throws OAIException
{
List<Item> list = new ArrayList<Item>();
try
{
DatabaseQuery databaseQuery = queryResolver.buildQuery(filters, offset, length);
TableRowIterator rowIterator = DatabaseManager.queryTable(context.getContext(), "item",
databaseQuery.getQuery(), databaseQuery.getParameters().toArray());
ItemIterator iterator = new ItemIterator(context.getContext(), rowIterator);
int i = 0;
while (iterator.hasNext() && i < length)
{
org.dspace.content.Item it = iterator.next();
list.add(new DSpaceDatabaseItem(it, this.getMetadata(it), getSets(it)));
i++;
}
return new ListItemsResults((databaseQuery.getTotal() > offset + length), list, databaseQuery.getTotal());
}
catch (SQLException e)
{
log.error(e.getMessage(), e);
} catch (DatabaseQueryException e) {
log.error(e.getMessage(), e);
} catch (IOException e) {
log.error(e.getMessage(), e);
} catch (ContextServiceException e) {
log.error(e.getMessage(), e);
}
return new ListItemsResults(false, list, 0);
}
@Override
public ListItemIdentifiersResult getItemIdentifiers(
List<ScopedFilter> filters, int offset, int length) throws OAIException
{
List<ItemIdentifier> list = new ArrayList<ItemIdentifier>();
try
{
DatabaseQuery databaseQuery = queryResolver.buildQuery(filters, offset, length);
TableRowIterator rowIterator = DatabaseManager.queryTable(context.getContext(), "item",
databaseQuery.getQuery(), databaseQuery.getParameters().toArray());
ItemIterator iterator = new ItemIterator(context.getContext(), rowIterator);
int i = 0;
while (iterator.hasNext() && i < length)
{
org.dspace.content.Item it = iterator.next();
list.add(new DSpaceDatabaseItem(it, this.getMetadata(it), getSets(it)));
i++;
}
return new ListItemIdentifiersResult((databaseQuery.getTotal() > offset + length), list, databaseQuery.getTotal());
}
catch (SQLException e)
{
log.error(e.getMessage(), e);
} catch (DatabaseQueryException e) {
log.error(e.getMessage(), e);
} catch (IOException e) {
log.error(e.getMessage(), e);
} catch (ContextServiceException e) {
log.error(e.getMessage(), e);
}
return new ListItemIdentifiersResult(false, list, 0);
}
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -1,230 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.xoai.services.impl.xoai;
import com.lyncode.xoai.dataprovider.core.ListSetsResult;
import com.lyncode.xoai.dataprovider.core.Set;
import com.lyncode.xoai.dataprovider.services.api.SetRepository;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.dspace.content.Collection;
import org.dspace.content.Community;
import org.dspace.content.DSpaceObject;
import org.dspace.core.Context;
import org.dspace.handle.HandleServiceImpl;
import org.dspace.storage.rdbms.DatabaseManager;
import org.dspace.storage.rdbms.TableRow;
import org.dspace.storage.rdbms.TableRowIterator;
import org.dspace.xoai.data.DSpaceSet;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Lyncode Development Team <dspace@lyncode.com>
*/
public class DSpaceSetRepository implements SetRepository
{
private static final Logger log = LogManager.getLogger(DSpaceSetRepository.class);
private final Context _context;
public DSpaceSetRepository(Context context)
{
_context = context;
}
private int getCommunityCount()
{
String query = "SELECT COUNT(*) as count FROM community";
try
{
TableRowIterator iterator = DatabaseManager.query(_context, query);
if (iterator.hasNext())
return (int) iterator.next().getLongColumn("count");
}
catch (SQLException e)
{
log.error(e.getMessage(), e);
}
return 0;
}
private int getCollectionCount()
{
String query = "SELECT COUNT(*) as count FROM collection";
try
{
TableRowIterator iterator = DatabaseManager.query(_context, query);
if (iterator.hasNext())
return (int) iterator.next().getLongColumn("count");
}
catch (SQLException e)
{
log.error(e.getMessage(), e);
}
return 0;
}
/**
* Produce a list of DSpaceCommunitySet. The list is a segment of the full
* list of Community ordered by ID.
*
* @param offset start this far down the list of Community.
* @param length return up to this many Sets.
* @return some Sets representing the Community list segment.
*/
private List<Set> community(int offset, int length)
{
List<Set> array = new ArrayList<Set>();
StringBuffer query = new StringBuffer("SELECT community_id FROM community ORDER BY community_id");
List<Serializable> params = new ArrayList<Serializable>();
DatabaseManager.applyOffsetAndLimit(query,params,offset,length);
try
{
TableRowIterator iterator = DatabaseManager.query(_context, query.toString(),
params.toArray());
int i = 0;
while (iterator.hasNext() && i < length)
{
TableRow row = iterator.next();
int communityID = row.getIntColumn("community_id");
Community community = Community.find(_context, communityID);
array.add(DSpaceSet.newDSpaceCommunitySet(
community.getHandle(), community.getName()));
i++;
}
}
catch (SQLException e)
{
log.error(e.getMessage(), e);
}
return array;
}
/**
* Produce a list of DSpaceCollectionSet. The list is a segment of the full
* list of Collection ordered by ID.
*
* @param offset start this far down the list of Collection.
* @param length return up to this many Sets.
* @return some Sets representing the Collection list segment.
*/
private List<Set> collection(int offset, int length)
{
List<Set> array = new ArrayList<Set>();
StringBuffer query = new StringBuffer("SELECT collection_id FROM collection ORDER BY collection_id");
List<Serializable> params = new ArrayList<Serializable>();
DatabaseManager.applyOffsetAndLimit(query,params,offset,length);
try
{
TableRowIterator iterator = DatabaseManager.query(_context, query.toString(),
params.toArray());
int i = 0;
while (iterator.hasNext() && i < length)
{
TableRow row = iterator.next();
int collectionID = row.getIntColumn("collection_id");
Collection collection = Collection.find(_context, collectionID);
array.add(DSpaceSet.newDSpaceCollectionSet(
collection.getHandle(),
collection.getName()));
i++;
}
}
catch (SQLException e)
{
log.error(e.getMessage(), e);
}
return array;
}
@Override
public ListSetsResult retrieveSets(int offset, int length)
{
// Only database sets (virtual sets are added by lyncode common library)
log.debug("Querying sets. Offset: " + offset + " - Length: " + length);
List<Set> array = new ArrayList<Set>();
int communityCount = this.getCommunityCount();
log.debug("Communities: " + communityCount);
int collectionCount = this.getCollectionCount();
log.debug("Collections: " + collectionCount);
if (offset < communityCount)
{
if (offset + length > communityCount)
{
// Add some collections
List<Set> tmp = community(offset, length);
array.addAll(tmp);
array.addAll(collection(0, length - tmp.size()));
}
else
array.addAll(community(offset, length));
}
else if (offset < communityCount + collectionCount)
{
array.addAll(collection(offset - communityCount, length));
}
log.debug("Has More Results: "
+ ((offset + length < communityCount + collectionCount) ? "Yes"
: "No"));
return new ListSetsResult(offset + length < communityCount
+ collectionCount, array, communityCount + collectionCount);
}
@Override
public boolean supportSets()
{
return true;
}
@Override
public boolean exists(String setSpec)
{
if (setSpec.startsWith("col_"))
{
try
{
DSpaceObject dso = HandleServiceImpl.resolveToObject(_context,
setSpec.replace("col_", "").replace("_", "/"));
if (dso == null || !(dso instanceof Collection))
return false;
return true;
}
catch (Exception ex)
{
log.error(ex.getMessage(), ex);
}
}
else if (setSpec.startsWith("com_"))
{
try
{
DSpaceObject dso = HandleServiceImpl.resolveToObject(_context,
setSpec.replace("com_", "").replace("_", "/"));
if (dso == null || !(dso instanceof Community))
return false;
return true;
}
catch (Exception ex)
{
log.error(ex.getMessage(), ex);
}
}
return false;
}
}

View File

@@ -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());
}
}

View File

@@ -13,9 +13,7 @@ import com.lyncode.xoai.util.Base64Utils;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.Bitstream;
import org.dspace.content.Bundle;
import org.dspace.content.Metadatum;
import org.dspace.content.Item;
import org.dspace.content.authority.Choices;
import org.dspace.core.ConfigurationManager;
@@ -28,6 +26,13 @@ import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.List;
import org.dspace.content.BundleBitstream;
import org.dspace.content.MetadataField;
import org.dspace.content.MetadataValue;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.BitstreamService;
import org.dspace.content.service.ItemService;
import org.dspace.core.Context;
/**
*
@@ -36,8 +41,13 @@ import java.util.List;
@SuppressWarnings("deprecation")
public class ItemUtils
{
private static Logger log = LogManager
.getLogger(ItemUtils.class);
private static final Logger log = LogManager.getLogger(ItemUtils.class);
private static final ItemService itemService
= ContentServiceFactory.getInstance().getItemService();
private static final BitstreamService bitstreamService
= ContentServiceFactory.getInstance().getBitstreamService();
private static Element getElement(List<Element> list, String name)
{
@@ -62,45 +72,45 @@ public class ItemUtils
e.setName(name);
return e;
}
public static Metadata retrieveMetadata (Item item) {
public static Metadata retrieveMetadata (Context context, Item item) {
Metadata metadata;
//DSpaceDatabaseItem dspaceItem = new DSpaceDatabaseItem(item);
// read all metadata into Metadata Object
metadata = new Metadata();
Metadatum[] vals = item.getMetadata(Item.ANY, Item.ANY, Item.ANY, Item.ANY);
for (Metadatum val : vals)
List<MetadataValue> vals = itemService.getMetadata(item, Item.ANY, Item.ANY, Item.ANY, Item.ANY);
for (MetadataValue val : vals)
{
MetadataField field = val.getMetadataField();
Element valueElem = null;
Element schema = getElement(metadata.getElement(), val.schema);
Element schema = getElement(metadata.getElement(), field.getMetadataSchema().getName());
if (schema == null)
{
schema = create(val.schema);
schema = create(field.getMetadataSchema().getName());
metadata.getElement().add(schema);
}
valueElem = schema;
// Has element.. with XOAI one could have only schema and value
if (val.element != null && !val.element.equals(""))
if (field.getElement() != null && !field.getElement().equals(""))
{
Element element = getElement(schema.getElement(),
val.element);
field.getElement());
if (element == null)
{
element = create(val.element);
element = create(field.getElement());
schema.getElement().add(element);
}
valueElem = element;
// Qualified element?
if (val.qualifier != null && !val.qualifier.equals(""))
if (field.getQualifier() != null && !field.getQualifier().equals(""))
{
Element qualifier = getElement(element.getElement(),
val.qualifier);
field.getQualifier());
if (qualifier == null)
{
qualifier = create(val.qualifier);
qualifier = create(field.getQualifier());
element.getElement().add(qualifier);
}
valueElem = qualifier;
@@ -108,13 +118,13 @@ public class ItemUtils
}
// Language?
if (val.language != null && !val.language.equals(""))
if (val.getLanguage() != null && !val.getLanguage().equals(""))
{
Element language = getElement(valueElem.getElement(),
val.language);
val.getLanguage());
if (language == null)
{
language = create(val.language);
language = create(val.getLanguage());
valueElem.getElement().add(language);
}
valueElem = language;
@@ -131,11 +141,11 @@ public class ItemUtils
valueElem = language;
}
valueElem.getField().add(createValue("value", val.value));
if (val.authority != null) {
valueElem.getField().add(createValue("authority", val.authority));
if (val.confidence != Choices.CF_NOVALUE)
valueElem.getField().add(createValue("confidence", val.confidence + ""));
valueElem.getField().add(createValue("value", val.getValue()));
if (val.getAuthority() != null) {
valueElem.getField().add(createValue("authority", val.getAuthority()));
if (val.getConfidence() != Choices.CF_NOVALUE)
valueElem.getField().add(createValue("confidence", val.getConfidence() + ""));
}
}
// Done! Metadata has been read!
@@ -143,7 +153,7 @@ public class ItemUtils
Element bundles = create("bundles");
metadata.getElement().add(bundles);
Bundle[] bs;
List<Bundle> bs;
try
{
bs = item.getBundles();
@@ -156,33 +166,33 @@ public class ItemUtils
Element bitstreams = create("bitstreams");
bundle.getElement().add(bitstreams);
Bitstream[] bits = b.getBitstreams();
for (Bitstream bit : bits)
List<BundleBitstream> bits = b.getBitstreams();
for (BundleBitstream bit : bits)
{
Element bitstream = create("bitstream");
bitstreams.getElement().add(bitstream);
String url = "";
String bsName = bit.getName();
String sid = String.valueOf(bit.getSequenceID());
String bsName = bit.getBitstream().getName();
String sid = String.valueOf(bit.getBitstream().getSequenceID());
String baseUrl = ConfigurationManager.getProperty("oai",
"bitstream.baseUrl");
String handle = null;
// get handle of parent Item of this bitstream, if there
// is one:
Bundle[] bn = bit.getBundles();
if (bn.length > 0)
List<BundleBitstream> bn = bit.getBitstream().getBundles();
if (!bn.isEmpty())
{
Item bi[] = bn[0].getItems();
if (bi.length > 0)
List<Item> bi = bn.get(0).getBundle().getItems();
if (!bi.isEmpty())
{
handle = bi[0].getHandle();
handle = bi.get(0).getHandle();
}
}
if (bsName == null)
{
String ext[] = bit.getFormat().getExtensions();
List<String> ext = bit.getBitstream().getFormat(context).getExtensions();
bsName = "bitstream_" + sid
+ (ext.length > 0 ? ext[0] : "");
+ (ext.isEmpty() ? "" : ext.get(0));
}
if (handle != null && baseUrl != null)
{
@@ -196,11 +206,11 @@ public class ItemUtils
url = URLUtils.encode(bsName);
}
String cks = bit.getChecksum();
String cka = bit.getChecksumAlgorithm();
String oname = bit.getSource();
String name = bit.getName();
String description = bit.getDescription();
String cks = bit.getBitstream().getChecksum();
String cka = bit.getBitstream().getChecksumAlgorithm();
String oname = bit.getBitstream().getSource();
String name = bit.getBitstream().getName();
String description = bit.getBitstream().getDescription();
if (name != null)
bitstream.getField().add(
@@ -212,17 +222,17 @@ public class ItemUtils
bitstream.getField().add(
createValue("description", description));
bitstream.getField().add(
createValue("format", bit.getFormat()
createValue("format", bit.getBitstream().getFormat(context)
.getMIMEType()));
bitstream.getField().add(
createValue("size", "" + bit.getSize()));
createValue("size", "" + bit.getBitstream().getSize()));
bitstream.getField().add(createValue("url", url));
bitstream.getField().add(
createValue("checksum", cks));
bitstream.getField().add(
createValue("checksumAlgorithm", cka));
bitstream.getField().add(
createValue("sid", bit.getSequenceID()
createValue("sid", bit.getBitstream().getSequenceID()
+ ""));
}
}
@@ -257,21 +267,21 @@ public class ItemUtils
// Licensing info
Element license = create("license");
Bundle[] licBundles;
List<Bundle> licBundles;
try
{
licBundles = item.getBundles(Constants.LICENSE_BUNDLE_NAME);
if (licBundles.length > 0)
licBundles = itemService.getBundles(item, Constants.LICENSE_BUNDLE_NAME);
if (!licBundles.isEmpty())
{
Bundle licBundle = licBundles[0];
Bitstream[] licBits = licBundle.getBitstreams();
if (licBits.length > 0)
Bundle licBundle = licBundles.get(0);
List<BundleBitstream> licBits = licBundle.getBitstreams();
if (!licBits.isEmpty())
{
Bitstream licBit = licBits[0];
BundleBitstream licBit = licBits.get(0);
InputStream in;
try
{
in = licBit.retrieve();
in = bitstreamService.retrieve(context, licBit.getBitstream());
ByteArrayOutputStream out = new ByteArrayOutputStream();
Utils.bufferedCopy(in, out);
license.getField().add(
@@ -279,15 +289,7 @@ public class ItemUtils
Base64Utils.encode(out.toString())));
metadata.getElement().add(license);
}
catch (AuthorizeException e)
{
log.warn(e.getMessage(), e);
}
catch (IOException e)
{
log.warn(e.getMessage(), e);
}
catch (SQLException e)
catch (AuthorizeException | IOException | SQLException e)
{
log.warn(e.getMessage(), e);
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -1,214 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.xoai.tests.unit.services.impl.database;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.dspace.core.Constants;
import org.dspace.xoai.filter.DSpaceMetadataExistsFilter;
import org.dspace.xoai.filter.DSpaceSetSpecFilter;
import org.dspace.xoai.filter.DateFromFilter;
import org.dspace.xoai.filter.DateUntilFilter;
import org.dspace.xoai.services.api.database.DatabaseQuery;
import org.dspace.xoai.services.impl.database.DSpaceDatabaseQueryResolver;
import org.dspace.xoai.tests.unit.services.impl.AbstractQueryResolverTest;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.lyncode.builder.DateBuilder;
import com.lyncode.xoai.dataprovider.data.Filter;
import com.lyncode.xoai.dataprovider.filter.Scope;
import com.lyncode.xoai.dataprovider.filter.ScopedFilter;
import com.lyncode.xoai.dataprovider.filter.conditions.AndCondition;
import com.lyncode.xoai.dataprovider.filter.conditions.Condition;
import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterList;
import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterMap;
import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.StringValue;
public class DSpaceDatabaseQueryResolverTest extends AbstractQueryResolverTest {
private static final Date DATE = new Date();
private static final String SET = "col_testSet";
private static final String FIELD_1 = "dc.title";
private static final String FIELD_2 = "dc.type";
private static final int START = 0;
private static final int LENGTH = 100;
private DSpaceDatabaseQueryResolver underTest = new DSpaceDatabaseQueryResolver();;
@Before
public void autowire () {
autowire(underTest);
}
@After
public void cleanup() {
underTest = null;
}
@Test
public void fromFilterQuery() throws Exception {
List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>();
scopedFilters.add(new ScopedFilter(new Condition() {
@Override
public Filter getFilter() {
return new DateFromFilter(DATE);
}
}, Scope.Query));
DatabaseQuery result = underTest.buildQuery(scopedFilters, START, LENGTH);
assertThat(result.getQuery(), is("SELECT i.* FROM item i WHERE i.in_archive=true AND (i.last_modified >= ?) ORDER BY i.item_id OFFSET ? LIMIT ?"));
assertThat(((java.sql.Date)result.getParameters().get(0)).getTime(), is(fromDate(DATE).getTime()));
assertThat((Integer) result.getParameters().get(1), is(START));
assertThat((Integer) result.getParameters().get(2), is(LENGTH));
}
@Test
public void fromAndUntilFilterQuery() throws Exception {
List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>();
Condition fromCondition = new Condition() {
@Override
public Filter getFilter() {
return new DateFromFilter(DATE);
}
};
Condition untilCondition = new Condition() {
@Override
public Filter getFilter() {
return new DateUntilFilter(DATE);
}
};
scopedFilters.add(new ScopedFilter(new AndCondition(getFilterResolver(),
fromCondition, untilCondition), Scope.Query));
DatabaseQuery result = underTest.buildQuery(scopedFilters, START, LENGTH);
assertThat(result.getQuery(), is("SELECT i.* FROM item i WHERE i.in_archive=true AND ((i.last_modified >= ?) AND (i.last_modified <= ?)) ORDER BY i.item_id OFFSET ? LIMIT ?"));
assertThat(((java.sql.Date)result.getParameters().get(0)).getTime(), is(fromDate(DATE).getTime()));
assertThat(((java.sql.Date)result.getParameters().get(1)).getTime(), is(untilDate(DATE).getTime()));
assertThat((Integer) result.getParameters().get(2), is(START));
assertThat((Integer) result.getParameters().get(3), is(LENGTH));
}
@Test
public void customConditionForMetadataExistsFilterWithOneSingleValue() throws Exception {
theFieldResolver().hasField(FIELD_1, 1);
List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>();
ParameterMap filterConfiguration = new ParameterMap().withValues(new StringValue()
.withValue(FIELD_1)
.withName("fields"));
final DSpaceMetadataExistsFilter metadataExistsFilter = new DSpaceMetadataExistsFilter();
metadataExistsFilter.setConfiguration(filterConfiguration);
metadataExistsFilter.setFieldResolver(theFieldResolver());
scopedFilters.add(new ScopedFilter(new Condition()
{
@Override
public Filter getFilter()
{
return metadataExistsFilter;
}
}, Scope.Query));
DatabaseQuery result = underTest.buildQuery(scopedFilters, START, LENGTH);
assertThat(result.getQuery(), is("SELECT i.* FROM item i WHERE i.in_archive=true AND ((EXISTS (SELECT tmp.* FROM metadatavalue tmp WHERE tmp.resource_id=i.item_id AND tmp.resource_type_id=" + Constants.ITEM + " AND tmp.metadata_field_id=?))) ORDER BY i.item_id OFFSET ? LIMIT ?"));
assertThat(((Integer) result.getParameters().get(0)), is(1));
assertThat((Integer) result.getParameters().get(1), is(START));
assertThat((Integer) result.getParameters().get(2), is(LENGTH));
}
@Test
public void customConditionForMetadataExistsFilterWithMultipleValues() throws Exception {
theFieldResolver().hasField(FIELD_1, 1).hasField(FIELD_2, 2);
List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>();
ParameterMap filterConfiguration = new ParameterMap().withValues(new ParameterList()
.withValues(
new StringValue().withValue(FIELD_1),
new StringValue().withValue(FIELD_2)
)
.withName("fields"));
final DSpaceMetadataExistsFilter metadataExistsFilter = new DSpaceMetadataExistsFilter();
metadataExistsFilter.setConfiguration(filterConfiguration);
metadataExistsFilter.setFieldResolver(theFieldResolver());
scopedFilters.add(new ScopedFilter(new Condition()
{
@Override
public Filter getFilter()
{
return metadataExistsFilter;
}
}, Scope.Query));
DatabaseQuery result = underTest.buildQuery(scopedFilters, START, LENGTH);
assertThat(result.getQuery(), is("SELECT i.* FROM item i WHERE i.in_archive=true AND ((EXISTS (SELECT tmp.* FROM metadatavalue tmp WHERE tmp.resource_id=i.item_id AND tmp.resource_type_id=" + Constants.ITEM + " AND tmp.metadata_field_id=?) OR EXISTS (SELECT tmp.* FROM metadatavalue tmp WHERE tmp.resource_id=i.item_id AND tmp.resource_type_id=" + Constants.ITEM + " AND tmp.metadata_field_id=?))) ORDER BY i.item_id OFFSET ? LIMIT ?"));
assertThat(((Integer) result.getParameters().get(0)), is(1));
assertThat(((Integer) result.getParameters().get(1)), is(2));
assertThat((Integer) result.getParameters().get(2), is(START));
assertThat((Integer) result.getParameters().get(3), is(LENGTH));
}
@Test
public void fromFilterInMetadataFormatScope() throws Exception {
List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>();
scopedFilters.add(new ScopedFilter(new Condition() {
@Override
public Filter getFilter() {
return new DateFromFilter(DATE);
}
}, Scope.MetadataFormat));
DatabaseQuery result = underTest.buildQuery(scopedFilters, START, LENGTH);
assertThat(result.getQuery(), is("SELECT i.* FROM item i WHERE i.in_archive=true AND (item.deleted:true OR (i.last_modified >= ?)) ORDER BY i.item_id OFFSET ? LIMIT ?"));
assertThat(((java.sql.Date)result.getParameters().get(0)).getTime(), is(fromDate(DATE).getTime()));
assertThat((Integer) result.getParameters().get(1), is(START));
assertThat((Integer) result.getParameters().get(2), is(LENGTH));
}
@Test
public void fromAndSetFilterQuery() throws Exception {
List<ScopedFilter> scopedFilters = new ArrayList<ScopedFilter>();
scopedFilters.add(new ScopedFilter(new Condition() {
@Override
public Filter getFilter() {
return new DateFromFilter(DATE);
}
}, Scope.Query));
scopedFilters.add(new ScopedFilter(new Condition() {
@Override
public Filter getFilter() {
return new DSpaceSetSpecFilter(collectionsService, handleResolver, SET);
}
}, Scope.Query));
DatabaseQuery result = underTest.buildQuery(scopedFilters, START, LENGTH);
assertThat(result.getQuery(), is("SELECT i.* FROM item i WHERE i.in_archive=true AND (i.last_modified >= ?) AND true ORDER BY i.item_id OFFSET ? LIMIT ?"));
assertThat(((java.sql.Date)result.getParameters().get(0)).getTime(), is(fromDate(DATE).getTime()));
assertThat((Integer) result.getParameters().get(1), is(START));
assertThat((Integer) result.getParameters().get(2), is(LENGTH));
}
private Date fromDate(Date date) {
return new DateBuilder(date).setMinMilliseconds().build();
}
private Date untilDate(Date date) {
return new DateBuilder(date).setMaxMilliseconds().build();
}
}