package org.apache.abdera.examples; import org.apache.abdera.Abdera; import org.apache.abdera.i18n.text.UrlEncoding; import org.apache.abdera.model.Document; import org.apache.abdera.model.Entry; import org.apache.abdera.model.Feed; 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.RequestContext.Scope; 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.ResponseContextException; import org.apache.abdera.protocol.server.context.StreamWriterResponseContext; import org.apache.abdera.protocol.server.impl.AbstractCollectionAdapter; import org.apache.abdera.util.Constants; import org.apache.abdera.writer.StreamWriter; import java.io.IOException; import java.util.Date; import java.util.HashMap; import java.util.Map; @SuppressWarnings("unchecked") public class SimpleAdapter extends AbstractCollectionAdapter { @Override public String getAuthor(RequestContext request) throws ResponseContextException { return "Simple McGee"; } @Override public String getId(RequestContext request) { return "tag:example.org,2008:feed"; } public String getHref(RequestContext request) { Map<String, Object> params = new HashMap<String, Object>(); params.put("collection", "feed"); return request.urlFor(TargetType.TYPE_COLLECTION, params); } public String getTitle(RequestContext request) { return "A simple feed"; } public ResponseContext extensionRequest(RequestContext request) { return ProviderHelper.notallowed(request, "Method Not Allowed", ProviderHelper.getDefaultMethods(request)); } private Document<Feed> getFeedDocument(RequestContext context) throws ResponseContextException { Feed feed = (Feed) context.getAttribute(Scope.SESSION, "feed"); if (feed == null) { feed = createFeedBase(context); feed.setBaseUri(getHref(context)); context.setAttribute(Scope.SESSION, "feed", feed); } return feed.getDocument(); } public ResponseContext getFeed(RequestContext request) { Document<Feed> feed; try { feed = getFeedDocument(request); } catch (ResponseContextException e) { return e.getResponseContext(); } return ProviderHelper.returnBase(feed, 200, feed.getRoot().getUpdated()).setEntityTag(ProviderHelper.calculateEntityTag(feed.getRoot())); } public ResponseContext deleteEntry(RequestContext request) { Entry entry = getAbderaEntry(request); if (entry != null) { entry.discard(); } return ProviderHelper.nocontent(); } public ResponseContext getEntry(RequestContext request) { Entry entry = getAbderaEntry(request); if (entry != null) { Feed feed = entry.getParentElement(); entry = (Entry) entry.clone(); entry.setSource(feed.getAsSource()); Document<Entry> entry_doc = entry.getDocument(); return ProviderHelper.returnBase(entry_doc, 200, entry.getEdited()).setEntityTag(ProviderHelper.calculateEntityTag(entry)); } else { return ProviderHelper.notfound(request); } } public ResponseContext postEntry(RequestContext request) { Abdera abdera = request.getAbdera(); try { Document<Entry> entry_doc = (Document<Entry>) request.getDocument(abdera.getParser()).clone(); if (entry_doc != null) { Entry entry = entry_doc.getRoot(); if (!ProviderHelper.isValidEntry(entry)) { return ProviderHelper.badrequest(request); } setEntryDetails(request, entry, abdera.getFactory().newUuidUri()); Feed feed = getFeedDocument(request).getRoot(); feed.insertEntry(entry); feed.setUpdated(new Date()); BaseResponseContext rc = (BaseResponseContext) ProviderHelper.returnBase(entry_doc, 201, entry.getEdited()); return rc.setLocation(ProviderHelper.resolveBase(request).resolve(entry.getEditLinkResolvedHref()).toString()).setContentLocation(rc.getLocation().toString()).setEntityTag(ProviderHelper.calculateEntityTag(entry)); } else { return ProviderHelper.badrequest(request); } } catch (ParseException pe) { return ProviderHelper.notsupported(request); } catch (ClassCastException cce) { return ProviderHelper.notsupported(request); } catch (Exception e) { return ProviderHelper.badrequest(request); } } private void setEntryDetails(RequestContext request, Entry entry, String id) { entry.setUpdated(new Date()); entry.setEdited(entry.getUpdated()); entry.getIdElement().setValue(id); entry.addLink(getEntryLink(request, entry.getId().toASCIIString()), "edit"); } private String getEntryLink(RequestContext request, String entryid) { Map<String, String> params = new HashMap<String, String>(); params.put("collection", request.getTarget().getParameter("collection")); params.put("entry", entryid); return request.urlFor(TargetType.TYPE_ENTRY, params); } public ResponseContext putEntry(RequestContext request) { Abdera abdera = request.getAbdera(); Entry orig_entry = getAbderaEntry(request); if (orig_entry != null) { try { Document<Entry> entry_doc = (Document<Entry>) request.getDocument(abdera.getParser()).clone(); if (entry_doc != null) { Entry entry = entry_doc.getRoot(); if (!entry.getId().equals(orig_entry.getId())) { return ProviderHelper.conflict(request); } if (!ProviderHelper.isValidEntry(entry)) { return ProviderHelper.badrequest(request); } setEntryDetails(request, entry, orig_entry.getId().toString()); orig_entry.discard(); Feed feed = getFeedDocument(request).getRoot(); feed.insertEntry(entry); feed.setUpdated(new Date()); return ProviderHelper.nocontent(); } else { return ProviderHelper.badrequest(request); } } catch (ParseException pe) { return ProviderHelper.notsupported(request); } catch (ClassCastException cce) { return ProviderHelper.notsupported(request); } catch (Exception e) { return ProviderHelper.badrequest(request); } } else { return ProviderHelper.notfound(request); } } private Entry getAbderaEntry(RequestContext request) { try { return getFeedDocument(request).getRoot().getEntry(getResourceName(request)); } catch (Exception ignored) { } return null; } public String getResourceName(RequestContext request) { if (request.getTarget().getType() != TargetType.TYPE_ENTRY) { return null; } String[] segments = request.getUri().toString().split("/"); return UrlEncoding.decode(segments[segments.length - 1]); } public ResponseContext getCategories(RequestContext request) { return new StreamWriterResponseContext(request.getAbdera()) { protected void writeTo(StreamWriter sw) throws IOException { sw.startDocument().startCategories(false).writeCategory("foo").writeCategory("bar").writeCategory("baz").endCategories().endDocument(); } }.setStatus(200).setContentType(Constants.CAT_MEDIA_TYPE); } }