/** * Construct the xml response on the server-side. * * @param context the servlet context * @param request the servlet request * @return a String containing the XML response * @throws OAIInternalServerError an http 500 status error occurred */ public static String construct( HashMap context, HttpServletRequest request, HttpServletResponse response, Transformer serverTransformer) throws OAIInternalServerError, TransformerException { Properties properties = (Properties) context.get("OAIHandler.properties"); AbstractCatalog abstractCatalog = (AbstractCatalog) context.get("OAIHandler.catalog"); String baseURL = properties.getProperty("OAIHandler.baseURL"); if (baseURL == null) { try { baseURL = request.getRequestURL().toString(); } catch (java.lang.NoSuchMethodError f) { baseURL = request.getRequestURL().toString(); } } StringBuilder sb = new StringBuilder(); String identifier = request.getParameter("identifier"); String metadataPrefix = request.getParameter("metadataPrefix"); LOGGER.debug("GetRecord.constructGetRecord: identifier=" + identifier); LOGGER.debug("GetRecord.constructGetRecord: metadataPrefix=" + metadataPrefix); sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"); String styleSheet = properties.getProperty("OAIHandler.styleSheet"); if (styleSheet != null) { sb.append("<?xml-stylesheet type=\"text/xsl\" href=\""); sb.append(styleSheet); sb.append("\"?>"); } sb.append("<OAI-PMH xmlns=\"http://www.openarchives.org/OAI/2.0/\""); sb.append(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""); String extraXmlns = properties.getProperty("OAIHandler.extraXmlns"); if (extraXmlns != null) { sb.append(" ").append(extraXmlns); } sb.append(" xsi:schemaLocation=\"http://www.openarchives.org/OAI/2.0/"); sb.append(" http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd\">"); sb.append("<responseDate>"); sb.append(createResponseDate(new Date())); sb.append("</responseDate>"); Crosswalks crosswalks = abstractCatalog.getCrosswalks(); try { if (metadataPrefix == null || metadataPrefix.length() == 0 || identifier == null || identifier.length() == 0 || hasBadArguments(request, validParamNames.iterator(), validParamNames)) { throw new BadArgumentException(); } else if (!crosswalks.containsValue(metadataPrefix)) { throw new CannotDisseminateFormatException(metadataPrefix); } else { String record = abstractCatalog.getRecord(identifier, metadataPrefix); if (record != null) { sb.append(getRequestElement(request, validParamNames, baseURL)); sb.append("<GetRecord>"); sb.append(record); sb.append("</GetRecord>"); } else { throw new IdDoesNotExistException(identifier); } } } catch (BadArgumentException e) { sb.append("<request verb=\"GetRecord\">"); sb.append(baseURL); sb.append("</request>"); sb.append(e.getMessage()); } catch (CannotDisseminateFormatException e) { sb.append(getRequestElement(request, validParamNames, baseURL)); sb.append(e.getMessage()); } catch (IdDoesNotExistException e) { sb.append(getRequestElement(request, validParamNames, baseURL)); sb.append(e.getMessage()); } sb.append("</OAI-PMH>"); return render(response, "text/xml; charset=UTF-8", sb.toString(), serverTransformer); }