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