}
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());