public static String encode(String unencoded) throws LowlevelStorageException {
   try {
     int i = unencoded.indexOf("+");
     if (i != -1) {
       return Server.getPID(unencoded.substring(0, i)).toFilename() + unencoded.substring(i);
     } else {
       return Server.getPID(unencoded).toFilename();
     }
   } catch (MalformedPidException e) {
     throw new LowlevelStorageException(true, e.getMessage(), e);
   }
 }
 public static String decode(String encoded) throws LowlevelStorageException {
   try {
     int i = encoded.indexOf('+');
     if (i != -1) {
       return Server.pidFromFilename(encoded.substring(0, i)).toString() + encoded.substring(i);
     } else {
       return Server.pidFromFilename(encoded).toString();
     }
   } catch (MalformedPidException e) {
     throw new LowlevelStorageException(true, e.getMessage(), e);
   }
 }
  /**
   * Process Fedora Access Request. Parse and validate the servlet input parameters and then execute
   * the specified request.
   *
   * @param request The servlet request.
   * @param response servlet The servlet response.
   * @throws ServletException If an error occurs that effects the servlet's basic operation.
   * @throws IOException If an error occurrs with an input or output operation.
   */
  @Override
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String PID = null;
    Date asOfDateTime = null;
    Date versDateTime = null;
    boolean xml = false;
    requestURI = request.getRequestURL().toString() + "?" + request.getQueryString();

    // Parse servlet URL.
    String[] URIArray = request.getRequestURL().toString().split("/");
    if (URIArray.length == 6 || URIArray.length == 7) {
      // Request is either unversioned or versioned listMethods request
      try {
        PID = Server.getPID(URIArray[5]).toString(); // normalize PID
      } catch (Throwable th) {
        logger.error("Bad pid syntax in request", th);
        throw new BadRequest400Exception(request, ACTION_LABEL, "", EMPTY_STRING_ARRAY);
      }
      if (URIArray.length == 7) {
        // Request is a versioned listMethods request
        try {
          versDateTime = DateUtility.parseDateStrict(URIArray[6]);
        } catch (ParseException e) {
          logger.error("Bad date format in request");
          throw new BadRequest400Exception(request, ACTION_LABEL, "", EMPTY_STRING_ARRAY);
        }
        asOfDateTime = versDateTime;
      }
      logger.debug("Listing methods (PID={}, asOfDate={})", PID, versDateTime);
    } else {
      logger.error("Bad syntax (expected 6 or 7 parts) in request");
      throw new BadRequest400Exception(request, ACTION_LABEL, "", EMPTY_STRING_ARRAY);
    }

    if (request.getParameter("xml") != null) {
      xml = Boolean.parseBoolean(request.getParameter("xml"));
    }

    try {
      Context context = ReadOnlyContext.getContext(HTTP_REQUEST.REST.uri, request);
      listMethods(context, PID, asOfDateTime, xml, request, response);
      logger.debug("Finished listing methods");
    } catch (ObjectNotFoundException e) {
      logger.error(
          "Object not found for request: " + requestURI + " (actionLabel=" + ACTION_LABEL + ")", e);
      throw new NotFound404Exception(request, ACTION_LABEL, "", EMPTY_STRING_ARRAY);
    } catch (DisseminationException e) {
      logger.error(
          "Error Listing Methods: " + requestURI + " (actionLabel=" + ACTION_LABEL + ")", e);
      throw new NotFound404Exception(
          "Error Listing Methods", e, request, ACTION_LABEL, "", EMPTY_STRING_ARRAY);
    } catch (ObjectNotInLowlevelStorageException e) {
      logger.error(
          "Object not found for request: " + requestURI + " (actionLabel=" + ACTION_LABEL + ")", e);
      throw new NotFound404Exception(request, ACTION_LABEL, "", EMPTY_STRING_ARRAY);
    } catch (AuthzException ae) {
      logger.error("Authorization error listing methods", ae);
      throw RootException.getServletException(ae, request, ACTION_LABEL, EMPTY_STRING_ARRAY);
    } catch (Throwable th) {
      logger.error("Error listing methods", th);
      throw new InternalError500Exception(
          "Error listing methods", th, request, ACTION_LABEL, "", EMPTY_STRING_ARRAY);
    }
  }