📄 dspaceoaicatalog.java
字号:
// token if (records.size() >= MAX_RECORDS) { String resumptionToken = makeResumptionToken(from, until, set, metadataPrefix, offset + MAX_RECORDS); if (log.isDebugEnabled()) { log.debug(LogManager .getHeader(context, "made_resumption_token", "token=" + resumptionToken)); } results.put("resumptionMap", getResumptionMap(resumptionToken)); //results.put("resumptionToken", resumptionToken); } } catch (SQLException se) { // Log the error log.warn(LogManager.getHeader(context, "database_error", ""), se); throw new OAIInternalServerError(se.toString()); } finally { if (context != null) { context.abort(); } } return results; } /** * Retrieve a list of sets that satisfy the specified criteria * * @return a Map object containing "sets" Iterator object (contains * <setSpec/>XML Strings) as well as an optional resumptionMap Map. * @exception OAIBadRequestException * signals an http status code 400 problem * @exception OAIInternalServerError * signals an http status code 500 problem */ public Map listSets() throws NoSetHierarchyException, OAIInternalServerError { log.info(LogManager.getHeader(null, "oai_request", "verb=listSets")); Context context = null; // List to put results in List sets = new LinkedList(); try { context = new Context(); Collection[] allCols = Collection.findAll(context); StringBuffer spec = null; for (int i = 0; i < allCols.length; i++) { spec = new StringBuffer("<set><setSpec>hdl_"); spec.append(allCols[i].getHandle().replace('/', '_')); spec.append("</setSpec>"); String collName = allCols[i].getMetadata("name"); if(collName != null) { spec.append("<setName>"); spec.append(Utils.addEntities(collName)); spec.append("</setName>"); } else { spec.append("<setName />"); // Warn that there is an error of a null set name log.info(LogManager.getHeader(null, "oai_error", "null_set_name_for_set_id_" + allCols[i].getHandle())); } spec.append("</set>"); sets.add(spec.toString()); } } catch (SQLException se) { // Log the error log.warn(LogManager.getHeader(context, "database_error", ""), se); throw new OAIInternalServerError(se.toString()); } finally { if (context != null) { context.abort(); } } // Put results in form needed to return Map results = new HashMap(); results.put("sets", sets.iterator()); return results; } /** * Retrieve the next set of sets associated with the resumptionToken * * @param resumptionToken * implementation-dependent format taken from the previous * listSets() Map result. * @return a Map object containing "sets" Iterator object (contains * <setSpec/>XML Strings) as well as an optional resumptionMap Map. * @exception BadResumptionTokenException * the value of the resumptionToken is invalid or expired. * @exception OAIInternalServerError * signals an http status code 500 problem */ public Map listSets(String resumptionToken) throws BadResumptionTokenException, OAIInternalServerError { // Resumption tokens not yet supported throw new BadResumptionTokenException(); } /** * close the repository */ public void close() { } // ****************************************** // Internal DSpace utility methods below here // ****************************************** /** * Get the community or collection signified by a set spec * * @param context * DSpace context object * @param set * OAI set spec * @return the corresponding community or collection, or null if no set * provided */ private Collection resolveSet(Context context, String set) throws SQLException, BadArgumentException { if (set == null) { return null; } DSpaceObject o = null; /* * set specs are in form hdl_123.456_789 corresponding to * hdl:123.456/789 */ if (set.startsWith("hdl_")) { // Looks OK so far... turn second _ into / String handle = set.substring(4).replace('_', '/'); o = HandleManager.resolveToObject(context, handle); } // If it corresponds to a collection, that's the set we want if ((o != null) && o instanceof Collection) { return (Collection) o; } // Handle is either non-existent, or corresponds to a non-collection // Either way, a bad set spec, ergo a bad argument throw new BadArgumentException(); } /** * Create a resumption token. The relevant parameters for the harvest are * put in a * * @param from * OAI 'from' parameter * @param until * OAI 'until' parameter * @param set * OAI 'set' parameter * @param prefix * OAI 'metadataPrefix' parameter * @param offset * where to start the next harvest * * @return the appropriate resumption token */ private String makeResumptionToken(String from, String until, String set, String prefix, int offset) { StringBuffer token = new StringBuffer(); if (from != null) { token.append(from); } token.append("/"); if (until != null) { token.append(until); } token.append("/"); if (set != null) { token.append(set); } token.append("/"); if (prefix != null) { token.append(prefix); } token.append("/"); token.append(String.valueOf(offset)); return (token.toString()); } /** * Get the information out of a resumption token * * @param token * the resumption token * @return a 5-long array of Objects; 4 Strings (from, until, set, prefix) * and an Integer (the offset) */ private Object[] decodeResumptionToken(String token) throws BadResumptionTokenException { Object[] obj = new Object[5]; StringTokenizer st = new StringTokenizer(token, "/", true); try { // Extract from, until, set, prefix for (int i = 0; i < 4; i++) { if (!st.hasMoreTokens()) { throw new BadResumptionTokenException(); } String s = st.nextToken(); // If this value is a delimiter /, we have no value for this // part // of the resumption token. if (s.equals("/")) { obj[i] = null; } else { obj[i] = s; // Skip the delimiter st.nextToken(); } log.debug("is: " + (String) obj[i]); } if (!st.hasMoreTokens()) { throw new BadResumptionTokenException(); } obj[4] = new Integer(st.nextToken()); } catch (NumberFormatException nfe) { throw new BadResumptionTokenException(); } catch (NoSuchElementException nsee) { throw new BadResumptionTokenException(); } return obj; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -