Package org.exist.http

Examples of org.exist.http.BadRequestException


  public void doDelete(DBBroker broker, IncomingMessage request,
      OutgoingMessage response) throws BadRequestException,
      PermissionDeniedException, NotFoundException, EXistException,
      IOException, TriggerException {
   
    throw new BadRequestException("Method " + request.getMethod()
        + " is not supported by this module.");
  }
View Full Code Here


        );
        docBuilder = docFactory.newDocumentBuilder();
        doc = docBuilder.parse(src);
      } catch (final IOException e) {
        LOG.warn(e);
        throw new BadRequestException(e.getMessage());
      } catch (final SAXException e) {
        LOG.warn(e);
        throw new BadRequestException(e.getMessage());
      } catch (final ParserConfigurationException e) {
        LOG.warn(e);
        throw new BadRequestException(e.getMessage());
      }

      final Element root = doc.getDocumentElement();
      final String ns = root.getNamespaceURI();
      if (ns == null || !ns.equals(Atom.NAMESPACE_STRING)) {
        throw new BadRequestException(
            "Any content posted with the Atom mime type must be in the Atom namespace.");
      }

      if ("feed".equals(root.getLocalName())) {
        DocumentImpl feedDoc = null;
        final TransactionManager transact = broker.getBrokerPool().getTransactionManager();
        final Txn transaction = transact.beginTransaction();
        try {
          if (collection != null) {
            feedDoc = collection.getDocument(broker, FEED_DOCUMENT_URI);
            if (feedDoc != null) {
              throw new PermissionDeniedException(
                  "Collection at " + request.getPath()
                      + " already exists.");
            }
          } else {
            collection = broker.getOrCreateCollection(transaction, pathUri);
            setPermissions(broker, root, collection);
            broker.saveCollection(transaction, collection);
          }

          final String id = UUIDGenerator.getUUID();
          DOM.replaceTextElement(root,
              Atom.NAMESPACE_STRING,
              "updated", currentDateTime, true);
          DOM.replaceTextElement(root,
              Atom.NAMESPACE_STRING,
              "id", "urn:uuid:" + id, true);
         
          Element editLink = findLink(root, "edit");
          if (editLink != null) {
            throw new BadRequestException(
                "An edit link relation cannot be specified in the feed.");
          }
          editLink = doc.createElementNS(Atom.NAMESPACE_STRING, "link");
          editLink.setAttribute("rel", "edit");
          editLink.setAttribute("type", Atom.MIME_TYPE);
          editLink.setAttribute("href", "#");
          root.appendChild(editLink);

          Element selfLink = findLink(root, "self");
          if (selfLink != null) {
            throw new BadRequestException(
                "A self link relation cannot be specified in the feed.");
          }
          selfLink = doc.createElementNS(Atom.NAMESPACE_STRING, "link");
          selfLink.setAttribute("rel", "self");
          selfLink.setAttribute("type", Atom.MIME_TYPE);
          selfLink.setAttribute("href", "#");
          root.appendChild(selfLink);

          final IndexInfo info = collection.validateXMLResource(transaction, broker, FEED_DOCUMENT_URI, doc);
          setPermissions(broker, root, info.getDocument());
          // TODO : We should probably unlock the collection here
          collection.store(transaction, broker, info, doc, false);
          transact.commit(transaction);
          response.setStatusCode(204);
          response.setHeader("Location", request.getModuleBase() + request.getPath());

        } catch (final IOException ex) {
          transact.abort(transaction);
          throw new EXistException("IO error: " + ex.getMessage(), ex);
        } catch (final TriggerException ex) {
          transact.abort(transaction);
          throw new EXistException("Trigger failed: " + ex.getMessage(), ex);
        } catch (final SAXException ex) {
          transact.abort(transaction);
          throw new EXistException("SAX error: " + ex.getMessage(), ex);
        } catch (final LockException ex) {
          transact.abort(transaction);
          throw new EXistException("Cannot acquire write lock.", ex);
        } finally {
                    transact.close(transaction);
                }
      } else if ("entry".equals(root.getLocalName())) {

        if (collection == null) {
          throw new BadRequestException("Collection "
              + request.getPath() + " does not exist.");
        }

        LOG.debug("Adding entry to " + request.getPath());
        DocumentImpl feedDoc = null;
        feedDoc = collection.getDocument(broker, FEED_DOCUMENT_URI);

        if (!feedDoc.getPermissions().validate(broker.getSubject(), Permission.WRITE))
          {throw new PermissionDeniedException(
              "Permission denied to update feed " + collection.getURI());}

        final TransactionManager transact = broker.getBrokerPool().getTransactionManager();
        final Txn transaction = transact.beginTransaction();
        final String uuid = UUIDGenerator.getUUID();
        final String id = "urn:uuid:" + uuid;
        final Element publishedE = DOM.replaceTextElement(root,
            Atom.NAMESPACE_STRING, "published", currentDateTime, true, true);
        DOM.replaceTextElement(root, Atom.NAMESPACE_STRING, "updated", currentDateTime, true, true);
        DOM.replaceTextElement(root, Atom.NAMESPACE_STRING, "id", id, true, true);

        Element editLink = findLink(root, "edit");
        final Element editLinkSrc = findLink(root, "edit-media");
        if (editLink != null || editLinkSrc != null) {
          throw new BadRequestException(
              "An edit link relation cannot be specified in the entry.");
        }
        editLink = doc.createElementNS(Atom.NAMESPACE_STRING, "link");
        editLink.setAttribute("rel", "edit");
        editLink.setAttribute("type", Atom.MIME_TYPE);
        editLink.setAttribute("href", "?id=" + id);
        final Node next = publishedE.getNextSibling();
        if (next == null) {
          root.appendChild(editLink);
        } else {
          root.insertBefore(editLink, next);
        }

        try {
          // get the feed
          LOG.debug("Acquiring lock on feed document...");
          final ElementImpl feedRoot = (ElementImpl) feedDoc.getDocumentElement();

          // Lock the feed
          feedDoc.getUpdateLock().acquire(Lock.WRITE_LOCK);

          // Append the entry
          collection = broker.getOrCreateCollection(transaction, pathUri.append(ENTRY_COLLECTION_URI));
          setPermissions(broker, root, collection);
          broker.saveCollection(transaction, collection);
          final XmldbURI entryURI = entryURI(uuid);
          final DocumentImpl entryDoc = collection.getDocument(broker, entryURI);
          if (entryDoc != null) {
            throw new PermissionDeniedException("Entry with " + id
                + " already exists.");
          }
          final IndexInfo info = collection.validateXMLResource(transaction, broker, entryURI, doc);
          setPermissions(broker, root, info.getDocument());
          // TODO : We should probably unlock the collection here
          collection.store(transaction, broker, info, doc, false);

          // Update the updated element
          DOMDB.replaceTextElement(transaction, feedRoot,
              Atom.NAMESPACE_STRING, "updated", currentDateTime,
              true);

          // Store the changes
          LOG.debug("Storing change...");
          broker.storeXMLResource(transaction, feedDoc);
          transact.commit(transaction);

          LOG.debug("Done!");

          //XXX: response outside of try-block
          response.setStatusCode(201);
          response.setHeader("Location", request.getModuleBase()
              + request.getPath() + "?id=" + id);
          getEntryById(broker, request.getPath(), id, response);
          /*
           * response.setContentType(Atom.MIME_TYPE+"; charset="+charset
           * ); OutputStreamWriter w = new
           * OutputStreamWriter(response.getOutputStream(),charset);
           * Transformer identity =
           * TransformerFactory.newInstance().newTransformer();
           * identity.transform(new DOMSource(doc),new
           * StreamResult(w)); w.flush(); w.close();
           */
        } catch (final IOException ex) {
          transact.abort(transaction);
          throw new EXistException("IO error: " + ex.getMessage(), ex);
        } catch (final TriggerException ex) {
          transact.abort(transaction);
          throw new EXistException("Trigger failed: "
              + ex.getMessage(), ex);
        } catch (final SAXException ex) {
          transact.abort(transaction);
          throw new EXistException("SAX error: " + ex.getMessage(),
              ex);
        } catch (final LockException ex) {
          transact.abort(transaction);
          throw new EXistException("Cannot acquire write lock.", ex);
          /*
           * } catch (IOException ex) { throw new
           * EXistException("Internal error while serializing result."
           * ,ex); } catch (TransformerException ex) { throw new
           * EXistException("Serialization error.",ex);
           */
        } finally {
                    transact.close(transaction);
          if (feedDoc != null)
            {feedDoc.getUpdateLock().release(Lock.WRITE_LOCK);}
        }
      } else {
        throw new BadRequestException(
            "Unexpected element: {http://www.w3.org/2005/Atom}" + root.getLocalName());
      }

    } else {
      if (collection == null)
        {throw new BadRequestException("Collection " + request.getPath() + " does not exist.");}

      final DocumentImpl feedDoc = collection.getDocument(broker, FEED_DOCUMENT_URI);
      if (feedDoc == null)
        {throw new BadRequestException("Feed at " + request.getPath() + " does not exist.");}

      if (!feedDoc.getPermissions().validate(broker.getSubject(), Permission.WRITE))
        {throw new PermissionDeniedException(
            "Permission denied to update feed " + collection.getURI());}

      String filename = request.getHeader("Slug");
      if (filename == null) {
        final String ext = MimeTable.getInstance().getPreferredExtension(mime);
        int count = 1;
        while (filename == null) {
          filename = "resource" + count + ext;
         
          if (collection.getDocument(broker, XmldbURI.create(filename)) != null)
            {filename = null;}

          count++;
        }
      }

      final TransactionManager transact = broker.getBrokerPool().getTransactionManager();
      final Txn transaction = transact.beginTransaction();
      try {
        final XmldbURI docUri = XmldbURI.create(filename);
        if (collection.getDocument(broker, docUri) != null) {
          transact.abort(transaction);
          throw new BadRequestException("Resource " + docUri + " already exists in collection " + pathUri);
        }

        final File tempFile = storeInTemporaryFile(request.getInputStream(), request.getContentLength());

        if (mime.isXMLType()) {
          InputStream is = new FileInputStream(tempFile);
         
          final IndexInfo info = collection.validateXMLResource(
              transaction, broker, docUri,
              new InputSource(new InputStreamReader(is, charset)));
         
          is.close();
          info.getDocument().getMetadata().setMimeType(contentType);
          is = new FileInputStream(tempFile);
         
          collection.store(transaction, broker, info,
              new InputSource(new InputStreamReader(is, charset)), false);
         
          is.close();
        } else {
          final FileInputStream is = new FileInputStream(tempFile);
          collection.addBinaryResource(transaction, broker, docUri, is, contentType, tempFile.length());
          is.close();
        }

        try {
          LOG.debug("Acquiring lock on feed document...");
          feedDoc.getUpdateLock().acquire(Lock.WRITE_LOCK);
         
          String title = request.getHeader("Title");
          if (title == null)
            {title = filename;}

          final String created = DateFormatter.toXSDDateTime(new Date());
          final ElementImpl feedRoot = (ElementImpl) feedDoc.getDocumentElement();
          DOMDB.replaceTextElement(transaction, feedRoot, Atom.NAMESPACE_STRING, "updated", created, true);
          final String uuid = UUIDGenerator.getUUID();
          final String id = "urn:uuid:" + uuid;
          final Element mediaEntry = generateMediaEntry(id, created, title, filename, mime.getName());

          collection = broker.getOrCreateCollection(transaction, pathUri.append(ENTRY_COLLECTION_URI));
          broker.saveCollection(transaction, collection);
          final XmldbURI entryURI = entryURI(uuid);

          final DocumentImpl entryDoc = collection.getDocument(broker, entryURI);
          if (entryDoc != null)
            {throw new PermissionDeniedException("Entry with " + id + " already exists.");}

          final IndexInfo info = collection.validateXMLResource(transaction, broker, entryURI, mediaEntry);
          // TODO : We should probably unlock the collection here
          collection.store(transaction, broker, info, mediaEntry, false);
          // Update the updated element
          DOMDB.replaceTextElement(
              transaction, feedRoot, Atom.NAMESPACE_STRING, "updated",
              currentDateTime, true);
         
          LOG.debug("Storing change...");
          broker.storeXMLResource(transaction, feedDoc);
          transact.commit(transaction);
         
          LOG.debug("Done!");
         
          //XXX: response outside ty-block
          response.setStatusCode(201);
          response.setHeader("Location", request.getModuleBase() + request.getPath() + "?id=" + id);
          response.setContentType(Atom.MIME_TYPE + "; charset=" + charset);
          final OutputStreamWriter w = new OutputStreamWriter(response.getOutputStream(), charset);
          final Transformer identity = TransformerFactory.newInstance().newTransformer();
          identity.transform(new DOMSource(mediaEntry), new StreamResult(w));
          w.flush();
          w.close();

        } catch (final ParserConfigurationException ex) {
          transact.abort(transaction);
          throw new EXistException("DOM implementation is misconfigured.", ex);
        } catch (final TransformerException ex) {
          throw new EXistException("Serialization error.", ex);
        } catch (final LockException ex) {
          transact.abort(transaction);
          throw new EXistException("Cannot acquire write lock.", ex);
        } finally {
                    transact.close(transaction);
          if (feedDoc != null)
            {feedDoc.getUpdateLock().release(Lock.WRITE_LOCK);}
        }

      } catch (final IOException ex) {
        transact.abort(transaction);
        throw new EXistException("I/O error while handling temporary files.", ex);
      } catch (final SAXParseException e) {
        transact.abort(transaction);
        throw new BadRequestException("Parsing exception at "
            + e.getLineNumber() + "/" + e.getColumnNumber() + ": "
            + e.toString());
      } catch (final TriggerException e) {
        transact.abort(transaction);
        throw new PermissionDeniedException(e.getMessage());
      } catch (SAXException e) {
        transact.abort(transaction);
        Exception o = e.getException();
        if (o == null)
          {o = e;}
       
        throw new BadRequestException("Parsing exception: " + o.getMessage());
     
      } catch (final LockException e) {
        transact.abort(transaction);
        throw new PermissionDeniedException(e.getMessage());
      } finally {
View Full Code Here

       
        docBuilder = docFactory.newDocumentBuilder();
        doc = docBuilder.parse(src);
      } catch (final IOException e) {
        LOG.warn(e);
        throw new BadRequestException(e.getMessage());
      } catch (final SAXException e) {
        LOG.warn(e);
        throw new BadRequestException(e.getMessage());
      } catch (final ParserConfigurationException e) {
        LOG.warn(e);
        throw new BadRequestException(e.getMessage());
      }

      final Element root = doc.getDocumentElement();
      final String ns = root.getNamespaceURI();
      if (ns == null || !ns.equals(Atom.NAMESPACE_STRING)) {
        throw new BadRequestException(
          "Any content posted with the Atom mime type must be in the Atom namespace.");
      }

      if ("feed".equals(root.getLocalName())) {
        DocumentImpl feedDoc = collection.getDocument(broker, FEED_DOCUMENT_URI);
        if (feedDoc == null)
          {throw new BadRequestException("Collection at "
              + request.getPath() + " does not exist.");}

        feedDoc = collection.getDocument(broker, FEED_DOCUMENT_URI);
        if (!feedDoc.getPermissions().validate(broker.getSubject(), Permission.WRITE))
          {throw new PermissionDeniedException(
              "Permission denied to update feed "
                  + collection.getURI());}

        if (DOM.findChild(root, Atom.NAMESPACE_STRING, "title") == null)
          {throw new BadRequestException(
              "The feed metadata sent does not contain a title.");}

        if (!feedDoc.getPermissions().validate(broker.getSubject(), Permission.WRITE))
          {throw new PermissionDeniedException(
              "Permission denied to update feed "
                  + collection.getURI());}

        final TransactionManager transact = broker.getBrokerPool().getTransactionManager();
        final Txn transaction = transact.beginTransaction();
        try {
          feedDoc.getUpdateLock().acquire(Lock.WRITE_LOCK);
          final ElementImpl feedRoot = (ElementImpl) feedDoc.getDocumentElement();

          // Modify the feed by merging the new feed-level elements
          mergeFeed(broker, transaction, feedRoot, root, DateFormatter.toXSDDateTime(new Date()));

          // Store the feed
          broker.storeXMLResource(transaction, feedDoc);
          transact.commit(transaction);
          response.setStatusCode(204);

        } catch (final LockException ex) {
          transact.abort(transaction);
          throw new EXistException("Cannot acquire write lock.", ex);
        } catch (final RuntimeException ex) {
          transact.abort(transaction);
          throw ex;
        } finally {
                    transact.close(transaction);
          if (feedDoc != null)
            {feedDoc.getUpdateLock().release(Lock.WRITE_LOCK);}
        }

      } else if ("entry".equals(root.getLocalName())) {
        if (collection == null)
          {throw new BadRequestException("Collection " + request.getPath() + " does not exist.");}

        final String id = request.getParameter("id");
        if (id == null)
          {throw new BadRequestException(
              "The 'id' parameter for the entry is missing.");}

        LOG.debug("Updating entry " + id + " in collection " + request.getPath());
        DocumentImpl feedDoc = null;
        DocumentImpl entryDoc = null;
        final TransactionManager transact = broker.getBrokerPool().getTransactionManager();
        final Txn transaction = transact.beginTransaction();

        try {
          // Get the feed
          LOG.debug("Acquiring lock on feed document...");
          feedDoc = collection.getDocument(broker, FEED_DOCUMENT_URI);
          if (!feedDoc.getPermissions().validate(broker.getSubject(), Permission.WRITE))
            {throw new PermissionDeniedException(
                "Permission denied to update feed "
                    + collection.getURI());}
         
          feedDoc.getUpdateLock().acquire(Lock.WRITE_LOCK);

          // Find the entry
          final String uuid = id.substring(9);
          collection = broker.getCollection(pathUri.append(ENTRY_COLLECTION_URI));
          final XmldbURI entryURI = entryURI(uuid);
          entryDoc = collection.getDocument(broker, entryURI);
          if (entryDoc == null)
            {throw new BadRequestException(
                "Cannot find entry with id " + id);}

          // Lock the entry
          entryDoc.getUpdateLock().acquire(Lock.WRITE_LOCK);

          final Element entry = entryDoc.getDocumentElement();

          mergeEntry(transaction, (ElementImpl) entry, root, currentDateTime);

          // Update the feed time
          DOMDB.replaceTextElement(transaction,
              (ElementImpl) feedDoc.getDocumentElement(),
              Atom.NAMESPACE_STRING, "updated", currentDateTime,
              true);

          // Store the feed
          broker.storeXMLResource(transaction, feedDoc);
          broker.storeXMLResource(transaction, entryDoc);
          transact.commit(transaction);

          // Send back the changed entry
          response.setStatusCode(200);
          getEntryById(broker, request.getPath(), id, response);
          /*
           * response.setStatusCode(200);
           * response.setContentType(Atom.
           * MIME_TYPE+"; charset="+charset); OutputStreamWriter w =
           * new
           * OutputStreamWriter(response.getOutputStream(),charset);
           * Transformer identity =
           * TransformerFactory.newInstance().newTransformer();
           * identity.transform(new DOMSource(entry),new
           * StreamResult(w)); w.flush(); w.close();
           */
        } catch (final LockException ex) {
          transact.abort(transaction);
          throw new EXistException("Cannot acquire write lock.", ex);
          /*
           * } catch (IOException ex) { throw new EXistException(
           * "I/O exception during serialization of entry response."
           * ,ex); } catch (TransformerException ex) { throw new
           * EXistException("Serialization error.",ex);
           */
        } finally {
                    transact.close(transaction);
          if (feedDoc != null)
            {feedDoc.getUpdateLock().release(Lock.WRITE_LOCK);}

          if (entryDoc != null)
            {entryDoc.getUpdateLock().release(Lock.WRITE_LOCK);}
        }

      } else {
        throw new BadRequestException(
            "Unexpected element: {http://www.w3.org/2005/Atom}"
                + root.getLocalName());
      }

    } else {
      final TransactionManager transact = broker.getBrokerPool().getTransactionManager();
      final Txn transaction = transact.beginTransaction();
      try {
        final XmldbURI docUri = pathUri.lastSegment();
        final XmldbURI collUri = pathUri.removeLastSegment();

        if (docUri == null || collUri == null) {
          transact.abort(transaction);
          throw new BadRequestException("The path is not valid: "
              + request.getPath());
        }

        collection = broker.getCollection(collUri);
        if (collection == null) {
          transact.abort(transaction);
          throw new BadRequestException(
              "The collection does not exist: " + collUri);
        }

        if (collection.getDocument(broker, docUri) == null) {
          transact.abort(transaction);
          throw new BadRequestException("Resource " + docUri
              + " does not exist in collection " + collUri);
        }

        final File tempFile = storeInTemporaryFile(request.getInputStream(),
            request.getContentLength());

        if (mime.isXMLType()) {
          InputStream is = new FileInputStream(tempFile);
         
          final IndexInfo info = collection.validateXMLResource(
              transaction, broker, docUri,
              new InputSource(new InputStreamReader(is, charset)));
         
          is.close();
         
          info.getDocument().getMetadata().setMimeType(contentType);
         
          is = new FileInputStream(tempFile);
         
          collection.store(transaction, broker, info,
            new InputSource(new InputStreamReader(is, charset)), false);
         
          is.close();
        } else {
          final FileInputStream is = new FileInputStream(tempFile);
          collection.addBinaryResource(transaction, broker, docUri,
              is, contentType, tempFile.length());
          is.close();
        }

        transact.commit(transaction);

        // TODO: Change the entry updated and send back the change?
        response.setStatusCode(200);

      } catch (final IOException ex) {
        transact.abort(transaction);
        throw new EXistException("I/O error while handling temporary files.", ex);
      } catch (final SAXParseException e) {
        transact.abort(transaction);
        throw new BadRequestException("Parsing exception at "
            + e.getLineNumber() + "/" + e.getColumnNumber() + ": "
            + e.toString());
      } catch (final TriggerException e) {
        transact.abort(transaction);
        throw new PermissionDeniedException(e.getMessage());
      } catch (SAXException e) {
        transact.abort(transaction);
       
        Exception o = e.getException();
        if (o == null)
          {o = e;}
       
        throw new BadRequestException("Parsing exception: " + o.getMessage());
      } catch (final LockException e) {
        transact.abort(transaction);
        throw new PermissionDeniedException(e.getMessage());
      } finally {
                transact.close(transaction);
View Full Code Here

   
    final XmldbURI pathUri = XmldbURI.create(request.getPath());
    XmldbURI srcUri = null;
    final Collection collection = broker.getCollection(pathUri);
    if (collection == null)
      {throw new BadRequestException("Collection " + request.getPath() + " does not exist.");}

    final String id = request.getParameter("id");
    if (id == null) {
      // delete collection
      final TransactionManager transact = broker.getBrokerPool().getTransactionManager();
      final Txn transaction = transact.beginTransaction();
      try {
        broker.removeCollection(transaction, collection);
        transact.commit(transaction);
        response.setStatusCode(204);
      } finally {
        transact.close(transaction);
      }
      return;
    }

    LOG.info("Deleting entry " + id + " in collection " + request.getPath());
    DocumentImpl feedDoc = null;
    final TransactionManager transact = broker.getBrokerPool().getTransactionManager();
    final Txn transaction = transact.beginTransaction();
    final String currentDateTime = DateFormatter.toXSDDateTime(new Date());
    try {
      // Get the feed
      // LOG.info("Acquiring lock on feed document...");
      feedDoc = collection.getDocument(broker, FEED_DOCUMENT_URI);
      if (!feedDoc.getPermissions().validate(broker.getSubject(), Permission.WRITE))
        {throw new PermissionDeniedException(
            "Permission denied to update feed "
                + collection.getURI());}
      feedDoc.getUpdateLock().acquire(Lock.WRITE_LOCK);

      // Find the entry
      final String uuid = id.substring(9);
      final Collection entryCollection = broker.getCollection(pathUri.append(ENTRY_COLLECTION_URI));
      final XmldbURI entryURI = entryURI(uuid);
      final DocumentImpl entryDoc = entryCollection.getDocument(broker, entryURI);
      if (entryDoc == null)
        {throw new BadRequestException("Entry with id " + id + " cannot be found.");}

      final Element entry = entryDoc.getDocumentElement();

      // Remove the media resource if there is one
      final Element content = DOM.findChild(entry, Atom.NAMESPACE_STRING, "content");
View Full Code Here

TOP

Related Classes of org.exist.http.BadRequestException

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.