blob: 93d0a989d5a6ba756f568e856c60eb3cc98239a0 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. The ASF licenses this file to You
* under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License. For additional information regarding
* copyright in this work, please see the NOTICE file in the top level
* directory of this distribution.
*/
package org.apache.abdera.test.security.filter;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
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.ResponseContext;
import org.apache.abdera.protocol.server.TargetType;
import org.apache.abdera.protocol.server.RequestContext.Scope;
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;
@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("feed", 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 = (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, 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("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 e) {
}
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);
}
}