/** * 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.HandleManager; 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 = HandleManager.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); } }