public IResponse handleGet(String[] queryPath, Properties params) {
    IResponse response;
    if (queryPath.length == 0) {
      response = listBundles();
    } else if (queryPath.length == 1) {
      try {
        Bundle bundle = findBundle(queryPath[0]);
        Properties props = createBundleProperties(bundle);

        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        props.store(buffer, null);

        response =
            new DefaultResponse(IResponse.HTTP_OK, IResponse.MIME_PLAINTEXT, buffer.toString());
      } catch (NumberFormatException e) {
        response = DefaultResponse.createBadRequestError(e.getMessage());
      } catch (IllegalArgumentException e) {
        response =
            new DefaultResponse(
                IResponse.HTTP_NOTFOUND, IResponse.MIME_PLAINTEXT, "No such bundle");
      } catch (IOException e) {
        response = DefaultResponse.createInternalError(e);
      }
    } else {
      response =
          new DefaultResponse(
              IResponse.HTTP_NOTIMPLEMENTED, IResponse.MIME_PLAINTEXT, "Not implemented.");
    }
    return response;
  }
  public IResponse handlePost(
      String[] queryPath, Properties params, Properties uploads, InputStream content) {
    IResponse response;
    if (queryPath.length == 0) {
      try {
        String startProp = params.getProperty("start");
        boolean start = "true".equals(startProp) || "on".equals(startProp);

        List errors = installBundles(uploads, start);
        if (errors.isEmpty()) response = listBundles();
        else response = listErrors(IResponse.HTTP_INTERNALERROR, errors);
      } catch (IllegalArgumentException e) {
        response =
            new DefaultResponse(
                IResponse.HTTP_BADREQUEST, IResponse.MIME_PLAINTEXT, e.getMessage());
      }
    } else {
      try {
        Bundle bundle = findBundle(queryPath[0]);
        if (queryPath.length == 1 && uploads != null && !uploads.isEmpty()) {
          updateBundle(bundle, uploads);
        } else if (queryPath.length == 2 && "start".equals(queryPath[1])) {
          bundle.start();
        } else if (queryPath.length == 2 && "stop".equals(queryPath[1])) {
          bundle.stop();
        } else if (queryPath.length == 2 && "update".equals(queryPath[1])) {
          bundle.update();
        }
        response = listBundles();
      } catch (NumberFormatException e) {
        response =
            new DefaultResponse(
                IResponse.HTTP_BADREQUEST, IResponse.MIME_PLAINTEXT, e.getMessage());
      } catch (FileNotFoundException e) {
        response = DefaultResponse.createInternalError(e);
      } catch (BundleException e) {
        response = DefaultResponse.createInternalError(e);
      } catch (IllegalArgumentException e) {
        response = DefaultResponse.createBadRequestError(e.getMessage());
      }
    }

    return response;
  }
  public IResponse handlePut(
      String[] queryPath, Properties params, Properties uploads, InputStream content) {
    IResponse response;

    if (queryPath.length == 0) {
      response =
          new DefaultResponse(
              IResponse.HTTP_BADREQUEST, IResponse.MIME_PLAINTEXT, "Invalid request");
    } else {
      try {
        Bundle bundle = findBundle(queryPath[0]);
        try {
          if (queryPath.length == 1 && content != null) {
            // Update from supplied content
            bundle.update(content);
            response = listBundles();
          } else if (queryPath.length == 2 && "update".equals(queryPath[1])) {
            // Update from persistent location
            bundle.update();
            response = listBundles();
          } else if (queryPath.length == 2 && "start".equals(queryPath[1])) {
            bundle.start();
            response = listBundles();
          } else if (queryPath.length == 2 && "stop".equals(queryPath[1])) {
            bundle.stop();
            response = listBundles();
          } else {
            response =
                new DefaultResponse(
                    IResponse.HTTP_BADREQUEST, IResponse.MIME_PLAINTEXT, "Invalid request");
          }
        } catch (BundleException e) {
          response = DefaultResponse.createInternalError(e);
          response =
              new DefaultResponse(
                  IResponse.HTTP_INTERNALERROR, IResponse.MIME_PLAINTEXT, e.getMessage());
        }
      } catch (NumberFormatException e) {
        response =
            new DefaultResponse(
                IResponse.HTTP_BADREQUEST, IResponse.MIME_PLAINTEXT, e.getMessage());
      } catch (IllegalArgumentException e) {
        response =
            new DefaultResponse(
                IResponse.HTTP_NOTFOUND,
                IResponse.MIME_PLAINTEXT,
                "No such bundle " + queryPath[0]);
      }
    }

    return response;
  }