blob: a10b8261daa4c98cd64f54c04b7bdb63c86be890 [file] [log] [blame]
package myPackage;
import java.util.Date;
import java.util.List;
import javax.activation.MimeType;
import org.apache.abdera.Abdera;
import org.apache.abdera.factory.StreamBuilder;
import org.apache.abdera.i18n.iri.IRI;
import org.apache.abdera.model.Document;
import org.apache.abdera.model.Entry;
import org.apache.abdera.model.Feed;
import org.apache.abdera.model.Link;
import org.apache.abdera.parser.ParseException;
import org.apache.abdera.protocol.server.ProviderHelper;
import org.apache.abdera.protocol.server.RequestContext;
import org.apache.abdera.protocol.server.ResponseContext;
import org.apache.abdera.protocol.server.TargetType;
import org.apache.abdera.protocol.server.context.BaseResponseContext;
import org.apache.abdera.protocol.server.context.EmptyResponseContext;
import org.apache.abdera.protocol.server.context.ResponseContextException;
import org.apache.abdera.protocol.server.impl.AbstractCollectionAdapter;
import org.apache.abdera.util.MimeTypeHelper;
/**
* The Collection Adapter is the piece that actually implements the business
* logic of the AtomPub server. It bridges the protocol with the backend
* persistence.
*/
public class APP_CollectionAdapter extends AbstractCollectionAdapter {
private static String FEED_TAG = "entries";
private Document feedDocument;
public ResponseContext getFeed(RequestContext request) {
Abdera abdera = request.getAbdera();
Document feed = getFeedDocument(abdera);
return new BaseResponseContext(feed);
}
public ResponseContext postEntry(RequestContext request) {
Abdera abdera = request.getAbdera();
try {
Document entryDocument = constructEntryDocument(request, abdera);
if (entryDocument != null) {
Entry entry = (Entry)entryDocument.getRoot();
manageAnEntry(entry, null, abdera);
BaseResponseContext rc = new BaseResponseContext(entry);
IRI baseUri = ProviderHelper.resolveBase(request);
rc.setLocation(baseUri.resolve(FEED_TAG + "/" + entry.getId()).toString());
rc.setStatus(201); //generate a HTTP 201 response in case of success
return rc;
} else {
return new EmptyResponseContext(400);
}
} catch (ParseException pe) {
return new EmptyResponseContext(415);
} catch (ClassCastException cce) {
return new EmptyResponseContext(415);
} catch (Exception e) {
return new EmptyResponseContext(400);
}
}
public ResponseContext getEntry(RequestContext request) {
Entry entry = (Entry)getAbderaEntry(request);
if (entry != null) {
Document entryDocument = ((Entry)entry.clone()).getDocument();
return new BaseResponseContext(entryDocument);
} else {
return new EmptyResponseContext(404);
}
}
public ResponseContext deleteEntry(RequestContext request) {
Entry entry = getAbderaEntry(request);
if (entry != null) {
entry.discard();
return new EmptyResponseContext(204);
} else {
return new EmptyResponseContext(404);
}
}
public ResponseContext putEntry(RequestContext request) {
Entry origEntry = getAbderaEntry(request);
if (origEntry != null) {
try {
Abdera abdera = request.getAbdera();
Document newEntryDocument = constructEntryDocument(request, abdera);
if (newEntryDocument != null) {
Entry newEntry = (Entry)newEntryDocument.getRoot();
manageAnEntry(newEntry, origEntry, abdera);
return new BaseResponseContext(newEntry);
} else {
return new EmptyResponseContext(400);
}
} catch (ParseException pe) {
return new EmptyResponseContext(415);
} catch (ClassCastException cce) {
return new EmptyResponseContext(415);
} catch (Exception e) {
if ("409".equalsIgnoreCase(e.getMessage())) {
return new EmptyResponseContext(409);
} else {
return new EmptyResponseContext(400);
}
}
} else {
return new EmptyResponseContext(404);
}
}
private synchronized Document getFeedDocument(Abdera abdera) {
if (feedDocument == null) {
feedDocument = initializeFeedDocument(abdera);
}
return feedDocument;
}
private Document initializeFeedDocument(Abdera abdera) {
StreamBuilder out = (StreamBuilder)abdera.getWriterFactory().newStreamWriter("fom");
out.startDocument().startFeed().writeId("http://mile.ee.iisc.ernet.in")
.writeTitle("Latest developments at MILE Lab, IISc :")
.writeUpdated(new Date())
.writeLink(FEED_TAG)
.writeCategory("lab-updates");
out
.startEntry()
.writeId("tts_demo")
.writeTitle("Kannada and Tamil language TTS Web Demo")
.writeLink(FEED_TAG + "/tts_demo")
.writeUpdated(new Date())
.writePublished(new Date())
.writeEdited(new Date())
.writeSummary("Kannada/Tamil language Text-To-Speech (TTS) Demo by MILE Lab, IISc is " +
"available at http://mile.ee.iisc.ernet.in:8080/tts_demo/ ")
.writeAuthor("ShivaHR").endEntry();
out
.startEntry()
.writeId("tamil_ocr")
.writeTitle("Tamil OCR achieves 94.3% accuracy on 1000 scanned pages")
.writeLink(FEED_TAG + "/tamil_ocr")
.writeUpdated(new Date())
.writePublished(new Date())
.writeEdited(new Date())
.writeSummary("Tamil OCR (Optical Character Recognizer) being developed at MILE Lab, IISc " +
"achieves an accuracy of 94.3%! The testing was carried out by CDAC-Pune on " +
"1000 pages scanned from books printed between 1950-2000.")
.writeAuthor("ShivaHR").endEntry();
Document doc = (Document)out.endFeed().endDocument().getBase();
return doc;
}
/**
* Create a skeletal entry, to be filled up later
*/
private Document constructEntryDocument(RequestContext request, Abdera abdera) throws Exception {
MimeType contentType = request.getContentType();
if (contentType != null && !MimeTypeHelper.isAtom(contentType.toString())) {
throw new ParseException();
}
return (Document)request.getDocument(abdera.getParser()).clone();
}
/*
* Utility method to manage the creation or update of an entry.
*/
private void manageAnEntry(Entry currentEntry, Entry originalEntry, Abdera abdera)
throws Exception {
IRI id;
if (originalEntry != null) {
id = originalEntry.getId();
if (!currentEntry.getId().equals(id)) {
throw new Exception("409");
}
originalEntry.discard();
} else {
id = currentEntry.getId();
if (id == null) {
id = new IRI(abdera.getFactory().newUuidUri());
currentEntry.getIdElement().setValue(id.toString());
}
}
currentEntry.setUpdated(new Date());
String hrefValue = FEED_TAG + "/" + id;
List<Link> links = currentEntry.getLinks();
//links.clear(); //doesn't work - throws a java.lang.UnsupportedOperationException!
if (links.size() > 0) {
links.get(0).setHref(hrefValue);
} else {
currentEntry.addLink(hrefValue);
}
Feed feed = (Feed)getFeedDocument(abdera).getRoot();
feed.insertEntry(currentEntry);
feed.setUpdated(new Date());
}
private Entry getAbderaEntry(RequestContext request) {
Abdera abdera = request.getAbdera();
Document feed = getFeedDocument(abdera);
try {
Feed currentFeed = (Feed)feed.getRoot();
return currentFeed.getEntry(getEntryID(request));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* The id of the entry is the last token in the URL. Ugly way of extracting
* it, till I find a better mechanism.
*/
private String getEntryID(RequestContext request) {
if (request.getTarget().getType() != TargetType.TYPE_ENTRY) {
return null;
}
String path = request.getUri().toString();
String[] segments = path.split("/");
return segments[segments.length - 1];
}
public String getAuthor(RequestContext request) throws ResponseContextException {
return "ShivaHR";
}
public String getId(RequestContext request) {
return "blog/entries";
}
public String getTitle(RequestContext request) {
return "Entries";
}
}