From 8f475d9ae11106c02809d6d8537d41cc12b75b76 Mon Sep 17 00:00:00 2001 From: Patrick Gotthard Date: Sat, 12 Oct 2013 00:10:09 +0200 Subject: [PATCH] Formatted code Added Eclipse formatter and cleaup configuration --- cleanup.xml | 56 ++ formatter.xml | 291 ++++++++ .../atom/client/AtomClientFactory.java | 17 +- .../propono/atom/client/AuthStrategy.java | 6 +- .../atom/client/BasicAuthStrategy.java | 17 +- .../atom/client/ClientAtomService.java | 83 +-- .../propono/atom/client/ClientCategories.java | 76 +- .../propono/atom/client/ClientCollection.java | 177 ++--- .../propono/atom/client/ClientEntry.java | 175 +++-- .../propono/atom/client/ClientMediaEntry.java | 257 +++---- .../propono/atom/client/ClientWorkspace.java | 54 +- .../propono/atom/client/EntryIterator.java | 76 +- .../atom/client/GDataAuthStrategy.java | 34 +- .../propono/atom/client/NoAuthStrategy.java | 5 +- .../propono/atom/client/OAuthStrategy.java | 185 +++-- .../propono/atom/common/AtomService.java | 98 ++- .../propono/atom/common/Categories.java | 117 ++- .../propono/atom/common/Collection.java | 212 +++--- .../propono/atom/common/Workspace.java | 106 +-- .../propono/atom/common/rome/AppModule.java | 11 +- .../atom/common/rome/AppModuleGenerator.java | 35 +- .../atom/common/rome/AppModuleImpl.java | 29 +- .../atom/common/rome/AppModuleParser.java | 33 +- .../propono/atom/server/AtomException.java | 14 +- .../propono/atom/server/AtomHandler.java | 61 +- .../atom/server/AtomHandlerFactory.java | 109 ++- .../atom/server/AtomMediaResource.java | 48 +- .../server/AtomNotAuthorizedException.java | 16 +- .../atom/server/AtomNotFoundException.java | 11 +- .../propono/atom/server/AtomRequest.java | 92 +-- .../propono/atom/server/AtomRequestImpl.java | 46 +- .../propono/atom/server/AtomServlet.java | 271 ++++--- .../server/FactoryConfigurationError.java | 97 ++- .../propono/atom/server/FactoryFinder.java | 211 +++--- .../propono/atom/server/SecuritySupport.java | 64 +- .../server/impl/FileBasedAtomHandler.java | 432 ++++++----- .../impl/FileBasedAtomHandlerFactory.java | 18 +- .../server/impl/FileBasedAtomService.java | 202 ++--- .../atom/server/impl/FileBasedCollection.java | 697 +++++++++--------- .../atom/server/impl/FileBasedWorkspace.java | 8 +- .../propono/atom/server/impl/FileStore.java | 74 +- .../propono/blogclient/BaseBlogEntry.java | 145 ++-- .../rometools/propono/blogclient/Blog.java | 131 ++-- .../blogclient/BlogClientException.java | 23 +- .../propono/blogclient/BlogConnection.java | 11 +- .../blogclient/BlogConnectionFactory.java | 100 ++- .../propono/blogclient/BlogEntry.java | 137 ++-- .../propono/blogclient/BlogResource.java | 17 +- .../blogclient/atomprotocol/AtomBlog.java | 222 +++--- .../atomprotocol/AtomCollection.java | 86 ++- .../atomprotocol/AtomConnection.java | 97 ++- .../blogclient/atomprotocol/AtomEntry.java | 169 ++--- .../atomprotocol/AtomEntryIterator.java | 28 +- .../blogclient/atomprotocol/AtomResource.java | 101 +-- .../blogclient/metaweblog/MetaWeblogBlog.java | 297 ++++---- .../metaweblog/MetaWeblogConnection.java | 76 +- .../metaweblog/MetaWeblogEntry.java | 70 +- .../metaweblog/MetaWeblogResource.java | 54 +- .../propono/utils/ProponoException.java | 77 +- .../rometools/propono/utils/Utilities.java | 179 +++-- .../propono/atom/client/AtomClientTest.java | 411 +++++------ .../atom/client/BloggerDotComTest.java | 61 +- .../propono/atom/common/AtomServiceTest.java | 115 ++- .../propono/atom/common/CollectionTest.java | 29 +- .../atom/server/AtomClientServerTest.java | 39 +- .../atom/server/TestAtomHandlerFactory.java | 7 +- .../atom/server/TestAtomHandlerImpl.java | 16 +- .../blogclient/SimpleBlogClientTest.java | 168 ++--- 68 files changed, 3910 insertions(+), 3577 deletions(-) create mode 100644 cleanup.xml create mode 100644 formatter.xml diff --git a/cleanup.xml b/cleanup.xml new file mode 100644 index 0000000..40f9b7a --- /dev/null +++ b/cleanup.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/formatter.xml b/formatter.xml new file mode 100644 index 0000000..e7ba7aa --- /dev/null +++ b/formatter.xml @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/org/rometools/propono/atom/client/AtomClientFactory.java b/src/main/java/org/rometools/propono/atom/client/AtomClientFactory.java index b023155..ba970cf 100644 --- a/src/main/java/org/rometools/propono/atom/client/AtomClientFactory.java +++ b/src/main/java/org/rometools/propono/atom/client/AtomClientFactory.java @@ -12,36 +12,33 @@ * 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. - */ + */ package org.rometools.propono.atom.client; import org.rometools.propono.utils.ProponoException; + import com.sun.syndication.io.impl.Atom10Parser; - /** - * Creates AtomService or ClientCollection based on username, password and - * end-point URI of Atom protocol service. + * Creates AtomService or ClientCollection based on username, password and end-point URI of Atom protocol service. */ public class AtomClientFactory { - + static { Atom10Parser.setResolveURIs(true); } - + /** * Create AtomService by reading service doc from Atom Server. */ - public static ClientAtomService getAtomService( - String uri, AuthStrategy authStrategy) throws ProponoException { + public static ClientAtomService getAtomService(final String uri, final AuthStrategy authStrategy) throws ProponoException { return new ClientAtomService(uri, authStrategy); } /** * Create ClientCollection bound to URI. */ - public static ClientCollection getCollection( - String uri, AuthStrategy authStrategy) throws ProponoException { + public static ClientCollection getCollection(final String uri, final AuthStrategy authStrategy) throws ProponoException { return new ClientCollection(uri, authStrategy); } } diff --git a/src/main/java/org/rometools/propono/atom/client/AuthStrategy.java b/src/main/java/org/rometools/propono/atom/client/AuthStrategy.java index 6d5e41e..07af888 100644 --- a/src/main/java/org/rometools/propono/atom/client/AuthStrategy.java +++ b/src/main/java/org/rometools/propono/atom/client/AuthStrategy.java @@ -15,16 +15,14 @@ */ package org.rometools.propono.atom.client; -import org.rometools.propono.utils.ProponoException; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethodBase; - +import org.rometools.propono.utils.ProponoException; public interface AuthStrategy { /** * Add authentication credenticals, tokens, etc. to HTTP method */ - void addAuthentication(HttpClient httpClient, HttpMethodBase method) - throws ProponoException; + void addAuthentication(HttpClient httpClient, HttpMethodBase method) throws ProponoException; } diff --git a/src/main/java/org/rometools/propono/atom/client/BasicAuthStrategy.java b/src/main/java/org/rometools/propono/atom/client/BasicAuthStrategy.java index d38133e..6ca75b1 100644 --- a/src/main/java/org/rometools/propono/atom/client/BasicAuthStrategy.java +++ b/src/main/java/org/rometools/propono/atom/client/BasicAuthStrategy.java @@ -15,27 +15,28 @@ */ package org.rometools.propono.atom.client; -import com.sun.syndication.io.impl.Base64; -import org.rometools.propono.utils.ProponoException; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethodBase; +import org.rometools.propono.utils.ProponoException; +import com.sun.syndication.io.impl.Base64; public class BasicAuthStrategy implements AuthStrategy { - private String credentials; + private final String credentials; - public BasicAuthStrategy(String username, String password) { - this.credentials = - new String(new Base64().encode((username + ":" + password).getBytes())); + public BasicAuthStrategy(final String username, final String password) { + new Base64(); + credentials = new String(Base64.encode((username + ":" + password).getBytes())); } public void init() throws ProponoException { // op-op } - public void addAuthentication(HttpClient httpClient, HttpMethodBase method) throws ProponoException { + @Override + public void addAuthentication(final HttpClient httpClient, final HttpMethodBase method) throws ProponoException { httpClient.getParams().setAuthenticationPreemptive(true); - String header = "Basic " + credentials; + final String header = "Basic " + credentials; method.setRequestHeader("Authorization", header); } } diff --git a/src/main/java/org/rometools/propono/atom/client/ClientAtomService.java b/src/main/java/org/rometools/propono/atom/client/ClientAtomService.java index 4fb6ccb..346ced1 100644 --- a/src/main/java/org/rometools/propono/atom/client/ClientAtomService.java +++ b/src/main/java/org/rometools/propono/atom/client/ClientAtomService.java @@ -12,16 +12,13 @@ * 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. - */ + */ package org.rometools.propono.atom.client; -import com.sun.syndication.feed.atom.Entry; -import com.sun.syndication.io.impl.Atom10Parser; -import org.rometools.propono.utils.ProponoException; -import org.rometools.propono.atom.common.AtomService; import java.io.InputStreamReader; import java.util.Iterator; import java.util.List; + import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethodBase; import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; @@ -31,103 +28,104 @@ import org.apache.commons.logging.LogFactory; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.input.SAXBuilder; +import org.rometools.propono.atom.common.AtomService; +import org.rometools.propono.utils.ProponoException; +import com.sun.syndication.feed.atom.Entry; +import com.sun.syndication.io.impl.Atom10Parser; /** - * This class models an Atom Publising Protocol Service Document. - * It extends the common - * {@link com.sun.syndication.propono.atom.common.Collection} - * class to add a getEntry() method and to return - * {@link com.sun.syndication.propono.atom.client.ClientWorkspace} - * objects instead of common + * This class models an Atom Publising Protocol Service Document. It extends the common {@link com.sun.syndication.propono.atom.common.Collection} class to add + * a getEntry() method and to return {@link com.sun.syndication.propono.atom.client.ClientWorkspace} objects instead of common * {@link com.sun.syndication.propono.atom.common.Workspace}s. */ public class ClientAtomService extends AtomService { private static Log logger = LogFactory.getLog(ClientAtomService.class); - private String uri = null; - private HttpClient httpClient = null; + private String uri = null; + private HttpClient httpClient = null; private AuthStrategy authStrategy = null; - + /** * Create Atom blog service instance for specified URL and user account. - * @param url End-point URL of Atom service + * + * @param url End-point URL of Atom service */ - ClientAtomService(String uri, AuthStrategy authStrategy) - throws ProponoException { + ClientAtomService(final String uri, final AuthStrategy authStrategy) throws ProponoException { this.uri = uri; this.authStrategy = authStrategy; - Document doc = getAtomServiceDocument(); + final Document doc = getAtomServiceDocument(); parseAtomServiceDocument(doc); } - + /** * Get full entry from service by entry edit URI. */ - public ClientEntry getEntry(String uri) throws ProponoException { - GetMethod method = new GetMethod(uri); + public ClientEntry getEntry(final String uri) throws ProponoException { + final GetMethod method = new GetMethod(uri); authStrategy.addAuthentication(httpClient, method); try { - httpClient.executeMethod(method); + httpClient.executeMethod(method); if (method.getStatusCode() != 200) { throw new ProponoException("ERROR HTTP status code=" + method.getStatusCode()); } - Entry romeEntry = Atom10Parser.parseEntry( - new InputStreamReader(method.getResponseBodyAsStream()), uri); + final Entry romeEntry = Atom10Parser.parseEntry(new InputStreamReader(method.getResponseBodyAsStream()), uri); if (!romeEntry.isMediaEntry()) { return new ClientEntry(this, null, romeEntry, false); } else { return new ClientMediaEntry(this, null, romeEntry, false); } - } catch (Exception e) { + } catch (final Exception e) { throw new ProponoException("ERROR: getting or parsing entry/media", e); } finally { method.releaseConnection(); } } - void addAuthentication(HttpMethodBase method) throws ProponoException { + void addAuthentication(final HttpMethodBase method) throws ProponoException { authStrategy.addAuthentication(httpClient, method); } AuthStrategy getAuthStrategy() { return authStrategy; } - + private Document getAtomServiceDocument() throws ProponoException { GetMethod method = null; - int code = -1; + final int code = -1; try { httpClient = new HttpClient(new MultiThreadedHttpConnectionManager()); // TODO: make connection timeout configurable - httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(30000); - + httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(30000); + method = new GetMethod(uri); authStrategy.addAuthentication(httpClient, method); httpClient.executeMethod(method); - - SAXBuilder builder = new SAXBuilder(); + + final SAXBuilder builder = new SAXBuilder(); return builder.build(method.getResponseBodyAsStream()); - - } catch (Throwable t) { - String msg = "ERROR retrieving Atom Service Document, code: "+code; + + } catch (final Throwable t) { + final String msg = "ERROR retrieving Atom Service Document, code: " + code; logger.debug(msg, t); throw new ProponoException(msg, t); } finally { - if (method != null) method.releaseConnection(); + if (method != null) { + method.releaseConnection(); + } } } /** Deserialize an Atom service XML document into an object */ - private void parseAtomServiceDocument(Document document) throws ProponoException { - Element root = document.getRootElement(); - List spaces = root.getChildren("workspace", AtomService.ATOM_PROTOCOL); - Iterator iter = spaces.iterator(); + private void parseAtomServiceDocument(final Document document) throws ProponoException { + final Element root = document.getRootElement(); + final List spaces = root.getChildren("workspace", AtomService.ATOM_PROTOCOL); + final Iterator iter = spaces.iterator(); while (iter.hasNext()) { - Element e = (Element) iter.next(); + final Element e = (Element) iter.next(); addWorkspace(new ClientWorkspace(e, this, uri)); } } - + /** * Package access to httpClient. */ @@ -135,4 +133,3 @@ public class ClientAtomService extends AtomService { return httpClient; } } - diff --git a/src/main/java/org/rometools/propono/atom/client/ClientCategories.java b/src/main/java/org/rometools/propono/atom/client/ClientCategories.java index 784ea3d..d8f7876 100644 --- a/src/main/java/org/rometools/propono/atom/client/ClientCategories.java +++ b/src/main/java/org/rometools/propono/atom/client/ClientCategories.java @@ -1,70 +1,66 @@ /* -* 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. -*/ + * 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.rometools.propono.atom.client; -import com.sun.syndication.feed.atom.Category; -import org.rometools.propono.atom.common.*; -import org.rometools.propono.utils.ProponoException; import java.io.IOException; import java.io.InputStreamReader; + import org.apache.commons.httpclient.methods.GetMethod; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; +import org.rometools.propono.atom.common.Categories; +import org.rometools.propono.utils.ProponoException; - -/** - * Models an Atom protocol Categories element, which may contain ROME Atom - * {@link com.sun.syndication.feed.atom.Category} elements. +/** + * Models an Atom protocol Categories element, which may contain ROME Atom {@link com.sun.syndication.feed.atom.Category} elements. */ -public class ClientCategories extends Categories { +public class ClientCategories extends Categories { private ClientCollection clientCollection = null; - + /** Load select from XML element */ - public ClientCategories(Element e, ClientCollection clientCollection) throws ProponoException { + public ClientCategories(final Element e, final ClientCollection clientCollection) throws ProponoException { this.clientCollection = clientCollection; parseCategoriesElement(e); - if (getHref() != null) fetchContents(); + if (getHref() != null) { + fetchContents(); + } } - + public void fetchContents() throws ProponoException { - GetMethod method = new GetMethod(getHrefResolved()); + final GetMethod method = new GetMethod(getHrefResolved()); clientCollection.addAuthentication(method); try { - clientCollection.getHttpClient().executeMethod(method); + clientCollection.getHttpClient().executeMethod(method); if (method.getStatusCode() != 200) { throw new ProponoException("ERROR HTTP status code=" + method.getStatusCode()); } - SAXBuilder builder = new SAXBuilder(); - Document catsDoc = builder.build( - new InputStreamReader(method.getResponseBodyAsStream())); + final SAXBuilder builder = new SAXBuilder(); + final Document catsDoc = builder.build(new InputStreamReader(method.getResponseBodyAsStream())); parseCategoriesElement(catsDoc.getRootElement()); - } catch (IOException ioe) { - throw new ProponoException( - "ERROR: reading out-of-line categories", ioe); - } catch (JDOMException jde) { - throw new ProponoException( - "ERROR: parsing out-of-line categories", jde); + } catch (final IOException ioe) { + throw new ProponoException("ERROR: reading out-of-line categories", ioe); + } catch (final JDOMException jde) { + throw new ProponoException("ERROR: parsing out-of-line categories", jde); } finally { method.releaseConnection(); } } } - diff --git a/src/main/java/org/rometools/propono/atom/client/ClientCollection.java b/src/main/java/org/rometools/propono/atom/client/ClientCollection.java index a1d6bda..0f63efd 100644 --- a/src/main/java/org/rometools/propono/atom/client/ClientCollection.java +++ b/src/main/java/org/rometools/propono/atom/client/ClientCollection.java @@ -12,69 +12,70 @@ * 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. - */ + */ package org.rometools.propono.atom.client; import java.io.InputStream; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Iterator; -import java.util.List; -import java.io.InputStreamReader; -import com.sun.syndication.feed.atom.Entry; -import com.sun.syndication.io.impl.Atom10Parser; -import org.rometools.propono.atom.common.AtomService; -import org.rometools.propono.atom.common.Categories; -import org.rometools.propono.utils.ProponoException; -import org.rometools.propono.atom.common.Collection; -import org.rometools.propono.atom.common.Workspace; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import java.util.List; + import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethodBase; import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.jdom2.Element; +import org.rometools.propono.atom.common.AtomService; +import org.rometools.propono.atom.common.Categories; +import org.rometools.propono.atom.common.Collection; +import org.rometools.propono.atom.common.Workspace; +import org.rometools.propono.utils.ProponoException; + +import com.sun.syndication.feed.atom.Entry; +import com.sun.syndication.io.impl.Atom10Parser; /** - * Models an Atom collection, extends Collection and adds methods for adding, - * retrieving, updateing and deleting entries. + * Models an Atom collection, extends Collection and adds methods for adding, retrieving, updateing and deleting entries. */ public class ClientCollection extends Collection { static final Log logger = LogFactory.getLog(ClientCollection.class); - private List categories = new ArrayList(); - private HttpClient httpClient = null; + private final List categories = new ArrayList(); + private HttpClient httpClient = null; private AuthStrategy authStrategy = null; - private boolean writable = true; + private final boolean writable = true; private ClientWorkspace workspace = null; private ClientAtomService service = null; - ClientCollection(Element e, ClientWorkspace workspace, String baseURI) throws ProponoException { - super(e, baseURI); + ClientCollection(final Element e, final ClientWorkspace workspace, final String baseURI) throws ProponoException { + super(e, baseURI); this.workspace = workspace; - this.service = workspace.getAtomService(); - this.httpClient = workspace.getAtomService().getHttpClient(); - this.authStrategy = workspace.getAtomService().getAuthStrategy(); + service = workspace.getAtomService(); + httpClient = workspace.getAtomService().getHttpClient(); + authStrategy = workspace.getAtomService().getAuthStrategy(); parseCollectionElement(e); } - ClientCollection(String href, AuthStrategy authStrategy) throws ProponoException { + ClientCollection(final String href, final AuthStrategy authStrategy) throws ProponoException { super("Standalone connection", "text", href); this.authStrategy = authStrategy; try { httpClient = new HttpClient(new MultiThreadedHttpConnectionManager()); // TODO: make connection timeout configurable - httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(30000); - } catch (Throwable t) { + httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(30000); + } catch (final Throwable t) { throw new ProponoException("ERROR creating HTTPClient", t); } } - void addAuthentication(HttpMethodBase method) throws ProponoException { + void addAuthentication(final HttpMethodBase method) throws ProponoException { authStrategy.addAuthentication(httpClient, method); } - + /** * Package access to httpClient to allow use by ClientEntry and ClientMediaEntry. */ @@ -82,135 +83,141 @@ public class ClientCollection extends Collection { return httpClient; } - /** - * Get iterator over entries in this collection. Entries returned are - * considered to be partial entries cannot be saved/updated. + /** + * Get iterator over entries in this collection. Entries returned are considered to be partial entries cannot be saved/updated. */ public Iterator getEntries() throws ProponoException { - return new EntryIterator(this); + return new EntryIterator(this); } - + /** - * Get full entry specified by entry edit URI. - * Note that entry may or may not be associated with this collection. + * Get full entry specified by entry edit URI. Note that entry may or may not be associated with this collection. + * * @return ClientEntry or ClientMediaEntry specified by URI. */ - public ClientEntry getEntry(String uri) throws ProponoException { - GetMethod method = new GetMethod(uri); + public ClientEntry getEntry(final String uri) throws ProponoException { + final GetMethod method = new GetMethod(uri); authStrategy.addAuthentication(httpClient, method); try { - httpClient.executeMethod(method); + httpClient.executeMethod(method); if (method.getStatusCode() != 200) { throw new ProponoException("ERROR HTTP status code=" + method.getStatusCode()); } - Entry romeEntry = Atom10Parser.parseEntry( - new InputStreamReader(method.getResponseBodyAsStream()), uri); + final Entry romeEntry = Atom10Parser.parseEntry(new InputStreamReader(method.getResponseBodyAsStream()), uri); if (!romeEntry.isMediaEntry()) { return new ClientEntry(service, this, romeEntry, false); } else { return new ClientMediaEntry(service, this, romeEntry, false); } - } catch (Exception e) { + } catch (final Exception e) { throw new ProponoException("ERROR: getting or parsing entry/media, HTTP code: ", e); } finally { method.releaseConnection(); } } - + /** * Get workspace or null if collection is not associated with a workspace. */ public Workspace getWorkspace() { return workspace; } - + /** * Determines if collection is writable. */ public boolean isWritable() { return writable; } - - /** + + /** * Create new entry associated with collection, but do not save to server. + * * @throws ProponoException if collecton is not writable. */ public ClientEntry createEntry() throws ProponoException { - if (!isWritable()) throw new ProponoException("Collection is not writable"); + if (!isWritable()) { + throw new ProponoException("Collection is not writable"); + } return new ClientEntry(service, this); } /** - * Create new media entry assocaited with collection, but do not save. - * server. Depending on the Atom server, you may or may not be able to - * persist the properties of the entry that is returned. - * @param title Title to used for uploaded file. - * @param slug String to be used in file-name of stored file + * Create new media entry assocaited with collection, but do not save. server. Depending on the Atom server, you may or may not be able to persist the + * properties of the entry that is returned. + * + * @param title Title to used for uploaded file. + * @param slug String to be used in file-name of stored file * @param contentType MIME content-type of file. - * @param bytes Data to be uploaded as byte array. + * @param bytes Data to be uploaded as byte array. * @throws ProponoException if collecton is not writable */ - public ClientMediaEntry createMediaEntry( - String title, String slug, String contentType, byte[] bytes) - throws ProponoException { - if (!isWritable()) throw new ProponoException("Collection is not writable"); + public ClientMediaEntry createMediaEntry(final String title, final String slug, final String contentType, final byte[] bytes) throws ProponoException { + if (!isWritable()) { + throw new ProponoException("Collection is not writable"); + } return new ClientMediaEntry(service, this, title, slug, contentType, bytes); } - + /** - * Create new media entry assocaited with collection, but do not save. - * server. Depending on the Atom server, you may or may not be able to. - * persist the properties of the entry that is returned. - * @param title Title to used for uploaded file. - * @param slug String to be used in file-name of stored file + * Create new media entry assocaited with collection, but do not save. server. Depending on the Atom server, you may or may not be able to. persist the + * properties of the entry that is returned. + * + * @param title Title to used for uploaded file. + * @param slug String to be used in file-name of stored file * @param contentType MIME content-type of file. - * @param is Data to be uploaded as InputStream. + * @param is Data to be uploaded as InputStream. * @throws ProponoException if collecton is not writable */ - public ClientMediaEntry createMediaEntry( - String title, String slug, String contentType, InputStream is) - throws ProponoException { - if (!isWritable()) throw new ProponoException("Collection is not writable"); + public ClientMediaEntry createMediaEntry(final String title, final String slug, final String contentType, final InputStream is) throws ProponoException { + if (!isWritable()) { + throw new ProponoException("Collection is not writable"); + } return new ClientMediaEntry(service, this, title, slug, contentType, is); } - + /** - * Save to collection a new entry that was created by a createEntry() - * or createMediaEntry() and save it to the server. + * Save to collection a new entry that was created by a createEntry() or createMediaEntry() and save it to the server. + * * @param entry Entry to be saved. * @throws ProponoException on error, if collection is not writable or if entry is partial. */ - public void addEntry(ClientEntry entry) throws ProponoException { - if (!isWritable()) throw new ProponoException("Collection is not writable"); + public void addEntry(final ClientEntry entry) throws ProponoException { + if (!isWritable()) { + throw new ProponoException("Collection is not writable"); + } entry.addToCollection(this); } - protected void parseCollectionElement(Element element) throws ProponoException { - if (workspace == null) return; - + @Override + protected void parseCollectionElement(final Element element) throws ProponoException { + if (workspace == null) { + return; + } + setHref(element.getAttribute("href").getValue()); - - Element titleElem = element.getChild("title", AtomService.ATOM_FORMAT); + + final Element titleElem = element.getChild("title", AtomService.ATOM_FORMAT); if (titleElem != null) { setTitle(titleElem.getText()); if (titleElem.getAttribute("type", AtomService.ATOM_FORMAT) != null) { setTitleType(titleElem.getAttribute("type", AtomService.ATOM_FORMAT).getValue()); } } - - List acceptElems = element.getChildren("accept", AtomService.ATOM_PROTOCOL); + + final List acceptElems = element.getChildren("accept", AtomService.ATOM_PROTOCOL); if (acceptElems != null && acceptElems.size() > 0) { - for (Iterator it = acceptElems.iterator(); it.hasNext();) { - Element acceptElem = (Element)it.next(); + for (final Iterator it = acceptElems.iterator(); it.hasNext();) { + final Element acceptElem = (Element) it.next(); addAccept(acceptElem.getTextTrim()); } } - + // Loop to parse element to Categories objects - List catsElems = element.getChildren("categories", AtomService.ATOM_PROTOCOL); - for (Iterator catsIter = catsElems.iterator(); catsIter.hasNext();) { - Element catsElem = (Element) catsIter.next(); - Categories cats = new ClientCategories(catsElem, this); + final List catsElems = element.getChildren("categories", AtomService.ATOM_PROTOCOL); + for (final Iterator catsIter = catsElems.iterator(); catsIter.hasNext();) { + final Element catsElem = (Element) catsIter.next(); + final Categories cats = new ClientCategories(catsElem, this); addCategories(cats); } } diff --git a/src/main/java/org/rometools/propono/atom/client/ClientEntry.java b/src/main/java/org/rometools/propono/atom/client/ClientEntry.java index 8e3e151..ef5ff4d 100644 --- a/src/main/java/org/rometools/propono/atom/client/ClientEntry.java +++ b/src/main/java/org/rometools/propono/atom/client/ClientEntry.java @@ -12,152 +12,148 @@ * 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. - */ + */ package org.rometools.propono.atom.client; -import com.sun.syndication.feed.atom.Content; -import com.sun.syndication.feed.atom.Link; -import com.sun.syndication.feed.atom.Entry; -import com.sun.syndication.io.impl.Atom10Generator; -import com.sun.syndication.io.impl.Atom10Parser; -import org.rometools.propono.utils.ProponoException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringWriter; -import org.apache.commons.httpclient.methods.DeleteMethod; -import org.apache.commons.httpclient.methods.EntityEnclosingMethod; -import org.apache.commons.httpclient.methods.PutMethod; -import org.apache.commons.httpclient.methods.StringRequestEntity; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.rometools.propono.utils.Utilities; import java.util.ArrayList; import java.util.List; + import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethodBase; +import org.apache.commons.httpclient.methods.DeleteMethod; +import org.apache.commons.httpclient.methods.EntityEnclosingMethod; import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.methods.PutMethod; +import org.apache.commons.httpclient.methods.StringRequestEntity; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.rometools.propono.utils.ProponoException; +import org.rometools.propono.utils.Utilities; + +import com.sun.syndication.feed.atom.Content; +import com.sun.syndication.feed.atom.Entry; +import com.sun.syndication.feed.atom.Link; +import com.sun.syndication.io.impl.Atom10Generator; +import com.sun.syndication.io.impl.Atom10Parser; /** - * Client implementation of Atom entry, extends ROME Entry to add methods for - * easily getting/setting content, updating and removing the entry from the server. + * Client implementation of Atom entry, extends ROME Entry to add methods for easily getting/setting content, updating and removing the entry from the server. */ public class ClientEntry extends Entry { - private static final Log logger = LogFactory.getLog(ClientEntry.class); - - boolean partial = false; - + private static final Log logger = LogFactory.getLog(ClientEntry.class); + + boolean partial = false; + private ClientAtomService service = null; private ClientCollection collection = null; - - public ClientEntry(ClientAtomService service, ClientCollection collection) { + + public ClientEntry(final ClientAtomService service, final ClientCollection collection) { super(); this.service = service; this.collection = collection; } - public ClientEntry(ClientAtomService service, ClientCollection collection, - Entry entry, boolean partial) throws ProponoException { + public ClientEntry(final ClientAtomService service, final ClientCollection collection, final Entry entry, final boolean partial) throws ProponoException { super(); this.service = service; this.collection = collection; this.partial = partial; try { BeanUtils.copyProperties(this, entry); - } catch (Exception e) { + } catch (final Exception e) { throw new ProponoException("ERROR: copying fields from ROME entry", e); } } - - /** + + /** * Set content of entry. + * * @param contentString content string. - * @param type Must be "text" for plain text, "html" for escaped HTML, - * "xhtml" for XHTML or a valid MIME content-type. + * @param type Must be "text" for plain text, "html" for escaped HTML, "xhtml" for XHTML or a valid MIME content-type. */ - public void setContent(String contentString, String type) { - Content newContent = new Content(); + public void setContent(final String contentString, final String type) { + final Content newContent = new Content(); newContent.setType(type == null ? Content.HTML : type); newContent.setValue(contentString); - ArrayList contents = new ArrayList(); + final ArrayList contents = new ArrayList(); contents.add(newContent); setContents(contents); } - + /** - * Convenience method to set first content object in content collection. - * Atom 1.0 allows only one content element per entry. + * Convenience method to set first content object in content collection. Atom 1.0 allows only one content element per entry. */ - public void setContent(Content c) { - ArrayList contents = new ArrayList(); + public void setContent(final Content c) { + final ArrayList contents = new ArrayList(); contents.add(c); setContents(contents); } - + /** - * Convenience method to get first content object in content collection. - * Atom 1.0 allows only one content element per entry. + * Convenience method to get first content object in content collection. Atom 1.0 allows only one content element per entry. */ public Content getContent() { if (getContents() != null && getContents().size() > 0) { - Content c = (Content)getContents().get(0); + final Content c = getContents().get(0); return c; } return null; } - + /** * Determines if entries are equal based on edit URI. */ - public boolean equals(Object o) { + @Override + public boolean equals(final Object o) { if (o instanceof ClientEntry) { - ClientEntry other = (ClientEntry)o; + final ClientEntry other = (ClientEntry) o; if (other.getEditURI() != null && getEditURI() != null) { return other.getEditURI().equals(getEditURI()); } } return false; } - + /** - * Update entry by posting new representation of entry to server. - * Note that you should not attempt to update entries that you get from - * iterating over a collection they may be "partial" entries. If you want - * to update an entry, you must get it via one of the getEntry() - * methods in - * {@link com.sun.syndication.propono.atom.common.Collection} or - * {@link com.sun.syndication.propono.atom.common.AtomService}. + * Update entry by posting new representation of entry to server. Note that you should not attempt to update entries that you get from iterating over a + * collection they may be "partial" entries. If you want to update an entry, you must get it via one of the getEntry() methods in + * {@link com.sun.syndication.propono.atom.common.Collection} or {@link com.sun.syndication.propono.atom.common.AtomService}. + * * @throws ProponoException If entry is a "partial" entry. */ public void update() throws ProponoException { - if (partial) throw new ProponoException("ERROR: attempt to update partial entry"); - EntityEnclosingMethod method = new PutMethod(getEditURI()); + if (partial) { + throw new ProponoException("ERROR: attempt to update partial entry"); + } + final EntityEnclosingMethod method = new PutMethod(getEditURI()); addAuthentication(method); - StringWriter sw = new StringWriter(); - int code = -1; + final StringWriter sw = new StringWriter(); + final int code = -1; try { Atom10Generator.serializeEntry(this, sw); method.setRequestEntity(new StringRequestEntity(sw.toString())); - method.setRequestHeader( - "Content-type", "application/atom+xml; charset=utf-8"); + method.setRequestHeader("Content-type", "application/atom+xml; charset=utf-8"); getHttpClient().executeMethod(method); - InputStream is = method.getResponseBodyAsStream(); + final InputStream is = method.getResponseBodyAsStream(); if (method.getStatusCode() != 200 && method.getStatusCode() != 201) { - throw new ProponoException( - "ERROR HTTP status=" + method.getStatusCode() + " : " + Utilities.streamToString(is)); + throw new ProponoException("ERROR HTTP status=" + method.getStatusCode() + " : " + Utilities.streamToString(is)); } - } catch (Exception e) { - String msg = "ERROR: updating entry, HTTP code: " + code; + } catch (final Exception e) { + final String msg = "ERROR: updating entry, HTTP code: " + code; logger.debug(msg, e); throw new ProponoException(msg, e); } finally { method.releaseConnection(); - } + } } - + /** * Remove entry from server. */ @@ -165,18 +161,18 @@ public class ClientEntry extends Entry { if (getEditURI() == null) { throw new ProponoException("ERROR: cannot delete unsaved entry"); } - DeleteMethod method = new DeleteMethod(getEditURI()); + final DeleteMethod method = new DeleteMethod(getEditURI()); addAuthentication(method); try { getHttpClient().executeMethod(method); - } catch (IOException ex) { + } catch (final IOException ex) { throw new ProponoException("ERROR: removing entry, HTTP code", ex); } finally { method.releaseConnection(); } } - - void setCollection(ClientCollection collection) { + + void setCollection(final ClientCollection collection) { this.collection = collection; } @@ -186,67 +182,64 @@ public class ClientEntry extends Entry { /** * Get the URI that can be used to edit the entry via HTTP PUT or DELETE. - */ + */ public String getEditURI() { - for (int i=0; i 0) { - Content c = (Content)getContents().get(0); + final Content c = getContents().get(0); if (c.getSrc() != null) { return getResourceAsStream(); } else if (inputStream != null) { @@ -159,36 +158,38 @@ public class ClientMediaEntry extends ClientEntry { return new ByteArrayInputStream(bytes); } else { throw new ProponoException("ERROR: no src URI or binary data to return"); - } - } - else { + } + } else { throw new ProponoException("ERROR: no content found in entry"); } } - + private InputStream getResourceAsStream() throws ProponoException { if (getEditURI() == null) { throw new ProponoException("ERROR: not yet saved to server"); } - GetMethod method = new GetMethod(((Content)getContents()).getSrc()); + final GetMethod method = new GetMethod(((Content) getContents()).getSrc()); try { getCollection().getHttpClient().executeMethod(method); if (method.getStatusCode() != 200) { throw new ProponoException("ERROR HTTP status=" + method.getStatusCode()); } return method.getResponseBodyAsStream(); - } catch (IOException e) { + } catch (final IOException e) { throw new ProponoException("ERROR: getting media entry", e); } - } - + } + /** - * Update entry on server. + * Update entry on server. */ + @Override public void update() throws ProponoException { - if (partial) throw new ProponoException("ERROR: attempt to update partial entry"); + if (partial) { + throw new ProponoException("ERROR: attempt to update partial entry"); + } EntityEnclosingMethod method = null; - Content updateContent = (Content)getContents().get(0); + final Content updateContent = getContents().get(0); try { if (getMediaLinkURI() != null && getBytes() != null) { // existing media entry and new file, so PUT file to edit-media URI @@ -198,85 +199,84 @@ public class ClientMediaEntry extends ClientEntry { } else { method.setRequestEntity(new InputStreamRequestEntity(new ByteArrayInputStream(getBytes()))); } - + method.setRequestHeader("Content-type", updateContent.getType()); - } - else if (getEditURI() != null) { + } else if (getEditURI() != null) { // existing media entry and NO new file, so PUT entry to edit URI method = new PutMethod(getEditURI()); - StringWriter sw = new StringWriter(); + final StringWriter sw = new StringWriter(); Atom10Generator.serializeEntry(this, sw); method.setRequestEntity(new StringRequestEntity(sw.toString())); - method.setRequestHeader( - "Content-type", "application/atom+xml; charset=utf8"); + method.setRequestHeader("Content-type", "application/atom+xml; charset=utf8"); } else { throw new ProponoException("ERROR: media entry has no edit URI or media-link URI"); } - this.getCollection().addAuthentication(method); + getCollection().addAuthentication(method); method.addRequestHeader("Title", getTitle()); - getCollection().getHttpClient().executeMethod(method); - if (inputStream != null) inputStream.close(); - InputStream is = method.getResponseBodyAsStream(); - if (method.getStatusCode() != 200 && method.getStatusCode() != 201) { - throw new ProponoException( - "ERROR HTTP status=" + method.getStatusCode() + " : " + Utilities.streamToString(is)); + getCollection().getHttpClient().executeMethod(method); + if (inputStream != null) { + inputStream.close(); } - - } catch (Exception e) { + final InputStream is = method.getResponseBodyAsStream(); + if (method.getStatusCode() != 200 && method.getStatusCode() != 201) { + throw new ProponoException("ERROR HTTP status=" + method.getStatusCode() + " : " + Utilities.streamToString(is)); + } + + } catch (final Exception e) { throw new ProponoException("ERROR: saving media entry"); } - if (method.getStatusCode() != 201) { + if (method.getStatusCode() != 201) { throw new ProponoException("ERROR HTTP status=" + method.getStatusCode()); } } - + /** Package access, to be called by DefaultClientCollection */ - void addToCollection(ClientCollection col) throws ProponoException { + @Override + void addToCollection(final ClientCollection col) throws ProponoException { setCollection(col); - EntityEnclosingMethod method = new PostMethod(col.getHrefResolved()); + final EntityEnclosingMethod method = new PostMethod(col.getHrefResolved()); getCollection().addAuthentication(method); - StringWriter sw = new StringWriter(); - boolean error = false; + final StringWriter sw = new StringWriter(); + final boolean error = false; try { - Content c = (Content)getContents().get(0); + final Content c = getContents().get(0); if (inputStream != null) { method.setRequestEntity(new InputStreamRequestEntity(inputStream)); } else { method.setRequestEntity(new InputStreamRequestEntity(new ByteArrayInputStream(getBytes()))); } - method.setRequestHeader("Content-type", c.getType()); + method.setRequestHeader("Content-type", c.getType()); method.setRequestHeader("Title", getTitle()); method.setRequestHeader("Slug", getSlug()); getCollection().getHttpClient().executeMethod(method); - if (inputStream != null) inputStream.close(); - InputStream is = method.getResponseBodyAsStream(); - if (method.getStatusCode() == 200 || method.getStatusCode() == 201) { - Entry romeEntry = Atom10Parser.parseEntry( - new InputStreamReader(is), col.getHrefResolved()); - BeanUtils.copyProperties(this, romeEntry); - - } else { - throw new ProponoException( - "ERROR HTTP status-code=" + method.getStatusCode() - + " status-line: " + method.getStatusLine()); + if (inputStream != null) { + inputStream.close(); } - } catch (IOException ie) { + final InputStream is = method.getResponseBodyAsStream(); + if (method.getStatusCode() == 200 || method.getStatusCode() == 201) { + final Entry romeEntry = Atom10Parser.parseEntry(new InputStreamReader(is), col.getHrefResolved()); + BeanUtils.copyProperties(this, romeEntry); + + } else { + throw new ProponoException("ERROR HTTP status-code=" + method.getStatusCode() + " status-line: " + method.getStatusLine()); + } + } catch (final IOException ie) { throw new ProponoException("ERROR: saving media entry", ie); - } catch (JDOMException je) { + } catch (final JDOMException je) { throw new ProponoException("ERROR: saving media entry", je); - } catch (FeedException fe) { + } catch (final FeedException fe) { throw new ProponoException("ERROR: saving media entry", fe); - } catch (IllegalAccessException ae) { + } catch (final IllegalAccessException ae) { throw new ProponoException("ERROR: saving media entry", ae); - } catch (InvocationTargetException te) { + } catch (final InvocationTargetException te) { throw new ProponoException("ERROR: saving media entry", te); } - Header locationHeader = method.getResponseHeader("Location"); + final Header locationHeader = method.getResponseHeader("Location"); if (locationHeader == null) { logger.warn("WARNING added entry, but no location header returned"); } else if (getEditURI() == null) { - List links = getOtherLinks(); - Link link = new Link(); + final List links = getOtherLinks(); + final Link link = new Link(); link.setHref(locationHeader.getValue()); link.setRel("edit"); links.add(link); @@ -290,33 +290,8 @@ public class ClientMediaEntry extends ClientEntry { } /** Get string to be used in file name of new media resource on server. */ - public void setSlug(String slug) { + public void setSlug(final String slug) { this.slug = slug; } } - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/org/rometools/propono/atom/client/ClientWorkspace.java b/src/main/java/org/rometools/propono/atom/client/ClientWorkspace.java index 62cc1ed..b8251e9 100644 --- a/src/main/java/org/rometools/propono/atom/client/ClientWorkspace.java +++ b/src/main/java/org/rometools/propono/atom/client/ClientWorkspace.java @@ -12,55 +12,49 @@ * 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. - */ + */ package org.rometools.propono.atom.client; -import org.rometools.propono.atom.common.AtomService; -import org.rometools.propono.atom.common.Workspace; -import org.rometools.propono.atom.common.Workspace; -import org.rometools.propono.utils.ProponoException; import java.util.Iterator; import java.util.List; -import org.jdom2.Element; +import org.jdom2.Element; +import org.rometools.propono.atom.common.AtomService; +import org.rometools.propono.atom.common.Workspace; +import org.rometools.propono.utils.ProponoException; /** - * Represents Atom protocol workspace on client-side. - * It extends the common - * {@link com.sun.syndication.propono.atom.common.Workspace} - * to return - * {@link com.sun.syndication.propono.atom.client.ClientCollection} - * objects instead of common - * {@link com.sun.syndication.propono.atom.common.Collection}s. + * Represents Atom protocol workspace on client-side. It extends the common {@link com.sun.syndication.propono.atom.common.Workspace} to return + * {@link com.sun.syndication.propono.atom.client.ClientCollection} objects instead of common {@link com.sun.syndication.propono.atom.common.Collection}s. */ public class ClientWorkspace extends Workspace { private ClientAtomService atomService = null; - - ClientWorkspace(Element e, ClientAtomService atomService, String baseURI) throws ProponoException { - super("dummy", "dummy"); - this.atomService = atomService; - parseWorkspaceElement(e, baseURI); - } - + + ClientWorkspace(final Element e, final ClientAtomService atomService, final String baseURI) throws ProponoException { + super("dummy", "dummy"); + this.atomService = atomService; + parseWorkspaceElement(e, baseURI); + } + /** * Package access to parent service. */ ClientAtomService getAtomService() { return atomService; } - + /** Deserialize a Atom workspace XML element into an object */ - protected void parseWorkspaceElement(Element element, String baseURI) throws ProponoException { - Element titleElem = element.getChild("title", AtomService.ATOM_FORMAT); + protected void parseWorkspaceElement(final Element element, final String baseURI) throws ProponoException { + final Element titleElem = element.getChild("title", AtomService.ATOM_FORMAT); setTitle(titleElem.getText()); if (titleElem.getAttribute("type", AtomService.ATOM_FORMAT) != null) { setTitleType(titleElem.getAttribute("type", AtomService.ATOM_FORMAT).getValue()); - } - List collections = element.getChildren("collection", AtomService.ATOM_PROTOCOL); - Iterator iter = collections.iterator(); - while (iter.hasNext()) { - Element e = (Element) iter.next(); - addCollection(new ClientCollection(e, this, baseURI)); } - } + final List collections = element.getChildren("collection", AtomService.ATOM_PROTOCOL); + final Iterator iter = collections.iterator(); + while (iter.hasNext()) { + final Element e = (Element) iter.next(); + addCollection(new ClientCollection(e, this, baseURI)); + } + } } diff --git a/src/main/java/org/rometools/propono/atom/client/EntryIterator.java b/src/main/java/org/rometools/propono/atom/client/EntryIterator.java index efa057e..39aad0e 100644 --- a/src/main/java/org/rometools/propono/atom/client/EntryIterator.java +++ b/src/main/java/org/rometools/propono/atom/client/EntryIterator.java @@ -12,96 +12,102 @@ * 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. - */ + */ package org.rometools.propono.atom.client; -import com.sun.syndication.feed.atom.Entry; -import com.sun.syndication.feed.atom.Feed; -import com.sun.syndication.feed.atom.Link; -import com.sun.syndication.io.WireFeedInput; -import org.rometools.propono.utils.ProponoException; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; + import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdom2.Document; import org.jdom2.input.SAXBuilder; +import org.rometools.propono.utils.ProponoException; +import com.sun.syndication.feed.atom.Entry; +import com.sun.syndication.feed.atom.Feed; +import com.sun.syndication.feed.atom.Link; +import com.sun.syndication.io.WireFeedInput; -/** +/** * Enables iteration over entries in Atom protocol collection. */ public class EntryIterator implements Iterator { static final Log logger = LogFactory.getLog(EntryIterator.class); private final ClientCollection collection; - int maxEntries = 20; - int offset = 0; + int maxEntries = 20; + int offset = 0; Iterator members = null; - Feed col = null; - String collectionURI; - String nextURI; - - EntryIterator(ClientCollection collection) throws ProponoException { + Feed col = null; + String collectionURI; + String nextURI; + + EntryIterator(final ClientCollection collection) throws ProponoException { this.collection = collection; collectionURI = collection.getHrefResolved(); nextURI = collectionURI; getNextEntries(); } - + /** - * Returns true if more entries are available. + * Returns true if more entries are available. */ + @Override public boolean hasNext() { if (!members.hasNext()) { - try { - getNextEntries(); - } catch (Exception ignored) { + try { + getNextEntries(); + } catch (final Exception ignored) { logger.error("ERROR getting next entries", ignored); } } return members.hasNext(); } - + /** * Get next entry in collection. */ + @Override public Object next() { if (hasNext()) { - Entry romeEntry = (Entry)members.next(); + final Entry romeEntry = (Entry) members.next(); try { if (!romeEntry.isMediaEntry()) { return new ClientEntry(null, collection, romeEntry, true); - } else { + } else { return new ClientMediaEntry(null, collection, romeEntry, true); } - } catch (ProponoException e) { + } catch (final ProponoException e) { throw new RuntimeException("Unexpected exception creating ClientEntry or ClientMedia", e); } } throw new NoSuchElementException(); } - + /** * Remove entry is not implemented. */ + @Override public void remove() { // optional method, not implemented } - - private void getNextEntries() throws ProponoException { - if (nextURI == null) return; - GetMethod colGet = new GetMethod( collection.getHrefResolved(nextURI) ); + + private void getNextEntries() throws ProponoException { + if (nextURI == null) { + return; + } + final GetMethod colGet = new GetMethod(collection.getHrefResolved(nextURI)); collection.addAuthentication(colGet); try { collection.getHttpClient().executeMethod(colGet); - SAXBuilder builder = new SAXBuilder(); - Document doc = builder.build(colGet.getResponseBodyAsStream()); - WireFeedInput feedInput = new WireFeedInput(); + final SAXBuilder builder = new SAXBuilder(); + final Document doc = builder.build(colGet.getResponseBodyAsStream()); + final WireFeedInput feedInput = new WireFeedInput(); col = (Feed) feedInput.build(doc); - } catch (Exception e) { + } catch (final Exception e) { throw new ProponoException("ERROR: fetching or parsing next entries, HTTP code: " + (colGet != null ? colGet.getStatusCode() : -1), e); } finally { colGet.releaseConnection(); @@ -110,11 +116,11 @@ public class EntryIterator implements Iterator { offset += col.getEntries().size(); nextURI = null; - List altLinks = col.getOtherLinks(); + final List altLinks = col.getOtherLinks(); if (altLinks != null) { - Iterator iter = altLinks.iterator(); + final Iterator iter = altLinks.iterator(); while (iter.hasNext()) { - Link link = (Link)iter.next(); + final Link link = (Link) iter.next(); if ("next".equals(link.getRel())) { nextURI = link.getHref(); } diff --git a/src/main/java/org/rometools/propono/atom/client/GDataAuthStrategy.java b/src/main/java/org/rometools/propono/atom/client/GDataAuthStrategy.java index fcb7920..6cac614 100644 --- a/src/main/java/org/rometools/propono/atom/client/GDataAuthStrategy.java +++ b/src/main/java/org/rometools/propono/atom/client/GDataAuthStrategy.java @@ -15,20 +15,19 @@ */ package org.rometools.propono.atom.client; -import org.rometools.propono.utils.ProponoException; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethodBase; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; - +import org.rometools.propono.utils.ProponoException; public class GDataAuthStrategy implements AuthStrategy { - private String email; - private String password; - private String service; + private final String email; + private final String password; + private final String service; private String authToken; - public GDataAuthStrategy(String email, String password, String service) throws ProponoException { + public GDataAuthStrategy(final String email, final String password, final String service) throws ProponoException { this.email = email; this.password = password; this.service = service; @@ -37,30 +36,27 @@ public class GDataAuthStrategy implements AuthStrategy { private void init() throws ProponoException { try { - HttpClient httpClient = new HttpClient(); - PostMethod method = new PostMethod("https://www.google.com/accounts/ClientLogin"); - NameValuePair[] data = { - new NameValuePair("Email", email), - new NameValuePair("Passwd", password), - new NameValuePair("accountType", "GOOGLE"), - new NameValuePair("service", service), - new NameValuePair("source", "ROME Propono Atompub Client") - }; + final HttpClient httpClient = new HttpClient(); + final PostMethod method = new PostMethod("https://www.google.com/accounts/ClientLogin"); + final NameValuePair[] data = { new NameValuePair("Email", email), new NameValuePair("Passwd", password), + new NameValuePair("accountType", "GOOGLE"), new NameValuePair("service", service), + new NameValuePair("source", "ROME Propono Atompub Client") }; method.setRequestBody(data); httpClient.executeMethod(method); - String responseBody = method.getResponseBodyAsString(); - int authIndex = responseBody.indexOf("Auth="); + final String responseBody = method.getResponseBodyAsString(); + final int authIndex = responseBody.indexOf("Auth="); authToken = "GoogleLogin auth=" + responseBody.trim().substring(authIndex + 5); - } catch (Throwable t) { + } catch (final Throwable t) { t.printStackTrace(); throw new ProponoException("ERROR obtaining Google authentication string", t); } } - public void addAuthentication(HttpClient httpClient, HttpMethodBase method) throws ProponoException { + @Override + public void addAuthentication(final HttpClient httpClient, final HttpMethodBase method) throws ProponoException { httpClient.getParams().setAuthenticationPreemptive(true); method.setRequestHeader("Authorization", authToken); } diff --git a/src/main/java/org/rometools/propono/atom/client/NoAuthStrategy.java b/src/main/java/org/rometools/propono/atom/client/NoAuthStrategy.java index 2e620e3..4a1e5ba 100644 --- a/src/main/java/org/rometools/propono/atom/client/NoAuthStrategy.java +++ b/src/main/java/org/rometools/propono/atom/client/NoAuthStrategy.java @@ -15,16 +15,17 @@ */ package org.rometools.propono.atom.client; -import org.rometools.propono.utils.ProponoException; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethodBase; +import org.rometools.propono.utils.ProponoException; /** * No authentication */ public class NoAuthStrategy implements AuthStrategy { - public void addAuthentication(HttpClient httpClient, HttpMethodBase method) throws ProponoException { + @Override + public void addAuthentication(final HttpClient httpClient, final HttpMethodBase method) throws ProponoException { // no-op } diff --git a/src/main/java/org/rometools/propono/atom/client/OAuthStrategy.java b/src/main/java/org/rometools/propono/atom/client/OAuthStrategy.java index b0da2e9..8b22100 100644 --- a/src/main/java/org/rometools/propono/atom/client/OAuthStrategy.java +++ b/src/main/java/org/rometools/propono/atom/client/OAuthStrategy.java @@ -15,7 +15,6 @@ */ package org.rometools.propono.atom.client; -import org.rometools.propono.utils.ProponoException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -23,18 +22,20 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.UUID; + import net.oauth.OAuth; import net.oauth.OAuthAccessor; import net.oauth.OAuthConsumer; import net.oauth.OAuthMessage; import net.oauth.OAuthServiceProvider; + import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethodBase; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.util.ParameterParser; - +import org.rometools.propono.utils.ProponoException; /** * Strategy for using OAuth. @@ -44,55 +45,53 @@ public class OAuthStrategy implements AuthStrategy { private State state = State.UNAUTHORIZED; private enum State { - UNAUTHORIZED, // have not sent any requests + UNAUTHORIZED, // have not sent any requests REQUEST_TOKEN, // have a request token - AUTHORIZED, // are authorized - ACCESS_TOKEN // have access token, ready to make calls + AUTHORIZED, // are authorized + ACCESS_TOKEN // have access token, ready to make calls } - private String username; - private String consumerKey; - private String consumerSecret; - private String keyType; + private final String username; + private final String consumerKey; + private final String consumerSecret; + private final String keyType; - private String reqUrl; - private String authzUrl; - private String accessUrl; + private final String reqUrl; + private final String authzUrl; + private final String accessUrl; - private String nonce; - private long timestamp; + private final String nonce; + private final long timestamp; private String requestToken = null; private String accessToken = null; private String tokenSecret = null; /** - * Create OAuth authentcation strategy and negotiate with services to - * obtain access token to be used in subsequent calls. + * Create OAuth authentcation strategy and negotiate with services to obtain access token to be used in subsequent calls. * - * @param username Username to be used in authentication - * @param key Consumer key - * @param secret Consumer secret - * @param keyType Key type (e.g. "HMAC-SHA1") - * @param reqUrl URL of request token service - * @param authzUrl URL of authorize service + * @param username Username to be used in authentication + * @param key Consumer key + * @param secret Consumer secret + * @param keyType Key type (e.g. "HMAC-SHA1") + * @param reqUrl URL of request token service + * @param authzUrl URL of authorize service * @param accessUrl URL of acess token service * @throws ProponoException on any sort of initialization error */ - public OAuthStrategy( - String username, String key, String secret, String keyType, - String reqUrl, String authzUrl, String accessUrl) throws ProponoException { + public OAuthStrategy(final String username, final String key, final String secret, final String keyType, final String reqUrl, final String authzUrl, + final String accessUrl) throws ProponoException { - this.username = username; - this.reqUrl = reqUrl; - this.authzUrl = authzUrl; - this.accessUrl = accessUrl; - this.consumerKey = key; - this.consumerSecret = secret; - this.keyType = keyType; + this.username = username; + this.reqUrl = reqUrl; + this.authzUrl = authzUrl; + this.accessUrl = accessUrl; + consumerKey = key; + consumerSecret = secret; + this.keyType = keyType; - this.nonce = UUID.randomUUID().toString(); - this.timestamp = (long)(new Date().getTime()/1000L); + nonce = UUID.randomUUID().toString(); + timestamp = new Date().getTime() / 1000L; init(); } @@ -103,7 +102,8 @@ public class OAuthStrategy implements AuthStrategy { callOAuthUri(accessUrl); } - public void addAuthentication(HttpClient httpClient, HttpMethodBase method) throws ProponoException { + @Override + public void addAuthentication(final HttpClient httpClient, final HttpMethodBase method) throws ProponoException { if (state != State.ACCESS_TOKEN) { throw new ProponoException("ERROR: authentication strategy failed init"); @@ -122,9 +122,9 @@ public class OAuthStrategy implements AuthStrategy { } // put query string into hashmap form to please OAuth.net classes - Map params = new HashMap(); - for (Iterator it = originalqlist.iterator(); it.hasNext();) { - NameValuePair pair = (NameValuePair)it.next(); + final Map params = new HashMap(); + for (final Iterator it = originalqlist.iterator(); it.hasNext();) { + final NameValuePair pair = (NameValuePair) it.next(); params.put(pair.getName(), pair.getValue()); } @@ -139,21 +139,18 @@ public class OAuthStrategy implements AuthStrategy { // sign complete URI String finalUri = null; - OAuthServiceProvider provider = - new OAuthServiceProvider(reqUrl, authzUrl, accessUrl); - OAuthConsumer consumer = - new OAuthConsumer(null, consumerKey, consumerSecret, provider); - OAuthAccessor accessor = new OAuthAccessor(consumer); + final OAuthServiceProvider provider = new OAuthServiceProvider(reqUrl, authzUrl, accessUrl); + final OAuthConsumer consumer = new OAuthConsumer(null, consumerKey, consumerSecret, provider); + final OAuthAccessor accessor = new OAuthAccessor(consumer); accessor.tokenSecret = tokenSecret; OAuthMessage message; try { - message = new OAuthMessage( - method.getName(), method.getURI().toString(), params.entrySet()); + message = new OAuthMessage(method.getName(), method.getURI().toString(), params.entrySet()); message.sign(accessor); - + finalUri = OAuth.addParameters(message.URL, message.getParameters()); - } catch (Exception ex) { + } catch (final Exception ex) { throw new ProponoException("ERROR: OAuth signing request", ex); } @@ -161,8 +158,7 @@ public class OAuthStrategy implements AuthStrategy { method.setQueryString(finalUri.substring(finalUri.lastIndexOf("?"))); } - - private void callOAuthUri(String uri) throws ProponoException { + private void callOAuthUri(final String uri) throws ProponoException { final HttpClient httpClient = new HttpClient(); @@ -183,24 +179,22 @@ public class OAuthStrategy implements AuthStrategy { params.put("oauth_nonce", nonce); params.put("oauth_callback", "none"); - OAuthServiceProvider provider = - new OAuthServiceProvider(reqUrl, authzUrl, accessUrl); - OAuthConsumer consumer = - new OAuthConsumer(null, consumerKey, consumerSecret, provider); - OAuthAccessor accessor = new OAuthAccessor(consumer); + final OAuthServiceProvider provider = new OAuthServiceProvider(reqUrl, authzUrl, accessUrl); + final OAuthConsumer consumer = new OAuthConsumer(null, consumerKey, consumerSecret, provider); + final OAuthAccessor accessor = new OAuthAccessor(consumer); if (state == State.UNAUTHORIZED) { try { - OAuthMessage message = new OAuthMessage("GET", uri, params.entrySet()); + final OAuthMessage message = new OAuthMessage("GET", uri, params.entrySet()); message.sign(accessor); - String finalUri = OAuth.addParameters(message.URL, message.getParameters()); + final String finalUri = OAuth.addParameters(message.URL, message.getParameters()); method = new GetMethod(finalUri); httpClient.executeMethod(method); content = method.getResponseBodyAsString(); - } catch (Exception e) { + } catch (final Exception e) { throw new ProponoException("ERROR fetching request token", e); } @@ -211,51 +205,50 @@ public class OAuthStrategy implements AuthStrategy { params.put("oauth_token_secret", tokenSecret); accessor.tokenSecret = tokenSecret; - OAuthMessage message = new OAuthMessage("POST", uri, params.entrySet()); + final OAuthMessage message = new OAuthMessage("POST", uri, params.entrySet()); message.sign(accessor); - String finalUri = OAuth.addParameters(message.URL, message.getParameters()); + final String finalUri = OAuth.addParameters(message.URL, message.getParameters()); method = new PostMethod(finalUri); httpClient.executeMethod(method); content = method.getResponseBodyAsString(); - } catch (Exception e) { + } catch (final Exception e) { throw new ProponoException("ERROR fetching request token", e); } } else if (state == State.AUTHORIZED) { - + try { params.put("oauth_token", accessToken); params.put("oauth_token_secret", tokenSecret); accessor.tokenSecret = tokenSecret; - OAuthMessage message = new OAuthMessage("GET", uri, params.entrySet()); + final OAuthMessage message = new OAuthMessage("GET", uri, params.entrySet()); message.sign(accessor); - String finalUri = OAuth.addParameters(message.URL, message.getParameters()); + final String finalUri = OAuth.addParameters(message.URL, message.getParameters()); method = new GetMethod(finalUri); httpClient.executeMethod(method); content = method.getResponseBodyAsString(); - - } catch (Exception e) { + + } catch (final Exception e) { throw new ProponoException("ERROR fetching request token", e); } - + } else { method = null; content = null; return; } - String token = null; String secret = null; if (content != null) { - String[] settings = content.split("&"); - for (int i=0; i 1) { if ("oauth_token".equals(setting[0])) { token = setting[1]; @@ -268,35 +261,33 @@ public class OAuthStrategy implements AuthStrategy { switch (state) { - case UNAUTHORIZED: - if (token != null && secret != null) { - requestToken = token; - tokenSecret = secret; - state = State.REQUEST_TOKEN; - } else { - throw new ProponoException("ERROR: requestToken or tokenSecret is null"); - } - break; + case UNAUTHORIZED: + if (token != null && secret != null) { + requestToken = token; + tokenSecret = secret; + state = State.REQUEST_TOKEN; + } else { + throw new ProponoException("ERROR: requestToken or tokenSecret is null"); + } + break; - case REQUEST_TOKEN: - if (method.getStatusCode() == 200) { - state = State.AUTHORIZED; - } else { - throw new ProponoException("ERROR: authorization returned code: " + method.getStatusCode()); - } - break; + case REQUEST_TOKEN: + if (method.getStatusCode() == 200) { + state = State.AUTHORIZED; + } else { + throw new ProponoException("ERROR: authorization returned code: " + method.getStatusCode()); + } + break; - case AUTHORIZED: - if (token != null && secret != null) { - accessToken = token; - tokenSecret = secret; - state = State.ACCESS_TOKEN; - } else { - throw new ProponoException("ERROR: accessToken or tokenSecret is null"); - } - break; + case AUTHORIZED: + if (token != null && secret != null) { + accessToken = token; + tokenSecret = secret; + state = State.ACCESS_TOKEN; + } else { + throw new ProponoException("ERROR: accessToken or tokenSecret is null"); + } + break; } } } - - diff --git a/src/main/java/org/rometools/propono/atom/common/AtomService.java b/src/main/java/org/rometools/propono/atom/common/AtomService.java index 444febe..bd2bcf9 100644 --- a/src/main/java/org/rometools/propono/atom/common/AtomService.java +++ b/src/main/java/org/rometools/propono/atom/common/AtomService.java @@ -1,24 +1,22 @@ /* -* 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. -*/ + * 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.rometools.propono.atom.common; - -import org.rometools.propono.utils.ProponoException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -26,59 +24,58 @@ import java.util.List; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.Namespace; +import org.rometools.propono.utils.ProponoException; /** - * Models an Atom Publishing Protocol Service Document. - * Is able to read a Service document from a JDOM Document - * and to write Service document out as a JDOM Document. + * Models an Atom Publishing Protocol Service Document. Is able to read a Service document from a JDOM Document and to write Service document out as a JDOM + * Document. */ public class AtomService { private List workspaces = new ArrayList(); - + /** Namespace for Atom Syndication Format */ - public static Namespace ATOM_FORMAT = - Namespace.getNamespace("atom","http://www.w3.org/2005/Atom"); - + public static Namespace ATOM_FORMAT = Namespace.getNamespace("atom", "http://www.w3.org/2005/Atom"); + /** Namespace for Atom Publishing Protocol */ - public static Namespace ATOM_PROTOCOL = - Namespace.getNamespace("app","http://www.w3.org/2007/app"); - + public static Namespace ATOM_PROTOCOL = Namespace.getNamespace("app", "http://www.w3.org/2007/app"); + /** * Create new and empty Atom service */ public AtomService() { } - + /** * Add Workspace to service. */ - public void addWorkspace(Workspace workspace) { + public void addWorkspace(final Workspace workspace) { workspaces.add(workspace); } - + /** * Get Workspaces available from service. */ public List getWorkspaces() { return workspaces; } - + /** * Set Workspaces of service. */ - public void setWorkspaces(List workspaces) { + public void setWorkspaces(final List workspaces) { this.workspaces = workspaces; } - + /** * Find workspace by title. + * * @param title Match this title * @return Matching Workspace or null if none found. */ - public Workspace findWorkspace(String title) { - for (Iterator it = workspaces.iterator(); it.hasNext();) { - Workspace ws = (Workspace) it.next(); + public Workspace findWorkspace(final String title) { + for (final Iterator it = workspaces.iterator(); it.hasNext();) { + final Workspace ws = (Workspace) it.next(); if (title.equals(ws.getTitle())) { return ws; } @@ -89,34 +86,33 @@ public class AtomService { /** * Deserialize an Atom service XML document into an object */ - public static AtomService documentToService(Document document) throws ProponoException { - AtomService service = new AtomService(); - Element root = document.getRootElement(); - List spaces = root.getChildren("workspace", ATOM_PROTOCOL); - Iterator iter = spaces.iterator(); + public static AtomService documentToService(final Document document) throws ProponoException { + final AtomService service = new AtomService(); + final Element root = document.getRootElement(); + final List spaces = root.getChildren("workspace", ATOM_PROTOCOL); + final Iterator iter = spaces.iterator(); while (iter.hasNext()) { - Element e = (Element) iter.next(); + final Element e = (Element) iter.next(); service.addWorkspace(Workspace.elementToWorkspace(e)); } return service; } - + /** * Serialize an AtomService object into an XML document */ public Document serviceToDocument() { - AtomService service = this; - - Document doc = new Document(); - Element root = new Element("service", ATOM_PROTOCOL); + final AtomService service = this; + + final Document doc = new Document(); + final Element root = new Element("service", ATOM_PROTOCOL); doc.setRootElement(root); - Iterator iter = service.getWorkspaces().iterator(); + final Iterator iter = service.getWorkspaces().iterator(); while (iter.hasNext()) { - Workspace space = (Workspace) iter.next(); + final Workspace space = (Workspace) iter.next(); root.addContent(space.workspaceToElement()); } return doc; } } - diff --git a/src/main/java/org/rometools/propono/atom/common/Categories.java b/src/main/java/org/rometools/propono/atom/common/Categories.java index 71eb086..9f45440 100644 --- a/src/main/java/org/rometools/propono/atom/common/Categories.java +++ b/src/main/java/org/rometools/propono/atom/common/Categories.java @@ -1,59 +1,60 @@ /* -* 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. -*/ + * 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.rometools.propono.atom.common; -import com.sun.syndication.feed.atom.Category; -import com.sun.syndication.io.impl.Atom10Parser; import java.util.ArrayList; import java.util.Iterator; import java.util.List; + import org.jdom2.Element; +import com.sun.syndication.feed.atom.Category; +import com.sun.syndication.io.impl.Atom10Parser; -/** - * Models an Atom protocol Categories element, which may contain ROME Atom - * {@link com.sun.syndication.feed.atom.Category} elements. +/** + * Models an Atom protocol Categories element, which may contain ROME Atom {@link com.sun.syndication.feed.atom.Category} elements. */ public class Categories { - private List categories = new ArrayList(); // of Category objects + private final List categories = new ArrayList(); // of Category objects private String baseURI = null; private Element categoriesElement = null; private String href = null; private String scheme = null; - private boolean fixed = false; - - public Categories() { + private boolean fixed = false; + + public Categories() { } - + /** Load select from XML element */ - public Categories(Element e, String baseURI) { - this.categoriesElement = e; + public Categories(final Element e, final String baseURI) { + categoriesElement = e; this.baseURI = baseURI; parseCategoriesElement(e); } - + /** Add category list of those specified */ - public void addCategory(Category cat) { + public void addCategory(final Category cat) { categories.add(cat); } - - /** - * Iterate over Category objects + + /** + * Iterate over Category objects + * * @return List of ROME Atom {@link com.sun.syndication.feed.atom.Category} */ public List getCategories() { @@ -66,7 +67,7 @@ public class Categories { } /** True if clients MUST use one of the categories specified */ - public void setFixed(boolean fixed) { + public void setFixed(final boolean fixed) { this.fixed = fixed; } @@ -76,34 +77,33 @@ public class Categories { } /** Category URI scheme to use for Categories without a scheme */ - public void setScheme(String scheme) { + public void setScheme(final String scheme) { this.scheme = scheme; } - + /** URI of out-of-line categories */ public String getHref() { return href; } /** URI of out-of-line categories */ - public void setHref(String href) { + public void setHref(final String href) { this.href = href; } /** Get unresolved URI of the collection, or null if impossible to determine */ public String getHrefResolved() { if (Atom10Parser.isAbsoluteURI(href)) { - return href; + return href; } else if (baseURI != null && categoriesElement != null) { - return Atom10Parser.resolveURI( - baseURI, categoriesElement, href); + return Atom10Parser.resolveURI(baseURI, categoriesElement, href); } return null; } - + public Element categoriesToElement() { - Categories cats = this; - Element catsElem = new Element("categories", AtomService.ATOM_PROTOCOL); + final Categories cats = this; + final Element catsElem = new Element("categories", AtomService.ATOM_PROTOCOL); catsElem.setAttribute("fixed", cats.isFixed() ? "yes" : "no", AtomService.ATOM_PROTOCOL); if (cats.getScheme() != null) { catsElem.setAttribute("scheme", cats.getScheme(), AtomService.ATOM_PROTOCOL); @@ -112,9 +112,9 @@ public class Categories { catsElem.setAttribute("href", cats.getHref(), AtomService.ATOM_PROTOCOL); } else { // Loop to create elements - for (Iterator catIter = cats.getCategories().iterator(); catIter.hasNext();) { - Category cat = (Category) catIter.next(); - Element catElem = new Element("category", AtomService.ATOM_FORMAT); + for (final Iterator catIter = cats.getCategories().iterator(); catIter.hasNext();) { + final Category cat = (Category) catIter.next(); + final Element catElem = new Element("category", AtomService.ATOM_FORMAT); catElem.setAttribute("term", cat.getTerm(), AtomService.ATOM_FORMAT); if (cat.getScheme() != null) { // optional catElem.setAttribute("scheme", cat.getScheme(), AtomService.ATOM_FORMAT); @@ -123,33 +123,32 @@ public class Categories { catElem.setAttribute("label", cat.getLabel(), AtomService.ATOM_FORMAT); } catsElem.addContent(catElem); - } + } } return catsElem; } - - protected void parseCategoriesElement(Element catsElem) { + + protected void parseCategoriesElement(final Element catsElem) { if (catsElem.getAttribute("href", AtomService.ATOM_PROTOCOL) != null) { setHref(catsElem.getAttribute("href", AtomService.ATOM_PROTOCOL).getValue()); } - if (catsElem.getAttribute("fixed", AtomService.ATOM_PROTOCOL) != null) { + if (catsElem.getAttribute("fixed", AtomService.ATOM_PROTOCOL) != null) { if ("yes".equals(catsElem.getAttribute("fixed", AtomService.ATOM_PROTOCOL).getValue())) { - setFixed(true); + setFixed(true); } } - if (catsElem.getAttribute("scheme", AtomService.ATOM_PROTOCOL) != null) { + if (catsElem.getAttribute("scheme", AtomService.ATOM_PROTOCOL) != null) { setScheme(catsElem.getAttribute("scheme", AtomService.ATOM_PROTOCOL).getValue()); } // Loop to parse elemenents to Category objects - List catElems = catsElem.getChildren("category", AtomService.ATOM_FORMAT); - for (Iterator catIter = catElems.iterator(); catIter.hasNext();) { - Element catElem = (Element) catIter.next(); - Category cat = new Category(); - cat.setTerm(catElem.getAttributeValue("term", AtomService.ATOM_FORMAT)); - cat.setLabel(catElem.getAttributeValue("label", AtomService.ATOM_FORMAT)); + final List catElems = catsElem.getChildren("category", AtomService.ATOM_FORMAT); + for (final Iterator catIter = catElems.iterator(); catIter.hasNext();) { + final Element catElem = (Element) catIter.next(); + final Category cat = new Category(); + cat.setTerm(catElem.getAttributeValue("term", AtomService.ATOM_FORMAT)); + cat.setLabel(catElem.getAttributeValue("label", AtomService.ATOM_FORMAT)); cat.setScheme(catElem.getAttributeValue("scheme", AtomService.ATOM_FORMAT)); addCategory(cat); } } } - diff --git a/src/main/java/org/rometools/propono/atom/common/Collection.java b/src/main/java/org/rometools/propono/atom/common/Collection.java index fc36e28..c2868bc 100644 --- a/src/main/java/org/rometools/propono/atom/common/Collection.java +++ b/src/main/java/org/rometools/propono/atom/common/Collection.java @@ -1,129 +1,131 @@ /* -* 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. -*/ + * 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.rometools.propono.atom.common; -import com.sun.syndication.io.impl.Atom10Parser; -import org.rometools.propono.utils.ProponoException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import org.jdom2.Element; +import org.jdom2.Element; +import org.rometools.propono.utils.ProponoException; + +import com.sun.syndication.io.impl.Atom10Parser; /** - * Models an Atom workspace collection. + * Models an Atom workspace collection. */ public class Collection { - + public static final String ENTRY_TYPE = "application/atom+xml;type=entry"; - + private Element collectionElement = null; private String baseURI = null; private String title = null; private String titleType = null; // may be TEXT, HTML, XHTML private List accepts = new ArrayList(); // of Strings - private String listTemplate = null; + private final String listTemplate = null; private String href = null; - private List categories = new ArrayList(); // of Categories objects - + private final List categories = new ArrayList(); // of Categories objects + /** * Collection MUST have title and href. - * @param title Title for collection + * + * @param title Title for collection * @param titleType Content type of title (null for plain text) - * @param href Collection URI. + * @param href Collection URI. */ - public Collection(String title, String titleType, String href) { + public Collection(final String title, final String titleType, final String href) { this.title = title; this.titleType = titleType; this.href = href; } /** Load self from XML element */ - public Collection(Element e) throws ProponoException { - this.collectionElement = e; - this.parseCollectionElement(e); + public Collection(final Element e) throws ProponoException { + collectionElement = e; + parseCollectionElement(e); } - + /** Load self from XML element and base URI for resolving relative URIs */ - public Collection(Element e, String baseURI) throws ProponoException { - this.collectionElement = e; + public Collection(final Element e, final String baseURI) throws ProponoException { + collectionElement = e; this.baseURI = baseURI; - this.parseCollectionElement(e); + parseCollectionElement(e); } - + /** * List of content-type ranges accepted by collection. */ public List getAccepts() { return accepts; } - - public void addAccept(String accept) { - this.accepts.add(accept); + + public void addAccept(final String accept) { + accepts.add(accept); } - - public void setAccepts(List accepts) { + + public void setAccepts(final List accepts) { this.accepts = accepts; } - + /** The URI of the collection */ public String getHref() { return href; } - + /** * Set URI of collection */ - public void setHref(String href) { + public void setHref(final String href) { this.href = href; } - + /** Get resolved URI of the collection, or null if impossible to determine */ public String getHrefResolved() { if (Atom10Parser.isAbsoluteURI(href)) { - return href; + return href; } else if (baseURI != null && collectionElement != null) { - int lastslash = baseURI.lastIndexOf("/"); + final int lastslash = baseURI.lastIndexOf("/"); return Atom10Parser.resolveURI(baseURI.substring(0, lastslash), collectionElement, href); } return null; } - + /** Get resolved URI using collection's baseURI, or null if impossible to determine */ - public String getHrefResolved(String relativeUri) { + public String getHrefResolved(final String relativeUri) { if (Atom10Parser.isAbsoluteURI(relativeUri)) { - return relativeUri; + return relativeUri; } else if (baseURI != null && collectionElement != null) { - int lastslash = baseURI.lastIndexOf("/"); + final int lastslash = baseURI.lastIndexOf("/"); return Atom10Parser.resolveURI(baseURI.substring(0, lastslash), collectionElement, relativeUri); } return null; } - + /** Must have human readable title */ public String getTitle() { return title; } - + /** * Set title of collection. */ - public void setTitle(String title) { + public void setTitle(final String title) { this.title = title; } @@ -137,32 +139,35 @@ public class Collection { /** * Type of title ("text", "html" or "xhtml") */ - public void setTitleType(String titleType) { + public void setTitleType(final String titleType) { this.titleType = titleType; } /** Workspace can have multiple Categories objects */ - public void addCategories(Categories cats) { + public void addCategories(final Categories cats) { categories.add(cats); } - + /** * Get categories allowed by collection. + * * @return Collection of {@link com.sun.syndication.propono.atom.common.Categories} objects. */ public List getCategories() { return categories; } - + /** * Returns true if contentType is accepted by collection. */ - public boolean accepts(String ct) { - for (Iterator it = accepts.iterator(); it.hasNext();) { - String accept = (String)it.next(); - if (accept != null && accept.trim().equals("*/*")) return true; - String entryType = "application/atom+xml"; - boolean entry = entryType.equals(ct); + public boolean accepts(final String ct) { + for (final Iterator it = accepts.iterator(); it.hasNext();) { + final String accept = (String) it.next(); + if (accept != null && accept.trim().equals("*/*")) { + return true; + } + final String entryType = "application/atom+xml"; + final boolean entry = entryType.equals(ct); if (entry && null == accept) { return true; } else if (entry && "entry".equals(accept)) { @@ -170,83 +175,86 @@ public class Collection { } else if (entry && entryType.equals(accept)) { return true; } else { - String[] rules = (String[])accepts.toArray(new String[accepts.size()]); - for (int i=0; i 0) { rule = rule.substring(0, slashstar + 1); - if (ct.startsWith(rule)) return true; + if (ct.startsWith(rule)) { + return true; + } } } } } return false; } - + /** * Serialize an AtomService.Collection into an XML element */ public Element collectionToElement() { - Collection collection = this; - Element element = new Element("collection", AtomService.ATOM_PROTOCOL); + final Collection collection = this; + final Element element = new Element("collection", AtomService.ATOM_PROTOCOL); element.setAttribute("href", collection.getHref()); - - Element titleElem = new Element("title", AtomService.ATOM_FORMAT); + + final Element titleElem = new Element("title", AtomService.ATOM_FORMAT); titleElem.setText(collection.getTitle()); if (collection.getTitleType() != null && !collection.getTitleType().equals("TEXT")) { titleElem.setAttribute("type", collection.getTitleType(), AtomService.ATOM_FORMAT); } element.addContent(titleElem); - - // Loop to create elements - for (Iterator it = collection.getCategories().iterator(); it.hasNext();) { - Categories cats = (Categories)it.next(); - element.addContent(cats.categoriesToElement()); + + // Loop to create elements + for (final Iterator it = collection.getCategories().iterator(); it.hasNext();) { + final Categories cats = (Categories) it.next(); + element.addContent(cats.categoriesToElement()); } - - for (Iterator it = collection.getAccepts().iterator(); it.hasNext();) { - String range = (String)it.next(); - Element acceptElem = new Element("accept", AtomService.ATOM_PROTOCOL); + + for (final Iterator it = collection.getAccepts().iterator(); it.hasNext();) { + final String range = (String) it.next(); + final Element acceptElem = new Element("accept", AtomService.ATOM_PROTOCOL); acceptElem.setText(range); element.addContent(acceptElem); } - + return element; } - + /** Deserialize an Atom service collection XML element into an object */ - public Collection elementToCollection(Element element) throws ProponoException { + public Collection elementToCollection(final Element element) throws ProponoException { return new Collection(element); } - - protected void parseCollectionElement(Element element) throws ProponoException { + + protected void parseCollectionElement(final Element element) throws ProponoException { setHref(element.getAttribute("href").getValue()); - - Element titleElem = element.getChild("title", AtomService.ATOM_FORMAT); + + final Element titleElem = element.getChild("title", AtomService.ATOM_FORMAT); if (titleElem != null) { setTitle(titleElem.getText()); if (titleElem.getAttribute("type", AtomService.ATOM_FORMAT) != null) { setTitleType(titleElem.getAttribute("type", AtomService.ATOM_FORMAT).getValue()); } } - - List acceptElems = element.getChildren("accept", AtomService.ATOM_PROTOCOL); + + final List acceptElems = element.getChildren("accept", AtomService.ATOM_PROTOCOL); if (acceptElems != null && acceptElems.size() > 0) { - for (Iterator it = acceptElems.iterator(); it.hasNext();) { - Element acceptElem = (Element)it.next(); + for (final Iterator it = acceptElems.iterator(); it.hasNext();) { + final Element acceptElem = (Element) it.next(); addAccept(acceptElem.getTextTrim()); } } - + // Loop to parse element to Categories objects - List catsElems = element.getChildren("categories", AtomService.ATOM_PROTOCOL); - for (Iterator catsIter = catsElems.iterator(); catsIter.hasNext();) { - Element catsElem = (Element) catsIter.next(); - Categories cats = new Categories(catsElem, baseURI); + final List catsElems = element.getChildren("categories", AtomService.ATOM_PROTOCOL); + for (final Iterator catsIter = catsElems.iterator(); catsIter.hasNext();) { + final Element catsElem = (Element) catsIter.next(); + final Categories cats = new Categories(catsElem, baseURI); addCategories(cats); } - } + } } - diff --git a/src/main/java/org/rometools/propono/atom/common/Workspace.java b/src/main/java/org/rometools/propono/atom/common/Workspace.java index 62b573c..7195b2f 100644 --- a/src/main/java/org/rometools/propono/atom/common/Workspace.java +++ b/src/main/java/org/rometools/propono/atom/common/Workspace.java @@ -1,28 +1,28 @@ /* -* 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. -*/ + * 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.rometools.propono.atom.common; -import org.rometools.propono.utils.ProponoException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import org.jdom2.Element; +import org.jdom2.Element; +import org.rometools.propono.utils.ProponoException; /** * Models an Atom workspace. @@ -30,43 +30,44 @@ import org.jdom2.Element; public class Workspace { private String title = null; private String titleType = null; // may be TEXT, HTML, XHTML - private List collections = new ArrayList(); - + private final List collections = new ArrayList(); + /** * Collection MUST have title. - * @param title Title for collection + * + * @param title Title for collection * @param titleType Content type of title (null for plain text) */ - public Workspace(String title, String titleType) { + public Workspace(final String title, final String titleType) { this.title = title; this.titleType = titleType; } - - public Workspace(Element elem) throws ProponoException { + + public Workspace(final Element elem) throws ProponoException { parseWorkspaceElement(elem); } - + /** Iterate over collections in workspace */ public List getCollections() { return collections; } - + /** Add new collection to workspace */ - public void addCollection(Collection col) { + public void addCollection(final Collection col) { collections.add(col); } - + /** * DefaultWorkspace must have a human readable title */ public String getTitle() { return title; } - + /** * Set title of workspace. */ - public void setTitle(String title) { + public void setTitle(final String title) { this.title = title; } @@ -80,19 +81,20 @@ public class Workspace { /** * Set title type ("text", "html", "xhtml" or MIME content-type) */ - public void setTitleType(String titleType) { + public void setTitleType(final String titleType) { this.titleType = titleType; } - + /** * Find collection by title and/or content-type. + * * @param title Title or null to match all titles. * @param contentType Content-type or null to match all content-types. * @return First Collection that matches title and/or content-type. */ - public Collection findCollection(String title, String contentType) { - for (Iterator it = collections.iterator(); it.hasNext();) { - Collection col = (Collection) it.next(); + public Collection findCollection(final String title, final String contentType) { + for (final Iterator it = collections.iterator(); it.hasNext();) { + final Collection col = (Collection) it.next(); if (title != null && col.accepts(contentType)) { return col; } else if (col.accepts(contentType)) { @@ -101,46 +103,46 @@ public class Workspace { } return null; } - + /** Deserialize a Atom workspace XML element into an object */ - public static Workspace elementToWorkspace(Element element) throws ProponoException { + public static Workspace elementToWorkspace(final Element element) throws ProponoException { return new Workspace(element); } - + /** * Serialize an AtomService.DefaultWorkspace object into an XML element */ public Element workspaceToElement() { - Workspace space = this; - - Element element = new Element("workspace", AtomService.ATOM_PROTOCOL); - - Element titleElem = new Element("title", AtomService.ATOM_FORMAT); + final Workspace space = this; + + final Element element = new Element("workspace", AtomService.ATOM_PROTOCOL); + + final Element titleElem = new Element("title", AtomService.ATOM_FORMAT); titleElem.setText(space.getTitle()); if (space.getTitleType() != null && !space.getTitleType().equals("TEXT")) { titleElem.setAttribute("type", space.getTitleType(), AtomService.ATOM_FORMAT); } element.addContent(titleElem); - - Iterator iter = space.getCollections().iterator(); + + final Iterator iter = space.getCollections().iterator(); while (iter.hasNext()) { - Collection col = (Collection) iter.next(); + final Collection col = (Collection) iter.next(); element.addContent(col.collectionToElement()); } return element; } /** Deserialize a Atom workspace XML element into an object */ - protected void parseWorkspaceElement(Element element) throws ProponoException { - Element titleElem = element.getChild("title", AtomService.ATOM_FORMAT); + protected void parseWorkspaceElement(final Element element) throws ProponoException { + final Element titleElem = element.getChild("title", AtomService.ATOM_FORMAT); setTitle(titleElem.getText()); if (titleElem.getAttribute("type", AtomService.ATOM_FORMAT) != null) { setTitleType(titleElem.getAttribute("type", AtomService.ATOM_FORMAT).getValue()); - } - List collections = element.getChildren("collection", AtomService.ATOM_PROTOCOL); - Iterator iter = collections.iterator(); + } + final List collections = element.getChildren("collection", AtomService.ATOM_PROTOCOL); + final Iterator iter = collections.iterator(); while (iter.hasNext()) { - Element e = (Element) iter.next(); + final Element e = (Element) iter.next(); addCollection(new Collection(e)); } } diff --git a/src/main/java/org/rometools/propono/atom/common/rome/AppModule.java b/src/main/java/org/rometools/propono/atom/common/rome/AppModule.java index ca95f52..2bc6dab 100644 --- a/src/main/java/org/rometools/propono/atom/common/rome/AppModule.java +++ b/src/main/java/org/rometools/propono/atom/common/rome/AppModule.java @@ -19,24 +19,25 @@ */ package org.rometools.propono.atom.common.rome; -import com.sun.syndication.feed.module.Module; import java.util.Date; +import com.sun.syndication.feed.module.Module; + /** * ROME Extension Module to Atom protocol extensions to Atom format. */ public interface AppModule extends Module { public static final String URI = "http://www.w3.org/2007/app"; - + /** True if entry is a draft */ public Boolean getDraft(); - + /** Set to true if entry is a draft */ public void setDraft(Boolean draft); - + /** Time of last edit */ public Date getEdited(); - + /** Set time of last edit */ public void setEdited(Date edited); } diff --git a/src/main/java/org/rometools/propono/atom/common/rome/AppModuleGenerator.java b/src/main/java/org/rometools/propono/atom/common/rome/AppModuleGenerator.java index 39b4f8f..81991d5 100644 --- a/src/main/java/org/rometools/propono/atom/common/rome/AppModuleGenerator.java +++ b/src/main/java/org/rometools/propono/atom/common/rome/AppModuleGenerator.java @@ -19,27 +19,26 @@ */ package org.rometools.propono.atom.common.rome; -import com.sun.syndication.io.impl.DateParser; +import java.text.SimpleDateFormat; import java.util.Collections; import java.util.HashSet; +import java.util.Locale; import java.util.Set; +import java.util.TimeZone; import org.jdom2.Element; import org.jdom2.Namespace; import com.sun.syndication.feed.module.Module; import com.sun.syndication.io.ModuleGenerator; -import java.text.SimpleDateFormat; -import java.util.Locale; -import java.util.TimeZone; /** * Creates JDOM representation for APP Extension Module. */ public class AppModuleGenerator implements ModuleGenerator { - private static final Namespace APP_NS = - Namespace.getNamespace("app", AppModule.URI); + private static final Namespace APP_NS = Namespace.getNamespace("app", AppModule.URI); + @Override public String getNamespaceUri() { return AppModule.URI; } @@ -47,38 +46,40 @@ public class AppModuleGenerator implements ModuleGenerator { private static final Set NAMESPACES; static { - Set nss = new HashSet(); + final Set nss = new HashSet(); nss.add(APP_NS); NAMESPACES = Collections.unmodifiableSet(nss); } - + /** Get namespaces associated with this module */ + @Override public Set getNamespaces() { return NAMESPACES; } /** Generate JDOM element for module and add it to parent element */ - public void generate(Module module, Element parent) { - AppModule m = (AppModule)module; - + @Override + public void generate(final Module module, final Element parent) { + final AppModule m = (AppModule) module; + if (m.getDraft() != null) { - String draft = m.getDraft().booleanValue() ? "yes" : "no"; - Element control = new Element("control", APP_NS); + final String draft = m.getDraft().booleanValue() ? "yes" : "no"; + final Element control = new Element("control", APP_NS); control.addContent(generateSimpleElement("draft", draft)); parent.addContent(control); } if (m.getEdited() != null) { - Element edited = new Element("edited", APP_NS); + final Element edited = new Element("edited", APP_NS); // Inclulde millis in date/time - SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US); + final SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US); dateFormater.setTimeZone(TimeZone.getTimeZone("GMT")); edited.addContent(dateFormater.format(m.getEdited())); parent.addContent(edited); } } - private Element generateSimpleElement(String name, String value) { - Element element = new Element(name, APP_NS); + private Element generateSimpleElement(final String name, final String value) { + final Element element = new Element(name, APP_NS); element.addContent(value); return element; } diff --git a/src/main/java/org/rometools/propono/atom/common/rome/AppModuleImpl.java b/src/main/java/org/rometools/propono/atom/common/rome/AppModuleImpl.java index 84952b0..974473c 100644 --- a/src/main/java/org/rometools/propono/atom/common/rome/AppModuleImpl.java +++ b/src/main/java/org/rometools/propono/atom/common/rome/AppModuleImpl.java @@ -20,9 +20,10 @@ */ package org.rometools.propono.atom.common.rome; +import java.util.Date; + import com.sun.syndication.feed.CopyFrom; import com.sun.syndication.feed.module.ModuleImpl; -import java.util.Date; /** * Bean representation of APP module. @@ -30,39 +31,45 @@ import java.util.Date; public class AppModuleImpl extends ModuleImpl implements AppModule { private boolean draft = false; private Date edited = null; - + public AppModuleImpl() { super(AppModule.class, AppModule.URI); } - + /** True if entry is draft */ + @Override public Boolean getDraft() { return draft ? Boolean.TRUE : Boolean.FALSE; } - + /** Set to true if entry is draft */ - public void setDraft(Boolean draft) { + @Override + public void setDraft(final Boolean draft) { this.draft = draft.booleanValue(); } - + /** Time of last edit */ + @Override public Date getEdited() { return edited; } /** Set time of last edit */ - public void setEdited(Date edited) { + @Override + public void setEdited(final Date edited) { this.edited = edited; } - + /** Get interface class of module */ + @Override public Class getInterface() { return AppModule.class; } - + /** Copy from other module */ - public void copyFrom(CopyFrom obj) { - AppModule m = (AppModule)obj; + @Override + public void copyFrom(final CopyFrom obj) { + final AppModule m = (AppModule) obj; setDraft(m.getDraft()); setEdited(m.getEdited()); } diff --git a/src/main/java/org/rometools/propono/atom/common/rome/AppModuleParser.java b/src/main/java/org/rometools/propono/atom/common/rome/AppModuleParser.java index b8e2f79..d40ba28 100644 --- a/src/main/java/org/rometools/propono/atom/common/rome/AppModuleParser.java +++ b/src/main/java/org/rometools/propono/atom/common/rome/AppModuleParser.java @@ -19,20 +19,20 @@ */ package org.rometools.propono.atom.common.rome; -import com.sun.syndication.io.impl.DateParser; import org.jdom2.Element; import org.jdom2.Namespace; import com.sun.syndication.feed.module.Module; import com.sun.syndication.io.ModuleParser; +import com.sun.syndication.io.impl.DateParser; /** - * Parses APP module information from a JDOM element and into - * AppModule form. + * Parses APP module information from a JDOM element and into AppModule form. */ public class AppModuleParser implements ModuleParser { /** Get URI of module namespace */ + @Override public String getNamespaceUri() { return AppModule.URI; } @@ -41,26 +41,31 @@ public class AppModuleParser implements ModuleParser { public Namespace getContentNamespace() { return Namespace.getNamespace(AppModule.URI); } - + /** Parse JDOM element into module */ - public Module parse(Element elem) { - boolean foundSomething = false; - AppModule m = new AppModuleImpl(); - Element control = elem.getChild("control", getContentNamespace()); + @Override + public Module parse(final Element elem) { + final boolean foundSomething = false; + final AppModule m = new AppModuleImpl(); + final Element control = elem.getChild("control", getContentNamespace()); if (control != null) { - Element draftElem = control.getChild("draft", getContentNamespace()); + final Element draftElem = control.getChild("draft", getContentNamespace()); if (draftElem != null) { - if ("yes".equals(draftElem.getText())) m.setDraft(Boolean.TRUE); - if ("no".equals(draftElem.getText())) m.setDraft(Boolean.FALSE); + if ("yes".equals(draftElem.getText())) { + m.setDraft(Boolean.TRUE); + } + if ("no".equals(draftElem.getText())) { + m.setDraft(Boolean.FALSE); + } } } - Element edited = elem.getChild("edited", getContentNamespace()); + final Element edited = elem.getChild("edited", getContentNamespace()); if (edited != null) { try { m.setEdited(DateParser.parseW3CDateTime(edited.getTextTrim())); - } catch (Exception ignored) {} + } catch (final Exception ignored) { + } } return m; } } - diff --git a/src/main/java/org/rometools/propono/atom/server/AtomException.java b/src/main/java/org/rometools/propono/atom/server/AtomException.java index 7b88a1f..6e7848f 100644 --- a/src/main/java/org/rometools/propono/atom/server/AtomException.java +++ b/src/main/java/org/rometools/propono/atom/server/AtomException.java @@ -21,28 +21,30 @@ package org.rometools.propono.atom.server; import javax.servlet.http.HttpServletResponse; - /** - * Exception thrown by {@link com.sun.syndication.propono.atom.server.AtomHandler} - * and extended by other Propono Atom exception classes. + * Exception thrown by {@link com.sun.syndication.propono.atom.server.AtomHandler} and extended by other Propono Atom exception classes. */ public class AtomException extends Exception { /** Construct new exception */ public AtomException() { super(); } + /** Construct new exception with message */ - public AtomException(String msg) { + public AtomException(final String msg) { super(msg); } + /** Contruct new exception with message and wrapping existing exception */ - public AtomException(String msg, Throwable t) { + public AtomException(final String msg, final Throwable t) { super(msg, t); } + /** Construct new exception to wrap existing one. */ - public AtomException(Throwable t) { + public AtomException(final Throwable t) { super(t); } + /* Get HTTP status code associated with exception (HTTP 500 server error) */ /** * Get HTTP status associated with exception. diff --git a/src/main/java/org/rometools/propono/atom/server/AtomHandler.java b/src/main/java/org/rometools/propono/atom/server/AtomHandler.java index 9480b32..eaafc29 100644 --- a/src/main/java/org/rometools/propono/atom/server/AtomHandler.java +++ b/src/main/java/org/rometools/propono/atom/server/AtomHandler.java @@ -19,37 +19,32 @@ */ package org.rometools.propono.atom.server; -import com.sun.syndication.feed.atom.Entry; -import com.sun.syndication.feed.atom.Feed; import org.rometools.propono.atom.common.AtomService; import org.rometools.propono.atom.common.Categories; +import com.sun.syndication.feed.atom.Entry; +import com.sun.syndication.feed.atom.Feed; + /** * Interface for handling single Atom protocol requests. - * - *

To create your own Atom protocol implementation you must implement this - * interface and create a concrete sub-class of - * {@link com.sun.syndication.propono.atom.server.AtomHandlerFactory} - * which is capable of instantiating it.

+ * + *

+ * To create your own Atom protocol implementation you must implement this interface and create a concrete sub-class of + * {@link com.sun.syndication.propono.atom.server.AtomHandlerFactory} which is capable of instantiating it. + *

*/ -public interface AtomHandler -{ - /** - * Get username of authenticated user. Return the username of the - * authenticated user +public interface AtomHandler { + /** + * Get username of authenticated user. Return the username of the authenticated user */ public String getAuthenticatedUsername(); /** - * Return - * {@link com.sun.syndication.propono.atom.common.AtomService} - * object that contains the - * {@link com.sun.syndication.propono.atom.common.Workspace} objects - * available to the currently authenticated user and within those the - * {@link com.sun.syndication.propono.atom.common.Collection} avalaible. + * Return {@link com.sun.syndication.propono.atom.common.AtomService} object that contains the {@link com.sun.syndication.propono.atom.common.Workspace} + * objects available to the currently authenticated user and within those the {@link com.sun.syndication.propono.atom.common.Collection} avalaible. */ public AtomService getAtomService(AtomRequest req) throws AtomException; - + /** * Get categories, a list of Categories objects */ @@ -57,13 +52,14 @@ public interface AtomHandler /** * Return collection or portion of collection specified by request. + * * @param req Details of HTTP request */ public Feed getCollection(AtomRequest req) throws AtomException; /** - * Store new entry in collection specified by request and return - * representation of entry as it is stored on server. + * Store new entry in collection specified by request and return representation of entry as it is stored on server. + * * @param req Details of HTTP request * @return Location URL of new entry */ @@ -71,74 +67,81 @@ public interface AtomHandler /** * Get entry specified by request. + * * @param req Details of HTTP request */ public Entry getEntry(AtomRequest req) throws AtomException; /** * Get media resource specified by request. + * * @param req Details of HTTP request */ public AtomMediaResource getMediaResource(AtomRequest req) throws AtomException; /** - * Update entry specified by request and return new entry as represented - * on the server. + * Update entry specified by request and return new entry as represented on the server. + * * @param req Details of HTTP request */ public void putEntry(AtomRequest req, Entry entry) throws AtomException; - /** * Delete entry specified by request. + * * @param req Details of HTTP request */ public void deleteEntry(AtomRequest req) throws AtomException; /** - * Store media data in collection specified by request, create an Atom - * media-link entry to store metadata for the new media file and return - * that entry to the caller. + * Store media data in collection specified by request, create an Atom media-link entry to store metadata for the new media file and return that entry to + * the caller. + * * @param req Details of HTTP request - * @param entry New entry initialzied with only title and content type + * @param entry New entry initialzied with only title and content type * @return Location URL of new media entry */ public Entry postMedia(AtomRequest req, Entry entry) throws AtomException; /** * Update the media file part of a media-link entry. + * * @param req Details of HTTP request */ public void putMedia(AtomRequest req) throws AtomException; /** * Return true if specified request represents URI of a Service Document. + * * @param req Details of HTTP request */ public boolean isAtomServiceURI(AtomRequest req); /** * Return true if specified request represents URI of a Categories Document. + * * @param req Details of HTTP request */ public boolean isCategoriesURI(AtomRequest req); /** * Return true if specified request represents URI of a collection. + * * @param req Details of HTTP request */ public boolean isCollectionURI(AtomRequest req); /** * Return true if specified request represents URI of an Atom entry. + * * @param req Details of HTTP request */ public boolean isEntryURI(AtomRequest req); /** * Return true if specified patrequesthinfo represents media-edit URI. + * * @param req Details of HTTP request */ public boolean isMediaEditURI(AtomRequest req); } - diff --git a/src/main/java/org/rometools/propono/atom/server/AtomHandlerFactory.java b/src/main/java/org/rometools/propono/atom/server/AtomHandlerFactory.java index 8a53639..a0b4a6a 100644 --- a/src/main/java/org/rometools/propono/atom/server/AtomHandlerFactory.java +++ b/src/main/java/org/rometools/propono/atom/server/AtomHandlerFactory.java @@ -12,102 +12,79 @@ * 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. - */ + */ package org.rometools.propono.atom.server; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** - * Defines a factory that enables the - * {@link com.sun.syndication.propono.atom.server.AtomServlet} to obtain an + * Defines a factory that enables the {@link com.sun.syndication.propono.atom.server.AtomServlet} to obtain an * {@link com.sun.syndication.propono.atom.server.AtomHandler} that handles an Atom request. - * - *

To create your own Atom protocol implementation you must sub-class this - * class with your own factory that is capable of creating instances of your - * {@link com.sun.syndication.propono.atom.server.AtomHandler} impementation.

+ * + *

+ * To create your own Atom protocol implementation you must sub-class this class with your own factory that is capable of creating instances of your + * {@link com.sun.syndication.propono.atom.server.AtomHandler} impementation. + *

*/ public abstract class AtomHandlerFactory { - private static Log log = - LogFactory.getFactory().getInstance(AtomHandlerFactory.class); - - private static final String DEFAULT_PROPERTY_NAME = - "com.sun.syndication.propono.atom.server.AtomHandlerFactory"; - - private static final String FALLBACK_IMPL_NAME = - "com.sun.syndication.propono.atom.server.impl.FileBasedAtomHandlerFactory"; - + private static Log log = LogFactory.getFactory().getInstance(AtomHandlerFactory.class); + + private static final String DEFAULT_PROPERTY_NAME = "com.sun.syndication.propono.atom.server.AtomHandlerFactory"; + + private static final String FALLBACK_IMPL_NAME = "com.sun.syndication.propono.atom.server.impl.FileBasedAtomHandlerFactory"; + /* - *

Protected constructor to prevent instantiation. - * Use {@link #newInstance()}.

+ *

Protected constructor to prevent instantiation. Use {@link #newInstance()}.

*/ protected AtomHandlerFactory() { } /** - * Obtain a new instance of a AtomHandlerFactory. This static - * method creates a new factory instance. This method uses the following - * ordered lookup procedure to determine the AtomHandlerFactory - * implementation class to load: + * Obtain a new instance of a AtomHandlerFactory. This static method creates a new factory instance. This method uses the following ordered + * lookup procedure to determine the AtomHandlerFactory implementation class to load: *
    - *
  • - * Use the com.sun.syndication.propono.atom.server.AtomHandlerFactory - * system property. - *
  • - *
  • - * Use the properties file "/propono.properties" in the classpath. - * This configuration file is in standard java.util.Properties - * format and contains the fully qualified name of the implementation - * class with the key being the system property defined above. - * - * The propono.properties file is read only once by Propono and it's - * values are then cached for future use. If the file does not exist - * when the first attempt is made to read from it, no further attempts - * are made to check for its existence. It is not possible to change - * the value of any property in propono.properties after it has been - * read for the first time. - *
  • - *
  • - * If not available, to determine the classname. The Services API will look - * for a classname in the file: - * META-INF/services/com.sun.syndication.AtomHandlerFactory - * in jars available to the runtime. - *
  • - *
  • - * Platform default AtomHandlerFactory instance. - *
  • + *
  • + * Use the com.sun.syndication.propono.atom.server.AtomHandlerFactory system property.
  • + *
  • + * Use the properties file "/propono.properties" in the classpath. This configuration file is in standard java.util.Properties format and + * contains the fully qualified name of the implementation class with the key being the system property defined above. + * + * The propono.properties file is read only once by Propono and it's values are then cached for future use. If the file does not exist when the first + * attempt is made to read from it, no further attempts are made to check for its existence. It is not possible to change the value of any property in + * propono.properties after it has been read for the first time.
  • + *
  • + * If not available, to determine the classname. The Services API will look for a classname in the file: + * META-INF/services/com.sun.syndication.AtomHandlerFactory in jars available to the runtime.
  • + *
  • + * Platform default AtomHandlerFactory instance.
  • *
- * - * Once an application has obtained a reference to a AtomHandlerFactory - * it can use the factory to configure and obtain parser instances. - * + * + * Once an application has obtained a reference to a AtomHandlerFactory it can use the factory to configure and obtain parser instances. + * * @return New instance of a AtomHandlerFactory - * - * @throws FactoryConfigurationError if the implementation is not available - * or cannot be instantiated. + * + * @throws FactoryConfigurationError if the implementation is not available or cannot be instantiated. */ public static AtomHandlerFactory newInstance() { try { - return (AtomHandlerFactory) - FactoryFinder.find(DEFAULT_PROPERTY_NAME, FALLBACK_IMPL_NAME); - } catch (FactoryFinder.ConfigurationError e) { + return (AtomHandlerFactory) FactoryFinder.find(DEFAULT_PROPERTY_NAME, FALLBACK_IMPL_NAME); + } catch (final FactoryFinder.ConfigurationError e) { log.error("ERROR: finding factory", e); throw new FactoryConfigurationError(e.getException(), e.getMessage()); } } /** - * Creates a new instance of a {@link com.sun.syndication.propono.atom.server.AtomHandler} - * using the currently configured parameters. - * + * Creates a new instance of a {@link com.sun.syndication.propono.atom.server.AtomHandler} using the currently configured parameters. + * * @return A new instance of a AtomHandler. - * - * @throws AtomConfigurationException if a AtomHandler cannot be created - * which satisfies the configuration requested. + * + * @throws AtomConfigurationException if a AtomHandler cannot be created which satisfies the configuration requested. */ - public abstract AtomHandler newAtomHandler( - HttpServletRequest req, HttpServletResponse res); + public abstract AtomHandler newAtomHandler(HttpServletRequest req, HttpServletResponse res); } diff --git a/src/main/java/org/rometools/propono/atom/server/AtomMediaResource.java b/src/main/java/org/rometools/propono/atom/server/AtomMediaResource.java index 41d1cf3..c742305 100644 --- a/src/main/java/org/rometools/propono/atom/server/AtomMediaResource.java +++ b/src/main/java/org/rometools/propono/atom/server/AtomMediaResource.java @@ -12,7 +12,7 @@ * 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. - */ + */ package org.rometools.propono.atom.server; @@ -21,6 +21,7 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.Date; + import javax.activation.FileTypeMap; import javax.activation.MimetypesFileTypeMap; @@ -28,42 +29,42 @@ import javax.activation.MimetypesFileTypeMap; * Represents a media link entry. */ public class AtomMediaResource { - private String contentType = null; - private long contentLength = 0; + private String contentType = null; + private long contentLength = 0; private InputStream inputStream = null; - private Date lastModified = null; + private Date lastModified = null; private static FileTypeMap map = null; - + static { - // TODO: figure out why PNG is missing from Java MIME types + // TODO: figure out why PNG is missing from Java MIME types map = FileTypeMap.getDefaultFileTypeMap(); if (map instanceof MimetypesFileTypeMap) { try { - ((MimetypesFileTypeMap)map).addMimeTypes("image/png png PNG"); - } catch (Exception ignored) {} - } + ((MimetypesFileTypeMap) map).addMimeTypes("image/png png PNG"); + } catch (final Exception ignored) { + } + } } - - public AtomMediaResource(File resource) throws FileNotFoundException { + + public AtomMediaResource(final File resource) throws FileNotFoundException { contentType = map.getContentType(resource.getName()); contentLength = resource.length(); lastModified = new Date(resource.lastModified()); inputStream = new FileInputStream(resource); } - - public AtomMediaResource(String name, long length, Date lastModified, InputStream is) - throws FileNotFoundException { - this.contentType = map.getContentType(name); - this.contentLength = length; - this.lastModified = lastModified; - this.inputStream = is; + + public AtomMediaResource(final String name, final long length, final Date lastModified, final InputStream is) throws FileNotFoundException { + contentType = map.getContentType(name); + contentLength = length; + this.lastModified = lastModified; + inputStream = is; } - + public String getContentType() { return contentType; } - public void setContentType(String contentType) { + public void setContentType(final String contentType) { this.contentType = contentType; } @@ -71,7 +72,7 @@ public class AtomMediaResource { return contentLength; } - public void setContentLength(long contentLength) { + public void setContentLength(final long contentLength) { this.contentLength = contentLength; } @@ -79,7 +80,7 @@ public class AtomMediaResource { return inputStream; } - public void setInputStream(InputStream inputStream) { + public void setInputStream(final InputStream inputStream) { this.inputStream = inputStream; } @@ -87,9 +88,8 @@ public class AtomMediaResource { return lastModified; } - public void setLastModified(Date lastModified) { + public void setLastModified(final Date lastModified) { this.lastModified = lastModified; } - } diff --git a/src/main/java/org/rometools/propono/atom/server/AtomNotAuthorizedException.java b/src/main/java/org/rometools/propono/atom/server/AtomNotAuthorizedException.java index c5ce57a..0879dc7 100644 --- a/src/main/java/org/rometools/propono/atom/server/AtomNotAuthorizedException.java +++ b/src/main/java/org/rometools/propono/atom/server/AtomNotAuthorizedException.java @@ -22,27 +22,31 @@ package org.rometools.propono.atom.server; import javax.servlet.http.HttpServletResponse; /** - * Exception to be thrown by AtomHandler implementations in the - * case that a user is not authorized to access a resource. + * Exception to be thrown by AtomHandler implementations in the case that a user is not authorized to access a resource. */ public class AtomNotAuthorizedException extends AtomException { /** Construct new exception */ public AtomNotAuthorizedException() { super(); } + /** Construct new exception with message */ - public AtomNotAuthorizedException(String msg) { + public AtomNotAuthorizedException(final String msg) { super(msg); } + /** Construct new exception with message and root cause */ - public AtomNotAuthorizedException(String msg, Throwable t) { + public AtomNotAuthorizedException(final String msg, final Throwable t) { super(msg, t); } - /** Construct new exception to wrap root cause*/ - public AtomNotAuthorizedException(Throwable t) { + + /** Construct new exception to wrap root cause */ + public AtomNotAuthorizedException(final Throwable t) { super(t); } + /** Get HTTP status code of exception (HTTP 403 unauthorized) */ + @Override public int getStatus() { return HttpServletResponse.SC_UNAUTHORIZED; } diff --git a/src/main/java/org/rometools/propono/atom/server/AtomNotFoundException.java b/src/main/java/org/rometools/propono/atom/server/AtomNotFoundException.java index ec6f779..6a8c8d2 100644 --- a/src/main/java/org/rometools/propono/atom/server/AtomNotFoundException.java +++ b/src/main/java/org/rometools/propono/atom/server/AtomNotFoundException.java @@ -29,19 +29,24 @@ public class AtomNotFoundException extends AtomException { public AtomNotFoundException() { super(); } + /** Construct new exception with message */ - public AtomNotFoundException(String msg) { + public AtomNotFoundException(final String msg) { super(msg); } + /** Construct new exception with message and root cause */ - public AtomNotFoundException(String msg, Throwable t) { + public AtomNotFoundException(final String msg, final Throwable t) { super(msg, t); } + /** Construct new exception with root cause */ - public AtomNotFoundException(Throwable t) { + public AtomNotFoundException(final Throwable t) { super(t); } + /** Get HTTP status code associated with exception (404 not found) */ + @Override public int getStatus() { return HttpServletResponse.SC_NOT_FOUND; } diff --git a/src/main/java/org/rometools/propono/atom/server/AtomRequest.java b/src/main/java/org/rometools/propono/atom/server/AtomRequest.java index 1610684..33b20dc 100644 --- a/src/main/java/org/rometools/propono/atom/server/AtomRequest.java +++ b/src/main/java/org/rometools/propono/atom/server/AtomRequest.java @@ -30,110 +30,98 @@ import java.util.Map; */ public interface AtomRequest { - /** - * Returns any extra path information associated with the URL the client - * sent when it made this request. + /** + * Returns any extra path information associated with the URL the client sent when it made this request. */ public String getPathInfo(); - /** - * Returns the query string that is contained in the request URL after - * the path. + /** + * Returns the query string that is contained in the request URL after the path. */ public String getQueryString(); - /** - * Returns the login of the user making this request, if the user has - * been authenticated, or null if the user has not been authenticated. + /** + * Returns the login of the user making this request, if the user has been authenticated, or null if the user has not been authenticated. */ public String getRemoteUser(); - /** - * Returns a boolean indicating whether the authenticated user is included - * in the specified logical "role". + /** + * Returns a boolean indicating whether the authenticated user is included in the specified logical "role". */ public boolean isUserInRole(String arg0); - /** - * Returns a java.security.Principal object containing the name of the - * current authenticated user. + /** + * Returns a java.security.Principal object containing the name of the current authenticated user. */ public Principal getUserPrincipal(); - /** - * Returns the part of this request's URL from the protocol name up to the - * query string in the first line of the HTTP request. + /** + * Returns the part of this request's URL from the protocol name up to the query string in the first line of the HTTP request. */ public String getRequestURI(); - /** - * Reconstructs the URL the client used to make the request. + /** + * Reconstructs the URL the client used to make the request. */ public StringBuffer getRequestURL(); - /** - * Returns the length, in bytes, of the request body and made available by - * the input stream, or -1 if the length is not known. + /** + * Returns the length, in bytes, of the request body and made available by the input stream, or -1 if the length is not known. */ public int getContentLength(); - /** - * Returns the MIME type of the body of the request, or null if the type - * is not known. */ + /** + * Returns the MIME type of the body of the request, or null if the type is not known. + */ public String getContentType(); - /** - * Returns the value of a request parameter as a String, or null if the - * parameter does not exist. + /** + * Returns the value of a request parameter as a String, or null if the parameter does not exist. */ public String getParameter(String arg0); - /** - * Returns an Enumeration of String objects containing the names of the - * parameters contained in this request. + /** + * Returns an Enumeration of String objects containing the names of the parameters contained in this request. */ public Enumeration getParameterNames(); - /** - * Returns an array of String objects containing all of the values the - * given request parameter has, or null if the parameter does not exist. + /** + * Returns an array of String objects containing all of the values the given request parameter has, or null if the parameter does not exist. */ public String[] getParameterValues(String arg0); - /** - * Returns a java.util.Map of the parameters of this request. + /** + * Returns a java.util.Map of the parameters of this request. */ public Map getParameterMap(); - /** - * Retrieves the body of the request as binary data using a - * ServletInputStream. + /** + * Retrieves the body of the request as binary data using a ServletInputStream. */ public InputStream getInputStream() throws IOException; - /** - * Returns the value of the specified request header as a long value that - * represents a Date object. */ + /** + * Returns the value of the specified request header as a long value that represents a Date object. + */ public long getDateHeader(String arg0); - /** - * Returns the value of the specified request header as a String. + /** + * Returns the value of the specified request header as a String. */ public String getHeader(String arg0); - /** - * Returns all the values of the specified request header as an Enumeration - * of String objects. + /** + * Returns all the values of the specified request header as an Enumeration of String objects. */ public Enumeration getHeaders(String arg0); - /** - * Returns an enumeration of all the header names this request contains. + /** + * Returns an enumeration of all the header names this request contains. */ public Enumeration getHeaderNames(); - /** - * Returns the value of the specified request header as an int. + /** + * Returns the value of the specified request header as an int. */ public int getIntHeader(String arg0); } diff --git a/src/main/java/org/rometools/propono/atom/server/AtomRequestImpl.java b/src/main/java/org/rometools/propono/atom/server/AtomRequestImpl.java index 0efcdf9..ce75614 100644 --- a/src/main/java/org/rometools/propono/atom/server/AtomRequestImpl.java +++ b/src/main/java/org/rometools/propono/atom/server/AtomRequestImpl.java @@ -24,6 +24,7 @@ import java.io.InputStream; import java.security.Principal; import java.util.Enumeration; import java.util.Map; + import javax.servlet.http.HttpServletRequest; /** @@ -31,84 +32,103 @@ import javax.servlet.http.HttpServletRequest; */ public class AtomRequestImpl implements AtomRequest { private HttpServletRequest wrapped = null; - - public AtomRequestImpl(HttpServletRequest wrapped) { + + public AtomRequestImpl(final HttpServletRequest wrapped) { this.wrapped = wrapped; } + @Override public String getPathInfo() { return wrapped.getPathInfo() != null ? wrapped.getPathInfo() : ""; } + @Override public String getQueryString() { return wrapped.getQueryString(); } + @Override public String getRemoteUser() { return wrapped.getRemoteUser(); } - public boolean isUserInRole(String arg0) { + @Override + public boolean isUserInRole(final String arg0) { return wrapped.isUserInRole(arg0); } + @Override public Principal getUserPrincipal() { return wrapped.getUserPrincipal(); } + @Override public String getRequestURI() { return wrapped.getRequestURI(); } + @Override public StringBuffer getRequestURL() { return wrapped.getRequestURL(); } + @Override public int getContentLength() { return wrapped.getContentLength(); } + @Override public String getContentType() { return wrapped.getContentType(); } - public String getParameter(String arg0) { + @Override + public String getParameter(final String arg0) { return wrapped.getParameter(arg0); } + @Override public Enumeration getParameterNames() { return wrapped.getParameterNames(); } - public String[] getParameterValues(String arg0) { + @Override + public String[] getParameterValues(final String arg0) { return wrapped.getParameterValues(arg0); } + @Override public Map getParameterMap() { return wrapped.getParameterMap(); } - - public InputStream getInputStream() throws IOException { - return wrapped.getInputStream(); - } - public long getDateHeader(String arg0) { + @Override + public InputStream getInputStream() throws IOException { + return wrapped.getInputStream(); + } + + @Override + public long getDateHeader(final String arg0) { return wrapped.getDateHeader(arg0); } - public String getHeader(String arg0) { + @Override + public String getHeader(final String arg0) { return wrapped.getHeader(arg0); } - public Enumeration getHeaders(String arg0) { + @Override + public Enumeration getHeaders(final String arg0) { return wrapped.getHeaders(arg0); } + @Override public Enumeration getHeaderNames() { return wrapped.getHeaderNames(); } - public int getIntHeader(String arg0) { + @Override + public int getIntHeader(final String arg0) { return wrapped.getIntHeader(arg0); } } diff --git a/src/main/java/org/rometools/propono/atom/server/AtomServlet.java b/src/main/java/org/rometools/propono/atom/server/AtomServlet.java index 707a4f6..1ff7a2a 100644 --- a/src/main/java/org/rometools/propono/atom/server/AtomServlet.java +++ b/src/main/java/org/rometools/propono/atom/server/AtomServlet.java @@ -19,143 +19,134 @@ */ package org.rometools.propono.atom.server; -import com.sun.syndication.feed.atom.Content; +import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Writer; +import java.util.Collections; + +import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdom2.Document; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; +import org.rometools.propono.atom.common.AtomService; +import org.rometools.propono.atom.common.Categories; +import org.rometools.propono.utils.Utilities; + +import com.sun.syndication.feed.atom.Content; import com.sun.syndication.feed.atom.Entry; import com.sun.syndication.feed.atom.Feed; import com.sun.syndication.feed.atom.Link; import com.sun.syndication.io.WireFeedOutput; import com.sun.syndication.io.impl.Atom10Generator; import com.sun.syndication.io.impl.Atom10Parser; -import org.rometools.propono.atom.common.AtomService; -import org.rometools.propono.atom.common.Categories; -import org.rometools.propono.utils.Utilities; -import java.io.BufferedReader; -import java.util.Collections; -import java.util.Iterator; -import javax.servlet.ServletConfig; /** - * Atom Servlet implements Atom protocol by calling an - * {@link com.sun.syndication.propono.atom.server.AtomHandler} - * implementation. This servlet takes care of parsing incoming XML into ROME - * Atom {@link com.sun.syndication.feed.atom.Entry} objects, passing those to the handler and serializing - * to the response the entries and feeds returned by the handler. + * Atom Servlet implements Atom protocol by calling an {@link com.sun.syndication.propono.atom.server.AtomHandler} implementation. This servlet takes care of + * parsing incoming XML into ROME Atom {@link com.sun.syndication.feed.atom.Entry} objects, passing those to the handler and serializing to the response the + * entries and feeds returned by the handler. */ public class AtomServlet extends HttpServlet { - + /** * Get feed type support by Servlet, "atom_1.0" */ public static final String FEED_TYPE = "atom_1.0"; private static String contextDirPath = null; - private static Log log = - LogFactory.getFactory().getInstance(AtomServlet.class); - + private static Log log = LogFactory.getFactory().getInstance(AtomServlet.class); + static { Atom10Parser.setResolveURIs(true); } - - //----------------------------------------------------------------------------- + + // ----------------------------------------------------------------------------- /** - * Create an Atom request handler. - * TODO: make AtomRequestHandler implementation configurable. + * Create an Atom request handler. TODO: make AtomRequestHandler implementation configurable. */ - private AtomHandler createAtomRequestHandler( - HttpServletRequest request, HttpServletResponse response) - throws ServletException { - AtomHandlerFactory ahf = AtomHandlerFactory.newInstance(); + private AtomHandler createAtomRequestHandler(final HttpServletRequest request, final HttpServletResponse response) throws ServletException { + final AtomHandlerFactory ahf = AtomHandlerFactory.newInstance(); return ahf.newAtomHandler(request, response); } - //----------------------------------------------------------------------------- + // ----------------------------------------------------------------------------- /** * Handles an Atom GET by calling handler and writing results to response. */ - protected void doGet(HttpServletRequest req, HttpServletResponse res) - throws ServletException, IOException { + @Override + protected void doGet(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException { log.debug("Entering"); - AtomHandler handler = createAtomRequestHandler(req, res); - String userName = handler.getAuthenticatedUsername(); + final AtomHandler handler = createAtomRequestHandler(req, res); + final String userName = handler.getAuthenticatedUsername(); if (userName != null) { - AtomRequest areq = new AtomRequestImpl(req); + final AtomRequest areq = new AtomRequestImpl(req); try { if (handler.isAtomServiceURI(areq)) { // return an Atom Service document - AtomService service = handler.getAtomService(areq); - Document doc = service.serviceToDocument(); + final AtomService service = handler.getAtomService(areq); + final Document doc = service.serviceToDocument(); res.setContentType("application/atomsvc+xml; charset=utf-8"); - Writer writer = res.getWriter(); - XMLOutputter outputter = new XMLOutputter(); + final Writer writer = res.getWriter(); + final XMLOutputter outputter = new XMLOutputter(); outputter.setFormat(Format.getPrettyFormat()); outputter.output(doc, writer); writer.close(); res.setStatus(HttpServletResponse.SC_OK); - } - else if (handler.isCategoriesURI(areq)) { - Categories cats = handler.getCategories(areq); + } else if (handler.isCategoriesURI(areq)) { + final Categories cats = handler.getCategories(areq); res.setContentType("application/xml"); - Writer writer = res.getWriter(); - Document catsDoc = new Document(); + final Writer writer = res.getWriter(); + final Document catsDoc = new Document(); catsDoc.setRootElement(cats.categoriesToElement()); - XMLOutputter outputter = new XMLOutputter(); + final XMLOutputter outputter = new XMLOutputter(); outputter.output(catsDoc, writer); writer.close(); res.setStatus(HttpServletResponse.SC_OK); - } - else if (handler.isCollectionURI(areq)) { + } else if (handler.isCollectionURI(areq)) { // return a collection - Feed col = handler.getCollection(areq); + final Feed col = handler.getCollection(areq); col.setFeedType(FEED_TYPE); - WireFeedOutput wireFeedOutput = new WireFeedOutput(); - Document feedDoc = wireFeedOutput.outputJDom(col); + final WireFeedOutput wireFeedOutput = new WireFeedOutput(); + final Document feedDoc = wireFeedOutput.outputJDom(col); res.setContentType("application/atom+xml; charset=utf-8"); - Writer writer = res.getWriter(); - XMLOutputter outputter = new XMLOutputter(); + final Writer writer = res.getWriter(); + final XMLOutputter outputter = new XMLOutputter(); outputter.setFormat(Format.getPrettyFormat()); outputter.output(feedDoc, writer); writer.close(); res.setStatus(HttpServletResponse.SC_OK); - } - else if (handler.isEntryURI(areq)) { + } else if (handler.isEntryURI(areq)) { // return an entry - Entry entry = handler.getEntry(areq); + final Entry entry = handler.getEntry(areq); if (entry != null) { res.setContentType("application/atom+xml; type=entry; charset=utf-8"); - Writer writer = res.getWriter(); + final Writer writer = res.getWriter(); Atom10Generator.serializeEntry(entry, writer); writer.close(); } else { res.setStatus(HttpServletResponse.SC_NOT_FOUND); } - } - else if (handler.isMediaEditURI(areq)) { - AtomMediaResource entry = handler.getMediaResource(areq); + } else if (handler.isMediaEditURI(areq)) { + final AtomMediaResource entry = handler.getMediaResource(areq); res.setContentType(entry.getContentType()); - res.setContentLength((int)entry.getContentLength()); + res.setContentLength((int) entry.getContentLength()); Utilities.copyInputToOutput(entry.getInputStream(), res.getOutputStream()); res.getOutputStream().flush(); res.getOutputStream().close(); - } - else { + } else { res.setStatus(HttpServletResponse.SC_NOT_FOUND); } - } catch (AtomException ae) { + } catch (final AtomException ae) { res.sendError(ae.getStatus(), ae.getMessage()); log.debug("ERROR processing GET", ae); - } catch (Exception e) { + } catch (final Exception e) { res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); log.debug("ERROR processing GET", e); } @@ -165,41 +156,39 @@ public class AtomServlet extends HttpServlet { } log.debug("Exiting"); } - - //----------------------------------------------------------------------------- + + // ----------------------------------------------------------------------------- /** - * Handles an Atom POST by calling handler to identify URI, reading/parsing - * data, calling handler and writing results to response. + * Handles an Atom POST by calling handler to identify URI, reading/parsing data, calling handler and writing results to response. */ - protected void doPost(HttpServletRequest req, HttpServletResponse res) - throws ServletException, IOException { + @Override + protected void doPost(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException { log.debug("Entering"); - AtomHandler handler = createAtomRequestHandler(req, res); - String userName = handler.getAuthenticatedUsername(); + final AtomHandler handler = createAtomRequestHandler(req, res); + final String userName = handler.getAuthenticatedUsername(); if (userName != null) { - AtomRequest areq = new AtomRequestImpl(req); + final AtomRequest areq = new AtomRequestImpl(req); try { if (handler.isCollectionURI(areq)) { - + if (req.getContentType().startsWith("application/atom+xml")) { // parse incoming entry - Entry entry = Atom10Parser.parseEntry(new BufferedReader( - new InputStreamReader(req.getInputStream(), "UTF-8")), null); + final Entry entry = Atom10Parser.parseEntry(new BufferedReader(new InputStreamReader(req.getInputStream(), "UTF-8")), null); // call handler to post it - Entry newEntry = handler.postEntry(areq, entry); + final Entry newEntry = handler.postEntry(areq, entry); - // set Location and Content-Location headers - for (Iterator it = newEntry.getOtherLinks().iterator(); it.hasNext();) { - Link link = (Link) it.next(); + // set Location and Content-Location headers + for (final Object element : newEntry.getOtherLinks()) { + final Link link = (Link) element; if ("edit".equals(link.getRel())) { res.addHeader("Location", link.getHrefResolved()); break; } } - for (Iterator it = newEntry.getAlternateLinks().iterator(); it.hasNext();) { - Link link = (Link) it.next(); + for (final Object element : newEntry.getAlternateLinks()) { + final Link link = (Link) element; if ("alternate".equals(link.getRel())) { res.addHeader("Content-Location", link.getHrefResolved()); break; @@ -209,62 +198,60 @@ public class AtomServlet extends HttpServlet { // write entry back out to response res.setStatus(HttpServletResponse.SC_CREATED); res.setContentType("application/atom+xml; type=entry; charset=utf-8"); - - Writer writer = res.getWriter(); + + final Writer writer = res.getWriter(); Atom10Generator.serializeEntry(newEntry, writer); - writer.close(); - + writer.close(); + } else if (req.getContentType() != null) { - + // get incoming title and slug from HTTP header - String title = areq.getHeader("Title"); + final String title = areq.getHeader("Title"); // create new entry for resource, set title and type - Entry resource = new Entry(); + final Entry resource = new Entry(); resource.setTitle(title); - Content content = new Content(); + final Content content = new Content(); content.setType(areq.getContentType()); resource.setContents(Collections.singletonList(content)); - + // hand input stream off to hander to post file - Entry newEntry = handler.postMedia(areq, resource); + final Entry newEntry = handler.postMedia(areq, resource); // set Location and Content-Location headers - for (Iterator it = newEntry.getOtherLinks().iterator(); it.hasNext();) { - Link link = (Link) it.next(); + for (final Object element : newEntry.getOtherLinks()) { + final Link link = (Link) element; if ("edit".equals(link.getRel())) { res.addHeader("Location", link.getHrefResolved()); break; } } - for (Iterator it = newEntry.getAlternateLinks().iterator(); it.hasNext();) { - Link link = (Link) it.next(); + for (final Object element : newEntry.getAlternateLinks()) { + final Link link = (Link) element; if ("alternate".equals(link.getRel())) { res.addHeader("Content-Location", link.getHrefResolved()); break; } } - - res.setStatus(HttpServletResponse.SC_CREATED); + + res.setStatus(HttpServletResponse.SC_CREATED); res.setContentType("application/atom+xml; type=entry; charset=utf-8"); - - Writer writer = res.getWriter(); + + final Writer writer = res.getWriter(); Atom10Generator.serializeEntry(newEntry, writer); - writer.close(); - + writer.close(); + } else { - res.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, - "No content-type specified in request"); + res.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, "No content-type specified in request"); } - + } else { - res.sendError(HttpServletResponse.SC_NOT_FOUND, - "Invalid collection specified in request"); + res.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid collection specified in request"); } - } catch (AtomException ae) { + } catch (final AtomException ae) { res.sendError(ae.getStatus(), ae.getMessage()); log.debug("ERROR processing POST", ae); - } catch (Exception e) { + } catch (final Exception e) { res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); log.debug("ERROR processing POST", e); } @@ -274,101 +261,99 @@ public class AtomServlet extends HttpServlet { } log.debug("Exiting"); } - - //----------------------------------------------------------------------------- + + // ----------------------------------------------------------------------------- /** - * Handles an Atom PUT by calling handler to identify URI, reading/parsing - * data, calling handler and writing results to response. + * Handles an Atom PUT by calling handler to identify URI, reading/parsing data, calling handler and writing results to response. */ - protected void doPut(HttpServletRequest req, HttpServletResponse res) - throws ServletException, IOException { + @Override + protected void doPut(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException { log.debug("Entering"); - AtomHandler handler = createAtomRequestHandler(req, res); - String userName = handler.getAuthenticatedUsername(); + final AtomHandler handler = createAtomRequestHandler(req, res); + final String userName = handler.getAuthenticatedUsername(); if (userName != null) { - AtomRequest areq = new AtomRequestImpl(req); + final AtomRequest areq = new AtomRequestImpl(req); try { if (handler.isEntryURI(areq)) { - + // parse incoming entry - Entry unsavedEntry = Atom10Parser.parseEntry(new BufferedReader( - new InputStreamReader(req.getInputStream(), "UTF-8")), null); - + final Entry unsavedEntry = Atom10Parser.parseEntry(new BufferedReader(new InputStreamReader(req.getInputStream(), "UTF-8")), null); + // call handler to put entry handler.putEntry(areq, unsavedEntry); - + res.setStatus(HttpServletResponse.SC_OK); - + } else if (handler.isMediaEditURI(areq)) { - + // hand input stream to handler handler.putMedia(areq); - + res.setStatus(HttpServletResponse.SC_OK); - + } else { res.setStatus(HttpServletResponse.SC_NOT_FOUND); } - } catch (AtomException ae) { + } catch (final AtomException ae) { res.sendError(ae.getStatus(), ae.getMessage()); log.debug("ERROR processing PUT", ae); - } catch (Exception e) { + } catch (final Exception e) { res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); log.debug("ERROR processing PUT", e); } } else { res.setHeader("WWW-Authenticate", "BASIC realm=\"AtomPub\""); - // Wanted to use sendError() here but Tomcat sends 403 forbidden + // Wanted to use sendError() here but Tomcat sends 403 forbidden // when I do that, so sticking with setStatus() for time being. res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); } log.debug("Exiting"); } - - //----------------------------------------------------------------------------- + + // ----------------------------------------------------------------------------- /** * Handle Atom DELETE by calling appropriate handler. */ - protected void doDelete(HttpServletRequest req, HttpServletResponse res) - throws ServletException, IOException { + @Override + protected void doDelete(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException { log.debug("Entering"); - AtomHandler handler = createAtomRequestHandler(req, res); - String userName = handler.getAuthenticatedUsername(); + final AtomHandler handler = createAtomRequestHandler(req, res); + final String userName = handler.getAuthenticatedUsername(); if (userName != null) { - AtomRequest areq = new AtomRequestImpl(req); + final AtomRequest areq = new AtomRequestImpl(req); try { if (handler.isEntryURI(areq)) { handler.deleteEntry(areq); res.setStatus(HttpServletResponse.SC_OK); - } - else { + } else { res.setStatus(HttpServletResponse.SC_NOT_FOUND); } - } catch (AtomException ae) { + } catch (final AtomException ae) { res.sendError(ae.getStatus(), ae.getMessage()); log.debug("ERROR processing DELETE", ae); - } catch (Exception e) { + } catch (final Exception e) { res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); log.debug("ERROR processing DELETE", e); } } else { res.setHeader("WWW-Authenticate", "BASIC realm=\"AtomPub\""); - // Wanted to use sendError() here but Tomcat sends 403 forbidden + // Wanted to use sendError() here but Tomcat sends 403 forbidden // when I do that, so sticking with setStatus() for time being. res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); } log.debug("Exiting"); } - + /** * Initialize servlet. */ - public void init( ServletConfig config ) throws ServletException { - super.init( config ); + @Override + public void init(final ServletConfig config) throws ServletException { + super.init(config); contextDirPath = getServletContext().getRealPath("/"); - + } - + /** * Get absolute path to Servlet context directory. */ diff --git a/src/main/java/org/rometools/propono/atom/server/FactoryConfigurationError.java b/src/main/java/org/rometools/propono/atom/server/FactoryConfigurationError.java index 2ae8c6a..ccd2c59 100644 --- a/src/main/java/org/rometools/propono/atom/server/FactoryConfigurationError.java +++ b/src/main/java/org/rometools/propono/atom/server/FactoryConfigurationError.java @@ -12,94 +12,81 @@ * 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. - */ + */ package org.rometools.propono.atom.server; /** - * Thrown when a problem with configuration with the - * {@link com.sun.syndication.propono.atom.server.AtomHandlerFactory} exists. - * This error will typically be thrown when the class of a parser factory - * specified in the system properties cannot be found or instantiated. + * Thrown when a problem with configuration with the {@link com.sun.syndication.propono.atom.server.AtomHandlerFactory} exists. This error will typically be + * thrown when the class of a parser factory specified in the system properties cannot be found or instantiated. */ public class FactoryConfigurationError extends Error { - + /** * Exception that represents the error. */ - private Exception exception; - + private final Exception exception; + /** - * Create a new FactoryConfigurationError with no - * detail mesage. - */ + * Create a new FactoryConfigurationError with no detail mesage. + */ public FactoryConfigurationError() { super(); - this.exception = null; + exception = null; } - + /** - * Create a new FactoryConfigurationError with - * the String specified as an error message. - * + * Create a new FactoryConfigurationError with the String specified as an error message. + * * @param msg The error message for the exception. - */ - public FactoryConfigurationError(String msg) { + */ + public FactoryConfigurationError(final String msg) { super(msg); - this.exception = null; + exception = null; } - - + /** - * Create a new FactoryConfigurationError with a - * given Exception base cause of the error. - * - * @param e The exception to be encapsulated in a - * FactoryConfigurationError. - */ - public FactoryConfigurationError(Exception e) { + * Create a new FactoryConfigurationError with a given Exception base cause of the error. + * + * @param e The exception to be encapsulated in a FactoryConfigurationError. + */ + public FactoryConfigurationError(final Exception e) { super(e.toString()); - this.exception = e; + exception = e; } - + /** - * Create a new FactoryConfigurationError with the - * given Exception base cause and detail message. - * - * @param e The exception to be encapsulated in a - * FactoryConfigurationError + * Create a new FactoryConfigurationError with the given Exception base cause and detail message. + * + * @param e The exception to be encapsulated in a FactoryConfigurationError * @param msg The detail message. - */ - public FactoryConfigurationError(Exception e, String msg) { + */ + public FactoryConfigurationError(final Exception e, final String msg) { super(msg); - this.exception = e; + exception = e; } - - + /** - * Return the message (if any) for this error . If there is no - * message for the exception and there is an encapsulated - * exception then the message of that exception, if it exists will be - * returned. Else the name of the encapsulated exception will be - * returned. - * + * Return the message (if any) for this error . If there is no message for the exception and there is an encapsulated exception then the message of that + * exception, if it exists will be returned. Else the name of the encapsulated exception will be returned. + * * @return The error message. - */ + */ + @Override public String getMessage() { - String message = super.getMessage(); - + final String message = super.getMessage(); + if (message == null && exception != null) { return exception.getMessage(); } - + return message; } - + /** - * Return the actual exception (if any) that caused this exception to - * be raised. - * + * Return the actual exception (if any) that caused this exception to be raised. + * * @return The encapsulated exception, or null if there is none. - */ + */ public Exception getException() { return exception; } diff --git a/src/main/java/org/rometools/propono/atom/server/FactoryFinder.java b/src/main/java/org/rometools/propono/atom/server/FactoryFinder.java index 2545703..ff46f75 100644 --- a/src/main/java/org/rometools/propono/atom/server/FactoryFinder.java +++ b/src/main/java/org/rometools/propono/atom/server/FactoryFinder.java @@ -15,48 +15,38 @@ */ package org.rometools.propono.atom.server; -import java.io.File; -import java.io.FileInputStream; - -import java.util.Properties; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.net.URL; +import java.util.Properties; /** * Find {@link com.sun.syndication.propono.atom.server.AtomHandlerFactory} based on properties files. */ class FactoryFinder { private static boolean debug = false; - static Properties cacheProps= new Properties(); - static SecuritySupport ss = new SecuritySupport() ; + static Properties cacheProps = new Properties(); + static SecuritySupport ss = new SecuritySupport(); static boolean firstTime = true; - - private static void dPrint(String msg) { + + private static void dPrint(final String msg) { if (debug) { System.err.println("Propono: " + msg); } } - + /** - * Create an instance of a class using the specified ClassLoader and - * optionally fall back to the current ClassLoader if not found. - * - * @param className Name of the concrete class corresponding to the - * service provider - * - * @param cl ClassLoader to use to load the class, null means to use - * the bootstrap ClassLoader - * - * @param doFallback true if the current ClassLoader should be tried as - * a fallback if the class is not found using cl + * Create an instance of a class using the specified ClassLoader and optionally fall back to the current ClassLoader if not found. + * + * @param className Name of the concrete class corresponding to the service provider + * + * @param cl ClassLoader to use to load the class, null means to use the bootstrap ClassLoader + * + * @param doFallback true if the current ClassLoader should be tried as a fallback if the class is not found using cl */ - private static Object newInstance( - String className, ClassLoader cl, boolean doFallback) - throws ConfigurationError { - + private static Object newInstance(final String className, ClassLoader cl, final boolean doFallback) throws ConfigurationError { + try { Class providerClass; if (cl == null) { @@ -67,7 +57,7 @@ class FactoryFinder { } else { try { providerClass = cl.loadClass(className); - } catch (ClassNotFoundException x) { + } catch (final ClassNotFoundException x) { if (doFallback) { // Fall back to current classloader cl = FactoryFinder.class.getClassLoader(); @@ -77,119 +67,114 @@ class FactoryFinder { } } } - - Object instance = providerClass.newInstance(); - dPrint("created new instance of " + providerClass + - " using ClassLoader: " + cl); + + final Object instance = providerClass.newInstance(); + dPrint("created new instance of " + providerClass + " using ClassLoader: " + cl); return instance; - } catch (ClassNotFoundException x) { - throw new ConfigurationError( - "Provider " + className + " not found", x); - } catch (Exception x) { - throw new ConfigurationError( - "Provider " + className + " could not be instantiated: " + x, x); + } catch (final ClassNotFoundException x) { + throw new ConfigurationError("Provider " + className + " not found", x); + } catch (final Exception x) { + throw new ConfigurationError("Provider " + className + " could not be instantiated: " + x, x); } } - + /** - * Finds the implementation Class object in the specified order. Main - * entry point. + * Finds the implementation Class object in the specified order. Main entry point. + * * @return Class object of factory, never null - * - * @param factoryId Name of the factory to find, same as - * a property name - * @param fallbackClassName Implementation class name, if nothing else - * is found. Use null to mean no fallback. - * - * Package private so this code can be shared. + * + * @param factoryId Name of the factory to find, same as a property name + * @param fallbackClassName Implementation class name, if nothing else is found. Use null to mean no fallback. + * + * Package private so this code can be shared. */ - static Object find(String factoryId, String fallbackClassName) - throws ConfigurationError { - + static Object find(final String factoryId, final String fallbackClassName) throws ConfigurationError { + // Figure out which ClassLoader to use for loading the provider - // class. If there is a Context ClassLoader then use it. - + // class. If there is a Context ClassLoader then use it. + ClassLoader classLoader = ss.getContextClassLoader(); - + if (classLoader == null) { // if we have no Context ClassLoader // so use the current ClassLoader classLoader = FactoryFinder.class.getClassLoader(); } - + dPrint("find factoryId =" + factoryId); - + // Use the system property first try { - String systemProp = ss.getSystemProperty(factoryId); - if( systemProp!=null) { + final String systemProp = ss.getSystemProperty(factoryId); + if (systemProp != null) { dPrint("found system property, value=" + systemProp); - return newInstance(systemProp, classLoader, true ); + return newInstance(systemProp, classLoader, true); } - } catch (SecurityException se) { - //if first option fails due to any reason we should try next option in the - //look up algorithm. + } catch (final SecurityException se) { + // if first option fails due to any reason we should try next option in the + // look up algorithm. } - + // try to read from /propono.properties try { - String javah = ss.getSystemProperty("java.home"); - String configFile = "/propono.properties"; + final String javah = ss.getSystemProperty("java.home"); + final String configFile = "/propono.properties"; String factoryClassName = null; - if(firstTime){ - synchronized(cacheProps){ + if (firstTime) { + synchronized (cacheProps) { if (firstTime) { try { - InputStream is = FactoryFinder.class.getResourceAsStream(configFile); - firstTime = false; - if (is != null) { - dPrint("Read properties file: " + configFile); - cacheProps.load(is); - } - } catch (Exception intentionallyIgnored) {} + final InputStream is = FactoryFinder.class.getResourceAsStream(configFile); + firstTime = false; + if (is != null) { + dPrint("Read properties file: " + configFile); + cacheProps.load(is); + } + } catch (final Exception intentionallyIgnored) { + } } } } factoryClassName = cacheProps.getProperty(factoryId); - - if(factoryClassName != null){ + + if (factoryClassName != null) { dPrint("found in $java.home/propono.properties, value=" + factoryClassName); return newInstance(factoryClassName, classLoader, true); } - } catch(Exception ex) { - if( debug ) ex.printStackTrace(); + } catch (final Exception ex) { + if (debug) { + ex.printStackTrace(); + } } - + // Try Jar Service Provider Mechanism - Object provider = findJarServiceProvider(factoryId); + final Object provider = findJarServiceProvider(factoryId); if (provider != null) { return provider; } if (fallbackClassName == null) { - throw new ConfigurationError( - "Provider for " + factoryId + " cannot be found", null); + throw new ConfigurationError("Provider for " + factoryId + " cannot be found", null); } - + dPrint("loaded from fallback value: " + fallbackClassName); return newInstance(fallbackClassName, classLoader, true); } - + /* * Try to find provider using Jar Service Provider Mechanism - * + * * @return instance of provider class if found or null */ - private static Object findJarServiceProvider(String factoryId) - throws ConfigurationError { - - String serviceId = "META-INF/services/" + factoryId; + private static Object findJarServiceProvider(final String factoryId) throws ConfigurationError { + + final String serviceId = "META-INF/services/" + factoryId; InputStream is = null; - + // First try the Context ClassLoader ClassLoader cl = ss.getContextClassLoader(); if (cl != null) { is = ss.getResourceAsStream(cl, serviceId); - + // If no provider found then try the current ClassLoader if (is == null) { cl = FactoryFinder.class.getClassLoader(); @@ -201,21 +186,20 @@ class FactoryFinder { cl = FactoryFinder.class.getClassLoader(); is = ss.getResourceAsStream(cl, serviceId); } - + if (is == null) { // No provider found return null; } - - dPrint("found jar resource=" + serviceId + - " using ClassLoader: " + cl); - + + dPrint("found jar resource=" + serviceId + " using ClassLoader: " + cl); + // Read the service provider name in UTF-8 as specified in - // the jar spec. Unfortunately this fails in Microsoft + // the jar spec. Unfortunately this fails in Microsoft // VJ++, which does not implement the UTF-8 // encoding. Theoretically, we should simply let it fail in // that case, since the JVM is obviously broken if it - // doesn't support such a basic standard. But since there + // doesn't support such a basic standard. But since there // are still some users attempting to use VJ++ for // development, we have dropped in a fallback which makes a // second attempt using the platform's default encoding. In @@ -229,52 +213,49 @@ class FactoryFinder { BufferedReader rd; try { rd = new BufferedReader(new InputStreamReader(is, "UTF-8")); - } catch (java.io.UnsupportedEncodingException e) { + } catch (final java.io.UnsupportedEncodingException e) { rd = new BufferedReader(new InputStreamReader(is)); } - + String factoryClassName = null; try { // XXX Does not handle all possible input as specified by the // Jar Service Provider specification factoryClassName = rd.readLine(); rd.close(); - } catch (IOException x) { + } catch (final IOException x) { // No provider found return null; } - - if (factoryClassName != null && - ! "".equals(factoryClassName)) { - dPrint("found in resource, value=" - + factoryClassName); - + + if (factoryClassName != null && !"".equals(factoryClassName)) { + dPrint("found in resource, value=" + factoryClassName); + // Note: here we do not want to fall back to the current // ClassLoader because we want to avoid the case where the // resource file was found using one ClassLoader and the // provider class was instantiated using a different one. return newInstance(factoryClassName, cl, false); } - + // No provider found return null; } - + static class ConfigurationError extends Error { - private Exception exception; - + private final Exception exception; + /** - * Construct a new instance with the specified detail string and - * exception. + * Construct a new instance with the specified detail string and exception. */ - ConfigurationError(String msg, Exception x) { + ConfigurationError(final String msg, final Exception x) { super(msg); - this.exception = x; + exception = x; } - + Exception getException() { return exception; } } - + } diff --git a/src/main/java/org/rometools/propono/atom/server/SecuritySupport.java b/src/main/java/org/rometools/propono/atom/server/SecuritySupport.java index 3d603d9..824b1d1 100644 --- a/src/main/java/org/rometools/propono/atom/server/SecuritySupport.java +++ b/src/main/java/org/rometools/propono/atom/server/SecuritySupport.java @@ -12,60 +12,62 @@ * 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. - */ + */ package org.rometools.propono.atom.server; -import java.security.*; -import java.net.*; -import java.io.*; -import java.util.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; /** - * This class is duplicated for each subpackage, it is package private and - * therefore is not exposed as part of the public API. + * This class is duplicated for each subpackage, it is package private and therefore is not exposed as part of the public API. */ -class SecuritySupport { - +class SecuritySupport { + ClassLoader getContextClassLoader() { - return (ClassLoader) - AccessController.doPrivileged(new PrivilegedAction() { + return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() { + @Override public Object run() { ClassLoader cl = null; try { cl = Thread.currentThread().getContextClassLoader(); - } catch (SecurityException ex) { } + } catch (final SecurityException ex) { + } return cl; } }); } - + String getSystemProperty(final String propName) { - return (String) - AccessController.doPrivileged(new PrivilegedAction() { + return (String) AccessController.doPrivileged(new PrivilegedAction() { + @Override public Object run() { return System.getProperty(propName); } }); } - - FileInputStream getFileInputStream(final File file) - throws FileNotFoundException { + + FileInputStream getFileInputStream(final File file) throws FileNotFoundException { try { - return (FileInputStream) - AccessController.doPrivileged(new PrivilegedExceptionAction() { + return (FileInputStream) AccessController.doPrivileged(new PrivilegedExceptionAction() { + @Override public Object run() throws FileNotFoundException { return new FileInputStream(file); } }); - } catch (PrivilegedActionException e) { - throw (FileNotFoundException)e.getException(); + } catch (final PrivilegedActionException e) { + throw (FileNotFoundException) e.getException(); } } - - InputStream getResourceAsStream(final ClassLoader cl, - final String name) { - return (InputStream) - AccessController.doPrivileged(new PrivilegedAction() { + + InputStream getResourceAsStream(final ClassLoader cl, final String name) { + return (InputStream) AccessController.doPrivileged(new PrivilegedAction() { + @Override public Object run() { InputStream ris; if (cl == null) { @@ -77,14 +79,14 @@ class SecuritySupport { } }); } - + boolean doesFileExist(final File f) { - return ((Boolean) - AccessController.doPrivileged(new PrivilegedAction() { + return ((Boolean) AccessController.doPrivileged(new PrivilegedAction() { + @Override public Object run() { return new Boolean(f.exists()); } })).booleanValue(); } - + } diff --git a/src/main/java/org/rometools/propono/atom/server/impl/FileBasedAtomHandler.java b/src/main/java/org/rometools/propono/atom/server/impl/FileBasedAtomHandler.java index 7d8a8fe..d1c3c33 100644 --- a/src/main/java/org/rometools/propono/atom/server/impl/FileBasedAtomHandler.java +++ b/src/main/java/org/rometools/propono/atom/server/impl/FileBasedAtomHandler.java @@ -12,314 +12,331 @@ * 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. - */ + */ package org.rometools.propono.atom.server.impl; -import org.rometools.propono.atom.server.AtomMediaResource; -import org.apache.commons.codec.binary.Base64; -import org.rometools.propono.atom.server.AtomHandler; -import org.rometools.propono.atom.server.AtomException; -import org.rometools.propono.atom.server.AtomServlet; -import com.sun.syndication.feed.atom.Entry; -import com.sun.syndication.feed.atom.Feed; -import org.rometools.propono.atom.common.AtomService; -import org.rometools.propono.atom.common.Categories; -import org.rometools.propono.atom.server.AtomRequest; import java.io.File; import java.util.StringTokenizer; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import javax.servlet.http.HttpServletRequest; -import org.apache.commons.lang.StringUtils; +import org.rometools.propono.atom.common.AtomService; +import org.rometools.propono.atom.common.Categories; +import org.rometools.propono.atom.server.AtomException; +import org.rometools.propono.atom.server.AtomHandler; +import org.rometools.propono.atom.server.AtomMediaResource; +import org.rometools.propono.atom.server.AtomRequest; +import org.rometools.propono.atom.server.AtomServlet; +import com.sun.syndication.feed.atom.Entry; +import com.sun.syndication.feed.atom.Feed; /** - * File-based {@link com.sun.syndication.propono.atom.server.AtomHandler} - * implementation that stores entries and media-entries to disk. Implemented - * using {@link com.sun.syndication.propono.atom.server.impl.FileBasedAtomService}. + * File-based {@link com.sun.syndication.propono.atom.server.AtomHandler} implementation that stores entries and media-entries to disk. Implemented using + * {@link com.sun.syndication.propono.atom.server.impl.FileBasedAtomService}. */ public class FileBasedAtomHandler implements AtomHandler { - private static Log log = - LogFactory.getFactory().getInstance(FileBasedAtomHandler.class); - + private static Log log = LogFactory.getFactory().getInstance(FileBasedAtomHandler.class); + private static String fileStoreDir = null; private String userName = null; private String atomProtocolURL = null; - private String contextURI = null; - private String uploadurl = null; - + private String contextURI = null; + private final String uploadurl = null; + private FileBasedAtomService service = null; - + /** * Construct handler to handle one request. + * * @param req Request to be handled. */ - public FileBasedAtomHandler( HttpServletRequest req ) { + public FileBasedAtomHandler(final HttpServletRequest req) { this(req, AtomServlet.getContextDirPath()); - } - + } + /** * Contruct handler for one request, using specified file storage directory. - * @param req Request to be handled. + * + * @param req Request to be handled. * @param uploaddir File storage upload dir. */ - public FileBasedAtomHandler(HttpServletRequest req, String uploaddir) { + public FileBasedAtomHandler(final HttpServletRequest req, final String uploaddir) { log.debug("ctor"); - - userName = authenticateBASIC(req); - - atomProtocolURL = req.getScheme() + "://" + req.getServerName() + ":" - + req.getServerPort() + req.getContextPath() + req.getServletPath(); - - contextURI = req.getScheme() + "://" + req.getServerName() + ":" - + req.getServerPort() + req.getContextPath(); - + + userName = authenticateBASIC(req); + + atomProtocolURL = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + req.getContextPath() + req.getServletPath(); + + contextURI = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + req.getContextPath(); + try { - service = new FileBasedAtomService(userName, uploaddir, - contextURI, req.getContextPath(), req.getServletPath()); - } catch (Throwable t) { + service = new FileBasedAtomService(userName, uploaddir, contextURI, req.getContextPath(), req.getServletPath()); + } catch (final Throwable t) { throw new RuntimeException("ERROR creating FileBasedAtomService", t); } } - - /** - * Method used for validating user. Developers can overwrite this method - * and use credentials stored in Database or LDAP to confirm if the user is - * allowed to access this service. - * @param login user submitted login id - * @param password user submitted password + + /** + * Method used for validating user. Developers can overwrite this method and use credentials stored in Database or LDAP to confirm if the user is allowed to + * access this service. + * + * @param login user submitted login id + * @param password user submitted password */ - public boolean validateUser(String login, String password) { + public boolean validateUser(final String login, final String password) { return true; } - + /** * Get username of authenticated user + * * @return User name. */ + @Override public String getAuthenticatedUsername() { // For now return userName as the login id entered for authorization return userName; } - + /** * Get base URI of Atom protocol implementation. + * * @return Base URI of Atom protocol implemenation. */ - public String getAtomProtocolURL( ) { - if ( atomProtocolURL == null ) { + public String getAtomProtocolURL() { + if (atomProtocolURL == null) { return "app"; } else { - return atomProtocolURL; + return atomProtocolURL; } } - + /** * Return introspection document + * * @throws com.sun.syndication.propono.atom.server.AtomException Unexpected exception. * @return AtomService object with workspaces and collections. */ - public AtomService getAtomService(AtomRequest areq) throws AtomException { + @Override + public AtomService getAtomService(final AtomRequest areq) throws AtomException { return service; } - + /** * Returns null because we use in-line categories. + * * @throws com.sun.syndication.propono.atom.server.AtomException Unexpected exception. * @return Categories object */ - public Categories getCategories(AtomRequest areq) throws AtomException { + @Override + public Categories getCategories(final AtomRequest areq) throws AtomException { log.debug("getCollection"); - String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/"); - String handle = pathInfo[0]; - String collection = pathInfo[1]; - FileBasedCollection col = service.findCollectionByHandle(handle, collection); - return (Categories)col.getCategories(true).get(0); + final String[] pathInfo = StringUtils.split(areq.getPathInfo(), "/"); + final String handle = pathInfo[0]; + final String collection = pathInfo[1]; + final FileBasedCollection col = service.findCollectionByHandle(handle, collection); + return (Categories) col.getCategories(true).get(0); } - + /** * Get collection specified by pathinfo. + * * @param areq Details of HTTP request * @return ROME feed representing collection. * @throws com.sun.syndication.propono.atom.server.AtomException Invalid collection or other exception. */ - public Feed getCollection(AtomRequest areq) throws AtomException { + @Override + public Feed getCollection(final AtomRequest areq) throws AtomException { log.debug("getCollection"); - String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/"); - String handle = pathInfo[0]; - String collection = pathInfo[1]; - FileBasedCollection col = service.findCollectionByHandle(handle, collection); - return col.getFeedDocument(); + final String[] pathInfo = StringUtils.split(areq.getPathInfo(), "/"); + final String handle = pathInfo[0]; + final String collection = pathInfo[1]; + final FileBasedCollection col = service.findCollectionByHandle(handle, collection); + return col.getFeedDocument(); } - + /** - * Create a new entry specified by pathInfo and posted entry. We save the - * submitted Atom entry verbatim, but we do set the id and reset the update - * time. - * + * Create a new entry specified by pathInfo and posted entry. We save the submitted Atom entry verbatim, but we do set the id and reset the update time. + * * @param entry Entry to be added to collection. * @param areq Details of HTTP request * @throws com.sun.syndication.propono.atom.server.AtomException On invalid collection or other error. * @return Entry as represented on server. */ - public Entry postEntry(AtomRequest areq, Entry entry) throws AtomException { + @Override + public Entry postEntry(final AtomRequest areq, final Entry entry) throws AtomException { log.debug("postEntry"); - - String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/"); - String handle = pathInfo[0]; - String collection = pathInfo[1]; - FileBasedCollection col = service.findCollectionByHandle(handle, collection); + + final String[] pathInfo = StringUtils.split(areq.getPathInfo(), "/"); + final String handle = pathInfo[0]; + final String collection = pathInfo[1]; + final FileBasedCollection col = service.findCollectionByHandle(handle, collection); try { - return col.addEntry(entry); - - } catch (Exception fe) { + return col.addEntry(entry); + + } catch (final Exception fe) { fe.printStackTrace(); - throw new AtomException( fe ); + throw new AtomException(fe); } } - + /** * Get entry specified by pathInfo. + * * @param areq Details of HTTP request * @throws com.sun.syndication.propono.atom.server.AtomException On invalid pathinfo or other error. * @return ROME Entry object. */ - public Entry getEntry(AtomRequest areq) throws AtomException { + @Override + public Entry getEntry(final AtomRequest areq) throws AtomException { log.debug("getEntry"); - String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/"); - String handle = pathInfo[0]; - String collection = pathInfo[1]; - String fileName = pathInfo[2]; - FileBasedCollection col = service.findCollectionByHandle(handle, collection); - try { + final String[] pathInfo = StringUtils.split(areq.getPathInfo(), "/"); + final String handle = pathInfo[0]; + final String collection = pathInfo[1]; + final String fileName = pathInfo[2]; + final FileBasedCollection col = service.findCollectionByHandle(handle, collection); + try { return col.getEntry(fileName); - - } catch (Exception re) { - if (re instanceof AtomException) throw (AtomException)re; + + } catch (final Exception re) { + if (re instanceof AtomException) { + throw (AtomException) re; + } throw new AtomException("ERROR: getting entry", re); } } - + /** * Update entry specified by pathInfo and posted entry. * - * @param entry + * @param entry * @param areq Details of HTTP request - * @throws com.sun.syndication.propono.atom.server.AtomException + * @throws com.sun.syndication.propono.atom.server.AtomException */ - public void putEntry(AtomRequest areq, Entry entry) throws AtomException { + @Override + public void putEntry(final AtomRequest areq, final Entry entry) throws AtomException { log.debug("putEntry"); - String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/"); - String handle = pathInfo[0]; - String collection = pathInfo[1]; - String fileName = pathInfo[2]; - FileBasedCollection col = service.findCollectionByHandle(handle, collection); - try { + final String[] pathInfo = StringUtils.split(areq.getPathInfo(), "/"); + final String handle = pathInfo[0]; + final String collection = pathInfo[1]; + final String fileName = pathInfo[2]; + final FileBasedCollection col = service.findCollectionByHandle(handle, collection); + try { col.updateEntry(entry, fileName); - - } catch ( Exception fe ) { - throw new AtomException( fe ); + + } catch (final Exception fe) { + throw new AtomException(fe); } } - - + /** * Delete entry specified by pathInfo. + * * @param areq Details of HTTP request */ - public void deleteEntry(AtomRequest areq) throws AtomException { + @Override + public void deleteEntry(final AtomRequest areq) throws AtomException { log.debug("deleteEntry"); - String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/"); - String handle = pathInfo[0]; - String collection = pathInfo[1]; - String fileName = pathInfo[2]; - FileBasedCollection col = service.findCollectionByHandle(handle, collection); + final String[] pathInfo = StringUtils.split(areq.getPathInfo(), "/"); + final String handle = pathInfo[0]; + final String collection = pathInfo[1]; + final String fileName = pathInfo[2]; + final FileBasedCollection col = service.findCollectionByHandle(handle, collection); try { - col.deleteEntry(fileName); + col.deleteEntry(fileName); - } catch (Exception e) { - String msg = "ERROR in atom.deleteResource"; - log.error(msg,e); + } catch (final Exception e) { + final String msg = "ERROR in atom.deleteResource"; + log.error(msg, e); throw new AtomException(msg); } } - /** - * Store media data in collection specified by pathInfo, create an Atom - * media-link entry to store metadata for the new media file and return - * that entry to the caller. + * Store media data in collection specified by pathInfo, create an Atom media-link entry to store metadata for the new media file and return that entry to + * the caller. + * * @param areq Details of HTTP request - * @param entry New entry initialzied with only title and content type + * @param entry New entry initialzied with only title and content type * @return Location URL of new media entry */ - public Entry postMedia(AtomRequest areq, Entry entry) throws AtomException { - + @Override + public Entry postMedia(final AtomRequest areq, final Entry entry) throws AtomException { + // get incoming slug from HTTP header - String slug = areq.getHeader("Slug"); - + final String slug = areq.getHeader("Slug"); + if (log.isDebugEnabled()) { - log.debug("postMedia - title: "+entry.getTitle()+" slug:"+slug); - } - + log.debug("postMedia - title: " + entry.getTitle() + " slug:" + slug); + } + try { - File tempFile = null; - String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/"); - String handle = pathInfo[0]; - String collection = pathInfo[1]; - FileBasedCollection col = service.findCollectionByHandle(handle, collection); + final File tempFile = null; + final String[] pathInfo = StringUtils.split(areq.getPathInfo(), "/"); + final String handle = pathInfo[0]; + final String collection = pathInfo[1]; + final FileBasedCollection col = service.findCollectionByHandle(handle, collection); try { col.addMediaEntry(entry, slug, areq.getInputStream()); - } catch (Exception e) { + } catch (final Exception e) { e.printStackTrace(); - String msg = "ERROR reading posted file"; - log.error(msg,e); + final String msg = "ERROR reading posted file"; + log.error(msg, e); throw new AtomException(msg, e); } finally { - if (tempFile != null) tempFile.delete(); + if (tempFile != null) { + tempFile.delete(); + } } - - } catch (Exception re) { + + } catch (final Exception re) { throw new AtomException("ERROR: posting media"); } return entry; - } - + } + /** * Update the media file part of a media-link entry. - * @param areq Details of HTTP request - * Assuming pathInfo of form /user-name/resource/name + * + * @param areq Details of HTTP request Assuming pathInfo of form /user-name/resource/name */ - public void putMedia(AtomRequest areq) throws AtomException { - + @Override + public void putMedia(final AtomRequest areq) throws AtomException { + log.debug("putMedia"); - String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/"); - String handle = pathInfo[0]; - String collection = pathInfo[1]; - String fileName = pathInfo[3]; - FileBasedCollection col = service.findCollectionByHandle(handle, collection); + final String[] pathInfo = StringUtils.split(areq.getPathInfo(), "/"); + final String handle = pathInfo[0]; + final String collection = pathInfo[1]; + final String fileName = pathInfo[3]; + final FileBasedCollection col = service.findCollectionByHandle(handle, collection); try { col.updateMediaEntry(fileName, areq.getContentType(), areq.getInputStream()); - - } catch (Exception re) { + + } catch (final Exception re) { throw new AtomException("ERROR: posting media"); } } - - public AtomMediaResource getMediaResource(AtomRequest areq) throws AtomException { + + @Override + public AtomMediaResource getMediaResource(final AtomRequest areq) throws AtomException { log.debug("putMedia"); - String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/"); - String handle = pathInfo[0]; - String collection = pathInfo[1]; - String fileName = pathInfo[3]; - FileBasedCollection col = service.findCollectionByHandle(handle, collection); + final String[] pathInfo = StringUtils.split(areq.getPathInfo(), "/"); + final String handle = pathInfo[0]; + final String collection = pathInfo[1]; + final String fileName = pathInfo[3]; + final FileBasedCollection col = service.findCollectionByHandle(handle, collection); try { return col.getMediaResource(fileName); - - } catch (Exception re) { + + } catch (final Exception re) { throw new AtomException("ERROR: posting media"); } } @@ -327,115 +344,122 @@ public class FileBasedAtomHandler implements AtomHandler { /** * Return true if specified pathinfo represents URI of service doc. */ - public boolean isAtomServiceURI(AtomRequest areq) { - String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/"); - if (pathInfo.length==0) return true; + @Override + public boolean isAtomServiceURI(final AtomRequest areq) { + final String[] pathInfo = StringUtils.split(areq.getPathInfo(), "/"); + if (pathInfo.length == 0) { + return true; + } return false; } - + /** * Return true if specified pathinfo represents URI of category doc. */ - public boolean isCategoriesURI(AtomRequest areq) { + @Override + public boolean isCategoriesURI(final AtomRequest areq) { log.debug("isCategoriesDocumentURI"); - String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/"); + final String[] pathInfo = StringUtils.split(areq.getPathInfo(), "/"); if (pathInfo.length == 3 && "categories".equals(pathInfo[2])) { return true; } return false; } - + /** * Return true if specified pathinfo represents URI of a collection. */ - public boolean isCollectionURI(AtomRequest areq) { + @Override + public boolean isCollectionURI(final AtomRequest areq) { log.debug("isCollectionURI"); // workspace/collection-plural // if length is 2 and points to a valid collection then YES - String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/"); + final String[] pathInfo = StringUtils.split(areq.getPathInfo(), "/"); if (pathInfo.length == 2) { - String handle = pathInfo[0]; - String collection = pathInfo[1]; + final String handle = pathInfo[0]; + final String collection = pathInfo[1]; if (service.findCollectionByHandle(handle, collection) != null) { return true; } } return false; - + } - + /** * Return true if specified pathinfo represents URI of an Atom entry. */ - public boolean isEntryURI(AtomRequest areq) { + @Override + public boolean isEntryURI(final AtomRequest areq) { log.debug("isEntryURI"); // workspace/collection-singular/fsid // if length is 3 and points to a valid collection then YES - String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/"); + final String[] pathInfo = StringUtils.split(areq.getPathInfo(), "/"); if (pathInfo.length == 3) { - String handle = pathInfo[0]; - String collection = pathInfo[1]; + final String handle = pathInfo[0]; + final String collection = pathInfo[1]; if (service.findCollectionByHandle(handle, collection) != null) { return true; } } return false; } - + /** * Return true if specified pathinfo represents media-edit URI. */ - public boolean isMediaEditURI(AtomRequest areq) { + @Override + public boolean isMediaEditURI(final AtomRequest areq) { log.debug("isMediaEditURI"); // workspace/collection-singular/fsid/media/fsid // if length is 4, points to a valid collection and fsid is mentioned twice then YES - String[] pathInfo = StringUtils.split(areq.getPathInfo(),"/"); + final String[] pathInfo = StringUtils.split(areq.getPathInfo(), "/"); if (pathInfo.length == 4) { - String handle = pathInfo[0]; - String collection = pathInfo[1]; - String media = pathInfo[2]; - String fsid = pathInfo[3]; + final String handle = pathInfo[0]; + final String collection = pathInfo[1]; + final String media = pathInfo[2]; + final String fsid = pathInfo[3]; if (service.findCollectionByHandle(handle, collection) != null && media.equals("media")) { return true; } } return false; - + } - + /** * BASIC authentication. */ - public String authenticateBASIC(HttpServletRequest request) { + public String authenticateBASIC(final HttpServletRequest request) { log.debug("authenticateBASIC"); boolean valid = false; String userID = null; String password = null; try { - String authHeader = request.getHeader("Authorization"); + final String authHeader = request.getHeader("Authorization"); if (authHeader != null) { - StringTokenizer st = new StringTokenizer(authHeader); + final StringTokenizer st = new StringTokenizer(authHeader); if (st.hasMoreTokens()) { - String basic = st.nextToken(); + final String basic = st.nextToken(); if (basic.equalsIgnoreCase("Basic")) { - String credentials = st.nextToken(); - String userPass = new String(Base64.decodeBase64(credentials.getBytes())); - int p = userPass.indexOf(":"); + final String credentials = st.nextToken(); + final String userPass = new String(Base64.decodeBase64(credentials.getBytes())); + final int p = userPass.indexOf(":"); if (p != -1) { userID = userPass.substring(0, p); - password = userPass.substring(p+1); - - // Validate the User. - valid = validateUser( userID, password ); + password = userPass.substring(p + 1); + + // Validate the User. + valid = validateUser(userID, password); } } } } - } catch (Exception e) { + } catch (final Exception e) { log.debug(e); } if (valid) { - //For now assume userID as userName + // For now assume userID as userName return userID; } return null; diff --git a/src/main/java/org/rometools/propono/atom/server/impl/FileBasedAtomHandlerFactory.java b/src/main/java/org/rometools/propono/atom/server/impl/FileBasedAtomHandlerFactory.java index 12070db..f905f83 100644 --- a/src/main/java/org/rometools/propono/atom/server/impl/FileBasedAtomHandlerFactory.java +++ b/src/main/java/org/rometools/propono/atom/server/impl/FileBasedAtomHandlerFactory.java @@ -12,26 +12,26 @@ * 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. - */ + */ package org.rometools.propono.atom.server.impl; -import org.rometools.propono.atom.server.AtomHandlerFactory; -import org.rometools.propono.atom.server.AtomHandler; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.rometools.propono.atom.server.AtomHandler; +import org.rometools.propono.atom.server.AtomHandlerFactory; + /** - * Extends {@link com.sun.syndication.propono.atom.server.AtomHandlerFactory} to create and return + * Extends {@link com.sun.syndication.propono.atom.server.AtomHandlerFactory} to create and return * {@link com.sun.syndication.propono.atom.server.impl.FileBasedAtomHandler}. */ public class FileBasedAtomHandlerFactory extends AtomHandlerFactory { - + /** * Create new AtomHandler. */ - public AtomHandler newAtomHandler( - HttpServletRequest req, HttpServletResponse res ) { + @Override + public AtomHandler newAtomHandler(final HttpServletRequest req, final HttpServletResponse res) { return new FileBasedAtomHandler(req); - } + } } - diff --git a/src/main/java/org/rometools/propono/atom/server/impl/FileBasedAtomService.java b/src/main/java/org/rometools/propono/atom/server/impl/FileBasedAtomService.java index 5f2eeec..1a2c176 100644 --- a/src/main/java/org/rometools/propono/atom/server/impl/FileBasedAtomService.java +++ b/src/main/java/org/rometools/propono/atom/server/impl/FileBasedAtomService.java @@ -12,32 +12,31 @@ * 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. - */ + */ package org.rometools.propono.atom.server.impl; -import org.rometools.propono.atom.common.AtomService; -import org.rometools.propono.utils.Utilities; import java.io.InputStream; import java.util.Map; import java.util.Properties; import java.util.TreeMap; +import org.rometools.propono.atom.common.AtomService; +import org.rometools.propono.utils.Utilities; + /** - * File based Atom service. - * Supports one workspace per user. - * Collections in workspace are defined in /propono.properties, for example: - * + * File based Atom service. Supports one workspace per user. Collections in workspace are defined in /propono.properties, for example: + * *
  *    # Define list of collections to be offered
  *    propono.atomserver.filebased.collections=entries,gifimages
- *
+ * 
  *    # Defines 'entries' collection, accepts entries
  *    propono.atomserver.filebased.collection.entries.title=Entries
  *    propono.atomserver.filebased.collection.entries.singular=entry
  *    propono.atomserver.filebased.collection.entries.plural=entries
  *    propono.atomserver.filebased.collection.entries.accept=application/atom+xml;type=entry
  *    propono.atomserver.filebased.collection.entries.categories=general,category1,category2
- *
+ * 
  *    # Defines 'gifimages' collection, accepts only GIF files
  *    propono.atomserver.filebased.collection.gifimages.title=GIF Images
  *    propono.atomserver.filebased.collection.gifimages.singular=gif
@@ -45,144 +44,147 @@ import java.util.TreeMap;
  *    propono.atomserver.filebased.collection.gifimages.accept=image/gif
  *    propono.atomserver.filebased.collection.gifimages.categories=general,category1,category2
  * 
- * - * If no such properties are found, then service will fall back to two - * collections: 'entries' for Atom entries and 'resources' for any content-type. * - * - *

URI structure used for accessing collections and entries

+ * If no such properties are found, then service will fall back to two collections: 'entries' for Atom entries and 'resources' for any content-type. * - *

Collection feed (URI allows GET to get collection, POST to add to it)
- * [servlet-context-uri]/app/[workspace-handle]/[collection-plural] + * + *

+ * URI structure used for accessing collections and entries *

* - *

Collection entry (URI allows GET, PUT and DELETE)
- * [servlet-context-uri]/app/[workspace-handle]/[collection-singular]/[entryid] + *

+ * Collection feed (URI allows GET to get collection, POST to add to it)
+ * [servlet-context-uri]/app/[workspace-handle]/[collection-plural] *

* - *

Collection entry media (URI allows GET, PUT and DELETE)
- * [servlet-context-uri]/app/[workspace-handle]/[collection-singular]/media/[entryid] + *

+ * Collection entry (URI allows GET, PUT and DELETE)
+ * [servlet-context-uri]/app/[workspace-handle]/[collection-singular]/[entryid] *

* - *

Categories URI if not using inline categories (URI allows GET)
- * [servlet-context-uri]/app/[workspace-handle]/[collection-plural]/categories + *

+ * Collection entry media (URI allows GET, PUT and DELETE)
+ * [servlet-context-uri]/app/[workspace-handle]/[collection-singular]/media/[entryid] *

* - * - *

Directory structure used to store collections and entries

- * - *

Collection feed (kept constantly up to date)
- * [servlet-context-dir]/[workspace-handle]/[collection-plural]/feed.xml + *

+ * Categories URI if not using inline categories (URI allows GET)
+ * [servlet-context-uri]/app/[workspace-handle]/[collection-plural]/categories *

- * - *

Collection entry (individual entries also stored as entry.xml files)
- * [servlet-context-dir]/[workspace-handle]/[collection-plural]/id/entry.xml + * + * + *

+ * Directory structure used to store collections and entries *

- * - *

Collection entry media (media file stored under entry directory)
- * [servlet-context-dir]/[workspace-handle]/[collection-plural]/id/media/id + * + *

+ * Collection feed (kept constantly up to date)
+ * [servlet-context-dir]/[workspace-handle]/[collection-plural]/feed.xml + *

+ * + *

+ * Collection entry (individual entries also stored as entry.xml files)
+ * [servlet-context-dir]/[workspace-handle]/[collection-plural]/id/entry.xml + *

+ * + *

+ * Collection entry media (media file stored under entry directory)
+ * [servlet-context-dir]/[workspace-handle]/[collection-plural]/id/media/id *

*/ public class FileBasedAtomService extends AtomService { - private Map workspaceMap = new TreeMap(); - private Map collectionMap = new TreeMap(); + private final Map workspaceMap = new TreeMap(); + private final Map collectionMap = new TreeMap(); private static Properties cacheProps = new Properties(); private boolean firstTime = true; - - /** + + /** * Creates a new instance of FileBasedAtomService. */ - public FileBasedAtomService( - String userName, String baseDir, String contextURI, String contextPath, String servletPath) throws Exception { - String workspaceHandle = userName; + public FileBasedAtomService(final String userName, final String baseDir, final String contextURI, final String contextPath, final String servletPath) + throws Exception { + final String workspaceHandle = userName; - // One workspace per user - FileBasedWorkspace workspace = new FileBasedWorkspace(workspaceHandle, baseDir); + // One workspace per user + final FileBasedWorkspace workspace = new FileBasedWorkspace(workspaceHandle, baseDir); workspaceMap.put(userName, workspace); - + if (firstTime) { - synchronized(cacheProps) { - InputStream is = getClass().getResourceAsStream("/propono.properties"); - if (is != null) cacheProps.load(is); - firstTime = false; + synchronized (cacheProps) { + final InputStream is = getClass().getResourceAsStream("/propono.properties"); + if (is != null) { + cacheProps.load(is); + } + firstTime = false; } } // can't find propono.properties, so use system props instead - if (cacheProps == null) cacheProps = System.getProperties(); - - String relativeURIsString = cacheProps.getProperty( - "propono.atomserver.filebased.relativeURIs"); - boolean relativeURIs = "true".equals(relativeURIsString); - - String inlineCategoriesString = cacheProps.getProperty( - "propono.atomserver.filebased.inlineCategories"); - boolean inlineCategories = "true".equals(inlineCategoriesString); - - String colnames = cacheProps.getProperty("propono.atomserver.filebased.collections"); + if (cacheProps == null) { + cacheProps = System.getProperties(); + } + + final String relativeURIsString = cacheProps.getProperty("propono.atomserver.filebased.relativeURIs"); + final boolean relativeURIs = "true".equals(relativeURIsString); + + final String inlineCategoriesString = cacheProps.getProperty("propono.atomserver.filebased.inlineCategories"); + final boolean inlineCategories = "true".equals(inlineCategoriesString); + + final String colnames = cacheProps.getProperty("propono.atomserver.filebased.collections"); if (colnames != null) { - + // collections specified in propono.properties, use those - - String[] colarray = Utilities.stringToStringArray(colnames,","); - for (int i=0; i[collection-plural]/[entryid]/media/[entryid]. - * An Atom entry will be created to store metadata for the entry and it will exist - * at the path [collection-plural]/[entryid]/entry.xml. - * The entry will be added to the collection's feed in [collection-plural]/feed.xml. + * Add media entry to collection. Accepts a media file to be added to collection. The file will be saved to disk in a directory under the collection's + * directory and the path will follow the pattern [collection-plural]/[entryid]/media/[entryid]. An Atom entry will be created to store + * metadata for the entry and it will exist at the path [collection-plural]/[entryid]/entry.xml. The entry will be added to the collection's + * feed in [collection-plural]/feed.xml. + * * @param entry Entry object * @param slug String to be used in file-name * @param is Source of media data * @throws java.lang.Exception On Error * @return Location URI of entry */ - public String addMediaEntry(Entry entry, String slug, InputStream is) throws Exception { - synchronized (FileStore.getFileStore()) { + public String addMediaEntry(final Entry entry, final String slug, final InputStream is) throws Exception { + synchronized (FileStore.getFileStore()) { // Save media file temp file - Content content = (Content)entry.getContents().get(0); + final Content content = entry.getContents().get(0); if (entry.getTitle() == null) { entry.setTitle(slug); } - String fileName = createFileName((slug != null) ? slug : entry.getTitle(), content.getType()); - File tempFile = File.createTempFile(fileName, "tmp"); - FileOutputStream fos = new FileOutputStream(tempFile); + final String fileName = createFileName(slug != null ? slug : entry.getTitle(), content.getType()); + final File tempFile = File.createTempFile(fileName, "tmp"); + final FileOutputStream fos = new FileOutputStream(tempFile); Utilities.copyInputToOutput(is, fos); fos.close(); // Save media file - FileInputStream fis = new FileInputStream(tempFile); + final FileInputStream fis = new FileInputStream(tempFile); saveMediaFile(fileName, content.getType(), tempFile.length(), fis); fis.close(); - File resourceFile = new File(getEntryMediaPath(fileName)); + final File resourceFile = new File(getEntryMediaPath(fileName)); // Create media-link entry - updateTimestamps(entry); + updateTimestamps(entry); // Save media-link entry - String entryPath = getEntryPath(fileName); - OutputStream os = FileStore.getFileStore().getFileOutputStream(entryPath); + final String entryPath = getEntryPath(fileName); + final OutputStream os = FileStore.getFileStore().getFileOutputStream(entryPath); updateMediaEntryAppLinks(entry, resourceFile.getName(), true); Atom10Generator.serializeEntry(entry, new OutputStreamWriter(os, "UTF-8")); os.flush(); os.close(); // Update feed with new entry - Feed f = getFeedDocument(); + final Feed f = getFeedDocument(); updateMediaEntryAppLinks(entry, resourceFile.getName(), false); updateFeedDocumentWithNewEntry(f, entry); return getEntryEditURI(fileName, false, true); } } - + /** * Get an entry from the collection. + * * @param fsid Internal ID of entry to be returned * @throws java.lang.Exception On error * @return Entry specified by fileName/ID @@ -285,14 +268,14 @@ public class FileBasedCollection extends Collection { fsid = fsid.substring(0, fsid.length() - ".media-link".length()); } - String entryPath = getEntryPath(fsid); + final String entryPath = getEntryPath(fsid); checkExistence(entryPath); - InputStream in = FileStore.getFileStore().getFileInputStream(entryPath); + final InputStream in = FileStore.getFileStore().getFileInputStream(entryPath); final Entry entry; - String filePath = getEntryMediaPath(fsid); - File resource = new File(fsid); + final String filePath = getEntryMediaPath(fsid); + final File resource = new File(fsid); if (resource.exists()) { entry = loadAtomResourceEntry(in, resource); updateMediaEntryAppLinks(entry, fsid, true); @@ -302,26 +285,27 @@ public class FileBasedCollection extends Collection { } return entry; } - + /** * Get media resource wrapping a file. */ - public AtomMediaResource getMediaResource(String fileName) throws Exception { - String filePath = getEntryMediaPath(fileName); - File resource = new File(filePath); + public AtomMediaResource getMediaResource(final String fileName) throws Exception { + final String filePath = getEntryMediaPath(fileName); + final File resource = new File(filePath); return new AtomMediaResource(resource); } - + /** * Update an entry in the collection. + * * @param entry Updated entry to be stored * @param fsid Internal ID of entry * @throws java.lang.Exception On error */ - public void updateEntry(Entry entry, String fsid) throws Exception { - synchronized (FileStore.getFileStore()) { + public void updateEntry(final Entry entry, String fsid) throws Exception { + synchronized (FileStore.getFileStore()) { - Feed f = getFeedDocument(); + final Feed f = getFeedDocument(); if (fsid.endsWith(".media-link")) { fsid = fsid.substring(0, fsid.length() - ".media-link".length()); @@ -332,93 +316,98 @@ public class FileBasedCollection extends Collection { updateEntryAppLinks(entry, fsid, false); updateFeedDocumentWithExistingEntry(f, entry); - String entryPath = getEntryPath(fsid); - OutputStream os = FileStore.getFileStore().getFileOutputStream(entryPath); + final String entryPath = getEntryPath(fsid); + final OutputStream os = FileStore.getFileStore().getFileOutputStream(entryPath); updateEntryAppLinks(entry, fsid, true); Atom10Generator.serializeEntry(entry, new OutputStreamWriter(os, "UTF-8")); os.flush(); os.close(); } } - + /** * Update media associated with a media-link entry. + * * @param fileName Internal ID of entry being updated * @param contentType Content type of data * @param is Source of updated data * @throws java.lang.Exception On error * @return Updated Entry as it exists on server */ - public Entry updateMediaEntry(String fileName, String contentType, InputStream is) throws Exception { - synchronized (FileStore.getFileStore()) { + public Entry updateMediaEntry(final String fileName, final String contentType, final InputStream is) throws Exception { + synchronized (FileStore.getFileStore()) { - File tempFile = File.createTempFile(fileName, "tmp"); - FileOutputStream fos = new FileOutputStream(tempFile); + final File tempFile = File.createTempFile(fileName, "tmp"); + final FileOutputStream fos = new FileOutputStream(tempFile); Utilities.copyInputToOutput(is, fos); fos.close(); // Update media file - FileInputStream fis = new FileInputStream(tempFile); + final FileInputStream fis = new FileInputStream(tempFile); saveMediaFile(fileName, contentType, tempFile.length(), fis); fis.close(); - File resourceFile = new File(getEntryMediaPath(fileName)); + final File resourceFile = new File(getEntryMediaPath(fileName)); // Load media-link entry to return - String entryPath = getEntryPath(fileName); - InputStream in = FileStore.getFileStore().getFileInputStream(entryPath); - Entry atomEntry = loadAtomResourceEntry(in, resourceFile); + final String entryPath = getEntryPath(fileName); + final InputStream in = FileStore.getFileStore().getFileInputStream(entryPath); + final Entry atomEntry = loadAtomResourceEntry(in, resourceFile); updateTimestamps(atomEntry); updateMediaEntryAppLinks(atomEntry, fileName, false); // Update feed with new entry - Feed f = getFeedDocument(); + final Feed f = getFeedDocument(); updateFeedDocumentWithExistingEntry(f, atomEntry); // Save updated media-link entry - OutputStream os = FileStore.getFileStore().getFileOutputStream(entryPath); + final OutputStream os = FileStore.getFileStore().getFileOutputStream(entryPath); updateMediaEntryAppLinks(atomEntry, fileName, true); Atom10Generator.serializeEntry(atomEntry, new OutputStreamWriter(os, "UTF-8")); os.flush(); - os.close(); + os.close(); return atomEntry; } } - + /** * Delete an entry and any associated media file. + * * @param fsid Internal ID of entry * @throws java.lang.Exception On error */ - public void deleteEntry(String fsid) throws Exception { + public void deleteEntry(final String fsid) throws Exception { synchronized (FileStore.getFileStore()) { // Remove entry from Feed - Feed feed = getFeedDocument(); + final Feed feed = getFeedDocument(); updateFeedDocumentRemovingEntry(feed, fsid); - String entryFilePath = this.getEntryPath(fsid); + final String entryFilePath = getEntryPath(fsid); FileStore.getFileStore().deleteFile(entryFilePath); - - String entryMediaPath = this.getEntryMediaPath(fsid); + + final String entryMediaPath = getEntryMediaPath(fsid); if (entryMediaPath != null) { FileStore.getFileStore().deleteFile(entryMediaPath); } - - String entryDirPath = getEntryDirPath(fsid); - FileStore.getFileStore().deleteDirectory(entryDirPath); - - try {Thread.sleep(500L);}catch(Exception ignored){} + + final String entryDirPath = getEntryDirPath(fsid); + FileStore.getFileStore().deleteDirectory(entryDirPath); + + try { + Thread.sleep(500L); + } catch (final Exception ignored) { + } } } - - private void updateFeedDocumentWithNewEntry(Feed f, Entry e) throws AtomException { + + private void updateFeedDocumentWithNewEntry(final Feed f, final Entry e) throws AtomException { boolean inserted = false; - for (int i=0; iRepresents a blog, which has collections of entries and resources. - * You can access the collections using the getCollections() and - * getCollection(String name) methods, which return Blog.Collection objects, - * which you can use to create, retrieve update or delete entries within - * a collection.

+ *

+ * Represents a blog, which has collections of entries and resources. You can access the collections using the getCollections() and getCollection(String name) + * methods, which return Blog.Collection objects, which you can use to create, retrieve update or delete entries within a collection. + *

*/ public interface Blog { - + /** * Token can be used to fetch this blog again from getBlog() method. + * * @return Blog object specified by token. */ public String getToken(); - + /** * Name of this blog. + * * @return Display name of this blog. */ public String getName(); - + /** * Get a single BlogEntry (or BlogResource) by token. + * * @param token Token from blog entry's getToken() method. * @throws com.sun.syndication.propono.blogclient.BlogClientException On error fetching the blog entry. * @return Blog entry specified by token. */ public BlogEntry getEntry(String token) throws BlogClientException; - + /** - * Gets listing of entry and resource collections available in the blog, - * including the primary collections. + * Gets listing of entry and resource collections available in the blog, including the primary collections. + * * @throws BlogClientException On error fetching collections. * @return List of Blog.Collection objects. */ public List getCollections() throws BlogClientException; - + /** * Get collection by token. + * * @param token Token from a collection's getToken() method. * @throws BlogClientException On error fetching collection. * @return Blog.Collection object. */ public Collection getCollection(String token) throws BlogClientException; - + /** * Represents an entry or resource collection on a blog server. */ public interface Collection { - + /** * Get blog that contains this collection. + * * @return Blog that contains this collection. */ public Blog getBlog(); - + /** * Title of collection. + * * @return Title of collecton. */ public String getTitle(); - + /** * Token that can be used to fetch collection. + * * @return Token that can be used to fetch collection. */ public String getToken(); - + /** * Content-types accepted by collection. + * * @return Comma-separated list of content-types accepted. */ public List getAccepts(); - + /** * Determines if collection will accept a content-type. + * * @param contentType Content-type to be considered. * @return True of content type will be accepted, false otherwise. */ public boolean accepts(String contentType); - + /** * Return categories allowed by colletion. + * * @throws BlogClientException On error fetching categories. * @return List of BlogEntry.Category objects for this collection. */ public List getCategories() throws BlogClientException; - + /** - * Create but do not save new entry in collection. - * To save entry, call its save() method. + * Create but do not save new entry in collection. To save entry, call its save() method. + * * @throws BlogClientException On error creating entry. * @return New BlogEntry object. */ public BlogEntry newEntry() throws BlogClientException; - + /** - * Create but do not save new resource in collection. - * To save resource, call its save() method. - * @param name Name of new resource. + * Create but do not save new resource in collection. To save resource, call its save() method. + * + * @param name Name of new resource. * @param contentType MIME content-type of new resource. - * @param bytes Data for new resource. + * @param bytes Data for new resource. * @throws BlogClientException On error creating entry. * @return New BlogResource object, */ public BlogResource newResource(String name, String contentType, byte[] bytes) throws BlogClientException; - + /** * Get iterator over entries/resources in this collection. + * * @return List of BlogEntry objects, some may be BlogResources. * @throws BlogClientException On error fetching entries/resources. */ public Iterator getEntries() throws BlogClientException; - + /** - * Save or update a BlogEntry in this collection by adding it to this - * collection and then calling it's entry.save() method. + * Save or update a BlogEntry in this collection by adding it to this collection and then calling it's entry.save() method. + * * @param entry BlogEntry to be saved. * @throws BlogClientException On error saving entry. * @return URI of entry. @@ -143,71 +153,74 @@ public interface Blog { /** * Save or update resource in this collection + * * @param resource BlogResource to be saved. * @throws BlogClientException On error saving resource. * @return URI of resource. */ public String saveResource(BlogResource resource) throws BlogClientException; } - - + // Deprecated primary collection methods, instead use collections directly. - + /** - * Get iterator over entries in primary entries collection (the first - * collection that accepts entries). Note that entries may be partial, - * so don't try to update and save them: to update and entry, first fetch - * it with getEntry(), change fields, then call entry.save(); + * Get iterator over entries in primary entries collection (the first collection that accepts entries). Note that entries may be partial, so don't try to + * update and save them: to update and entry, first fetch it with getEntry(), change fields, then call entry.save(); + * * @return To iterate over all entries in collection. * @throws BlogClientException On failure or if there is no primary entries collection. - * + * * @deprecated Instead use collections directly. */ + @Deprecated public Iterator getEntries() throws BlogClientException; /** - * Get entries in primary resources collection (the first - * collection that accepts anything other than entries). + * Get entries in primary resources collection (the first collection that accepts anything other than entries). + * * @throws BlogClientException On failure or if there is no primary resources collection. * @return To iterate over all resojrces in collection. - * + * * @deprecated Instead use collections directly. */ + @Deprecated public Iterator getResources() throws BlogClientException; - /** - * Create but do not save it to server new BlogEntry in primary entries collection - * (the first collection found that accepts entries). To save the entry to the - * server to a collection, use the entry's save() method. + * Create but do not save it to server new BlogEntry in primary entries collection (the first collection found that accepts entries). To save the entry to + * the server to a collection, use the entry's save() method. + * * @throws BlogClientException On error or if there is no primary entries collection. * @return Unsaved BlogEntry in primary entries collection. - * + * * @deprecated Instead use collections directly. */ + @Deprecated public BlogEntry newEntry() throws BlogClientException; /** - * Create but do not save it to server new BlogResource in primary resources collection - * (the first collection found that accepts resources). To save the resource to the - * server to a collection, use the resource's save() method. - * @param name Name of resource to be saved. - * @param type MIME content type of resource data. + * Create but do not save it to server new BlogResource in primary resources collection (the first collection found that accepts resources). To save the + * resource to the server to a collection, use the resource's save() method. + * + * @param name Name of resource to be saved. + * @param type MIME content type of resource data. * @param bytes Bytes of resource data. * @throws BlogClientException On error or if there is no primary respurces collection. * @return Unsaved BlogEntry in primary resources collection. - * + * * @deprecated Instead use collections directly. */ - public BlogResource newResource(String name, String type, byte[] bytes) - throws BlogClientException; + @Deprecated + public BlogResource newResource(String name, String type, byte[] bytes) throws BlogClientException; /** * Returns list of available BlogEntry.Category in primary entries collection. + * * @throws BlogClientException On error or if there is no primary entries collection. * @return List of BlogEntry.Category objects. - * + * * @deprecated Instead use collections directly. */ - public List getCategories() throws BlogClientException; + @Deprecated + public List getCategories() throws BlogClientException; } diff --git a/src/main/java/org/rometools/propono/blogclient/BlogClientException.java b/src/main/java/org/rometools/propono/blogclient/BlogClientException.java index d0b304a..af27e8a 100644 --- a/src/main/java/org/rometools/propono/blogclient/BlogClientException.java +++ b/src/main/java/org/rometools/propono/blogclient/BlogClientException.java @@ -12,29 +12,30 @@ * 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. - */ + */ package org.rometools.propono.blogclient; /** - * Represents a Blog Client exception, the library throws these instead of - * implementation specific exceptions. + * Represents a Blog Client exception, the library throws these instead of implementation specific exceptions. */ public class BlogClientException extends Exception { - - /** - * Construct a new exception + + /** + * Construct a new exception + * * @param msg Text message that explains exception */ - public BlogClientException(String msg) { + public BlogClientException(final String msg) { super(msg); } - - /** + + /** * Construct a new exception which wraps a throwable. + * * @param msg Text message that explains exception - * @param t Throwable to be wrapped by exception + * @param t Throwable to be wrapped by exception */ - public BlogClientException(String msg, Throwable t) { + public BlogClientException(final String msg, final Throwable t) { super(msg, t); } } diff --git a/src/main/java/org/rometools/propono/blogclient/BlogConnection.java b/src/main/java/org/rometools/propono/blogclient/BlogConnection.java index 817ebc6..ffb5f1f 100644 --- a/src/main/java/org/rometools/propono/blogclient/BlogConnection.java +++ b/src/main/java/org/rometools/propono/blogclient/BlogConnection.java @@ -12,23 +12,22 @@ * 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. - */ + */ package org.rometools.propono.blogclient; import java.util.List; /** - * A BlogConnection is a single-user connection to a blog server where the user - * has access to multiple blogs, which are each represented by a Blog interface. + * A BlogConnection is a single-user connection to a blog server where the user has access to multiple blogs, which are each represented by a Blog interface. */ public interface BlogConnection { - + /** Returns collection of blogs available from this connection */ public abstract List getBlogs(); - + /** Get blog by token */ public abstract Blog getBlog(String token); - + /** Set appkey (optional, needed by some blog servers) */ public void setAppkey(String appkey); } \ No newline at end of file diff --git a/src/main/java/org/rometools/propono/blogclient/BlogConnectionFactory.java b/src/main/java/org/rometools/propono/blogclient/BlogConnectionFactory.java index 1e8e5b7..af11b23 100644 --- a/src/main/java/org/rometools/propono/blogclient/BlogConnectionFactory.java +++ b/src/main/java/org/rometools/propono/blogclient/BlogConnectionFactory.java @@ -12,7 +12,7 @@ * 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. - */ + */ package org.rometools.propono.blogclient; import java.lang.reflect.Constructor; @@ -20,61 +20,53 @@ import java.lang.reflect.Constructor; /** * Entry point to the Blogapps blog client library. */ -public class BlogConnectionFactory { - +public class BlogConnectionFactory { + // BlogConnection implementations must: // 1) implement BlogConnection // 2) privide contructor that accepts three strings args: url, username and password. - + // TODO: make implementations configurable - private static String ATOMPROTOCOL_IMPL_CLASS = - "com.sun.syndication.propono.blogclient.atomprotocol.AtomConnection"; - - private static String METAWEBLOG_IMPL_CLASS = - "com.sun.syndication.propono.blogclient.metaweblog.MetaWeblogConnection"; - - /** - * Create a connection to a blog server. - * @param type Connection type, must be "atom" or "metaweblog" - * @param url End-point URL to connect to - * @param username Username for login to blog server - * @param password Password for login to blog server - */ - public static BlogConnection getBlogConnection( - String type, String url, String username, String password) - throws BlogClientException { - BlogConnection blogConnection = null; - if (type == null || type.equals("metaweblog")) { - blogConnection = createBlogConnection( - METAWEBLOG_IMPL_CLASS, url, username, password); - } else if (type.equals("atom")) { - blogConnection = createBlogConnection( - ATOMPROTOCOL_IMPL_CLASS, url, username, password); - } else { - throw new BlogClientException("Type must be 'atom' or 'metaweblog'"); - } - return blogConnection; - } - - private static BlogConnection createBlogConnection( - String className, String url, String username, String password) - throws BlogClientException { - Class conClass; - try { - conClass = Class.forName(className); - } catch (ClassNotFoundException ex) { - throw new BlogClientException( - "BlogConnection impl. class not found: "+className, ex); - } - Class[] args = new Class[] {String.class, String.class, String.class}; - Constructor ctor; - try { - ctor = conClass.getConstructor(args); - return (BlogConnection) - ctor.newInstance(new Object[] {url, username, password}); - } catch (Throwable t) { - throw new BlogClientException( - "ERROR instantiating BlogConnection impl.", t); - } - } + private static String ATOMPROTOCOL_IMPL_CLASS = "com.sun.syndication.propono.blogclient.atomprotocol.AtomConnection"; + + private static String METAWEBLOG_IMPL_CLASS = "com.sun.syndication.propono.blogclient.metaweblog.MetaWeblogConnection"; + + /** + * Create a connection to a blog server. + * + * @param type Connection type, must be "atom" or "metaweblog" + * @param url End-point URL to connect to + * @param username Username for login to blog server + * @param password Password for login to blog server + */ + public static BlogConnection getBlogConnection(final String type, final String url, final String username, final String password) + throws BlogClientException { + BlogConnection blogConnection = null; + if (type == null || type.equals("metaweblog")) { + blogConnection = createBlogConnection(METAWEBLOG_IMPL_CLASS, url, username, password); + } else if (type.equals("atom")) { + blogConnection = createBlogConnection(ATOMPROTOCOL_IMPL_CLASS, url, username, password); + } else { + throw new BlogClientException("Type must be 'atom' or 'metaweblog'"); + } + return blogConnection; + } + + private static BlogConnection createBlogConnection(final String className, final String url, final String username, final String password) + throws BlogClientException { + Class conClass; + try { + conClass = Class.forName(className); + } catch (final ClassNotFoundException ex) { + throw new BlogClientException("BlogConnection impl. class not found: " + className, ex); + } + final Class[] args = new Class[] { String.class, String.class, String.class }; + Constructor ctor; + try { + ctor = conClass.getConstructor(args); + return (BlogConnection) ctor.newInstance(new Object[] { url, username, password }); + } catch (final Throwable t) { + throw new BlogClientException("ERROR instantiating BlogConnection impl.", t); + } + } } diff --git a/src/main/java/org/rometools/propono/blogclient/BlogEntry.java b/src/main/java/org/rometools/propono/blogclient/BlogEntry.java index 7bf2c1d..facd101 100644 --- a/src/main/java/org/rometools/propono/blogclient/BlogEntry.java +++ b/src/main/java/org/rometools/propono/blogclient/BlogEntry.java @@ -12,39 +12,37 @@ * 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. - */ + */ package org.rometools.propono.blogclient; import java.util.Date; import java.util.List; -import java.io.InputStream; - -/** + +/** * Represents a single blog entry. */ public interface BlogEntry { - + /** Get token, which can be used to fetch the blog entry */ public String getToken(); - - /** - * Save this entry to it's collection. If this is a new entry and does not - * have a collection yet, then save() will save it to the primary collection. + + /** + * Save this entry to it's collection. If this is a new entry and does not have a collection yet, then save() will save it to the primary collection. */ public void save() throws BlogClientException; - + /** Delete this entry from blog server */ public void delete() throws BlogClientException; /** Permanent link to this entry (assigned by server) */ - public String getPermalink(); - + public String getPermalink(); + /** Blog is associated with a blog */ public Blog getBlog(); - + /** Get categories, a list of BlogEntry.Category objects */ public List getCategories(); - + /** Set categories, a list of BlogEntry.Category objects */ public void setCategories(List categories); @@ -56,84 +54,89 @@ public interface BlogEntry { /** Set title of this blog entry */ public void setTitle(String title); - + /** Get summary of this blog entry */ public String getSummary(); - + /** Set summary of this blog entry */ public void setSummary(String summary); - + /** Get content of this blog entry */ public Content getContent(); /** Set content of this blog entry */ public void setContent(Content content); - + /** Get draft status of this entry */ public boolean getDraft(); /** Set draft status of this entry */ public void setDraft(boolean draft); - + /** Get author of this entry */ public Person getAuthor(); - + /** Set author of this entry */ public void setAuthor(Person author); - + /** Set publish date of this entry */ public Date getPublicationDate(); - + /** Get publish date of this entry */ - public void setPublicationDate(Date date); - + public void setPublicationDate(Date date); + /** Get update date of this entry */ public Date getModificationDate(); - + /** Set update date of this entry */ public void setModificationDate(Date date); - + /** Represents blog entry content */ public class Content { String type = "html"; String value = null; String src = null; - + /** Construct content */ - public Content() {} - + public Content() { + } + /** Construct content with value (and type="html") */ - public Content(String value) { + public Content(final String value) { this.value = value; } + /** Get value of content if in-line */ public String getValue() { return value; } + /** Set value of content if in-line */ - public void setValue(String value) { + public void setValue(final String value) { this.value = value; } + /** - * Get type of content, either "text", "html", "xhtml" or a MIME content-type. - * Defaults to HTML. + * Get type of content, either "text", "html", "xhtml" or a MIME content-type. Defaults to HTML. */ public String getType() { return type; } + /** - * Set type of content, either "text", "html", "xhtml" or a MIME content-type. - * Defaults to HTML. + * Set type of content, either "text", "html", "xhtml" or a MIME content-type. Defaults to HTML. */ - public void setType(String type) { + public void setType(final String type) { this.type = type; } + /** Get URI of content if out-of-line */ public String getSrc() { return src; } + /** Set URI of content if out-of-line */ - public void setSrc(String src) { + public void setSrc(final String src) { this.src = src; } } @@ -143,89 +146,113 @@ public interface BlogEntry { String name; String email; String url; + /** Get person's email */ public String getEmail() { return email; } - /** Set person's email */ - public void setEmail(String email) { + + /** Set person's email */ + public void setEmail(final String email) { this.email = email; } + /** Get person's name */ public String getName() { return name; } + /** Set person's name */ - public void setName(String name) { + public void setName(final String name) { this.name = name; } + /** Get person's URL */ public String getUrl() { return url; } + /** Set person's URL */ - public void setUrl(String url) { + public void setUrl(final String url) { this.url = url; } + /** Returns person's name */ + @Override public String toString() { return name; } } - + /** Represents a weblog category */ public class Category { String id; String name; String url; + /** * Create new Catetory */ - public Category() {} + public Category() { + } + /** * Create new category with name. */ - public Category(String id) { + public Category(final String id) { this.id = id; - this.name = id; + name = id; } + /** * Determines if categories are equal based on id. */ - public boolean equals(Object obj) { - Category other = (Category)obj; - if (obj == null) return false; - if (getId() != null && other.getId() != null - && getId().equals(other.getId())) return true; + @Override + public boolean equals(final Object obj) { + final Category other = (Category) obj; + if (obj == null) { + return false; + } + if (getId() != null && other.getId() != null && getId().equals(other.getId())) { + return true; + } return false; } + /** Get category id */ public String getId() { return id; } + /** Set category id */ - public void setId(String id) { + public void setId(final String id) { this.id = id; } + /** Get category display name */ public String getName() { return name; } + /** Set category display name */ - public void setName(String name) { + public void setName(final String name) { this.name = name; } + /** Get URL of category domain */ public String getUrl() { return url; } + /** Set URL of category domain */ - public void setUrl(String url) { + public void setUrl(final String url) { this.url = url; } + /** Return category's name or id for display */ + @Override public String toString() { - return name!=null ? name : id; + return name != null ? name : id; } - } + } } diff --git a/src/main/java/org/rometools/propono/blogclient/BlogResource.java b/src/main/java/org/rometools/propono/blogclient/BlogResource.java index 80a5478..5dc6893 100644 --- a/src/main/java/org/rometools/propono/blogclient/BlogResource.java +++ b/src/main/java/org/rometools/propono/blogclient/BlogResource.java @@ -12,28 +12,25 @@ * 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. - */ + */ package org.rometools.propono.blogclient; import java.io.InputStream; -/** - * Represents a file that has been uploaded to a blog. +/** + * Represents a file that has been uploaded to a blog. *

- * Resources are modeled as a type of BlogEntry, but be aware: not all servers - * can save resource metadata (i.e. title, category, author, etc.). MetaWeblog - * based servers can't save metadata at all and Atom protocol servers are not - * required to preserve uploaded file metadata. + * Resources are modeled as a type of BlogEntry, but be aware: not all servers can save resource metadata (i.e. title, category, author, etc.). MetaWeblog based + * servers can't save metadata at all and Atom protocol servers are not required to preserve uploaded file metadata. */ public interface BlogResource extends BlogEntry { /** Get resource name (name is required) */ public String getName(); - + /** Get resource as stream, using content.src as URL */ public InputStream getAsStream() throws BlogClientException; - + /** Update resource by immediately uploading new bytes to server */ public void update(byte[] newBytes) throws BlogClientException; } - diff --git a/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomBlog.java b/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomBlog.java index 3565775..07899de 100644 --- a/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomBlog.java +++ b/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomBlog.java @@ -12,170 +12,195 @@ * 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. - */ + */ package org.rometools.propono.blogclient.atomprotocol; -import org.rometools.propono.utils.ProponoException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.TreeMap; + import org.apache.commons.httpclient.HttpClient; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - -import org.rometools.propono.blogclient.Blog; -import org.rometools.propono.blogclient.BlogClientException; -import org.rometools.propono.blogclient.BlogEntry; -import org.rometools.propono.blogclient.BlogResource; import org.rometools.propono.atom.client.ClientAtomService; import org.rometools.propono.atom.client.ClientCollection; import org.rometools.propono.atom.client.ClientEntry; import org.rometools.propono.atom.client.ClientMediaEntry; import org.rometools.propono.atom.client.ClientWorkspace; -import java.util.Map; -import java.util.TreeMap; +import org.rometools.propono.blogclient.Blog; +import org.rometools.propono.blogclient.BlogClientException; +import org.rometools.propono.blogclient.BlogEntry; +import org.rometools.propono.blogclient.BlogResource; +import org.rometools.propono.utils.ProponoException; /** * Atom protocol implementation of the BlogClient Blog interface. */ public class AtomBlog implements Blog { static final Log logger = LogFactory.getLog(AtomBlog.class); - private HttpClient httpClient = null; - private String name = null; + private final HttpClient httpClient = null; + private String name = null; private ClientAtomService service; - private ClientWorkspace workspace = null; - private AtomCollection entriesCollection = null; - private AtomCollection resourcesCollection = null; - private Map collections = new TreeMap(); - + private ClientWorkspace workspace = null; + private AtomCollection entriesCollection = null; + private AtomCollection resourcesCollection = null; + private final Map collections = new TreeMap(); + /** - * Create AtomBlog using specified HTTPClient, user account and workspace, - * called by AtomConnection. Fetches Atom Service document and creates - * an AtomCollection object for each collection found. The first entry - * collection is considered the primary entry collection. And the first - * resource collection is considered the primary resource collection. + * Create AtomBlog using specified HTTPClient, user account and workspace, called by AtomConnection. Fetches Atom Service document and creates an + * AtomCollection object for each collection found. The first entry collection is considered the primary entry collection. And the first resource collection + * is considered the primary resource collection. */ - AtomBlog(ClientAtomService service, ClientWorkspace workspace) { - this.setService(service); - this.setWorkspace(workspace); - this.name = workspace.getTitle(); - Iterator members = workspace.getCollections().iterator(); - + AtomBlog(final ClientAtomService service, final ClientWorkspace workspace) { + setService(service); + setWorkspace(workspace); + name = workspace.getTitle(); + final Iterator members = workspace.getCollections().iterator(); + while (members.hasNext()) { - ClientCollection col = (ClientCollection) members.next(); + final ClientCollection col = (ClientCollection) members.next(); if (col.accepts("entry") && entriesCollection == null) { - // first entry collection is primary entry collection + // first entry collection is primary entry collection entriesCollection = new AtomCollection(this, col); - } - else if (!col.accepts("entry") && resourcesCollection == null) { + } else if (!col.accepts("entry") && resourcesCollection == null) { // first non-entry collection is primary resource collection resourcesCollection = new AtomCollection(this, col); - } + } collections.put(col.getHrefResolved(), new AtomCollection(this, col)); - } - } - + } + } + /** - * {@inheritDoc} + * {@inheritDoc} */ - public String getName() { return name; } + @Override + public String getName() { + return name; + } /** * String display of blog, returns name. */ - public String toString() { return getName(); } - - /** - * {@inheritDoc} - */ - public String getToken() { return entriesCollection.getToken(); } + @Override + public String toString() { + return getName(); + } - /** - * {@inheritDoc} - */ - public BlogEntry newEntry() throws BlogClientException { - if (entriesCollection == null) throw new BlogClientException("No entry collection"); - return entriesCollection.newEntry(); - } - /** * {@inheritDoc} */ - public BlogEntry getEntry(String token) throws BlogClientException { + @Override + public String getToken() { + return entriesCollection.getToken(); + } + + /** + * {@inheritDoc} + */ + @Override + public BlogEntry newEntry() throws BlogClientException { + if (entriesCollection == null) { + throw new BlogClientException("No entry collection"); + } + return entriesCollection.newEntry(); + } + + /** + * {@inheritDoc} + */ + @Override + public BlogEntry getEntry(final String token) throws BlogClientException { ClientEntry clientEntry = null; - AtomEntry atomEntry = null; + final AtomEntry atomEntry = null; try { - clientEntry = getService().getEntry(token); - } catch (ProponoException ex) { + clientEntry = getService().getEntry(token); + } catch (final ProponoException ex) { throw new BlogClientException("ERROR: fetching entry", ex); } if (clientEntry != null && clientEntry instanceof ClientMediaEntry) { - return new AtomResource(this, (ClientMediaEntry)clientEntry); + return new AtomResource(this, (ClientMediaEntry) clientEntry); } else if (clientEntry != null && clientEntry instanceof ClientEntry) { return new AtomEntry(this, clientEntry); } else { throw new BlogClientException("ERROR: unknown object type returned"); } } - + /** - * {@inheritDoc} + * {@inheritDoc} */ + @Override public Iterator getEntries() throws BlogClientException { - if (entriesCollection == null) throw new BlogClientException("No primary entry collection"); + if (entriesCollection == null) { + throw new BlogClientException("No primary entry collection"); + } return new AtomEntryIterator(entriesCollection); - } - - /** - * {@inheritDoc} - */ - public Iterator getResources() throws BlogClientException { - if (resourcesCollection == null) throw new BlogClientException("No primary entry collection"); - return new AtomEntryIterator(resourcesCollection); - } - - String saveEntry(BlogEntry entry) throws BlogClientException { - if (entriesCollection == null) throw new BlogClientException("No primary entry collection"); - return entriesCollection.saveEntry(entry); - } - - void deleteEntry(BlogEntry entry) throws BlogClientException { - if (entriesCollection == null) throw new BlogClientException("No primary entry collection"); - entriesCollection.deleteEntry(entry); } /** * {@inheritDoc} */ - public List getCategories() throws BlogClientException { - if (entriesCollection == null) throw new BlogClientException("No primary entry collection"); - return entriesCollection.getCategories(); + @Override + public Iterator getResources() throws BlogClientException { + if (resourcesCollection == null) { + throw new BlogClientException("No primary entry collection"); + } + return new AtomEntryIterator(resourcesCollection); } - + + String saveEntry(final BlogEntry entry) throws BlogClientException { + if (entriesCollection == null) { + throw new BlogClientException("No primary entry collection"); + } + return entriesCollection.saveEntry(entry); + } + + void deleteEntry(final BlogEntry entry) throws BlogClientException { + if (entriesCollection == null) { + throw new BlogClientException("No primary entry collection"); + } + entriesCollection.deleteEntry(entry); + } + /** * {@inheritDoc} */ - public BlogResource newResource( - String name, String contentType, byte[] bytes) throws BlogClientException { - if (resourcesCollection == null) { + @Override + public List getCategories() throws BlogClientException { + if (entriesCollection == null) { + throw new BlogClientException("No primary entry collection"); + } + return entriesCollection.getCategories(); + } + + /** + * {@inheritDoc} + */ + @Override + public BlogResource newResource(final String name, final String contentType, final byte[] bytes) throws BlogClientException { + if (resourcesCollection == null) { throw new BlogClientException("No resource collection"); } return resourcesCollection.newResource(name, contentType, bytes); } - - String saveResource(BlogResource res) throws BlogClientException { - if (resourcesCollection == null) throw new BlogClientException("No primary resource collection"); + String saveResource(final BlogResource res) throws BlogClientException { + if (resourcesCollection == null) { + throw new BlogClientException("No primary resource collection"); + } return resourcesCollection.saveResource(res); } - - void deleteResource(BlogResource resource) throws BlogClientException { - deleteEntry((BlogEntry)resource); - } - + + void deleteResource(final BlogResource resource) throws BlogClientException { + deleteEntry(resource); + } + /** * {@inheritDoc} */ + @Override public List getCollections() throws BlogClientException { return new ArrayList(collections.values()); } @@ -183,15 +208,16 @@ public class AtomBlog implements Blog { /** * {@inheritDoc} */ - public Blog.Collection getCollection(String token) throws BlogClientException { - return (Blog.Collection)collections.get(token); - } - + @Override + public Blog.Collection getCollection(final String token) throws BlogClientException { + return (Blog.Collection) collections.get(token); + } + ClientAtomService getService() { return service; } - void setService(ClientAtomService service) { + void setService(final ClientAtomService service) { this.service = service; } @@ -199,7 +225,7 @@ public class AtomBlog implements Blog { return workspace; } - void setWorkspace(ClientWorkspace workspace) { + void setWorkspace(final ClientWorkspace workspace) { this.workspace = workspace; } diff --git a/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomCollection.java b/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomCollection.java index 3758bc5..3c16f78 100644 --- a/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomCollection.java +++ b/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomCollection.java @@ -12,44 +12,45 @@ * 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. - */ + */ package org.rometools.propono.blogclient.atomprotocol; -import com.sun.syndication.feed.atom.Category; -import org.rometools.propono.atom.client.ClientAtomService; -import org.rometools.propono.atom.common.Categories; -import org.rometools.propono.atom.client.ClientCollection; -import org.rometools.propono.atom.client.ClientEntry; import java.util.ArrayList; import java.util.Iterator; -import java.util.List; +import java.util.List; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.rometools.propono.atom.client.ClientAtomService; +import org.rometools.propono.atom.client.ClientCollection; +import org.rometools.propono.atom.client.ClientEntry; +import org.rometools.propono.atom.common.Categories; import org.rometools.propono.blogclient.Blog; import org.rometools.propono.blogclient.BlogClientException; import org.rometools.propono.blogclient.BlogEntry; import org.rometools.propono.blogclient.BlogResource; +import com.sun.syndication.feed.atom.Category; + /** * Atom protocol implementation of BlogClient Blog.Collection. */ public class AtomCollection implements Blog.Collection { static final Log logger = LogFactory.getLog(AtomCollection.class); - + private Blog blog = null; private List categories = new ArrayList(); private ClientCollection clientCollection = null; - - AtomCollection(AtomBlog blog, ClientCollection col) { - this.blog = blog; - this.clientCollection = col; - for (Iterator catsIter = col.getCategories().iterator(); catsIter.hasNext();) { - Categories cats = (Categories)catsIter.next(); - for (Iterator catIter = cats.getCategories().iterator(); catIter.hasNext();) { - Category cat = (Category)catIter.next(); - BlogEntry.Category blogCat = new BlogEntry.Category(cat.getTerm()); + AtomCollection(final AtomBlog blog, final ClientCollection col) { + this.blog = blog; + clientCollection = col; + for (final Iterator catsIter = col.getCategories().iterator(); catsIter.hasNext();) { + final Categories cats = (Categories) catsIter.next(); + for (final Iterator catIter = cats.getCategories().iterator(); catIter.hasNext();) { + final Category cat = (Category) catIter.next(); + final BlogEntry.Category blogCat = new BlogEntry.Category(cat.getTerm()); blogCat.setName(cat.getLabel()); blogCat.setUrl(cat.getScheme()); getCategories().add(blogCat); @@ -60,6 +61,7 @@ public class AtomCollection implements Blog.Collection { /** * {@inheritDoc} */ + @Override public String getTitle() { return getClientCollection().getTitle(); } @@ -67,6 +69,7 @@ public class AtomCollection implements Blog.Collection { /** * {@inheritDoc} */ + @Override public String getToken() { return getClientCollection().getHrefResolved(); } @@ -74,6 +77,7 @@ public class AtomCollection implements Blog.Collection { /** * {@inheritDoc} */ + @Override public List getAccepts() { return getClientCollection().getAccepts(); } @@ -81,38 +85,43 @@ public class AtomCollection implements Blog.Collection { /** * {@inheritDoc} */ - public boolean accepts(String ct) { + @Override + public boolean accepts(final String ct) { return getClientCollection().accepts(ct); } /** * {@inheritDoc} */ + @Override public Iterator getEntries() throws BlogClientException { - return new AtomEntryIterator(this); + return new AtomEntryIterator(this); } - + /** * {@inheritDoc} */ + @Override public BlogEntry newEntry() throws BlogClientException { - AtomBlog atomBlog = (AtomBlog)getBlog(); - BlogEntry entry = new AtomEntry(atomBlog, this); - return entry; + final AtomBlog atomBlog = (AtomBlog) getBlog(); + final BlogEntry entry = new AtomEntry(atomBlog, this); + return entry; } - + /** * {@inheritDoc} */ - public BlogResource newResource(String name, String contentType, byte[] bytes) throws BlogClientException { + @Override + public BlogResource newResource(final String name, final String contentType, final byte[] bytes) throws BlogClientException { return new AtomResource(this, name, contentType, bytes); } /** * {@inheritDoc} */ - public String saveResource(BlogResource res) throws BlogClientException { - ((AtomResource)res).setCollection(this); + @Override + public String saveResource(final BlogResource res) throws BlogClientException { + ((AtomResource) res).setCollection(this); res.save(); return res.getContent().getSrc(); } @@ -120,42 +129,45 @@ public class AtomCollection implements Blog.Collection { /** * {@inheritDoc} */ - public String saveEntry(BlogEntry entry) throws BlogClientException { - ((AtomEntry)entry).setCollection(this); + @Override + public String saveEntry(final BlogEntry entry) throws BlogClientException { + ((AtomEntry) entry).setCollection(this); entry.save(); return entry.getPermalink(); } - void deleteEntry(BlogEntry entry) throws BlogClientException { - try { - ClientAtomService service = ((AtomBlog)getBlog()).getService(); - ClientEntry clientEntry = service.getEntry(entry.getToken()); + void deleteEntry(final BlogEntry entry) throws BlogClientException { + try { + final ClientAtomService service = ((AtomBlog) getBlog()).getService(); + final ClientEntry clientEntry = service.getEntry(entry.getToken()); clientEntry.remove(); - } catch (Exception e) { + } catch (final Exception e) { throw new BlogClientException("ERROR deleting entry", e); } } - + /** * {@inheritDoc} */ + @Override public Blog getBlog() { return blog; } - void setBlog(AtomBlog blog) { + void setBlog(final AtomBlog blog) { this.blog = blog; } /** * {@inheritDoc} */ + @Override public List getCategories() { return categories; } - void setCategories(List categories) { + void setCategories(final List categories) { this.categories = categories; } diff --git a/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomConnection.java b/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomConnection.java index 37deabc..83dc917 100644 --- a/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomConnection.java +++ b/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomConnection.java @@ -12,81 +12,80 @@ * 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. - */ + */ package org.rometools.propono.blogclient.atomprotocol; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jdom2.Document; import org.rometools.propono.atom.client.AtomClientFactory; import org.rometools.propono.atom.client.BasicAuthStrategy; import org.rometools.propono.atom.client.ClientAtomService; import org.rometools.propono.atom.client.ClientWorkspace; -import java.util.List; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import org.jdom2.Document; - -import org.rometools.propono.blogclient.BlogConnection; import org.rometools.propono.blogclient.Blog; import org.rometools.propono.blogclient.BlogClientException; - +import org.rometools.propono.blogclient.BlogConnection; /** - * Atom protocol of BlogConnection. Connects to Atom server, creates AtomBlog - * object for each Atom workspace found and within each blog a collection for each - * Atom collection found. + * Atom protocol of BlogConnection. Connects to Atom server, creates AtomBlog object for each Atom workspace found and within each blog a collection for each + * Atom collection found. */ public class AtomConnection implements BlogConnection { private static Log logger = LogFactory.getLog(AtomConnection.class); - private HttpClient httpClient = null; - private Map blogs = new HashMap(); - + private final HttpClient httpClient = null; + private final Map blogs = new HashMap(); + /** * Create Atom blog client instance for specified URL and user account. - * @param uri End-point URL of Atom service - * @param username Username of account + * + * @param uri End-point URL of Atom service + * @param username Username of account * @param password Password of account */ - public AtomConnection(String uri, String username, String password) - throws BlogClientException { - - Document doc = null; + public AtomConnection(final String uri, final String username, final String password) throws BlogClientException { + + final Document doc = null; try { - ClientAtomService service = (ClientAtomService) - AtomClientFactory.getAtomService(uri, new BasicAuthStrategy(username, password)); - Iterator iter = service.getWorkspaces().iterator(); - int count = 0; + final ClientAtomService service = AtomClientFactory.getAtomService(uri, new BasicAuthStrategy(username, password)); + final Iterator iter = service.getWorkspaces().iterator(); + final int count = 0; while (iter.hasNext()) { - ClientWorkspace workspace = (ClientWorkspace)iter.next(); - Blog blog = new AtomBlog(service, workspace); + final ClientWorkspace workspace = (ClientWorkspace) iter.next(); + final Blog blog = new AtomBlog(service, workspace); blogs.put(blog.getToken(), blog); - } - } catch (Throwable t) { + } + } catch (final Throwable t) { throw new BlogClientException("Error connecting to blog server", t); } } - - /** - * {@inheritDoc} - */ - public List getBlogs() { - return new ArrayList(blogs.values()); - } - - /** - * {@inheritDoc} - */ - public Blog getBlog(String token) { - return (AtomBlog)blogs.get(token); - } /** * {@inheritDoc} */ - public void setAppkey(String appkey) { + @Override + public List getBlogs() { + return new ArrayList(blogs.values()); + } + + /** + * {@inheritDoc} + */ + @Override + public Blog getBlog(final String token) { + return (AtomBlog) blogs.get(token); + } + + /** + * {@inheritDoc} + */ + @Override + public void setAppkey(final String appkey) { } } diff --git a/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomEntry.java b/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomEntry.java index 29242a5..5618336 100644 --- a/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomEntry.java +++ b/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomEntry.java @@ -12,154 +12,158 @@ * 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. - */ + */ package org.rometools.propono.blogclient.atomprotocol; -import org.rometools.propono.utils.ProponoException; -import org.rometools.propono.atom.common.rome.AppModule; -import org.rometools.propono.atom.common.rome.AppModuleImpl; -import org.rometools.propono.blogclient.BlogClientException; -import org.rometools.propono.blogclient.BlogEntry; -import org.rometools.propono.blogclient.BaseBlogEntry; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; -import com.sun.syndication.feed.atom.Entry; -import com.sun.syndication.feed.atom.Link; -import org.rometools.propono.atom.client.ClientEntry; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.rometools.propono.blogclient.BlogEntry.Person; +import org.rometools.propono.atom.client.ClientEntry; +import org.rometools.propono.atom.common.rome.AppModule; +import org.rometools.propono.atom.common.rome.AppModuleImpl; +import org.rometools.propono.blogclient.BaseBlogEntry; +import org.rometools.propono.blogclient.BlogClientException; +import org.rometools.propono.blogclient.BlogEntry; +import org.rometools.propono.utils.ProponoException; + +import com.sun.syndication.feed.atom.Entry; +import com.sun.syndication.feed.atom.Link; /** * Atom protocol implementation of BlogEntry. */ public class AtomEntry extends BaseBlogEntry implements BlogEntry { static final Log logger = LogFactory.getLog(AtomCollection.class); - + String editURI = null; AtomCollection collection = null; - - AtomEntry(AtomBlog blog, AtomCollection collection) throws BlogClientException { + + AtomEntry(final AtomBlog blog, final AtomCollection collection) throws BlogClientException { super(blog); this.collection = collection; } - - AtomEntry(AtomCollection collection, ClientEntry entry) throws BlogClientException { - this((AtomBlog)collection.getBlog(), collection); - //clientEntry = entry; + + AtomEntry(final AtomCollection collection, final ClientEntry entry) throws BlogClientException { + this((AtomBlog) collection.getBlog(), collection); + // clientEntry = entry; copyFromRomeEntry(entry); } - - AtomEntry(AtomBlog blog, ClientEntry entry) throws BlogClientException { + + AtomEntry(final AtomBlog blog, final ClientEntry entry) throws BlogClientException { super(blog); - //clientEntry = entry; + // clientEntry = entry; copyFromRomeEntry(entry); } - + /** * {@inheritDoc} */ + @Override public String getToken() { return editURI; } - + AtomCollection getCollection() { return collection; } - void setCollection(AtomCollection collection) { + void setCollection(final AtomCollection collection) { this.collection = collection; } /** * True if entry's token's are equal. */ - public boolean equals(Object o) { + @Override + public boolean equals(final Object o) { if (o instanceof AtomEntry) { - AtomEntry other = (AtomEntry)o; + final AtomEntry other = (AtomEntry) o; if (other.getToken() != null && getToken() != null) { return other.getToken().equals(getToken()); } } return false; } - + /** * {@inheritDoc} */ + @Override public void save() throws BlogClientException { - boolean create = (getToken() == null); + final boolean create = getToken() == null; if (create && getCollection() == null) { throw new BlogClientException("Cannot save entry, no collection"); } else if (create) { try { - ClientEntry clientEntry = collection.getClientCollection().createEntry(); + final ClientEntry clientEntry = collection.getClientCollection().createEntry(); copyToRomeEntry(clientEntry); collection.getClientCollection().addEntry(clientEntry); copyFromRomeEntry(clientEntry); - } catch (ProponoException ex) { - throw new BlogClientException("Error saving entry", ex); + } catch (final ProponoException ex) { + throw new BlogClientException("Error saving entry", ex); } } else { try { - ClientEntry clientEntry = ((AtomBlog)getBlog()).getService().getEntry(getToken()); + final ClientEntry clientEntry = ((AtomBlog) getBlog()).getService().getEntry(getToken()); copyToRomeEntry(clientEntry); clientEntry.update(); copyFromRomeEntry(clientEntry); - } catch (ProponoException ex) { - throw new BlogClientException("Error updating entry", ex); + } catch (final ProponoException ex) { + throw new BlogClientException("Error updating entry", ex); } - } + } } - + /** * {@inheritDoc} */ + @Override public void delete() throws BlogClientException { if (getToken() == null) { throw new BlogClientException("Cannot delete unsaved entry"); } try { - ClientEntry clientEntry = ((AtomBlog)getBlog()).getService().getEntry(editURI); + final ClientEntry clientEntry = ((AtomBlog) getBlog()).getService().getEntry(editURI); clientEntry.remove(); - } catch (ProponoException ex) { - throw new BlogClientException("Error removing entry", ex); + } catch (final ProponoException ex) { + throw new BlogClientException("Error removing entry", ex); } } - - void copyFromRomeEntry(ClientEntry entry) { + + void copyFromRomeEntry(final ClientEntry entry) { id = entry.getId(); - title = entry.getTitle(); + title = entry.getTitle(); editURI = entry.getEditURI(); - List altlinks = entry.getAlternateLinks(); + final List altlinks = entry.getAlternateLinks(); if (altlinks != null) { - for (Iterator iter = altlinks.iterator(); iter.hasNext();) { - Link link = (Link)iter.next(); - if ("alternate".equals(link.getRel()) || link.getRel()==null) { + for (final Iterator iter = altlinks.iterator(); iter.hasNext();) { + final Link link = (Link) iter.next(); + if ("alternate".equals(link.getRel()) || link.getRel() == null) { permalink = link.getHrefResolved(); break; } } } - List contents = entry.getContents(); + final List contents = entry.getContents(); com.sun.syndication.feed.atom.Content romeContent = null; if (contents != null && contents.size() > 0) { - romeContent = (com.sun.syndication.feed.atom.Content)contents.get(0); + romeContent = (com.sun.syndication.feed.atom.Content) contents.get(0); } if (romeContent != null) { content = new BlogEntry.Content(romeContent.getValue()); content.setType(romeContent.getType()); content.setSrc(romeContent.getSrc()); - } + } if (entry.getCategories() != null) { - List cats = new ArrayList(); - List romeCats = entry.getCategories(); - for (Iterator iter=romeCats.iterator(); iter.hasNext();) { - com.sun.syndication.feed.atom.Category romeCat = - (com.sun.syndication.feed.atom.Category)iter.next(); - BlogEntry.Category cat = new BlogEntry.Category(); + final List cats = new ArrayList(); + final List romeCats = entry.getCategories(); + for (final Iterator iter = romeCats.iterator(); iter.hasNext();) { + final com.sun.syndication.feed.atom.Category romeCat = (com.sun.syndication.feed.atom.Category) iter.next(); + final BlogEntry.Category cat = new BlogEntry.Category(); cat.setId(romeCat.getTerm()); cat.setUrl(romeCat.getScheme()); cat.setName(romeCat.getLabel()); @@ -167,57 +171,54 @@ public class AtomEntry extends BaseBlogEntry implements BlogEntry { } categories = cats; } - List authors = entry.getAuthors(); - if (authors!=null && authors.size() > 0) { - com.sun.syndication.feed.atom.Person romeAuthor = - (com.sun.syndication.feed.atom.Person)authors.get(0); + final List authors = entry.getAuthors(); + if (authors != null && authors.size() > 0) { + final com.sun.syndication.feed.atom.Person romeAuthor = (com.sun.syndication.feed.atom.Person) authors.get(0); if (romeAuthor != null) { author = new Person(); author.setName(romeAuthor.getName()); author.setEmail(romeAuthor.getEmail()); author.setUrl(romeAuthor.getUrl()); - } - } + } + } publicationDate = entry.getPublished(); modificationDate = entry.getModified(); - - AppModule control = (AppModule)entry.getModule(AppModule.URI); - if (control != null && control.getDraft() != null) { - draft = control.getDraft().booleanValue(); + + final AppModule control = (AppModule) entry.getModule(AppModule.URI); + if (control != null && control.getDraft() != null) { + draft = control.getDraft().booleanValue(); } else { draft = false; } } - Entry copyToRomeEntry(ClientEntry entry) { + + Entry copyToRomeEntry(final ClientEntry entry) { if (id != null) { entry.setId(id); } - entry.setTitle(title); + entry.setTitle(title); if (author != null) { - com.sun.syndication.feed.atom.Person person = - new com.sun.syndication.feed.atom.Person(); + final com.sun.syndication.feed.atom.Person person = new com.sun.syndication.feed.atom.Person(); person.setName(author.getName()); person.setEmail(author.getEmail()); person.setUrl(author.getUrl()); - List authors = new ArrayList(); + final List authors = new ArrayList(); authors.add(person); entry.setAuthors(authors); } if (content != null) { - com.sun.syndication.feed.atom.Content romeContent = - new com.sun.syndication.feed.atom.Content(); + final com.sun.syndication.feed.atom.Content romeContent = new com.sun.syndication.feed.atom.Content(); romeContent.setValue(content.getValue()); romeContent.setType(content.getType()); - List contents = new ArrayList(); + final List contents = new ArrayList(); contents.add(romeContent); entry.setContents(contents); } if (categories != null) { - List romeCats = new ArrayList(); - for (Iterator iter=categories.iterator(); iter.hasNext();) { - BlogEntry.Category cat = (BlogEntry.Category)iter.next(); - com.sun.syndication.feed.atom.Category romeCategory = - new com.sun.syndication.feed.atom.Category(); + final List romeCats = new ArrayList(); + for (final Iterator iter = categories.iterator(); iter.hasNext();) { + final BlogEntry.Category cat = (BlogEntry.Category) iter.next(); + final com.sun.syndication.feed.atom.Category romeCategory = new com.sun.syndication.feed.atom.Category(); romeCategory.setTerm(cat.getId()); romeCategory.setScheme(cat.getUrl()); romeCategory.setLabel(cat.getName()); @@ -225,15 +226,15 @@ public class AtomEntry extends BaseBlogEntry implements BlogEntry { } entry.setCategories(romeCats); } - entry.setPublished((publicationDate == null) ? new Date() : publicationDate); - entry.setModified((modificationDate == null) ? new Date() : modificationDate); - - List modules = new ArrayList(); - AppModule control = new AppModuleImpl(); + entry.setPublished(publicationDate == null ? new Date() : publicationDate); + entry.setModified(modificationDate == null ? new Date() : modificationDate); + + final List modules = new ArrayList(); + final AppModule control = new AppModuleImpl(); control.setDraft(new Boolean(draft)); modules.add(control); entry.setModules(modules); - + return entry; } diff --git a/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomEntryIterator.java b/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomEntryIterator.java index 20c30aa..9829cf7 100644 --- a/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomEntryIterator.java +++ b/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomEntryIterator.java @@ -12,14 +12,15 @@ * 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. - */ + */ package org.rometools.propono.blogclient.atomprotocol; -import org.rometools.propono.atom.client.ClientEntry; -import org.rometools.propono.atom.client.ClientMediaEntry; import java.util.Iterator; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.rometools.propono.atom.client.ClientEntry; +import org.rometools.propono.atom.client.ClientMediaEntry; import org.rometools.propono.blogclient.BlogClientException; /** @@ -29,43 +30,46 @@ public class AtomEntryIterator implements Iterator { static final Log logger = LogFactory.getLog(AtomEntryIterator.class); private Iterator iterator = null; private AtomCollection collection = null; - - AtomEntryIterator(AtomCollection collection) throws BlogClientException { + + AtomEntryIterator(final AtomCollection collection) throws BlogClientException { try { this.collection = collection; iterator = collection.getClientCollection().getEntries(); - } catch (Exception e) { + } catch (final Exception e) { throw new BlogClientException("ERROR fetching collection", e); } } - + /** * True if more entries are available. */ + @Override public boolean hasNext() { return iterator.hasNext(); } - + /** * Get next entry. */ + @Override public Object next() { try { - ClientEntry entry = (ClientEntry)iterator.next(); + final ClientEntry entry = (ClientEntry) iterator.next(); if (entry instanceof ClientMediaEntry) { - return new AtomResource(collection, (ClientMediaEntry)entry); + return new AtomResource(collection, (ClientMediaEntry) entry); } else { return new AtomEntry(collection, entry); } - } catch (Exception e) { + } catch (final Exception e) { logger.error("ERROR fetching entry", e); } return null; } - + /** * Remove is not supported. */ + @Override public void remove() { // optional method, not implemented } diff --git a/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomResource.java b/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomResource.java index e20cee8..3a5380e 100644 --- a/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomResource.java +++ b/src/main/java/org/rometools/propono/blogclient/atomprotocol/AtomResource.java @@ -12,21 +12,22 @@ * 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. - */ + */ package org.rometools.propono.blogclient.atomprotocol; import java.io.InputStream; +import java.util.Iterator; +import java.util.List; -import org.rometools.propono.blogclient.BlogClientException; -import org.rometools.propono.blogclient.BlogEntry; -import org.rometools.propono.blogclient.BlogResource; -import com.sun.syndication.feed.atom.Link; import org.rometools.propono.atom.client.ClientAtomService; import org.rometools.propono.atom.client.ClientCollection; import org.rometools.propono.atom.client.ClientEntry; import org.rometools.propono.atom.client.ClientMediaEntry; -import java.util.Iterator; -import java.util.List; +import org.rometools.propono.blogclient.BlogClientException; +import org.rometools.propono.blogclient.BlogEntry; +import org.rometools.propono.blogclient.BlogResource; + +import com.sun.syndication.feed.atom.Link; /** * Atom protocol implementation of BlogResource. @@ -35,100 +36,100 @@ public class AtomResource extends AtomEntry implements BlogResource { private AtomCollection collection; private byte[] bytes; - AtomResource(AtomCollection collection, String name, String contentType, byte[] bytes) - throws BlogClientException { - super((AtomBlog)collection.getBlog(), collection); + AtomResource(final AtomCollection collection, final String name, final String contentType, final byte[] bytes) throws BlogClientException { + super((AtomBlog) collection.getBlog(), collection); this.collection = collection; this.bytes = bytes; - BlogEntry.Content rcontent = new BlogEntry.Content(); + final BlogEntry.Content rcontent = new BlogEntry.Content(); rcontent.setType(contentType); setContent(rcontent); - } - - AtomResource(AtomCollection collection, ClientMediaEntry entry) - throws BlogClientException { + } + + AtomResource(final AtomCollection collection, final ClientMediaEntry entry) throws BlogClientException { super(collection, entry); - } - - AtomResource(AtomBlog blog, ClientMediaEntry entry) throws BlogClientException { + } + + AtomResource(final AtomBlog blog, final ClientMediaEntry entry) throws BlogClientException { super(blog, entry); } /** * {@inheritDoc} */ + @Override public String getName() { return getTitle(); } - + byte[] getBytes() { return bytes; } - + /** * {@inheritDoc} */ + @Override public InputStream getAsStream() throws BlogClientException { try { - return null; //((ClientMediaEntry)clientEntry).getAsStream(); - } catch (Exception e) { + return null; // ((ClientMediaEntry)clientEntry).getAsStream(); + } catch (final Exception e) { throw new BlogClientException("Error creating entry", e); } } - + /** * {@inheritDoc} */ + @Override public void save() throws BlogClientException { try { if (getToken() == null) { - ClientAtomService clientService = ((AtomBlog)getBlog()).getService(); - ClientCollection clientCollection = collection.getClientCollection(); - - ClientMediaEntry clientEntry = - new ClientMediaEntry(clientService, clientCollection, getTitle(), - "", getContent().getType(), getBytes()); - + final ClientAtomService clientService = ((AtomBlog) getBlog()).getService(); + final ClientCollection clientCollection = collection.getClientCollection(); + + final ClientMediaEntry clientEntry = new ClientMediaEntry(clientService, clientCollection, getTitle(), "", getContent().getType(), getBytes()); + copyToRomeEntry(clientEntry); - collection.getClientCollection().addEntry(clientEntry); - this.editURI = clientEntry.getEditURI(); - + collection.getClientCollection().addEntry(clientEntry); + editURI = clientEntry.getEditURI(); + } else { - ClientAtomService clientService = ((AtomBlog)getBlog()).getService(); - ClientMediaEntry clientEntry = (ClientMediaEntry)clientService.getEntry(editURI); - clientEntry.update(); + final ClientAtomService clientService = ((AtomBlog) getBlog()).getService(); + final ClientMediaEntry clientEntry = (ClientMediaEntry) clientService.getEntry(editURI); + clientEntry.update(); } - } catch (Exception e) { + } catch (final Exception e) { throw new BlogClientException("Error creating entry", e); } } - + /** * {@inheritDoc} */ - public void update(byte[] newBytes) throws BlogClientException { + @Override + public void update(final byte[] newBytes) throws BlogClientException { try { - //((ClientMediaEntry)clientEntry).setBytes(newBytes); - //clientEntry.update(); - } catch (Exception e) { + // ((ClientMediaEntry)clientEntry).setBytes(newBytes); + // clientEntry.update(); + } catch (final Exception e) { throw new BlogClientException("Error creating entry", e); } } - - void copyFromRomeEntry(ClientEntry entry) { + + @Override + void copyFromRomeEntry(final ClientEntry entry) { super.copyFromRomeEntry(entry); - - List links = entry.getOtherLinks(); + + final List links = entry.getOtherLinks(); if (links != null) { - for (Iterator iter = links.iterator(); iter.hasNext();) { - Link link = (Link)iter.next(); + for (final Iterator iter = links.iterator(); iter.hasNext();) { + final Link link = (Link) iter.next(); if ("edit-media".equals(link.getRel())) { id = link.getHrefResolved(); break; } } } - - + } } diff --git a/src/main/java/org/rometools/propono/blogclient/metaweblog/MetaWeblogBlog.java b/src/main/java/org/rometools/propono/blogclient/metaweblog/MetaWeblogBlog.java index 5c70d40..08b88b2 100644 --- a/src/main/java/org/rometools/propono/blogclient/metaweblog/MetaWeblogBlog.java +++ b/src/main/java/org/rometools/propono/blogclient/metaweblog/MetaWeblogBlog.java @@ -12,81 +12,87 @@ * 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. - */ + */ package org.rometools.propono.blogclient.metaweblog; import java.net.URL; import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Iterator; -import org.rometools.propono.blogclient.BlogEntry; -import org.rometools.propono.blogclient.Blog; -import org.rometools.propono.blogclient.BlogClientException; -import org.rometools.propono.blogclient.BlogResource; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.TreeMap; + import org.apache.xmlrpc.client.XmlRpcClient; import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; +import org.rometools.propono.blogclient.Blog; +import org.rometools.propono.blogclient.BlogClientException; +import org.rometools.propono.blogclient.BlogEntry; +import org.rometools.propono.blogclient.BlogResource; /** * Blog implementation that uses a mix of Blogger and MetaWeblog API methods. */ public class MetaWeblogBlog implements Blog { - private String blogid; - private String name; - private URL url; - private String userName; - private String password; + private final String blogid; + private final String name; + private final URL url; + private final String userName; + private final String password; private String appkey = "dummy"; - private Map collections; - + private final Map collections; + private XmlRpcClient xmlRpcClient = null; /** * {@inheritDoc} */ - public String getName() { return name; } - + @Override + public String getName() { + return name; + } + /** * {@inheritDoc} */ - public String getToken() { return blogid; } - + @Override + public String getToken() { + return blogid; + } + /** * String representation of blog, returns the name. */ - public String toString() { return getName(); } - - private XmlRpcClient getXmlRpcClient() { - + @Override + public String toString() { + return getName(); + } + + private XmlRpcClient getXmlRpcClient() { + if (xmlRpcClient == null) { - XmlRpcClientConfigImpl xmlrpcConfig = new XmlRpcClientConfigImpl(); + final XmlRpcClientConfigImpl xmlrpcConfig = new XmlRpcClientConfigImpl(); xmlrpcConfig.setServerURL(url); xmlRpcClient = new XmlRpcClient(); xmlRpcClient.setConfig(xmlrpcConfig); } - return xmlRpcClient; + return xmlRpcClient; } - - MetaWeblogBlog(String blogid, String name, - URL url, String userName, String password) { + + MetaWeblogBlog(final String blogid, final String name, final URL url, final String userName, final String password) { this.blogid = blogid; this.name = name; this.url = url; this.userName = userName; this.password = password; - this.collections = new TreeMap(); - collections.put("entries", - new MetaWeblogBlogCollection(this, "entries", "Entries", "entry")); - collections.put("resources", - new MetaWeblogBlogCollection(this, "resources", "Resources", "*")); + collections = new TreeMap(); + collections.put("entries", new MetaWeblogBlogCollection(this, "entries", "Entries", "entry")); + collections.put("resources", new MetaWeblogBlogCollection(this, "resources", "Resources", "*")); } - MetaWeblogBlog(String blogId, String name, - URL url, String userName, String password, String appkey) { + MetaWeblogBlog(final String blogId, final String name, final URL url, final String userName, final String password, final String appkey) { this(blogId, name, url, userName, password); this.appkey = appkey; } @@ -94,33 +100,33 @@ public class MetaWeblogBlog implements Blog { /** * {@inheritDoc} */ + @Override public BlogEntry newEntry() { return new MetaWeblogEntry(this, new HashMap()); } - String saveEntry(BlogEntry entry) throws BlogClientException { - Blog.Collection col = (Blog.Collection)collections.get("entries"); + String saveEntry(final BlogEntry entry) throws BlogClientException { + final Blog.Collection col = (Blog.Collection) collections.get("entries"); return col.saveEntry(entry); } /** * {@inheritDoc} */ - public BlogEntry getEntry(String id) throws BlogClientException { + @Override + public BlogEntry getEntry(final String id) throws BlogClientException { try { - Map result = (Map) - getXmlRpcClient().execute("metaWeblog.getPost", new Object[] {id, userName, password}); + final Map result = (Map) getXmlRpcClient().execute("metaWeblog.getPost", new Object[] { id, userName, password }); return new MetaWeblogEntry(this, result); - } catch (Exception e) { + } catch (final Exception e) { throw new BlogClientException("ERROR: XML-RPC error getting entry", e); } } - void deleteEntry(String id) throws BlogClientException { + void deleteEntry(final String id) throws BlogClientException { try { - getXmlRpcClient().execute("blogger.deletePost", - new Object[] {appkey, id, userName, password, Boolean.FALSE}); - } catch (Exception e) { + getXmlRpcClient().execute("blogger.deletePost", new Object[] { appkey, id, userName, password, Boolean.FALSE }); + } catch (final Exception e) { throw new BlogClientException("ERROR: XML-RPC error getting entry", e); } } @@ -128,6 +134,7 @@ public class MetaWeblogBlog implements Blog { /** * {@inheritDoc} */ + @Override public Iterator getEntries() throws BlogClientException { return new EntryIterator(); } @@ -135,78 +142,80 @@ public class MetaWeblogBlog implements Blog { /** * {@inheritDoc} */ - public BlogResource newResource(String name, String contentType, byte[] bytes) throws BlogClientException { + @Override + public BlogResource newResource(final String name, final String contentType, final byte[] bytes) throws BlogClientException { return new MetaWeblogResource(this, name, contentType, bytes); } - - String saveResource(MetaWeblogResource resource) throws BlogClientException { - Blog.Collection col = (Blog.Collection)collections.get("resources"); + + String saveResource(final MetaWeblogResource resource) throws BlogClientException { + final Blog.Collection col = (Blog.Collection) collections.get("resources"); return col.saveResource(resource); } - - BlogResource getResource(String token) throws BlogClientException { + + BlogResource getResource(final String token) throws BlogClientException { return null; } - + /** * {@inheritDoc} */ + @Override public Iterator getResources() throws BlogClientException { return new NoOpIterator(); } - - void deleteResource(BlogResource resource) throws BlogClientException { + + void deleteResource(final BlogResource resource) throws BlogClientException { // no-op } - + /** * {@inheritDoc} */ + @Override public List getCategories() throws BlogClientException { - - ArrayList ret = new ArrayList(); + + final ArrayList ret = new ArrayList(); try { - Object result = - getXmlRpcClient().execute ("metaWeblog.getCategories", - new Object[] {blogid, userName, password}); + final Object result = getXmlRpcClient().execute("metaWeblog.getCategories", new Object[] { blogid, userName, password }); if (result != null && result instanceof HashMap) { // Standard MetaWeblog API style: struct of struts - Map catsmap = (Map)result; - Iterator keys = catsmap.keySet().iterator(); + final Map catsmap = (Map) result; + final Iterator keys = catsmap.keySet().iterator(); while (keys.hasNext()) { - String key = (String)keys.next(); - Map catmap = (Map)catsmap.get(key); - BlogEntry.Category category = new BlogEntry.Category(key); - category.setName((String)catmap.get("description")); - // catmap.get("htmlUrl"); + final String key = (String) keys.next(); + final Map catmap = (Map) catsmap.get(key); + final BlogEntry.Category category = new BlogEntry.Category(key); + category.setName((String) catmap.get("description")); + // catmap.get("htmlUrl"); // catmap.get("rssUrl"); ret.add(category); - } + } } else if (result != null && result instanceof Object[]) { // Wordpress style: array of structs - Object[] resultArray = (Object[])result; - for (int i=0; i 0) { - List catArray = new ArrayList(); - List cats = getCategories(); - for (int i=0; i= 0) { + while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) { offset += numRead; } // Ensure all the bytes have been read in if (offset < bytes.length) { - throw new IOException("Could not completely read file "+file.getName()); + throw new IOException("Could not completely read file " + file.getName()); } // Close the input stream and return bytes @@ -80,9 +80,9 @@ public class Utilities { /** * Read input from stream and into string. */ - public static String streamToString(InputStream is) throws IOException { - StringBuffer sb = new StringBuffer(); - BufferedReader in = new BufferedReader(new InputStreamReader(is)); + public static String streamToString(final InputStream is) throws IOException { + final StringBuffer sb = new StringBuffer(); + final BufferedReader in = new BufferedReader(new InputStreamReader(is)); String line; while ((line = in.readLine()) != null) { sb.append(line); @@ -90,163 +90,160 @@ public class Utilities { } return sb.toString(); } - + /** * Copy input stream to output stream using 8K buffer. */ - public static void copyInputToOutput( - InputStream input, - OutputStream output) - throws IOException { - BufferedInputStream in = new BufferedInputStream(input); - BufferedOutputStream out = new BufferedOutputStream(output); - byte buffer[] = new byte[8192]; + public static void copyInputToOutput(final InputStream input, final OutputStream output) throws IOException { + final BufferedInputStream in = new BufferedInputStream(input); + final BufferedOutputStream out = new BufferedOutputStream(output); + final byte buffer[] = new byte[8192]; for (int count = 0; count != -1;) { count = in.read(buffer, 0, 8192); - if (count != -1) + if (count != -1) { out.write(buffer, 0, count); + } } - + try { in.close(); out.close(); - } catch (IOException ex) { + } catch (final IOException ex) { throw new IOException("Closing file streams, " + ex.getMessage()); } } - - + /** * Replaces occurences of non-alphanumeric characters with a supplied char. */ - public static String replaceNonAlphanumeric(String str, char subst) { - StringBuffer ret = new StringBuffer(str.length()); - char[] testChars = str.toCharArray(); - for (int i = 0; i < testChars.length; i++) { - if (Character.isLetterOrDigit(testChars[i])) { - ret.append(testChars[i]); + public static String replaceNonAlphanumeric(final String str, final char subst) { + final StringBuffer ret = new StringBuffer(str.length()); + final char[] testChars = str.toCharArray(); + for (final char testChar : testChars) { + if (Character.isLetterOrDigit(testChar)) { + ret.append(testChar); } else { - ret.append( subst ); + ret.append(subst); } } return ret.toString(); } - + /** * Convert string to string array. */ - public static String[] stringToStringArray(String instr, String delim) - throws NoSuchElementException, NumberFormatException { - StringTokenizer toker = new StringTokenizer(instr, delim); - String stringArray[] = new String[toker.countTokens()]; - int i = 0; + public static String[] stringToStringArray(final String instr, final String delim) throws NoSuchElementException, NumberFormatException { + final StringTokenizer toker = new StringTokenizer(instr, delim); + final String stringArray[] = new String[toker.countTokens()]; + int i = 0; while (toker.hasMoreTokens()) { stringArray[i++] = toker.nextToken(); } return stringArray; } - - /** + + /** * Convert string array to string. */ - public static String stringArrayToString(String[] stringArray, String delim) { + public static String stringArrayToString(final String[] stringArray, final String delim) { String ret = ""; - for (int i = 0; i < stringArray.length; i++) { - if (ret.length() > 0) - ret = ret + delim + stringArray[i]; - else - ret = stringArray[i]; + for (final String element : stringArray) { + if (ret.length() > 0) { + ret = ret + delim + element; + } else { + ret = element; + } } return ret; } - - - static Pattern absoluteURIPattern = Pattern.compile("^[a-z0-9]*:.*$"); - - private static boolean isAbsoluteURI(String uri) { + + static Pattern absoluteURIPattern = Pattern.compile("^[a-z0-9]*:.*$"); + + private static boolean isAbsoluteURI(final String uri) { return absoluteURIPattern.matcher(uri).find(); } - - private static boolean isRelativeURI(String uri) { + + private static boolean isRelativeURI(final String uri) { return !isAbsoluteURI(uri); } - + /** - * } - * Resolve URI based considering xml:base and baseURI. + * } Resolve URI based considering xml:base and baseURI. + * * @param baseURI Base URI of feed - * @param parent Parent from which to consider xml:base - * @param url URL to be resolved + * @param parent Parent from which to consider xml:base + * @param url URL to be resolved */ - private static String resolveURI(String baseURI, Parent parent, String url) { + private static String resolveURI(final String baseURI, final Parent parent, String url) { if (isRelativeURI(url)) { - url = (!".".equals(url) && !"./".equals(url)) ? url : ""; + url = !".".equals(url) && !"./".equals(url) ? url : ""; // Relative URI with parent if (parent != null && parent instanceof Element) { - // Do we have an xml:base? - String xmlbase = ((Element)parent).getAttributeValue( - "base", Namespace.XML_NAMESPACE); + // Do we have an xml:base? + String xmlbase = ((Element) parent).getAttributeValue("base", Namespace.XML_NAMESPACE); if (xmlbase != null && xmlbase.trim().length() > 0) { if (isAbsoluteURI(xmlbase)) { - // Absolute xml:base, so form URI right now - if (url.startsWith("/")) { + // Absolute xml:base, so form URI right now + if (url.startsWith("/")) { // Host relative URI - int slashslash = xmlbase.indexOf("//"); - int nextslash = xmlbase.indexOf("/", slashslash + 2); - if (nextslash != -1) xmlbase = xmlbase.substring(0, nextslash); - return formURI(xmlbase, url); + final int slashslash = xmlbase.indexOf("//"); + final int nextslash = xmlbase.indexOf("/", slashslash + 2); + if (nextslash != -1) { + xmlbase = xmlbase.substring(0, nextslash); + } + return formURI(xmlbase, url); } if (!xmlbase.endsWith("/")) { - // Base URI is filename, strip it off + // Base URI is filename, strip it off xmlbase = xmlbase.substring(0, xmlbase.lastIndexOf("/")); } return formURI(xmlbase, url); } else { // Relative xml:base, so walk up tree - return resolveURI(baseURI, parent.getParent(), - stripTrailingSlash(xmlbase) + "/"+ stripStartingSlash(url)); + return resolveURI(baseURI, parent.getParent(), stripTrailingSlash(xmlbase) + "/" + stripStartingSlash(url)); } } // No xml:base so walk up tree return resolveURI(baseURI, parent.getParent(), url); - // Relative URI with no parent (i.e. top of tree), so form URI right now + // Relative URI with no parent (i.e. top of tree), so form URI right now } else if (parent == null || parent instanceof Document) { - return formURI(baseURI, url); - } - } + return formURI(baseURI, url); + } + } return url; } - - /** - * Form URI by combining base with append portion and giving - * special consideration to append portions that begin with ".." - * @param base Base of URI, may end with trailing slash + + /** + * Form URI by combining base with append portion and giving special consideration to append portions that begin with ".." + * + * @param base Base of URI, may end with trailing slash * @param append String to append, may begin with slash or ".." */ private static String formURI(String base, String append) { base = stripTrailingSlash(base); append = stripStartingSlash(append); if (append.startsWith("..")) { - String ret = null; - String[] parts = append.split("/"); - for (int i=0; i 0); - for (Iterator it = service.getWorkspaces().iterator(); it.hasNext();) { - ClientWorkspace space = (ClientWorkspace) it.next(); - assertNotNull(space.getTitle()); + assertTrue(service.getWorkspaces().size() > 0); + for (final Iterator it = service.getWorkspaces().iterator(); it.hasNext();) { + final ClientWorkspace space = (ClientWorkspace) it.next(); + assertNotNull(space.getTitle()); log.debug("Workspace: " + space.getTitle()); - for (Iterator colit = space.getCollections().iterator(); colit.hasNext();) { - ClientCollection col = (ClientCollection) colit.next(); + for (final Iterator colit = space.getCollections().iterator(); colit.hasNext();) { + final ClientCollection col = (ClientCollection) colit.next(); log.debug(" Collection: " + col.getTitle() + " Accepts: " + col.getAccepts()); log.debug(" href: " + col.getHrefResolved()); assertNotNull(col.getTitle()); } } } - + /** - * Tests that entries can be posted and removed in all collections that - * accept entries. Fails if no collections found that accept entries. + * Tests that entries can be posted and removed in all collections that accept entries. Fails if no collections found that accept entries. */ public void testSimpleEntryPostAndRemove() throws Exception { assertNotNull(service); - assertTrue(service.getWorkspaces().size() > 0); + assertTrue(service.getWorkspaces().size() > 0); int count = 0; - for (Iterator it = service.getWorkspaces().iterator(); it.hasNext();) { - ClientWorkspace space = (ClientWorkspace) it.next(); + for (final Iterator it = service.getWorkspaces().iterator(); it.hasNext();) { + final ClientWorkspace space = (ClientWorkspace) it.next(); assertNotNull(space.getTitle()); - - for (Iterator colit = space.getCollections().iterator(); colit.hasNext();) { - ClientCollection col = (ClientCollection) colit.next(); + + for (final Iterator colit = space.getCollections().iterator(); colit.hasNext();) { + final ClientCollection col = (ClientCollection) colit.next(); if (col.accepts(Collection.ENTRY_TYPE)) { - + // we found a collection that accepts entries, so post one - ClientEntry m1 = col.createEntry(); + final ClientEntry m1 = col.createEntry(); m1.setTitle("Test post"); - Content c = new Content(); + final Content c = new Content(); c.setValue("This is a test post"); c.setType("html"); m1.setContent(c); - + col.addEntry(m1); - + // entry should now exist on server - ClientEntry m2 = col.getEntry(m1.getEditURI()); + final ClientEntry m2 = col.getEntry(m1.getEditURI()); assertNotNull(m2); - + // remove entry m2.remove(); - + // fetching entry now should result in exception boolean failed = false; try { - col.getEntry(m1.getEditURI()); - } catch (ProponoException e) { + col.getEntry(m1.getEditURI()); + } catch (final ProponoException e) { failed = true; } - assertTrue(failed); + assertTrue(failed); count++; } } - } + } assertTrue(count > 0); - } - + } + /** - * Tests that entries can be posted, updated and removed in all collections that - * accept entries. Fails if no collections found that accept entries. + * Tests that entries can be posted, updated and removed in all collections that accept entries. Fails if no collections found that accept entries. */ public void testSimpleEntryPostUpdateAndRemove() throws Exception { assertNotNull(service); - assertTrue(service.getWorkspaces().size() > 0); + assertTrue(service.getWorkspaces().size() > 0); int count = 0; - for (Iterator it = service.getWorkspaces().iterator(); it.hasNext();) { - ClientWorkspace space = (ClientWorkspace) it.next(); + for (final Iterator it = service.getWorkspaces().iterator(); it.hasNext();) { + final ClientWorkspace space = (ClientWorkspace) it.next(); assertNotNull(space.getTitle()); - - for (Iterator colit = space.getCollections().iterator(); colit.hasNext();) { - ClientCollection col = (ClientCollection) colit.next(); + + for (final Iterator colit = space.getCollections().iterator(); colit.hasNext();) { + final ClientCollection col = (ClientCollection) colit.next(); if (col.accepts(Collection.ENTRY_TYPE)) { - + // we found a collection that accepts entries, so post one - ClientEntry m1 = col.createEntry(); + final ClientEntry m1 = col.createEntry(); m1.setTitle(col.getTitle() + ": Test post"); - Content c = new Content(); + final Content c = new Content(); c.setValue("This is a test post"); c.setType("html"); m1.setContent(c); - + col.addEntry(m1); - + // entry should now exist on server - ClientEntry m2 = (ClientEntry)col.getEntry(m1.getEditURI()); + final ClientEntry m2 = col.getEntry(m1.getEditURI()); assertNotNull(m2); - + m2.setTitle(col.getTitle() + ": Updated title"); m2.update(); - + // entry should now be updated on server - ClientEntry m3 = (ClientEntry)col.getEntry(m1.getEditURI()); + final ClientEntry m3 = col.getEntry(m1.getEditURI()); assertEquals(col.getTitle() + ": Updated title", m3.getTitle()); // remove entry m3.remove(); - + // fetching entry now should result in exception boolean failed = false; try { - col.getEntry(m1.getEditURI()); - } catch (ProponoException e) { + col.getEntry(m1.getEditURI()); + } catch (final ProponoException e) { failed = true; } - assertTrue(failed); + assertTrue(failed); count++; } } - } + } assertTrue(count > 0); - } - + } + public void testFindWorkspace() throws Exception { assertNotNull(service); - ClientWorkspace ws = (ClientWorkspace)service.findWorkspace("adminblog"); + final ClientWorkspace ws = (ClientWorkspace) service.findWorkspace("adminblog"); if (ws != null) { - ClientCollection col = (ClientCollection)ws.findCollection(null, "entry"); - ClientEntry entry = col.createEntry(); + final ClientCollection col = (ClientCollection) ws.findCollection(null, "entry"); + final ClientEntry entry = col.createEntry(); entry.setTitle("NPE on submitting order query"); entry.setContent("This is a bad one!", Content.HTML); col.addEntry(entry); - + // entry should now exist on server - ClientEntry saved = (ClientEntry)col.getEntry(entry.getEditURI()); + final ClientEntry saved = col.getEntry(entry.getEditURI()); assertNotNull(saved); // remove entry saved.remove(); - + // fetching entry now should result in exception boolean failed = false; try { - col.getEntry(saved.getEditURI()); - } catch (ProponoException e) { + col.getEntry(saved.getEditURI()); + } catch (final ProponoException e) { failed = true; } - assertTrue(failed); + assertTrue(failed); } } - + /** - * Test posting an entry to every available collection with a fixed and - * an unfixed category if server support allows, then cleanup. + * Test posting an entry to every available collection with a fixed and an unfixed category if server support allows, then cleanup. */ public void testEntryPostWithCategories() throws Exception { assertNotNull(service); - assertTrue(service.getWorkspaces().size() > 0); + assertTrue(service.getWorkspaces().size() > 0); int count = 0; - for (Iterator it = service.getWorkspaces().iterator(); it.hasNext();) { - ClientWorkspace space = (ClientWorkspace) it.next(); + for (final Iterator it = service.getWorkspaces().iterator(); it.hasNext();) { + final ClientWorkspace space = (ClientWorkspace) it.next(); assertNotNull(space.getTitle()); - - for (Iterator colit = space.getCollections().iterator(); colit.hasNext();) { - ClientCollection col = (ClientCollection) colit.next(); + + for (final Iterator colit = space.getCollections().iterator(); colit.hasNext();) { + final ClientCollection col = (ClientCollection) colit.next(); if (col.accepts(Collection.ENTRY_TYPE)) { - + // we found a collection that accepts GIF, so post one - ClientEntry m1 = col.createEntry(); + final ClientEntry m1 = col.createEntry(); m1.setTitle("Test post"); - Content c = new Content(); + final Content c = new Content(); c.setValue("This is a test post"); c.setType("html"); m1.setContent(c); - + // if possible, pick one fixed an un unfixed category Category fixedCat = null; Category unfixedCat = null; - List entryCats = new ArrayList(); - for (int i=0; i 0); - } - - /** - * Post media entry to every media colletion avialable on server, then cleanup. - */ - public void testMediaPost() throws Exception { - assertNotNull(service); - assertTrue(service.getWorkspaces().size() > 0); - int count = 0; - for (Iterator it = service.getWorkspaces().iterator(); it.hasNext();) { - ClientWorkspace space = (ClientWorkspace) it.next(); - assertNotNull(space.getTitle()); - - for (Iterator colit = space.getCollections().iterator(); colit.hasNext();) { - ClientCollection col = (ClientCollection) colit.next(); - if (col.accepts("image/gif")) { - - // we found a collection that accepts GIF, so post one - ClientMediaEntry m1 = col.createMediaEntry("duke"+count, "duke"+count, "image/gif", - new FileInputStream("test/testdata/duke-wave-shadow.gif")); - col.addEntry(m1); - - // entry should now exist on server - ClientMediaEntry m2 = (ClientMediaEntry)col.getEntry(m1.getEditURI()); - assertNotNull(m2); - - // remove entry - m2.remove(); - - // fetching entry now should result in exception - boolean failed = false; - try { - col.getEntry(m1.getEditURI()); - } catch (ProponoException e) { + col.getEntry(m1.getEditURI()); + } catch (final ProponoException e) { failed = true; } assertTrue(failed); count++; } } - } + } assertTrue(count > 0); } - + /** - * Post X media entries each media collection found, test paging, then cleanup. - * - public void testMediaPaging() throws Exception { - ClientAtomService service = getClientAtomService(); + * Post media entry to every media colletion avialable on server, then cleanup. + */ + public void testMediaPost() throws Exception { assertNotNull(service); - assertTrue(service.getWorkspaces().size() > 0); + assertTrue(service.getWorkspaces().size() > 0); int count = 0; - for (Iterator it = service.getWorkspaces().iterator(); it.hasNext();) { - ClientWorkspace space = (ClientWorkspace) it.next(); + for (final Iterator it = service.getWorkspaces().iterator(); it.hasNext();) { + final ClientWorkspace space = (ClientWorkspace) it.next(); assertNotNull(space.getTitle()); - - for (Iterator colit = space.getCollections().iterator(); colit.hasNext();) { - ClientCollection col = (ClientCollection) colit.next(); + + for (final Iterator colit = space.getCollections().iterator(); colit.hasNext();) { + final ClientCollection col = (ClientCollection) colit.next(); if (col.accepts("image/gif")) { - - // we found a collection that accepts GIF, so post 100 of them - List posted = new ArrayList(); - for (int i=0; i= maxPagingEntries); + assertTrue(failed); count++; - break; } } - } + } assertTrue(count > 0); - }*/ + } + + /** + * Post X media entries each media collection found, test paging, then cleanup. + * + * public void testMediaPaging() throws Exception { ClientAtomService service = getClientAtomService(); assertNotNull(service); + * assertTrue(service.getWorkspaces().size() > 0); int count = 0; for (Iterator it = service.getWorkspaces().iterator(); it.hasNext();) { ClientWorkspace + * space = (ClientWorkspace) it.next(); assertNotNull(space.getTitle()); + * + * for (Iterator colit = space.getCollections().iterator(); colit.hasNext();) { ClientCollection col = (ClientCollection) colit.next(); if + * (col.accepts("image/gif")) { + * + * // we found a collection that accepts GIF, so post 100 of them List posted = new ArrayList(); for (int i=0; i= maxPagingEntries); count++; break; } } } assertTrue(count > 0); } + */ } - - diff --git a/src/test/java/org/rometools/propono/atom/client/BloggerDotComTest.java b/src/test/java/org/rometools/propono/atom/client/BloggerDotComTest.java index 7309751..a0b9f23 100644 --- a/src/test/java/org/rometools/propono/atom/client/BloggerDotComTest.java +++ b/src/test/java/org/rometools/propono/atom/client/BloggerDotComTest.java @@ -12,80 +12,73 @@ * 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. - */ + */ package org.rometools.propono.atom.client; -import org.rometools.propono.atom.client.ClientCollection; -import org.rometools.propono.atom.client.ClientAtomService; -import org.rometools.propono.atom.client.AtomClientFactory; -import org.rometools.propono.atom.client.GDataAuthStrategy; -import org.rometools.propono.atom.client.ClientEntry; -import com.sun.syndication.feed.atom.Content; import java.util.Iterator; + import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; +import com.sun.syndication.feed.atom.Content; + /** * Simple APP test designed to run against Blogger.com. */ public class BloggerDotComTest extends TestCase { - - private String collectionURI = "http://www.blogger.com/feeds/BLOGID/posts/default"; - private String atomServiceURI= "http://www.blogger.com/feeds/default/blogs?alt=atom-service"; - private String email = "EMAIL"; - private String password = "PASSWORD"; - - public BloggerDotComTest(String testName) { + + private final String collectionURI = "http://www.blogger.com/feeds/BLOGID/posts/default"; + private final String atomServiceURI = "http://www.blogger.com/feeds/default/blogs?alt=atom-service"; + private final String email = "EMAIL"; + private final String password = "PASSWORD"; + + public BloggerDotComTest(final String testName) { super(testName); } + @Override protected void setUp() throws Exception { } + @Override protected void tearDown() throws Exception { } public static Test suite() { - TestSuite suite = new TestSuite(BloggerDotComTest.class); + final TestSuite suite = new TestSuite(BloggerDotComTest.class); return suite; } /** * Verify that server returns service document containing workspaces containing collections. */ - public void testGetEntries() throws Exception { - + public void testGetEntries() throws Exception { + // no auth necessary for iterating through entries - ClientCollection col = AtomClientFactory.getCollection(collectionURI, - new GDataAuthStrategy(email, password, "blogger")); + ClientCollection col = AtomClientFactory.getCollection(collectionURI, new GDataAuthStrategy(email, password, "blogger")); assertNotNull(col); int count = 0; - for (Iterator it = col.getEntries(); it.hasNext();) { - ClientEntry entry = (ClientEntry) it.next(); + for (final Iterator it = col.getEntries(); it.hasNext();) { + final ClientEntry entry = (ClientEntry) it.next(); assertNotNull(entry); count++; } assertTrue(count > 0); - col = AtomClientFactory.getCollection(collectionURI, - new GDataAuthStrategy(email, password, "blogger")); - ClientEntry p1 = col.createEntry(); + col = AtomClientFactory.getCollection(collectionURI, new GDataAuthStrategy(email, password, "blogger")); + final ClientEntry p1 = col.createEntry(); p1.setTitle("Propono post"); - Content c = new Content(); + final Content c = new Content(); c.setValue("This is content from ROME Propono"); p1.setContent(c); col.addEntry(p1); - - ClientEntry p2 = col.getEntry(p1.getEditURI()); + + final ClientEntry p2 = col.getEntry(p1.getEditURI()); assertNotNull(p2); - - - ClientAtomService atomService = AtomClientFactory.getAtomService( - collectionURI, new GDataAuthStrategy(email, password, "blogger")); + + final ClientAtomService atomService = AtomClientFactory.getAtomService(collectionURI, new GDataAuthStrategy(email, password, "blogger")); assertNotNull(atomService); - + } } - - diff --git a/src/test/java/org/rometools/propono/atom/common/AtomServiceTest.java b/src/test/java/org/rometools/propono/atom/common/AtomServiceTest.java index 62fd60d..58e280b 100644 --- a/src/test/java/org/rometools/propono/atom/common/AtomServiceTest.java +++ b/src/test/java/org/rometools/propono/atom/common/AtomServiceTest.java @@ -12,39 +12,42 @@ * 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. - */ + */ package org.rometools.propono.atom.common; -import org.rometools.propono.atom.common.Workspace; -import org.rometools.propono.atom.common.AtomService; -import org.rometools.propono.atom.common.Categories; -import org.rometools.propono.atom.common.Collection; -import com.sun.syndication.feed.atom.Category; import java.io.FileInputStream; import java.util.Iterator; -import junit.framework.*; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.input.SAXBuilder; +import com.sun.syndication.feed.atom.Category; + /** * Tests reading and writing of service document, no server needed. */ public class AtomServiceTest extends TestCase { - - public AtomServiceTest(String testName) { + + public AtomServiceTest(final String testName) { super(testName); } + @Override protected void setUp() throws Exception { } + @Override protected void tearDown() throws Exception { } public static Test suite() { - TestSuite suite = new TestSuite(AtomServiceTest.class); - + final TestSuite suite = new TestSuite(AtomServiceTest.class); + return suite; } @@ -54,31 +57,31 @@ public class AtomServiceTest extends TestCase { public void testDocumentToService() { try { // Load service document from disk - SAXBuilder builder = new SAXBuilder(); - Document document = builder.build(new FileInputStream("test/testdata/servicedoc1.xml")); + final SAXBuilder builder = new SAXBuilder(); + final Document document = builder.build(new FileInputStream("test/testdata/servicedoc1.xml")); assertNotNull(document); - AtomService service = AtomService.documentToService(document); - + final AtomService service = AtomService.documentToService(document); + int workspaceCount = 0; - + // Verify that service contains expected workspaces, collections and categories - for (Iterator it = service.getWorkspaces().iterator(); it.hasNext();) { - Workspace space = (Workspace)it.next(); + for (final Iterator it = service.getWorkspaces().iterator(); it.hasNext();) { + final Workspace space = (Workspace) it.next(); assertNotNull(space.getTitle()); workspaceCount++; int collectionCount = 0; - for (Iterator colit = space.getCollections().iterator(); colit.hasNext();) { - Collection col = (Collection)colit.next(); + for (final Iterator colit = space.getCollections().iterator(); colit.hasNext();) { + final Collection col = (Collection) colit.next(); assertNotNull(col.getTitle()); assertNotNull(col.getHrefResolved()); collectionCount++; int catCount = 0; if (col.getCategories().size() > 0) { - for (Iterator catsit = col.getCategories().iterator(); catsit.hasNext();) { - Categories cats = (Categories) catsit.next(); - for (Iterator catit = cats.getCategories().iterator(); catit.hasNext();) { - Category cat = (Category) catit.next(); + for (final Iterator catsit = col.getCategories().iterator(); catsit.hasNext();) { + final Categories cats = (Categories) catsit.next(); + for (final Iterator catit = cats.getCategories().iterator(); catit.hasNext();) { + final Category cat = (Category) catit.next(); catCount++; } assertTrue(catCount > 0); @@ -86,75 +89,71 @@ public class AtomServiceTest extends TestCase { } } } - + assertTrue(workspaceCount > 0); - - } catch (Exception e) { + + } catch (final Exception e) { e.printStackTrace(); fail(); } - } - + } + /** * Test of documentToService method, of class AtomService. */ public void testServiceToDocument() { try { // Create service with workspace and collections - AtomService service = new AtomService(); - - Workspace workspace1 = new Workspace("workspace1", null); - Workspace workspace2 = new Workspace("workspace1", null); + final AtomService service = new AtomService(); + + final Workspace workspace1 = new Workspace("workspace1", null); + final Workspace workspace2 = new Workspace("workspace1", null); service.addWorkspace(workspace1); service.addWorkspace(workspace2); - - Collection collection11 = - new Collection("collection11", null, "http://example.com/app/col11"); - Collection collection12 = - new Collection("collection12", null, "http://example.com/app/col12"); + + final Collection collection11 = new Collection("collection11", null, "http://example.com/app/col11"); + final Collection collection12 = new Collection("collection12", null, "http://example.com/app/col12"); workspace1.addCollection(collection11); workspace1.addCollection(collection12); - - Collection collection21 = - new Collection("collection21", null, "http://example.com/app/col21"); - Collection collection22 = - new Collection("collection22", null, "http://example.com/app/col22"); + + final Collection collection21 = new Collection("collection21", null, "http://example.com/app/col21"); + final Collection collection22 = new Collection("collection22", null, "http://example.com/app/col22"); workspace2.addCollection(collection21); workspace2.addCollection(collection22); - + // TODO: add categories at collection level - + // Convert to JDOM document - Document document = service.serviceToDocument(); + final Document document = service.serviceToDocument(); // verify that JDOM document contains service, workspace and collection assertEquals("service", document.getRootElement().getName()); int workspaceCount = 0; - for (Iterator spaceit = document.getRootElement().getChildren().iterator(); spaceit.hasNext();) { - Element elem = (Element) spaceit.next(); - if ("workspace".equals(elem.getName())) { + for (final Object element : document.getRootElement().getChildren()) { + final Element elem = (Element) element; + if ("workspace".equals(elem.getName())) { workspaceCount++; } boolean workspaceTitle = false; int collectionCount = 0; - for (Iterator colit = elem.getChildren().iterator(); colit.hasNext();) { - Element colelem = (Element) colit.next(); - if ("title".equals(colelem.getName())) { + for (final Object element2 : elem.getChildren()) { + final Element colelem = (Element) element2; + if ("title".equals(colelem.getName())) { workspaceTitle = true; - } else if ("collection".equals(colelem.getName())){ - collectionCount++; + } else if ("collection".equals(colelem.getName())) { + collectionCount++; } - + // TODO: test for categories at the collection level } assertTrue(workspaceTitle); assertTrue(collectionCount > 0); } assertTrue(workspaceCount > 0); - - } catch (Exception e) { + + } catch (final Exception e) { e.printStackTrace(); fail(); } - } + } } diff --git a/src/test/java/org/rometools/propono/atom/common/CollectionTest.java b/src/test/java/org/rometools/propono/atom/common/CollectionTest.java index 57696c9..9f9a110 100644 --- a/src/test/java/org/rometools/propono/atom/common/CollectionTest.java +++ b/src/test/java/org/rometools/propono/atom/common/CollectionTest.java @@ -12,45 +12,46 @@ * 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. - */ + */ package org.rometools.propono.atom.common; -import org.rometools.propono.atom.common.Collection; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import junit.framework.*; + +import junit.framework.TestCase; /** * Tests Collection class, no server needed. */ public class CollectionTest extends TestCase { - - public CollectionTest(String testName) { + + public CollectionTest(final String testName) { super(testName); } + @Override protected void setUp() throws Exception { } + @Override protected void tearDown() throws Exception { } /** * Test of accepts method, of class com.sun.syndication.propono.atom.common.Collection. */ - public void testAccepts() { - - Collection col = - new Collection("dummy_title","dummy_titletype","dummy_href"); - + public void testAccepts() { + + final Collection col = new Collection("dummy_title", "dummy_titletype", "dummy_href"); + col.setAccepts(Collections.singletonList("image/*")); assertTrue(col.accepts("image/gif")); assertTrue(col.accepts("image/jpg")); assertTrue(col.accepts("image/png")); assertFalse(col.accepts("test/html")); - - List accepts = new ArrayList(); + + final List accepts = new ArrayList(); accepts.add("image/*"); accepts.add("text/*"); col.setAccepts(accepts); @@ -58,11 +59,11 @@ public class CollectionTest extends TestCase { assertTrue(col.accepts("image/jpg")); assertTrue(col.accepts("image/png")); assertTrue(col.accepts("text/html")); - + col.setAccepts(Collections.singletonList("*/*")); assertTrue(col.accepts("image/gif")); assertTrue(col.accepts("image/jpg")); assertTrue(col.accepts("image/png")); assertTrue(col.accepts("text/html")); - } + } } diff --git a/src/test/java/org/rometools/propono/atom/server/AtomClientServerTest.java b/src/test/java/org/rometools/propono/atom/server/AtomClientServerTest.java index cf599da..707ea9f 100644 --- a/src/test/java/org/rometools/propono/atom/server/AtomClientServerTest.java +++ b/src/test/java/org/rometools/propono/atom/server/AtomClientServerTest.java @@ -17,20 +17,19 @@ package org.rometools.propono.atom.server; import java.util.logging.ConsoleHandler; -import java.util.logging.Level; +import java.util.logging.Level; import java.util.logging.Logger; + import junit.framework.Test; import junit.framework.TestSuite; + import org.mortbay.http.HttpContext; import org.mortbay.http.HttpServer; import org.mortbay.http.SocketListener; import org.mortbay.jetty.servlet.ServletHandler; - /** - * Test Propono Atom Client against Atom Server via Jetty. Extends - * AtomClientTest to start Jetty server, run tests and then stop - * the Jetty server. + * Test Propono Atom Client against Atom Server via Jetty. Extends AtomClientTest to start Jetty server, run tests and then stop the Jetty server. */ public class AtomClientServerTest { // extends AtomClientTest { @@ -40,8 +39,8 @@ public class AtomClientServerTest { // extends AtomClientTest { public static final String USERNAME = "admin"; public static final String PASSWORD = "admin"; - public AtomClientServerTest(String s) { - //super(s); + public AtomClientServerTest(final String s) { + // super(s); } public String getEndpoint() { @@ -57,7 +56,7 @@ public class AtomClientServerTest { // extends AtomClientTest { } public static Test suite() { - TestSuite suite = new TestSuite(AtomClientServerTest.class); + final TestSuite suite = new TestSuite(AtomClientServerTest.class); return suite; } @@ -66,14 +65,14 @@ public class AtomClientServerTest { // extends AtomClientTest { } protected void setUp() throws Exception { - ConsoleHandler handler = new ConsoleHandler(); - Logger logger = Logger.getLogger("com.sun.syndication.propono"); + final ConsoleHandler handler = new ConsoleHandler(); + final Logger logger = Logger.getLogger("com.sun.syndication.propono"); logger.setLevel(Level.FINEST); logger.addHandler(handler); setupServer(); - HttpContext context = createContext(); - ServletHandler servlets = createServletHandler(); + final HttpContext context = createContext(); + final ServletHandler servlets = createServletHandler(); context.addHandler(servlets); server.addContext(context); server.start(); @@ -88,24 +87,20 @@ public class AtomClientServerTest { // extends AtomClientTest { server = new HttpServer(); // Create a port listener - SocketListener listener = new SocketListener(); + final SocketListener listener = new SocketListener(); listener.setPort(TESTPORT); server.addListener(listener); } private ServletHandler createServletHandler() { - System.setProperty( - "com.sun.syndication.propono.atom.server.AtomHandlerFactory", - "com.sun.syndication.propono.atom.server.TestAtomHandlerFactory"); - ServletHandler servlets = new ServletHandler(); - servlets.addServlet( - "app", "/app/*", - "com.sun.syndication.propono.atom.server.AtomServlet"); + System.setProperty("com.sun.syndication.propono.atom.server.AtomHandlerFactory", "com.sun.syndication.propono.atom.server.TestAtomHandlerFactory"); + final ServletHandler servlets = new ServletHandler(); + servlets.addServlet("app", "/app/*", "com.sun.syndication.propono.atom.server.AtomServlet"); return servlets; } private HttpContext createContext() { - HttpContext context = new HttpContext(); + final HttpContext context = new HttpContext(); context.setContextPath("/rome/*"); return context; } @@ -118,5 +113,3 @@ public class AtomClientServerTest { // extends AtomClientTest { } } } - - diff --git a/src/test/java/org/rometools/propono/atom/server/TestAtomHandlerFactory.java b/src/test/java/org/rometools/propono/atom/server/TestAtomHandlerFactory.java index d4d5c52..97e58ec 100644 --- a/src/test/java/org/rometools/propono/atom/server/TestAtomHandlerFactory.java +++ b/src/test/java/org/rometools/propono/atom/server/TestAtomHandlerFactory.java @@ -16,14 +16,13 @@ */ package org.rometools.propono.atom.server; -import org.rometools.propono.atom.server.AtomHandlerFactory; -import org.rometools.propono.atom.server.AtomHandler; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TestAtomHandlerFactory extends AtomHandlerFactory { - - public AtomHandler newAtomHandler(HttpServletRequest req, HttpServletResponse res) { + + @Override + public AtomHandler newAtomHandler(final HttpServletRequest req, final HttpServletResponse res) { return new TestAtomHandlerImpl(req, "build/testuploaddir"); } } diff --git a/src/test/java/org/rometools/propono/atom/server/TestAtomHandlerImpl.java b/src/test/java/org/rometools/propono/atom/server/TestAtomHandlerImpl.java index 83b047d..b047a16 100644 --- a/src/test/java/org/rometools/propono/atom/server/TestAtomHandlerImpl.java +++ b/src/test/java/org/rometools/propono/atom/server/TestAtomHandlerImpl.java @@ -16,16 +16,18 @@ */ package org.rometools.propono.atom.server; -import org.rometools.propono.atom.server.impl.FileBasedAtomHandler; import javax.servlet.http.HttpServletRequest; +import org.rometools.propono.atom.server.impl.FileBasedAtomHandler; + public class TestAtomHandlerImpl extends FileBasedAtomHandler { - - public TestAtomHandlerImpl(HttpServletRequest req, String uploaddir) { + + public TestAtomHandlerImpl(final HttpServletRequest req, final String uploaddir) { super(req, uploaddir); } - public boolean validateUser( String loginId, String password ) { - return AtomClientServerTest.USERNAME.equals(loginId) - && AtomClientServerTest.PASSWORD.equals(password); - } + + @Override + public boolean validateUser(final String loginId, final String password) { + return AtomClientServerTest.USERNAME.equals(loginId) && AtomClientServerTest.PASSWORD.equals(password); + } } \ No newline at end of file diff --git a/src/test/java/org/rometools/propono/blogclient/SimpleBlogClientTest.java b/src/test/java/org/rometools/propono/blogclient/SimpleBlogClientTest.java index bdb1d34..e66972d 100644 --- a/src/test/java/org/rometools/propono/blogclient/SimpleBlogClientTest.java +++ b/src/test/java/org/rometools/propono/blogclient/SimpleBlogClientTest.java @@ -12,114 +12,109 @@ * 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. - */ + */ package org.rometools.propono.blogclient; -import org.rometools.propono.blogclient.BlogConnection; -import org.rometools.propono.blogclient.BlogResource; -import org.rometools.propono.blogclient.Blog; -import org.rometools.propono.blogclient.BlogConnectionFactory; -import org.rometools.propono.blogclient.BlogEntry; -import com.sun.syndication.io.impl.Atom10Parser; -import org.rometools.propono.utils.Utilities; import java.io.File; import java.util.Iterator; + import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; +import org.rometools.propono.utils.Utilities; +import com.sun.syndication.io.impl.Atom10Parser; /** - * Tests Atom and MetaWeblog API CRUD via BlogClient. - * Exclude this from automated tests because it requires a live blog server. + * Tests Atom and MetaWeblog API CRUD via BlogClient. Exclude this from automated tests because it requires a live blog server. */ public class SimpleBlogClientTest extends TestCase { - - private String metaweblogEndpoint = "http://localhost:8080/roller/roller-services/xmlrpc"; - //private String atomEndpoint = "http://localhost:8080/roller/roller-services/app"; - private String atomEndpoint = "http://localhost:8080/sample-atomserver/app"; - - private String endpoint = "http://localhost:8080/atom-fileserver/app"; - private String username = "admin"; - private String password = "admin"; - - public SimpleBlogClientTest(String testName) { + + private final String metaweblogEndpoint = "http://localhost:8080/roller/roller-services/xmlrpc"; + // private String atomEndpoint = "http://localhost:8080/roller/roller-services/app"; + private final String atomEndpoint = "http://localhost:8080/sample-atomserver/app"; + + private final String endpoint = "http://localhost:8080/atom-fileserver/app"; + private final String username = "admin"; + private final String password = "admin"; + + public SimpleBlogClientTest(final String testName) { super(testName); } + @Override protected void setUp() throws Exception { } + @Override protected void tearDown() throws Exception { } - + public void testBlogClientAtom() throws Exception { testBlogClient("atom", atomEndpoint); } - - public void testBlogClientMetaWeblog() throws Exception{ + + public void testBlogClientMetaWeblog() throws Exception { testBlogClient("metaweblog", metaweblogEndpoint); } - - public void testBlogClient(String type, String endpoint) throws Exception { - BlogConnection conn = BlogConnectionFactory - .getBlogConnection(type, endpoint, username, password); - + + public void testBlogClient(final String type, final String endpoint) throws Exception { + final BlogConnection conn = BlogConnectionFactory.getBlogConnection(type, endpoint, username, password); + int blogCount = 0; - for (Iterator it = conn.getBlogs().iterator(); it.hasNext();) { - Blog blog = (Blog) it.next(); + for (final Iterator it = conn.getBlogs().iterator(); it.hasNext();) { + final Blog blog = (Blog) it.next(); System.out.println(blog.getName()); blogCount++; } - assertTrue(blogCount > 0); + assertTrue(blogCount > 0); } public void testPostAndDeleteAtom() throws Exception { testPostAndDelete("atom", atomEndpoint); } - + public void testPostAndDeleteMetaWeblog() throws Exception { testPostAndDelete("metaweblog", metaweblogEndpoint); } - + public void testMediaPostAtom() throws Exception { testMediaPost("atom", atomEndpoint); } - + public void testMediaPostMetaWeblog() throws Exception { testMediaPost("metaweblog", metaweblogEndpoint); } - - public void testPostAndDelete(String type, String endpoint) throws Exception { - BlogConnection conn = BlogConnectionFactory - .getBlogConnection(type, endpoint, username, password); + + public void testPostAndDelete(final String type, final String endpoint) throws Exception { + final BlogConnection conn = BlogConnectionFactory.getBlogConnection(type, endpoint, username, password); assertNotNull(conn); - - String title1 = "Test content"; - String content1 = "Test content"; - - Blog blog = (Blog)conn.getBlogs().get(0); + + final String title1 = "Test content"; + final String content1 = "Test content"; + + final Blog blog = (Blog) conn.getBlogs().get(0); BlogEntry entry = blog.newEntry(); entry.setTitle(title1); entry.setContent(new BlogEntry.Content(content1)); entry.save(); - String token = entry.getToken(); + final String token = entry.getToken(); assertNotNull(token); - + entry = blog.getEntry(token); - + assertEquals(title1, entry.getTitle()); assertEquals(content1, entry.getContent().getValue()); - + assertNotNull(entry); entry.delete(); entry = null; - + boolean notFound = false; try { entry = blog.getEntry(token); - } catch (Exception e) { + } catch (final Exception e) { notFound = true; } assertTrue(notFound); @@ -128,30 +123,29 @@ public class SimpleBlogClientTest extends TestCase { /** * Post media entry to every media colletion avialable on server, then cleanup. */ - public void testMediaPost(String type, String endpoint) throws Exception { - BlogConnection conn = BlogConnectionFactory - .getBlogConnection(type, endpoint, username, password); + public void testMediaPost(final String type, final String endpoint) throws Exception { + final BlogConnection conn = BlogConnectionFactory.getBlogConnection(type, endpoint, username, password); assertNotNull(conn); - - assertTrue(conn.getBlogs().size() > 0); + + assertTrue(conn.getBlogs().size() > 0); int count = 0; - for (Iterator it = conn.getBlogs().iterator(); it.hasNext();) { - Blog blog = (Blog) it.next(); + for (final Iterator it = conn.getBlogs().iterator(); it.hasNext();) { + final Blog blog = (Blog) it.next(); assertNotNull(blog.getName()); - - for (Iterator colit = blog.getCollections().iterator(); colit.hasNext();) { - Blog.Collection col = (Blog.Collection) colit.next(); + + for (final Iterator colit = blog.getCollections().iterator(); colit.hasNext();) { + final Blog.Collection col = (Blog.Collection) colit.next(); if (col.accepts("image/gif")) { - + // we found a collection that accepts GIF, so post one - BlogResource m1 = col.newResource("duke"+count, "image/gif", - Utilities.getBytesFromFile(new File("test/testdata/duke-wave-shadow.gif"))); + final BlogResource m1 = col.newResource("duke" + count, "image/gif", + Utilities.getBytesFromFile(new File("test/testdata/duke-wave-shadow.gif"))); col.saveResource(m1); - + if ("atom".equals(type)) { // additional tests for Atom // entry should now exist on server - BlogResource m2 = (BlogResource)blog.getEntry(m1.getToken()); + final BlogResource m2 = (BlogResource) blog.getEntry(m1.getToken()); assertNotNull(m2); // remove entry @@ -160,8 +154,8 @@ public class SimpleBlogClientTest extends TestCase { // fetching entry now should result in exception boolean failed = false; try { - blog.getEntry(m1.getToken()); - } catch (Exception e) { + blog.getEntry(m1.getToken()); + } catch (final Exception e) { failed = true; } assertTrue(failed); @@ -169,52 +163,46 @@ public class SimpleBlogClientTest extends TestCase { count++; } } - } + } assertTrue(count > 0); } - public void testEntryIterationAtom() throws Exception { testEntryIteration("atom", atomEndpoint); } - + public void testEntryIterationMetaWeblog() throws Exception { testEntryIteration("metaweblog", metaweblogEndpoint); } - public void testEntryIteration(String type, String endpoint) throws Exception { - BlogConnection conn = BlogConnectionFactory - .getBlogConnection(type, endpoint, username, password); + public void testEntryIteration(final String type, final String endpoint) throws Exception { + final BlogConnection conn = BlogConnectionFactory.getBlogConnection(type, endpoint, username, password); assertNotNull(conn); - - String title1 = "Test content"; - String content1 = "Test content"; - - Blog blog = (Blog)conn.getBlogs().get(0); - - for (int i=0; i<10; i++) { - BlogEntry entry = blog.newEntry(); + + final String title1 = "Test content"; + final String content1 = "Test content"; + + final Blog blog = (Blog) conn.getBlogs().get(0); + + for (int i = 0; i < 10; i++) { + final BlogEntry entry = blog.newEntry(); entry.setTitle(title1); entry.setContent(new BlogEntry.Content(content1)); entry.save(); - String token = entry.getToken(); + final String token = entry.getToken(); assertTrue(Atom10Parser.isAbsoluteURI(token)); assertNotNull(token); } - for (Iterator it = blog.getEntries(); it.hasNext();) { - BlogEntry blogEntry = (BlogEntry)it.next(); + for (final Iterator it = blog.getEntries(); it.hasNext();) { + final BlogEntry blogEntry = (BlogEntry) it.next(); assertTrue(Atom10Parser.isAbsoluteURI(blogEntry.getToken())); blogEntry.delete(); - } + } } - - + public static Test suite() { - TestSuite suite = new TestSuite(SimpleBlogClientTest.class); + final TestSuite suite = new TestSuite(SimpleBlogClientTest.class); return suite; } } - - -