예제 #1
0
  /**
   * 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);
  }
예제 #2
0
  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");
    boolean xmlEncodeSetSpec =
        "true".equalsIgnoreCase(properties.getProperty("OAIHandler.xmlEncodeSetSpec"));
    boolean urlEncodeSetSpec =
        !"false".equalsIgnoreCase(properties.getProperty("OAIHandler.urlEncodeSetSpec"));
    String baseURL = properties.getProperty("OAIHandler.baseURL");
    if (baseURL == null) {
      try {
        baseURL = request.getRequestURL().toString();
      } catch (java.lang.NoSuchMethodError f) {
        baseURL = HttpUtils.getRequestURL(request).toString();
      }
    }
    StringBuffer sb = new StringBuffer();
    String oldResumptionToken = request.getParameter("resumptionToken");
    String metadataPrefix = request.getParameter("metadataPrefix");

    if (metadataPrefix != null && metadataPrefix.length() == 0) metadataPrefix = null;

    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\"");
    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>");
    //  sb.append("<requestURL>");
    //  sb.append(getRequestURL(request));
    //  sb.append("</requestURL>");

    if (!abstractCatalog.isHarvestable()) {
      sb.append("<request verb=\"ListIdentifiers\">");
      sb.append(baseURL);
      sb.append("</request>");
      sb.append("<error code=\"badArgument\">Database is unavailable for harvesting</error>");
    } else {
      ArrayList validParamNames = null;
      ArrayList requiredParamNames = null;
      Map listIdentifiersMap = null;
      if (oldResumptionToken == null) {
        validParamNames = validParamNames1;
        requiredParamNames = requiredParamNames1;
        String from = request.getParameter("from");
        String until = request.getParameter("until");
        try {
          if (from != null && from.length() > 0 && from.length() < 10) {
            throw new BadArgumentException();
          }
          if (until != null && until.length() > 0 && until.length() < 10) {
            throw new BadArgumentException();
          }
          if (from != null && until != null && from.length() != until.length()) {
            throw new BadArgumentException();
          }

          if (from == null || from.length() == 0) {
            // from = "0001-01-01";
            from = Constants.DateTime.MIN_FROM_DATE;
            // from = "0000";
          }
          /*          else{
              from = abstractCatalog.toFinestFrom(from);
          }*/

          if (until == null || until.length() == 0) {
            // until = "9999-12-31";
            until = Constants.DateTime.MAX_TO_DATE;
            // until = "9999";
          }
          /*          else{
              until = abstractCatalog.toFinestUntil(until);
          }
          */

          from = abstractCatalog.toFinestFrom(from);
          until = abstractCatalog.toFinestUntil(until);

          if (from.compareTo(until) > 0) throw new BadArgumentException();
          String set = request.getParameter("set");
          if (set != null) {
            if (set.length() == 0) set = null;
            else if (urlEncodeSetSpec) set = set.replace(' ', '+');
          }
          Crosswalks crosswalks = abstractCatalog.getCrosswalks();
          if (metadataPrefix == null) {
            throw new BadArgumentException();
          }

          if (!crosswalks.containsValue(metadataPrefix)) {
            throw new CannotDisseminateFormatException(metadataPrefix);
          } else {
            listIdentifiersMap = abstractCatalog.listIdentifiers(from, until, set, metadataPrefix);
          }
        } catch (NoItemsMatchException e) {
          sb.append(getRequestElement(request, validParamNames, baseURL, xmlEncodeSetSpec));
          sb.append(e.getMessage());
        } catch (BadArgumentException e) {
          sb.append("<request verb=\"ListIdentifiers\">");
          //          sb.append(HttpUtils.getRequestURL(request));
          sb.append(baseURL);
          sb.append("</request>");
          sb.append(e.getMessage());
          //      } catch (BadGranularityException e) {
          //          sb.append(getRequestElement(request));
          //          sb.append(e.getMessage());
        } catch (CannotDisseminateFormatException e) {
          sb.append(getRequestElement(request, validParamNames, baseURL, xmlEncodeSetSpec));
          sb.append(e.getMessage());
        } catch (NoSetHierarchyException e) {
          sb.append(getRequestElement(request, validParamNames, baseURL, xmlEncodeSetSpec));
          sb.append(e.getMessage());
        }
      } else {
        validParamNames = validParamNames2;
        requiredParamNames = requiredParamNames2;
        if (hasBadArguments(request, requiredParamNames.iterator(), validParamNames)) {
          sb.append(getRequestElement(request, validParamNames, baseURL, xmlEncodeSetSpec));
          sb.append(new BadArgumentException().getMessage());
        } else {
          try {
            listIdentifiersMap = abstractCatalog.listIdentifiers(oldResumptionToken);
          } catch (BadResumptionTokenException e) {
            sb.append(getRequestElement(request, validParamNames, baseURL, xmlEncodeSetSpec));
            sb.append(e.getMessage());
          }
        }
      }

      if (listIdentifiersMap != null) {
        sb.append(getRequestElement(request, validParamNames, baseURL, xmlEncodeSetSpec));
        if (hasBadArguments(request, requiredParamNames.iterator(), validParamNames)) {
          sb.append(new BadArgumentException().getMessage());
        } else {
          sb.append("<ListIdentifiers>");
          Iterator identifiers = (Iterator) listIdentifiersMap.get("headers");
          while (identifiers.hasNext()) {
            sb.append((String) identifiers.next());
          }

          Map newResumptionMap = (Map) listIdentifiersMap.get("resumptionMap");
          if (newResumptionMap != null) {
            String newResumptionToken = (String) newResumptionMap.get("resumptionToken");
            String expirationDate = (String) newResumptionMap.get("expirationDate");
            String completeListSize = (String) newResumptionMap.get("completeListSize");
            String cursor = (String) newResumptionMap.get("cursor");
            sb.append("<resumptionToken");
            if (expirationDate != null) {
              sb.append(" expirationDate=\"");
              sb.append(expirationDate);
              sb.append("\"");
            }
            if (completeListSize != null) {
              sb.append(" completeListSize=\"");
              sb.append(completeListSize);
              sb.append("\"");
            }
            if (cursor != null) {
              sb.append(" cursor=\"");
              sb.append(cursor);
              sb.append("\"");
            }
            sb.append(">");
            sb.append(newResumptionToken);
            sb.append("</resumptionToken>");
          } else if (oldResumptionToken != null) {
            sb.append("<resumptionToken />");
          }
          sb.append("</ListIdentifiers>");
        }
      }
    }
    sb.append("</OAI-PMH>");
    if (debug) {
      log.info("ListIdentifiers.constructListIdentifiers: returning: " + sb.toString());
    }
    return render(response, "text/xml; charset=UTF-8", sb.toString(), serverTransformer);
  }