You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by sn...@apache.org on 2006/09/17 00:04:16 UTC
svn commit: r446961 - in
/incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol:
AtomHandler.java AtomService.java AtomServlet.java RollerAtomHandler.java
Author: snoopdave
Date: Sat Sep 16 15:04:15 2006
New Revision: 446961
URL: http://svn.apache.org/viewvc?view=rev&rev=446961
Log:
Atom protocol draft 10 support: title element, categories and slug header
Modified:
incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/AtomHandler.java
incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/AtomService.java
incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/AtomServlet.java
incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/RollerAtomHandler.java
Modified: incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/AtomHandler.java
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/AtomHandler.java?view=diff&rev=446961&r1=446960&r2=446961
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/AtomHandler.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/AtomHandler.java Sat Sep 16 15:04:15 2006
@@ -79,7 +79,7 @@
* @param data Binary data representing uploaded content
*/
public Entry postMedia(
- String[] pathInfo, String name, String contentType, InputStream is) throws AtomException;
+ String[] pathInfo, String title, String slug, String contentType, InputStream is) throws AtomException;
/**
* Update the media file part of a media-link entry.
Modified: incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/AtomService.java
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/AtomService.java?view=diff&rev=446961&r1=446960&r2=446961
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/AtomService.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/AtomService.java Sat Sep 16 15:04:15 2006
@@ -19,17 +19,18 @@
import java.util.ArrayList;
import java.util.Iterator;
+import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Set;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.Namespace;
-import org.jdom.filter.Filter;
/**
- * This class models an Atom workspace.
+ * This class models an Atom Ublishing Protocol Service Document.
* <p />
- * Based on: draft-ietf-atompub-protocol-08.txt + PaceMediaEntries5
+ * Based on: draft-ietf-atompub-protocol-10.txt
* <p />
* Designed to be Roller independent.
*//*
@@ -40,8 +41,6 @@
* & extensionElement* )
* }
*
- * Here is an example Atom workspace:
- *
* <?xml version="1.0" encoding='utf-8'?>
* <service xmlns="http://purl.org/atom/app#">
* <workspace title="Main Site" >
@@ -60,8 +59,10 @@
*/
public class AtomService {
public static final Namespace ns =
- Namespace.getNamespace("http://purl.org/atom/app#");
-
+ Namespace.getNamespace("app","http://purl.org/atom/app#");
+ public static final Namespace atomns =
+ Namespace.getNamespace("atom","http://www.w3.org/2005/atom");
+
private List workspaces = new ArrayList();
public AtomService() {
@@ -88,19 +89,18 @@
*/
public static class Workspace {
private String title = null;
- private List collections = new ArrayList();
+ private String titleType = null; // may be TEXT, HTML, XHTML
+ private Set collections = new LinkedHashSet();
public Workspace() {
}
- public List getCollections() {
- return collections;
- }
-
- public void setCollections(List collections) {
- this.collections = collections;
+ /** Iterate over collections in workspace */
+ public Iterator getCollections() {
+ return collections.iterator();
}
+ /** Add new collection to workspace */
public void addCollection(AtomService.Collection col) {
collections.add(col);
}
@@ -113,6 +113,14 @@
public void setTitle(String title) {
this.title = title;
}
+
+ public String getTitleType() {
+ return titleType;
+ }
+
+ public void setTitleType(String titleType) {
+ this.titleType = titleType;
+ }
}
/**
@@ -130,9 +138,11 @@
*/
public static class Collection {
private String title = null;
+ private String titleType =null; // may be TEXT, HTML, XHTML
private String accept = "entry";
private String listTemplate = null;
private String href = null;
+ private Set categories = new LinkedHashSet(); // of Categories objects
public Collection() {
}
@@ -167,6 +177,93 @@
public void setTitle(String title) {
this.title = title;
}
+
+ public String getTitleType() {
+ return titleType;
+ }
+
+ public void setTitleType(String titleType) {
+ this.titleType = titleType;
+ }
+
+ /** Workspace can have multiple Categories objects */
+ public void addCategories(Categories cats) {
+ categories.add(cats);
+ }
+
+ /** Iterate over Categories objects in Collection */
+ public Iterator getCategories() {
+ return categories.iterator();
+ }
+ }
+
+ /** Categories object contains Category objects */
+ public static class Categories {
+ private Set categories = new LinkedHashSet(); // of Category objects
+ private String scheme = null;
+ private boolean fixed = false;
+
+ /** Add category list of those specified*/
+ public void addCategory(Category cat) {
+ categories.add(cat);
+ }
+
+ /** Iterate over Category objects */
+ public Iterator getCategories() {
+ return categories.iterator();
+ }
+
+ /** True if clients MUST use one of the categories specified */
+ public boolean isFixed() {
+ return fixed;
+ }
+
+ /** True if clients MUST use one of the categories specified */
+ public void setFixed(boolean fixed) {
+ this.fixed = fixed;
+ }
+
+ /** Category URI scheme to use for Categories without a scheme */
+ public String getScheme() {
+ return scheme;
+ }
+
+ /** Category URI scheme to use for Categories without a scheme */
+ public void setScheme(String scheme) {
+ this.scheme = scheme;
+ }
+ }
+
+
+ /** Represents an <atom:category> object */
+ public static class Category {
+ private String term;
+ private String scheme;
+ private String label;
+
+ public String getTerm() {
+ return term;
+ }
+
+ public void setTerm(String term) {
+ this.term = term;
+ }
+
+ public String getScheme() {
+ return scheme;
+ }
+
+ public void setScheme(String scheme) {
+ this.scheme = scheme;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public void setLabel(String label) {
+ this.label = label;
+ }
}
/** Deserialize an Atom service XML document into an object */
@@ -198,7 +295,13 @@
/** Deserialize a Atom workspace XML element into an object */
public static AtomService.Workspace elementToWorkspace(Element element) {
AtomService.Workspace space = new AtomService.Workspace();
- space.setTitle(element.getAttribute("title").getValue());
+
+ Element titleElem = element.getChild("title", atomns);
+ space.setTitle(titleElem.getText());
+ if (titleElem.getAttribute("type", atomns) != null) {
+ space.setTitleType(titleElem.getAttribute("type", atomns).getValue());
+ }
+
List collections = element.getChildren("collection", ns);
Iterator iter = collections.iterator();
while (iter.hasNext()) {
@@ -210,10 +313,16 @@
/** Serialize an AtomService.Workspace object into an XML element */
public static Element workspaceToElement(Workspace space) {
- Namespace ns = Namespace.getNamespace("http://purl.org/atom/app#");
Element element = new Element("workspace", ns);
- element.setAttribute("title", space.getTitle());
- Iterator iter = space.getCollections().iterator();
+
+ Element title = new Element("title", atomns);
+ title.setText(space.getTitle());
+ element.addContent(title);
+ if (space.getTitleType() != null && !space.getTitleType().equals("TEXT")) {
+ element.setAttribute("type", space.getTitleType(), atomns);
+ }
+
+ Iterator iter = space.getCollections();
while (iter.hasNext()) {
AtomService.Collection col = (AtomService.Collection) iter.next();
element.addContent(collectionToElement(col));
@@ -224,21 +333,79 @@
/** Deserialize an Atom service collection XML element into an object */
public static AtomService.Collection elementToCollection(Element element) {
AtomService.Collection collection = new AtomService.Collection();
- collection.setTitle(element.getAttribute("title").getValue());
collection.setHref(element.getAttribute("href").getValue());
+
+ Element titleElem = element.getChild("title", atomns);
+ if (titleElem != null) {
+ collection.setTitle(titleElem.getText());
+ if (titleElem.getAttribute("type", atomns) != null) {
+ collection.setTitleType(titleElem.getAttribute("type", atomns).getValue());
+ }
+ }
+
Element memberType = element.getChild("accept", ns);
if (memberType != null) {
collection.setAccept(memberType.getText());
}
+
+ // Loop to parse <app:categories> element to Categories objects
+ List catsElems = element.getChildren("categories", ns);
+ for (Iterator catsIter = catsElems.iterator(); catsIter.hasNext();) {
+ Element catsElem = (Element) catsIter.next();
+ Categories cats = new Categories();
+ if ("yes".equals(catsElem.getAttribute("fixed", ns))) {
+ cats.setFixed(true);
+ }
+ // Loop to parse <atom:category> elemenents to Category objects
+ List catElems = catsElem.getChildren("category", atomns);
+ for (Iterator catIter = catElems.iterator(); catIter.hasNext();) {
+ Element catElem = (Element) catIter.next();
+ Category cat = new Category();
+ cat.setTerm(catElem.getAttributeValue("term", atomns));
+ cat.setLabel(catElem.getAttributeValue("label", atomns));
+ cat.setScheme(catElem.getAttributeValue("scheme", atomns));
+ cats.addCategory(cat);
+ }
+ collection.addCategories(cats);
+ }
return collection;
}
/** Serialize an AtomService.Collection object into an XML element */
public static Element collectionToElement(AtomService.Collection collection) {
- Namespace ns = Namespace.getNamespace("http://purl.org/atom/app#");
Element element = new Element("collection", ns);
- element.setAttribute("title", collection.getTitle());
element.setAttribute("href", collection.getHref());
+
+ Element title = new Element("title", atomns);
+ title.setText(collection.getTitle());
+ element.addContent(title);
+ if (collection.getTitleType() != null && !collection.getTitleType().equals("TEXT")) {
+ element.setAttribute("type", collection.getTitleType(), atomns);
+ }
+
+ // Loop to create <app:categories> elements
+ for (Iterator it = collection.getCategories(); it.hasNext();) {
+ Categories cats = (Categories)it.next();
+ Element catsElem = new Element("categories", ns);
+ catsElem.setAttribute("fixed", cats.isFixed() ? "yes" : "no", ns);
+ if (cats.getScheme() != null) {
+ catsElem.setAttribute("scheme", cats.getScheme(), ns);
+ }
+ // Loop to create <atom:category> elements
+ for (Iterator catIter = cats.getCategories(); catIter.hasNext();) {
+ Category cat = (Category) catIter.next();
+ Element catElem = new Element("category", atomns);
+ catElem.setAttribute("term", cat.getTerm(), atomns);
+ if (cat.getScheme() != null) { // optional
+ catElem.setAttribute("scheme", cat.getScheme(), atomns);
+ }
+ if (cat.getLabel() != null) { // optional
+ catElem.setAttribute("label", cat.getLabel(), atomns);
+ }
+ catsElem.addContent(catElem);
+ }
+ element.addContent(catsElem);
+ }
Element memberType = new Element("accept", ns);
memberType.setText(collection.getAccept());
@@ -246,4 +413,5 @@
return element;
}
-}
\ No newline at end of file
+}
+
Modified: incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/AtomServlet.java
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/AtomServlet.java?view=diff&rev=446961&r1=446960&r2=446961
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/AtomServlet.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/AtomServlet.java Sat Sep 16 15:04:15 2006
@@ -183,12 +183,13 @@
writer.close();
} else if (req.getContentType() != null) {
- // get incoming file name from HTTP header
+ // get incoming title and slug from HTTP header
String title = req.getHeader("Title");
+ String slug = req.getHeader("Slug");
// hand input stream of to hander to post file
Entry resource = handler.postMedia(
- pathInfo, title, req.getContentType(), req.getInputStream());
+ pathInfo, title, slug, req.getContentType(), req.getInputStream());
res.setStatus(HttpServletResponse.SC_CREATED);
com.sun.syndication.feed.atom.Content content =
Modified: incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/RollerAtomHandler.java
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/RollerAtomHandler.java?view=diff&rev=446961&r1=446960&r2=446961
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/RollerAtomHandler.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/webservices/atomprotocol/RollerAtomHandler.java Sat Sep 16 15:04:15 2006
@@ -165,6 +165,7 @@
List perms = null;
try {
perms = mRoller.getUserManager().getAllPermissions(user);
+
} catch (RollerException re) {
throw new AtomException("ERROR: getting user's weblogs", re);
}
@@ -186,9 +187,24 @@
entryCol.setTitle("Weblog Entries");
entryCol.setAccept("entry");
entryCol.setHref(URLUtilities.getAtomProtocolURL(true)+"/"+handle+"/entries");
+ try {
+ AtomService.Categories cats = new AtomService.Categories();
+ cats.setFixed(true);
+ cats.setScheme(URLUtilities.getWeblogURL(perm.getWebsite(), null, true));
+ List rollerCats = mRoller.getWeblogManager().getWeblogCategories(perm.getWebsite());
+ for (Iterator it = rollerCats.iterator(); it.hasNext();) {
+ WeblogCategoryData rollerCat = (WeblogCategoryData)it.next();
+ AtomService.Category cat = new AtomService.Category();
+ cat.setTerm(rollerCat.getPath());
+ cat.setLabel(rollerCat.getName());
+ cats.addCategory(cat);
+ }
+ entryCol.addCategories(cats);
+ } catch (Exception e) {
+ throw new AtomException("ERROR fetching weblog categories");
+ }
workspace.addCollection(entryCol);
-
-
+
AtomService.Collection uploadCol = new AtomService.Collection();
uploadCol.setTitle("Media Files");
uploadCol.setAccept(accept);
@@ -601,7 +617,7 @@
* TODO: use Jakarta Commons File-upload?
*/
public Entry postMedia(String[] pathInfo,
- String title, String contentType, InputStream is)
+ String title, String slug, String contentType, InputStream is)
throws AtomException {
try {
// authenticated client posted a weblog entry
@@ -612,10 +628,10 @@
mRoller.getUserManager().getWebsiteByHandle(handle);
if (canEdit(website) && pathInfo.length > 1) {
// save to temp file
- String fileName = createFileName(website, title, contentType);
+ String fileName = createFileName(website, (slug != null) ? slug : title, contentType);
try {
FileManager fmgr = mRoller.getFileManager();
- tempFile = File.createTempFile(fileName,"tmp");
+ tempFile = File.createTempFile(fileName, "tmp");
FileOutputStream fos = new FileOutputStream(tempFile);
Utilities.copyInputToOutput(is, fos);
fos.close();
@@ -724,7 +740,7 @@
String contentType, InputStream is) throws AtomException {
if (pathInfo.length > 2) {
String name = pathInfo[2];
- return postMedia(pathInfo, name, contentType, is);
+ return postMedia(pathInfo, name, name, contentType, is);
}
throw new AtomException("ERROR: bad pathInfo");
}