Reformatting and cleaning up code (step 1/2)

This commit is contained in:
Patrick Gotthard 2013-10-03 22:32:00 +02:00
parent f84f0ae10e
commit 95b9121a77
156 changed files with 10329 additions and 8629 deletions

View file

@ -25,9 +25,10 @@ public interface CopyFrom<T> {
/**
* Returns the interface the copyFrom works on.
* <p>
* This is useful when dealing with properties that may have multiple implementations.
* For example, Module.
* This is useful when dealing with properties that may have multiple
* implementations. For example, Module.
* <p>
*
* @return the interface the copyFrom works on.
*/
public Class<? extends CopyFrom> getInterface();
@ -37,9 +38,11 @@ public interface CopyFrom<T> {
* <p>
* Any existing properties in this bean are lost.
* <p>
* This method is useful for moving from one implementation of a bean interface to another.
* For example from the default SyndFeed bean implementation to a Hibernate ready implementation.
* This method is useful for moving from one implementation of a bean
* interface to another. For example from the default SyndFeed bean
* implementation to a Hibernate ready implementation.
* <p>
*
* @param obj the instance to copy properties from.
*
*/

View file

@ -17,32 +17,33 @@
*/
package com.sun.syndication.feed;
import com.sun.syndication.feed.impl.ObjectBean;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.feed.module.impl.ModuleUtils;
import com.sun.syndication.feed.module.Extendable;
import java.util.List;
import java.util.ArrayList;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.jdom2.Element;
import com.sun.syndication.feed.impl.ObjectBean;
import com.sun.syndication.feed.module.Extendable;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.feed.module.impl.ModuleUtils;
/**
* Parent class of the RSS (Channel) and Atom (Feed) feed beans.
* <p>
* NOTE: We don't like this class at this package level but the alternative would have
* been a proliferation of packages (one more level to hold atom and rss package with
* this class just in that package).
* NOTE: We don't like this class at this package level but the alternative
* would have been a proliferation of packages (one more level to hold atom and
* rss package with this class just in that package).
* <p>
* The format of the 'type' property must be [FEEDNAME]_[FEEDVERSION] with the FEEDNAME in lower case,
* for example: rss_0.9, rss_0.93, atom_0.3
* The format of the 'type' property must be [FEEDNAME]_[FEEDVERSION] with the
* FEEDNAME in lower case, for example: rss_0.9, rss_0.93, atom_0.3
* <p>
*
* @author Alejandro Abdelnur
*
*/
public abstract class WireFeed implements Cloneable, Serializable, Extendable {
private ObjectBean _objBean;
private final ObjectBean _objBean;
private String _feedType;
private String _encoding;
private List<Module> _modules;
@ -54,51 +55,56 @@ public abstract class WireFeed implements Cloneable, Serializable, Extendable {
*
*/
protected WireFeed() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a feed for a given type.
* <p>
*
* @param type of the feed to create.
*
*/
protected WireFeed(String type) {
protected WireFeed(final String type) {
this();
_feedType = type;
this._feedType = type;
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
public boolean equals(final Object other) {
if (other == null) {
return false;
}
if (!(other instanceof WireFeed)){
if (!(other instanceof WireFeed)) {
return false;
}
// can't use foreign markup in equals, due to JDOM equals impl
List<Element> fm = getForeignMarkup();
setForeignMarkup(((WireFeed)other).getForeignMarkup());
boolean ret = _objBean.equals(other);
final List<Element> fm = getForeignMarkup();
setForeignMarkup(((WireFeed) other).getForeignMarkup());
final boolean ret = this._objBean.equals(other);
// restore foreign markup
setForeignMarkup(fm);
return ret;
@ -109,37 +115,37 @@ public abstract class WireFeed implements Cloneable, Serializable, Extendable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Sets the feedType of a the feed. <b>Do not use</b>, for bean cloning purposes only.
* Sets the feedType of a the feed. <b>Do not use</b>, for bean cloning
* purposes only.
* <p>
*
* @param feedType the feedType of the feed.
*
*/
public void setFeedType(String feedType) {
_feedType = feedType;
public void setFeedType(final String feedType) {
this._feedType = feedType;
}
/**
@ -148,85 +154,94 @@ public abstract class WireFeed implements Cloneable, Serializable, Extendable {
* @return the type of the feed.
*/
public String getFeedType() {
return _feedType;
return this._feedType;
}
/**
* Returns the charset encoding of a the feed.
* <p>
* This property is not set by feed parsers. But it is used by feed generators
* to set the encoding in the XML prolog.
* This property is not set by feed parsers. But it is used by feed
* generators to set the encoding in the XML prolog.
* <p>
*
* @return the charset encoding of the feed.
*
*/
public String getEncoding() {
return _encoding;
return this._encoding;
}
/**
* Sets the charset encoding of a the feed.
* <p>
* This property is not set by feed parsers. But it is used by feed generators
* to set the encoding in the XML prolog.
* This property is not set by feed parsers. But it is used by feed
* generators to set the encoding in the XML prolog.
* <p>
*
* @param encoding the charset encoding of the feed.
*
*/
public void setEncoding(String encoding) {
_encoding = encoding;
public void setEncoding(final String encoding) {
this._encoding = encoding;
}
/**
* Returns the channel modules.
* <p>
* @return a list of ModuleImpl elements with the channel modules,
* an empty list if none.
*
* @return a list of ModuleImpl elements with the channel modules, an empty
* list if none.
*
*/
@Override
public List<Module> getModules() {
return (_modules==null) ? (_modules=new ArrayList<Module>()) : _modules;
return this._modules == null ? (this._modules = new ArrayList<Module>()) : this._modules;
}
/**
* Sets the channel modules.
* <p>
* @param modules the list of ModuleImpl elements with the channel modules to set,
* an empty list or <b>null</b> if none.
*
* @param modules the list of ModuleImpl elements with the channel modules
* to set, an empty list or <b>null</b> if none.
*
*/
public void setModules(List<Module> modules) {
_modules = modules;
@Override
public void setModules(final List<Module> modules) {
this._modules = modules;
}
/**
* Returns the module identified by a given URI.
* <p>
*
* @param uri the URI of the ModuleImpl.
* @return The module with the given URI, <b>null</b> if none.
*/
public Module getModule(String uri) {
return ModuleUtils.getModule(_modules,uri);
@Override
public Module getModule(final String uri) {
return ModuleUtils.getModule(this._modules, uri);
}
/**
* Returns foreign markup found at channel level.
* <p>
*
* @return Opaque object to discourage use
*
*/
public List<Element> getForeignMarkup() {
return (_foreignMarkup==null) ? (_foreignMarkup=new ArrayList<Element>()) : _foreignMarkup;
return this._foreignMarkup == null ? (this._foreignMarkup = new ArrayList<Element>()) : this._foreignMarkup;
}
/**
* Sets foreign markup found at channel level.
* <p>
*
* @param foreignMarkup Opaque object to discourage use
*
*/
public void setForeignMarkup(List<Element> foreignMarkup) {
_foreignMarkup = (List<Element>)foreignMarkup;
public void setForeignMarkup(final List<Element> foreignMarkup) {
this._foreignMarkup = foreignMarkup;
}
}

View file

@ -16,18 +16,19 @@
*/
package com.sun.syndication.feed.atom;
import com.sun.syndication.feed.impl.ObjectBean;
import java.io.Serializable;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Bean for category elements of Atom feeds.
* <p>
*
* @author Dave Johnson (added for Atom 1.0)
*/
public class Category implements Cloneable, Serializable {
private ObjectBean _objBean;
private final ObjectBean _objBean;
private String _term;
private String _scheme;
@ -40,34 +41,38 @@ public class Category implements Cloneable, Serializable {
*
*/
public Category() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
if(!(other instanceof Category)){
public boolean equals(final Object other) {
if (!(other instanceof Category)) {
return false;
}
return _objBean.equals(other);
return this._objBean.equals(other);
}
/**
@ -75,84 +80,92 @@ public class Category implements Cloneable, Serializable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Get label for category.
* <p>
*
* @return Label for category.
*/
public String getLabel() {
return _label;
return this._label;
}
/**
* Set label for category.
* <p>
*
* @param label Label for category.
*/
public void setLabel(String label) {
public void setLabel(final String label) {
this._label = label;
}
/**
* Get Scheme URI for category.
* <p>
*
* @return Scheme URI for category.
*/
public String getScheme() {
return _scheme;
return this._scheme;
}
/**
* Set scheme URI for category.
* <p>
*
* @param scheme Scheme URI for category.
*/
public void setScheme(String scheme) {
public void setScheme(final String scheme) {
this._scheme = scheme;
}
public void setSchemeResolved(String schemeResolved) {
_schemeResolved = schemeResolved;
public void setSchemeResolved(final String schemeResolved) {
this._schemeResolved = schemeResolved;
}
public String getSchemeResolved() {
return _schemeResolved != null ? _schemeResolved : _scheme;
return this._schemeResolved != null ? this._schemeResolved : this._scheme;
}
/**
* Return term for category.
* <p>
*
* @return Term for category.
*/
public String getTerm() {
return _term;
return this._term;
}
/**
* Set term for category.
* <p>
*
* @param term Term for category.
*/
public void setTerm(String term) {
public void setTerm(final String term) {
this._term = term;
}
}

View file

@ -16,21 +16,22 @@
*/
package com.sun.syndication.feed.atom;
import com.sun.syndication.feed.impl.ObjectBean;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Bean for content elements of Atom feeds.
* <p>
*
* @author Alejandro Abdelnur
* @author Dave Johnson (updated for Atom 1.0)
*/
public class Content implements Cloneable,Serializable {
public class Content implements Cloneable, Serializable {
private ObjectBean _objBean;
private final ObjectBean _objBean;
private String _type;
private String _value;
@ -62,41 +63,44 @@ public class Content implements Cloneable,Serializable {
MODES.add(ESCAPED);
}
/**
* Default constructor. All properties are set to <b>null</b>.
* <p>
*
*/
public Content() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
if(!(other instanceof Content)){
public boolean equals(final Object other) {
if (!(other instanceof Content)) {
return false;
}
return _objBean.equals(other);
return this._objBean.equals(other);
}
/**
@ -104,23 +108,25 @@ public class Content implements Cloneable,Serializable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
@ -128,10 +134,11 @@ public class Content implements Cloneable,Serializable {
* <p>
* The type indicates how the value was/will-be encoded in the XML feed.
* </p>
*
* @since Atom 1.0
*/
public String getType() {
return _type;
return this._type;
}
/**
@ -139,10 +146,11 @@ public class Content implements Cloneable,Serializable {
* <p>
* The type indicates how the value was/will-be encoded in the XML feed.
* </p>
*
* @since Atom 1.0
*/
public void setType(String type) {
_type = type;
public void setType(final String type) {
this._type = type;
}
/**
@ -150,10 +158,11 @@ public class Content implements Cloneable,Serializable {
* <p>
* The mode indicates how the value was/will-be encoded in the XML feed.
* <p>
*
* @return the content mode, <b>null</b> if none.
*/
public String getMode() {
return _mode;
return this._mode;
}
/**
@ -161,14 +170,15 @@ public class Content implements Cloneable,Serializable {
* <p>
* The mode indicates how the value was/will-be encoded in the XML feed.
* <p>
*
* @param mode the content mode, <b>null</b> if none.
*/
public void setMode(String mode) {
mode = (mode!=null) ? mode.toLowerCase() : null;
if (mode==null || !MODES.contains(mode)) {
throw new IllegalArgumentException("Invalid mode ["+mode+"]");
mode = mode != null ? mode.toLowerCase() : null;
if (mode == null || !MODES.contains(mode)) {
throw new IllegalArgumentException("Invalid mode [" + mode + "]");
}
_mode = mode;
this._mode = mode;
}
/**
@ -176,11 +186,12 @@ public class Content implements Cloneable,Serializable {
* <p>
* The return value should be decoded.
* <p>
*
* @return the content value, <b>null</b> if none.
*
*/
public String getValue() {
return _value;
return this._value;
}
/**
@ -188,32 +199,33 @@ public class Content implements Cloneable,Serializable {
* <p>
* The value being set should be decoded.
* <p>
*
* @param value the content value, <b>null</b> if none.
*
*/
public void setValue(String value) {
_value = value;
public void setValue(final String value) {
this._value = value;
}
/**
* Returns the src
* <p>
*
* @return Returns the src.
* @since Atom 1.0
*/
public String getSrc() {
return _src;
return this._src;
}
/**
* Set the src
* <p>
*
* @param src The src to set.
* @since Atom 1.0
*/
public void setSrc(String src) {
_src = src;
public void setSrc(final String src) {
this._src = src;
}
}

View file

@ -19,7 +19,6 @@ package com.sun.syndication.feed.atom;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.jdom2.Element;
@ -29,10 +28,10 @@ import com.sun.syndication.feed.module.Extendable;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.feed.module.impl.ModuleUtils;
/**
* Bean for entry elements of Atom feeds.
* <p>
*
* @author Alejandro Abdelnur
* @author Dave Johnson (updated for Atom 1.0)
*/
@ -51,7 +50,7 @@ public class Entry implements Cloneable, Serializable, Extendable {
private List<Element> _foreignMarkup;
private List<Module> _modules;
private List<Link> _otherLinks;
private ObjectBean _objBean;
private final ObjectBean _objBean;
private String _id;
private String _rights;
private String _xmlBase;
@ -62,184 +61,205 @@ public class Entry implements Cloneable, Serializable, Extendable {
*
*/
public Entry() {
_objBean = new ObjectBean(this.getClass(), this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Sets the entry alternate links.
* <p>
* @param alternateLinks the list of Link elements with the entry alternate links to set,
* an empty list or <b>null</b> if none.
*
* @param alternateLinks the list of Link elements with the entry alternate
* links to set, an empty list or <b>null</b> if none.
*/
public void setAlternateLinks(List<Link> alternateLinks) {
_alternateLinks = alternateLinks;
public void setAlternateLinks(final List<Link> alternateLinks) {
this._alternateLinks = alternateLinks;
}
/**
* Returns the entry alternate links.
* <p>
* @return a list of Link elements with the entry alternate links, an empty list if none.
*
* @return a list of Link elements with the entry alternate links, an empty
* list if none.
*/
public List<Link> getAlternateLinks() {
return (_alternateLinks == null) ? (_alternateLinks = new ArrayList<Link>()) : _alternateLinks;
return this._alternateLinks == null ? (this._alternateLinks = new ArrayList<Link>()) : this._alternateLinks;
}
/**
* Sets the author of the entry.
* <p>
*
* @param authors the author of the entry, <b>null</b> if none.
*
*/
public void setAuthors(List<Person> authors) {
_authors = authors;
public void setAuthors(final List<Person> authors) {
this._authors = authors;
}
/**
* Returns the entry author.
* <p>
*
* @return the entry author, <b>null</b> if none.
*
*/
public List<Person> getAuthors() {
return (_authors == null) ? (_authors = new ArrayList<Person>()) : _authors;
return this._authors == null ? (this._authors = new ArrayList<Person>()) : this._authors;
}
/**
* Set the categories
* <p>
*
* @param categories The categories to set.
* @since Atom 1.0
*/
public void setCategories(List<Category> categories) {
_categories = categories;
public void setCategories(final List<Category> categories) {
this._categories = categories;
}
/**
* Returns the categories
* <p>
*
* @return Returns the categories.
* @since Atom 1.0
*/
public List<Category> getCategories() {
return (_categories == null) ? (_categories = new ArrayList<Category>()) : _categories;
return this._categories == null ? (this._categories = new ArrayList<Category>()) : this._categories;
}
/**
* Sets the entry contents.
* <p>
* @param contents the list of Content elements with the entry contents to set,
* an empty list or <b>null</b> if none.
*
* @param contents the list of Content elements with the entry contents to
* set, an empty list or <b>null</b> if none.
*/
public void setContents(List<Content> contents) {
_contents = contents;
public void setContents(final List<Content> contents) {
this._contents = contents;
}
/**
* Returns the entry contents.
* <p>
* @return a list of Content elements with the entry contents,
* an empty list if none.
*
* @return a list of Content elements with the entry contents, an empty list
* if none.
*/
public List<Content> getContents() {
return (_contents == null) ? (_contents = new ArrayList<Content>()) : _contents;
return this._contents == null ? (this._contents = new ArrayList<Content>()) : this._contents;
}
/**
* Sets the entry contributors.
* <p>
* @param contributors the list of Person elements with the entry contributors to set,
* an empty list or <b>null</b> if none.
*
* @param contributors the list of Person elements with the entry
* contributors to set, an empty list or <b>null</b> if none.
*
*/
public void setContributors(List<Person> contributors) {
_contributors = contributors;
public void setContributors(final List<Person> contributors) {
this._contributors = contributors;
}
/**
* Returns the entry contributors.
* <p>
* @return a list of Person elements with the entry contributors,
* an empty list if none.
*
* @return a list of Person elements with the entry contributors, an empty
* list if none.
*
*/
public List<Person> getContributors() {
return (_contributors == null) ? (_contributors = new ArrayList<Person>()) : _contributors;
return this._contributors == null ? (this._contributors = new ArrayList<Person>()) : this._contributors;
}
/**
* Sets the entry created date (Atom 0.3 only)
* <p>
*
* @param created the entry created date, <b>null</b> if none.
*/
public void setCreated(Date created) {
_created = new Date(created.getTime());
public void setCreated(final Date created) {
this._created = new Date(created.getTime());
}
/**
* Returns the entry created date (Atom 0.3 only)
* <p>
*
* @return the entry created date, <b>null</b> if none.
*/
public Date getCreated() {
return _created == null ? null : new Date(_created.getTime());
return this._created == null ? null : new Date(this._created.getTime());
}
/**
* Sets foreign markup found at entry level.
* <p>
*
* @param foreignMarkup Opaque object to discourage use
*
*/
public void setForeignMarkup(List<Element> foreignMarkup) {
_foreignMarkup = (List<Element>) foreignMarkup;
public void setForeignMarkup(final List<Element> foreignMarkup) {
this._foreignMarkup = foreignMarkup;
}
/**
* Returns foreign markup found at entry level.
* <p>
*
* @return list of Opaque object to discourage use
*
*/
public List<Element> getForeignMarkup() {
return (_foreignMarkup == null) ? (_foreignMarkup = new ArrayList<Element>()) : _foreignMarkup;
return this._foreignMarkup == null ? (this._foreignMarkup = new ArrayList<Element>()) : this._foreignMarkup;
}
/**
* Sets the entry ID.
* <p>
*
* @param id the entry ID, <b>null</b> if none.
*
*/
public void setId(String id) {
_id = id;
public void setId(final String id) {
this._id = id;
}
/**
* Returns the entry ID.
* <p>
*
* @return the entry ID, <b>null</b> if none.
*
*/
public String getId() {
return _id;
return this._id;
}
/**
* Sets the entry issued date (Atom 0.3, maps to {@link #setPublished(java.util.Date)}).
* Sets the entry issued date (Atom 0.3, maps to
* {@link #setPublished(java.util.Date)}).
* <p>
*
* @param issued the entry issued date, <b>null</b> if none.
*/
public void setIssued(Date issued) {
_published = issued == null ? null : new Date(issued.getTime());
public void setIssued(final Date issued) {
this._published = issued == null ? null : new Date(issued.getTime());
}
/**
* Returns the entry issued date (Atom 0.3, maps to {@link #getPublished()}).
* Returns the entry issued date (Atom 0.3, maps to {@link #getPublished()}
* ).
* <p>
*
* @return the entry issued date, <b>null</b> if none.
*/
public Date getIssued() {
return _published == null ? null : new Date(_published.getTime());
return this._published == null ? null : new Date(this._published.getTime());
}
/**
@ -249,11 +269,9 @@ public class Entry implements Cloneable, Serializable, Extendable {
*/
public boolean isMediaEntry() {
boolean mediaEntry = false;
List<Link> links = getOtherLinks();
for (Iterator<Link> it = links.iterator(); it.hasNext();) {
Link link = it.next();
final List<Link> links = getOtherLinks();
for (final Link link : links) {
if ("edit-media".equals(link.getRel())) {
mediaEntry = true;
@ -265,176 +283,198 @@ public class Entry implements Cloneable, Serializable, Extendable {
}
/**
* Sets the entry modified date (Atom 0.3, maps to {@link #setUpdated(java.util.Date)}).
* Sets the entry modified date (Atom 0.3, maps to
* {@link #setUpdated(java.util.Date)}).
* <p>
*
* @param modified the entry modified date, <b>null</b> if none.
*/
public void setModified(Date modified) {
_updated = modified == null ? null : new Date(modified.getTime());
public void setModified(final Date modified) {
this._updated = modified == null ? null : new Date(modified.getTime());
}
/**
* Returns the entry modified date (Atom 0.3, maps to {@link #getUpdated()}).
* Returns the entry modified date (Atom 0.3, maps to {@link #getUpdated()}
* ).
* <p>
*
* @return the entry modified date, <b>null</b> if none.
*/
public Date getModified() {
return _updated == null ? null : new Date(_updated.getTime());
return this._updated == null ? null : new Date(this._updated.getTime());
}
/**
* Returns the module identified by a given URI.
* <p>
*
* @param uri the URI of the ModuleImpl.
* @return The module with the given URI, <b>null</b> if none.
*/
public Module getModule(String uri) {
return ModuleUtils.getModule(_modules, uri);
@Override
public Module getModule(final String uri) {
return ModuleUtils.getModule(this._modules, uri);
}
/**
* Sets the entry modules.
* <p>
* @param modules the list of ModuleImpl elements with the entry modules to set,
* an empty list or <b>null</b> if none.
*
* @param modules the list of ModuleImpl elements with the entry modules to
* set, an empty list or <b>null</b> if none.
*
*/
public void setModules(List<Module> modules) {
_modules = modules;
@Override
public void setModules(final List<Module> modules) {
this._modules = modules;
}
/**
* Returns the entry modules.
* <p>
* @return a list of ModuleImpl elements with the entry modules,
* an emtpy list if none.
*
* @return a list of ModuleImpl elements with the entry modules, an emtpy
* list if none.
*
*/
@Override
public List<Module> getModules() {
return (_modules == null) ? (_modules = new ArrayList<Module>()) : _modules;
return this._modules == null ? (this._modules = new ArrayList<Module>()) : this._modules;
}
/**
* Sets the entry non-alternate links.
* <p>
* @param otherLinks the list Link elements with the entry non-alternate links to set,
* an empty list or <b>null</b> if none.
*
* @param otherLinks the list Link elements with the entry non-alternate
* links to set, an empty list or <b>null</b> if none.
*/
public void setOtherLinks(List<Link> otherLinks) {
_otherLinks = otherLinks;
public void setOtherLinks(final List<Link> otherLinks) {
this._otherLinks = otherLinks;
}
/**
* Returns the entry non-alternate links.
* <p>
* @return the list of Link elements with the entry non-alternate links to set,
* an empty list if none.
*
* @return the list of Link elements with the entry non-alternate links to
* set, an empty list if none.
*/
public List<Link> getOtherLinks() {
return (_otherLinks == null) ? (_otherLinks = new ArrayList<Link>()) : _otherLinks;
return this._otherLinks == null ? (this._otherLinks = new ArrayList<Link>()) : this._otherLinks;
}
/**
* Set the published
* <p>
*
* @param published The published to set.
* @since Atom 1.0
*/
public void setPublished(Date published) {
_published = published == null ? null : new Date(published.getTime());
public void setPublished(final Date published) {
this._published = published == null ? null : new Date(published.getTime());
}
/**
* Returns the published
* <p>
*
* @return Returns the published.
* @since Atom 1.0
*/
public Date getPublished() {
return _published == null ? null : new Date(_published.getTime());
return this._published == null ? null : new Date(this._published.getTime());
}
/**
* Set the rights
* <p>
*
* @param rights The rights to set.
* @since Atom 1.0
*/
public void setRights(String rights) {
_rights = rights;
public void setRights(final String rights) {
this._rights = rights;
}
/**
* Returns the rights
* <p>
*
* @return Returns the rights.
* @since Atom 1.0
*/
public String getRights() {
return _rights;
return this._rights;
}
/**
* Set the source
* <p>
*
* @param source The source to set.
*/
public void setSource(Feed source) {
_source = source;
public void setSource(final Feed source) {
this._source = source;
}
/**
* Returns the source
* <p>
*
* @return Returns the source.
*/
public Feed getSource() {
return _source;
return this._source;
}
/**
* Sets the entry summary.
* <p>
*
* @param summary the entry summary, <b>null</b> if none.
*
*/
public void setSummary(Content summary) {
_summary = summary;
public void setSummary(final Content summary) {
this._summary = summary;
}
/**
* Returns the entry summary.
* <p>
*
* @return the entry summary, <b>null</b> if none.
*
*/
public Content getSummary() {
return _summary;
return this._summary;
}
/**
* Sets the entry title.
* <p>
*
* @param title the entry title, <b>null</b> if none.
*
*/
public void setTitle(String title) {
if (_title == null) {
_title = new Content();
public void setTitle(final String title) {
if (this._title == null) {
this._title = new Content();
}
_title.setValue(title);
this._title.setValue(title);
}
/**
* Returns the entry title.
* <p>
*
* @return the entry title, <b>null</b> if none.
*
*/
public String getTitle() {
if (_title != null) {
return _title.getValue();
if (this._title != null) {
return this._title.getValue();
}
return null;
@ -443,95 +483,105 @@ public class Entry implements Cloneable, Serializable, Extendable {
/**
* Sets the entry title as a text construct.
* <p>
*
* @param title the entry title, <b>null</b> if none.
*
*/
public void setTitleEx(Content title) {
_title = title;
public void setTitleEx(final Content title) {
this._title = title;
}
/**
* Returns the entry title as a text construct.
* <p>
*
* @return the entry title, <b>null</b> if none.
*
*/
public Content getTitleEx() {
return _title;
return this._title;
}
/**
* Set the updated
* <p>
*
* @param updated The updated to set.
* @since Atom 1.0
*/
public void setUpdated(Date updated) {
_updated = updated == null? null : new Date(updated.getTime());
public void setUpdated(final Date updated) {
this._updated = updated == null ? null : new Date(updated.getTime());
}
/**
* Returns the updated
* <p>
*
* @return Returns the updated.
* @since Atom 1.0
*/
public Date getUpdated() {
return _updated == null ? null : new Date(_updated.getTime());
return this._updated == null ? null : new Date(this._updated.getTime());
}
/**
* Set the xmlBase
* <p>
*
* @param xmlBase The xmlBase to set.
* @since Atom 1.0
*/
public void setXmlBase(String xmlBase) {
_xmlBase = xmlBase;
public void setXmlBase(final String xmlBase) {
this._xmlBase = xmlBase;
}
/**
* Returns the xmlBase
* <p>
*
* @return Returns the xmlBase.
* @since Atom 1.0
*/
public String getXmlBase() {
return _xmlBase;
return this._xmlBase;
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
public boolean equals(final Object other) {
if (other == null) {
return false;
}
if(!(other instanceof Entry)){
if (!(other instanceof Entry)) {
return false;
}
// can't use foreign markup in equals, due to JDOM equals impl
List<Element> fm = getForeignMarkup();
final List<Element> fm = getForeignMarkup();
setForeignMarkup(((Entry) other).getForeignMarkup());
boolean ret = _objBean.equals(other);
final boolean ret = this._objBean.equals(other);
// restore foreign markup
setForeignMarkup(fm);
@ -543,29 +593,30 @@ public class Entry implements Cloneable, Serializable, Extendable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
public Link findRelatedLink(String relation){
for(Link l : this._otherLinks){
if(relation.equals(l.getRel())){
public Link findRelatedLink(final String relation) {
for (final Link l : this._otherLinks) {
if (relation.equals(l.getRel())) {
return l;
}
}

View file

@ -16,19 +16,20 @@
*/
package com.sun.syndication.feed.atom;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.feed.module.impl.ModuleUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.feed.module.impl.ModuleUtils;
/**
* Bean for Atom feeds.
* <p>
* It handles Atom feeds version 0.3 without loosing any feed information.
* <p>
*
* @author Alejandro Abdelnur
* @author Dave Johnson (updated for Atom 1.0)
*/
@ -63,465 +64,520 @@ public class Feed extends WireFeed {
}
/**
* Feed Constructor. All properties, except the type, are set to <b>null</b>.
* Feed Constructor. All properties, except the type, are set to
* <b>null</b>.
* <p>
*
* @param type the type of the Atom feed.
*
*/
public Feed(String type) {
public Feed(final String type) {
super(type);
}
/**
* Returns the feed language (Atom 0.3 only)
* <p>
*
* @return the feed language, <b>null</b> if none.
*
*/
public String getLanguage() {
return _language;
return this._language;
}
/**
* Sets the feed language (Atom 0.3 only)
* <p>
*
* @param language the feed language to set, <b>null</b> if none.
*
*/
public void setLanguage(String language) {
_language = language;
public void setLanguage(final String language) {
this._language = language;
}
/**
* Returns the feed title.
* <p>
*
* @return the feed title, <b>null</b> if none.
*
*/
public String getTitle() {
if (_title != null) return _title.getValue();
if (this._title != null) {
return this._title.getValue();
}
return null;
}
/**
* Sets the feed title.
* <p>
*
* @param title the feed title to set, <b>null</b> if none.
*
*/
public void setTitle(String title) {
if (_title == null) _title = new Content();
_title.setValue(title);
public void setTitle(final String title) {
if (this._title == null) {
this._title = new Content();
}
this._title.setValue(title);
}
/**
* Returns the feed title.
* <p>
*
* @return the feed title, <b>null</b> if none.
*
*/
public Content getTitleEx() {
return _title;
return this._title;
}
/**
* Sets the feed title.
* <p>
*
* @param title the feed title to set, <b>null</b> if none.
*
*/
public void setTitleEx(Content title) {
_title = title;
public void setTitleEx(final Content title) {
this._title = title;
}
/**
* Returns the feed alternate links.
* <p>
* @return a list of Link elements with the feed alternate links,
* an empty list if none.
*
* @return a list of Link elements with the feed alternate links, an empty
* list if none.
*/
public List<Link> getAlternateLinks() {
return (_alternateLinks==null) ? (_alternateLinks=new ArrayList<Link>()) : _alternateLinks;
return this._alternateLinks == null ? (this._alternateLinks = new ArrayList<Link>()) : this._alternateLinks;
}
/**
* Sets the feed alternate links.
* <p>
* @param alternateLinks the list of Link elements with the feed alternate links to set,
* an empty list or <b>null</b> if none.
*
* @param alternateLinks the list of Link elements with the feed alternate
* links to set, an empty list or <b>null</b> if none.
*/
public void setAlternateLinks(List<Link> alternateLinks) {
_alternateLinks = alternateLinks;
public void setAlternateLinks(final List<Link> alternateLinks) {
this._alternateLinks = alternateLinks;
}
/**
* Returns the feed other links (non-alternate ones).
* <p>
* @return a list of Link elements with the feed other links (non-alternate ones),
* an empty list if none.
*
* @return a list of Link elements with the feed other links (non-alternate
* ones), an empty list if none.
*/
public List<Link> getOtherLinks() {
return (_otherLinks==null) ? (_otherLinks=new ArrayList<Link>()) : _otherLinks;
return this._otherLinks == null ? (this._otherLinks = new ArrayList<Link>()) : this._otherLinks;
}
/**
* Sets the feed other links (non-alternate ones).
* <p>
* @param otherLinks the list of Link elements with the feed other links (non-alternate ones) to set,
* an empty list or <b>null</b> if none.
*
* @param otherLinks the list of Link elements with the feed other links
* (non-alternate ones) to set, an empty list or <b>null</b> if
* none.
*/
public void setOtherLinks(List<Link> otherLinks) {
_otherLinks = otherLinks;
public void setOtherLinks(final List<Link> otherLinks) {
this._otherLinks = otherLinks;
}
/**
* Returns the feed author.
* <p>
*
* @return the feed author, <b>null</b> if none.
*
*/
public List<Person> getAuthors() {
return (_authors==null) ? (_authors=new ArrayList<Person>()) : _authors;
return this._authors == null ? (this._authors = new ArrayList<Person>()) : this._authors;
}
/**
* Sets the feed author.
* <p>
*
* @param authors the feed author to set, <b>null</b> if none.
*
*/
public void setAuthors(List<Person> authors) {
_authors = authors;
public void setAuthors(final List<Person> authors) {
this._authors = authors;
}
/**
* Returns the feed contributors.
* <p>
* @return a list of Person elements with the feed contributors,
* an empty list if none.
*
* @return a list of Person elements with the feed contributors, an empty
* list if none.
*
*/
public List<Person> getContributors() {
return (_contributors==null) ? (_contributors=new ArrayList<Person>()) : _contributors;
return this._contributors == null ? (this._contributors = new ArrayList<Person>()) : this._contributors;
}
/**
* Sets the feed contributors.
* <p>
* @param contributors the list of Person elements with the feed contributors to set,
* an empty list or <b>null</b> if none.
*
* @param contributors the list of Person elements with the feed
* contributors to set, an empty list or <b>null</b> if none.
*
*/
public void setContributors(List<Person> contributors) {
_contributors = contributors;
public void setContributors(final List<Person> contributors) {
this._contributors = contributors;
}
/**
* Returns the feed tag line (Atom 0.3, maps to {@link #getSubtitle()}).
* <p>
*
* @return the feed tag line, <b>null</b> if none.
*/
public Content getTagline() {
return _subtitle;
return this._subtitle;
}
/**
* Sets the feed tagline (Atom 0.3, maps to {@link #setSubtitle(com.sun.syndication.feed.atom.Content)}).
* Sets the feed tagline (Atom 0.3, maps to
* {@link #setSubtitle(com.sun.syndication.feed.atom.Content)}).
* <p>
*
* @param tagline the feed tagline to set, <b>null</b> if none.
*/
public void setTagline(Content tagline) {
_subtitle = tagline;
public void setTagline(final Content tagline) {
this._subtitle = tagline;
}
/**
* Returns the feed ID.
* <p>
*
* @return the feed ID, <b>null</b> if none.
*
*/
public String getId() {
return _id;
return this._id;
}
/**
* Sets the feed ID.
* <p>
*
* @param id the feed ID to set, <b>null</b> if none.
*
*/
public void setId(String id) {
_id = id;
public void setId(final String id) {
this._id = id;
}
/**
* Returns the feed generator.
* <p>
*
* @return the feed generator, <b>null</b> if none.
*
*/
public Generator getGenerator() {
return _generator;
return this._generator;
}
/**
* Sets the feed generator.
* <p>
*
* @param generator the feed generator to set, <b>null</b> if none.
*
*/
public void setGenerator(Generator generator) {
_generator = generator;
public void setGenerator(final Generator generator) {
this._generator = generator;
}
/**
* Returns the feed copyright (Atom 0.3, maps to {@link #getRights()}).
* <p>
*
* @return the feed copyright, <b>null</b> if none.
*/
public String getCopyright() {
return _rights;
return this._rights;
}
/**
* Sets the feed copyright (Atom 0.3, maps to {@link #setRights(java.lang.String)}).
* Sets the feed copyright (Atom 0.3, maps to
* {@link #setRights(java.lang.String)}).
* <p>
*
* @param copyright the feed copyright to set, <b>null</b> if none.
*/
public void setCopyright(String copyright) {
_rights = copyright;
public void setCopyright(final String copyright) {
this._rights = copyright;
}
/**
* Returns the feed info (Atom 0.3 only)
* <p>
*
* @return the feed info, <b>null</b> if none.
*/
public Content getInfo() {
return _info;
return this._info;
}
/**
* Sets the feed info (Atom 0.3 only)
* <p>
*
* @param info the feed info to set, <b>null</b> if none.
*/
public void setInfo(Content info) {
_info = info;
public void setInfo(final Content info) {
this._info = info;
}
/**
* Returns the feed modified date (Atom 0.3, maps to {@link #getUpdated()}).
* <p>
*
* @return the feed modified date, <b>null</b> if none.
*/
public Date getModified() {
return _updated;
return this._updated;
}
/**
* Sets the feed modified date (Atom 0.3, maps to {@link #setUpdated(java.util.Date)}).
* Sets the feed modified date (Atom 0.3, maps to
* {@link #setUpdated(java.util.Date)}).
* <p>
*
* @param modified the feed modified date to set, <b>null</b> if none.
*/
public void setModified(Date modified) {
_updated = modified;
public void setModified(final Date modified) {
this._updated = modified;
}
/**
* Returns the feed entries.
* <p>
* @return a list of Entry elements with the feed entries,
* an empty list if none.
*
* @return a list of Entry elements with the feed entries, an empty list if
* none.
*
*/
public List<Entry> getEntries() {
return (_entries==null) ? (_entries=new ArrayList<Entry>()) : _entries;
return this._entries == null ? (this._entries = new ArrayList<Entry>()) : this._entries;
}
/**
* Sets the feed entries.
* <p>
*
* @param entries the list of Entry elements with the feed entries to set,
* an empty list or <b>null</b> if none.
*
*/
public void setEntries(List<Entry> entries) {
_entries = entries;
public void setEntries(final List<Entry> entries) {
this._entries = entries;
}
/**
* Returns the feed modules.
* <p>
* @return a list of ModuleImpl elements with the feed modules,
* an empty list if none.
*
* @return a list of ModuleImpl elements with the feed modules, an empty
* list if none.
*
*/
@Override
public List<Module> getModules() {
return (_modules==null) ? (_modules=new ArrayList<Module>()) : _modules;
return this._modules == null ? (this._modules = new ArrayList<Module>()) : this._modules;
}
/**
* Sets the feed moduless.
* <p>
* @param modules the list of ModuleImpl elements with the feed moduless to set,
* an empty list or <b>null</b> if none.
*
* @param modules the list of ModuleImpl elements with the feed moduless to
* set, an empty list or <b>null</b> if none.
*
*/
@Override
public void setModules(List<Module> modules) {
_modules = modules;
public void setModules(final List<Module> modules) {
this._modules = modules;
}
/**
* Returns the module identified by a given URI.
* <p>
*
* @param uri the URI of the ModuleImpl.
* @return The module with the given URI, <b>null</b> if none.
*/
@Override
public Module getModule(String uri) {
return ModuleUtils.getModule(_modules,uri);
public Module getModule(final String uri) {
return ModuleUtils.getModule(this._modules, uri);
}
/**
* Returns the categories
* <p>
*
* @return Returns the categories.
* @since Atom 1.0
*/
public List<Category> getCategories() {
return (_categories==null) ? (_categories=new ArrayList<Category>()) : _categories;
return this._categories == null ? (this._categories = new ArrayList<Category>()) : this._categories;
}
/**
* Set the categories
* <p>
*
* @param categories The categories to set.
* @since Atom 1.0
*/
public void setCategories(List<Category> categories) {
_categories = categories;
public void setCategories(final List<Category> categories) {
this._categories = categories;
}
/**
* Returns the icon
* <p>
*
* @return Returns the icon.
* @since Atom 1.0
*/
public String getIcon() {
return _icon;
return this._icon;
}
/**
* Set the icon
* <p>
*
* @param icon The icon to set.
* @since Atom 1.0
*/
public void setIcon(String icon) {
_icon = icon;
public void setIcon(final String icon) {
this._icon = icon;
}
/**
* Returns the logo
* <p>
*
* @return Returns the logo.
* @since Atom 1.0
*/
public String getLogo() {
return _logo;
return this._logo;
}
/**
* Set the logo
* <p>
*
* @param logo The logo to set.
* @since Atom 1.0
*/
public void setLogo(String logo) {
_logo = logo;
public void setLogo(final String logo) {
this._logo = logo;
}
/**
* Returns the rights
* <p>
*
* @return Returns the rights.
* @since Atom 1.0
*/
public String getRights() {
return _rights;
return this._rights;
}
/**
* Set the rights
* <p>
*
* @param rights The rights to set.
* @since Atom 1.0
*/
public void setRights(String rights) {
_rights = rights;
public void setRights(final String rights) {
this._rights = rights;
}
/**
* Returns the subtitle
* <p>
*
* @return Returns the subtitle.
* @since Atom 1.0
*/
public Content getSubtitle() {
return _subtitle;
return this._subtitle;
}
/**
* Set the subtitle
* <p>
*
* @param subtitle The subtitle to set.
* @since Atom 1.0
*/
public void setSubtitle(Content subtitle) {
_subtitle = subtitle;
public void setSubtitle(final Content subtitle) {
this._subtitle = subtitle;
}
/**
* Returns the updated
* <p>
*
* @return Returns the updated.
* @since Atom 1.0
*/
public Date getUpdated() {
return _updated;
return this._updated;
}
/**
* Set the updated
* <p>
*
* @param updated The updated to set.
* @since Atom 1.0
*/
public void setUpdated(Date updated) {
_updated = updated;
public void setUpdated(final Date updated) {
this._updated = updated;
}
/**
* Returns the xmlBase
* <p>
*
* @return Returns the xmlBase.
* @since Atom 1.0
*/
public String getXmlBase() {
return _xmlBase;
return this._xmlBase;
}
/**
* Set the xmlBase
* <p>
*
* @param xmlBase The xmlBase to set.
* @since Atom 1.0
*/
public void setXmlBase(String xmlBase) {
_xmlBase = xmlBase;
public void setXmlBase(final String xmlBase) {
this._xmlBase = xmlBase;
}
}

View file

@ -16,18 +16,19 @@
*/
package com.sun.syndication.feed.atom;
import com.sun.syndication.feed.impl.ObjectBean;
import java.io.Serializable;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Bean for the generator element of Atom feeds.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class Generator implements Cloneable,Serializable {
private ObjectBean _objBean;
public class Generator implements Cloneable, Serializable {
private final ObjectBean _objBean;
private String _url;
private String _version;
private String _value;
@ -38,34 +39,38 @@ public class Generator implements Cloneable,Serializable {
*
*/
public Generator() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
if(!(other instanceof Generator)){
public boolean equals(final Object other) {
if (!(other instanceof Generator)) {
return false;
}
return _objBean.equals(other);
return this._objBean.equals(other);
}
/**
@ -73,83 +78,91 @@ public class Generator implements Cloneable,Serializable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the generator URL.
* <p>
*
* @return the generator URL, <b>null</b> if none.
*
*/
public String getUrl() {
return _url;
return this._url;
}
/**
* Sets the generator URL.
* <p>
*
* @param url the generator URL, <b>null</b> if none.
*
*/
public void setUrl(String url) {
_url = url;
public void setUrl(final String url) {
this._url = url;
}
/**
* Returns the generator version.
* <p>
*
* @return the generator version, <b>null</b> if none.
*
*/
public String getVersion() {
return _version;
return this._version;
}
/**
* Sets the generator version.
* <p>
*
* @param version the generator version, <b>null</b> if none.
*
*/
public void setVersion(String version) {
_version = version;
public void setVersion(final String version) {
this._version = version;
}
/**
* Returns the generator value.
* <p>
*
* @return the generator value, <b>null</b> if none.
*
*/
public String getValue() {
return _value;
return this._value;
}
/**
* Sets the generator value.
* <p>
*
* @param value the generator value, <b>null</b> if none.
*
*/
public void setValue(String value) {
_value = value;
public void setValue(final String value) {
this._value = value;
}
}

View file

@ -16,19 +16,20 @@
*/
package com.sun.syndication.feed.atom;
import com.sun.syndication.feed.impl.ObjectBean;
import java.io.Serializable;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Bean for link elements of Atom feeds.
* <p>
*
* @author Alejandro Abdelnur
* @author Dave Johnson (updated for Atom 1.0)
*/
public class Link implements Cloneable,Serializable {
public class Link implements Cloneable, Serializable {
private ObjectBean _objBean;
private final ObjectBean _objBean;
private String _href;
private String _hrefResolved;
@ -44,31 +45,35 @@ public class Link implements Cloneable,Serializable {
*
*/
public Link() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
return _objBean.equals(other);
public boolean equals(final Object other) {
return this._objBean.equals(other);
}
/**
@ -76,149 +81,163 @@ public class Link implements Cloneable,Serializable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the link rel.
* <p>
*
* @return the link rel, <b>null</b> if none.
*
*/
public String getRel() {
return _rel;
return this._rel;
}
/**
* Sets the link rel.
* <p>
*
* @param rel the link rel,, <b>null</b> if none.
*
*/
public void setRel(String rel) {
//TODO add check, ask P@ about the check
_rel = rel;
public void setRel(final String rel) {
// TODO add check, ask P@ about the check
this._rel = rel;
}
/**
* Returns the link type.
* <p>
*
* @return the link type, <b>null</b> if none.
*
*/
public String getType() {
return _type;
return this._type;
}
/**
* Sets the link type.
* <p>
*
* @param type the link type, <b>null</b> if none.
*
*/
public void setType(String type) {
_type = type;
public void setType(final String type) {
this._type = type;
}
/**
* Returns the link href.
* <p>
*
* @return the link href, <b>null</b> if none.
*
*/
public String getHref() {
return _href;
return this._href;
}
/**
* Sets the link href.
* <p>
*
* @param href the link href, <b>null</b> if none.
*
*/
public void setHref(String href) {
_href = href;
public void setHref(final String href) {
this._href = href;
}
public void setHrefResolved(String hrefResolved) {
_hrefResolved = hrefResolved;
public void setHrefResolved(final String hrefResolved) {
this._hrefResolved = hrefResolved;
}
public String getHrefResolved() {
return _hrefResolved != null ? _hrefResolved : _href;
return this._hrefResolved != null ? this._hrefResolved : this._href;
}
/**
* Returns the link title.
* <p>
*
* @return the link title, <b>null</b> if none.
*
*/
public String getTitle() {
return _title;
return this._title;
}
/**
* Sets the link title.
* <p>
*
* @param title the link title, <b>null</b> if none.
*
*/
public void setTitle(String title) {
_title = title;
public void setTitle(final String title) {
this._title = title;
}
/**
* Returns the hreflang
* <p>
*
* @return Returns the hreflang.
* @since Atom 1.0
*/
public String getHreflang() {
return _hreflang;
return this._hreflang;
}
/**
* Set the hreflang
* <p>
*
* @param hreflang The hreflang to set.
* @since Atom 1.0
*/
public void setHreflang(String hreflang) {
_hreflang = hreflang;
public void setHreflang(final String hreflang) {
this._hreflang = hreflang;
}
/**
* Returns the length
* <p>
*
* @return Returns the length.
*/
public long getLength() {
return _length;
return this._length;
}
/**
* Set the length
* <p>
*
* @param length The length to set.
*/
public void setLength(long length) {
_length = length;
public void setLength(final long length) {
this._length = length;
}
}

View file

@ -16,25 +16,25 @@
*/
package com.sun.syndication.feed.atom;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.sun.syndication.feed.impl.ObjectBean;
import com.sun.syndication.feed.module.Extendable;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.feed.module.impl.ModuleUtils;
import java.io.Serializable;
import java.util.List;
import java.util.ArrayList;
/**
* Bean for person elements of Atom feeds.
* <p>
*
* @author Alejandro Abdelnur
* @author Dave Johnson (updated for Atom 1.0)
*/
public class Person implements Cloneable,Serializable, Extendable
{
public class Person implements Cloneable, Serializable, Extendable {
private ObjectBean _objBean;
private final ObjectBean _objBean;
private String _name;
private String _uri; // since Atom 1.0 (was called url)
@ -48,31 +48,35 @@ public class Person implements Cloneable,Serializable, Extendable
*
*/
public Person() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
return _objBean.equals(other);
public boolean equals(final Object other) {
return this._objBean.equals(other);
}
/**
@ -80,141 +84,157 @@ public class Person implements Cloneable,Serializable, Extendable
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the person name.
* <p>
*
* @return the person name, <b>null</b> if none.
*
*/
public String getName() {
return _name;
return this._name;
}
/**
* Sets the personname.
* <p>
*
* @param name the person name, <b>null</b> if none.
*
*/
public void setName(String name) {
_name = name;
public void setName(final String name) {
this._name = name;
}
/**
* Returns the person URL (same as {@link #getUri()})
* <p>
*
* @return the person URL, <b>null</b> if none.
*/
public String getUrl() {
return _uri;
return this._uri;
}
/**
* Sets the person URL (same as {@link #setUri(java.lang.String)})
* <p>
*
* @param url the person URL, <b>null</b> if none.
*/
public void setUrl(String url) {
_uri = url;
public void setUrl(final String url) {
this._uri = url;
}
public void setUriResolved(String uriResolved) {
_uriResolved = uriResolved;
public void setUriResolved(final String uriResolved) {
this._uriResolved = uriResolved;
}
public String getUriResolved(String resolveURI) {
return _uriResolved != null ? _uriResolved : _uri;
public String getUriResolved(final String resolveURI) {
return this._uriResolved != null ? this._uriResolved : this._uri;
}
/**
* Returns the person email.
* <p>
*
* @return the person email, <b>null</b> if none.
*
*/
public String getEmail() {
return _email;
return this._email;
}
/**
* Sets the person email.
* <p>
*
* @param email the person email, <b>null</b> if none.
*
*/
public void setEmail(String email) {
_email = email;
public void setEmail(final String email) {
this._email = email;
}
/**
* Returns the uri
* <p>
*
* @return Returns the uri.
* @since Atom 1.0
*/
public String getUri() {
return _uri;
return this._uri;
}
/**
* Set the uri
* <p>
*
* @param uri The uri to set.
* @since Atom 1.0
*/
public void setUri(String uri) {
_uri = uri;
public void setUri(final String uri) {
this._uri = uri;
}
/**
* Returns the entry modules.
* <p>
* @return a list of ModuleImpl elements with the entry modules,
* an emtpy list if none.
*
* @return a list of ModuleImpl elements with the entry modules, an emtpy
* list if none.
*
*/
@Override
public List<Module> getModules() {
return (_modules==null) ? (_modules=new ArrayList<Module>()) : _modules;
return this._modules == null ? (this._modules = new ArrayList<Module>()) : this._modules;
}
/**
* Sets the entry modules.
* <p>
* @param modules the list of ModuleImpl elements with the entry modules to set,
* an empty list or <b>null</b> if none.
*
* @param modules the list of ModuleImpl elements with the entry modules to
* set, an empty list or <b>null</b> if none.
*
*/
public void setModules(List<Module> modules) {
_modules = modules;
@Override
public void setModules(final List<Module> modules) {
this._modules = modules;
}
/**
* Returns the module identified by a given URI.
* <p>
*
* @param uri the URI of the ModuleImpl.
* @return The module with the given URI, <b>null</b> if none.
*/
public Module getModule(String uri) {
return ModuleUtils.getModule(_modules,uri);
@Override
public Module getModule(final String uri) {
return ModuleUtils.getModule(this._modules, uri);
}
}

View file

@ -21,13 +21,21 @@ import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Obtains all property descriptors from a bean (interface or implementation).
* <p>
* The java.beans.Introspector does not process the interfaces hierarchy chain, this one does.
* The java.beans.Introspector does not process the interfaces hierarchy chain,
* this one does.
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -35,21 +43,21 @@ public class BeanIntrospector {
private static final Map _introspected = new HashMap();
public static synchronized PropertyDescriptor[] getPropertyDescriptors(Class klass) throws IntrospectionException {
public static synchronized PropertyDescriptor[] getPropertyDescriptors(final Class klass) throws IntrospectionException {
PropertyDescriptor[] descriptors = (PropertyDescriptor[]) _introspected.get(klass);
if (descriptors==null) {
if (descriptors == null) {
descriptors = getPDs(klass);
_introspected.put(klass,descriptors);
_introspected.put(klass, descriptors);
}
return descriptors;
}
private static PropertyDescriptor[] getPDs(Class klass) throws IntrospectionException {
Method[] methods = klass.getMethods();
Map getters = getPDs(methods,false);
Map setters = getPDs(methods,true);
List pds = merge(getters,setters);
PropertyDescriptor[] array = new PropertyDescriptor[pds.size()];
private static PropertyDescriptor[] getPDs(final Class klass) throws IntrospectionException {
final Method[] methods = klass.getMethods();
final Map getters = getPDs(methods, false);
final Map setters = getPDs(methods, true);
final List pds = merge(getters, setters);
final PropertyDescriptor[] array = new PropertyDescriptor[pds.size()];
pds.toArray(array);
return array;
}
@ -58,63 +66,56 @@ public class BeanIntrospector {
private static final String GETTER = "get";
private static final String BOOLEAN_GETTER = "is";
private static Map getPDs(Method[] methods,boolean setters) throws IntrospectionException {
Map pds = new HashMap();
for (int i=0;i<methods.length;i++) {
private static Map getPDs(final Method[] methods, final boolean setters) throws IntrospectionException {
final Map pds = new HashMap();
for (final Method method : methods) {
String pName = null;
PropertyDescriptor pDescriptor = null;
if ((methods[i].getModifiers()&Modifier.PUBLIC)!=0) {
if ((method.getModifiers() & Modifier.PUBLIC) != 0) {
if (setters) {
if (methods[i].getName().startsWith(SETTER) &&
methods[i].getReturnType()==void.class && methods[i].getParameterTypes().length==1) {
pName = Introspector.decapitalize(methods[i].getName().substring(3));
pDescriptor = new PropertyDescriptor(pName,null,methods[i]);
if (method.getName().startsWith(SETTER) && method.getReturnType() == void.class && method.getParameterTypes().length == 1) {
pName = Introspector.decapitalize(method.getName().substring(3));
pDescriptor = new PropertyDescriptor(pName, null, method);
}
}
else {
if (methods[i].getName().startsWith(GETTER) &&
methods[i].getReturnType()!=void.class && methods[i].getParameterTypes().length==0) {
pName = Introspector.decapitalize(methods[i].getName().substring(3));
pDescriptor = new PropertyDescriptor(pName,methods[i],null);
}
else
if (methods[i].getName().startsWith(BOOLEAN_GETTER) &&
methods[i].getReturnType()==boolean.class && methods[i].getParameterTypes().length==0) {
pName = Introspector.decapitalize(methods[i].getName().substring(2));
pDescriptor = new PropertyDescriptor(pName,methods[i],null);
} else {
if (method.getName().startsWith(GETTER) && method.getReturnType() != void.class && method.getParameterTypes().length == 0) {
pName = Introspector.decapitalize(method.getName().substring(3));
pDescriptor = new PropertyDescriptor(pName, method, null);
} else if (method.getName().startsWith(BOOLEAN_GETTER) && method.getReturnType() == boolean.class && method.getParameterTypes().length == 0) {
pName = Introspector.decapitalize(method.getName().substring(2));
pDescriptor = new PropertyDescriptor(pName, method, null);
}
}
}
if (pName!=null) {
pds.put(pName,pDescriptor);
if (pName != null) {
pds.put(pName, pDescriptor);
}
}
return pds;
}
private static List merge(Map getters,Map setters) throws IntrospectionException {
List props = new ArrayList();
Set processedProps = new HashSet();
Iterator gs = getters.keySet().iterator();
private static List merge(final Map getters, final Map setters) throws IntrospectionException {
final List props = new ArrayList();
final Set processedProps = new HashSet();
final Iterator gs = getters.keySet().iterator();
while (gs.hasNext()) {
String name = (String) gs.next();
PropertyDescriptor getter = (PropertyDescriptor) getters.get(name);
PropertyDescriptor setter = (PropertyDescriptor) setters.get(name);
if (setter!=null) {
final String name = (String) gs.next();
final PropertyDescriptor getter = (PropertyDescriptor) getters.get(name);
final PropertyDescriptor setter = (PropertyDescriptor) setters.get(name);
if (setter != null) {
processedProps.add(name);
PropertyDescriptor prop = new PropertyDescriptor(name,getter.getReadMethod(),setter.getWriteMethod());
final PropertyDescriptor prop = new PropertyDescriptor(name, getter.getReadMethod(), setter.getWriteMethod());
props.add(prop);
}
else {
} else {
props.add(getter);
}
}
Set writeOnlyProps = new HashSet(setters.keySet());
final Set writeOnlyProps = new HashSet(setters.keySet());
writeOnlyProps.removeAll(processedProps);
Iterator ss = writeOnlyProps.iterator();
final Iterator ss = writeOnlyProps.iterator();
while (ss.hasNext()) {
String name = (String) ss.next();
PropertyDescriptor setter = (PropertyDescriptor) setters.get(name);
final String name = (String) ss.next();
final PropertyDescriptor setter = (PropertyDescriptor) setters.get(name);
props.add(setter);
}
return props;

View file

@ -21,14 +21,22 @@ import java.io.Serializable;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.*;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* Provides deep <b>Bean</b> clonning support.
* <p>
* It works on all read/write properties, recursively. It support all primitive types, Strings, Collections,
* Cloneable objects and multi-dimensional arrays of any of them.
* It works on all read/write properties, recursively. It support all primitive
* types, Strings, Collections, Cloneable objects and multi-dimensional arrays
* of any of them.
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -37,7 +45,7 @@ public class CloneableBean implements Serializable, Cloneable {
private static final Class[] NO_PARAMS_DEF = new Class[0];
private static final Object[] NO_PARAMS = new Object[0];
private Object _obj;
private final Object _obj;
private Set _ignoreProperties;
/**
@ -48,7 +56,7 @@ public class CloneableBean implements Serializable, Cloneable {
*
*/
protected CloneableBean() {
_obj = this;
this._obj = this;
}
/**
@ -71,43 +79,50 @@ public class CloneableBean implements Serializable, Cloneable {
* }
* </code>
* <p>
*
* @param obj object bean to clone.
*
*/
public CloneableBean(Object obj) {
this(obj,null);
public CloneableBean(final Object obj) {
this(obj, null);
}
/**
* Creates a CloneableBean to be used in a delegation pattern.
* <p>
* The property names in the ignoreProperties Set will not be copied into
* the cloned instance. This is useful for cases where the Bean has convenience
* properties (properties that are actually references to other properties or
* properties of properties). For example SyndFeed and SyndEntry beans have
* convenience properties, publishedDate, author, copyright and categories all
* of them mapped to properties in the DC Module.
* the cloned instance. This is useful for cases where the Bean has
* convenience properties (properties that are actually references to other
* properties or properties of properties). For example SyndFeed and
* SyndEntry beans have convenience properties, publishedDate, author,
* copyright and categories all of them mapped to properties in the DC
* Module.
* <p>
*
* @param obj object bean to clone.
* @param ignoreProperties properties to ignore when cloning.
*
*/
public CloneableBean(Object obj,Set ignoreProperties) {
_obj = obj;
_ignoreProperties = (ignoreProperties!=null) ? ignoreProperties : Collections.EMPTY_SET;
public CloneableBean(final Object obj, final Set ignoreProperties) {
this._obj = obj;
this._ignoreProperties = ignoreProperties != null ? ignoreProperties : Collections.EMPTY_SET;
}
/**
* Makes a deep bean clone of the object.
* <p>
* To be used by classes extending CloneableBean. Although it works also for classes using
* CloneableBean in a delegation pattern, for correctness those classes should use the
* To be used by classes extending CloneableBean. Although it works also for
* classes using CloneableBean in a delegation pattern, for correctness
* those classes should use the
*
* @see #beanClone() beanClone method.
* <p>
* @return a clone of the object bean.
* @throws CloneNotSupportedException thrown if the object bean could not be cloned.
* @throws CloneNotSupportedException thrown if the object bean could not be
* cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return beanClone();
}
@ -116,111 +131,122 @@ public class CloneableBean implements Serializable, Cloneable {
* Makes a deep bean clone of the object passed in the constructor.
* <p>
* To be used by classes using CloneableBean in a delegation pattern,
*
* @see #CloneableBean(Object) constructor.
*
* @return a clone of the object bean.
* @throws CloneNotSupportedException thrown if the object bean could not be cloned.
* @throws CloneNotSupportedException thrown if the object bean could not be
* cloned.
*
*/
public Object beanClone() throws CloneNotSupportedException {
Object clonedBean;
try {
clonedBean = _obj.getClass().newInstance();
PropertyDescriptor[] pds = BeanIntrospector.getPropertyDescriptors(_obj.getClass());
if (pds!=null) {
for (int i=0;i<pds.length;i++) {
Method pReadMethod = pds[i].getReadMethod();
Method pWriteMethod = pds[i].getWriteMethod();
if (pReadMethod!=null && pWriteMethod!=null && // ensure it has getter and setter methods
!_ignoreProperties.contains(pds[i].getName()) && // is not in the list of properties to ignore
pReadMethod.getDeclaringClass()!=Object.class && // filter Object.class getter methods
pReadMethod.getParameterTypes().length==0) { // filter getter methods that take parameters
Object value = pReadMethod.invoke(_obj,NO_PARAMS);
if (value!=null) {
clonedBean = this._obj.getClass().newInstance();
final PropertyDescriptor[] pds = BeanIntrospector.getPropertyDescriptors(this._obj.getClass());
if (pds != null) {
for (int i = 0; i < pds.length; i++) {
final Method pReadMethod = pds[i].getReadMethod();
final Method pWriteMethod = pds[i].getWriteMethod();
if (pReadMethod != null && pWriteMethod != null && // ensure
// it has
// getter
// and
// setter
// methods
!this._ignoreProperties.contains(pds[i].getName()) && // is
// not
// in
// the
// list
// of
// properties
// to
// ignore
pReadMethod.getDeclaringClass() != Object.class && // filter
// Object.class
// getter
// methods
pReadMethod.getParameterTypes().length == 0) { // filter
// getter
// methods
// that
// take
// parameters
Object value = pReadMethod.invoke(this._obj, NO_PARAMS);
if (value != null) {
value = doClone(value);
pWriteMethod.invoke(clonedBean,new Object[]{value});
pWriteMethod.invoke(clonedBean, new Object[] { value });
}
}
}
}
}
catch (CloneNotSupportedException cnsEx) {
} catch (final CloneNotSupportedException cnsEx) {
throw cnsEx;
}
catch (Exception ex) {
} catch (final Exception ex) {
System.out.println(ex);
ex.printStackTrace(System.out);
throw new CloneNotSupportedException("Cannot clone a "+_obj.getClass()+" object");
throw new CloneNotSupportedException("Cannot clone a " + this._obj.getClass() + " object");
}
return clonedBean;
}
private Object doClone(Object value) throws Exception {
if (value!=null) {
Class vClass = value.getClass();
if (value != null) {
final Class vClass = value.getClass();
if (vClass.isArray()) {
value = cloneArray(value);
}
else
if (value instanceof Collection) {
value = cloneCollection((Collection)value);
}
else
if (value instanceof Map) {
value = cloneMap((Map)value);
}
else
if (isBasicType(vClass)) {
} else if (value instanceof Collection) {
value = cloneCollection((Collection) value);
} else if (value instanceof Map) {
value = cloneMap((Map) value);
} else if (isBasicType(vClass)) {
// NOTHING SPECIAL TO DO HERE, THEY ARE INMUTABLE
}
else
if (value instanceof Cloneable) {
Method cloneMethod = vClass.getMethod("clone",NO_PARAMS_DEF);
} else if (value instanceof Cloneable) {
final Method cloneMethod = vClass.getMethod("clone", NO_PARAMS_DEF);
if (Modifier.isPublic(cloneMethod.getModifiers())) {
value = cloneMethod.invoke(value,NO_PARAMS);
value = cloneMethod.invoke(value, NO_PARAMS);
} else {
throw new CloneNotSupportedException("Cannot clone a " + value.getClass() + " object, clone() is not public");
}
else {
throw new CloneNotSupportedException("Cannot clone a "+value.getClass()+" object, clone() is not public");
}
}
else {
throw new CloneNotSupportedException("Cannot clone a "+vClass.getName()+" object");
} else {
throw new CloneNotSupportedException("Cannot clone a " + vClass.getName() + " object");
}
}
return value;
}
private Object cloneArray(Object array) throws Exception {
Class elementClass = array.getClass().getComponentType();
int length = Array.getLength(array);
Object newArray = Array.newInstance(elementClass,length);
for (int i=0;i<length;i++) {
Object element = doClone(Array.get(array,i));
Array.set(newArray,i,element);
private Object cloneArray(final Object array) throws Exception {
final Class elementClass = array.getClass().getComponentType();
final int length = Array.getLength(array);
final Object newArray = Array.newInstance(elementClass, length);
for (int i = 0; i < length; i++) {
final Object element = doClone(Array.get(array, i));
Array.set(newArray, i, element);
}
return newArray;
}
private Object cloneCollection(Collection collection) throws Exception {
Class mClass = collection.getClass();
Collection newColl = (Collection) mClass.newInstance();
Iterator i = collection.iterator();
private Object cloneCollection(final Collection collection) throws Exception {
final Class mClass = collection.getClass();
final Collection newColl = (Collection) mClass.newInstance();
final Iterator i = collection.iterator();
while (i.hasNext()) {
Object element = doClone(i.next());
final Object element = doClone(i.next());
newColl.add(element);
}
return newColl;
}
private Object cloneMap(Map map) throws Exception {
Class mClass = map.getClass();
Map newMap = (Map) mClass.newInstance();
Iterator entries = map.entrySet().iterator();
private Object cloneMap(final Map map) throws Exception {
final Class mClass = map.getClass();
final Map newMap = (Map) mClass.newInstance();
final Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Object key = doClone(entry.getKey());
Object value = doClone(entry.getValue());
newMap.put(key,value);
final Map.Entry entry = (Map.Entry) entries.next();
final Object key = doClone(entry.getKey());
final Object value = doClone(entry.getValue());
newMap.put(key, value);
}
return newMap;
}
@ -242,31 +268,28 @@ public class CloneableBean implements Serializable, Cloneable {
private static final Map CONSTRUCTOR_BASIC_TYPES = new HashMap();
static {
CONSTRUCTOR_BASIC_TYPES.put(Boolean.class,new Class[]{Boolean.TYPE});
CONSTRUCTOR_BASIC_TYPES.put(Byte.class,new Class[]{Byte.TYPE});
CONSTRUCTOR_BASIC_TYPES.put(Character.class,new Class[]{Character.TYPE});
CONSTRUCTOR_BASIC_TYPES.put(Double.class,new Class[]{Double.TYPE});
CONSTRUCTOR_BASIC_TYPES.put(Float.class,new Class[]{Float.TYPE});
CONSTRUCTOR_BASIC_TYPES.put(Integer.class,new Class[]{Integer.TYPE});
CONSTRUCTOR_BASIC_TYPES.put(Long.class,new Class[]{Long.TYPE});
CONSTRUCTOR_BASIC_TYPES.put(Short.class,new Class[]{Short.TYPE});
CONSTRUCTOR_BASIC_TYPES.put(String.class,new Class[]{String.class});
CONSTRUCTOR_BASIC_TYPES.put(Boolean.class, new Class[] { Boolean.TYPE });
CONSTRUCTOR_BASIC_TYPES.put(Byte.class, new Class[] { Byte.TYPE });
CONSTRUCTOR_BASIC_TYPES.put(Character.class, new Class[] { Character.TYPE });
CONSTRUCTOR_BASIC_TYPES.put(Double.class, new Class[] { Double.TYPE });
CONSTRUCTOR_BASIC_TYPES.put(Float.class, new Class[] { Float.TYPE });
CONSTRUCTOR_BASIC_TYPES.put(Integer.class, new Class[] { Integer.TYPE });
CONSTRUCTOR_BASIC_TYPES.put(Long.class, new Class[] { Long.TYPE });
CONSTRUCTOR_BASIC_TYPES.put(Short.class, new Class[] { Short.TYPE });
CONSTRUCTOR_BASIC_TYPES.put(String.class, new Class[] { String.class });
}
private boolean isBasicType(Class vClass) {
private boolean isBasicType(final Class vClass) {
return BASIC_TYPES.contains(vClass);
}
// THIS IS NOT NEEDED, BASIC TYPES ARE INMUTABLE, TUCU 20040710
/**
private Object cloneBasicType(Object value) throws Exception {
Class pClass = value.getClass();
Class[] defType = (Class[]) CONSTRUCTOR_BASIC_TYPES.get(pClass);
Constructor cons = pClass.getDeclaredConstructor(defType);
value = cons.newInstance(new Object[]{value});
return value;
}
* private Object cloneBasicType(Object value) throws Exception { Class
* pClass = value.getClass(); Class[] defType = (Class[])
* CONSTRUCTOR_BASIC_TYPES.get(pClass); Constructor cons =
* pClass.getDeclaredConstructor(defType); value = cons.newInstance(new
* Object[]{value}); return value; }
**/
}

View file

@ -16,13 +16,19 @@
*/
package com.sun.syndication.feed.impl;
import com.sun.syndication.feed.CopyFrom;
import com.sun.syndication.feed.impl.BeanIntrospector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import com.sun.syndication.feed.CopyFrom;
/**
* @author Alejandro Abdelnur
@ -30,119 +36,127 @@ import java.util.*;
public class CopyFromHelper {
private static final Object[] NO_PARAMS = new Object[0];
private Class _beanInterfaceClass;
private Map _baseInterfaceMap; //ENTRIES(propertyName,interface.class)
private Map _baseImplMap; //ENTRIES(interface.class,implementation.class)
private final Class _beanInterfaceClass;
private final Map _baseInterfaceMap; // ENTRIES(propertyName,interface.class)
private final Map _baseImplMap; // ENTRIES(interface.class,implementation.class)
public CopyFromHelper(Class beanInterfaceClass,Map basePropInterfaceMap,Map basePropClassImplMap) {
_beanInterfaceClass = beanInterfaceClass;
_baseInterfaceMap = basePropInterfaceMap;
_baseImplMap = basePropClassImplMap;
public CopyFromHelper(final Class beanInterfaceClass, final Map basePropInterfaceMap, final Map basePropClassImplMap) {
this._beanInterfaceClass = beanInterfaceClass;
this._baseInterfaceMap = basePropInterfaceMap;
this._baseImplMap = basePropClassImplMap;
}
public void copy(Object target,Object source) {
public void copy(final Object target, final Object source) {
try {
PropertyDescriptor[] pds = BeanIntrospector.getPropertyDescriptors(_beanInterfaceClass);
if (pds!=null) {
for (int i=0;i<pds.length;i++) {
String propertyName = pds[i].getName();
Method pReadMethod = pds[i].getReadMethod();
Method pWriteMethod = pds[i].getWriteMethod();
if (pReadMethod!=null && pWriteMethod!=null && // ensure it has getter and setter methods
pReadMethod.getDeclaringClass()!=Object.class && // filter Object.class getter methods
pReadMethod.getParameterTypes().length==0 && // filter getter methods that take parameters
_baseInterfaceMap.containsKey(propertyName)) { // only copies properties defined as copyFrom-able
Object value = pReadMethod.invoke(source,NO_PARAMS);
if (value!=null) {
Class baseInterface = (Class) _baseInterfaceMap.get(propertyName);
value = doCopy(value,baseInterface);
pWriteMethod.invoke(target,new Object[]{value});
final PropertyDescriptor[] pds = BeanIntrospector.getPropertyDescriptors(this._beanInterfaceClass);
if (pds != null) {
for (final PropertyDescriptor pd : pds) {
final String propertyName = pd.getName();
final Method pReadMethod = pd.getReadMethod();
final Method pWriteMethod = pd.getWriteMethod();
if (pReadMethod != null && pWriteMethod != null && // ensure
// it has
// getter
// and
// setter
// methods
pReadMethod.getDeclaringClass() != Object.class && // filter
// Object.class
// getter
// methods
pReadMethod.getParameterTypes().length == 0 && // filter
// getter
// methods
// that
// take
// parameters
this._baseInterfaceMap.containsKey(propertyName)) { // only
// copies
// properties
// defined
// as
// copyFrom-able
Object value = pReadMethod.invoke(source, NO_PARAMS);
if (value != null) {
final Class baseInterface = (Class) this._baseInterfaceMap.get(propertyName);
value = doCopy(value, baseInterface);
pWriteMethod.invoke(target, new Object[] { value });
}
}
}
}
}
catch (Exception ex) {
throw new RuntimeException("Could not do a copyFrom "+ex, ex);
} catch (final Exception ex) {
throw new RuntimeException("Could not do a copyFrom " + ex, ex);
}
}
private CopyFrom createInstance(Class interfaceClass) throws Exception {
if( _baseImplMap.get(interfaceClass) == null ){
private CopyFrom createInstance(final Class interfaceClass) throws Exception {
if (this._baseImplMap.get(interfaceClass) == null) {
return null;
}
else {
return (CopyFrom) ((Class)_baseImplMap.get(interfaceClass)).newInstance();
} else {
return (CopyFrom) ((Class) this._baseImplMap.get(interfaceClass)).newInstance();
}
}
private Object doCopy(Object value,Class baseInterface) throws Exception {
if (value!=null) {
Class vClass = value.getClass();
private Object doCopy(Object value, final Class baseInterface) throws Exception {
if (value != null) {
final Class vClass = value.getClass();
if (vClass.isArray()) {
value = doCopyArray(value,baseInterface);
}
else
if (value instanceof Collection) {
value = doCopyCollection((Collection)value,baseInterface);
}
else
if (value instanceof Map) {
value = doCopyMap((Map)value,baseInterface);
}
else
if (isBasicType(vClass)) {
value = doCopyArray(value, baseInterface);
} else if (value instanceof Collection) {
value = doCopyCollection((Collection) value, baseInterface);
} else if (value instanceof Map) {
value = doCopyMap((Map) value, baseInterface);
} else if (isBasicType(vClass)) {
// value = value; // nothing to do here
if (value instanceof Date) { // because Date it is not inmutable
value = ((Date)value).clone();
value = ((Date) value).clone();
}
}
else { // it goes CopyFrom
} else { // it goes CopyFrom
if (value instanceof CopyFrom) {
CopyFrom source = (CopyFrom) value;
final CopyFrom source = (CopyFrom) value;
CopyFrom target = createInstance(source.getInterface());
target = target == null ? (CopyFrom) value.getClass().newInstance() : target;
target.copyFrom(source);
value = target;
}
else {
throw new Exception("unsupported class for 'copyFrom' "+value.getClass());
} else {
throw new Exception("unsupported class for 'copyFrom' " + value.getClass());
}
}
}
return value;
}
private Object doCopyArray(Object array,Class baseInterface) throws Exception {
Class elementClass = array.getClass().getComponentType();
int length = Array.getLength(array);
Object newArray = Array.newInstance(elementClass,length);
for (int i=0;i<length;i++) {
Object element = doCopy(Array.get(array,i),baseInterface);
Array.set(newArray,i,element);
private Object doCopyArray(final Object array, final Class baseInterface) throws Exception {
final Class elementClass = array.getClass().getComponentType();
final int length = Array.getLength(array);
final Object newArray = Array.newInstance(elementClass, length);
for (int i = 0; i < length; i++) {
final Object element = doCopy(Array.get(array, i), baseInterface);
Array.set(newArray, i, element);
}
return newArray;
}
private Object doCopyCollection(Collection collection,Class baseInterface) throws Exception {
private Object doCopyCollection(final Collection collection, final Class baseInterface) throws Exception {
// expecting SETs or LISTs only, going default implementation of them
Collection newColl = (collection instanceof Set) ? (Collection)new HashSet() : (Collection)new ArrayList();
Iterator i = collection.iterator();
final Collection newColl = collection instanceof Set ? (Collection) new HashSet() : (Collection) new ArrayList();
final Iterator i = collection.iterator();
while (i.hasNext()) {
Object element = doCopy(i.next(),baseInterface);
final Object element = doCopy(i.next(), baseInterface);
newColl.add(element);
}
return newColl;
}
private Object doCopyMap(Map map,Class baseInterface) throws Exception {
Map newMap = new HashMap();
Iterator entries = map.entrySet().iterator();
private Object doCopyMap(final Map map, final Class baseInterface) throws Exception {
final Map newMap = new HashMap();
final Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Object key = entry.getKey(); // we are assuming string KEYS
Object element = doCopy(entry.getValue(),baseInterface);
newMap.put(key,element);
final Map.Entry entry = (Map.Entry) entries.next();
final Object key = entry.getKey(); // we are assuming string KEYS
final Object element = doCopy(entry.getValue(), baseInterface);
newMap.put(key, element);
}
return newMap;
}
@ -162,7 +176,7 @@ public class CopyFromHelper {
BASIC_TYPES.add(Date.class);
}
private boolean isBasicType(Class vClass) {
private boolean isBasicType(final Class vClass) {
return BASIC_TYPES.contains(vClass);
}

View file

@ -17,18 +17,22 @@
package com.sun.syndication.feed.impl;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.io.Serializable;
/**
* Provides deep <b>Bean</b> equals() and hashCode() functionality for Java Beans.
* Provides deep <b>Bean</b> equals() and hashCode() functionality for Java
* Beans.
* <p>
* It works on all read/write properties, recursively. It support all primitive types, Strings, Collections,
* bean-like objects and multi-dimensional arrays of any of them.
* It works on all read/write properties, recursively. It support all primitive
* types, Strings, Collections, bean-like objects and multi-dimensional arrays
* of any of them.
* <p>
* The hashcode is calculated by getting the hashcode of the Bean String representation.
* The hashcode is calculated by getting the hashcode of the Bean String
* representation.
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -36,20 +40,21 @@ public class EqualsBean implements Serializable {
private static final Object[] NO_PARAMS = new Object[0];
private Class _beanClass;
private Object _obj;
private final Class _beanClass;
private final Object _obj;
/**
* Default constructor.
* <p>
* To be used by classes extending EqualsBean only.
* <p>
*
* @param beanClass the class/interface to be used for property scanning.
*
*/
protected EqualsBean(Class beanClass) {
_beanClass = beanClass;
_obj = this;
protected EqualsBean(final Class beanClass) {
this._beanClass = beanClass;
this._obj = this;
}
/**
@ -76,77 +81,88 @@ public class EqualsBean implements Serializable {
* }
* </code>
* <p>
*
* @param beanClass the class/interface to be used for property scanning.
* @param obj object bean to test equality.
*
*/
public EqualsBean(Class beanClass,Object obj) {
public EqualsBean(final Class beanClass, final Object obj) {
if (!beanClass.isInstance(obj)) {
throw new IllegalArgumentException(obj.getClass()+" is not instance of "+beanClass);
throw new IllegalArgumentException(obj.getClass() + " is not instance of " + beanClass);
}
_beanClass = beanClass;
_obj = obj;
this._beanClass = beanClass;
this._obj = obj;
}
/**
* Indicates whether some other object is "equal to" this object as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this object as defined
* by the Object equals() method.
* <p>
* To be used by classes extending EqualsBean. Although it works also for classes using
* EqualsBean in a delegation pattern, for correctness those classes should use the
* To be used by classes extending EqualsBean. Although it works also for
* classes using EqualsBean in a delegation pattern, for correctness those
* classes should use the
*
* @see #beanEquals(Object) beanEquals method.
* <p>
* @param obj he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
public boolean equals(Object obj) {
@Override
public boolean equals(final Object obj) {
return beanEquals(obj);
}
/**
* Indicates whether some other object is "equal to" the object passed in the constructor,
* as defined by the Object equals() method.
* Indicates whether some other object is "equal to" the object passed in
* the constructor, as defined by the Object equals() method.
* <p>
* To be used by classes using EqualsBean in a delegation pattern,
*
* @see #EqualsBean(Class,Object) constructor.
* <p>
* @param obj he reference object with which to compare.
* @return <b>true</b> if the object passed in the constructor is equal to the 'obj' object.
* @return <b>true</b> if the object passed in the constructor is equal to
* the 'obj' object.
*
*/
public boolean beanEquals(Object obj) {
Object bean1 = _obj;
Object bean2 = obj;
public boolean beanEquals(final Object obj) {
final Object bean1 = this._obj;
final Object bean2 = obj;
boolean eq;
if (bean1==null && bean2==null) {
if (bean1 == null && bean2 == null) {
eq = true;
}
else
if (bean1==null || bean2==null) {
} else if (bean1 == null || bean2 == null) {
eq = false;
}
else {
if (!_beanClass.isInstance(bean2)) {
} else {
if (!this._beanClass.isInstance(bean2)) {
eq = false;
}
else {
} else {
eq = true;
try {
PropertyDescriptor[] pds = BeanIntrospector.getPropertyDescriptors(_beanClass);
if (pds!=null) {
for (int i = 0; eq && i<pds.length; i++) {
Method pReadMethod = pds[i].getReadMethod();
if (pReadMethod!=null && // ensure it has a getter method
pReadMethod.getDeclaringClass()!=Object.class && // filter Object.class getter methods
pReadMethod.getParameterTypes().length==0) { // filter getter methods that take parameters
Object value1 = pReadMethod.invoke(bean1, NO_PARAMS);
Object value2 = pReadMethod.invoke(bean2, NO_PARAMS);
final PropertyDescriptor[] pds = BeanIntrospector.getPropertyDescriptors(this._beanClass);
if (pds != null) {
for (int i = 0; eq && i < pds.length; i++) {
final Method pReadMethod = pds[i].getReadMethod();
if (pReadMethod != null && // ensure it has a getter
// method
pReadMethod.getDeclaringClass() != Object.class && // filter
// Object.class
// getter
// methods
pReadMethod.getParameterTypes().length == 0) { // filter
// getter
// methods
// that
// take
// parameters
final Object value1 = pReadMethod.invoke(bean1, NO_PARAMS);
final Object value2 = pReadMethod.invoke(bean2, NO_PARAMS);
eq = doEquals(value1, value2);
}
}
}
}
catch (Exception ex) {
} catch (final Exception ex) {
throw new RuntimeException("Could not execute equals()", ex);
}
}
@ -159,15 +175,19 @@ public class EqualsBean implements Serializable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
* The hashcode is calculated by getting the hashcode of the Bean String representation.
* The hashcode is calculated by getting the hashcode of the Bean String
* representation.
* <p>
* To be used by classes extending EqualsBean. Although it works also for classes using
* EqualsBean in a delegation pattern, for correctness those classes should use the
* To be used by classes extending EqualsBean. Although it works also for
* classes using EqualsBean in a delegation pattern, for correctness those
* classes should use the
*
* @see #beanHashCode() beanHashCode method.
* <p>
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return beanHashCode();
}
@ -177,51 +197,49 @@ public class EqualsBean implements Serializable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
* The hashcode is calculated by getting the hashcode of the Bean String representation.
* The hashcode is calculated by getting the hashcode of the Bean String
* representation.
* <p>
* To be used by classes using EqualsBean in a delegation pattern,
*
* @see #EqualsBean(Class,Object) constructor.
* <p>
* @return the hashcode of the bean object.
*
*/
public int beanHashCode() {
return _obj.toString().hashCode();
return this._obj.toString().hashCode();
}
private boolean doEquals(Object obj1, Object obj2) {
boolean eq = obj1==obj2;
if (!eq && obj1!=null && obj2!=null) {
Class classObj1 = obj1.getClass();
Class classObj2 = obj2.getClass();
private boolean doEquals(final Object obj1, final Object obj2) {
boolean eq = obj1 == obj2;
if (!eq && obj1 != null && obj2 != null) {
final Class classObj1 = obj1.getClass();
final Class classObj2 = obj2.getClass();
if (classObj1.isArray() && classObj2.isArray()) {
eq = equalsArray(obj1, obj2);
}
else {
} else {
eq = obj1.equals(obj2);
}
}
return eq;
}
private boolean equalsArray(Object array1, Object array2) {
private boolean equalsArray(final Object array1, final Object array2) {
boolean eq;
int length1 = Array.getLength(array1);
int length2 = Array.getLength(array2);
if (length1==length2) {
final int length1 = Array.getLength(array1);
final int length2 = Array.getLength(array2);
if (length1 == length2) {
eq = true;
for (int i = 0; eq && i<length1; i++) {
Object e1 = Array.get(array1, i);
Object e2 = Array.get(array2, i);
for (int i = 0; eq && i < length1; i++) {
final Object e1 = Array.get(array1, i);
final Object e2 = Array.get(array2, i);
eq = doEquals(e1, e2);
}
}
else {
} else {
eq = false;
}
return eq;
}
}

View file

@ -16,86 +16,96 @@
*/
package com.sun.syndication.feed.impl;
import com.sun.syndication.feed.impl.CloneableBean;
import com.sun.syndication.feed.impl.EqualsBean;
import java.io.Serializable;
import java.util.Set;
/**
* Convenience class providing clone(), toString(), equals() and hashCode() functionality for Java Beans.
* Convenience class providing clone(), toString(), equals() and hashCode()
* functionality for Java Beans.
* <p>
* It works on all read/write properties, recursively.
* <p>
* It uses the CloneableBean, EqualsBean and ToStringBean classes in a delegation pattern.
* It uses the CloneableBean, EqualsBean and ToStringBean classes in a
* delegation pattern.
* <p>
* <h3>ObjectBean programming conventions</h3>
* <P>
* All ObjectBean subclasses having properties that return collections they should never
* return null if the property has been set to <b>null</b> or if a collection has not been set.
* They should create and return an empty collection, this empty collection instance should
* also be set to the corresponding property.
* All ObjectBean subclasses having properties that return collections they
* should never return null if the property has been set to <b>null</b> or if a
* collection has not been set. They should create and return an empty
* collection, this empty collection instance should also be set to the
* corresponding property.
* <P>
* All ObjectBean subclasses properties should be live references.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class ObjectBean implements Serializable, Cloneable {
private EqualsBean _equalsBean;
private ToStringBean _toStringBean;
private CloneableBean _cloneableBean;
private final EqualsBean _equalsBean;
private final ToStringBean _toStringBean;
private final CloneableBean _cloneableBean;
/**
* Constructor.
* <p>
*
* @param beanClass the class/interface to be used for property scanning.
*
*/
public ObjectBean(Class beanClass,Object obj) {
this(beanClass,obj,null);
public ObjectBean(final Class beanClass, final Object obj) {
this(beanClass, obj, null);
}
/**
* Constructor.
* <p>
* The property names in the ignoreProperties Set will not be copied into
* the cloned instance. This is useful for cases where the Bean has convenience
* properties (properties that are actually references to other properties or
* properties of properties). For example SyndFeed and SyndEntry beans have
* convenience properties, publishedDate, author, copyright and categories all
* of them mapped to properties in the DC Module.
* the cloned instance. This is useful for cases where the Bean has
* convenience properties (properties that are actually references to other
* properties or properties of properties). For example SyndFeed and
* SyndEntry beans have convenience properties, publishedDate, author,
* copyright and categories all of them mapped to properties in the DC
* Module.
* <p>
*
* @param beanClass the class/interface to be used for property scanning.
* @param ignoreProperties properties to ignore when cloning.
*
*/
public ObjectBean(Class beanClass,Object obj,Set ignoreProperties) {
_equalsBean = new EqualsBean(beanClass,obj);
_toStringBean = new ToStringBean(beanClass,obj);
_cloneableBean = new CloneableBean(obj,ignoreProperties);
public ObjectBean(final Class beanClass, final Object obj, final Set ignoreProperties) {
this._equalsBean = new EqualsBean(beanClass, obj);
this._toStringBean = new ToStringBean(beanClass, obj);
this._cloneableBean = new CloneableBean(obj, ignoreProperties);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _cloneableBean.beanClone();
return this._cloneableBean.beanClone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
public boolean equals(Object other) {
return _equalsBean.beanEquals(other);
@Override
public boolean equals(final Object other) {
return this._equalsBean.beanEquals(other);
}
/**
@ -103,22 +113,25 @@ public class ObjectBean implements Serializable, Cloneable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _equalsBean.beanHashCode();
return this._equalsBean.beanHashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _toStringBean.toString();
return this._toStringBean.toString();
}
}

View file

@ -17,28 +17,31 @@
package com.sun.syndication.feed.impl;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Stack;
import java.io.Serializable;
/**
* Provides deep <b>Bean</b> toString support.
* <p>
* It works on all read/write properties, recursively. It support all primitive types, Strings, Collections,
* ToString objects and multi-dimensional arrays of any of them.
* It works on all read/write properties, recursively. It support all primitive
* types, Strings, Collections, ToString objects and multi-dimensional arrays of
* any of them.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class ToStringBean implements Serializable {
private static final ThreadLocal PREFIX_TL = new ThreadLocal() {
@Override
public Object get() {
Object o = super.get();
if (o==null) {
if (o == null) {
o = new Stack();
set(o);
}
@ -48,20 +51,22 @@ public class ToStringBean implements Serializable {
private static final Object[] NO_PARAMS = new Object[0];
private Class _beanClass;
private Object _obj;
private final Class _beanClass;
private final Object _obj;
/**
* Default constructor.
* <p>
* To be used by classes extending ToStringBean only.
* <p>
* @param beanClass indicates the class to scan for properties, normally an interface class.
*
* @param beanClass indicates the class to scan for properties, normally an
* interface class.
*
*/
protected ToStringBean(Class beanClass) {
_beanClass = beanClass;
_obj = this;
protected ToStringBean(final Class beanClass) {
this._beanClass = beanClass;
this._obj = this;
}
/**
@ -84,13 +89,15 @@ public class ToStringBean implements Serializable {
* }
* </code>
* <p>
* @param beanClass indicates the class to scan for properties, normally an interface class.
*
* @param beanClass indicates the class to scan for properties, normally an
* interface class.
* @param obj object bean to create String representation.
*
*/
public ToStringBean(Class beanClass,Object obj) {
_beanClass = beanClass;
_obj = obj;
public ToStringBean(final Class beanClass, final Object obj) {
this._beanClass = beanClass;
this._obj = obj;
}
/**
@ -98,143 +105,139 @@ public class ToStringBean implements Serializable {
* <p>
* It uses the Class name as the prefix.
* <p>
*
* @return bean object String representation.
*
*/
@Override
public String toString() {
Stack stack = (Stack) PREFIX_TL.get();
String[] tsInfo = (String[]) ((stack.isEmpty()) ? null : stack.peek());
final Stack stack = (Stack) PREFIX_TL.get();
final String[] tsInfo = (String[]) (stack.isEmpty() ? null : stack.peek());
String prefix;
if (tsInfo==null) {
String className = _obj.getClass().getName();
prefix = className.substring(className.lastIndexOf(".")+1);
}
else {
if (tsInfo == null) {
final String className = this._obj.getClass().getName();
prefix = className.substring(className.lastIndexOf(".") + 1);
} else {
prefix = tsInfo[0];
tsInfo[1] = prefix;
}
return toString(prefix);
return this.toString(prefix);
}
/**
* Returns the String representation of the bean given in the constructor.
* <p>
*
* @param prefix to use for bean properties.
* @return bean object String representation.
*
*/
private String toString(String prefix) {
StringBuffer sb = new StringBuffer(128);
private String toString(final String prefix) {
final StringBuffer sb = new StringBuffer(128);
try {
PropertyDescriptor[] pds = BeanIntrospector.getPropertyDescriptors(_beanClass);
if (pds!=null) {
for (int i=0;i<pds.length;i++) {
String pName = pds[i].getName();
Method pReadMethod = pds[i].getReadMethod();
if (pReadMethod!=null && // ensure it has a getter method
pReadMethod.getDeclaringClass()!=Object.class && // filter Object.class getter methods
pReadMethod.getParameterTypes().length==0) { // filter getter methods that take parameters
Object value = pReadMethod.invoke(_obj,NO_PARAMS);
printProperty(sb,prefix+"."+pName,value);
final PropertyDescriptor[] pds = BeanIntrospector.getPropertyDescriptors(this._beanClass);
if (pds != null) {
for (final PropertyDescriptor pd : pds) {
final String pName = pd.getName();
final Method pReadMethod = pd.getReadMethod();
if (pReadMethod != null && // ensure it has a getter method
pReadMethod.getDeclaringClass() != Object.class && // filter
// Object.class
// getter
// methods
pReadMethod.getParameterTypes().length == 0) { // filter
// getter
// methods
// that
// take
// parameters
final Object value = pReadMethod.invoke(this._obj, NO_PARAMS);
printProperty(sb, prefix + "." + pName, value);
}
}
}
}
catch (Exception ex) {
sb.append("\n\nEXCEPTION: Could not complete "+_obj.getClass()+".toString(): "+ex.getMessage()+"\n");
} catch (final Exception ex) {
sb.append("\n\nEXCEPTION: Could not complete " + this._obj.getClass() + ".toString(): " + ex.getMessage() + "\n");
}
return sb.toString();
}
private void printProperty(StringBuffer sb,String prefix,Object value) {
if (value==null) {
private void printProperty(final StringBuffer sb, final String prefix, final Object value) {
if (value == null) {
sb.append(prefix).append("=null\n");
}
else
if (value.getClass().isArray()) {
printArrayProperty(sb,prefix,value);
}
else
if (value instanceof Map) {
Map map = (Map) value;
Iterator i = map.entrySet().iterator();
} else if (value.getClass().isArray()) {
printArrayProperty(sb, prefix, value);
} else if (value instanceof Map) {
final Map map = (Map) value;
final Iterator i = map.entrySet().iterator();
if (i.hasNext()) {
while (i.hasNext()) {
Map.Entry me = (Map.Entry) i.next();
String ePrefix = prefix+"["+me.getKey()+"]";
Object eValue = me.getValue();
final Map.Entry me = (Map.Entry) i.next();
final String ePrefix = prefix + "[" + me.getKey() + "]";
final Object eValue = me.getValue();
//NEW
String[] tsInfo = new String[2];
// NEW
final String[] tsInfo = new String[2];
tsInfo[0] = ePrefix;
Stack stack = (Stack) PREFIX_TL.get();
final Stack stack = (Stack) PREFIX_TL.get();
stack.push(tsInfo);
String s = (eValue!=null) ? eValue.toString() : "null";
final String s = eValue != null ? eValue.toString() : "null";
stack.pop();
if (tsInfo[1]==null) {
if (tsInfo[1] == null) {
sb.append(ePrefix).append("=").append(s).append("\n");
}
else {
} else {
sb.append(s);
}
}
}
else {
} else {
sb.append(prefix).append("=[]\n");
}
}
else
if (value instanceof Collection) {
Collection collection = (Collection) value;
Iterator i = collection.iterator();
} else if (value instanceof Collection) {
final Collection collection = (Collection) value;
final Iterator i = collection.iterator();
if (i.hasNext()) {
int c = 0;
while (i.hasNext()) {
String cPrefix = prefix+"["+(c++)+"]";
Object cValue = i.next();
final String cPrefix = prefix + "[" + c++ + "]";
final Object cValue = i.next();
//NEW
String[] tsInfo = new String[2];
// NEW
final String[] tsInfo = new String[2];
tsInfo[0] = cPrefix;
Stack stack = (Stack) PREFIX_TL.get();
final Stack stack = (Stack) PREFIX_TL.get();
stack.push(tsInfo);
String s = (cValue!=null) ? cValue.toString() : "null";
final String s = cValue != null ? cValue.toString() : "null";
stack.pop();
if (tsInfo[1]==null) {
if (tsInfo[1] == null) {
sb.append(cPrefix).append("=").append(s).append("\n");
}
else {
} else {
sb.append(s);
}
}
}
else {
} else {
sb.append(prefix).append("=[]\n");
}
}
else {
String[] tsInfo = new String[2];
} else {
final String[] tsInfo = new String[2];
tsInfo[0] = prefix;
Stack stack = (Stack) PREFIX_TL.get();
final Stack stack = (Stack) PREFIX_TL.get();
stack.push(tsInfo);
String s = value.toString();
final String s = value.toString();
stack.pop();
if (tsInfo[1]==null) {
if (tsInfo[1] == null) {
sb.append(prefix).append("=").append(s).append("\n");
}
else {
} else {
sb.append(s);
}
}
}
private void printArrayProperty(StringBuffer sb, String prefix,Object array) {
int length = Array.getLength(array);
for (int i=0;i<length;i++) {
Object obj = Array.get(array,i);
printProperty(sb,prefix+"["+i+"]",obj);
private void printArrayProperty(final StringBuffer sb, final String prefix, final Object array) {
final int length = Array.getLength(array);
for (int i = 0; i < length; i++) {
final Object obj = Array.get(array, i);
printProperty(sb, prefix + "[" + i + "]", obj);
}
}
}

View file

@ -16,15 +16,17 @@
*/
package com.sun.syndication.feed.module;
import com.sun.syndication.feed.CopyFrom;
import java.util.List;
import java.util.Date;
import java.util.List;
import com.sun.syndication.feed.CopyFrom;
/**
* Dublin Core Module.
* <p>
* @see <a href="http://web.resource.org/rss/1.0/modules/dc/">Dublin Core module</a>.
*
* @see <a href="http://web.resource.org/rss/1.0/modules/dc/">Dublin Core
* module</a>.
* @author Alejandro Abdelnur
*
*/
@ -39,8 +41,9 @@ public interface DCModule extends Module, CopyFrom {
/**
* Returns the DublinCore module titles.
* <p>
* @return a list of Strings representing the DublinCore module title,
* an empty list if none.
*
* @return a list of Strings representing the DublinCore module title, an
* empty list if none.
*
*/
List<String> getTitles();
@ -48,16 +51,18 @@ public interface DCModule extends Module, CopyFrom {
/**
* Sets the DublinCore module titles.
* <p>
* @param titles the list of String representing the DublinCore module titles
* to set, an empty list or <b>null</b> if none.
*
* @param titles the list of String representing the DublinCore module
* titles to set, an empty list or <b>null</b> if none.
*
*/
void setTitles(List<String> titles);
/**
* Gets the DublinCore module title. Convenience method that can be used
* to obtain the first item, <b>null</b> if none.
* Gets the DublinCore module title. Convenience method that can be used to
* obtain the first item, <b>null</b> if none.
* <p>
*
* @return the first DublinCore module title, <b>null</b> if none.
*/
String getTitle();
@ -66,6 +71,7 @@ public interface DCModule extends Module, CopyFrom {
* Sets the DublinCore module title. Convenience method that can be used
* when there is only one title to set.
* <p>
*
* @param title the DublinCore module title to set, <b>null</b> if none.
*
*/
@ -74,8 +80,9 @@ public interface DCModule extends Module, CopyFrom {
/**
* Returns the DublinCore module creator.
* <p>
* @return a list of Strings representing the DublinCore module creator,
* an empty list if none.
*
* @return a list of Strings representing the DublinCore module creator, an
* empty list if none.
*
*/
List<String> getCreators();
@ -83,6 +90,7 @@ public interface DCModule extends Module, CopyFrom {
/**
* Sets the DublinCore module creators.
* <p>
*
* @param creators the list of String representing the DublinCore module
* creators to set, an empty list or <b>null</b> if none.
*
@ -93,6 +101,7 @@ public interface DCModule extends Module, CopyFrom {
* Gets the DublinCore module creator. Convenience method that can be used
* to obtain the first item, <b>null</b> if none.
* <p>
*
* @return the first DublinCore module creator, <b>null</b> if none.
*/
String getCreator();
@ -101,6 +110,7 @@ public interface DCModule extends Module, CopyFrom {
* Sets the DublinCore module creator. Convenience method that can be used
* when there is only one creator to set.
* <p>
*
* @param creator the DublinCore module creator to set, <b>null</b> if none.
*
*/
@ -109,6 +119,7 @@ public interface DCModule extends Module, CopyFrom {
/**
* Returns the DublinCore module subjects.
* <p>
*
* @return a list of DCSubject elements with the DublinCore module subjects,
* an empty list if none.
*
@ -118,8 +129,9 @@ public interface DCModule extends Module, CopyFrom {
/**
* Sets the DublinCore module subjects.
* <p>
* @param subjects the list of DCSubject elements with the DublinCore
* module subjects to set, an empty list or <b>null</b> if none.
*
* @param subjects the list of DCSubject elements with the DublinCore module
* subjects to set, an empty list or <b>null</b> if none.
*
*/
void setSubjects(List<DCSubject> subjects);
@ -128,6 +140,7 @@ public interface DCModule extends Module, CopyFrom {
* Gets the DublinCore module subject. Convenience method that can be used
* to obtain the first item, <b>null</b> if none.
* <p>
*
* @return the first DublinCore module subject, <b>null</b> if none.
*/
DCSubject getSubject();
@ -136,6 +149,7 @@ public interface DCModule extends Module, CopyFrom {
* Sets the DCSubject element. Convenience method that can be used when
* there is only one subject to set.
* <p>
*
* @param subject the DublinCore module subject to set, <b>null</b> if none.
*
*/
@ -144,6 +158,7 @@ public interface DCModule extends Module, CopyFrom {
/**
* Returns the DublinCore module description.
* <p>
*
* @return a list of Strings representing the DublinCore module description,
* an empty list if none.
*
@ -153,8 +168,9 @@ public interface DCModule extends Module, CopyFrom {
/**
* Sets the DublinCore module descriptions.
* <p>
* @param descriptions the list of String representing the DublinCore
* module descriptions to set, an empty list or <b>null</b> if none.
*
* @param descriptions the list of String representing the DublinCore module
* descriptions to set, an empty list or <b>null</b> if none.
*
*/
void setDescriptions(List<String> descriptions);
@ -163,6 +179,7 @@ public interface DCModule extends Module, CopyFrom {
* Gets the DublinCore module description. Convenience method that can be
* used to obtain the first item, <b>null</b> if none.
* <p>
*
* @return the first DublinCore module description, <b>null</b> if none.
*/
String getDescription();
@ -171,7 +188,9 @@ public interface DCModule extends Module, CopyFrom {
* Sets the DublinCore module description. Convenience method that can be
* used when there is only one description to set.
* <p>
* @param description the DublinCore module description to set, <b>null</b> if none.
*
* @param description the DublinCore module description to set, <b>null</b>
* if none.
*
*/
void setDescription(String description);
@ -179,6 +198,7 @@ public interface DCModule extends Module, CopyFrom {
/**
* Returns the DublinCore module publisher.
* <p>
*
* @return a list of Strings representing the DublinCore module publisher,
* an empty list if none.
*
@ -188,6 +208,7 @@ public interface DCModule extends Module, CopyFrom {
/**
* Sets the DublinCore module publishers.
* <p>
*
* @param publishers the list of String representing the DublinCore module
* publishers to set, an empty list or <b>null</b> if none.
*
@ -195,18 +216,21 @@ public interface DCModule extends Module, CopyFrom {
void setPublishers(List<String> publishers);
/**
* Gets the DublinCore module publisher. Convenience method that can be
* used to obtain the first item, <b>null</b> if none.
* Gets the DublinCore module publisher. Convenience method that can be used
* to obtain the first item, <b>null</b> if none.
* <p>
*
* @return the first DublinCore module publisher, <b>null</b> if none.
*/
String getPublisher();
/**
* Sets the DublinCore module publisher. Convenience method that can be used when
* there is only one publisher to set.
* Sets the DublinCore module publisher. Convenience method that can be used
* when there is only one publisher to set.
* <p>
* @param publisher the DublinCore module publisher to set, <b>null</b> if none.
*
* @param publisher the DublinCore module publisher to set, <b>null</b> if
* none.
*
*/
void setPublisher(String publisher);
@ -214,6 +238,7 @@ public interface DCModule extends Module, CopyFrom {
/**
* Returns the DublinCore module contributor.
* <p>
*
* @return a list of Strings representing the DublinCore module contributor,
* an empty list if none.
*
@ -223,6 +248,7 @@ public interface DCModule extends Module, CopyFrom {
/**
* Sets the DublinCore module contributors.
* <p>
*
* @param contributors the list of String representing the DublinCore module
* contributors to set, an empty list or <b>null</b> if none.
*
@ -233,6 +259,7 @@ public interface DCModule extends Module, CopyFrom {
* Gets the DublinCore module contributor. Convenience method that can be
* used to obtain the first item, <b>null</b> if none.
* <p>
*
* @return the first DublinCore module contributor, <b>null</b> if none.
*/
String getContributor();
@ -241,7 +268,9 @@ public interface DCModule extends Module, CopyFrom {
* Sets the DublinCore module contributor. Convenience method that can be
* used when there is only one contributor to set.
* <p>
* @param contributor the DublinCore module contributor to set, <b>null</b> if none.
*
* @param contributor the DublinCore module contributor to set, <b>null</b>
* if none.
*
*/
void setContributor(String contributor);
@ -249,8 +278,9 @@ public interface DCModule extends Module, CopyFrom {
/**
* Returns the DublinCore module date.
* <p>
* @return a list of Strings representing the DublinCore module date,
* an empty list if none.
*
* @return a list of Strings representing the DublinCore module date, an
* empty list if none.
*
*/
List<Date> getDates();
@ -258,8 +288,9 @@ public interface DCModule extends Module, CopyFrom {
/**
* Sets the DublinCore module dates.
* <p>
* @param dates the list of Date representing the DublinCore module dates to set,
* an empty list or <b>null</b> if none.
*
* @param dates the list of Date representing the DublinCore module dates to
* set, an empty list or <b>null</b> if none.
*
*/
void setDates(List<Date> dates);
@ -268,14 +299,16 @@ public interface DCModule extends Module, CopyFrom {
* Gets the DublinCore module date. Convenience method that can be used to
* obtain the first item, <b>null</b> if none.
* <p>
*
* @return the first DublinCore module date, <b>null</b> if none.
*/
Date getDate();
/**
* Sets the DublinCore module date. Convenience method that can be used
* when there is only one date to set.
* Sets the DublinCore module date. Convenience method that can be used when
* there is only one date to set.
* <p>
*
* @param date the DublinCore module date to set, <b>null</b> if none.
*
*/
@ -284,8 +317,9 @@ public interface DCModule extends Module, CopyFrom {
/**
* Returns the DublinCore module type.
* <p>
* @return a list of Strings representing the DublinCore module type,
* an empty list if none.
*
* @return a list of Strings representing the DublinCore module type, an
* empty list if none.
*
*/
List<String> getTypes();
@ -293,24 +327,27 @@ public interface DCModule extends Module, CopyFrom {
/**
* Sets the DublinCore module types.
* <p>
* @param types the list of String representing the DublinCore module types to set,
* an empty list or <b>null</b> if none.
*
* @param types the list of String representing the DublinCore module types
* to set, an empty list or <b>null</b> if none.
*
*/
void setTypes(List<String> types);
/**
* Gets the DublinCore module type. Convenience method that can be used
* to obtain the first item, <b>null</b> if none.
* Gets the DublinCore module type. Convenience method that can be used to
* obtain the first item, <b>null</b> if none.
* <p>
*
* @return the first DublinCore module type, <b>null</b> if none.
*/
String getType();
/**
* Sets the DublinCore module type. Convenience method that can be used
* when there is only one type to set.
* Sets the DublinCore module type. Convenience method that can be used when
* there is only one type to set.
* <p>
*
* @param type the DublinCore module type to set, <b>null</b> if none.
*
*/
@ -319,8 +356,9 @@ public interface DCModule extends Module, CopyFrom {
/**
* Returns the DublinCore module format.
* <p>
* @return a list of Strings representing the DublinCore module format,
* an empty list if none.
*
* @return a list of Strings representing the DublinCore module format, an
* empty list if none.
*
*/
List<String> getFormats();
@ -328,6 +366,7 @@ public interface DCModule extends Module, CopyFrom {
/**
* Sets the DublinCore module formats.
* <p>
*
* @param formats the list of String representing the DublinCore module
* formats to set, an empty list or <b>null</b> if none.
*
@ -335,9 +374,10 @@ public interface DCModule extends Module, CopyFrom {
void setFormats(List<String> formats);
/**
* Gets the DublinCore module format. Convenience method that can be used
* to obtain the first item, <b>null</b> if none.
* Gets the DublinCore module format. Convenience method that can be used to
* obtain the first item, <b>null</b> if none.
* <p>
*
* @return the first DublinCore module format, <b>null</b> if none.
*/
String getFormat();
@ -346,6 +386,7 @@ public interface DCModule extends Module, CopyFrom {
* Sets the DublinCore module format. Convenience method that can be used
* when there is only one format to set.
* <p>
*
* @param format the DublinCore module format to set, <b>null</b> if none.
*
*/
@ -354,6 +395,7 @@ public interface DCModule extends Module, CopyFrom {
/**
* Returns the DublinCore module identifier.
* <p>
*
* @return a list of Strings representing the DublinCore module identifier,
* an empty list if none.
*
@ -363,6 +405,7 @@ public interface DCModule extends Module, CopyFrom {
/**
* Sets the DublinCore module identifiers.
* <p>
*
* @param identifiers the list of String representing the DublinCore module
* identifiers to set, an empty list or <b>null</b> if none.
*
@ -373,6 +416,7 @@ public interface DCModule extends Module, CopyFrom {
* Gets the DublinCore module identifier. Convenience method that can be
* used to obtain the first item, <b>null</b> if none.
* <p>
*
* @return the first DublinCore module identifier, <b>null</b> if none.
*/
String getIdentifier();
@ -381,7 +425,9 @@ public interface DCModule extends Module, CopyFrom {
* Sets the DublinCore module identifier. Convenience method that can be
* used when there is only one identifier to set.
* <p>
* @param identifier the DublinCore module identifier to set, <b>null</b> if none.
*
* @param identifier the DublinCore module identifier to set, <b>null</b> if
* none.
*
*/
void setIdentifier(String identifier);
@ -389,8 +435,9 @@ public interface DCModule extends Module, CopyFrom {
/**
* Returns the DublinCore module source.
* <p>
* @return a list of Strings representing the DublinCore module source,
* an empty list if none.
*
* @return a list of Strings representing the DublinCore module source, an
* empty list if none.
*
*/
List<String> getSources();
@ -398,6 +445,7 @@ public interface DCModule extends Module, CopyFrom {
/**
* Sets the DublinCore module sources.
* <p>
*
* @param sources the list of String representing the DublinCore module
* sources to set, an empty list or <b>null</b> if none.
*
@ -408,6 +456,7 @@ public interface DCModule extends Module, CopyFrom {
* Gets the DublinCore module subject. Convenience method that can be used
* to obtain the first item, <b>null</b> if none.
* <p>
*
* @return the first DublinCore module creator, <b>null</b> if none.
*/
String getSource();
@ -416,6 +465,7 @@ public interface DCModule extends Module, CopyFrom {
* Sets the DublinCore module source. Convenience method that can be used
* when there is only one source to set.
* <p>
*
* @param source the DublinCore module source to set, <b>null</b> if none.
*
*/
@ -424,8 +474,9 @@ public interface DCModule extends Module, CopyFrom {
/**
* Returns the DublinCore module language.
* <p>
* @return a list of Strings representing the DublinCore module language,
* an empty list if none.
*
* @return a list of Strings representing the DublinCore module language, an
* empty list if none.
*
*/
List<String> getLanguages();
@ -433,6 +484,7 @@ public interface DCModule extends Module, CopyFrom {
/**
* Sets the DublinCore module languages.
* <p>
*
* @param languages the list of String representing the DublinCore module
* languages to set, an empty list or <b>null</b> if none.
*
@ -443,6 +495,7 @@ public interface DCModule extends Module, CopyFrom {
* Gets the DublinCore module language. Convenience method that can be used
* to obtain the first item, <b>null</b> if none.
* <p>
*
* @return the first DublinCore module language, <b>null</b> if none.
*/
String getLanguage();
@ -451,7 +504,9 @@ public interface DCModule extends Module, CopyFrom {
* Sets the DublinCore module language. Convenience method that can be used
* when there is only one language to set.
* <p>
* @param language the DublinCore module language to set, <b>null</b> if none.
*
* @param language the DublinCore module language to set, <b>null</b> if
* none.
*
*/
void setLanguage(String language);
@ -459,8 +514,9 @@ public interface DCModule extends Module, CopyFrom {
/**
* Returns the DublinCore module relation.
* <p>
* @return a list of Strings representing the DublinCore module relation,
* an empty list if none.
*
* @return a list of Strings representing the DublinCore module relation, an
* empty list if none.
*
*/
List<String> getRelations();
@ -468,6 +524,7 @@ public interface DCModule extends Module, CopyFrom {
/**
* Sets the DublinCore module relations.
* <p>
*
* @param relations the list of String representing the DublinCore module
* relations to set, an empty list or <b>null</b> if none.
*
@ -478,6 +535,7 @@ public interface DCModule extends Module, CopyFrom {
* Gets the DublinCore module relation. Convenience method that can be used
* to obtain the first item, <b>null</b> if none.
* <p>
*
* @return the first DublinCore module relation, <b>null</b> if none.
*/
String getRelation();
@ -486,7 +544,9 @@ public interface DCModule extends Module, CopyFrom {
* Sets the DublinCore module relation. Convenience method that can be used
* when there is only one relation to set.
* <p>
* @param relation the DublinCore module relation to set, <b>null</b> if none.
*
* @param relation the DublinCore module relation to set, <b>null</b> if
* none.
*
*/
void setRelation(String relation);
@ -494,8 +554,9 @@ public interface DCModule extends Module, CopyFrom {
/**
* Returns the DublinCore module coverage.
* <p>
* @return a list of Strings representing the DublinCore module coverage,
* an empty list if none.
*
* @return a list of Strings representing the DublinCore module coverage, an
* empty list if none.
*
*/
List<String> getCoverages();
@ -503,6 +564,7 @@ public interface DCModule extends Module, CopyFrom {
/**
* Sets the DublinCore module coverages.
* <p>
*
* @param coverages the list of String representing the DublinCore module
* coverages to set, an empty list or <b>null</b> if none.
*
@ -513,6 +575,7 @@ public interface DCModule extends Module, CopyFrom {
* Gets the DublinCore module coverage. Convenience method that can be used
* to obtain the first item, <b>null</b> if none.
* <p>
*
* @return the first DublinCore module coverage, <b>null</b> if none.
*/
String getCoverage();
@ -521,7 +584,9 @@ public interface DCModule extends Module, CopyFrom {
* Sets the DublinCore module coverage. Convenience method that can be used
* when there is only one coverage to set.
* <p>
* @param coverage the DublinCore module coverage to set, <b>null</b> if none.
*
* @param coverage the DublinCore module coverage to set, <b>null</b> if
* none.
*
*/
void setCoverage(String coverage);
@ -529,8 +594,9 @@ public interface DCModule extends Module, CopyFrom {
/**
* Returns the DublinCore module rights.
* <p>
* @return a list of Strings representing the DublinCore module rights,
* an empty list if none.
*
* @return a list of Strings representing the DublinCore module rights, an
* empty list if none.
*
*/
List<String> getRightsList();
@ -538,6 +604,7 @@ public interface DCModule extends Module, CopyFrom {
/**
* Sets the DublinCore module rightss.
* <p>
*
* @param rights the list of String representing the DublinCore module
* rights to set, an empty list or <b>null</b> if none.
*
@ -545,9 +612,10 @@ public interface DCModule extends Module, CopyFrom {
void setRightsList(List<String> rights);
/**
* Gets the DublinCore module right. Convenience method that can be used
* to obtain the first item, <b>null</b> if none.
* Gets the DublinCore module right. Convenience method that can be used to
* obtain the first item, <b>null</b> if none.
* <p>
*
* @return the first DublinCore module right, <b>null</b> if none.
*/
String getRights();
@ -556,6 +624,7 @@ public interface DCModule extends Module, CopyFrom {
* Sets the DublinCore module rights. Convenience method that can be used
* when there is only one rights to set.
* <p>
*
* @param rights the DublinCore module rights to set, <b>null</b> if none.
*
*/

View file

@ -21,14 +21,17 @@ import com.sun.syndication.feed.CopyFrom;
/**
* Subject of the Dublin Core ModuleImpl.
* <p>
* @see <a href="http://web.resource.org/rss/1.0/modules/dc/">Dublin Core module</a>.
*
* @see <a href="http://web.resource.org/rss/1.0/modules/dc/">Dublin Core
* module</a>.
* @author Alejandro Abdelnur
*
*/
public interface DCSubject extends Cloneable,CopyFrom {
public interface DCSubject extends Cloneable, CopyFrom {
/**
* Returns the DublinCore subject taxonomy URI.
* <p>
*
* @return the DublinCore subject taxonomy URI, <b>null</b> if none.
*
*/
@ -37,7 +40,9 @@ public interface DCSubject extends Cloneable,CopyFrom {
/**
* Sets the DublinCore subject taxonomy URI.
* <p>
* @param taxonomyUri the DublinCore subject taxonomy URI to set, <b>null</b> if none.
*
* @param taxonomyUri the DublinCore subject taxonomy URI to set,
* <b>null</b> if none.
*
*/
void setTaxonomyUri(String taxonomyUri);
@ -45,6 +50,7 @@ public interface DCSubject extends Cloneable,CopyFrom {
/**
* Returns the DublinCore subject value.
* <p>
*
* @return the DublinCore subject value, <b>null</b> if none.
*
*/
@ -53,6 +59,7 @@ public interface DCSubject extends Cloneable,CopyFrom {
/**
* Sets the DublinCore subject value.
* <p>
*
* @param value the DublinCore subject value to set, <b>null</b> if none.
*
*/
@ -61,8 +68,10 @@ public interface DCSubject extends Cloneable,CopyFrom {
/**
* Creates a deep clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
public Object clone() throws CloneNotSupportedException;

View file

@ -16,24 +16,26 @@
*/
package com.sun.syndication.feed.module;
import com.sun.syndication.feed.CopyFrom;
import com.sun.syndication.feed.impl.ObjectBean;
import com.sun.syndication.feed.impl.CopyFromHelper;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.io.Serializable;
import com.sun.syndication.feed.CopyFrom;
import com.sun.syndication.feed.impl.CopyFromHelper;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Subject of the Dublin Core ModuleImpl, default implementation.
* <p>
* @see <a href="http://web.resource.org/rss/1.0/modules/dc/">Dublin Core module</a>.
*
* @see <a href="http://web.resource.org/rss/1.0/modules/dc/">Dublin Core
* module</a>.
* @author Alejandro Abdelnur
*
*/
public class DCSubjectImpl implements Cloneable,Serializable, DCSubject {
private ObjectBean _objBean;
public class DCSubjectImpl implements Cloneable, Serializable, DCSubject {
private final ObjectBean _objBean;
private String _taxonomyUri;
private String _value;
@ -43,34 +45,38 @@ public class DCSubjectImpl implements Cloneable,Serializable, DCSubject {
*
*/
public DCSubjectImpl() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
if(!(other instanceof DCSubjectImpl)){
public boolean equals(final Object other) {
if (!(other instanceof DCSubjectImpl)) {
return false;
}
return _objBean.equals(other);
return this._objBean.equals(other);
}
/**
@ -78,83 +84,96 @@ public class DCSubjectImpl implements Cloneable,Serializable, DCSubject {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the DublinCore subject taxonomy URI.
* <p>
*
* @return the DublinCore subject taxonomy URI, <b>null</b> if none.
*
*/
@Override
public String getTaxonomyUri() {
return _taxonomyUri;
return this._taxonomyUri;
}
/**
* Sets the DublinCore subject taxonomy URI.
* <p>
* @param taxonomyUri the DublinCore subject taxonomy URI to set, <b>null</b> if none.
*
* @param taxonomyUri the DublinCore subject taxonomy URI to set,
* <b>null</b> if none.
*
*/
public void setTaxonomyUri(String taxonomyUri) {
_taxonomyUri = taxonomyUri;
@Override
public void setTaxonomyUri(final String taxonomyUri) {
this._taxonomyUri = taxonomyUri;
}
/**
* Returns the DublinCore subject value.
* <p>
*
* @return the DublinCore subject value, <b>null</b> if none.
*
*/
@Override
public String getValue() {
return _value;
return this._value;
}
/**
* Sets the DublinCore subject value.
* <p>
*
* @param value the DublinCore subject value to set, <b>null</b> if none.
*
*/
public void setValue(String value) {
_value = value;
@Override
public void setValue(final String value) {
this._value = value;
}
@Override
public Class getInterface() {
return DCSubject.class;
}
public void copyFrom(CopyFrom obj) {
COPY_FROM_HELPER.copy(this,obj);
@Override
public void copyFrom(final CopyFrom obj) {
COPY_FROM_HELPER.copy(this, obj);
}
private static final CopyFromHelper COPY_FROM_HELPER;
static {
Map basePropInterfaceMap = new HashMap();
basePropInterfaceMap.put("taxonomyUri",String.class);
basePropInterfaceMap.put("value",String.class);
final Map basePropInterfaceMap = new HashMap();
basePropInterfaceMap.put("taxonomyUri", String.class);
basePropInterfaceMap.put("value", String.class);
Map basePropClassImplMap = Collections.EMPTY_MAP;
final Map basePropClassImplMap = Collections.EMPTY_MAP;
COPY_FROM_HELPER = new CopyFromHelper(DCSubject.class,basePropInterfaceMap,basePropClassImplMap);
COPY_FROM_HELPER = new CopyFromHelper(DCSubject.class, basePropInterfaceMap, basePropClassImplMap);
}
}

View file

@ -21,6 +21,7 @@ import java.util.List;
/**
* Objects that can have modules are Extendable.
*
* @author Dave Johnson
*/
public interface Extendable {
@ -28,6 +29,7 @@ public interface Extendable {
/**
* Returns the module identified by a given URI.
* <p>
*
* @param uri the URI of the ModuleImpl.
* @return The module with the given URI, <b>null</b> if none.
*/
@ -36,8 +38,9 @@ public interface Extendable {
/**
* Returns the entry modules.
* <p>
* @return a list of ModuleImpl elements with the entry modules,
* an empty list if none.
*
* @return a list of ModuleImpl elements with the entry modules, an empty
* list if none.
*
*/
List<Module> getModules();
@ -45,8 +48,9 @@ public interface Extendable {
/**
* Sets the entry modules.
* <p>
* @param modules the list of ModuleImpl elements with the entry modules to set,
* an empty list or <b>null</b> if none.
*
* @param modules the list of ModuleImpl elements with the entry modules to
* set, an empty list or <b>null</b> if none.
*
*/
void setModules(List<Module> modules);

View file

@ -16,21 +16,24 @@
*/
package com.sun.syndication.feed.module;
import com.sun.syndication.feed.CopyFrom;
import java.io.Serializable;
import com.sun.syndication.feed.CopyFrom;
/**
* Base class for modules describing Metadata of feeds. Examples of such modules are
* the Dublin Core and Syndication modules.
* Base class for modules describing Metadata of feeds. Examples of such modules
* are the Dublin Core and Syndication modules.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public interface Module extends Cloneable,CopyFrom,Serializable{
public interface Module extends Cloneable, CopyFrom, Serializable {
/**
* Returns the URI of the module.
* <p>
*
* @return URI of the module.
*
*/
@ -39,8 +42,10 @@ public interface Module extends Cloneable,CopyFrom,Serializable{
/**
* Creates a deep clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
public Object clone() throws CloneNotSupportedException;

View file

@ -16,57 +16,63 @@
*/
package com.sun.syndication.feed.module;
import com.sun.syndication.feed.impl.ObjectBean;
import java.io.Serializable;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Base class for modules describing Metadata of feeds, default implementations.
* Examples of such modules are the Dublin Core and Syndication modules.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public abstract class ModuleImpl implements Cloneable,Serializable,Module {
private ObjectBean _objBean;
private String _uri;
public abstract class ModuleImpl implements Cloneable, Serializable, Module {
private final ObjectBean _objBean;
private final String _uri;
/**
* Constructor.
* <p>
*
* @param uri URI of the module.
*
*/
protected ModuleImpl(Class beanClass,String uri) {
_objBean = new ObjectBean(beanClass,this);
_uri = uri;
protected ModuleImpl(final Class beanClass, final String uri) {
this._objBean = new ObjectBean(beanClass, this);
this._uri = uri;
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
if(!(other instanceof ModuleImpl)){
public boolean equals(final Object other) {
if (!(other instanceof ModuleImpl)) {
return false;
}
return _objBean.equals(other);
return this._objBean.equals(other);
}
/**
@ -74,33 +80,37 @@ public abstract class ModuleImpl implements Cloneable,Serializable,Module {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the URI of the module.
* <p>
*
* @return URI of the module.
*
*/
@Override
public String getUri() {
return _uri;
return this._uri;
}
}

View file

@ -21,14 +21,18 @@ import java.util.Date;
/**
* Syndication ModuleImpl.
* <p>
* @see <a href="http://web.resource.org/rss/1.0/modules/syndication/">Syndication module</a>.
*
* @see <a
* href="http://web.resource.org/rss/1.0/modules/syndication/">Syndication
* module</a>.
* @author Alejandro Abdelnur
*
*/
public interface SyModule extends Module {
/**
* URI of the Syndication ModuleImpl (http://purl.org/rss/1.0/modules/syndication/).
* URI of the Syndication ModuleImpl
* (http://purl.org/rss/1.0/modules/syndication/).
*
*/
static final String URI = "http://purl.org/rss/1.0/modules/syndication/";
@ -42,6 +46,7 @@ public interface SyModule extends Module {
/**
* Returns the Syndication module update period.
* <p>
*
* @return the Syndication module update period, <b>null</b> if none.
*
*/
@ -50,7 +55,9 @@ public interface SyModule extends Module {
/**
* Sets the Syndication module update period.
* <p>
* @param updatePeriod the Syndication module update period to set, <b>null</b> if none.
*
* @param updatePeriod the Syndication module update period to set,
* <b>null</b> if none.
*
*/
void setUpdatePeriod(String updatePeriod);
@ -58,6 +65,7 @@ public interface SyModule extends Module {
/**
* Returns the Syndication module update frequency.
* <p>
*
* @return the Syndication module update frequency, <b>null</b> if none.
*
*/
@ -66,7 +74,9 @@ public interface SyModule extends Module {
/**
* Sets the Syndication module update frequency.
* <p>
* @param updateFrequency the Syndication module update frequency to set, <b>null</b> if none.
*
* @param updateFrequency the Syndication module update frequency to set,
* <b>null</b> if none.
*
*/
void setUpdateFrequency(int updateFrequency);
@ -74,6 +84,7 @@ public interface SyModule extends Module {
/**
* Returns the Syndication module update base date.
* <p>
*
* @return the Syndication module update base date, <b>null</b> if none.
*
*/
@ -82,7 +93,9 @@ public interface SyModule extends Module {
/**
* Sets the Syndication module update base date.
* <p>
* @param updateBase the Syndication module update base date to set, <b>null</b> if none.
*
* @param updateBase the Syndication module update base date to set,
* <b>null</b> if none.
*
*/
void setUpdateBase(Date updateBase);

View file

@ -16,15 +16,23 @@
*/
package com.sun.syndication.feed.module;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.sun.syndication.feed.CopyFrom;
import com.sun.syndication.feed.impl.CopyFromHelper;
import java.util.*;
/**
* Syndication ModuleImpl, default implementation.
* <p>
* @see <a href="http://web.resource.org/rss/1.0/modules/syndication/">Syndication module</a>.
*
* @see <a
* href="http://web.resource.org/rss/1.0/modules/syndication/">Syndication
* module</a>.
* @author Alejandro Abdelnur
*
*/
@ -32,14 +40,13 @@ public class SyModuleImpl extends ModuleImpl implements SyModule {
private static final Set<String> PERIODS = new HashSet<String>();
static {
PERIODS.add(HOURLY );
PERIODS.add(DAILY );
PERIODS.add(WEEKLY );
PERIODS.add(HOURLY);
PERIODS.add(DAILY);
PERIODS.add(WEEKLY);
PERIODS.add(MONTHLY);
PERIODS.add(YEARLY );
PERIODS.add(YEARLY);
}
private String _updatePeriod;
private int _updateFrequency;
private Date _updateBase;
@ -50,91 +57,108 @@ public class SyModuleImpl extends ModuleImpl implements SyModule {
*
*/
public SyModuleImpl() {
super(SyModule.class,URI);
super(SyModule.class, URI);
}
/**
* Returns the Syndication module update period.
* <p>
*
* @return the Syndication module update period, <b>null</b> if none.
*
*/
@Override
public String getUpdatePeriod() {
return _updatePeriod;
return this._updatePeriod;
}
/**
* Sets the Syndication module update period.
* <p>
* @param updatePeriod the Syndication module update period to set, <b>null</b> if none.
*
* @param updatePeriod the Syndication module update period to set,
* <b>null</b> if none.
*
*/
public void setUpdatePeriod(String updatePeriod) {
@Override
public void setUpdatePeriod(final String updatePeriod) {
if (!PERIODS.contains(updatePeriod)) {
throw new IllegalArgumentException("Invalid period ["+updatePeriod+"]");
throw new IllegalArgumentException("Invalid period [" + updatePeriod + "]");
}
_updatePeriod = updatePeriod;
this._updatePeriod = updatePeriod;
}
/**
* Returns the Syndication module update frequency.
* <p>
*
* @return the Syndication module update frequency, <b>null</b> if none.
*
*/
@Override
public int getUpdateFrequency() {
return _updateFrequency;
return this._updateFrequency;
}
/**
* Sets the Syndication module update frequency.
* <p>
* @param updateFrequency the Syndication module update frequency to set, <b>null</b> if none.
*
* @param updateFrequency the Syndication module update frequency to set,
* <b>null</b> if none.
*
*/
public void setUpdateFrequency(int updateFrequency) {
_updateFrequency = updateFrequency;
@Override
public void setUpdateFrequency(final int updateFrequency) {
this._updateFrequency = updateFrequency;
}
/**
* Returns the Syndication module update base date.
* <p>
*
* @return the Syndication module update base date, <b>null</b> if none.
*
*/
@Override
public Date getUpdateBase() {
return new Date(_updateBase.getTime());
return new Date(this._updateBase.getTime());
}
/**
* Sets the Syndication module update base date.
* <p>
* @param updateBase the Syndication module update base date to set, <b>null</b> if none.
*
* @param updateBase the Syndication module update base date to set,
* <b>null</b> if none.
*
*/
public void setUpdateBase(Date updateBase) {
_updateBase = new Date(updateBase.getTime());
@Override
public void setUpdateBase(final Date updateBase) {
this._updateBase = new Date(updateBase.getTime());
}
@Override
public Class<? extends Module> getInterface() {
return SyModule.class;
}
public void copyFrom(CopyFrom obj) {
COPY_FROM_HELPER.copy(this,obj);
@Override
public void copyFrom(final CopyFrom obj) {
COPY_FROM_HELPER.copy(this, obj);
}
private static final CopyFromHelper COPY_FROM_HELPER;
static {
Map basePropInterfaceMap = new HashMap();
basePropInterfaceMap.put("updatePeriod",String.class);
basePropInterfaceMap.put("updateFrequency",Integer.TYPE);
basePropInterfaceMap.put("updateBase",Date.class);
final Map basePropInterfaceMap = new HashMap();
basePropInterfaceMap.put("updatePeriod", String.class);
basePropInterfaceMap.put("updateFrequency", Integer.TYPE);
basePropInterfaceMap.put("updateBase", Date.class);
Map basePropClassImplMap = Collections.EMPTY_MAP;
final Map basePropClassImplMap = Collections.EMPTY_MAP;
COPY_FROM_HELPER = new CopyFromHelper(SyModule.class,basePropInterfaceMap,basePropClassImplMap);
COPY_FROM_HELPER = new CopyFromHelper(SyModule.class, basePropInterfaceMap, basePropClassImplMap);
}
}

View file

@ -16,26 +16,25 @@
*/
package com.sun.syndication.feed.module.impl;
import com.sun.syndication.feed.module.Module;
import java.util.ArrayList;
import java.util.List;
import com.sun.syndication.feed.module.Module;
/**
*/
public class ModuleUtils {
public static List<Module> cloneModules(List<Module> modules) {
public static List<Module> cloneModules(final List<Module> modules) {
List<Module> cModules = null;
if (modules!=null) {
if (modules != null) {
cModules = new ArrayList<Module>();
for (Module module : modules) {
for (final Module module : modules) {
try {
Module c = (Module) module.clone();
final Module c = (Module) module.clone();
cModules.add(c);
}
catch (Exception ex) {
throw new RuntimeException("Cloning modules "+module.getUri(),ex);
} catch (final Exception ex) {
throw new RuntimeException("Cloning modules " + module.getUri(), ex);
}
}
}
@ -51,9 +50,9 @@ public class ModuleUtils {
* @param uri
* @return
*/
public static Module getModule(List<Module> modules,String uri) {
public static Module getModule(final List<Module> modules, final String uri) {
Module module = null;
for (int i=0; modules!=null && i<modules.size();i++) {
for (int i = 0; modules != null && i < modules.size(); i++) {
module = modules.get(i);
if (module.getUri().equals(uri)) {
return module;

View file

@ -17,18 +17,19 @@
*/
package com.sun.syndication.feed.rss;
import com.sun.syndication.feed.impl.ObjectBean;
import java.io.Serializable;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Bean for categories of RSS feeds.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class Category implements Cloneable,Serializable {
private ObjectBean _objBean;
public class Category implements Cloneable, Serializable {
private final ObjectBean _objBean;
private String _domain;
private String _value;
@ -38,34 +39,38 @@ public class Category implements Cloneable,Serializable {
*
*/
public Category() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
if(!(other instanceof Category)){
public boolean equals(final Object other) {
if (!(other instanceof Category)) {
return false;
}
return _objBean.equals(other);
return this._objBean.equals(other);
}
/**
@ -73,62 +78,69 @@ public class Category implements Cloneable,Serializable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the category domain.
* <p>
*
* @return the category domain, <b>null</b> if none.
*
*/
public String getDomain() {
return _domain;
return this._domain;
}
/**
* Sets the category domain.
* <p>
*
* @param domain the category domain to set, <b>null</b> if none.
*
*/
public void setDomain(String domain) {
_domain = domain;
public void setDomain(final String domain) {
this._domain = domain;
}
/**
* Returns the category value.
* <p>
*
* @return the category value, <b>null</b> if none.
*
*/
public String getValue() {
return _value;
return this._value;
}
/**
* Sets the category value.
* <p>
*
* @param value the category value to set, <b>null</b> if none.
*
*/
public void setValue(String value) {
_value = value;
public void setValue(final String value) {
this._value = value;
}
}

View file

@ -17,18 +17,24 @@
*/
package com.sun.syndication.feed.rss;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.feed.module.impl.ModuleUtils;
import java.util.*;
/**
* Bean for RSS feeds.
* <p>
* It handles all RSS versions (0.9, 0.91, 0.92, 0.93, 0.94, 1.0 and 2.0)
* without losing information.
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -44,14 +50,14 @@ public class Channel extends WireFeed {
private static final Set<String> DAYS;
static {
HashSet<String> days = new HashSet<String>();
days.add(SUNDAY );
days.add(MONDAY );
days.add(TUESDAY );
final HashSet<String> days = new HashSet<String>();
days.add(SUNDAY);
days.add(MONDAY);
days.add(TUESDAY);
days.add(WEDNESDAY);
days.add(THURSDAY );
days.add(FRIDAY );
days.add(SATURDAY );
days.add(THURSDAY);
days.add(FRIDAY);
days.add(SATURDAY);
DAYS = Collections.unmodifiableSet(days);
}
@ -86,504 +92,550 @@ public class Channel extends WireFeed {
}
/**
* Channel Constructor. All properties, except the type, are set to <b>null</b>.
* Channel Constructor. All properties, except the type, are set to
* <b>null</b>.
* <p>
*
* @param type the type of the RSS feed.
*
*/
public Channel(String type) {
public Channel(final String type) {
super(type);
}
/**
* Returns the channel title.
* <p>
*
* @return the channel title, <b>null</b> if none.
*
*/
public String getTitle() {
return _title;
return this._title;
}
/**
* Sets the channel title.
* <p>
*
* @param title the channel title to set, <b>null</b> if none.
*
*/
public void setTitle(String title) {
_title = title;
public void setTitle(final String title) {
this._title = title;
}
/**
* Returns the channel description.
* <p>
*
* @return the channel description, <b>null</b> if none.
*
*/
public String getDescription() {
return _description;
return this._description;
}
/**
* Sets the channel description.
* <p>
*
* @param description the channel description to set, <b>null</b> if none.
*
*/
public void setDescription(String description) {
_description = description;
public void setDescription(final String description) {
this._description = description;
}
/**
* Returns the channel link.
* <p>
*
* @return the channel link, <b>null</b> if none.
*
*/
public String getLink() {
return _link;
return this._link;
}
/**
* Sets the channel link.
* <p>
*
* @param link the channel link to set, <b>null</b> if none.
*
*/
public void setLink(String link) {
_link = link;
public void setLink(final String link) {
this._link = link;
}
/**
* Returns the channel uri.
* <p>
*
* @return the channel uri, <b>null</b> if none.
*/
public String getUri() {
return _uri;
return this._uri;
}
/**
* Sets the channel uri.
* <p>
*
* @param uri the channel uri, <b>null</b> if none.
*/
public void setUri(String uri) {
_uri = uri;
public void setUri(final String uri) {
this._uri = uri;
}
/**
* Returns the channel image.
* <p>
*
* @return the channel image, <b>null</b> if none.
*
*/
public Image getImage() {
return _image;
return this._image;
}
/**
* Sets the channel image.
* <p>
*
* @param image the channel image to set, <b>null</b> if none.
*
*/
public void setImage(Image image) {
_image = image;
public void setImage(final Image image) {
this._image = image;
}
/**
* Returns the channel items.
* <p>
* @return a list of Item elements with the channel items,
* an empty list if none.
*
* @return a list of Item elements with the channel items, an empty list if
* none.
*
*/
public List<Item> getItems() {
return (_items==null) ? (_items=new ArrayList<Item>()) : _items;
return this._items == null ? (this._items = new ArrayList<Item>()) : this._items;
}
/**
* Sets the channel items.
* <p>
* @param items the list of Item elements with the channel items to set,
* an empty list or <b>null</b> if none.
*
* @param items the list of Item elements with the channel items to set, an
* empty list or <b>null</b> if none.
*
*/
public void setItems(List<Item> items) {
_items = items;
public void setItems(final List<Item> items) {
this._items = items;
}
/**
* Returns the channel text input.
* <p>
*
* @return the channel text input, <b>null</b> if none.
*
*/
public TextInput getTextInput() {
return _textInput;
return this._textInput;
}
/**
* Sets the channel text input.
* <p>
*
* @param textInput the channel text input to set, <b>null</b> if none.
*
*/
public void setTextInput(TextInput textInput) {
_textInput = textInput;
public void setTextInput(final TextInput textInput) {
this._textInput = textInput;
}
/**
* Returns the channel language.
* <p>
*
* @return the channel language, <b>null</b> if none.
*
*/
public String getLanguage() {
return _language;
return this._language;
}
/**
* Sets the channel language.
* <p>
*
* @param language the channel language to set, <b>null</b> if none.
*
*/
public void setLanguage(String language) {
_language = language;
public void setLanguage(final String language) {
this._language = language;
}
/**
* Returns the channel rating.
* <p>
*
* @return the channel rating, <b>null</b> if none.
*
*/
public String getRating() {
return _rating;
return this._rating;
}
/**
* Sets the channel rating.
* <p>
*
* @param rating the channel rating to set, <b>null</b> if none.
*
*/
public void setRating(String rating) {
_rating = rating;
public void setRating(final String rating) {
this._rating = rating;
}
/**
* Returns the channel copyright.
* <p>
*
* @return the channel copyright, <b>null</b> if none.
*
*/
public String getCopyright() {
return _copyright;
return this._copyright;
}
/**
* Sets the channel copyright.
* <p>
*
* @param copyright the channel copyright to set, <b>null</b> if none.
*
*/
public void setCopyright(String copyright) {
_copyright = copyright;
public void setCopyright(final String copyright) {
this._copyright = copyright;
}
/**
* Returns the channel publishing date.
* <p>
*
* @return the channel publishing date, <b>null</b> if none.
*
*/
public Date getPubDate() {
return _pubDate == null ? null : new Date(_pubDate.getTime());
return this._pubDate == null ? null : new Date(this._pubDate.getTime());
}
/**
* Sets the channel publishing date.
* <p>
*
* @param pubDate the channel publishing date to set, <b>null</b> if none.
*
*/
public void setPubDate(Date pubDate) {
_pubDate = pubDate == null ? null : new Date( pubDate.getTime());
public void setPubDate(final Date pubDate) {
this._pubDate = pubDate == null ? null : new Date(pubDate.getTime());
}
/**
* Returns the channel last build date.
* <p>
*
* @return the channel last build date, <b>null</b> if none.
*
*/
public Date getLastBuildDate() {
return _lastBuildDate == null ? null : new Date(_lastBuildDate.getTime());
return this._lastBuildDate == null ? null : new Date(this._lastBuildDate.getTime());
}
/**
* Sets the channel last build date.
* <p>
* @param lastBuildDate the channel last build date to set, <b>null</b> if none.
*
* @param lastBuildDate the channel last build date to set, <b>null</b> if
* none.
*
*/
public void setLastBuildDate(Date lastBuildDate) {
_lastBuildDate = lastBuildDate == null ? null : new Date( lastBuildDate.getTime());
public void setLastBuildDate(final Date lastBuildDate) {
this._lastBuildDate = lastBuildDate == null ? null : new Date(lastBuildDate.getTime());
}
/**
* Returns the channel docs.
* <p>
*
* @return the channel docs, <b>null</b> if none.
*
*/
public String getDocs() {
return _docs;
return this._docs;
}
/**
* Sets the channel docs.
* <p>
*
* @param docs the channel docs to set, <b>null</b> if none.
*
*/
public void setDocs(String docs) {
_docs = docs;
public void setDocs(final String docs) {
this._docs = docs;
}
/**
* Returns the channel managing editor.
* <p>
*
* @return the channel managing editor, <b>null</b> if none.
*
*/
public String getManagingEditor() {
return _managingEditor;
return this._managingEditor;
}
/**
* Sets the channel managing editor.
* <p>
* @param managingEditor the channel managing editor to set, <b>null</b> if none.
*
* @param managingEditor the channel managing editor to set, <b>null</b> if
* none.
*
*/
public void setManagingEditor(String managingEditor) {
_managingEditor = managingEditor;
public void setManagingEditor(final String managingEditor) {
this._managingEditor = managingEditor;
}
/**
* Returns the channel web master.
* <p>
*
* @return the channel web master, <b>null</b> if none.
*
*/
public String getWebMaster() {
return _webMaster;
return this._webMaster;
}
/**
* Sets the channel web master.
* <p>
*
* @param webMaster the channel web master to set, <b>null</b> if none.
*
*/
public void setWebMaster(String webMaster) {
_webMaster = webMaster;
public void setWebMaster(final String webMaster) {
this._webMaster = webMaster;
}
/**
* Returns the channel skip hours.
* <p>
* @return a list of Integer elements with the channel skip hours,
* an empty list if none.
*
* @return a list of Integer elements with the channel skip hours, an empty
* list if none.
*
*/
public List<Integer> getSkipHours() {
return (_skipHours!=null) ? _skipHours : new ArrayList<Integer>();
return this._skipHours != null ? this._skipHours : new ArrayList<Integer>();
}
/**
* Sets the channel skip hours.
* <p>
* @param skipHours the list of Integer elements with the channel skip hours to set,
* an empty list or <b>null</b> if none.
*
* @param skipHours the list of Integer elements with the channel skip hours
* to set, an empty list or <b>null</b> if none.
*
*/
public void setSkipHours(List<Integer> skipHours) {
if (skipHours!=null) {
for (int i=0;i<skipHours.size();i++) {
Integer iHour = (Integer) skipHours.get(i);
if (iHour!=null) {
int hour = iHour.intValue();
if (hour<0 || hour>24) {
throw new IllegalArgumentException("Invalid hour ["+hour+"]");
public void setSkipHours(final List<Integer> skipHours) {
if (skipHours != null) {
for (int i = 0; i < skipHours.size(); i++) {
final Integer iHour = skipHours.get(i);
if (iHour != null) {
final int hour = iHour.intValue();
if (hour < 0 || hour > 24) {
throw new IllegalArgumentException("Invalid hour [" + hour + "]");
}
}
else {
} else {
throw new IllegalArgumentException("Invalid hour [null]");
}
}
}
_skipHours = skipHours;
this._skipHours = skipHours;
}
/**
* Returns the channel skip days.
* <p>
* @return a list of Day elements with the channel skip days,
* an empty list if none.
*
* @return a list of Day elements with the channel skip days, an empty list
* if none.
*
*/
public List<String> getSkipDays() {
return (_skipDays!=null) ? _skipDays : new ArrayList<String>();
return this._skipDays != null ? this._skipDays : new ArrayList<String>();
}
/**
* Sets the channel skip days.
* <p>
* @param skipDays the list of Day elements with the channel skip days to set,
* an empty list or <b>null</b> if none.
*
* @param skipDays the list of Day elements with the channel skip days to
* set, an empty list or <b>null</b> if none.
*
*/
public void setSkipDays(List<String> skipDays) {
if (skipDays!=null) {
for (int i=0;i<skipDays.size();i++) {
String day = (String) skipDays.get(i);
if (day!=null) {
public void setSkipDays(final List<String> skipDays) {
if (skipDays != null) {
for (int i = 0; i < skipDays.size(); i++) {
String day = skipDays.get(i);
if (day != null) {
day = day.toLowerCase();
if (!DAYS.contains(day)) {
throw new IllegalArgumentException("Invalid day ["+day+"]");
throw new IllegalArgumentException("Invalid day [" + day + "]");
}
skipDays.set(i,day);
}
else {
skipDays.set(i, day);
} else {
throw new IllegalArgumentException("Invalid day [null]");
}
}
}
_skipDays = skipDays;
this._skipDays = skipDays;
}
/**
* Returns the channel cloud.
* <p>
*
* @return the channel cloud, <b>null</b> if none.
*
*/
public Cloud getCloud() {
return _cloud;
return this._cloud;
}
/**
* Sets the channel cloud.
* <p>
*
* @param cloud the channel cloud to set, <b>null</b> if none.
*
*/
public void setCloud(Cloud cloud) {
_cloud = cloud;
public void setCloud(final Cloud cloud) {
this._cloud = cloud;
}
/**
* Returns the channel categories.
* <p>
* @return a list of Category elements with the channel categories,
* an empty list if none.
*
* @return a list of Category elements with the channel categories, an empty
* list if none.
*
*/
public List<Category> getCategories() {
return (_categories==null) ? (_categories=new ArrayList<Category>()) : _categories;
return this._categories == null ? (this._categories = new ArrayList<Category>()) : this._categories;
}
/**
* Sets the channel categories.
* <p>
* @param categories the list of Category elements with the channel categories to set,
* an empty list or <b>null</b> if none.
*
* @param categories the list of Category elements with the channel
* categories to set, an empty list or <b>null</b> if none.
*
*/
public void setCategories(List<Category> categories) {
_categories = categories;
public void setCategories(final List<Category> categories) {
this._categories = categories;
}
/**
* Returns the channel generator.
* <p>
*
* @return the channel generator, <b>null</b> if none.
*
*/
public String getGenerator() {
return _generator;
return this._generator;
}
/**
* Sets the channel generator.
* <p>
*
* @param generator the channel generator to set, <b>null</b> if none.
*
*/
public void setGenerator(String generator) {
_generator = generator;
public void setGenerator(final String generator) {
this._generator = generator;
}
/**
* Returns the channel time to live.
* <p>
*
* @return the channel time to live, <b>null</b> if none.
*
*/
public int getTtl() {
return _ttl;
return this._ttl;
}
/**
* Sets the channel time to live.
* <p>
*
* @param ttl the channel time to live to set, <b>null</b> if none.
*
*/
public void setTtl(int ttl) {
_ttl = ttl;
public void setTtl(final int ttl) {
this._ttl = ttl;
}
/**
* Returns the channel modules.
* <p>
* @return a list of ModuleImpl elements with the channel modules,
* an empty list if none.
*
* @return a list of ModuleImpl elements with the channel modules, an empty
* list if none.
*
*/
@Override
public List<Module> getModules() {
return (_modules==null) ? (_modules=new ArrayList<Module>()) : _modules;
return this._modules == null ? (this._modules = new ArrayList<Module>()) : this._modules;
}
/**
* Sets the channel modules.
* <p>
* @param modules the list of ModuleImpl elements with the channel modules to set,
* an empty list or <b>null</b> if none.
*
* @param modules the list of ModuleImpl elements with the channel modules
* to set, an empty list or <b>null</b> if none.
*
*/
@Override
public void setModules(List<Module> modules) {
_modules = modules;
public void setModules(final List<Module> modules) {
this._modules = modules;
}
/**
* Returns the module identified by a given URI.
* <p>
*
* @param uri the URI of the ModuleImpl.
* @return The module with the given URI, <b>null</b> if none.
*/
@Override
public Module getModule(String uri) {
return ModuleUtils.getModule(_modules,uri);
public Module getModule(final String uri) {
return ModuleUtils.getModule(this._modules, uri);
}
}

View file

@ -17,18 +17,19 @@
*/
package com.sun.syndication.feed.rss;
import com.sun.syndication.feed.impl.ObjectBean;
import java.io.Serializable;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Bean for clouds of RSS feeds.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class Cloud implements Cloneable,Serializable {
private ObjectBean _objBean;
public class Cloud implements Cloneable, Serializable {
private final ObjectBean _objBean;
private String _domain;
private int _port;
private String _path;
@ -41,30 +42,35 @@ public class Cloud implements Cloneable,Serializable {
*
*/
public Cloud() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
public boolean equals(Object other) {
return _objBean.equals(other);
@Override
public boolean equals(final Object other) {
return this._objBean.equals(other);
}
/**
@ -72,123 +78,136 @@ public class Cloud implements Cloneable,Serializable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the cloud domain.
* <p>
*
* @return the cloud domain, <b>null</b> if none.
*
*/
public String getDomain() {
return _domain;
return this._domain;
}
/**
* Sets the cloud domain.
* <p>
*
* @param domain the cloud domain to set, <b>null</b> if none.
*
*/
public void setDomain(String domain) {
_domain = domain;
public void setDomain(final String domain) {
this._domain = domain;
}
/**
* Returns the cloud port.
* <p>
*
* @return the cloud port, <b>null</b> if none.
*
*/
public int getPort() {
return _port;
return this._port;
}
/**
* Sets the cloud port.
* <p>
*
* @param port the cloud port to set, <b>null</b> if none.
*
*/
public void setPort(int port) {
_port = port;
public void setPort(final int port) {
this._port = port;
}
/**
* Returns the cloud path.
* <p>
*
* @return the cloud path, <b>null</b> if none.
*
*/
public String getPath() {
return _path;
return this._path;
}
/**
* Sets the cloud path.
* <p>
*
* @param path the cloud path to set, <b>null</b> if none.
*
*/
public void setPath(String path) {
_path = path;
public void setPath(final String path) {
this._path = path;
}
/**
* Returns the cloud register procedure.
* <p>
*
* @return the cloud register procedure, <b>null</b> if none.
*
*/
public String getRegisterProcedure() {
return _registerProcedure;
return this._registerProcedure;
}
/**
* Sets the cloud register procedure.
* <p>
* @param registerProcedure the cloud register procedure to set, <b>null</b> if none.
*
* @param registerProcedure the cloud register procedure to set, <b>null</b>
* if none.
*
*/
public void setRegisterProcedure(String registerProcedure) {
_registerProcedure = registerProcedure;
public void setRegisterProcedure(final String registerProcedure) {
this._registerProcedure = registerProcedure;
}
/**
* Returns the cloud protocol.
* <p>
*
* @return the cloud protocol, <b>null</b> if none.
*
*/
public String getProtocol() {
return _protocol;
return this._protocol;
}
/**
* Sets the cloud protocol.
* <p>
*
* @param protocol the cloud protocol to set, <b>null</b> if none.
*
*/
public void setProtocol(String protocol) {
_protocol = protocol;
public void setProtocol(final String protocol) {
this._protocol = protocol;
}
}

View file

@ -17,21 +17,21 @@
*/
package com.sun.syndication.feed.rss;
import com.sun.syndication.feed.impl.ObjectBean;
import java.io.Serializable;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Bean for item descriptions of RSS feeds.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class Content implements Cloneable, Serializable {
public static final String HTML = "html";
public static final String TEXT = "text";
private ObjectBean _objBean;
private final ObjectBean _objBean;
private String _type;
private String _value;
@ -41,75 +41,83 @@ public class Content implements Cloneable, Serializable {
*
*/
public Content() {
_objBean = new ObjectBean(this.getClass(), this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Sets the description type.
* <p>
*
* @param type the description type to set, <b>null</b> if none.
*
*/
public void setType(String type) {
_type = type;
public void setType(final String type) {
this._type = type;
}
/**
* Returns the description type.
* <p>
*
* @return the description type, <b>null</b> if none.
*
*/
public String getType() {
return _type;
return this._type;
}
/**
* Sets the description value.
* <p>
*
* @param value the description value to set, <b>null</b> if none.
*
*/
public void setValue(String value) {
_value = value;
public void setValue(final String value) {
this._value = value;
}
/**
* Returns the description value.
* <p>
*
* @return the description value, <b>null</b> if none.
*
*/
public String getValue() {
return _value;
return this._value;
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
public boolean equals(final Object other) {
if (!(other instanceof Content)) {
return false;
}
return _objBean.equals(other);
return this._objBean.equals(other);
}
/**
@ -117,22 +125,24 @@ public class Content implements Cloneable, Serializable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
}

View file

@ -17,18 +17,19 @@
*/
package com.sun.syndication.feed.rss;
import com.sun.syndication.feed.impl.ObjectBean;
import java.io.Serializable;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Bean for item descriptions of RSS feeds.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class Description implements Cloneable,Serializable {
private ObjectBean _objBean;
public class Description implements Cloneable, Serializable {
private final ObjectBean _objBean;
private String _type;
private String _value;
@ -38,33 +39,38 @@ public class Description implements Cloneable,Serializable {
*
*/
public Description() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
if(!(other instanceof Description)){
public boolean equals(final Object other) {
if (!(other instanceof Description)) {
return false;
}
return _objBean.equals(other);
return this._objBean.equals(other);
}
/**
@ -72,63 +78,69 @@ public class Description implements Cloneable,Serializable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the description type.
* <p>
*
* @return the description type, <b>null</b> if none.
*
*/
public String getType() {
return _type;
return this._type;
}
/**
* Sets the description type.
* <p>
*
* @param type the description type to set, <b>null</b> if none.
*
*/
public void setType(String type) {
_type = type;
public void setType(final String type) {
this._type = type;
}
/**
* Returns the description value.
* <p>
*
* @return the description value, <b>null</b> if none.
*
*/
public String getValue() {
return _value;
return this._value;
}
/**
* Sets the description value.
* <p>
*
* @param value the description value to set, <b>null</b> if none.
*
*/
public void setValue(String value) {
_value = value;
public void setValue(final String value) {
this._value = value;
}
}

View file

@ -17,18 +17,19 @@
*/
package com.sun.syndication.feed.rss;
import com.sun.syndication.feed.impl.ObjectBean;
import java.io.Serializable;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Bean for item enclosures of RSS feeds.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class Enclosure implements Cloneable,Serializable {
private ObjectBean _objBean;
public class Enclosure implements Cloneable, Serializable {
private final ObjectBean _objBean;
private String _url;
private long _length;
private String _type;
@ -39,34 +40,38 @@ public class Enclosure implements Cloneable,Serializable {
*
*/
public Enclosure() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
if(!(other instanceof Enclosure)){
public boolean equals(final Object other) {
if (!(other instanceof Enclosure)) {
return false;
}
return _objBean.equals(other);
return this._objBean.equals(other);
}
/**
@ -74,83 +79,91 @@ public class Enclosure implements Cloneable,Serializable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the enclosure URL.
* <p>
*
* @return the enclosure URL, <b>null</b> if none.
*
*/
public String getUrl() {
return _url;
return this._url;
}
/**
* Sets the enclosure URL.
* <p>
*
* @param url the enclosure URL to set, <b>null</b> if none.
*
*/
public void setUrl(String url) {
_url = url;
public void setUrl(final String url) {
this._url = url;
}
/**
* Returns the enclosure length.
* <p>
*
* @return the enclosure length, <b>0</b> if none.
*
*/
public long getLength() {
return _length;
return this._length;
}
/**
* Sets the enclosure length.
* <p>
*
* @param length the enclosure length to set, <b>0</b> if none.
*
*/
public void setLength(long length) {
_length = length;
public void setLength(final long length) {
this._length = length;
}
/**
* Returns the enclosure type.
* <p>
*
* @return the enclosure type, <b>null</b> if none.
*
*/
public String getType() {
return _type;
return this._type;
}
/**
* Sets the enclosure type.
* <p>
*
* @param type the enclosure type to set, <b>null</b> if none.
*
*/
public void setType(String type) {
_type = type;
public void setType(final String type) {
this._type = type;
}
}

View file

@ -17,18 +17,19 @@
*/
package com.sun.syndication.feed.rss;
import com.sun.syndication.feed.impl.ObjectBean;
import java.io.Serializable;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Bean for item GUIDs of RSS feeds.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class Guid implements Cloneable,Serializable {
private ObjectBean _objBean;
public class Guid implements Cloneable, Serializable {
private final ObjectBean _objBean;
private boolean _permaLink;
private String _value;
@ -38,34 +39,38 @@ public class Guid implements Cloneable,Serializable {
*
*/
public Guid() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
if(!(other instanceof Guid)){
public boolean equals(final Object other) {
if (!(other instanceof Guid)) {
return false;
}
return _objBean.equals(other);
return this._objBean.equals(other);
}
/**
@ -73,63 +78,69 @@ public class Guid implements Cloneable,Serializable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the guid perma link.
* <p>
*
* @return the guid perma link, <b>null</b> if none.
*
*/
public boolean isPermaLink() {
return _permaLink;
return this._permaLink;
}
/**
* Sets the guid perma link.
* <p>
*
* @param permaLink the guid perma link to set, <b>null</b> if none.
*
*/
public void setPermaLink(boolean permaLink) {
_permaLink = permaLink;
public void setPermaLink(final boolean permaLink) {
this._permaLink = permaLink;
}
/**
* Returns the guid value.
* <p>
*
* @return the guid value, <b>null</b> if none.
*
*/
public String getValue() {
return _value;
return this._value;
}
/**
* Sets the guid value.
* <p>
*
* @param value the guid value to set, <b>null</b> if none.
*
*/
public void setValue(String value) {
_value = value;
public void setValue(final String value) {
this._value = value;
}
}

View file

@ -16,18 +16,19 @@
*/
package com.sun.syndication.feed.rss;
import com.sun.syndication.feed.impl.ObjectBean;
import java.io.Serializable;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Bean for images of RSS feeds.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class Image implements Cloneable,Serializable {
private ObjectBean _objBean;
public class Image implements Cloneable, Serializable {
private final ObjectBean _objBean;
private String _title;
private String _url;
private String _link;
@ -41,34 +42,38 @@ public class Image implements Cloneable,Serializable {
*
*/
public Image() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
if(!(other instanceof Image)){
public boolean equals(final Object other) {
if (!(other instanceof Image)) {
return false;
}
return _objBean.equals(other);
return this._objBean.equals(other);
}
/**
@ -76,143 +81,157 @@ public class Image implements Cloneable,Serializable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the image title.
* <p>
*
* @return the image title, <b>null</b> if none.
*
*/
public String getTitle() {
return _title;
return this._title;
}
/**
* Sets the image title.
* <p>
*
* @param title the image title to set, <b>null</b> if none.
*
*/
public void setTitle(String title) {
_title = title;
public void setTitle(final String title) {
this._title = title;
}
/**
* Returns the image URL.
* <p>
*
* @return the image URL, <b>null</b> if none.
*
*/
public String getUrl() {
return _url;
return this._url;
}
/**
* Sets the image URL.
* <p>
*
* @param url the image URL to set, <b>null</b> if none.
*
*/
public void setUrl(String url) {
_url = url;
public void setUrl(final String url) {
this._url = url;
}
/**
* Returns the image link.
* <p>
*
* @return the image link, <b>null</b> if none.
*
*/
public String getLink() {
return _link;
return this._link;
}
/**
* Sets the image link.
* <p>
*
* @param link the image link to set, <b>null</b> if none.
*
*/
public void setLink(String link) {
_link = link;
public void setLink(final String link) {
this._link = link;
}
/**
* Returns the image width.
* <p>
*
* @return the image width, <b>null</b> if none.
*
*/
public Integer getWidth() {
return _width;
return this._width;
}
/**
* Sets the image width.
* <p>
*
* @param width the image width to set, <b>null</b> if none.
*
*/
public void setWidth(Integer width) {
_width = width;
public void setWidth(final Integer width) {
this._width = width;
}
/**
* Returns the image height.
* <p>
*
* @return the image height, <b>null</b> if none.
*
*/
public Integer getHeight() {
return _height;
return this._height;
}
/**
* Sets the image height.
* <p>
*
* @param height the image height to set, <b>null</b> if none.
*
*/
public void setHeight(Integer height) {
_height = height;
public void setHeight(final Integer height) {
this._height = height;
}
/**
* Returns the image description.
* <p>
*
* @return the image description, <b>null</b> if none.
*
*/
public String getDescription() {
return _description;
return this._description;
}
/**
* Sets the image description.
* <p>
*
* @param description the image description to set, <b>null</b> if none.
*
*/
public void setDescription(String description) {
_description = description;
public void setDescription(final String description) {
this._description = description;
}
}

View file

@ -17,31 +17,32 @@
*/
package com.sun.syndication.feed.rss;
import com.sun.syndication.feed.impl.ObjectBean;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.feed.module.impl.ModuleUtils;
import com.sun.syndication.feed.module.Extendable;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.io.Serializable;
import org.jdom2.Element;
import com.sun.syndication.feed.impl.ObjectBean;
import com.sun.syndication.feed.module.Extendable;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.feed.module.impl.ModuleUtils;
/**
* Bean for items of RSS feeds.
* <p>
* It handles all RSS versions without loosing information.
* <p>
* For RSS1.0 it supports Dublin Core and Syndication modules. Note that
* those modules currently support simple syntax format only.
* For RSS1.0 it supports Dublin Core and Syndication modules. Note that those
* modules currently support simple syntax format only.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class Item implements Cloneable, Serializable, Extendable {
private ObjectBean _objBean;
private final ObjectBean _objBean;
private String _title;
private String _link;
private String _uri;
@ -64,37 +65,41 @@ public class Item implements Cloneable, Serializable, Extendable {
*
*/
public Item() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
public boolean equals(final Object other) {
if (other == null || !(other instanceof Item)) {
return false;
}
// can't use foreign markup in equals, due to JDOM equals impl
List<Element> fm = getForeignMarkup();
setForeignMarkup(((Item)other).getForeignMarkup());
boolean ret = _objBean.equals(other);
final List<Element> fm = getForeignMarkup();
setForeignMarkup(((Item) other).getForeignMarkup());
final boolean ret = this._objBean.equals(other);
// restore foreign markup
setForeignMarkup(fm);
return ret;
@ -105,338 +110,374 @@ public class Item implements Cloneable, Serializable, Extendable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the item title.
* <p>
*
* @return the item title, <b>null</b> if none.
*
*/
public String getTitle() {
return _title;
return this._title;
}
/**
* Sets the item title.
* <p>
*
* @param title the item title to set, <b>null</b> if none.
*
*/
public void setTitle(String title) {
_title = title;
public void setTitle(final String title) {
this._title = title;
}
/**
* Returns the item link.
* <p>
*
* @return the item link, <b>null</b> if none.
*
*/
public String getLink() {
return _link;
return this._link;
}
/**
* Sets the item link.
* <p>
*
* @param link the item link to set, <b>null</b> if none.
*
*/
public void setLink(String link) {
_link = link;
public void setLink(final String link) {
this._link = link;
}
/**
* Returns the item uri.
* <p>
*
* @return the item uri, <b>null</b> if none.
*/
public String getUri() {
return _uri;
return this._uri;
}
/**
* Sets the item uri.
* <p>
*
* @param uri the item uri to set, <b>null</b> if none.
*/
public void setUri(String uri) {
_uri = uri;
public void setUri(final String uri) {
this._uri = uri;
}
/**
* Returns the item description.
* <p>
*
* @return the item description, <b>null</b> if none.
*
*/
public Description getDescription() {
return _description;
return this._description;
}
/**
* Sets the item description.
* <p>
*
* @param description the item description to set, <b>null</b> if none.
*
*/
public void setDescription(Description description) {
_description = description;
public void setDescription(final Description description) {
this._description = description;
}
/**
* Returns the item content.
* <p>
*
* @return the item content, <b>null</b> if none.
*
*/
public Content getContent() {
return _content;
return this._content;
}
/**
* Sets the item content.
* <p>
*
* @param content the item content to set, <b>null</b> if none.
*
*/
public void setContent(Content content) {
_content = content;
public void setContent(final Content content) {
this._content = content;
}
/**
* Returns the item source.
* <p>
*
* @return the item source, <b>null</b> if none.
*
*/
public Source getSource() {
return _source;
return this._source;
}
/**
* Sets the item source.
* <p>
*
* @param source the item source to set, <b>null</b> if none.
*
*/
public void setSource(Source source) {
_source = source;
public void setSource(final Source source) {
this._source = source;
}
/**
* Returns the item enclosures.
* <p>
* @return a list of Enclosure elements with the item enclosures,
* an empty list if none.
*
* @return a list of Enclosure elements with the item enclosures, an empty
* list if none.
*
*/
public List<Enclosure> getEnclosures() {
return (_enclosures==null) ? (_enclosures=new ArrayList<Enclosure>()) : _enclosures;
return this._enclosures == null ? (this._enclosures = new ArrayList<Enclosure>()) : this._enclosures;
}
/**
* Sets the item enclosures.
* <p>
* @param enclosures the list of Enclosure elements with the item enclosures to set,
* an empty list or <b>null</b> if none.
*
* @param enclosures the list of Enclosure elements with the item enclosures
* to set, an empty list or <b>null</b> if none.
*
*/
public void setEnclosures(List<Enclosure> enclosures) {
_enclosures = enclosures;
public void setEnclosures(final List<Enclosure> enclosures) {
this._enclosures = enclosures;
}
/**
* Returns the item categories.
* <p>
* @return a list of Category elements with the item categories,
* an empty list if none.
*
* @return a list of Category elements with the item categories, an empty
* list if none.
*
*/
public List<Category> getCategories() {
return (_categories==null) ? (_categories=new ArrayList<Category>()) : _categories;
return this._categories == null ? (this._categories = new ArrayList<Category>()) : this._categories;
}
/**
* Sets the item categories.
* <p>
* @param categories the list of Categories elements with the item categories to set,
* an empty list or <b>null</b> if none.
*
* @param categories the list of Categories elements with the item
* categories to set, an empty list or <b>null</b> if none.
*
*/
public void setCategories(List<Category> categories) {
_categories = categories;
public void setCategories(final List<Category> categories) {
this._categories = categories;
}
/**
* Returns the item GUID.
* <p>
*
* @return the item GUID, <b>null</b> if none.
*
*/
public Guid getGuid() {
return _guid;
return this._guid;
}
/**
* Sets the item GUID.
* <p>
*
* @param guid the item GUID to set, <b>null</b> if none.
*
*/
public void setGuid(Guid guid) {
_guid = guid;
public void setGuid(final Guid guid) {
this._guid = guid;
}
/**
* Returns the item comments.
* <p>
*
* @return the item comments, <b>null</b> if none.
*
*/
public String getComments() {
return _comments;
return this._comments;
}
/**
* Sets the item comments.
* <p>
*
* @param comments the item comments to set, <b>null</b> if none.
*
*/
public void setComments(String comments) {
_comments = comments;
public void setComments(final String comments) {
this._comments = comments;
}
/**
* Returns the item author.
* <p>
*
* @return the item author, <b>null</b> if none.
*
*/
public String getAuthor() {
return _author;
return this._author;
}
/**
* Sets the item author.
* <p>
*
* @param author the item author to set, <b>null</b> if none.
*
*/
public void setAuthor(String author) {
_author = author;
public void setAuthor(final String author) {
this._author = author;
}
/**
* Returns the item modules.
* <p>
* @return a list of ModuleImpl elements with the item modules,
* an empty list if none.
*
* @return a list of ModuleImpl elements with the item modules, an empty
* list if none.
*
*/
@Override
public List<Module> getModules() {
return (_modules==null) ? (_modules=new ArrayList<Module>()) : _modules;
return this._modules == null ? (this._modules = new ArrayList<Module>()) : this._modules;
}
/**
* Sets the item modules.
* <p>
* @param modules the list of ModuleImpl elements with the item modules to set,
* an empty list or <b>null</b> if none.
*
* @param modules the list of ModuleImpl elements with the item modules to
* set, an empty list or <b>null</b> if none.
*
*/
public void setModules(List<Module> modules) {
_modules = modules;
@Override
public void setModules(final List<Module> modules) {
this._modules = modules;
}
/**
* Returns the module identified by a given URI.
* <p>
*
* @param uri the URI of the ModuleImpl.
* @return The module with the given URI, <b>null</b> if none.
*/
public Module getModule(String uri) {
return ModuleUtils.getModule(_modules,uri);
@Override
public Module getModule(final String uri) {
return ModuleUtils.getModule(this._modules, uri);
}
/**
* Returns the item publishing date.
* <p>
*
* @return the item publishing date, <b>null</b> if none.
*
*/
public Date getPubDate() {
return _pubDate == null ? null : new Date( _pubDate.getTime());
return this._pubDate == null ? null : new Date(this._pubDate.getTime());
}
/**
* Sets the item publishing date.
* <p>
*
* @param pubDate the item publishing date to set, <b>null</b> if none.
*
*/
public void setPubDate(Date pubDate) {
_pubDate = pubDate == null ? null : new Date( pubDate.getTime());
public void setPubDate(final Date pubDate) {
this._pubDate = pubDate == null ? null : new Date(pubDate.getTime());
}
/**
* Returns the item expiration date.
* <p>
*
* @return the item expiration date, <b>null</b> if none.
*
*/
public Date getExpirationDate() {
return _expirationDate == null ? null : new Date(_expirationDate.getTime());
return this._expirationDate == null ? null : new Date(this._expirationDate.getTime());
}
/**
* Sets the item expiration date.
* <p>
* @param expirationDate the item expiration date to set, <b>null</b> if none.
*
* @param expirationDate the item expiration date to set, <b>null</b> if
* none.
*
*/
public void setExpirationDate(Date expirationDate) {
_expirationDate = expirationDate == null ? null : new Date(expirationDate.getTime());
public void setExpirationDate(final Date expirationDate) {
this._expirationDate = expirationDate == null ? null : new Date(expirationDate.getTime());
}
/**
* Returns foreign markup found at item level.
* <p>
*
* @return Opaque object to discourage use
*
*/
public List<Element> getForeignMarkup() {
return (_foreignMarkup==null) ? (_foreignMarkup=new ArrayList<Element>()) : _foreignMarkup;
return this._foreignMarkup == null ? (this._foreignMarkup = new ArrayList<Element>()) : this._foreignMarkup;
}
/**
* Sets foreign markup found at item level.
* <p>
*
* @param foreignMarkup Opaque object to discourage use
*
*/
public void setForeignMarkup(List<Element> foreignMarkup) {
_foreignMarkup = (List<Element>)foreignMarkup;
public void setForeignMarkup(final List<Element> foreignMarkup) {
this._foreignMarkup = foreignMarkup;
}
}

View file

@ -17,18 +17,19 @@
*/
package com.sun.syndication.feed.rss;
import com.sun.syndication.feed.impl.ObjectBean;
import java.io.Serializable;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Bean for item sources of RSS feeds.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class Source implements Cloneable,Serializable {
private ObjectBean _objBean;
public class Source implements Cloneable, Serializable {
private final ObjectBean _objBean;
private String _url;
private String _value;
@ -38,34 +39,38 @@ public class Source implements Cloneable,Serializable {
*
*/
public Source() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
if(!(other instanceof Source)){
public boolean equals(final Object other) {
if (!(other instanceof Source)) {
return false;
}
return _objBean.equals(other);
return this._objBean.equals(other);
}
/**
@ -73,62 +78,68 @@ public class Source implements Cloneable,Serializable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the source URL.
* <p>
*
* @return the source URL, <b>null</b> if none.
*
*/
public String getUrl() {
return _url;
return this._url;
}
/**
* Sets the source URL.
* <p>
*
* @param url the source URL to set, <b>null</b> if none.
*
*/
public void setUrl(String url) {
_url = url;
public void setUrl(final String url) {
this._url = url;
}
/**
* Returns the source value.
* <p>
*
* @return the source value, <b>null</b> if none.
*
*/
public String getValue() {
return _value;
return this._value;
}
/**
* Sets the source value.
* <p>
*
* @param value the source value to set, <b>null</b> if none.
*
*/
public void setValue(String value) {
_value = value;
public void setValue(final String value) {
this._value = value;
}
}

View file

@ -17,18 +17,19 @@
*/
package com.sun.syndication.feed.rss;
import com.sun.syndication.feed.impl.ObjectBean;
import java.io.Serializable;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Bean for text input of RSS feeds.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class TextInput implements Cloneable,Serializable {
private ObjectBean _objBean;
public class TextInput implements Cloneable, Serializable {
private final ObjectBean _objBean;
private String _title;
private String _description;
private String _name;
@ -40,34 +41,38 @@ public class TextInput implements Cloneable,Serializable {
*
*/
public TextInput() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
if(!(other instanceof TextInput)){
public boolean equals(final Object other) {
if (!(other instanceof TextInput)) {
return false;
}
return _objBean.equals(other);
return this._objBean.equals(other);
}
/**
@ -75,103 +80,114 @@ public class TextInput implements Cloneable,Serializable {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the text input title.
* <p>
*
* @return the text input title, <b>null</b> if none.
*
*/
public String getTitle() {
return _title;
return this._title;
}
/**
* Sets the text input title.
* <p>
*
* @param title the text input title to set, <b>null</b> if none.
*
*/
public void setTitle(String title) {
_title = title;
public void setTitle(final String title) {
this._title = title;
}
/**
* Returns the text input description.
* <p>
*
* @return the text input description, <b>null</b> if none.
*
*/
public String getDescription() {
return _description;
return this._description;
}
/**
* Sets the text input description.
* <p>
* @param description the text input description to set, <b>null</b> if none.
*
* @param description the text input description to set, <b>null</b> if
* none.
*
*/
public void setDescription(String description) {
_description = description;
public void setDescription(final String description) {
this._description = description;
}
/**
* Returns the text input name.
* <p>
*
* @return the text input name, <b>null</b> if none.
*
*/
public String getName() {
return _name;
return this._name;
}
/**
* Sets the text input name.
* <p>
*
* @param name the text input name to set, <b>null</b> if none.
*
*/
public void setName(String name) {
_name = name;
public void setName(final String name) {
this._name = name;
}
/**
* Returns the text input link.
* <p>
*
* @return the text input link, <b>null</b> if none.
*
*/
public String getLink() {
return _link;
return this._link;
}
/**
* Sets the text input link.
* <p>
*
* @param link the text input link to set, <b>null</b> if none.
*
*/
public void setLink(String link) {
_link = link;
public void setLink(final String link) {
this._link = link;
}
}

View file

@ -17,19 +17,19 @@
package com.sun.syndication.feed.synd;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.synd.SyndFeed;
/**
* Interface that defines the functionality to convert a SyndFeedImpl
* to a real feed (RSS or Atom) and vice versa.
* Interface that defines the functionality to convert a SyndFeedImpl to a real
* feed (RSS or Atom) and vice versa.
* <p>
* Each implementation knows how to deal with a specific type (version)
* of a real feed.
* Each implementation knows how to deal with a specific type (version) of a
* real feed.
* <p>
* Implementations must be thread safe.
* <p>
* TODO: explain how developers can plugin their own implementations.
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -38,6 +38,7 @@ public interface Converter {
/**
* Returns the type (version) of the real feed this converter handles.
* <p>
*
* @see WireFeed for details on the format of this string.
* <p>
* @return the real feed type.
@ -46,19 +47,24 @@ public interface Converter {
public String getType();
/**
* Makes a deep copy/conversion of the values of a real feed into a SyndFeedImpl.
* Makes a deep copy/conversion of the values of a real feed into a
* SyndFeedImpl.
* <p>
* It assumes the given SyndFeedImpl has no properties set.
* <p>
*
* @param feed real feed to copy/convert.
* @param syndFeed the SyndFeedImpl that will contain the copied/converted values of the real feed.
* @param syndFeed the SyndFeedImpl that will contain the copied/converted
* values of the real feed.
*
*/
public void copyInto(WireFeed feed,SyndFeed syndFeed);
public void copyInto(WireFeed feed, SyndFeed syndFeed);
/**
* Creates real feed with a deep copy/conversion of the values of a SyndFeedImpl.
* Creates real feed with a deep copy/conversion of the values of a
* SyndFeedImpl.
* <p>
*
* @param syndFeed SyndFeedImpl to copy/convert value from.
* @return a real feed with copied/converted values of the SyndFeedImpl.
*

View file

@ -17,12 +17,10 @@
*/
package com.sun.syndication.feed.synd;
/**
* Bean interface for categories of SyndFeedImpl feeds and entries.
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -30,6 +28,7 @@ public interface SyndCategory extends Cloneable {
/**
* Returns the category name.
* <p>
*
* @return the category name, <b>null</b> if none.
*
*/
@ -38,6 +37,7 @@ public interface SyndCategory extends Cloneable {
/**
* Sets the category name.
* <p>
*
* @param name the category name to set, <b>null</b> if none.
*
*/
@ -46,6 +46,7 @@ public interface SyndCategory extends Cloneable {
/**
* Returns the category taxonomy URI.
* <p>
*
* @return the category taxonomy URI, <b>null</b> if none.
*
*/
@ -54,6 +55,7 @@ public interface SyndCategory extends Cloneable {
/**
* Sets the category taxonomy URI.
* <p>
*
* @param taxonomyUri the category taxonomy URI to set, <b>null</b> if none.
*
*/
@ -62,8 +64,10 @@ public interface SyndCategory extends Cloneable {
/**
* Creates a deep clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
public Object clone() throws CloneNotSupportedException;

View file

@ -17,61 +17,67 @@
*/
package com.sun.syndication.feed.synd;
import com.sun.syndication.feed.impl.ObjectBean;
import com.sun.syndication.feed.module.DCSubjectImpl;
import com.sun.syndication.feed.module.DCSubject;
import java.util.AbstractList;
import java.util.List;
import java.util.ArrayList;
import java.io.Serializable;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
import com.sun.syndication.feed.impl.ObjectBean;
import com.sun.syndication.feed.module.DCSubject;
import com.sun.syndication.feed.module.DCSubjectImpl;
/**
* Bean for categories of SyndFeedImpl feeds and entries.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class SyndCategoryImpl implements Serializable, SyndCategory {
private ObjectBean _objBean;
private DCSubject _subject;
private final ObjectBean _objBean;
private final DCSubject _subject;
/**
* For implementations extending SyndContentImpl to be able to use the ObjectBean functionality
* with extended interfaces.
* For implementations extending SyndContentImpl to be able to use the
* ObjectBean functionality with extended interfaces.
* <p>
*
* @param subject the DC subject to wrap.
*/
SyndCategoryImpl(DCSubject subject) {
_objBean = new ObjectBean(SyndCategory.class,this);
_subject = subject;
SyndCategoryImpl(final DCSubject subject) {
this._objBean = new ObjectBean(SyndCategory.class, this);
this._subject = subject;
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
if(!(other instanceof SyndCategoryImpl)){
public boolean equals(final Object other) {
if (!(other instanceof SyndCategoryImpl)) {
return false;
}
return _objBean.equals(other);
return this._objBean.equals(other);
}
/**
@ -79,33 +85,36 @@ public class SyndCategoryImpl implements Serializable, SyndCategory {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Package private constructor, used by SyndCategoryListFacade.
* <p>
*
* @return the DC subject being wrapped.
*
*/
DCSubject getSubject() {
return _subject;
return this._subject;
}
/**
@ -120,64 +129,73 @@ public class SyndCategoryImpl implements Serializable, SyndCategory {
/**
* Returns the category name.
* <p>
*
* @return the category name, <b>null</b> if none.
*
*/
@Override
public String getName() {
return _subject.getValue();
return this._subject.getValue();
}
/**
* Sets the category name.
* <p>
*
* @param name the category name to set, <b>null</b> if none.
*
*/
public void setName(String name) {
_subject.setValue(name);
@Override
public void setName(final String name) {
this._subject.setValue(name);
}
/**
* Returns the category taxonomy URI.
* <p>
*
* @return the category taxonomy URI, <b>null</b> if none.
*
*/
@Override
public String getTaxonomyUri() {
return _subject.getTaxonomyUri();
return this._subject.getTaxonomyUri();
}
/**
* Sets the category taxonomy URI.
* <p>
*
* @param taxonomyUri the category taxonomy URI to set, <b>null</b> if none.
*
*/
public void setTaxonomyUri(String taxonomyUri) {
_subject.setTaxonomyUri(taxonomyUri);
@Override
public void setTaxonomyUri(final String taxonomyUri) {
this._subject.setTaxonomyUri(taxonomyUri);
}
}
/**
* List implementation for SyndCategoryImpl elements. To be directly used by the SyndFeedImpl
* and SyndEntryImpl classes only.
* List implementation for SyndCategoryImpl elements. To be directly used by the
* SyndFeedImpl and SyndEntryImpl classes only.
* <p>
* It acts as a facade on top of the DCSubjectImpl elements of the underlying list
* and remains in synch with it. It is possible to work on either list, the categories
* one or the subjects one and they remain in synch.
* It acts as a facade on top of the DCSubjectImpl elements of the underlying
* list and remains in synch with it. It is possible to work on either list, the
* categories one or the subjects one and they remain in synch.
* <p>
* This is necessary because the SyndFeedImpl categories are just a convenience to access
* the DublinCore subjects.
* This is necessary because the SyndFeedImpl categories are just a convenience
* to access the DublinCore subjects.
* <P>
* All this mess to avoid making DCSubjectImpl implement SyndCategory (which it would be odd).
* All this mess to avoid making DCSubjectImpl implement SyndCategory (which it
* would be odd).
* <p>
*
* @author Alejandro Abdelnur
*
*/
class SyndCategoryListFacade extends AbstractList<SyndCategory> {
private List<DCSubject> _subjects;
private final List<DCSubject> _subjects;
/**
* Default constructor. Creates and empty list.
@ -189,93 +207,106 @@ class SyndCategoryListFacade extends AbstractList<SyndCategory> {
/**
* Creates a facade list of categories on top the given subject list.
* <P>
*
* @param subjects the list of subjects to create the facade.
*
*/
public SyndCategoryListFacade(List<DCSubject> subjects) {
_subjects = subjects;
public SyndCategoryListFacade(final List<DCSubject> subjects) {
this._subjects = subjects;
}
/**
* Gets the category by index.
* <p>
*
* @param index the index position to retrieve the category.
* @return the SyndCategoryImpl in position index, <b>null</b> if none.
*
*/
public SyndCategory get(int index) {
return new SyndCategoryImpl((DCSubject) _subjects.get(index));
@Override
public SyndCategory get(final int index) {
return new SyndCategoryImpl(this._subjects.get(index));
}
/**
* Returns the size of the list.
* <p>
*
* @return the size of the list.
*
*/
@Override
public int size() {
return _subjects.size();
return this._subjects.size();
}
/**
* Sets a category in an existing position in the list.
* <p>
*
* @param index position to set the category.
* @param obj the SyndCategoryImpl object to set.
* @return the SyndCategoryImpl object that is being replaced, <b>null</b> if none.
* @return the SyndCategoryImpl object that is being replaced, <b>null</b>
* if none.
*
*/
@Override
public SyndCategory set(int index, SyndCategory obj) {
SyndCategoryImpl sCat = (SyndCategoryImpl) obj;
DCSubject subject = (sCat!=null) ? sCat.getSubject() : null;
subject = (DCSubject) _subjects.set(index,subject);
return (subject!=null) ? new SyndCategoryImpl(subject) : null;
public SyndCategory set(final int index, final SyndCategory obj) {
final SyndCategoryImpl sCat = (SyndCategoryImpl) obj;
DCSubject subject = sCat != null ? sCat.getSubject() : null;
subject = this._subjects.set(index, subject);
return subject != null ? new SyndCategoryImpl(subject) : null;
}
/**
* Adds a category to the list.
* <p>
*
* @param index position to add the category.
* @param obj the SyndCategoryImpl object to add.
*
*/
@Override
public void add(int index,SyndCategory obj) {
SyndCategoryImpl sCat = (SyndCategoryImpl) obj;
DCSubject subject = (sCat!=null) ? sCat.getSubject() : null;
_subjects.add(index,subject);
public void add(final int index, final SyndCategory obj) {
final SyndCategoryImpl sCat = (SyndCategoryImpl) obj;
final DCSubject subject = sCat != null ? sCat.getSubject() : null;
this._subjects.add(index, subject);
}
/**
* Removes a category element from a specific position.
* <p>
*
* @param index position to remove the category from.
* @return the SyndCategoryImpl being removed from position index, <b>null</b> if none.
* @return the SyndCategoryImpl being removed from position index,
* <b>null</b> if none.
*
*/
@Override
public SyndCategory remove(int index) {
DCSubject subject = (DCSubject) _subjects.remove(index);
return (subject!=null) ? new SyndCategoryImpl(subject) : null;
public SyndCategory remove(final int index) {
final DCSubject subject = this._subjects.remove(index);
return subject != null ? new SyndCategoryImpl(subject) : null;
}
/**
* Returns a list with the DCSubject elements of the SyndCategoryImpl list facade.
* To be used by the SyndFeedImpl class only.
* Returns a list with the DCSubject elements of the SyndCategoryImpl list
* facade. To be used by the SyndFeedImpl class only.
* <p>
* @param cList the list with SyndCategoryImpl elements to convert to subject list.
* @return a list with DCSubject elements corresponding to the categories in the given list.
*
* @param cList the list with SyndCategoryImpl elements to convert to
* subject list.
* @return a list with DCSubject elements corresponding to the categories in
* the given list.
*
*/
public static List<DCSubject> convertElementsSyndCategoryToSubject(List<SyndCategory> cList) {
public static List<DCSubject> convertElementsSyndCategoryToSubject(final List<SyndCategory> cList) {
List<DCSubject> sList = null;
if (cList!=null) {
if (cList != null) {
sList = new ArrayList<DCSubject>();
for (int i=0;i<cList.size();i++) {
SyndCategoryImpl sCat = (SyndCategoryImpl) cList.get(i);
for (int i = 0; i < cList.size(); i++) {
final SyndCategoryImpl sCat = (SyndCategoryImpl) cList.get(i);
DCSubject subject = null;
if (sCat!=null) {
if (sCat != null) {
subject = sCat.getSubject();
}
sList.add(subject);

View file

@ -18,19 +18,21 @@ package com.sun.syndication.feed.synd;
import com.sun.syndication.feed.CopyFrom;
/**
* Bean interface for content of SyndFeedImpl entries.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public interface SyndContent extends Cloneable,CopyFrom<SyndContent> {
public interface SyndContent extends Cloneable, CopyFrom<SyndContent> {
/**
* Returns the content type.
* <p>
* When used for the description of an entry, if <b>null</b> 'text/plain' must be assumed.
* When used for the description of an entry, if <b>null</b> 'text/plain'
* must be assumed.
* <p>
*
* @return the content type, <b>null</b> if none.
*
*/
@ -39,8 +41,10 @@ public interface SyndContent extends Cloneable,CopyFrom<SyndContent> {
/**
* Sets the content type.
* <p>
* When used for the description of an entry, if <b>null</b> 'text/plain' must be assumed.
* When used for the description of an entry, if <b>null</b> 'text/plain'
* must be assumed.
* <p>
*
* @param type the content type to set, <b>null</b> if none.
*
*/
@ -48,6 +52,7 @@ public interface SyndContent extends Cloneable,CopyFrom<SyndContent> {
/**
* Gets the content mode (needed for Atom 0.3 support).
*
* @return type the content, <b>null</b> if none.
*
*/
@ -55,6 +60,7 @@ public interface SyndContent extends Cloneable,CopyFrom<SyndContent> {
/**
* Sets the content mode (needed for Atom 0.3 support).
*
* @param mode the content mode to set, <b>null</b> if none.
*
*/
@ -63,6 +69,7 @@ public interface SyndContent extends Cloneable,CopyFrom<SyndContent> {
/**
* Returns the content value.
* <p>
*
* @return the content value, <b>null</b> if none.
*
*/
@ -71,6 +78,7 @@ public interface SyndContent extends Cloneable,CopyFrom<SyndContent> {
/**
* Sets the content value.
* <p>
*
* @param value the content value to set, <b>null</b> if none.
*
*/
@ -79,8 +87,10 @@ public interface SyndContent extends Cloneable,CopyFrom<SyndContent> {
/**
* Creates a deep clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
public Object clone() throws CloneNotSupportedException;

View file

@ -16,57 +16,63 @@
*/
package com.sun.syndication.feed.synd;
import com.sun.syndication.feed.CopyFrom;
import com.sun.syndication.feed.impl.ObjectBean;
import com.sun.syndication.feed.impl.CopyFromHelper;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.io.Serializable;
import com.sun.syndication.feed.CopyFrom;
import com.sun.syndication.feed.impl.CopyFromHelper;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Bean for content of SyndFeedImpl entries.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class SyndContentImpl implements Serializable, SyndContent {
private ObjectBean _objBean;
private final ObjectBean _objBean;
private String _type;
private String _value;
private String _mode;
/**
* Default constructor. All properties are set to <b>null</b>.
* <p>
*
*/
public SyndContentImpl() {
_objBean = new ObjectBean(SyndContent.class,this);
this._objBean = new ObjectBean(SyndContent.class, this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
public boolean equals(Object other) {
return _objBean.equals(other);
@Override
public boolean equals(final Object other) {
return this._objBean.equals(other);
}
/**
@ -74,104 +80,123 @@ public class SyndContentImpl implements Serializable, SyndContent {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the content type.
* <p>
* When used for the description of an entry, if <b>null</b> 'text/plain' must be assumed.
* When used for the description of an entry, if <b>null</b> 'text/plain'
* must be assumed.
* <p>
*
* @return the content type, <b>null</b> if none.
*
*/
@Override
public String getType() {
return _type;
return this._type;
}
/**
* Sets the content type.
* <p>
* When used for the description of an entry, if <b>null</b> 'text/plain' must be assumed.
* When used for the description of an entry, if <b>null</b> 'text/plain'
* must be assumed.
* <p>
*
* @param type the content type to set, <b>null</b> if none.
*
*/
public void setType(String type) {
_type = type;
@Override
public void setType(final String type) {
this._type = type;
}
/**
* Returns the content mode.
*
* @return the content mode, <b>null</b> if none.
*
*/
@Override
public String getMode() {
return _mode;
return this._mode;
}
/**
* Sets the content mode.
*
* @param mode the content mode to set, <b>null</b> if none.
*
*/
public void setMode(String mode) {
_mode = mode;
@Override
public void setMode(final String mode) {
this._mode = mode;
}
/**
* Returns the content value.
* <p>
*
* @return the content value, <b>null</b> if none.
*
*/
@Override
public String getValue() {
return _value;
return this._value;
}
/**
* Sets the content value.
* <p>
*
* @param value the content value to set, <b>null</b> if none.
*
*/
public void setValue(String value) {
_value = value;
@Override
public void setValue(final String value) {
this._value = value;
}
@Override
public Class getInterface() {
return SyndContent.class;
}
public void copyFrom(CopyFrom obj) {
COPY_FROM_HELPER.copy(this,obj);
@Override
public void copyFrom(final CopyFrom obj) {
COPY_FROM_HELPER.copy(this, obj);
}
private static final CopyFromHelper COPY_FROM_HELPER;
static {
Map basePropInterfaceMap = new HashMap();
basePropInterfaceMap.put("type",String.class);
basePropInterfaceMap.put("value",String.class);
final Map basePropInterfaceMap = new HashMap();
basePropInterfaceMap.put("type", String.class);
basePropInterfaceMap.put("value", String.class);
Map basePropClassImplMap = Collections.EMPTY_MAP;
final Map basePropClassImplMap = Collections.EMPTY_MAP;
COPY_FROM_HELPER = new CopyFromHelper(SyndContent.class,basePropInterfaceMap,basePropClassImplMap);
COPY_FROM_HELPER = new CopyFromHelper(SyndContent.class, basePropInterfaceMap, basePropClassImplMap);
}
}

View file

@ -9,6 +9,7 @@ public interface SyndEnclosure extends Cloneable, CopyFrom<SyndEnclosure> {
/**
* Returns the enclosure URL.
* <p>
*
* @return the enclosure URL, <b>null</b> if none.
*
*/
@ -17,6 +18,7 @@ public interface SyndEnclosure extends Cloneable, CopyFrom<SyndEnclosure> {
/**
* Sets the enclosure URL.
* <p>
*
* @param url the enclosure URL to set, <b>null</b> if none.
*
*/
@ -25,6 +27,7 @@ public interface SyndEnclosure extends Cloneable, CopyFrom<SyndEnclosure> {
/**
* Returns the enclosure length.
* <p>
*
* @return the enclosure length, <b>0</b> if none.
*
*/
@ -33,6 +36,7 @@ public interface SyndEnclosure extends Cloneable, CopyFrom<SyndEnclosure> {
/**
* Sets the enclosure length.
* <p>
*
* @param length the enclosure length to set, <b>0</b> if none.
*
*/
@ -41,6 +45,7 @@ public interface SyndEnclosure extends Cloneable, CopyFrom<SyndEnclosure> {
/**
* Returns the enclosure type.
* <p>
*
* @return the enclosure type, <b>null</b> if none.
*
*/
@ -49,6 +54,7 @@ public interface SyndEnclosure extends Cloneable, CopyFrom<SyndEnclosure> {
/**
* Sets the enclosure type.
* <p>
*
* @param type the enclosure type to set, <b>null</b> if none.
*
*/

View file

@ -1,19 +1,19 @@
package com.sun.syndication.feed.synd;
import com.sun.syndication.feed.CopyFrom;
import com.sun.syndication.feed.impl.ObjectBean;
import com.sun.syndication.feed.impl.CopyFromHelper;
import java.io.Serializable;
import java.util.Map;
import java.util.HashMap;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import com.sun.syndication.feed.CopyFrom;
import com.sun.syndication.feed.impl.CopyFromHelper;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* @author Alejandro Abdelnur
*/
public class SyndEnclosureImpl implements Serializable,SyndEnclosure {
private ObjectBean _objBean;
public class SyndEnclosureImpl implements Serializable, SyndEnclosure {
private final ObjectBean _objBean;
private String _url;
private String _type;
private long _length;
@ -24,29 +24,35 @@ public class SyndEnclosureImpl implements Serializable,SyndEnclosure {
*
*/
public SyndEnclosureImpl() {
_objBean = new ObjectBean(SyndEnclosure.class,this);
this._objBean = new ObjectBean(SyndEnclosure.class, this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
public boolean equals(Object other) {
return _objBean.equals(other);
@Override
public boolean equals(final Object other) {
return this._objBean.equals(other);
}
/**
@ -54,21 +60,25 @@ public class SyndEnclosureImpl implements Serializable,SyndEnclosure {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
@ -77,8 +87,9 @@ public class SyndEnclosureImpl implements Serializable,SyndEnclosure {
*
* @return the enclosure URL, <b>null</b> if none.
*/
@Override
public String getUrl() {
return _url;
return this._url;
}
/**
@ -87,8 +98,9 @@ public class SyndEnclosureImpl implements Serializable,SyndEnclosure {
*
* @param url the enclosure URL to set, <b>null</b> if none.
*/
public void setUrl(String url) {
_url = url;
@Override
public void setUrl(final String url) {
this._url = url;
}
/**
@ -97,8 +109,9 @@ public class SyndEnclosureImpl implements Serializable,SyndEnclosure {
*
* @return the enclosure length, <b>null</b> if none.
*/
@Override
public long getLength() {
return _length;
return this._length;
}
/**
@ -107,8 +120,9 @@ public class SyndEnclosureImpl implements Serializable,SyndEnclosure {
*
* @param length the enclosure length to set, <b>null</b> if none.
*/
public void setLength(long length) {
_length = length;
@Override
public void setLength(final long length) {
this._length = length;
}
/**
@ -117,8 +131,9 @@ public class SyndEnclosureImpl implements Serializable,SyndEnclosure {
*
* @return the enclosure type, <b>null</b> if none.
*/
@Override
public String getType() {
return _type;
return this._type;
}
/**
@ -127,29 +142,32 @@ public class SyndEnclosureImpl implements Serializable,SyndEnclosure {
*
* @param type the enclosure type to set, <b>null</b> if none.
*/
public void setType(String type) {
_type = type;
@Override
public void setType(final String type) {
this._type = type;
}
@Override
public Class<? extends CopyFrom> getInterface() {
return SyndEnclosure.class;
}
public void copyFrom(CopyFrom obj) {
COPY_FROM_HELPER.copy(this,obj);
@Override
public void copyFrom(final CopyFrom obj) {
COPY_FROM_HELPER.copy(this, obj);
}
private static final CopyFromHelper COPY_FROM_HELPER;
static {
Map basePropInterfaceMap = new HashMap();
basePropInterfaceMap.put("url",String.class);
basePropInterfaceMap.put("type",String.class);
basePropInterfaceMap.put("length",Long.TYPE);
final Map basePropInterfaceMap = new HashMap();
basePropInterfaceMap.put("url", String.class);
basePropInterfaceMap.put("type", String.class);
basePropInterfaceMap.put("length", Long.TYPE);
Map basePropClassImplMap = Collections.EMPTY_MAP;
final Map basePropClassImplMap = Collections.EMPTY_MAP;
COPY_FROM_HELPER = new CopyFromHelper(SyndEnclosure.class,basePropInterfaceMap,basePropClassImplMap);
COPY_FROM_HELPER = new CopyFromHelper(SyndEnclosure.class, basePropInterfaceMap, basePropClassImplMap);
}
}

View file

@ -28,6 +28,7 @@ import com.sun.syndication.feed.module.Module;
/**
* Bean interface for entries of SyndFeedImpl feeds.
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -37,11 +38,14 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
* Returns the entry URI.
* <p>
* How the entry URI maps to a concrete feed type (RSS or Atom) depends on
* the concrete feed type. This is explained in detail in Rome documentation,
* <a href="http://wiki.java.net/bin/edit/Javawsxml/Rome04URIMapping">Feed and entry URI mapping</a>.
* the concrete feed type. This is explained in detail in Rome
* documentation, <a
* href="http://wiki.java.net/bin/edit/Javawsxml/Rome04URIMapping">Feed and
* entry URI mapping</a>.
* <p>
* The returned URI is a normalized URI as specified in RFC 2396bis.
* <p>
*
* @return the entry URI, <b>null</b> if none.
*
*/
@ -51,9 +55,12 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
* Sets the entry URI.
* <p>
* How the entry URI maps to a concrete feed type (RSS or Atom) depends on
* the concrete feed type. This is explained in detail in Rome documentation,
* <a href="http://wiki.java.net/bin/edit/Javawsxml/Rome04URIMapping">Feed and entry URI mapping</a>.
* the concrete feed type. This is explained in detail in Rome
* documentation, <a
* href="http://wiki.java.net/bin/edit/Javawsxml/Rome04URIMapping">Feed and
* entry URI mapping</a>.
* <p>
*
* @param uri the entry URI to set, <b>null</b> if none.
*
*/
@ -62,6 +69,7 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Returns the entry title.
* <p>
*
* @return the entry title, <b>null</b> if none.
*
*/
@ -70,6 +78,7 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Sets the entry title.
* <p>
*
* @param title the entry title to set, <b>null</b> if none.
*
*/
@ -78,6 +87,7 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Returns the entry title as a text construct.
* <p>
*
* @return the entry title, <b>null</b> if none.
*
*/
@ -86,6 +96,7 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Sets the entry title as a text construct.
* <p>
*
* @param title the entry title to set, <b>null</b> if none.
*
*/
@ -94,6 +105,7 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Returns the entry link.
* <p>
*
* @return the entry link, <b>null</b> if none.
*
*/
@ -102,6 +114,7 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Sets the entry link.
* <p>
*
* @param link the entry link to set, <b>null</b> if none.
*
*/
@ -110,6 +123,7 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Returns the entry links
* <p>
*
* @return the entry links, <b>null</b> if none.
*
*/
@ -118,6 +132,7 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Sets the entry links.
* <p>
*
* @param links the entry links to set, <b>null</b> if none.
*
*/
@ -126,6 +141,7 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Returns the entry description.
* <p>
*
* @return the entry description, <b>null</b> if none.
*
*/
@ -134,6 +150,7 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Sets the entry description.
* <p>
*
* @param description the entry description to set, <b>null</b> if none.
*
*/
@ -142,8 +159,9 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Returns the entry contents.
* <p>
* @return a list of SyndContentImpl elements with the entry contents,
* an empty list if none.
*
* @return a list of SyndContentImpl elements with the entry contents, an
* empty list if none.
*
*/
List<SyndContent> getContents();
@ -151,8 +169,9 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Sets the entry contents.
* <p>
* @param contents the list of SyndContentImpl elements with the entry contents to set,
* an empty list or <b>null</b> if none.
*
* @param contents the list of SyndContentImpl elements with the entry
* contents to set, an empty list or <b>null</b> if none.
*
*/
void setContents(List<SyndContent> contents);
@ -160,8 +179,9 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Returns the entry enclosures.
* <p>
* @return a list of SyndEnclosure elements with the entry enclosures,
* an empty list if none.
*
* @return a list of SyndEnclosure elements with the entry enclosures, an
* empty list if none.
*
*/
public List<SyndEnclosure> getEnclosures();
@ -169,8 +189,9 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Sets the entry enclosures.
* <p>
* @param enclosures the list of SyndEnclosure elements with the entry enclosures to set,
* an empty list or <b>null</b> if none.
*
* @param enclosures the list of SyndEnclosure elements with the entry
* enclosures to set, an empty list or <b>null</b> if none.
*
*/
public void setEnclosures(List<SyndEnclosure> enclosures);
@ -178,8 +199,10 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Returns the entry published date.
* <p>
* This method is a convenience method, it maps to the Dublin Core module date.
* This method is a convenience method, it maps to the Dublin Core module
* date.
* <p>
*
* @return the entry published date, <b>null</b> if none.
*
*/
@ -188,9 +211,12 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Sets the entry published date.
* <p>
* This method is a convenience method, it maps to the Dublin Core module date.
* This method is a convenience method, it maps to the Dublin Core module
* date.
* <p>
* @param publishedDate the entry published date to set, <b>null</b> if none.
*
* @param publishedDate the entry published date to set, <b>null</b> if
* none.
*
*/
void setPublishedDate(Date publishedDate);
@ -198,6 +224,7 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Returns the entry updated date.
* <p>
*
* @return the entry updated date, <b>null</b> if none.
*
*/
@ -206,6 +233,7 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Sets the entry updated date.
* <p>
*
* @param updatedDate the entry updated date to set, <b>null</b> if none.
*
*/
@ -215,9 +243,10 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
* Returns the entry authors.
* <p>
* For Atom feeds, this returns the authors as a list of SyndPerson objects,
* for RSS feeds this method is a convenience method, it maps to the
* Dublin Core module creator.
* for RSS feeds this method is a convenience method, it maps to the Dublin
* Core module creator.
* <p>
*
* @return the feed author, <b>null</b> if none.
*
*/
@ -226,10 +255,11 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Sets the entry author.
* <p>
* For Atom feeds, this sets the authors as a list of SyndPerson
* objects, for RSS feeds this method is a convenience method, it maps
* to the Dublin Core module creator.
* For Atom feeds, this sets the authors as a list of SyndPerson objects,
* for RSS feeds this method is a convenience method, it maps to the Dublin
* Core module creator.
* <p>
*
* @param authors the feed author to set, <b>null</b> if none.
*
*/
@ -239,9 +269,10 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
* Returns the name of the first entry author in the collection of authors.
* <p>
* For Atom feeds, this returns the authors as a list of SyndPerson objects,
* for RSS feeds this method is a convenience method, it maps to the
* Dublin Core module creator.
* for RSS feeds this method is a convenience method, it maps to the Dublin
* Core module creator.
* <p>
*
* @return the feed author, <b>null</b> if none.
*
*/
@ -250,10 +281,11 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Sets the entry author.
* <p>
* For Atom feeds, this sets the feed author's name, for RSS feeds
* this method is a convenience method, it maps to the Dublin Core
* module creator.
* For Atom feeds, this sets the feed author's name, for RSS feeds this
* method is a convenience method, it maps to the Dublin Core module
* creator.
* <p>
*
* @param author the feed author to set, <b>null</b> if none.
*/
void setAuthor(String author);
@ -261,9 +293,10 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Returns the feed author.
* <p>
* For Atom feeds, this returns the contributors as a list of
* SyndPerson objects
* For Atom feeds, this returns the contributors as a list of SyndPerson
* objects
* <p>
*
* @return the feed author, <b>null</b> if none.
*
*/
@ -274,6 +307,7 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
* <p>
* Returns contributors as a list of SyndPerson objects.
* <p>
*
* @param contributors the feed contributors to set, <b>null</b> if none.
*
*/
@ -282,10 +316,12 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Returns the entry categories.
* <p>
* This method is a convenience method, it maps to the Dublin Core module subjects.
* This method is a convenience method, it maps to the Dublin Core module
* subjects.
* <p>
* @return a list of SyndCategoryImpl elements with the entry categories,
* an empty list if none.
*
* @return a list of SyndCategoryImpl elements with the entry categories, an
* empty list if none.
*
*/
List<SyndCategory> getCategories();
@ -293,10 +329,12 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Sets the entry categories.
* <p>
* This method is a convenience method, it maps to the Dublin Core module subjects.
* This method is a convenience method, it maps to the Dublin Core module
* subjects.
* <p>
* @param categories the list of SyndCategoryImpl elements with the entry categories to set,
* an empty list or <b>null</b> if none.
*
* @param categories the list of SyndCategoryImpl elements with the entry
* categories to set, an empty list or <b>null</b> if none.
*
*/
void setCategories(List<SyndCategory> categories);
@ -306,6 +344,7 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
* <p>
* This returns the entry source as a SyndFeed
* <p>
*
* @return the SyndFeed to which this entry is attributed
*
*/
@ -314,53 +353,60 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Sets the entry source feed (for use if different from containing feed)
* <p>
*
* @param source the original SyndFeed that contained this article
*
*/
void setSource(SyndFeed source);
/**
* Return the original item this SyndEntry is generated from.
* The type of the object returned depends on the original type of
* the feed. Atom 0.3/1.0 will return com.sun.syndication.feed.atom.Entry,
* while RSS will return com.sun.syndication.feed.rss.Item.java.
* If this entry was not generated from a WireFeed, or the SyndFeed
* was not set to preserve the WireFeed then it will return null
* Return the original item this SyndEntry is generated from. The type of
* the object returned depends on the original type of the feed. Atom
* 0.3/1.0 will return com.sun.syndication.feed.atom.Entry, while RSS will
* return com.sun.syndication.feed.rss.Item.java. If this entry was not
* generated from a WireFeed, or the SyndFeed was not set to preserve the
* WireFeed then it will return null
*
* @return the WireFeed Item or Entry this Entry is generated from, or null
*/
Object getWireEntry();
/**
* Returns the module identified by a given URI.
* <p>
*
* @param uri the URI of the ModuleImpl.
* @return The module with the given URI, <b>null</b> if none.
*/
@Override
public Module getModule(String uri);
/**
* Returns the entry modules.
* <p>
* @return a list of ModuleImpl elements with the entry modules,
* an empty list if none.
*
* @return a list of ModuleImpl elements with the entry modules, an empty
* list if none.
*
*/
@Override
List<Module> getModules();
/**
* Sets the entry modules.
* <p>
* @param modules the list of ModuleImpl elements with the entry modules to set,
* an empty list or <b>null</b> if none.
*
* @param modules the list of ModuleImpl elements with the entry modules to
* set, an empty list or <b>null</b> if none.
*
*/
@Override
void setModules(List<Module> modules);
/**
* Returns foreign markup found at channel level.
* <p>
*
* @return Opaque object to discourage use
*
*/
@ -369,6 +415,7 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Sets foreign markup found at channel level.
* <p>
*
* @param foreignMarkup Opaque object to discourage use
*
*/
@ -377,14 +424,17 @@ public interface SyndEntry extends Cloneable, CopyFrom, Extendable {
/**
* Creates a deep clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
public Object clone() throws CloneNotSupportedException;
/**
* Returns the first instance of a SyndLink with the specified relation, or null
* Returns the first instance of a SyndLink with the specified relation, or
* null
*
*/
public SyndLink findRelatedLink(String relation);

View file

@ -16,26 +16,38 @@
*/
package com.sun.syndication.feed.synd;
import com.sun.syndication.feed.CopyFrom;
import com.sun.syndication.feed.impl.ObjectBean;
import com.sun.syndication.feed.module.*;
import com.sun.syndication.feed.module.impl.ModuleUtils;
import com.sun.syndication.feed.synd.impl.URINormalizer;
import com.sun.syndication.feed.impl.CopyFromHelper;
import java.util.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jdom2.Element;
import com.sun.syndication.feed.CopyFrom;
import com.sun.syndication.feed.impl.CopyFromHelper;
import com.sun.syndication.feed.impl.ObjectBean;
import com.sun.syndication.feed.module.DCModule;
import com.sun.syndication.feed.module.DCModuleImpl;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.feed.module.SyModule;
import com.sun.syndication.feed.module.SyModuleImpl;
import com.sun.syndication.feed.module.impl.ModuleUtils;
import com.sun.syndication.feed.synd.impl.URINormalizer;
/**
* Bean for entries of SyndFeedImpl feeds.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class SyndEntryImpl implements Serializable,SyndEntry {
private ObjectBean _objBean;
public class SyndEntryImpl implements Serializable, SyndEntry {
private final ObjectBean _objBean;
private String _uri;
private String _link;
private Date _updatedDate;
@ -49,7 +61,8 @@ public class SyndEntryImpl implements Serializable,SyndEntry {
private List<SyndPerson> _contributors;
private SyndFeed _source;
private List<Element> _foreignMarkup;
private Object wireEntry; // com.sun.syndication.feed.atom.Entry or com.sun.syndication.feed.rss.Item
private Object wireEntry; // com.sun.syndication.feed.atom.Entry or
// com.sun.syndication.feed.rss.Item
// ISSUE: some converters assume this is never null
private List<SyndCategory> _categories = new ArrayList<SyndCategory>();
@ -59,8 +72,9 @@ public class SyndEntryImpl implements Serializable,SyndEntry {
/**
* Unmodifiable Set containing the convenience properties of this class.
* <p>
* Convenience properties are mapped to Modules, for cloning the convenience properties
* can be ignored as the will be copied as part of the module cloning.
* Convenience properties are mapped to Modules, for cloning the convenience
* properties can be ignored as the will be copied as part of the module
* cloning.
*/
public static final Set<String> CONVENIENCE_PROPERTIES = Collections.unmodifiableSet(IGNORE_PROPERTIES);
@ -70,16 +84,18 @@ public class SyndEntryImpl implements Serializable,SyndEntry {
}
/**
* For implementations extending SyndEntryImpl to be able to use the ObjectBean functionality
* with extended interfaces.
* For implementations extending SyndEntryImpl to be able to use the
* ObjectBean functionality with extended interfaces.
* <p>
*
* @param beanClass
* @param convenienceProperties set containing the convenience properties of the SyndEntryImpl
* (the are ignored during cloning, check CloneableBean for details).
* @param convenienceProperties set containing the convenience properties of
* the SyndEntryImpl (the are ignored during cloning, check
* CloneableBean for details).
*
*/
protected SyndEntryImpl(Class beanClass,Set convenienceProperties) {
_objBean = new ObjectBean(beanClass,this,convenienceProperties);
protected SyndEntryImpl(final Class beanClass, final Set convenienceProperties) {
this._objBean = new ObjectBean(beanClass, this, convenienceProperties);
}
/**
@ -88,42 +104,47 @@ public class SyndEntryImpl implements Serializable,SyndEntry {
*
*/
public SyndEntryImpl() {
this(SyndEntry.class,IGNORE_PROPERTIES);
this(SyndEntry.class, IGNORE_PROPERTIES);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
public boolean equals(final Object other) {
if (other == null) {
return false;
}
// while ObjectBean does this check this method does a cast to obtain the foreign markup
// while ObjectBean does this check this method does a cast to obtain
// the foreign markup
// so we need to check before doing so.
if (!(other instanceof SyndEntryImpl)) {
return false;
}
// can't use foreign markup in equals, due to JDOM equals impl
List<Element> fm = getForeignMarkup();
setForeignMarkup(((SyndEntryImpl)other).getForeignMarkup());
boolean ret = _objBean.equals(other);
final List<Element> fm = getForeignMarkup();
setForeignMarkup(((SyndEntryImpl) other).getForeignMarkup());
final boolean ret = this._objBean.equals(other);
// restore foreign markup
setForeignMarkup(fm);
return ret;
@ -134,191 +155,230 @@ public class SyndEntryImpl implements Serializable,SyndEntry {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the entry URI.
* <p>
* How the entry URI maps to a concrete feed type (RSS or Atom) depends on
* the concrete feed type. This is explained in detail in Rome documentation,
* <a href="http://wiki.java.net/bin/edit/Javawsxml/Rome04URIMapping">Feed and entry URI mapping</a>.
* the concrete feed type. This is explained in detail in Rome
* documentation, <a
* href="http://wiki.java.net/bin/edit/Javawsxml/Rome04URIMapping">Feed and
* entry URI mapping</a>.
* <p>
* The returned URI is a normalized URI as specified in RFC 2396bis.
* <p>
*
* @return the entry URI, <b>null</b> if none.
*
*/
@Override
public String getUri() {
return _uri;
return this._uri;
}
/**
* Sets the entry URI.
* <p>
* How the entry URI maps to a concrete feed type (RSS or Atom) depends on
* the concrete feed type. This is explained in detail in Rome documentation,
* <a href="http://wiki.java.net/bin/edit/Javawsxml/Rome04URIMapping">Feed and entry URI mapping</a>.
* the concrete feed type. This is explained in detail in Rome
* documentation, <a
* href="http://wiki.java.net/bin/edit/Javawsxml/Rome04URIMapping">Feed and
* entry URI mapping</a>.
* <p>
*
* @param uri the entry URI to set, <b>null</b> if none.
*
*/
public void setUri(String uri) {
_uri = URINormalizer.normalize(uri);
@Override
public void setUri(final String uri) {
this._uri = URINormalizer.normalize(uri);
}
/**
* Returns the entry title.
* <p>
*
* @return the entry title, <b>null</b> if none.
*
*/
@Override
public String getTitle() {
if (_title != null) return _title.getValue();
if (this._title != null) {
return this._title.getValue();
}
return null;
}
/**
* Sets the entry title.
* <p>
*
* @param title the entry title to set, <b>null</b> if none.
*
*/
public void setTitle(String title) {
if (_title == null) _title = new SyndContentImpl();
_title.setValue(title);
@Override
public void setTitle(final String title) {
if (this._title == null) {
this._title = new SyndContentImpl();
}
this._title.setValue(title);
}
/**
* Returns the entry title as a text construct.
* <p>
*
* @return the entry title, <b>null</b> if none.
*
*/
@Override
public SyndContent getTitleEx() {
return _title;
return this._title;
}
/**
* Sets the entry title as a text construct.
* <p>
*
* @param title the entry title to set, <b>null</b> if none.
*
*/
public void setTitleEx(SyndContent title) {
_title = title;
@Override
public void setTitleEx(final SyndContent title) {
this._title = title;
}
/**
* Returns the entry link.
* <p>
*
* @return the entry link, <b>null</b> if none.
*
*/
@Override
public String getLink() {
return _link;
return this._link;
}
/**
* Sets the entry link.
* <p>
*
* @param link the entry link to set, <b>null</b> if none.
*
*/
public void setLink(String link) {
_link = link;
@Override
public void setLink(final String link) {
this._link = link;
}
/**
* Returns the entry description.
* <p>
*
* @return the entry description, <b>null</b> if none.
*
*/
@Override
public SyndContent getDescription() {
return _description;
return this._description;
}
/**
* Sets the entry description.
* <p>
*
* @param description the entry description to set, <b>null</b> if none.
*
*/
public void setDescription(SyndContent description) {
_description = description;
@Override
public void setDescription(final SyndContent description) {
this._description = description;
}
/**
* Returns the entry contents.
* <p>
* @return a list of SyndContentImpl elements with the entry contents,
* an empty list if none.
*
* @return a list of SyndContentImpl elements with the entry contents, an
* empty list if none.
*
*/
@Override
public List<SyndContent> getContents() {
return (_contents==null) ? (_contents=new ArrayList<SyndContent>()) : _contents;
return this._contents == null ? (this._contents = new ArrayList<SyndContent>()) : this._contents;
}
/**
* Sets the entry contents.
* <p>
* @param contents the list of SyndContentImpl elements with the entry contents to set,
* an empty list or <b>null</b> if none.
*
* @param contents the list of SyndContentImpl elements with the entry
* contents to set, an empty list or <b>null</b> if none.
*
*/
public void setContents(List<SyndContent> contents) {
_contents = contents;
@Override
public void setContents(final List<SyndContent> contents) {
this._contents = contents;
}
/**
* Returns the entry enclosures.
* <p>
* @return a list of SyndEnclosure elements with the entry enclosures,
* an empty list if none.
*
* @return a list of SyndEnclosure elements with the entry enclosures, an
* empty list if none.
*
*/
@Override
public List<SyndEnclosure> getEnclosures() {
return (_enclosures==null) ? (_enclosures=new ArrayList<SyndEnclosure>()) : _enclosures;
return this._enclosures == null ? (this._enclosures = new ArrayList<SyndEnclosure>()) : this._enclosures;
}
/**
* Sets the entry enclosures.
* <p>
* @param enclosures the list of SyndEnclosure elements with the entry enclosures to set,
* an empty list or <b>null</b> if none.
*
* @param enclosures the list of SyndEnclosure elements with the entry
* enclosures to set, an empty list or <b>null</b> if none.
*
*/
public void setEnclosures(List<SyndEnclosure> enclosures) {
_enclosures = enclosures;
@Override
public void setEnclosures(final List<SyndEnclosure> enclosures) {
this._enclosures = enclosures;
}
/**
* Returns the entry published date.
* <p>
* This method is a convenience method, it maps to the Dublin Core module date.
* This method is a convenience method, it maps to the Dublin Core module
* date.
* <p>
*
* @return the entry published date, <b>null</b> if none.
*
*/
@Override
public Date getPublishedDate() {
return getDCModule().getDate();
}
@ -326,79 +386,95 @@ public class SyndEntryImpl implements Serializable,SyndEntry {
/**
* Sets the entry published date.
* <p>
* This method is a convenience method, it maps to the Dublin Core module date.
* This method is a convenience method, it maps to the Dublin Core module
* date.
* <p>
* @param publishedDate the entry published date to set, <b>null</b> if none.
*
* @param publishedDate the entry published date to set, <b>null</b> if
* none.
*
*/
public void setPublishedDate(Date publishedDate) {
@Override
public void setPublishedDate(final Date publishedDate) {
getDCModule().setDate(publishedDate);
}
/**
* Returns the entry categories.
* <p>
* @return a list of SyndCategoryImpl elements with the entry categories,
* an empty list if none.
*
* @return a list of SyndCategoryImpl elements with the entry categories, an
* empty list if none.
*
*/
@Override
public List<SyndCategory> getCategories() {
return _categories;
return this._categories;
}
/**
* Sets the entry categories.
* <p>
* This method is a convenience method, it maps to the Dublin Core module subjects.
* This method is a convenience method, it maps to the Dublin Core module
* subjects.
* <p>
* @param categories the list of SyndCategoryImpl elements with the entry categories to set,
* an empty list or <b>null</b> if none.
*
* @param categories the list of SyndCategoryImpl elements with the entry
* categories to set, an empty list or <b>null</b> if none.
*
*/
public void setCategories(List<SyndCategory> categories) {
_categories = categories;
@Override
public void setCategories(final List<SyndCategory> categories) {
this._categories = categories;
}
/**
* Returns the entry modules.
* <p>
* @return a list of ModuleImpl elements with the entry modules,
* an empty list if none.
*
* @return a list of ModuleImpl elements with the entry modules, an empty
* list if none.
*
*/
@Override
public List<Module> getModules() {
if (_modules==null) {
_modules=new ArrayList<Module>();
if (this._modules == null) {
this._modules = new ArrayList<Module>();
}
if (ModuleUtils.getModule(_modules,DCModule.URI)==null) {
_modules.add(new DCModuleImpl());
if (ModuleUtils.getModule(this._modules, DCModule.URI) == null) {
this._modules.add(new DCModuleImpl());
}
return _modules;
return this._modules;
}
/**
* Sets the entry modules.
* <p>
* @param modules the list of ModuleImpl elements with the entry modules to set,
* an empty list or <b>null</b> if none.
*
* @param modules the list of ModuleImpl elements with the entry modules to
* set, an empty list or <b>null</b> if none.
*
*/
public void setModules(List<Module> modules) {
_modules = modules;
@Override
public void setModules(final List<Module> modules) {
this._modules = modules;
}
/**
* Returns the module identified by a given URI.
* <p>
*
* @param uri the URI of the ModuleImpl.
* @return The module with the given URI, <b>null</b> if none.
*/
public Module getModule(String uri) {
return ModuleUtils.getModule(getModules(),uri);
@Override
public Module getModule(final String uri) {
return ModuleUtils.getModule(getModules(), uri);
}
/**
* Returns the Dublin Core module of the feed.
*
* @return the DC module, it's never <b>null</b>
*
*/
@ -406,98 +482,114 @@ public class SyndEntryImpl implements Serializable,SyndEntry {
return (DCModule) getModule(DCModule.URI);
}
@Override
public Class getInterface() {
return SyndEntry.class;
}
public void copyFrom(CopyFrom obj) {
COPY_FROM_HELPER.copy(this,obj);
@Override
public void copyFrom(final CopyFrom obj) {
COPY_FROM_HELPER.copy(this, obj);
}
private static final CopyFromHelper COPY_FROM_HELPER;
static {
Map basePropInterfaceMap = new HashMap();
basePropInterfaceMap.put("uri",String.class);
basePropInterfaceMap.put("title",String.class);
basePropInterfaceMap.put("link",String.class);
basePropInterfaceMap.put("uri",String.class);
basePropInterfaceMap.put("description",SyndContent.class);
basePropInterfaceMap.put("contents",SyndContent.class);
basePropInterfaceMap.put("enclosures",SyndEnclosure.class);
basePropInterfaceMap.put("modules",Module.class);
final Map basePropInterfaceMap = new HashMap();
basePropInterfaceMap.put("uri", String.class);
basePropInterfaceMap.put("title", String.class);
basePropInterfaceMap.put("link", String.class);
basePropInterfaceMap.put("uri", String.class);
basePropInterfaceMap.put("description", SyndContent.class);
basePropInterfaceMap.put("contents", SyndContent.class);
basePropInterfaceMap.put("enclosures", SyndEnclosure.class);
basePropInterfaceMap.put("modules", Module.class);
Map basePropClassImplMap = new HashMap();
basePropClassImplMap.put(SyndContent.class,SyndContentImpl.class);
basePropClassImplMap.put(SyndEnclosure.class,SyndEnclosureImpl.class);
basePropClassImplMap.put(DCModule.class,DCModuleImpl.class);
basePropClassImplMap.put(SyModule.class,SyModuleImpl.class);
final Map basePropClassImplMap = new HashMap();
basePropClassImplMap.put(SyndContent.class, SyndContentImpl.class);
basePropClassImplMap.put(SyndEnclosure.class, SyndEnclosureImpl.class);
basePropClassImplMap.put(DCModule.class, DCModuleImpl.class);
basePropClassImplMap.put(SyModule.class, SyModuleImpl.class);
COPY_FROM_HELPER = new CopyFromHelper(SyndEntry.class,basePropInterfaceMap,basePropClassImplMap);
COPY_FROM_HELPER = new CopyFromHelper(SyndEntry.class, basePropInterfaceMap, basePropClassImplMap);
}
/**
* Returns the links
* <p>
*
* @return Returns the links.
*/
@Override
public List<SyndLink> getLinks() {
return (_links==null) ? (_links=new ArrayList<SyndLink>()) : _links;
return this._links == null ? (this._links = new ArrayList<SyndLink>()) : this._links;
}
/**
* Set the links
* <p>
*
* @param links The links to set.
*/
public void setLinks(List<SyndLink> links) {
_links = links;
@Override
public void setLinks(final List<SyndLink> links) {
this._links = links;
}
/**
* Returns the updatedDate
* <p>
*
* @return Returns the updatedDate.
*/
@Override
public Date getUpdatedDate() {
return _updatedDate == null ? null : new Date(_updatedDate.getTime());
return this._updatedDate == null ? null : new Date(this._updatedDate.getTime());
}
/**
* Set the updatedDate
* <p>
*
* @param updatedDate The updatedDate to set.
*/
public void setUpdatedDate(Date updatedDate) {
_updatedDate = new Date(updatedDate.getTime());
@Override
public void setUpdatedDate(final Date updatedDate) {
this._updatedDate = new Date(updatedDate.getTime());
}
@Override
public List<SyndPerson> getAuthors() {
return (_authors==null) ? (_authors=new ArrayList<SyndPerson>()) : _authors;
return this._authors == null ? (this._authors = new ArrayList<SyndPerson>()) : this._authors;
}
/* (non-Javadoc)
/*
* (non-Javadoc)
* @see com.sun.syndication.feed.synd.SyndEntry#setAuthors(java.util.List)
*/
public void setAuthors(List<SyndPerson> authors) {
_authors = authors;
@Override
public void setAuthors(final List<SyndPerson> authors) {
this._authors = authors;
}
/**
* Returns the entry author.
* <p>
* This method is a convenience method, it maps to the Dublin Core module creator.
* This method is a convenience method, it maps to the Dublin Core module
* creator.
* <p>
*
* @return the entry author, <b>null</b> if none.
*
*/
@Override
public String getAuthor() {
String author;
// Start out looking for one or more authors in _authors. For non-Atom
// feeds, _authors may actually be null.
if ((_authors != null) && (_authors.size() > 0)) {
author = ((SyndPerson)_authors.get(0)).getName();
if (this._authors != null && this._authors.size() > 0) {
author = this._authors.get(0).getName();
} else {
author = getDCModule().getCreator();
}
@ -511,74 +603,89 @@ public class SyndEntryImpl implements Serializable,SyndEntry {
/**
* Sets the entry author.
* <p>
* This method is a convenience method, it maps to the Dublin Core module creator.
* This method is a convenience method, it maps to the Dublin Core module
* creator.
* <p>
*
* @param author the entry author to set, <b>null</b> if none.
*
*/
public void setAuthor(String author) {
@Override
public void setAuthor(final String author) {
// Get the DCModule so that we can check to see if "creator" is already
// set.
DCModule dcModule = getDCModule();
String currentValue = dcModule.getCreator();
final DCModule dcModule = getDCModule();
final String currentValue = dcModule.getCreator();
if ((currentValue == null) || (currentValue.length() == 0)) {
if (currentValue == null || currentValue.length() == 0) {
getDCModule().setCreator(author);
}
}
@Override
public List<SyndPerson> getContributors() {
return (_contributors==null) ? (_contributors=new ArrayList<SyndPerson>()) : _contributors;
return this._contributors == null ? (this._contributors = new ArrayList<SyndPerson>()) : this._contributors;
}
/* (non-Javadoc)
* @see com.sun.syndication.feed.synd.SyndEntry#setContributors(java.util.List)
/*
* (non-Javadoc)
* @see
* com.sun.syndication.feed.synd.SyndEntry#setContributors(java.util.List)
*/
public void setContributors(List<SyndPerson> contributors) {
_contributors = contributors;
@Override
public void setContributors(final List<SyndPerson> contributors) {
this._contributors = contributors;
}
@Override
public SyndFeed getSource() {
return _source;
return this._source;
}
public void setSource(SyndFeed source) {
_source = source;
@Override
public void setSource(final SyndFeed source) {
this._source = source;
}
/**
* Returns foreign markup found at channel level.
* <p>
* @return list of JDOM nodes containing channel-level foreign markup,
* an empty list if none.
*
* @return list of JDOM nodes containing channel-level foreign markup, an
* empty list if none.
*
*/
@Override
public List<Element> getForeignMarkup() {
return (_foreignMarkup==null) ? (_foreignMarkup=new ArrayList<Element>()) : _foreignMarkup;
return this._foreignMarkup == null ? (this._foreignMarkup = new ArrayList<Element>()) : this._foreignMarkup;
}
/**
* Sets foreign markup found at channel level.
* <p>
* @param foreignMarkup list of JDOM nodes containing channel-level foreign markup,
* an empty list if none.
*
* @param foreignMarkup list of JDOM nodes containing channel-level foreign
* markup, an empty list if none.
*
*/
public void setForeignMarkup(List<Element> foreignMarkup) {
_foreignMarkup = (List<Element>)foreignMarkup;
@Override
public void setForeignMarkup(final List<Element> foreignMarkup) {
this._foreignMarkup = foreignMarkup;
}
@Override
public Object getWireEntry() {
return wireEntry;
return this.wireEntry;
}
public void setWireEntry(Object wireEntry) {
public void setWireEntry(final Object wireEntry) {
this.wireEntry = wireEntry;
}
public SyndLink findRelatedLink(String relation) {
for(SyndLink l : this.getLinks()){
if(relation.equals(l.getRel())){
@Override
public SyndLink findRelatedLink(final String relation) {
for (final SyndLink l : getLinks()) {
if (relation.equals(l.getRel())) {
return l;
}
}

View file

@ -16,29 +16,33 @@
*/
package com.sun.syndication.feed.synd;
import com.sun.syndication.feed.CopyFrom;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.module.Extendable;
import com.sun.syndication.feed.module.Module;
import java.util.Date;
import java.util.List;
import org.jdom2.Element;
import com.sun.syndication.feed.CopyFrom;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.module.Extendable;
import com.sun.syndication.feed.module.Module;
/**
* Bean interface for all types of feeds.
* <p>
* It handles all RSS versions and Atom 0.3, it normalizes all info, it may lose information.
* It handles all RSS versions and Atom 0.3, it normalizes all info, it may lose
* information.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Returns the real feed types the SyndFeedImpl supports when converting from and to.
* Returns the real feed types the SyndFeedImpl supports when converting
* from and to.
* <p>
*
* @return the real feed type supported.
*/
List<String> getSupportedFeedTypes();
@ -46,8 +50,10 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Creates a real feed containing the information of the SyndFeedImpl.
* <p>
* The feed type of the created WireFeed is taken from the SyndFeedImpl feedType property.
* The feed type of the created WireFeed is taken from the SyndFeedImpl
* feedType property.
* <p>
*
* @return the real feed.
*
*/
@ -56,6 +62,7 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Creates a real feed containing the information of the SyndFeedImpl.
* <p>
*
* @param feedType the feed type for the WireFeed to be created.
* @return the real feed.
*
@ -63,8 +70,9 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
WireFeed createWireFeed(String feedType);
/**
* Returns the WireFeed this SyndFeed was created from.
* Will return null if the original feed is not stored or if this SyndFeed was not created from a WireFeed
* Returns the WireFeed this SyndFeed was created from. Will return null if
* the original feed is not stored or if this SyndFeed was not created from
* a WireFeed
*
* @return The WireFeed this was created from, or null
*
@ -78,8 +86,10 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
boolean isPreservingWireFeed();
/**
* Returns the wire feed type the feed had/will-have when converted from/to a WireFeed.
* Returns the wire feed type the feed had/will-have when converted from/to
* a WireFeed.
* <p>
*
* @return the feed type, <b>null</b> if none.
*
*/
@ -88,14 +98,17 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Sets the wire feed type the feed will-have when coverted to a WireFeed.
* <p>
*
* @param feedType the feed type to set, <b>null</b> if none.
*
*/
void setFeedType(String feedType);
/**
* Returns the charset encoding of a the feed. This is not set by Rome parsers.
* Returns the charset encoding of a the feed. This is not set by Rome
* parsers.
* <p>
*
* @return the charset encoding of the feed.
*
*/
@ -104,6 +117,7 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Sets the charset encoding of a the feed. This is not set by Rome parsers.
* <p>
*
* @param encoding the charset encoding of the feed.
*
*/
@ -113,23 +127,26 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
* Returns the feed URI.
* <p>
* How the feed URI maps to a concrete feed type (RSS or Atom) depends on
* the concrete feed type. This is explained in detail in Rome documentation,
* <a href="http://wiki.java.net/bin/edit/Javawsxml/Rome04URIMapping">Feed and entry URI mapping</a>.
* the concrete feed type. This is explained in detail in Rome
* documentation, <a
* href="http://wiki.java.net/bin/edit/Javawsxml/Rome04URIMapping">Feed and
* entry URI mapping</a>.
* <p>
* The returned URI is a normalized URI as specified in RFC 2396bis.
* <p>
* Note: The URI is the unique identifier, in the RSS 2.0/atom case this is
* the GUID, for RSS 1.0 this is the URI attribute of the item. The Link
* is the URL that the item is accessible under, the URI is the
* permanent identifier which the aggregator should use to reference
* this item. Often the URI will use some standardized identifier scheme
* such as DOI's so that items can be identified even if they appear in
* multiple feeds with different "links" (they might be on different
* hosting platforms but be the same item). Also, though rare, there
* could be multiple items with the same link but a different URI and
* associated metadata which need to be treated as distinct entities.
* In the RSS 1.0 case the URI must be a valid RDF URI reference.
* the GUID, for RSS 1.0 this is the URI attribute of the item. The Link is
* the URL that the item is accessible under, the URI is the permanent
* identifier which the aggregator should use to reference this item. Often
* the URI will use some standardized identifier scheme such as DOI's so
* that items can be identified even if they appear in multiple feeds with
* different "links" (they might be on different hosting platforms but be
* the same item). Also, though rare, there could be multiple items with the
* same link but a different URI and associated metadata which need to be
* treated as distinct entities. In the RSS 1.0 case the URI must be a valid
* RDF URI reference.
* <p>
*
* @return the feed URI, <b>null</b> if none.
*
*/
@ -139,21 +156,24 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
* Sets the feed URI.
* <p>
* How the feed URI maps to a concrete feed type (RSS or Atom) depends on
* the concrete feed type. This is explained in detail in Rome documentation,
* <a href="http://wiki.java.net/bin/edit/Javawsxml/Rome04URIMapping">Feed and entry URI mapping</a>.
* the concrete feed type. This is explained in detail in Rome
* documentation, <a
* href="http://wiki.java.net/bin/edit/Javawsxml/Rome04URIMapping">Feed and
* entry URI mapping</a>.
* <p>
* Note: The URI is the unique identifier, in the RSS 2.0/atom case this is
* the GUID, for RSS 1.0 this is the URI attribute of the item. The Link
* is the URL that the item is accessible under, the URI is the
* permanent identifier which the aggregator should use to reference
* this item. Often the URI will use some standardized identifier scheme
* such as DOI's so that items can be identified even if they appear in
* multiple feeds with different "links" (they might be on different
* hosting platforms but be the same item). Also, though rare, there
* could be multiple items with the same link but a different URI and
* associated metadata which need to be treated as distinct entities.
* In the RSS 1.0 case the URI must be a valid RDF URI reference.
* the GUID, for RSS 1.0 this is the URI attribute of the item. The Link is
* the URL that the item is accessible under, the URI is the permanent
* identifier which the aggregator should use to reference this item. Often
* the URI will use some standardized identifier scheme such as DOI's so
* that items can be identified even if they appear in multiple feeds with
* different "links" (they might be on different hosting platforms but be
* the same item). Also, though rare, there could be multiple items with the
* same link but a different URI and associated metadata which need to be
* treated as distinct entities. In the RSS 1.0 case the URI must be a valid
* RDF URI reference.
* <p>
*
* @param uri the feed URI to set, <b>null</b> if none.
*
*/
@ -162,6 +182,7 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Returns the feed title.
* <p>
*
* @return the feed title, <b>null</b> if none.
*
*/
@ -170,6 +191,7 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Sets the feed title.
* <p>
*
* @param title the feed title to set, <b>null</b> if none.
*
*/
@ -178,6 +200,7 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Returns the feed title.
* <p>
*
* @return the feed title, <b>null</b> if none.
*
*/
@ -186,6 +209,7 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Sets the feed title.
* <p>
*
* @param title the feed title to set, <b>null</b> if none.
*
*/
@ -195,17 +219,18 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
* Returns the feed link.
* <p>
* Note: The URI is the unique identifier, in the RSS 2.0/atom case this is
* the GUID, for RSS 1.0 this is the URI attribute of the item. The Link
* is the URL that the item is accessible under, the URI is the
* permanent identifier which the aggregator should use to reference
* this item. Often the URI will use some standardized identifier scheme
* such as DOI's so that items can be identified even if they appear in
* multiple feeds with different "links" (they might be on different
* hosting platforms but be the same item). Also, though rare, there
* could be multiple items with the same link but a different URI and
* associated metadata which need to be treated as distinct entities.
* In the RSS 1.0 case the URI must be a valid RDF URI reference.
* the GUID, for RSS 1.0 this is the URI attribute of the item. The Link is
* the URL that the item is accessible under, the URI is the permanent
* identifier which the aggregator should use to reference this item. Often
* the URI will use some standardized identifier scheme such as DOI's so
* that items can be identified even if they appear in multiple feeds with
* different "links" (they might be on different hosting platforms but be
* the same item). Also, though rare, there could be multiple items with the
* same link but a different URI and associated metadata which need to be
* treated as distinct entities. In the RSS 1.0 case the URI must be a valid
* RDF URI reference.
* <p>
*
* @return the feed link, <b>null</b> if none.
*
*/
@ -215,17 +240,18 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
* Sets the feed link.
* <p>
* Note: The URI is the unique identifier, in the RSS 2.0/atom case this is
* the GUID, for RSS 1.0 this is the URI attribute of the item. The Link
* is the URL that the item is accessible under, the URI is the
* permanent identifier which the aggregator should use to reference
* this item. Often the URI will use some standardized identifier scheme
* such as DOI's so that items can be identified even if they appear in
* multiple feeds with different "links" (they might be on different
* hosting platforms but be the same item). Also, though rare, there
* could be multiple items with the same link but a different URI and
* associated metadata which need to be treated as distinct entities.
* In the RSS 1.0 case the URI must be a valid RDF URI reference.
* the GUID, for RSS 1.0 this is the URI attribute of the item. The Link is
* the URL that the item is accessible under, the URI is the permanent
* identifier which the aggregator should use to reference this item. Often
* the URI will use some standardized identifier scheme such as DOI's so
* that items can be identified even if they appear in multiple feeds with
* different "links" (they might be on different hosting platforms but be
* the same item). Also, though rare, there could be multiple items with the
* same link but a different URI and associated metadata which need to be
* treated as distinct entities. In the RSS 1.0 case the URI must be a valid
* RDF URI reference.
* <p>
*
* @param link the feed link to set, <b>null</b> if none.
*
*/
@ -234,6 +260,7 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Returns the entry links
* <p>
*
* @return the entry links, <b>null</b> if none.
*
*/
@ -242,6 +269,7 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Sets the entry links.
* <p>
*
* @param links the entry links to set, <b>null</b> if none.
*
*/
@ -250,6 +278,7 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Returns the feed description.
* <p>
*
* @return the feed description, <b>null</b> if none.
*
*/
@ -258,6 +287,7 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Sets the feed description.
* <p>
*
* @param description the feed description to set, <b>null</b> if none.
*
*/
@ -266,6 +296,7 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Returns the feed description as a text construct.
* <p>
*
* @return the feed description, <b>null</b> if none.
*
*/
@ -274,6 +305,7 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Sets the feed description as a text construct.
* <p>
*
* @param description the feed description to set, <b>null</b> if none.
*
*/
@ -282,8 +314,10 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Returns the feed published date.
* <p>
* This method is a convenience method, it maps to the Dublin Core module date.
* This method is a convenience method, it maps to the Dublin Core module
* date.
* <p>
*
* @return the feed published date, <b>null</b> if none.
*
*/
@ -292,8 +326,10 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Sets the feed published date.
* <p>
* This method is a convenience method, it maps to the Dublin Core module date.
* This method is a convenience method, it maps to the Dublin Core module
* date.
* <p>
*
* @param publishedDate the feed published date to set, <b>null</b> if none.
*
*/
@ -303,9 +339,10 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
* Returns the feed authors.
* <p>
* For Atom feeds, this returns the authors as a list of SyndPerson objects,
* for RSS feeds this method is a convenience method, it maps to the
* Dublin Core module creator.
* for RSS feeds this method is a convenience method, it maps to the Dublin
* Core module creator.
* <p>
*
* @return the feed authors, <b>null</b> if none.
*
*/
@ -314,10 +351,11 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Sets the feed authors.
* <p>
* For Atom feeds, this sets the authors as a list of SyndPerson
* objects, for RSS feeds this method is a convenience method, it maps
* to the Dublin Core module creator.
* For Atom feeds, this sets the authors as a list of SyndPerson objects,
* for RSS feeds this method is a convenience method, it maps to the Dublin
* Core module creator.
* <p>
*
* @param authors the feed authors to set, <b>null</b> if none.
*
*/
@ -327,9 +365,10 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
* Returns the name of the first feed author in the collection of authors.
* <p>
* For Atom feeds, this returns the authors as a list of SyndPerson objects,
* for RSS feeds this method is a convenience method, it maps to the
* Dublin Core module creator.
* for RSS feeds this method is a convenience method, it maps to the Dublin
* Core module creator.
* <p>
*
* @return the feed author, <b>null</b> if none.
*
*/
@ -338,10 +377,11 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Sets the feed author.
* <p>
* For Atom feeds, this sets the feed author's name, for RSS feeds
* this method is a convenience method, it maps to the Dublin Core
* module creator.
* For Atom feeds, this sets the feed author's name, for RSS feeds this
* method is a convenience method, it maps to the Dublin Core module
* creator.
* <p>
*
* @param author the feed author to set, <b>null</b> if none.
*
*/
@ -350,9 +390,10 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Returns the feed author.
* <p>
* For Atom feeds, this returns the contributors as a list of
* SyndPerson objects
* For Atom feeds, this returns the contributors as a list of SyndPerson
* objects
* <p>
*
* @return the feed author, <b>null</b> if none.
*
*/
@ -363,6 +404,7 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
* <p>
* Returns contributors as a list of SyndPerson objects.
* <p>
*
* @param contributors the feed contributors to set, <b>null</b> if none.
*
*/
@ -371,8 +413,10 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Returns the feed copyright.
* <p>
* This method is a convenience method, it maps to the Dublin Core module rights.
* This method is a convenience method, it maps to the Dublin Core module
* rights.
* <p>
*
* @return the feed copyright, <b>null</b> if none.
*
*/
@ -381,8 +425,10 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Sets the feed copyright.
* <p>
* This method is a convenience method, it maps to the Dublin Core module rights.
* This method is a convenience method, it maps to the Dublin Core module
* rights.
* <p>
*
* @param copyright the feed copyright to set, <b>null</b> if none.
*
*/
@ -391,6 +437,7 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Returns the feed image.
* <p>
*
* @return the feed image, <b>null</b> if none.
*
*/
@ -399,6 +446,7 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Sets the feed image.
* <p>
*
* @param image the feed image to set, <b>null</b> if none.
*
*/
@ -407,10 +455,12 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Returns the feed categories.
* <p>
* This method is a convenience method, it maps to the Dublin Core module subjects.
* This method is a convenience method, it maps to the Dublin Core module
* subjects.
* <p>
* @return a list of SyndCategoryImpl elements with the feed categories,
* an empty list if none.
*
* @return a list of SyndCategoryImpl elements with the feed categories, an
* empty list if none.
*
*/
List<SyndCategory> getCategories();
@ -418,10 +468,12 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Sets the feed categories.
* <p>
* This method is a convenience method, it maps to the Dublin Core module subjects.
* This method is a convenience method, it maps to the Dublin Core module
* subjects.
* <p>
* @param categories the list of SyndCategoryImpl elements with the feed categories to set,
* an empty list or <b>null</b> if none.
*
* @param categories the list of SyndCategoryImpl elements with the feed
* categories to set, an empty list or <b>null</b> if none.
*
*/
void setCategories(List<SyndCategory> categories);
@ -429,8 +481,9 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Returns the feed entries.
* <p>
* @return a list of SyndEntry elements with the feed entries,
* an empty list if none.
*
* @return a list of SyndEntry elements with the feed entries, an empty list
* if none.
*
*/
List<SyndEntry> getEntries();
@ -438,8 +491,9 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Sets the feed entries.
* <p>
* @param entries the list of SyndEntryImpl elements with the feed entries to set,
* an empty list or <b>null</b> if none.
*
* @param entries the list of SyndEntryImpl elements with the feed entries
* to set, an empty list or <b>null</b> if none.
*
*/
void setEntries(List<SyndEntry> entries);
@ -447,8 +501,10 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Returns the feed language.
* <p>
* This method is a convenience method, it maps to the Dublin Core module language.
* This method is a convenience method, it maps to the Dublin Core module
* language.
* <p>
*
* @return the feed language, <b>null</b> if none.
*
*/
@ -457,8 +513,10 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Sets the feed language.
* <p>
* This method is a convenience method, it maps to the Dublin Core module language.
* This method is a convenience method, it maps to the Dublin Core module
* language.
* <p>
*
* @param language the feed language to set, <b>null</b> if none.
*
*/
@ -467,32 +525,39 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Returns the module identified by a given URI.
* <p>
*
* @param uri the URI of the ModuleImpl.
* @return The module with the given URI, <b>null</b> if none.
*/
@Override
public Module getModule(String uri);
/**
* Returns the feed modules.
* <p>
* @return a list of ModuleImpl elements with the feed modules,
* an empty list if none.
*
* @return a list of ModuleImpl elements with the feed modules, an empty
* list if none.
*
*/
@Override
List<Module> getModules();
/**
* Sets the feed modules.
* <p>
* @param modules the list of ModuleImpl elements with the feed modules to set,
* an empty list or <b>null</b> if none.
*
* @param modules the list of ModuleImpl elements with the feed modules to
* set, an empty list or <b>null</b> if none.
*
*/
@Override
void setModules(List<Module> modules);
/**
* Returns foreign markup found at channel level.
* <p>
*
* @return Opaque object to discourage use
*
*/
@ -501,6 +566,7 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Sets foreign markup found at channel level.
* <p>
*
* @param foreignMarkup Opaque object to discourage use
*
*/
@ -509,8 +575,10 @@ public interface SyndFeed extends Cloneable, CopyFrom, Extendable {
/**
* Creates a deep clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
public Object clone() throws CloneNotSupportedException;

File diff suppressed because it is too large Load diff

View file

@ -22,13 +22,15 @@ import com.sun.syndication.feed.CopyFrom;
/**
* Bean interface for images of SyndFeedImpl feeds.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public interface SyndImage extends Cloneable,CopyFrom {
public interface SyndImage extends Cloneable, CopyFrom {
/**
* Returns the image title.
* <p>
*
* @return the image title, <b>null</b> if none.
*
*/
@ -37,6 +39,7 @@ public interface SyndImage extends Cloneable,CopyFrom {
/**
* Sets the image title.
* <p>
*
* @param title the image title to set, <b>null</b> if none.
*
*/
@ -45,6 +48,7 @@ public interface SyndImage extends Cloneable,CopyFrom {
/**
* Returns the image URL.
* <p>
*
* @return the image URL, <b>null</b> if none.
*
*/
@ -53,6 +57,7 @@ public interface SyndImage extends Cloneable,CopyFrom {
/**
* Sets the image URL.
* <p>
*
* @param url the image URL to set, <b>null</b> if none.
*
*/
@ -61,6 +66,7 @@ public interface SyndImage extends Cloneable,CopyFrom {
/**
* Returns the image link.
* <p>
*
* @return the image link, <b>null</b> if none.
*
*/
@ -69,6 +75,7 @@ public interface SyndImage extends Cloneable,CopyFrom {
/**
* Sets the image link.
* <p>
*
* @param link the image link to set, <b>null</b> if none.
*
*/
@ -77,6 +84,7 @@ public interface SyndImage extends Cloneable,CopyFrom {
/**
* Returns the image description.
* <p>
*
* @return the image description, <b>null</b> if none.
*
*/
@ -85,6 +93,7 @@ public interface SyndImage extends Cloneable,CopyFrom {
/**
* Sets the image description.
* <p>
*
* @param description the image description to set, <b>null</b> if none.
*
*/
@ -93,8 +102,10 @@ public interface SyndImage extends Cloneable,CopyFrom {
/**
* Creates a deep clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
public Object clone() throws CloneNotSupportedException;

View file

@ -16,23 +16,24 @@
*/
package com.sun.syndication.feed.synd;
import com.sun.syndication.feed.CopyFrom;
import com.sun.syndication.feed.impl.ObjectBean;
import com.sun.syndication.feed.impl.CopyFromHelper;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.io.Serializable;
import com.sun.syndication.feed.CopyFrom;
import com.sun.syndication.feed.impl.CopyFromHelper;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Bean for images of SyndFeedImpl feeds.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class SyndImageImpl implements Serializable,SyndImage {
private ObjectBean _objBean;
public class SyndImageImpl implements Serializable, SyndImage {
private final ObjectBean _objBean;
private String _title;
private String _url;
private String _link;
@ -44,29 +45,35 @@ public class SyndImageImpl implements Serializable,SyndImage {
*
*/
public SyndImageImpl() {
_objBean = new ObjectBean(SyndImage.class,this);
this._objBean = new ObjectBean(SyndImage.class, this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
public boolean equals(Object other) {
return _objBean.equals(other);
@Override
public boolean equals(final Object other) {
return this._objBean.equals(other);
}
/**
@ -74,123 +81,145 @@ public class SyndImageImpl implements Serializable,SyndImage {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the image title.
* <p>
*
* @return the image title, <b>null</b> if none.
*
*/
@Override
public String getTitle() {
return _title;
return this._title;
}
/**
* Sets the image title.
* <p>
*
* @param title the image title to set, <b>null</b> if none.
*
*/
public void setTitle(String title) {
_title = title;
@Override
public void setTitle(final String title) {
this._title = title;
}
/**
* Returns the image URL.
* <p>
*
* @return the image URL, <b>null</b> if none.
*
*/
@Override
public String getUrl() {
return _url;
return this._url;
}
/**
* Sets the image URL.
* <p>
*
* @param url the image URL to set, <b>null</b> if none.
*
*/
public void setUrl(String url) {
_url = url;
@Override
public void setUrl(final String url) {
this._url = url;
}
/**
* Returns the image link.
* <p>
*
* @return the image link, <b>null</b> if none.
*
*/
@Override
public String getLink() {
return _link;
return this._link;
}
/**
* Sets the image link.
* <p>
*
* @param link the image link to set, <b>null</b> if none.
*
*/
public void setLink(String link) {
_link = link;
@Override
public void setLink(final String link) {
this._link = link;
}
/**
* Returns the image description.
* <p>
*
* @return the image description, <b>null</b> if none.
*
*/
@Override
public String getDescription() {
return _description;
return this._description;
}
/**
* Sets the image description.
* <p>
*
* @param description the image description to set, <b>null</b> if none.
*
*/
public void setDescription(String description) {
_description = description;
@Override
public void setDescription(final String description) {
this._description = description;
}
@Override
public Class getInterface() {
return SyndImage.class;
}
public void copyFrom(CopyFrom syndImage) {
COPY_FROM_HELPER.copy(this,syndImage);
@Override
public void copyFrom(final CopyFrom syndImage) {
COPY_FROM_HELPER.copy(this, syndImage);
}
private static final CopyFromHelper COPY_FROM_HELPER;
static {
Map basePropInterfaceMap = new HashMap();
basePropInterfaceMap.put("title",String.class);
basePropInterfaceMap.put("url",String.class);
basePropInterfaceMap.put("link",String.class);
basePropInterfaceMap.put("description",String.class);
final Map basePropInterfaceMap = new HashMap();
basePropInterfaceMap.put("title", String.class);
basePropInterfaceMap.put("url", String.class);
basePropInterfaceMap.put("link", String.class);
basePropInterfaceMap.put("description", String.class);
Map basePropClassImplMap = Collections.EMPTY_MAP;
final Map basePropClassImplMap = Collections.EMPTY_MAP;
COPY_FROM_HELPER = new CopyFromHelper(SyndImage.class,basePropInterfaceMap,basePropClassImplMap);
COPY_FROM_HELPER = new CopyFromHelper(SyndImage.class, basePropInterfaceMap, basePropClassImplMap);
}
}

View file

@ -19,21 +19,26 @@ package com.sun.syndication.feed.synd;
/**
* Represents a link or enclosure associated with entry.
*
* @author Dave Johnson
*/
public interface SyndLink {
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
public abstract Object clone() throws CloneNotSupportedException;
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
@ -46,6 +51,7 @@ public interface SyndLink {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@ -55,6 +61,7 @@ public interface SyndLink {
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@ -64,6 +71,7 @@ public interface SyndLink {
/**
* Returns the link rel.
* <p>
*
* @return the link rel, <b>null</b> if none.
*
*/
@ -72,6 +80,7 @@ public interface SyndLink {
/**
* Sets the link rel.
* <p>
*
* @param rel the link rel,, <b>null</b> if none.
*
*/
@ -80,6 +89,7 @@ public interface SyndLink {
/**
* Returns the link type.
* <p>
*
* @return the link type, <b>null</b> if none.
*
*/
@ -88,6 +98,7 @@ public interface SyndLink {
/**
* Sets the link type.
* <p>
*
* @param type the link type, <b>null</b> if none.
*
*/
@ -96,6 +107,7 @@ public interface SyndLink {
/**
* Returns the link href.
* <p>
*
* @return the link href, <b>null</b> if none.
*
*/
@ -104,6 +116,7 @@ public interface SyndLink {
/**
* Sets the link href.
* <p>
*
* @param href the link href, <b>null</b> if none.
*
*/
@ -112,6 +125,7 @@ public interface SyndLink {
/**
* Returns the link title.
* <p>
*
* @return the link title, <b>null</b> if none.
*
*/
@ -120,6 +134,7 @@ public interface SyndLink {
/**
* Sets the link title.
* <p>
*
* @param title the link title, <b>null</b> if none.
*
*/
@ -128,6 +143,7 @@ public interface SyndLink {
/**
* Returns the hreflang
* <p>
*
* @return Returns the hreflang.
*/
public abstract String getHreflang();
@ -135,6 +151,7 @@ public interface SyndLink {
/**
* Set the hreflang
* <p>
*
* @param hreflang The hreflang to set.
*/
public abstract void setHreflang(String hreflang);
@ -142,6 +159,7 @@ public interface SyndLink {
/**
* Returns the length
* <p>
*
* @return Returns the length.
*/
public abstract long getLength();
@ -149,6 +167,7 @@ public interface SyndLink {
/**
* Set the length
* <p>
*
* @param length The length to set.
*/
public abstract void setLength(long length);

View file

@ -17,19 +17,20 @@
*/
package com.sun.syndication.feed.synd;
import com.sun.syndication.feed.impl.ObjectBean;
import java.io.Serializable;
import com.sun.syndication.feed.impl.ObjectBean;
/**
* Represents a link or an enclosure.
* <p>
*
* @author Alejandro Abdelnur
* @author Dave Johnson (updated for Atom 1.0)
*/
public class SyndLinkImpl implements Cloneable,Serializable, SyndLink {
public class SyndLinkImpl implements Cloneable, Serializable, SyndLink {
private ObjectBean _objBean;
private final ObjectBean _objBean;
private String _href;
private String _rel;
@ -44,34 +45,38 @@ public class SyndLinkImpl implements Cloneable,Serializable, SyndLink {
*
*/
public SyndLinkImpl() {
_objBean = new ObjectBean(this.getClass(),this);
this._objBean = new ObjectBean(this.getClass(), this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
if(!(other instanceof SyndLinkImpl)){
public boolean equals(final Object other) {
if (!(other instanceof SyndLinkImpl)) {
return false;
}
return _objBean.equals(other);
return this._objBean.equals(other);
}
/**
@ -79,139 +84,165 @@ public class SyndLinkImpl implements Cloneable,Serializable, SyndLink {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the link rel.
* <p>
*
* @return the link rel, <b>null</b> if none.
*
*/
@Override
public String getRel() {
return _rel;
return this._rel;
}
/**
* Sets the link rel.
* <p>
*
* @param rel the link rel,, <b>null</b> if none.
*
*/
public void setRel(String rel) {
//TODO add check, ask P@ about the check
_rel = rel;
@Override
public void setRel(final String rel) {
// TODO add check, ask P@ about the check
this._rel = rel;
}
/**
* Returns the link type.
* <p>
*
* @return the link type, <b>null</b> if none.
*
*/
@Override
public String getType() {
return _type;
return this._type;
}
/**
* Sets the link type.
* <p>
*
* @param type the link type, <b>null</b> if none.
*
*/
public void setType(String type) {
_type = type;
@Override
public void setType(final String type) {
this._type = type;
}
/**
* Returns the link href.
* <p>
*
* @return the link href, <b>null</b> if none.
*
*/
@Override
public String getHref() {
return _href;
return this._href;
}
/**
* Sets the link href.
* <p>
*
* @param href the link href, <b>null</b> if none.
*
*/
public void setHref(String href) {
_href = href;
@Override
public void setHref(final String href) {
this._href = href;
}
/**
* Returns the link title.
* <p>
*
* @return the link title, <b>null</b> if none.
*
*/
@Override
public String getTitle() {
return _title;
return this._title;
}
/**
* Sets the link title.
* <p>
*
* @param title the link title, <b>null</b> if none.
*
*/
public void setTitle(String title) {
_title = title;
@Override
public void setTitle(final String title) {
this._title = title;
}
/**
* Returns the hreflang
* <p>
*
* @return Returns the hreflang.
*/
@Override
public String getHreflang() {
return _hreflang;
return this._hreflang;
}
/**
* Set the hreflang
* <p>
*
* @param hreflang The hreflang to set.
*/
public void setHreflang(String hreflang) {
_hreflang = hreflang;
@Override
public void setHreflang(final String hreflang) {
this._hreflang = hreflang;
}
/**
* Returns the length
* <p>
*
* @return Returns the length.
*/
@Override
public long getLength() {
return _length;
return this._length;
}
/**
* Set the length
* <p>
*
* @param length The length to set.
*/
public void setLength(long length) {
_length = length;
@Override
public void setLength(final long length) {
this._length = length;
}
}

View file

@ -20,13 +20,14 @@ package com.sun.syndication.feed.synd;
import com.sun.syndication.feed.module.Extendable;
/**
* Bean interface for authors and contributors of SyndFeedImpl feeds and entries.
* Bean interface for authors and contributors of SyndFeedImpl feeds and
* entries.
* <p>
*
* @author Dave Johnson
*
*/
public interface SyndPerson extends Cloneable, Extendable
{
public interface SyndPerson extends Cloneable, Extendable {
/**
* Returns name of person
@ -58,12 +59,13 @@ public interface SyndPerson extends Cloneable, Extendable
*/
public void setEmail(String email);
/**
* Creates a deep clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
public Object clone() throws CloneNotSupportedException;

View file

@ -17,60 +17,65 @@
*/
package com.sun.syndication.feed.synd;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.sun.syndication.feed.impl.ObjectBean;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.feed.module.impl.ModuleUtils;
import java.util.List;
import java.util.ArrayList;
import java.io.Serializable;
/**
* Bean for authors and contributors of SyndFeedImpl feeds and entries.
* <p>
*
* @author Dave Johnson
*
*/
public class SyndPersonImpl implements Serializable, SyndPerson {
private ObjectBean _objBean;
private final ObjectBean _objBean;
private String _name;
private String _uri;
private String _email;
private List<Module> _modules;
/**
* For implementations extending SyndContentImpl to be able to use the ObjectBean functionality
* with extended interfaces.
* For implementations extending SyndContentImpl to be able to use the
* ObjectBean functionality with extended interfaces.
*/
public SyndPersonImpl() {
_objBean = new ObjectBean(SyndPerson.class,this);
this._objBean = new ObjectBean(SyndPerson.class, this);
}
/**
* Creates a deep 'bean' clone of the object.
* <p>
*
* @return a clone of the object.
* @throws CloneNotSupportedException thrown if an element of the object cannot be cloned.
* @throws CloneNotSupportedException thrown if an element of the object
* cannot be cloned.
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
return _objBean.clone();
return this._objBean.clone();
}
/**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method.
* Indicates whether some other object is "equal to" this one as defined by
* the Object equals() method.
* <p>
*
* @param other he reference object with which to compare.
* @return <b>true</b> if 'this' object is equal to the 'other' object.
*
*/
@Override
public boolean equals(Object other) {
if(!(other instanceof SyndPersonImpl)){
public boolean equals(final Object other) {
if (!(other instanceof SyndPersonImpl)) {
return false;
}
return _objBean.equals(other);
return this._objBean.equals(other);
}
/**
@ -78,117 +83,136 @@ public class SyndPersonImpl implements Serializable, SyndPerson {
* <p>
* It follows the contract defined by the Object hashCode() method.
* <p>
*
* @return the hashcode of the bean object.
*
*/
@Override
public int hashCode() {
return _objBean.hashCode();
return this._objBean.hashCode();
}
/**
* Returns the String representation for the object.
* <p>
*
* @return String representation for the object.
*
*/
@Override
public String toString() {
return _objBean.toString();
return this._objBean.toString();
}
/**
* Returns the person name.
* <p>
*
* @return the person name, <b>null</b> if none.
*
*/
@Override
public String getName() {
return _name;
return this._name;
}
/**
* Sets the category name.
* <p>
*
* @param name the category name to set, <b>null</b> if none.
*
*/
public void setName(String name) {
_name = name;
@Override
public void setName(final String name) {
this._name = name;
}
/**
* Returns the person's e-mail address.
* <p>
*
* @return the person's e-mail address, <b>null</b> if none.
*
*/
@Override
public String getEmail() {
return _email;
return this._email;
}
/**
* Sets the person's e-mail address.
* <p>
*
* @param email The person's e-mail address to set, <b>null</b> if none.
*
*/
public void setEmail(String email) {
_email = email;
@Override
public void setEmail(final String email) {
this._email = email;
}
/**
* Returns the person's URI.
* <p>
*
* @return the person's URI, <b>null</b> if none.
*
*/
@Override
public String getUri() {
return _uri;
return this._uri;
}
/**
* Sets the person's URI.
* <p>
*
* @param uri the peron's URI to set, <b>null</b> if none.
*
*/
public void setUri(String uri) {
_uri = uri;
@Override
public void setUri(final String uri) {
this._uri = uri;
}
/**
* Returns the person modules.
* <p>
* @return a list of ModuleImpl elements with the person modules,
* an empty list if none.
*
* @return a list of ModuleImpl elements with the person modules, an empty
* list if none.
*/
public List<Module> getModules()
{
if (_modules==null) {
_modules=new ArrayList<Module>();
@Override
public List<Module> getModules() {
if (this._modules == null) {
this._modules = new ArrayList<Module>();
}
return _modules;
return this._modules;
}
/**
* Sets the person modules.
* <p>
* @param modules the list of ModuleImpl elements with the person modules to set,
* an empty list or <b>null</b> if none.
*
* @param modules the list of ModuleImpl elements with the person modules to
* set, an empty list or <b>null</b> if none.
*
*/
public void setModules(List<Module> modules) {
_modules = modules;
@Override
public void setModules(final List<Module> modules) {
this._modules = modules;
}
/**
* Returns the module identified by a given URI.
* <p>
*
* @param uri the URI of the ModuleImpl.
* @return The module with the given URI, <b>null</b> if none.
*/
public Module getModule(String uri) {
return ModuleUtils.getModule(getModules(),uri);
@Override
public Module getModule(final String uri) {
return ModuleUtils.getModule(getModules(), uri);
}
}

View file

@ -17,6 +17,10 @@
*/
package com.sun.syndication.feed.synd.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.atom.Content;
import com.sun.syndication.feed.atom.Entry;
@ -24,49 +28,44 @@ import com.sun.syndication.feed.atom.Feed;
import com.sun.syndication.feed.atom.Link;
import com.sun.syndication.feed.atom.Person;
import com.sun.syndication.feed.module.impl.ModuleUtils;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.Converter;
import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndContentImpl;
import com.sun.syndication.feed.synd.SyndEnclosure;
import com.sun.syndication.feed.synd.SyndEnclosureImpl;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndContentImpl;
import com.sun.syndication.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndLink;
import com.sun.syndication.feed.synd.SyndLinkImpl;
import com.sun.syndication.feed.synd.SyndPerson;
import com.sun.syndication.feed.synd.SyndPersonImpl;
import java.util.ArrayList;
import java.util.List;
import java.util.Date;
import java.util.Iterator;
import org.jdom2.Element;
/**
*/
public class ConverterForAtom03 implements Converter {
private String _type;
private final String _type;
public ConverterForAtom03() {
this("atom_0.3");
}
protected ConverterForAtom03(String type) {
_type = type;
protected ConverterForAtom03(final String type) {
this._type = type;
}
@Override
public String getType() {
return _type;
return this._type;
}
public void copyInto(WireFeed feed,SyndFeed syndFeed) {
Feed aFeed = (Feed) feed;
@Override
public void copyInto(final WireFeed feed, final SyndFeed syndFeed) {
final Feed aFeed = (Feed) feed;
syndFeed.setModules(ModuleUtils.cloneModules(aFeed.getModules()));
if (((List<Element>)feed.getForeignMarkup()).size() > 0) {
if (feed.getForeignMarkup().size() > 0) {
syndFeed.setForeignMarkup(feed.getForeignMarkup());
}
@ -77,162 +76,154 @@ public class ConverterForAtom03 implements Converter {
syndFeed.setTitle(aFeed.getTitle());
// use first alternate links as THE link
if (aFeed.getAlternateLinks() != null
&& aFeed.getAlternateLinks().size() > 0) {
Link theLink = (Link)aFeed.getAlternateLinks().get(0);
if (aFeed.getAlternateLinks() != null && aFeed.getAlternateLinks().size() > 0) {
final Link theLink = aFeed.getAlternateLinks().get(0);
syndFeed.setLink(theLink.getHrefResolved());
}
// lump alternate and other links together
List<SyndLink> syndLinks = new ArrayList<SyndLink>();
if (aFeed.getAlternateLinks() != null
&& aFeed.getAlternateLinks().size() > 0) {
final List<SyndLink> syndLinks = new ArrayList<SyndLink>();
if (aFeed.getAlternateLinks() != null && aFeed.getAlternateLinks().size() > 0) {
syndLinks.addAll(createSyndLinks(aFeed.getAlternateLinks()));
}
if (aFeed.getOtherLinks() != null
&& aFeed.getOtherLinks().size() > 0) {
if (aFeed.getOtherLinks() != null && aFeed.getOtherLinks().size() > 0) {
syndLinks.addAll(createSyndLinks(aFeed.getOtherLinks()));
}
syndFeed.setLinks(syndLinks);
Content tagline = aFeed.getTagline();
if (tagline!=null) {
final Content tagline = aFeed.getTagline();
if (tagline != null) {
syndFeed.setDescription(tagline.getValue());
}
List<Entry> aEntries = aFeed.getEntries();
if (aEntries!=null) {
final List<Entry> aEntries = aFeed.getEntries();
if (aEntries != null) {
syndFeed.setEntries(createSyndEntries(aEntries, syndFeed.isPreservingWireFeed()));
}
// Core Atom language/author/copyright/modified elements have precedence
// over DC equivalent info.
String language = aFeed.getLanguage();
if (language!=null) {
final String language = aFeed.getLanguage();
if (language != null) {
syndFeed.setLanguage(language);
}
List<Person> authors = aFeed.getAuthors();
if (authors!=null && authors.size() > 0) {
final List<Person> authors = aFeed.getAuthors();
if (authors != null && authors.size() > 0) {
syndFeed.setAuthors(createSyndPersons(authors));
}
String copyright = aFeed.getCopyright();
if (copyright!=null) {
final String copyright = aFeed.getCopyright();
if (copyright != null) {
syndFeed.setCopyright(copyright);
}
Date date = aFeed.getModified();
if (date!=null) {
final Date date = aFeed.getModified();
if (date != null) {
syndFeed.setPublishedDate(date);
}
}
protected List<SyndLink> createSyndLinks(List<Link> aLinks) {
ArrayList<SyndLink> sLinks = new ArrayList<SyndLink>();
for (Iterator<Link> iter = aLinks.iterator(); iter.hasNext();) {
Link link = (Link)iter.next();
protected List<SyndLink> createSyndLinks(final List<Link> aLinks) {
final ArrayList<SyndLink> sLinks = new ArrayList<SyndLink>();
for (final Link link2 : aLinks) {
final Link link = link2;
if (!link.getRel().equals("enclosure")) {
SyndLink sLink = createSyndLink(link);
final SyndLink sLink = createSyndLink(link);
sLinks.add(sLink);
}
}
return sLinks;
}
public SyndLink createSyndLink(Link link) {
SyndLink syndLink = new SyndLinkImpl();
syndLink.setRel( link.getRel());
syndLink.setType( link.getType());
syndLink.setHref( link.getHrefResolved());
syndLink.setTitle( link.getTitle());
public SyndLink createSyndLink(final Link link) {
final SyndLink syndLink = new SyndLinkImpl();
syndLink.setRel(link.getRel());
syndLink.setType(link.getType());
syndLink.setHref(link.getHrefResolved());
syndLink.setTitle(link.getTitle());
return syndLink;
}
protected List<SyndEntry> createSyndEntries(List<Entry> atomEntries, boolean preserveWireItems) {
List<SyndEntry> syndEntries = new ArrayList<SyndEntry>();
for (int i=0;i<atomEntries.size();i++) {
syndEntries.add(createSyndEntry((Entry) atomEntries.get(i), preserveWireItems));
protected List<SyndEntry> createSyndEntries(final List<Entry> atomEntries, final boolean preserveWireItems) {
final List<SyndEntry> syndEntries = new ArrayList<SyndEntry>();
for (int i = 0; i < atomEntries.size(); i++) {
syndEntries.add(createSyndEntry(atomEntries.get(i), preserveWireItems));
}
return syndEntries;
}
protected SyndEntry createSyndEntry(Entry entry, boolean preserveWireItem) {
SyndEntryImpl syndEntry = new SyndEntryImpl();
protected SyndEntry createSyndEntry(final Entry entry, final boolean preserveWireItem) {
final SyndEntryImpl syndEntry = new SyndEntryImpl();
if (preserveWireItem) {
syndEntry.setWireEntry(entry);
}
syndEntry.setModules(ModuleUtils.cloneModules(entry.getModules()));
if (((List<Element>)entry.getForeignMarkup()).size() > 0) {
syndEntry.setForeignMarkup((List<Element>)entry.getForeignMarkup());
if (entry.getForeignMarkup().size() > 0) {
syndEntry.setForeignMarkup(entry.getForeignMarkup());
}
syndEntry.setTitle(entry.getTitle());
// if there is exactly one alternate link, use that as THE link
if (entry.getAlternateLinks() != null
&& entry.getAlternateLinks().size() == 1) {
Link theLink = (Link)entry.getAlternateLinks().get(0);
if (entry.getAlternateLinks() != null && entry.getAlternateLinks().size() == 1) {
final Link theLink = entry.getAlternateLinks().get(0);
syndEntry.setLink(theLink.getHrefResolved());
}
// Create synd enclosures from enclosure links
List<SyndEnclosure> syndEnclosures = new ArrayList<SyndEnclosure>();
final List<SyndEnclosure> syndEnclosures = new ArrayList<SyndEnclosure>();
if (entry.getOtherLinks() != null && entry.getOtherLinks().size() > 0) {
List<Link> oLinks = entry.getOtherLinks();
for (Iterator<Link> iter = oLinks.iterator(); iter.hasNext(); ) {
Link thisLink = (Link)iter.next();
if ("enclosure".equals(thisLink.getRel()))
final List<Link> oLinks = entry.getOtherLinks();
for (final Link link : oLinks) {
final Link thisLink = link;
if ("enclosure".equals(thisLink.getRel())) {
syndEnclosures.add(createSyndEnclosure(entry, thisLink));
}
}
}
syndEntry.setEnclosures(syndEnclosures);
// lump alternate and other links together
List<SyndLink> syndLinks = new ArrayList<SyndLink>();
if (entry.getAlternateLinks() != null
&& entry.getAlternateLinks().size() > 0) {
final List<SyndLink> syndLinks = new ArrayList<SyndLink>();
if (entry.getAlternateLinks() != null && entry.getAlternateLinks().size() > 0) {
syndLinks.addAll(createSyndLinks(entry.getAlternateLinks()));
}
if (entry.getOtherLinks() != null
&& entry.getOtherLinks().size() > 0) {
if (entry.getOtherLinks() != null && entry.getOtherLinks().size() > 0) {
syndLinks.addAll(createSyndLinks(entry.getOtherLinks()));
}
syndEntry.setLinks(syndLinks);
String id = entry.getId();
if (id!=null) {
final String id = entry.getId();
if (id != null) {
syndEntry.setUri(entry.getId());
}
else {
} else {
syndEntry.setUri(syndEntry.getLink());
}
Content content = entry.getSummary();
if (content==null) {
List<Content> contents = entry.getContents();
if (contents!=null && contents.size()>0) {
content = (Content) contents.get(0);
if (content == null) {
final List<Content> contents = entry.getContents();
if (contents != null && contents.size() > 0) {
content = contents.get(0);
}
}
if (content!=null) {
SyndContent sContent = new SyndContentImpl();
if (content != null) {
final SyndContent sContent = new SyndContentImpl();
sContent.setType(content.getType());
sContent.setValue(content.getValue());
syndEntry.setDescription(sContent);
}
List<Content> contents = entry.getContents();
if (contents.size()>0) {
List<SyndContent> sContents = new ArrayList<SyndContent>();
for (int i=0;i<contents.size();i++) {
content = (Content) contents.get(i);
SyndContent sContent = new SyndContentImpl();
final List<Content> contents = entry.getContents();
if (contents.size() > 0) {
final List<SyndContent> sContents = new ArrayList<SyndContent>();
for (int i = 0; i < contents.size(); i++) {
content = contents.get(i);
final SyndContent sContent = new SyndContentImpl();
sContent.setType(content.getType());
sContent.setValue(content.getValue());
sContent.setMode(content.getMode());
@ -241,46 +232,47 @@ public class ConverterForAtom03 implements Converter {
syndEntry.setContents(sContents);
}
List<Person> authors = entry.getAuthors();
if (authors!=null && authors.size() > 0) {
final List<Person> authors = entry.getAuthors();
if (authors != null && authors.size() > 0) {
syndEntry.setAuthors(createSyndPersons(authors));
SyndPerson person0 = (SyndPerson)syndEntry.getAuthors().get(0);
final SyndPerson person0 = syndEntry.getAuthors().get(0);
syndEntry.setAuthor(person0.getName());
}
Date date = entry.getModified();
if (date==null) {
if (date == null) {
date = entry.getIssued();
if (date==null) {
if (date == null) {
date = entry.getCreated();
}
}
if (date!=null) {
if (date != null) {
syndEntry.setPublishedDate(date);
}
return syndEntry;
}
public SyndEnclosure createSyndEnclosure(Entry entry, Link link) {
SyndEnclosure syndEncl = new SyndEnclosureImpl();
public SyndEnclosure createSyndEnclosure(final Entry entry, final Link link) {
final SyndEnclosure syndEncl = new SyndEnclosureImpl();
syndEncl.setUrl(link.getHrefResolved());
syndEncl.setType(link.getType());
syndEncl.setLength(link.getLength());
return syndEncl;
}
public WireFeed createRealFeed(SyndFeed syndFeed) {
Feed aFeed = new Feed(getType());
@Override
public WireFeed createRealFeed(final SyndFeed syndFeed) {
final Feed aFeed = new Feed(getType());
aFeed.setModules(ModuleUtils.cloneModules(syndFeed.getModules()));
aFeed.setEncoding(syndFeed.getEncoding());
aFeed.setId(syndFeed.getUri());
SyndContent sTitle = syndFeed.getTitleEx();
final SyndContent sTitle = syndFeed.getTitleEx();
if (sTitle != null) {
Content title = new Content();
final Content title = new Content();
if (sTitle.getType() != null) {
title.setType(sTitle.getType());
}
@ -294,16 +286,14 @@ public class ConverterForAtom03 implements Converter {
}
// separate SyndEntry's links collection into alternate and other links
List<Link> alternateLinks = new ArrayList<Link>();
List<Link> otherLinks = new ArrayList<Link>();
List<SyndLink> slinks = syndFeed.getLinks();
final List<Link> alternateLinks = new ArrayList<Link>();
final List<Link> otherLinks = new ArrayList<Link>();
final List<SyndLink> slinks = syndFeed.getLinks();
if (slinks != null) {
for (Iterator<SyndLink> iter=slinks.iterator(); iter.hasNext();) {
SyndLink syndLink = (SyndLink)iter.next();
Link link = createAtomLink(syndLink);
if (link.getRel() == null ||
"".equals(link.getRel().trim()) ||
"alternate".equals(link.getRel())) {
for (final SyndLink syndLink2 : slinks) {
final SyndLink syndLink = syndLink2;
final Link link = createAtomLink(syndLink);
if (link.getRel() == null || "".equals(link.getRel().trim()) || "alternate".equals(link.getRel())) {
alternateLinks.add(link);
} else {
otherLinks.add(link);
@ -312,26 +302,30 @@ public class ConverterForAtom03 implements Converter {
}
// no alternate link? then use THE link if there is one
if (alternateLinks.isEmpty() && syndFeed.getLink() != null) {
Link link = new Link();
final Link link = new Link();
link.setRel("alternate");
link.setHref(syndFeed.getLink());
alternateLinks.add(link);
}
if (alternateLinks.size() > 0) aFeed.setAlternateLinks(alternateLinks);
if (otherLinks.size() > 0) aFeed.setOtherLinks(otherLinks);
if (alternateLinks.size() > 0) {
aFeed.setAlternateLinks(alternateLinks);
}
if (otherLinks.size() > 0) {
aFeed.setOtherLinks(otherLinks);
}
String sDesc = syndFeed.getDescription();
if (sDesc!=null) {
Content tagline = new Content();
final String sDesc = syndFeed.getDescription();
if (sDesc != null) {
final Content tagline = new Content();
tagline.setValue(sDesc);
aFeed.setTagline(tagline);
}
aFeed.setLanguage(syndFeed.getLanguage());
List<SyndPerson> authors = syndFeed.getAuthors();
if (authors!=null && authors.size() > 0) {
final List<SyndPerson> authors = syndFeed.getAuthors();
if (authors != null && authors.size() > 0) {
aFeed.setAuthors(createAtomPersons(authors));
}
@ -339,19 +333,19 @@ public class ConverterForAtom03 implements Converter {
aFeed.setModified(syndFeed.getPublishedDate());
List<SyndEntry> sEntries = syndFeed.getEntries();
if (sEntries!=null) {
final List<SyndEntry> sEntries = syndFeed.getEntries();
if (sEntries != null) {
aFeed.setEntries(createAtomEntries(sEntries));
}
return aFeed;
}
protected static List<Person> createAtomPersons(List<SyndPerson> sPersons) {
List<Person> persons = new ArrayList<Person>();
for (Iterator<SyndPerson> iter = sPersons.iterator(); iter.hasNext(); ) {
SyndPerson sPerson = (SyndPerson)iter.next();
Person person = new Person();
protected static List<Person> createAtomPersons(final List<SyndPerson> sPersons) {
final List<Person> persons = new ArrayList<Person>();
for (final SyndPerson syndPerson : sPersons) {
final SyndPerson sPerson = syndPerson;
final Person person = new Person();
person.setName(sPerson.getName());
person.setUri(sPerson.getUri());
person.setEmail(sPerson.getEmail());
@ -361,11 +355,11 @@ public class ConverterForAtom03 implements Converter {
return persons;
}
protected static List<SyndPerson> createSyndPersons(List<Person> aPersons) {
List<SyndPerson> persons = new ArrayList<SyndPerson>();
for (Iterator<Person> iter = aPersons.iterator(); iter.hasNext(); ) {
Person aPerson = (Person)iter.next();
SyndPerson person = new SyndPersonImpl();
protected static List<SyndPerson> createSyndPersons(final List<Person> aPersons) {
final List<SyndPerson> persons = new ArrayList<SyndPerson>();
for (final Person person2 : aPersons) {
final Person aPerson = person2;
final SyndPerson person = new SyndPersonImpl();
person.setName(aPerson.getName());
person.setUri(aPerson.getUri());
person.setEmail(aPerson.getEmail());
@ -375,23 +369,23 @@ public class ConverterForAtom03 implements Converter {
return persons;
}
protected List<Entry> createAtomEntries(List<SyndEntry> syndEntries) {
List<Entry> atomEntries = new ArrayList<Entry>();
for (int i=0;i<syndEntries.size();i++) {
atomEntries.add(createAtomEntry((SyndEntry)syndEntries.get(i)));
protected List<Entry> createAtomEntries(final List<SyndEntry> syndEntries) {
final List<Entry> atomEntries = new ArrayList<Entry>();
for (int i = 0; i < syndEntries.size(); i++) {
atomEntries.add(createAtomEntry(syndEntries.get(i)));
}
return atomEntries;
}
protected Entry createAtomEntry(SyndEntry sEntry) {
Entry aEntry = new Entry();
protected Entry createAtomEntry(final SyndEntry sEntry) {
final Entry aEntry = new Entry();
aEntry.setModules(ModuleUtils.cloneModules(sEntry.getModules()));
aEntry.setId(sEntry.getUri());
SyndContent sTitle = sEntry.getTitleEx();
if (sTitle!=null) {
Content title = new Content();
final SyndContent sTitle = sEntry.getTitleEx();
if (sTitle != null) {
final Content title = new Content();
if (sTitle.getType() != null) {
title.setType(sTitle.getType());
}
@ -405,16 +399,14 @@ public class ConverterForAtom03 implements Converter {
}
// separate SyndEntry's links collection into alternate and other links
List<Link> alternateLinks = new ArrayList<Link>();
List<Link> otherLinks = new ArrayList<Link>();
List<SyndLink> slinks = sEntry.getLinks();
final List<Link> alternateLinks = new ArrayList<Link>();
final List<Link> otherLinks = new ArrayList<Link>();
final List<SyndLink> slinks = sEntry.getLinks();
if (slinks != null) {
for (Iterator<SyndLink> iter=slinks.iterator(); iter.hasNext();) {
SyndLink syndLink = (SyndLink)iter.next();
Link link = createAtomLink(syndLink);
if (link.getRel() == null ||
"".equals(link.getRel().trim()) ||
"alternate".equals(link.getRel())) {
for (final SyndLink syndLink2 : slinks) {
final SyndLink syndLink = syndLink2;
final Link link = createAtomLink(syndLink);
if (link.getRel() == null || "".equals(link.getRel().trim()) || "alternate".equals(link.getRel())) {
alternateLinks.add(link);
} else {
otherLinks.add(link);
@ -423,40 +415,43 @@ public class ConverterForAtom03 implements Converter {
}
// no alternate link? then use THE link if there is one
if (alternateLinks.isEmpty() && sEntry.getLink() != null) {
Link link = new Link();
final Link link = new Link();
link.setRel("alternate");
link.setHref(sEntry.getLink());
alternateLinks.add(link);
}
List<SyndEnclosure> sEnclosures = sEntry.getEnclosures();
final List<SyndEnclosure> sEnclosures = sEntry.getEnclosures();
if (sEnclosures != null) {
for (Iterator<SyndEnclosure> iter=sEnclosures.iterator(); iter.hasNext();) {
SyndEnclosure syndEnclosure = (SyndEnclosure) iter.next();
Link link = createAtomEnclosure(syndEnclosure);
for (final SyndEnclosure syndEnclosure2 : sEnclosures) {
final SyndEnclosure syndEnclosure = syndEnclosure2;
final Link link = createAtomEnclosure(syndEnclosure);
otherLinks.add(link);
}
}
if (alternateLinks.size() > 0) aEntry.setAlternateLinks(alternateLinks);
if (otherLinks.size() > 0) aEntry.setOtherLinks(otherLinks);
if (alternateLinks.size() > 0) {
aEntry.setAlternateLinks(alternateLinks);
}
if (otherLinks.size() > 0) {
aEntry.setOtherLinks(otherLinks);
}
SyndContent sContent = sEntry.getDescription();
if (sContent!=null) {
Content content = new Content();
if (sContent != null) {
final Content content = new Content();
content.setType(sContent.getType());
content.setValue(sContent.getValue());
content.setMode(Content.ESCAPED);
aEntry.setSummary(content);
}
List<SyndContent> contents = sEntry.getContents();
if (contents.size()>0) {
List<Content> aContents = new ArrayList<Content>();
for (int i=0;i<contents.size();i++) {
sContent = (SyndContentImpl) contents.get(i);
Content content = new Content();
final List<SyndContent> contents = sEntry.getContents();
if (contents.size() > 0) {
final List<Content> aContents = new ArrayList<Content>();
for (int i = 0; i < contents.size(); i++) {
sContent = contents.get(i);
final Content content = new Content();
content.setType(sContent.getType());
content.setValue(sContent.getValue());
content.setMode(sContent.getMode());
@ -466,13 +461,13 @@ public class ConverterForAtom03 implements Converter {
aEntry.setContents(aContents);
}
List<SyndPerson> sAuthors = sEntry.getAuthors();
if (sAuthors!=null && sAuthors.size() > 0) {
final List<SyndPerson> sAuthors = sEntry.getAuthors();
if (sAuthors != null && sAuthors.size() > 0) {
aEntry.setAuthors(createAtomPersons(sAuthors));
} else if (sEntry.getAuthor() != null) {
Person person = new Person();
final Person person = new Person();
person.setName(sEntry.getAuthor());
List<Person> authors = new ArrayList<Person>();
final List<Person> authors = new ArrayList<Person>();
authors.add(person);
aEntry.setAuthors(authors);
}
@ -483,21 +478,21 @@ public class ConverterForAtom03 implements Converter {
return aEntry;
}
public Link createAtomLink(SyndLink syndLink) {
Link link = new Link();
link.setRel( syndLink.getRel());
link.setType( syndLink.getType());
link.setHref( syndLink.getHref());
link.setTitle( syndLink.getTitle());
public Link createAtomLink(final SyndLink syndLink) {
final Link link = new Link();
link.setRel(syndLink.getRel());
link.setType(syndLink.getType());
link.setHref(syndLink.getHref());
link.setTitle(syndLink.getTitle());
return link;
}
public Link createAtomEnclosure(SyndEnclosure syndEnclosure) {
Link link = new Link();
link.setRel( "enclosure");
link.setType( syndEnclosure.getType());
link.setHref( syndEnclosure.getUrl());
link.setLength( syndEnclosure.getLength());
public Link createAtomEnclosure(final SyndEnclosure syndEnclosure) {
final Link link = new Link();
link.setRel("enclosure");
link.setType(syndEnclosure.getType());
link.setHref(syndEnclosure.getUrl());
link.setLength(syndEnclosure.getLength());
return link;
}

View file

@ -18,11 +18,8 @@ package com.sun.syndication.feed.synd.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.jdom2.Element;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.atom.Category;
import com.sun.syndication.feed.atom.Content;
@ -36,6 +33,8 @@ import com.sun.syndication.feed.synd.SyndCategory;
import com.sun.syndication.feed.synd.SyndCategoryImpl;
import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndContentImpl;
import com.sun.syndication.feed.synd.SyndEnclosure;
import com.sun.syndication.feed.synd.SyndEnclosureImpl;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndFeed;
@ -43,181 +42,177 @@ import com.sun.syndication.feed.synd.SyndFeedImpl;
import com.sun.syndication.feed.synd.SyndLink;
import com.sun.syndication.feed.synd.SyndLinkImpl;
import com.sun.syndication.feed.synd.SyndPerson;
import com.sun.syndication.feed.synd.SyndEnclosure;
import com.sun.syndication.feed.synd.SyndEnclosureImpl;
/**
*/
public class ConverterForAtom10 implements Converter {
private String _type;
private final String _type;
public ConverterForAtom10() {
this("atom_1.0");
}
protected ConverterForAtom10(String type) {
_type = type;
protected ConverterForAtom10(final String type) {
this._type = type;
}
@Override
public String getType() {
return _type;
return this._type;
}
public void copyInto(WireFeed feed, SyndFeed syndFeed) {
Feed aFeed = (Feed) feed;
@Override
public void copyInto(final WireFeed feed, final SyndFeed syndFeed) {
final Feed aFeed = (Feed) feed;
syndFeed.setModules(ModuleUtils.cloneModules(aFeed.getModules()));
if (((List<Element>)feed.getForeignMarkup()).size() > 0) {
syndFeed.setForeignMarkup((List<Element>)feed.getForeignMarkup());
if (feed.getForeignMarkup().size() > 0) {
syndFeed.setForeignMarkup(feed.getForeignMarkup());
}
syndFeed.setEncoding(aFeed.getEncoding());
syndFeed.setUri(aFeed.getId());
Content aTitle = aFeed.getTitleEx();
final Content aTitle = aFeed.getTitleEx();
if (aTitle != null) {
SyndContent c = new SyndContentImpl();
final SyndContent c = new SyndContentImpl();
c.setType(aTitle.getType());
c.setValue(aTitle.getValue());
syndFeed.setTitleEx(c);
}
Content aSubtitle = aFeed.getSubtitle();
if (aSubtitle!=null) {
SyndContent c = new SyndContentImpl();
final Content aSubtitle = aFeed.getSubtitle();
if (aSubtitle != null) {
final SyndContent c = new SyndContentImpl();
c.setType(aSubtitle.getType());
c.setValue(aSubtitle.getValue());
syndFeed.setDescriptionEx(c);
}
// use first alternate links as THE link
if (aFeed.getAlternateLinks() != null
&& aFeed.getAlternateLinks().size() > 0) {
Link theLink = (Link)aFeed.getAlternateLinks().get(0);
if (aFeed.getAlternateLinks() != null && aFeed.getAlternateLinks().size() > 0) {
final Link theLink = aFeed.getAlternateLinks().get(0);
syndFeed.setLink(theLink.getHrefResolved());
}
// lump alternate and other links together
List<SyndLink> syndLinks = new ArrayList<SyndLink>();
if (aFeed.getAlternateLinks() != null
&& aFeed.getAlternateLinks().size() > 0) {
final List<SyndLink> syndLinks = new ArrayList<SyndLink>();
if (aFeed.getAlternateLinks() != null && aFeed.getAlternateLinks().size() > 0) {
syndLinks.addAll(createSyndLinks(aFeed.getAlternateLinks()));
}
if (aFeed.getOtherLinks() != null
&& aFeed.getOtherLinks().size() > 0) {
if (aFeed.getOtherLinks() != null && aFeed.getOtherLinks().size() > 0) {
syndLinks.addAll(createSyndLinks(aFeed.getOtherLinks()));
}
syndFeed.setLinks(syndLinks);
List<Entry> aEntries = aFeed.getEntries();
if (aEntries!=null) {
final List<Entry> aEntries = aFeed.getEntries();
if (aEntries != null) {
syndFeed.setEntries(createSyndEntries(aFeed, aEntries, syndFeed.isPreservingWireFeed()));
}
// Core Atom language/author/copyright/modified elements have precedence
// over DC equivalent info.
List<Person> authors = aFeed.getAuthors();
if (authors!=null && authors.size() > 0) {
final List<Person> authors = aFeed.getAuthors();
if (authors != null && authors.size() > 0) {
syndFeed.setAuthors(ConverterForAtom03.createSyndPersons(authors));
}
List<Person> contributors = aFeed.getContributors();
if (contributors!=null && contributors.size() > 0) {
final List<Person> contributors = aFeed.getContributors();
if (contributors != null && contributors.size() > 0) {
syndFeed.setContributors(ConverterForAtom03.createSyndPersons(contributors));
}
String rights = aFeed.getRights();
if (rights!=null) {
final String rights = aFeed.getRights();
if (rights != null) {
syndFeed.setCopyright(rights);
}
Date date = aFeed.getUpdated();
if (date!=null) {
final Date date = aFeed.getUpdated();
if (date != null) {
syndFeed.setPublishedDate(date);
}
}
protected List<SyndLink> createSyndLinks(List<Link> aLinks) {
ArrayList<SyndLink> sLinks = new ArrayList<SyndLink>();
for (Iterator<Link> iter = aLinks.iterator(); iter.hasNext();) {
Link link = (Link)iter.next();
SyndLink sLink = createSyndLink(link);
protected List<SyndLink> createSyndLinks(final List<Link> aLinks) {
final ArrayList<SyndLink> sLinks = new ArrayList<SyndLink>();
for (final Link link2 : aLinks) {
final Link link = link2;
final SyndLink sLink = createSyndLink(link);
sLinks.add(sLink);
}
return sLinks;
}
protected List<SyndEntry> createSyndEntries(Feed feed, List<Entry> atomEntries, boolean preserveWireItems) {
List<SyndEntry> syndEntries = new ArrayList<SyndEntry>();
for (int i=0;i<atomEntries.size();i++) {
syndEntries.add(createSyndEntry(feed, (Entry) atomEntries.get(i), preserveWireItems));
protected List<SyndEntry> createSyndEntries(final Feed feed, final List<Entry> atomEntries, final boolean preserveWireItems) {
final List<SyndEntry> syndEntries = new ArrayList<SyndEntry>();
for (int i = 0; i < atomEntries.size(); i++) {
syndEntries.add(createSyndEntry(feed, atomEntries.get(i), preserveWireItems));
}
return syndEntries;
}
protected SyndEntry createSyndEntry(Feed feed, Entry entry, boolean preserveWireItem) {
SyndEntryImpl syndEntry = new SyndEntryImpl();
protected SyndEntry createSyndEntry(final Feed feed, final Entry entry, final boolean preserveWireItem) {
final SyndEntryImpl syndEntry = new SyndEntryImpl();
if (preserveWireItem) {
syndEntry.setWireEntry(entry);
}
syndEntry.setModules(ModuleUtils.cloneModules(entry.getModules()));
if (((List<Element>)entry.getForeignMarkup()).size() > 0) {
syndEntry.setForeignMarkup((List<Element>)entry.getForeignMarkup());
if (entry.getForeignMarkup().size() > 0) {
syndEntry.setForeignMarkup(entry.getForeignMarkup());
}
Content eTitle = entry.getTitleEx();
final Content eTitle = entry.getTitleEx();
if (eTitle != null) {
syndEntry.setTitleEx(createSyndContent(eTitle));
}
Content summary = entry.getSummary();
if (summary!=null) {
final Content summary = entry.getSummary();
if (summary != null) {
syndEntry.setDescription(createSyndContent(summary));
}
List<Content> contents = entry.getContents();
final List<Content> contents = entry.getContents();
if (contents != null && contents.size() > 0) {
List<SyndContent> sContents = new ArrayList<SyndContent>();
for (Iterator<Content> iter=contents.iterator(); iter.hasNext();) {
Content content = (Content)iter.next();
final List<SyndContent> sContents = new ArrayList<SyndContent>();
for (final Content content2 : contents) {
final Content content = content2;
sContents.add(createSyndContent(content));
}
syndEntry.setContents(sContents);
}
List<Person> authors = entry.getAuthors();
if (authors!=null && authors.size() > 0) {
final List<Person> authors = entry.getAuthors();
if (authors != null && authors.size() > 0) {
syndEntry.setAuthors(ConverterForAtom03.createSyndPersons(authors));
SyndPerson person0 = (SyndPerson)syndEntry.getAuthors().get(0);
final SyndPerson person0 = syndEntry.getAuthors().get(0);
syndEntry.setAuthor(person0.getName());
}
List<Person> contributors = entry.getContributors();
if (contributors!=null && contributors.size() > 0) {
final List<Person> contributors = entry.getContributors();
if (contributors != null && contributors.size() > 0) {
syndEntry.setContributors(ConverterForAtom03.createSyndPersons(contributors));
}
Date date = entry.getPublished();
if (date!=null) {
if (date != null) {
syndEntry.setPublishedDate(date);
}
date = entry.getUpdated();
if (date!=null) {
if (date != null) {
syndEntry.setUpdatedDate(date);
}
List<Category> categories = entry.getCategories();
if (categories!=null) {
List<SyndCategory> syndCategories = new ArrayList<SyndCategory>();
for (Iterator<Category> iter=categories.iterator(); iter.hasNext();) {
Category c = (Category)iter.next();
SyndCategory syndCategory = new SyndCategoryImpl();
final List<Category> categories = entry.getCategories();
if (categories != null) {
final List<SyndCategory> syndCategories = new ArrayList<SyndCategory>();
for (final Category category : categories) {
final Category c = category;
final SyndCategory syndCategory = new SyndCategoryImpl();
syndCategory.setName(c.getTerm());
syndCategory.setTaxonomyUri(c.getSchemeResolved());
// TODO: categories MAY have labels
@ -228,131 +223,125 @@ public class ConverterForAtom10 implements Converter {
}
// use first alternate link as THE link
if (entry.getAlternateLinks() != null
&& entry.getAlternateLinks().size() > 0) {
Link theLink = (Link)entry.getAlternateLinks().get(0);
if (entry.getAlternateLinks() != null && entry.getAlternateLinks().size() > 0) {
final Link theLink = entry.getAlternateLinks().get(0);
syndEntry.setLink(theLink.getHrefResolved());
}
// Create synd enclosures from enclosure links
List<SyndEnclosure> syndEnclosures = new ArrayList<SyndEnclosure>();
final List<SyndEnclosure> syndEnclosures = new ArrayList<SyndEnclosure>();
if (entry.getOtherLinks() != null && entry.getOtherLinks().size() > 0) {
List<Link> oLinks = entry.getOtherLinks();
for (Iterator<Link> iter = oLinks.iterator(); iter.hasNext(); ) {
Link thisLink = (Link)iter.next();
if ("enclosure".equals(thisLink.getRel()))
syndEnclosures.add(
createSyndEnclosure(feed, entry, thisLink));
final List<Link> oLinks = entry.getOtherLinks();
for (final Link link : oLinks) {
final Link thisLink = link;
if ("enclosure".equals(thisLink.getRel())) {
syndEnclosures.add(createSyndEnclosure(feed, entry, thisLink));
}
}
}
syndEntry.setEnclosures(syndEnclosures);
// lump alternate and other links together
List<SyndLink> syndLinks = new ArrayList<SyndLink>();
if (entry.getAlternateLinks() != null
&& entry.getAlternateLinks().size() > 0) {
final List<SyndLink> syndLinks = new ArrayList<SyndLink>();
if (entry.getAlternateLinks() != null && entry.getAlternateLinks().size() > 0) {
syndLinks.addAll(createSyndLinks(entry.getAlternateLinks()));
}
if (entry.getOtherLinks() != null
&& entry.getOtherLinks().size() > 0) {
if (entry.getOtherLinks() != null && entry.getOtherLinks().size() > 0) {
syndLinks.addAll(createSyndLinks(entry.getOtherLinks()));
}
syndEntry.setLinks(syndLinks);
String id = entry.getId();
if (id!=null) {
final String id = entry.getId();
if (id != null) {
syndEntry.setUri(entry.getId());
}
else {
} else {
syndEntry.setUri(syndEntry.getLink());
}
// Convert source element Feed into SyndFeed and assign as SyndEntry
// source
Feed source = entry.getSource();
final Feed source = entry.getSource();
if (source != null) {
SyndFeed syndSource = new SyndFeedImpl(source);
final SyndFeed syndSource = new SyndFeedImpl(source);
syndEntry.setSource(syndSource);
}
return syndEntry;
}
public SyndEnclosure createSyndEnclosure(Feed feed, Entry entry,
Link link) {
SyndEnclosure syndEncl = new SyndEnclosureImpl();
public SyndEnclosure createSyndEnclosure(final Feed feed, final Entry entry, final Link link) {
final SyndEnclosure syndEncl = new SyndEnclosureImpl();
syndEncl.setUrl(link.getHrefResolved());
syndEncl.setType(link.getType());
syndEncl.setLength(link.getLength());
return syndEncl;
}
public Link createAtomEnclosure(SyndEnclosure syndEnclosure) {
Link link = new Link();
link.setRel( "enclosure");
link.setType( syndEnclosure.getType());
link.setHref( syndEnclosure.getUrl());
link.setLength( syndEnclosure.getLength());
public Link createAtomEnclosure(final SyndEnclosure syndEnclosure) {
final Link link = new Link();
link.setRel("enclosure");
link.setType(syndEnclosure.getType());
link.setHref(syndEnclosure.getUrl());
link.setLength(syndEnclosure.getLength());
return link;
}
public SyndLink createSyndLink(Link link) {
SyndLink syndLink = new SyndLinkImpl();
syndLink.setRel( link.getRel());
syndLink.setType( link.getType());
syndLink.setHref( link.getHrefResolved());
public SyndLink createSyndLink(final Link link) {
final SyndLink syndLink = new SyndLinkImpl();
syndLink.setRel(link.getRel());
syndLink.setType(link.getType());
syndLink.setHref(link.getHrefResolved());
syndLink.setHreflang(link.getHreflang());
syndLink.setLength( link.getLength());
syndLink.setTitle( link.getTitle());
syndLink.setLength(link.getLength());
syndLink.setTitle(link.getTitle());
return syndLink;
}
public Link createAtomLink(SyndLink syndLink) {
Link link = new Link();
link.setRel( syndLink.getRel());
link.setType( syndLink.getType());
link.setHref( syndLink.getHref());
public Link createAtomLink(final SyndLink syndLink) {
final Link link = new Link();
link.setRel(syndLink.getRel());
link.setType(syndLink.getType());
link.setHref(syndLink.getHref());
link.setHreflang(syndLink.getHreflang());
link.setLength( syndLink.getLength());
link.setTitle( syndLink.getTitle());
link.setLength(syndLink.getLength());
link.setTitle(syndLink.getTitle());
return link;
}
public WireFeed createRealFeed(SyndFeed syndFeed) {
Feed aFeed = new Feed(getType());
@Override
public WireFeed createRealFeed(final SyndFeed syndFeed) {
final Feed aFeed = new Feed(getType());
aFeed.setModules(ModuleUtils.cloneModules(syndFeed.getModules()));
aFeed.setEncoding(syndFeed.getEncoding());
aFeed.setId(syndFeed.getUri());
SyndContent sTitle = syndFeed.getTitleEx();
final SyndContent sTitle = syndFeed.getTitleEx();
if (sTitle != null) {
Content title = new Content();
final Content title = new Content();
title.setType(sTitle.getType());
title.setValue(sTitle.getValue());
aFeed.setTitleEx(title);
}
SyndContent sDesc = syndFeed.getDescriptionEx();
final SyndContent sDesc = syndFeed.getDescriptionEx();
if (sDesc != null) {
Content subtitle = new Content();
final Content subtitle = new Content();
subtitle.setType(sDesc.getType());
subtitle.setValue(sDesc.getValue());
aFeed.setSubtitle(subtitle);
}
// separate SyndEntry's links collection into alternate and other links
List<Link> alternateLinks = new ArrayList<Link>();
List<Link> otherLinks = new ArrayList<Link>();
List<SyndLink> slinks = syndFeed.getLinks();
final List<Link> alternateLinks = new ArrayList<Link>();
final List<Link> otherLinks = new ArrayList<Link>();
final List<SyndLink> slinks = syndFeed.getLinks();
if (slinks != null) {
for (Iterator<SyndLink> iter=slinks.iterator(); iter.hasNext();) {
SyndLink syndLink = (SyndLink)iter.next();
Link link = createAtomLink(syndLink);
if (link.getRel() == null ||
"".equals(link.getRel().trim()) ||
"alternate".equals(link.getRel())) {
for (final SyndLink syndLink2 : slinks) {
final SyndLink syndLink = syndLink2;
final Link link = createAtomLink(syndLink);
if (link.getRel() == null || "".equals(link.getRel().trim()) || "alternate".equals(link.getRel())) {
alternateLinks.add(link);
} else {
otherLinks.add(link);
@ -361,35 +350,41 @@ public class ConverterForAtom10 implements Converter {
}
// no alternate link? then use THE link if there is one
if (alternateLinks.isEmpty() && syndFeed.getLink() != null) {
Link link = new Link();
final Link link = new Link();
link.setRel("alternate");
link.setHref(syndFeed.getLink());
alternateLinks.add(link);
}
if (alternateLinks.size() > 0) aFeed.setAlternateLinks(alternateLinks);
if (otherLinks.size() > 0) aFeed.setOtherLinks(otherLinks);
if (alternateLinks.size() > 0) {
aFeed.setAlternateLinks(alternateLinks);
}
if (otherLinks.size() > 0) {
aFeed.setOtherLinks(otherLinks);
}
List<SyndCategory> sCats = syndFeed.getCategories();
List<Category> aCats = new ArrayList<Category>();
final List<SyndCategory> sCats = syndFeed.getCategories();
final List<Category> aCats = new ArrayList<Category>();
if (sCats != null) {
for (Iterator<SyndCategory> iter=sCats.iterator(); iter.hasNext();) {
SyndCategory sCat = (SyndCategory)iter.next();
Category aCat = new Category();
for (final SyndCategory syndCategory : sCats) {
final SyndCategory sCat = syndCategory;
final Category aCat = new Category();
aCat.setTerm(sCat.getName());
// TODO: aCat.setLabel(sCat.getLabel());
aCat.setScheme(sCat.getTaxonomyUri());
aCats.add(aCat);
}
}
if (aCats.size() > 0) aFeed.setCategories(aCats);
if (aCats.size() > 0) {
aFeed.setCategories(aCats);
}
List<SyndPerson> authors = syndFeed.getAuthors();
if (authors!=null && authors.size() > 0) {
final List<SyndPerson> authors = syndFeed.getAuthors();
if (authors != null && authors.size() > 0) {
aFeed.setAuthors(ConverterForAtom03.createAtomPersons(authors));
}
List<SyndPerson> contributors = syndFeed.getContributors();
if (contributors!=null && contributors.size() > 0) {
final List<SyndPerson> contributors = syndFeed.getContributors();
if (contributors != null && contributors.size() > 0) {
aFeed.setContributors(ConverterForAtom03.createAtomPersons(contributors));
}
@ -397,89 +392,86 @@ public class ConverterForAtom10 implements Converter {
aFeed.setUpdated(syndFeed.getPublishedDate());
List<SyndEntry> sEntries = syndFeed.getEntries();
if (sEntries!=null) {
final List<SyndEntry> sEntries = syndFeed.getEntries();
if (sEntries != null) {
aFeed.setEntries(createAtomEntries(sEntries));
}
if (((List<Element>)syndFeed.getForeignMarkup()).size() > 0) {
if (syndFeed.getForeignMarkup().size() > 0) {
aFeed.setForeignMarkup(syndFeed.getForeignMarkup());
}
return aFeed;
}
protected SyndContent createSyndContent(Content content) {
SyndContent sContent = new SyndContentImpl();
protected SyndContent createSyndContent(final Content content) {
final SyndContent sContent = new SyndContentImpl();
sContent.setType(content.getType());
sContent.setValue(content.getValue());
return sContent;
}
protected List<Entry> createAtomEntries(List<SyndEntry> syndEntries) {
List<Entry> atomEntries = new ArrayList<Entry>();
for (int i=0;i<syndEntries.size();i++) {
atomEntries.add(createAtomEntry((SyndEntry)syndEntries.get(i)));
protected List<Entry> createAtomEntries(final List<SyndEntry> syndEntries) {
final List<Entry> atomEntries = new ArrayList<Entry>();
for (int i = 0; i < syndEntries.size(); i++) {
atomEntries.add(createAtomEntry(syndEntries.get(i)));
}
return atomEntries;
}
protected Content createAtomContent(SyndContent sContent) {
Content content = new Content();
protected Content createAtomContent(final SyndContent sContent) {
final Content content = new Content();
content.setType(sContent.getType());
content.setValue(sContent.getValue());
return content;
}
protected List<Content> createAtomContents(List<SyndContent> syndContents) {
List<Content> atomContents = new ArrayList<Content>();
for (int i=0;i<syndContents.size();i++) {
atomContents.add(createAtomContent((SyndContent)syndContents.get(i)));
protected List<Content> createAtomContents(final List<SyndContent> syndContents) {
final List<Content> atomContents = new ArrayList<Content>();
for (int i = 0; i < syndContents.size(); i++) {
atomContents.add(createAtomContent(syndContents.get(i)));
}
return atomContents;
}
protected Entry createAtomEntry(SyndEntry sEntry) {
Entry aEntry = new Entry();
protected Entry createAtomEntry(final SyndEntry sEntry) {
final Entry aEntry = new Entry();
aEntry.setModules(ModuleUtils.cloneModules(sEntry.getModules()));
aEntry.setId(sEntry.getUri());
SyndContent sTitle = sEntry.getTitleEx();
if (sTitle!=null) {
Content title = new Content();
final SyndContent sTitle = sEntry.getTitleEx();
if (sTitle != null) {
final Content title = new Content();
title.setType(sTitle.getType());
title.setValue(sTitle.getValue());
aEntry.setTitleEx(title);
}
SyndContent sDescription = sEntry.getDescription();
if (sDescription!=null) {
Content summary = new Content();
final SyndContent sDescription = sEntry.getDescription();
if (sDescription != null) {
final Content summary = new Content();
summary.setType(sDescription.getType());
summary.setValue(sDescription.getValue());
aEntry.setSummary(summary);
}
// separate SyndEntry's links collection into alternate and other links
List<Link> alternateLinks = new ArrayList<Link>();
List<Link> otherLinks = new ArrayList<Link>();
List<SyndLink> slinks = sEntry.getLinks();
List<SyndEnclosure> enclosures = sEntry.getEnclosures();
final List<Link> alternateLinks = new ArrayList<Link>();
final List<Link> otherLinks = new ArrayList<Link>();
final List<SyndLink> slinks = sEntry.getLinks();
final List<SyndEnclosure> enclosures = sEntry.getEnclosures();
boolean linkRelEnclosureExists = false;
if (slinks != null) {
for (Iterator<SyndLink> iter=slinks.iterator(); iter.hasNext();) {
SyndLink syndLink = (SyndLink)iter.next();
Link link = createAtomLink(syndLink);
for (final SyndLink syndLink2 : slinks) {
final SyndLink syndLink = syndLink2;
final Link link = createAtomLink(syndLink);
// Set this flag if there's a link of rel = enclosure so that
// enclosures won't be duplicated when pulled from
// SyndEntry.getEnclosures()
if (syndLink.getRel() != null &&
"enclosure".equals(syndLink.getRel())) {
if (syndLink.getRel() != null && "enclosure".equals(syndLink.getRel())) {
linkRelEnclosureExists = true;
}
if (link.getRel() == null ||
"".equals(link.getRel().trim()) ||
"alternate".equals(syndLink.getRel())) {
if (link.getRel() == null || "".equals(link.getRel().trim()) || "alternate".equals(syndLink.getRel())) {
alternateLinks.add(link);
} else {
otherLinks.add(link);
@ -488,7 +480,7 @@ public class ConverterForAtom10 implements Converter {
}
// no alternate link? then use THE link if there is one
if (alternateLinks.isEmpty() && sEntry.getLink() != null) {
Link link = new Link();
final Link link = new Link();
link.setRel("alternate");
link.setHref(sEntry.getLink());
alternateLinks.add(link);
@ -496,45 +488,51 @@ public class ConverterForAtom10 implements Converter {
// add SyndEnclosures as links with rel="enclosure" ONLY if
// there are no SyndEntry.getLinks() with rel="enclosure"
if (enclosures != null && linkRelEnclosureExists == false) {
for (Iterator<SyndEnclosure> iter=enclosures.iterator(); iter.hasNext();) {
SyndEnclosure syndEncl = (SyndEnclosure)iter.next();
Link link = createAtomEnclosure(syndEncl);
for (final SyndEnclosure syndEnclosure : enclosures) {
final SyndEnclosure syndEncl = syndEnclosure;
final Link link = createAtomEnclosure(syndEncl);
otherLinks.add(link);
}
}
if (alternateLinks.size() > 0) aEntry.setAlternateLinks(alternateLinks);
if (otherLinks.size() > 0) aEntry.setOtherLinks(otherLinks);
if (alternateLinks.size() > 0) {
aEntry.setAlternateLinks(alternateLinks);
}
if (otherLinks.size() > 0) {
aEntry.setOtherLinks(otherLinks);
}
List<SyndCategory> sCats = sEntry.getCategories();
List<Category> aCats = new ArrayList<Category>();
final List<SyndCategory> sCats = sEntry.getCategories();
final List<Category> aCats = new ArrayList<Category>();
if (sCats != null) {
for (Iterator<SyndCategory> iter=sCats.iterator(); iter.hasNext();) {
SyndCategory sCat = (SyndCategory)iter.next();
Category aCat = new Category();
for (final SyndCategory syndCategory : sCats) {
final SyndCategory sCat = syndCategory;
final Category aCat = new Category();
aCat.setTerm(sCat.getName());
// TODO: aCat.setLabel(sCat.getLabel());
aCat.setScheme(sCat.getTaxonomyUri());
aCats.add(aCat);
}
}
if (aCats.size() > 0) aEntry.setCategories(aCats);
if (aCats.size() > 0) {
aEntry.setCategories(aCats);
}
List<SyndContent> syndContents = sEntry.getContents();
final List<SyndContent> syndContents = sEntry.getContents();
aEntry.setContents(createAtomContents(syndContents));
List authors = sEntry.getAuthors();
if (authors!=null && authors.size() > 0) {
if (authors != null && authors.size() > 0) {
aEntry.setAuthors(ConverterForAtom03.createAtomPersons(authors));
} else if (sEntry.getAuthor() != null) {
Person person = new Person();
final Person person = new Person();
person.setName(sEntry.getAuthor());
authors = new ArrayList();
authors.add(person);
aEntry.setAuthors(authors);
}
List<SyndPerson> contributors = sEntry.getContributors();
if (contributors!=null && contributors.size() > 0) {
final List<SyndPerson> contributors = sEntry.getContributors();
if (contributors != null && contributors.size() > 0) {
aEntry.setContributors(ConverterForAtom03.createAtomPersons(contributors));
}
@ -549,13 +547,13 @@ public class ConverterForAtom10 implements Converter {
aEntry.setUpdated(sEntry.getPublishedDate());
}
if (((List<Element>)sEntry.getForeignMarkup()).size() > 0) {
aEntry.setForeignMarkup((List<Element>)sEntry.getForeignMarkup());
if (sEntry.getForeignMarkup().size() > 0) {
aEntry.setForeignMarkup(sEntry.getForeignMarkup());
}
SyndFeed sSource = sEntry.getSource();
final SyndFeed sSource = sEntry.getSource();
if (sSource != null) {
Feed aSource = (Feed) sSource.createWireFeed(getType());
final Feed aSource = (Feed) sSource.createWireFeed(getType());
aEntry.setSource(aSource);
}
return aEntry;

View file

@ -16,82 +16,87 @@
*/
package com.sun.syndication.feed.synd.impl;
import java.util.ArrayList;
import java.util.List;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.module.impl.ModuleUtils;
import com.sun.syndication.feed.rss.Channel;
import com.sun.syndication.feed.rss.Image;
import com.sun.syndication.feed.rss.Item;
import com.sun.syndication.feed.synd.*;
import java.util.ArrayList;
import java.util.List;
import org.jdom2.Element;
import com.sun.syndication.feed.synd.Converter;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndImage;
import com.sun.syndication.feed.synd.SyndImageImpl;
/**
*/
public class ConverterForRSS090 implements Converter {
private String _type;
private final String _type;
public ConverterForRSS090() {
this("rss_0.9");
}
protected ConverterForRSS090(String type) {
_type = type;
protected ConverterForRSS090(final String type) {
this._type = type;
}
@Override
public String getType() {
return _type;
return this._type;
}
public void copyInto(WireFeed feed,SyndFeed syndFeed) {
@Override
public void copyInto(final WireFeed feed, final SyndFeed syndFeed) {
syndFeed.setModules(ModuleUtils.cloneModules(feed.getModules()));
if (((List<Element>)feed.getForeignMarkup()).size() > 0) {
if (feed.getForeignMarkup().size() > 0) {
syndFeed.setForeignMarkup(feed.getForeignMarkup());
}
syndFeed.setEncoding(feed.getEncoding());
Channel channel = (Channel) feed;
final Channel channel = (Channel) feed;
syndFeed.setTitle(channel.getTitle());
syndFeed.setLink(channel.getLink());
syndFeed.setDescription(channel.getDescription());
Image image = channel.getImage();
if (image!=null) {
final Image image = channel.getImage();
if (image != null) {
syndFeed.setImage(createSyndImage(image));
}
List<Item> items = channel.getItems();
if (items!=null) {
final List<Item> items = channel.getItems();
if (items != null) {
syndFeed.setEntries(createSyndEntries(items, syndFeed.isPreservingWireFeed()));
}
}
protected SyndImage createSyndImage(Image rssImage) {
SyndImage syndImage = new SyndImageImpl();
protected SyndImage createSyndImage(final Image rssImage) {
final SyndImage syndImage = new SyndImageImpl();
syndImage.setTitle(rssImage.getTitle());
syndImage.setUrl(rssImage.getUrl());
syndImage.setLink(rssImage.getLink());
return syndImage;
}
protected List<SyndEntry> createSyndEntries(List<Item> rssItems, boolean preserveWireItems) {
List<SyndEntry> syndEntries = new ArrayList<SyndEntry>();
for (int i=0;i<rssItems.size();i++) {
syndEntries.add(createSyndEntry((Item) rssItems.get(i), preserveWireItems));
protected List<SyndEntry> createSyndEntries(final List<Item> rssItems, final boolean preserveWireItems) {
final List<SyndEntry> syndEntries = new ArrayList<SyndEntry>();
for (int i = 0; i < rssItems.size(); i++) {
syndEntries.add(createSyndEntry(rssItems.get(i), preserveWireItems));
}
return syndEntries;
}
protected SyndEntry createSyndEntry(Item item, boolean preserveWireItem) {
SyndEntryImpl syndEntry = new SyndEntryImpl();
protected SyndEntry createSyndEntry(final Item item, final boolean preserveWireItem) {
final SyndEntryImpl syndEntry = new SyndEntryImpl();
if (preserveWireItem) {
syndEntry.setWireEntry(item);
}
syndEntry.setModules(ModuleUtils.cloneModules(item.getModules()));
if (((List<Element>)item.getForeignMarkup()).size() > 0) {
if (item.getForeignMarkup().size() > 0) {
syndEntry.setForeignMarkup(item.getForeignMarkup());
}
@ -102,12 +107,13 @@ public class ConverterForRSS090 implements Converter {
return syndEntry;
}
public WireFeed createRealFeed(SyndFeed syndFeed) {
return createRealFeed(getType(),syndFeed);
@Override
public WireFeed createRealFeed(final SyndFeed syndFeed) {
return this.createRealFeed(getType(), syndFeed);
}
protected WireFeed createRealFeed(String type,SyndFeed syndFeed) {
Channel channel = new Channel(type);
protected WireFeed createRealFeed(final String type, final SyndFeed syndFeed) {
final Channel channel = new Channel(type);
channel.setModules(ModuleUtils.cloneModules(syndFeed.getModules()));
channel.setEncoding(syndFeed.getEncoding());
@ -115,59 +121,56 @@ public class ConverterForRSS090 implements Converter {
channel.setTitle(syndFeed.getTitle());
if (syndFeed.getLink() != null) {
channel.setLink(syndFeed.getLink());
}
else
if (syndFeed.getLinks().size() > 0) {
channel.setLink(((SyndLink)syndFeed.getLinks().get(0)).getHref());
} else if (syndFeed.getLinks().size() > 0) {
channel.setLink(syndFeed.getLinks().get(0).getHref());
}
channel.setDescription(syndFeed.getDescription());
SyndImage sImage = syndFeed.getImage();
if (sImage!=null) {
final SyndImage sImage = syndFeed.getImage();
if (sImage != null) {
channel.setImage(createRSSImage(sImage));
}
List<SyndEntry> sEntries = syndFeed.getEntries();
if (sEntries!=null) {
final List<SyndEntry> sEntries = syndFeed.getEntries();
if (sEntries != null) {
channel.setItems(createRSSItems(sEntries));
}
if (((List<Element>)syndFeed.getForeignMarkup()).size() > 0) {
if (syndFeed.getForeignMarkup().size() > 0) {
channel.setForeignMarkup(syndFeed.getForeignMarkup());
}
return channel;
}
protected Image createRSSImage(SyndImage sImage) {
Image image = new Image();
protected Image createRSSImage(final SyndImage sImage) {
final Image image = new Image();
image.setTitle(sImage.getTitle());
image.setUrl(sImage.getUrl());
image.setLink(sImage.getLink());
return image;
}
protected List<Item> createRSSItems(List<SyndEntry> sEntries) {
List<Item> list = new ArrayList<Item>();
for (int i=0;i<sEntries.size();i++) {
list.add(createRSSItem((SyndEntry)sEntries.get(i)));
protected List<Item> createRSSItems(final List<SyndEntry> sEntries) {
final List<Item> list = new ArrayList<Item>();
for (int i = 0; i < sEntries.size(); i++) {
list.add(createRSSItem(sEntries.get(i)));
}
return list;
}
protected Item createRSSItem(SyndEntry sEntry) {
Item item = new Item();
protected Item createRSSItem(final SyndEntry sEntry) {
final Item item = new Item();
item.setModules(ModuleUtils.cloneModules(sEntry.getModules()));
item.setTitle(sEntry.getTitle());
item.setLink(sEntry.getLink());
if (((List<Element>)sEntry.getForeignMarkup()).size() > 0) {
if (sEntry.getForeignMarkup().size() > 0) {
item.setForeignMarkup(sEntry.getForeignMarkup());
}
String uri = sEntry.getUri();
final String uri = sEntry.getUri();
if (uri != null) {
item.setUri(uri);
}
return item;
}

View file

@ -16,8 +16,6 @@
*/
package com.sun.syndication.feed.synd.impl;
/**
*/
public class ConverterForRSS091Netscape extends ConverterForRSS091Userland {
@ -26,7 +24,7 @@ public class ConverterForRSS091Netscape extends ConverterForRSS091Userland {
this("rss_0.91N");
}
protected ConverterForRSS091Netscape(String type) {
protected ConverterForRSS091Netscape(final String type) {
super(type);
}

View file

@ -16,6 +16,12 @@
*/
package com.sun.syndication.feed.synd.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.module.DCModule;
import com.sun.syndication.feed.rss.Channel;
@ -30,13 +36,6 @@ import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndImage;
import com.sun.syndication.feed.synd.SyndPerson;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
*/
public class ConverterForRSS091Userland extends ConverterForRSS090 {
@ -44,32 +43,34 @@ public class ConverterForRSS091Userland extends ConverterForRSS090 {
this("rss_0.91U");
}
protected ConverterForRSS091Userland(String type) {
protected ConverterForRSS091Userland(final String type) {
super(type);
}
@Override
public void copyInto(WireFeed feed, SyndFeed syndFeed) {
Channel channel = (Channel) feed;
public void copyInto(final WireFeed feed, final SyndFeed syndFeed) {
final Channel channel = (Channel) feed;
super.copyInto(channel, syndFeed);
syndFeed.setLanguage(channel.getLanguage()); //c
syndFeed.setCopyright(channel.getCopyright()); //c
syndFeed.setLanguage(channel.getLanguage()); // c
syndFeed.setCopyright(channel.getCopyright()); // c
Date pubDate = channel.getPubDate();
final Date pubDate = channel.getPubDate();
if (pubDate != null) {
syndFeed.setPublishedDate(pubDate); //c
syndFeed.setPublishedDate(pubDate); // c
} else if (channel.getLastBuildDate() != null) {
syndFeed.setPublishedDate(channel.getLastBuildDate()); //c
syndFeed.setPublishedDate(channel.getLastBuildDate()); // c
}
String author = channel.getManagingEditor();
final String author = channel.getManagingEditor();
if (author != null) {
List<String> creators = ((DCModule) syndFeed.getModule(DCModule.URI)).getCreators();
final List<String> creators = ((DCModule) syndFeed.getModule(DCModule.URI)).getCreators();
if (!creators.contains(author)) {
Set<String> s = new HashSet<String>(); // using a set to remove duplicates
final Set<String> s = new HashSet<String>(); // using a set to
// remove
// duplicates
s.addAll(creators); // DC creators
s.add(author); // feed native author
creators.clear();
@ -78,8 +79,8 @@ public class ConverterForRSS091Userland extends ConverterForRSS090 {
}
}
protected Description createItemDescription(SyndContent sContent) {
Description desc = new Description();
protected Description createItemDescription(final SyndContent sContent) {
final Description desc = new Description();
desc.setValue(sContent.getValue());
desc.setType(sContent.getType());
@ -87,8 +88,8 @@ public class ConverterForRSS091Userland extends ConverterForRSS090 {
}
@Override
protected Image createRSSImage(SyndImage sImage) {
Image image = super.createRSSImage(sImage);
protected Image createRSSImage(final SyndImage sImage) {
final Image image = super.createRSSImage(sImage);
image.setDescription(sImage.getDescription());
return image;
@ -98,20 +99,20 @@ public class ConverterForRSS091Userland extends ConverterForRSS090 {
// synd.content -> rss.content
// synd.description -> rss.description
@Override
protected Item createRSSItem(SyndEntry sEntry) {
Item item = super.createRSSItem(sEntry);
protected Item createRSSItem(final SyndEntry sEntry) {
final Item item = super.createRSSItem(sEntry);
SyndContent sContent = sEntry.getDescription();
final SyndContent sContent = sEntry.getDescription();
if (sContent != null) {
item.setDescription(createItemDescription(sContent));
}
List<SyndContent> contents = sEntry.getContents();
final List<SyndContent> contents = sEntry.getContents();
if ((contents != null) && (contents.size() > 0)) {
SyndContent syndContent = (SyndContent) contents.get(0);
Content cont = new Content();
if (contents != null && contents.size() > 0) {
final SyndContent syndContent = contents.get(0);
final Content cont = new Content();
cont.setValue(syndContent.getValue());
cont.setType(syndContent.getType());
item.setContent(cont);
@ -121,16 +122,14 @@ public class ConverterForRSS091Userland extends ConverterForRSS090 {
}
@Override
protected WireFeed createRealFeed(String type, SyndFeed syndFeed) {
Channel channel = (Channel) super.createRealFeed(type, syndFeed);
channel.setLanguage(syndFeed.getLanguage()); //c
channel.setCopyright(syndFeed.getCopyright()); //c
channel.setPubDate(syndFeed.getPublishedDate()); //c
protected WireFeed createRealFeed(final String type, final SyndFeed syndFeed) {
final Channel channel = (Channel) super.createRealFeed(type, syndFeed);
channel.setLanguage(syndFeed.getLanguage()); // c
channel.setCopyright(syndFeed.getCopyright()); // c
channel.setPubDate(syndFeed.getPublishedDate()); // c
if ((syndFeed.getAuthors() != null) && (syndFeed.getAuthors()
.size() > 0)) {
SyndPerson author = (SyndPerson) syndFeed.getAuthors()
.get(0);
if (syndFeed.getAuthors() != null && syndFeed.getAuthors().size() > 0) {
final SyndPerson author = syndFeed.getAuthors().get(0);
channel.setManagingEditor(author.getName());
}
@ -141,25 +140,25 @@ public class ConverterForRSS091Userland extends ConverterForRSS090 {
// rss.content -> synd.content
// rss.description -> synd.description
@Override
protected SyndEntry createSyndEntry(Item item, boolean preserveWireItem) {
SyndEntry syndEntry = super.createSyndEntry(item, preserveWireItem);
Description desc = item.getDescription();
protected SyndEntry createSyndEntry(final Item item, final boolean preserveWireItem) {
final SyndEntry syndEntry = super.createSyndEntry(item, preserveWireItem);
final Description desc = item.getDescription();
if (desc != null) {
SyndContent descContent = new SyndContentImpl();
final SyndContent descContent = new SyndContentImpl();
descContent.setType(desc.getType());
descContent.setValue(desc.getValue());
syndEntry.setDescription(descContent);
}
Content cont = item.getContent();
final Content cont = item.getContent();
if (cont != null) {
SyndContent content = new SyndContentImpl();
final SyndContent content = new SyndContentImpl();
content.setType(cont.getType());
content.setValue(cont.getValue());
List<SyndContent> syndContents = new ArrayList<SyndContent>();
final List<SyndContent> syndContents = new ArrayList<SyndContent>();
syndContents.add(content);
syndEntry.setContents(syndContents);
}
@ -168,8 +167,8 @@ public class ConverterForRSS091Userland extends ConverterForRSS090 {
}
@Override
protected SyndImage createSyndImage(Image rssImage) {
SyndImage syndImage = super.createSyndImage(rssImage);
protected SyndImage createSyndImage(final Image rssImage) {
final SyndImage syndImage = super.createSyndImage(rssImage);
syndImage.setDescription(rssImage.getDescription());
return syndImage;

View file

@ -38,32 +38,47 @@ public class ConverterForRSS092 extends ConverterForRSS091Userland {
this("rss_0.92");
}
protected ConverterForRSS092(String type) {
protected ConverterForRSS092(final String type) {
super(type);
}
@Override
protected SyndEntry createSyndEntry(Item item, boolean preserveWireItem) {
SyndEntry syndEntry = super.createSyndEntry(item, preserveWireItem);
List<Category> cats = item.getCategories();
if (cats.size()>0) {
Set<SyndCategory> s = new LinkedHashSet<SyndCategory>(); // using a set to remove duplicates and use a LinkedHashSet to try to retain the document order
s.addAll(createSyndCategories(cats)); // feed native categories (as syndcat)
protected SyndEntry createSyndEntry(final Item item, final boolean preserveWireItem) {
final SyndEntry syndEntry = super.createSyndEntry(item, preserveWireItem);
final List<Category> cats = item.getCategories();
if (cats.size() > 0) {
final Set<SyndCategory> s = new LinkedHashSet<SyndCategory>(); // using
// a
// set to
// remove
// duplicates
// and use
// a
// LinkedHashSet
// to try
// to
// retain
// the
// document
// order
s.addAll(createSyndCategories(cats)); // feed native categories
// (as
// syndcat)
s.addAll(syndEntry.getCategories()); // DC subjects (as syndcat)
syndEntry.setCategories(new ArrayList<SyndCategory>(s)); //c
syndEntry.setCategories(new ArrayList<SyndCategory>(s)); // c
}
List<Enclosure> enclosures = item.getEnclosures();
if (enclosures.size()>0) {
final List<Enclosure> enclosures = item.getEnclosures();
if (enclosures.size() > 0) {
syndEntry.setEnclosures(createSyndEnclosures(enclosures));
}
return syndEntry;
}
protected List<SyndCategory> createSyndCategories(List<Category> rssCats) {
List<SyndCategory> syndCats = new ArrayList<SyndCategory>();
for (int i=0;i<rssCats.size();i++) {
Category rssCat = (Category) rssCats.get(i);
SyndCategory sCat = new SyndCategoryImpl();
protected List<SyndCategory> createSyndCategories(final List<Category> rssCats) {
final List<SyndCategory> syndCats = new ArrayList<SyndCategory>();
for (int i = 0; i < rssCats.size(); i++) {
final Category rssCat = rssCats.get(i);
final SyndCategory sCat = new SyndCategoryImpl();
sCat.setTaxonomyUri(rssCat.getDomain());
sCat.setName(rssCat.getValue());
syndCats.add(sCat);
@ -71,11 +86,11 @@ public class ConverterForRSS092 extends ConverterForRSS091Userland {
return syndCats;
}
protected List<SyndEnclosure> createSyndEnclosures(List<Enclosure> enclosures) {
List<SyndEnclosure> sEnclosures = new ArrayList<SyndEnclosure>();
for (int i=0;i<enclosures.size();i++) {
Enclosure enc = (Enclosure) enclosures.get(i);
SyndEnclosure sEnc = new SyndEnclosureImpl();
protected List<SyndEnclosure> createSyndEnclosures(final List<Enclosure> enclosures) {
final List<SyndEnclosure> sEnclosures = new ArrayList<SyndEnclosure>();
for (int i = 0; i < enclosures.size(); i++) {
final Enclosure enc = enclosures.get(i);
final SyndEnclosure sEnc = new SyndEnclosureImpl();
sEnc.setUrl(enc.getUrl());
sEnc.setType(enc.getType());
sEnc.setLength(enc.getLength());
@ -85,25 +100,25 @@ public class ConverterForRSS092 extends ConverterForRSS091Userland {
}
@Override
protected Item createRSSItem(SyndEntry sEntry) {
Item item = super.createRSSItem(sEntry);
protected Item createRSSItem(final SyndEntry sEntry) {
final Item item = super.createRSSItem(sEntry);
List<SyndCategory> sCats = sEntry.getCategories(); //c
if (sCats.size()>0) {
final List<SyndCategory> sCats = sEntry.getCategories(); // c
if (sCats.size() > 0) {
item.setCategories(createRSSCategories(sCats));
}
List<SyndEnclosure> sEnclosures = sEntry.getEnclosures();
if (sEnclosures.size()>0) {
final List<SyndEnclosure> sEnclosures = sEntry.getEnclosures();
if (sEnclosures.size() > 0) {
item.setEnclosures(createEnclosures(sEnclosures));
}
return item;
}
protected List<Category> createRSSCategories(List<SyndCategory> sCats) {
List<Category> cats = new ArrayList<Category>();
for (int i=0;i<sCats.size();i++) {
SyndCategory sCat = (SyndCategory) sCats.get(i);
Category cat = new Category();
protected List<Category> createRSSCategories(final List<SyndCategory> sCats) {
final List<Category> cats = new ArrayList<Category>();
for (int i = 0; i < sCats.size(); i++) {
final SyndCategory sCat = sCats.get(i);
final Category cat = new Category();
cat.setDomain(sCat.getTaxonomyUri());
cat.setValue(sCat.getName());
cats.add(cat);
@ -111,11 +126,11 @@ public class ConverterForRSS092 extends ConverterForRSS091Userland {
return cats;
}
protected List<Enclosure> createEnclosures(List<SyndEnclosure> sEnclosures) {
List<Enclosure> enclosures = new ArrayList<Enclosure>();
for (int i=0;i<sEnclosures.size();i++) {
SyndEnclosure sEnc = (SyndEnclosure) sEnclosures.get(i);
Enclosure enc = new Enclosure();
protected List<Enclosure> createEnclosures(final List<SyndEnclosure> sEnclosures) {
final List<Enclosure> enclosures = new ArrayList<Enclosure>();
for (int i = 0; i < sEnclosures.size(); i++) {
final SyndEnclosure sEnc = sEnclosures.get(i);
final Enclosure enc = new Enclosure();
enc.setUrl(sEnc.getUrl());
enc.setType(sEnc.getType());
enc.setLength(sEnc.getLength());

View file

@ -16,11 +16,11 @@
*/
package com.sun.syndication.feed.synd.impl;
import java.util.Date;
import com.sun.syndication.feed.rss.Item;
import com.sun.syndication.feed.synd.SyndEntry;
import java.util.Date;
/**
*/
public class ConverterForRSS093 extends ConverterForRSS092 {
@ -29,24 +29,24 @@ public class ConverterForRSS093 extends ConverterForRSS092 {
this("rss_0.93");
}
protected ConverterForRSS093(String type) {
protected ConverterForRSS093(final String type) {
super(type);
}
@Override
protected SyndEntry createSyndEntry(Item item, boolean preserveWireItem) {
SyndEntry syndEntry = super.createSyndEntry(item, preserveWireItem);
Date pubDate = item.getPubDate();
if (pubDate!=null) {
syndEntry.setPublishedDate(pubDate); //c
protected SyndEntry createSyndEntry(final Item item, final boolean preserveWireItem) {
final SyndEntry syndEntry = super.createSyndEntry(item, preserveWireItem);
final Date pubDate = item.getPubDate();
if (pubDate != null) {
syndEntry.setPublishedDate(pubDate); // c
}
return syndEntry;
}
@Override
protected Item createRSSItem(SyndEntry sEntry) {
Item item = super.createRSSItem(sEntry);
item.setPubDate(sEntry.getPublishedDate()); //c
protected Item createRSSItem(final SyndEntry sEntry) {
final Item item = super.createRSSItem(sEntry);
item.setPubDate(sEntry.getPublishedDate()); // c
return item;
}

View file

@ -16,6 +16,11 @@
*/
package com.sun.syndication.feed.synd.impl;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.module.DCModule;
import com.sun.syndication.feed.rss.Category;
@ -29,11 +34,6 @@ import com.sun.syndication.feed.synd.SyndLink;
import com.sun.syndication.feed.synd.SyndLinkImpl;
import com.sun.syndication.feed.synd.SyndPerson;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
*/
public class ConverterForRSS094 extends ConverterForRSS093 {
@ -42,33 +42,40 @@ public class ConverterForRSS094 extends ConverterForRSS093 {
this("rss_0.94");
}
protected ConverterForRSS094(String type) {
protected ConverterForRSS094(final String type) {
super(type);
}
@Override
public void copyInto(WireFeed feed,SyndFeed syndFeed) {
Channel channel = (Channel) feed;
super.copyInto(channel,syndFeed);
List<Category> cats = channel.getCategories(); //c
if (cats.size()>0) {
Set<SyndCategory> s = new HashSet<SyndCategory>(); // using a set to remove duplicates
s.addAll(createSyndCategories(cats)); // feed native categories (as syndcat)
public void copyInto(final WireFeed feed, final SyndFeed syndFeed) {
final Channel channel = (Channel) feed;
super.copyInto(channel, syndFeed);
final List<Category> cats = channel.getCategories(); // c
if (cats.size() > 0) {
final Set<SyndCategory> s = new HashSet<SyndCategory>(); // using a
// set to
// remove
// duplicates
s.addAll(createSyndCategories(cats)); // feed native categories
// (as
// syndcat)
s.addAll(syndFeed.getCategories()); // DC subjects (as syndcat)
syndFeed.setCategories(new ArrayList<SyndCategory>(s));
}
}
@Override
protected SyndEntry createSyndEntry(Item item, boolean preserveWireItem) {
SyndEntry syndEntry = super.createSyndEntry(item, preserveWireItem);
protected SyndEntry createSyndEntry(final Item item, final boolean preserveWireItem) {
final SyndEntry syndEntry = super.createSyndEntry(item, preserveWireItem);
// adding native feed author to DC creators list
String author = item.getAuthor();
if (author!=null) {
List<String> creators = ((DCModule)syndEntry.getModule(DCModule.URI)).getCreators();
final String author = item.getAuthor();
if (author != null) {
final List<String> creators = ((DCModule) syndEntry.getModule(DCModule.URI)).getCreators();
if (!creators.contains(author)) {
Set<String> s = new HashSet<String>(); // using a set to remove duplicates
final Set<String> s = new HashSet<String>(); // using a set to
// remove
// duplicates
s.addAll(creators); // DC creators
s.add(author); // feed native author
creators.clear();
@ -76,18 +83,17 @@ public class ConverterForRSS094 extends ConverterForRSS093 {
}
}
Guid guid = item.getGuid();
if (guid!=null) {
final Guid guid = item.getGuid();
if (guid != null) {
syndEntry.setUri(guid.getValue());
if (item.getLink()==null && guid.isPermaLink()) {
if (item.getLink() == null && guid.isPermaLink()) {
syndEntry.setLink(guid.getValue());
}
}
else {
} else {
syndEntry.setUri(item.getLink());
}
if(item.getComments() != null){
SyndLinkImpl comments = new SyndLinkImpl();
if (item.getComments() != null) {
final SyndLinkImpl comments = new SyndLinkImpl();
comments.setRel("comments");
comments.setHref(item.getComments());
comments.setType("text/html");
@ -95,43 +101,41 @@ public class ConverterForRSS094 extends ConverterForRSS093 {
return syndEntry;
}
@Override
protected WireFeed createRealFeed(String type,SyndFeed syndFeed) {
Channel channel = (Channel) super.createRealFeed(type,syndFeed);
List<SyndCategory> cats = syndFeed.getCategories(); //c
if (cats.size()>0) {
protected WireFeed createRealFeed(final String type, final SyndFeed syndFeed) {
final Channel channel = (Channel) super.createRealFeed(type, syndFeed);
final List<SyndCategory> cats = syndFeed.getCategories(); // c
if (cats.size() > 0) {
channel.setCategories(createRSSCategories(cats));
}
return channel;
}
@Override
protected Item createRSSItem(SyndEntry sEntry) {
Item item = super.createRSSItem(sEntry);
if (sEntry.getAuthors()!=null && sEntry.getAuthors().size() > 0) {
SyndPerson author = (SyndPerson)sEntry.getAuthors().get(0);
protected Item createRSSItem(final SyndEntry sEntry) {
final Item item = super.createRSSItem(sEntry);
if (sEntry.getAuthors() != null && sEntry.getAuthors().size() > 0) {
final SyndPerson author = sEntry.getAuthors().get(0);
item.setAuthor(author.getEmail());
}
Guid guid = null;
String uri = sEntry.getUri();
if (uri!=null) {
final String uri = sEntry.getUri();
if (uri != null) {
guid = new Guid();
guid.setPermaLink(false);
guid.setValue(uri);
}
else {
String link = sEntry.getLink();
if (link!=null) {
} else {
final String link = sEntry.getLink();
if (link != null) {
guid = new Guid();
guid.setPermaLink(true);
guid.setValue(link);
}
}
item.setGuid(guid);
SyndLink comments = sEntry.findRelatedLink("comments");
if(comments != null && (comments.getType() == null || comments.getType().endsWith("html"))){
final SyndLink comments = sEntry.findRelatedLink("comments");
if (comments != null && (comments.getType() == null || comments.getType().endsWith("html"))) {
item.setComments(comments.getHref());
}
return item;

View file

@ -16,6 +16,9 @@
*/
package com.sun.syndication.feed.synd.impl;
import java.util.ArrayList;
import java.util.List;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.rss.Channel;
import com.sun.syndication.feed.rss.Content;
@ -25,8 +28,6 @@ import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndContentImpl;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import java.util.ArrayList;
import java.util.List;
/**
*/
@ -36,14 +37,14 @@ public class ConverterForRSS10 extends ConverterForRSS090 {
this("rss_1.0");
}
protected ConverterForRSS10(String type) {
protected ConverterForRSS10(final String type) {
super(type);
}
@Override
public void copyInto(WireFeed feed,SyndFeed syndFeed) {
Channel channel = (Channel) feed;
super.copyInto(channel,syndFeed);
public void copyInto(final WireFeed feed, final SyndFeed syndFeed) {
final Channel channel = (Channel) feed;
super.copyInto(channel, syndFeed);
if (channel.getUri() != null) {
syndFeed.setUri(channel.getUri());
} else {
@ -57,22 +58,22 @@ public class ConverterForRSS10 extends ConverterForRSS090 {
// rss.description -> synd.description
@Override
protected SyndEntry createSyndEntry(Item item, boolean preserveWireItem) {
SyndEntry syndEntry = super.createSyndEntry(item, preserveWireItem);
protected SyndEntry createSyndEntry(final Item item, final boolean preserveWireItem) {
final SyndEntry syndEntry = super.createSyndEntry(item, preserveWireItem);
Description desc = item.getDescription();
if (desc!=null) {
SyndContent descContent = new SyndContentImpl();
final Description desc = item.getDescription();
if (desc != null) {
final SyndContent descContent = new SyndContentImpl();
descContent.setType(desc.getType());
descContent.setValue(desc.getValue());
syndEntry.setDescription(descContent);
}
Content cont = item.getContent();
if (cont!=null) {
SyndContent contContent = new SyndContentImpl();
final Content cont = item.getContent();
if (cont != null) {
final SyndContent contContent = new SyndContentImpl();
contContent.setType(cont.getType());
contContent.setValue(cont.getValue());
List<SyndContent> contents = new ArrayList<SyndContent>();
final List<SyndContent> contents = new ArrayList<SyndContent>();
contents.add(contContent);
syndEntry.setContents(contents);
}
@ -81,8 +82,8 @@ public class ConverterForRSS10 extends ConverterForRSS090 {
}
@Override
protected WireFeed createRealFeed(String type,SyndFeed syndFeed) {
Channel channel = (Channel) super.createRealFeed(type,syndFeed);
protected WireFeed createRealFeed(final String type, final SyndFeed syndFeed) {
final Channel channel = (Channel) super.createRealFeed(type, syndFeed);
if (syndFeed.getUri() != null) {
channel.setUri(syndFeed.getUri());
} else {
@ -98,19 +99,19 @@ public class ConverterForRSS10 extends ConverterForRSS090 {
// synd.description -> rss.description
@Override
protected Item createRSSItem(SyndEntry sEntry) {
Item item = super.createRSSItem(sEntry);
protected Item createRSSItem(final SyndEntry sEntry) {
final Item item = super.createRSSItem(sEntry);
SyndContent desc = sEntry.getDescription();
if (desc!=null) {
final SyndContent desc = sEntry.getDescription();
if (desc != null) {
item.setDescription(createItemDescription(desc));
}
List<SyndContent> contents = sEntry.getContents();
if (contents!=null && contents.size() > 0) {
item.setContent(createItemContent((SyndContent)contents.get(0)));
final List<SyndContent> contents = sEntry.getContents();
if (contents != null && contents.size() > 0) {
item.setContent(createItemContent(contents.get(0)));
}
String uri = sEntry.getUri();
final String uri = sEntry.getUri();
if (uri != null) {
item.setUri(uri);
}
@ -118,15 +119,15 @@ public class ConverterForRSS10 extends ConverterForRSS090 {
return item;
}
protected Description createItemDescription(SyndContent sContent) {
Description desc = new Description();
protected Description createItemDescription(final SyndContent sContent) {
final Description desc = new Description();
desc.setValue(sContent.getValue());
desc.setType(sContent.getType());
return desc;
}
protected Content createItemContent(SyndContent sContent) {
Content cont = new Content();
protected Content createItemContent(final SyndContent sContent) {
final Content cont = new Content();
cont.setValue(sContent.getValue());
cont.setType(sContent.getType());
return cont;

View file

@ -16,9 +16,6 @@
*/
package com.sun.syndication.feed.synd.impl;
/**
*/
public class ConverterForRSS20 extends ConverterForRSS094 {
@ -27,7 +24,7 @@ public class ConverterForRSS20 extends ConverterForRSS094 {
this("rss_2.0");
}
protected ConverterForRSS20(String type) {
protected ConverterForRSS20(final String type) {
super(type);
}

View file

@ -16,17 +16,14 @@
*/
package com.sun.syndication.feed.synd.impl;
import com.sun.syndication.io.impl.PluginManager;
import com.sun.syndication.feed.synd.Converter;
import java.util.List;
import com.sun.syndication.feed.synd.Converter;
import com.sun.syndication.io.impl.PluginManager;
/**
* Created by IntelliJ IDEA.
* User: tucu
* Date: May 21, 2004
* Time: 5:26:04 PM
* To change this template use Options | File Templates.
* Created by IntelliJ IDEA. User: tucu Date: May 21, 2004 Time: 5:26:04 PM To
* change this template use Options | File Templates.
*/
public class Converters extends PluginManager {
@ -40,12 +37,13 @@ public class Converters extends PluginManager {
super(CONVERTERS_KEY);
}
public Converter getConverter(String feedType) {
public Converter getConverter(final String feedType) {
return (Converter) getPlugin(feedType);
}
protected String getKey(Object obj) {
return ((Converter)obj).getType();
@Override
protected String getKey(final Object obj) {
return ((Converter) obj).getType();
}
public List getSupportedFeedTypes() {

View file

@ -3,6 +3,7 @@ package com.sun.syndication.feed.synd.impl;
/**
* Utility class for normalizing an URI as specified in RFC 2396bis.
* <p>
*
* @author Alejandro Abdelnur
*/
public class URINormalizer {
@ -10,13 +11,15 @@ public class URINormalizer {
/**
* Normalizes an URI as specified in RFC 2396bis.
* <p>
*
* @param uri to normalize.
* @return the normalized value of the given URI, or <b>null</b> if the given URI was <b>null</b>.
* @return the normalized value of the given URI, or <b>null</b> if the
* given URI was <b>null</b>.
*/
public static String normalize(String uri) {
public static String normalize(final String uri) {
String normalizedUri = null;
if (uri!=null) {
normalizedUri = uri; //TODO THIS HAS TO BE IMPLEMENTED
if (uri != null) {
normalizedUri = uri; // TODO THIS HAS TO BE IMPLEMENTED
}
return normalizedUri;
}

View file

@ -2,14 +2,14 @@ package com.sun.syndication.io;
/**
* Adds the ability to give a direct wire feed generator reference to plugin
* modules that need to call back to their wire feed to complete
* generation of their particular namespace. Examples of such parsers
* include the SSE091Generator.
* modules that need to call back to their wire feed to complete generation of
* their particular namespace. Examples of such parsers include the
* SSE091Generator.
*/
public interface DelegatingModuleGenerator extends ModuleGenerator {
/**
* Provides a parent wirefeed reference to this ModuleParser,
* or "plugin-in".
* Provides a parent wirefeed reference to this ModuleParser, or
* "plugin-in".
*
* @param feedGenerator the parent wirefeed generator for this plugin.
*/

View file

@ -1,15 +1,14 @@
package com.sun.syndication.io;
/**
* Adds the ability to give a direct wire feed reference to plugin
* modules that need to call back to their wire feed to complete
* parsing of their particular namespace. Examples of such parsers
* include the SSE091Parser.
* Adds the ability to give a direct wire feed reference to plugin modules that
* need to call back to their wire feed to complete parsing of their particular
* namespace. Examples of such parsers include the SSE091Parser.
*/
public interface DelegatingModuleParser extends ModuleParser {
/**
* Provides a parent wirefeed reference to this ModuleParser,
* or "plugin-in".
* Provides a parent wirefeed reference to this ModuleParser, or
* "plugin-in".
*
* @param feedParser the parent wirefeed parser for this plugin.
*/

View file

@ -17,9 +17,10 @@
package com.sun.syndication.io;
/**
* Exception thrown by WireFeedInput, WireFeedOutput, WireFeedParser and WireFeedGenerator instances if they
* can not parse or generate a feed.
* Exception thrown by WireFeedInput, WireFeedOutput, WireFeedParser and
* WireFeedGenerator instances if they can not parse or generate a feed.
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -28,22 +29,24 @@ public class FeedException extends Exception {
/**
* Creates a FeedException with a message.
* <p>
*
* @param msg exception message.
*
*/
public FeedException(String msg) {
public FeedException(final String msg) {
super(msg);
}
/**
* Creates a FeedException with a message and a root cause exception.
* <p>
*
* @param msg exception message.
* @param rootCause root cause exception.
*
*/
public FeedException(String msg,Throwable rootCause) {
super(msg,rootCause);
public FeedException(final String msg, final Throwable rootCause) {
super(msg, rootCause);
}
}

View file

@ -16,10 +16,11 @@
*/
package com.sun.syndication.io;
import com.sun.syndication.feed.module.Module;
import java.util.Set;
import org.jdom2.Element;
import java.util.Set;
import com.sun.syndication.feed.module.Module;
/**
* Injects module metadata into a XML node (JDOM element).
@ -28,6 +29,7 @@ import java.util.Set;
* <p>
* TODO: explain how developers can plugin their own implementations.
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -36,27 +38,32 @@ public interface ModuleGenerator {
/**
* Returns the namespace URI this generator handles.
* <p>
*
* @return the namespace URI.
*
*/
public String getNamespaceUri();
/**
* Returns a set with all the URIs (JDOM Namespace elements) this module generator uses.
* Returns a set with all the URIs (JDOM Namespace elements) this module
* generator uses.
* <p/>
* It is used by the the feed generators to add their namespace definition in
* the root element of the generated document (forward-missing of Java 5.0 Generics).
* It is used by the the feed generators to add their namespace definition
* in the root element of the generated document (forward-missing of Java
* 5.0 Generics).
* <p/>
*
* @return a set with all the URIs (JDOM Namespace elements) this module generator uses.
* @return a set with all the URIs (JDOM Namespace elements) this module
* generator uses.
*/
public Set getNamespaces();
/**
* Generates and injects module metadata into an XML node (JDOM element).
* <p>
*
* @param module the module to inject into the XML node (JDOM element).
* @param element the XML node into which module meta-data will be injected.
*/
public void generate(Module module,Element element);
public void generate(Module module, Element element);
}

View file

@ -16,9 +16,10 @@
*/
package com.sun.syndication.io;
import com.sun.syndication.feed.module.Module;
import org.jdom2.Element;
import com.sun.syndication.feed.module.Module;
/**
* Parses module metadata from a XML node (JDOM element).
* <p>
@ -26,6 +27,7 @@ import org.jdom2.Element;
* <p>
* TODO: explain how developers can plugin their own implementations.
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -34,6 +36,7 @@ public interface ModuleParser {
/**
* Returns the namespace URI this parser handles.
* <p>
*
* @return the namespace URI.
*
*/
@ -42,8 +45,11 @@ public interface ModuleParser {
/**
* Parses the XML node (JDOM element) extracting module information.
* <p>
* @param element the XML node (JDOM element) to extract module information from.
* @return a module instance, <b>null</b> if the element did not have module information.
*
* @param element the XML node (JDOM element) to extract module information
* from.
* @return a module instance, <b>null</b> if the element did not have module
* information.
*
*/
public Module parse(Element element);

View file

@ -21,6 +21,7 @@ import org.jdom2.input.JDOMParseException;
/**
* Exception thrown by WireFeedInput instance if it can not parse a feed.
* <p>
*
* @author Elaine Chien
*
*/
@ -29,50 +30,52 @@ public class ParsingFeedException extends FeedException {
/**
* Creates a FeedException with a message.
* <p>
*
* @param msg exception message.
*
*/
public ParsingFeedException(String msg) {
public ParsingFeedException(final String msg) {
super(msg);
}
/**
* Creates a FeedException with a message and a root cause exception.
* <p>
*
* @param msg exception message.
* @param rootCause root cause exception.
*
*/
public ParsingFeedException(String msg, Throwable rootCause) {
public ParsingFeedException(final String msg, final Throwable rootCause) {
super(msg, rootCause);
}
/**
* Returns the line number of the end of the text where the
* parse error occurred.
* Returns the line number of the end of the text where the parse error
* occurred.
* <p>
* The first line in the document is line 1.</p>
* The first line in the document is line 1.
* </p>
*
* @return an integer representing the line number, or -1
* if the information is not available.
* @return an integer representing the line number, or -1 if the information
* is not available.
*/
public int getLineNumber() {
return (getCause() instanceof JDOMParseException)?
((JDOMParseException)getCause()).getLineNumber(): -1;
return getCause() instanceof JDOMParseException ? ((JDOMParseException) getCause()).getLineNumber() : -1;
}
/**
* Returns the column number of the end of the text where the
* parse error occurred.
* Returns the column number of the end of the text where the parse error
* occurred.
* <p>
* The first column in a line is position 1.</p>
* The first column in a line is position 1.
* </p>
*
* @return an integer representing the column number, or -1
* if the information is not available.
* @return an integer representing the column number, or -1 if the
* information is not available.
*/
public int getColumnNumber() {
return (getCause() instanceof JDOMParseException)?
((JDOMParseException)getCause()).getColumnNumber(): -1;
return getCause() instanceof JDOMParseException ? ((JDOMParseException) getCause()).getColumnNumber() : -1;
}
}

View file

@ -17,19 +17,22 @@ import org.xml.sax.XMLReader;
*
*/
public class SAXBuilder extends org.jdom2.input.SAXBuilder {
public SAXBuilder(XMLReaderJDOMFactory factory) {
public SAXBuilder(final XMLReaderJDOMFactory factory) {
super(factory);
}
/**
*
* @deprecated use SAXBuilder(XMLReaderJDOMFactory) with either XMLReaders.DTDVALIDATING or XMLReaders.NONVALIDATING
* @deprecated use SAXBuilder(XMLReaderJDOMFactory) with either
* XMLReaders.DTDVALIDATING or XMLReaders.NONVALIDATING
* @param _validate
*/
public SAXBuilder(boolean _validate) {
@Deprecated
public SAXBuilder(final boolean _validate) {
super(_validate ? XMLReaders.DTDVALIDATING : XMLReaders.NONVALIDATING);
}
@Override
public XMLReader createParser() throws JDOMException {
return super.createParser();
}

View file

@ -16,27 +16,29 @@
*/
package com.sun.syndication.io;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndFeedImpl;
import org.jdom2.Document;
import org.xml.sax.InputSource;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader;
import org.jdom2.Document;
import org.xml.sax.InputSource;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndFeedImpl;
/**
* Parses an XML document (File, InputStream, Reader, W3C SAX InputSource, W3C DOM Document or JDom DOcument)
* into an SyndFeedImpl.
* Parses an XML document (File, InputStream, Reader, W3C SAX InputSource, W3C
* DOM Document or JDom DOcument) into an SyndFeedImpl.
* <p>
* It delegates to a WireFeedInput to handle all feed types.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class SyndFeedInput {
private WireFeedInput _feedInput;
private final WireFeedInput _feedInput;
private boolean preserveWireFeed = false;
/**
@ -51,130 +53,152 @@ public class SyndFeedInput {
/**
* Creates a SyndFeedInput instance.
* <p>
* @param validate indicates if the input should be validated. NOT IMPLEMENTED YET (validation does not happen)
*
* @param validate indicates if the input should be validated. NOT
* IMPLEMENTED YET (validation does not happen)
*
*/
public SyndFeedInput(boolean validate) {
_feedInput = new WireFeedInput(validate);
public SyndFeedInput(final boolean validate) {
this._feedInput = new WireFeedInput(validate);
}
/**
* Enables XML healing in the WiredFeedInput instance.
* <p>
* Healing trims leading chars from the stream (empty spaces and comments) until the XML prolog.
* Healing trims leading chars from the stream (empty spaces and comments)
* until the XML prolog.
* <p>
* Healing resolves HTML entities (from literal to code number) in the reader.
* Healing resolves HTML entities (from literal to code number) in the
* reader.
* <p>
* The healing is done only with the build(File) and build(Reader) signatures.
* The healing is done only with the build(File) and build(Reader)
* signatures.
* <p>
* By default is TRUE.
* <p>
*
* @param heals TRUE enables stream healing, FALSE disables it.
*
*/
public void setXmlHealerOn(boolean heals) {
_feedInput.setXmlHealerOn(heals);
public void setXmlHealerOn(final boolean heals) {
this._feedInput.setXmlHealerOn(heals);
}
/**
* Indicates if the WiredFeedInput instance will XML heal (if necessary) the character stream.
* Indicates if the WiredFeedInput instance will XML heal (if necessary) the
* character stream.
* <p>
* Healing trims leading chars from the stream (empty spaces and comments) until the XML prolog.
* Healing trims leading chars from the stream (empty spaces and comments)
* until the XML prolog.
* <p>
* Healing resolves HTML entities (from literal to code number) in the reader.
* Healing resolves HTML entities (from literal to code number) in the
* reader.
* <p>
* The healing is done only with the build(File) and build(Reader) signatures.
* The healing is done only with the build(File) and build(Reader)
* signatures.
* <p>
* By default is TRUE.
* <p>
*
* @return TRUE if healing is enabled, FALSE if not.
*
*/
public boolean getXmlHealerOn() {
return _feedInput.getXmlHealerOn();
return this._feedInput.getXmlHealerOn();
}
/**
* Builds SyndFeedImpl from a file.
* <p>
*
* @param file file to read to create the SyndFeedImpl.
* @return the SyndFeedImpl read from the file.
* @throws FileNotFoundException thrown if the file could not be found.
* @throws IOException thrown if there is problem reading the file.
* @throws IllegalArgumentException thrown if feed type could not be understood by any of the underlying parsers.
* @throws IllegalArgumentException thrown if feed type could not be
* understood by any of the underlying parsers.
* @throws FeedException if the feed could not be parsed
*
*/
public SyndFeed build(File file) throws FileNotFoundException,IOException,IllegalArgumentException,FeedException {
return new SyndFeedImpl(_feedInput.build(file), preserveWireFeed);
public SyndFeed build(final File file) throws FileNotFoundException, IOException, IllegalArgumentException, FeedException {
return new SyndFeedImpl(this._feedInput.build(file), this.preserveWireFeed);
}
/**
* Builds SyndFeedImpl from an Reader.
* <p>
*
* @param reader Reader to read to create the SyndFeedImpl.
* @return the SyndFeedImpl read from the Reader.
* @throws IllegalArgumentException thrown if feed type could not be understood by any of the underlying parsers.
* @throws IllegalArgumentException thrown if feed type could not be
* understood by any of the underlying parsers.
* @throws FeedException if the feed could not be parsed
*
*/
public SyndFeed build(Reader reader) throws IllegalArgumentException,FeedException {
return new SyndFeedImpl(_feedInput.build(reader), preserveWireFeed);
public SyndFeed build(final Reader reader) throws IllegalArgumentException, FeedException {
return new SyndFeedImpl(this._feedInput.build(reader), this.preserveWireFeed);
}
/**
* Builds SyndFeedImpl from an W3C SAX InputSource.
* <p>
*
* @param is W3C SAX InputSource to read to create the SyndFeedImpl.
* @return the SyndFeedImpl read from the W3C SAX InputSource.
* @throws IllegalArgumentException thrown if feed type could not be understood by any of the underlying parsers.
* @throws IllegalArgumentException thrown if feed type could not be
* understood by any of the underlying parsers.
* @throws FeedException if the feed could not be parsed
*
*/
public SyndFeed build(InputSource is) throws IllegalArgumentException,FeedException {
return new SyndFeedImpl(_feedInput.build(is), preserveWireFeed);
public SyndFeed build(final InputSource is) throws IllegalArgumentException, FeedException {
return new SyndFeedImpl(this._feedInput.build(is), this.preserveWireFeed);
}
/**
* Builds SyndFeedImpl from an W3C DOM document.
* <p>
*
* @param document W3C DOM document to read to create the SyndFeedImpl.
* @return the SyndFeedImpl read from the W3C DOM document.
* @throws IllegalArgumentException thrown if feed type could not be understood by any of the underlying parsers.
* @throws IllegalArgumentException thrown if feed type could not be
* understood by any of the underlying parsers.
* @throws FeedException if the feed could not be parsed
*
*/
public SyndFeed build(org.w3c.dom.Document document) throws IllegalArgumentException,FeedException {
return new SyndFeedImpl(_feedInput.build(document), preserveWireFeed);
public SyndFeed build(final org.w3c.dom.Document document) throws IllegalArgumentException, FeedException {
return new SyndFeedImpl(this._feedInput.build(document), this.preserveWireFeed);
}
/**
* Builds SyndFeedImpl from an JDOM document.
* <p>
*
* @param document JDOM document to read to create the SyndFeedImpl.
* @return the SyndFeedImpl read from the JDOM document.
* @throws IllegalArgumentException thrown if feed type could not be understood by any of the underlying parsers.
* @throws IllegalArgumentException thrown if feed type could not be
* understood by any of the underlying parsers.
* @throws FeedException if the feed could not be parsed
*
*/
public SyndFeed build(Document document) throws IllegalArgumentException,FeedException {
return new SyndFeedImpl(_feedInput.build(document), preserveWireFeed);
public SyndFeed build(final Document document) throws IllegalArgumentException, FeedException {
return new SyndFeedImpl(this._feedInput.build(document), this.preserveWireFeed);
}
/**
*
* @return true if the WireFeed is made available in the SyndFeed. False by default.
* @return true if the WireFeed is made available in the SyndFeed. False by
* default.
*/
public boolean isPreserveWireFeed() {
return preserveWireFeed;
return this.preserveWireFeed;
}
/**
*
* @param preserveWireFeed set to true to make the WireFeed is made available in the SyndFeed. False by default.
* @param preserveWireFeed set to true to make the WireFeed is made
* available in the SyndFeed. False by default.
*/
public void setPreserveWireFeed(boolean preserveWireFeed) {
public void setPreserveWireFeed(final boolean preserveWireFeed) {
this.preserveWireFeed = preserveWireFeed;
}

View file

@ -16,24 +16,26 @@
*/
package com.sun.syndication.io;
import com.sun.syndication.feed.synd.SyndFeed;
import org.jdom2.Document;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
import org.jdom2.Document;
import com.sun.syndication.feed.synd.SyndFeed;
/**
* Generates an XML document (String, File, OutputStream, Writer, W3C DOM document or JDOM document)
* out of an SyndFeedImpl..
* Generates an XML document (String, File, OutputStream, Writer, W3C DOM
* document or JDOM document) out of an SyndFeedImpl..
* <p>
* It delegates to a WireFeedOutput to generate all feed types.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class SyndFeedOutput {
private WireFeedOutput _feedOutput;
private final WireFeedOutput _feedOutput;
/**
* Creates a SyndFeedOutput instance.
@ -41,116 +43,148 @@ public class SyndFeedOutput {
*
*/
public SyndFeedOutput() {
_feedOutput = new WireFeedOutput();
this._feedOutput = new WireFeedOutput();
}
/**
* Creates a String with the XML representation for the given SyndFeedImpl.
* <p>
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. It is the responsibility
* of the developer to ensure that if the String is written to a character stream the stream charset is the same as
* the feed encoding property.
* If the feed encoding is not NULL, it will be used in the XML prolog
* encoding attribute. It is the responsibility of the developer to ensure
* that if the String is written to a character stream the stream charset is
* the same as the feed encoding property.
* <p>
* @param feed Abstract feed to create XML representation from. The type of the SyndFeedImpl must match
* the type given to the FeedOuptut constructor.
*
* @param feed Abstract feed to create XML representation from. The type of
* the SyndFeedImpl must match the type given to the FeedOuptut
* constructor.
* @return a String with the XML representation for the given SyndFeedImpl.
* @throws FeedException thrown if the XML representation for the feed could not be created.
* @throws FeedException thrown if the XML representation for the feed could
* not be created.
*
*/
public String outputString(SyndFeed feed) throws FeedException {
return _feedOutput.outputString(feed.createWireFeed());
public String outputString(final SyndFeed feed) throws FeedException {
return this._feedOutput.outputString(feed.createWireFeed());
}
/**
* Creates a String with the XML representation for the given SyndFeedImpl.
* <p>
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. It is the responsibility
* of the developer to ensure that if the String is written to a character stream the stream charset is the same as
* the feed encoding property.
* If the feed encoding is not NULL, it will be used in the XML prolog
* encoding attribute. It is the responsibility of the developer to ensure
* that if the String is written to a character stream the stream charset is
* the same as the feed encoding property.
* <p>
* @param feed Abstract feed to create XML representation from. The type of the SyndFeedImpl must match
* the type given to the FeedOuptut constructor.
*
* @param feed Abstract feed to create XML representation from. The type of
* the SyndFeedImpl must match the type given to the FeedOuptut
* constructor.
* @param prettyPrint pretty-print XML (true) oder collapsed
* @return a String with the XML representation for the given SyndFeedImpl.
* @throws FeedException thrown if the XML representation for the feed could not be created.
* @throws FeedException thrown if the XML representation for the feed could
* not be created.
*
*/
public String outputString(SyndFeed feed,boolean prettyPrint) throws FeedException {
return _feedOutput.outputString(feed.createWireFeed(),prettyPrint);
public String outputString(final SyndFeed feed, final boolean prettyPrint) throws FeedException {
return this._feedOutput.outputString(feed.createWireFeed(), prettyPrint);
}
/**
* Creates a File containing with the XML representation for the given SyndFeedImpl.
* Creates a File containing with the XML representation for the given
* SyndFeedImpl.
* <p>
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. The platform
* default charset encoding is used to write the feed to the file. It is the responsibility
* of the developer to ensure the feed encoding is set to the platform charset encoding.
* If the feed encoding is not NULL, it will be used in the XML prolog
* encoding attribute. The platform default charset encoding is used to
* write the feed to the file. It is the responsibility of the developer to
* ensure the feed encoding is set to the platform charset encoding.
* <p>
* @param feed Abstract feed to create XML representation from. The type of the SyndFeedImpl must match
* the type given to the FeedOuptut constructor.
* @param file the file where to write the XML representation for the given SyndFeedImpl.
*
* @param feed Abstract feed to create XML representation from. The type of
* the SyndFeedImpl must match the type given to the FeedOuptut
* constructor.
* @param file the file where to write the XML representation for the given
* SyndFeedImpl.
* @throws IOException thrown if there was some problem writing to the File.
* @throws FeedException thrown if the XML representation for the feed could not be created.
* @throws FeedException thrown if the XML representation for the feed could
* not be created.
*
*/
public void output(SyndFeed feed,File file) throws IOException, FeedException {
_feedOutput.output(feed.createWireFeed(),file);
public void output(final SyndFeed feed, final File file) throws IOException, FeedException {
this._feedOutput.output(feed.createWireFeed(), file);
}
/**
* Creates a File containing with the XML representation for the given SyndFeedImpl.
* Creates a File containing with the XML representation for the given
* SyndFeedImpl.
* <p>
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. The platform
* default charset encoding is used to write the feed to the file. It is the responsibility
* of the developer to ensure the feed encoding is set to the platform charset encoding.
* If the feed encoding is not NULL, it will be used in the XML prolog
* encoding attribute. The platform default charset encoding is used to
* write the feed to the file. It is the responsibility of the developer to
* ensure the feed encoding is set to the platform charset encoding.
* <p>
* @param feed Abstract feed to create XML representation from. The type of the SyndFeedImpl must match
* the type given to the FeedOuptut constructor.
*
* @param feed Abstract feed to create XML representation from. The type of
* the SyndFeedImpl must match the type given to the FeedOuptut
* constructor.
* @param prettyPrint pretty-print XML (true) oder collapsed
* @param file the file where to write the XML representation for the given SyndFeedImpl.
* @param file the file where to write the XML representation for the given
* SyndFeedImpl.
* @throws IOException thrown if there was some problem writing to the File.
* @throws FeedException thrown if the XML representation for the feed could not be created.
* @throws FeedException thrown if the XML representation for the feed could
* not be created.
*
*/
public void output(SyndFeed feed,File file,boolean prettyPrint) throws IOException, FeedException {
_feedOutput.output(feed.createWireFeed(),file,prettyPrint);
public void output(final SyndFeed feed, final File file, final boolean prettyPrint) throws IOException, FeedException {
this._feedOutput.output(feed.createWireFeed(), file, prettyPrint);
}
/**
* Writes to an Writer the XML representation for the given SyndFeedImpl.
* <p>
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. It is the responsibility
* of the developer to ensure that if the String is written to a character stream the stream charset is the same as
* the feed encoding property.
* If the feed encoding is not NULL, it will be used in the XML prolog
* encoding attribute. It is the responsibility of the developer to ensure
* that if the String is written to a character stream the stream charset is
* the same as the feed encoding property.
* <p>
* @param feed Abstract feed to create XML representation from. The type of the SyndFeedImpl must match
* the type given to the FeedOuptut constructor.
* @param writer Writer to write the XML representation for the given SyndFeedImpl.
* @throws IOException thrown if there was some problem writing to the Writer.
* @throws FeedException thrown if the XML representation for the feed could not be created.
*
* @param feed Abstract feed to create XML representation from. The type of
* the SyndFeedImpl must match the type given to the FeedOuptut
* constructor.
* @param writer Writer to write the XML representation for the given
* SyndFeedImpl.
* @throws IOException thrown if there was some problem writing to the
* Writer.
* @throws FeedException thrown if the XML representation for the feed could
* not be created.
*
*/
public void output(SyndFeed feed,Writer writer) throws IOException, FeedException {
_feedOutput.output(feed.createWireFeed(),writer);
public void output(final SyndFeed feed, final Writer writer) throws IOException, FeedException {
this._feedOutput.output(feed.createWireFeed(), writer);
}
/**
* Writes to an Writer the XML representation for the given SyndFeedImpl.
* <p>
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. It is the responsibility
* of the developer to ensure that if the String is written to a character stream the stream charset is the same as
* the feed encoding property.
* If the feed encoding is not NULL, it will be used in the XML prolog
* encoding attribute. It is the responsibility of the developer to ensure
* that if the String is written to a character stream the stream charset is
* the same as the feed encoding property.
* <p>
* @param feed Abstract feed to create XML representation from. The type of the SyndFeedImpl must match
* the type given to the FeedOuptut constructor.
*
* @param feed Abstract feed to create XML representation from. The type of
* the SyndFeedImpl must match the type given to the FeedOuptut
* constructor.
* @param prettyPrint pretty-print XML (true) oder collapsed
* @param writer Writer to write the XML representation for the given SyndFeedImpl.
* @throws IOException thrown if there was some problem writing to the Writer.
* @throws FeedException thrown if the XML representation for the feed could not be created.
* @param writer Writer to write the XML representation for the given
* SyndFeedImpl.
* @throws IOException thrown if there was some problem writing to the
* Writer.
* @throws FeedException thrown if the XML representation for the feed could
* not be created.
*
*/
public void output(SyndFeed feed,Writer writer,boolean prettyPrint) throws IOException, FeedException {
_feedOutput.output(feed.createWireFeed(),writer,prettyPrint);
public void output(final SyndFeed feed, final Writer writer, final boolean prettyPrint) throws IOException, FeedException {
this._feedOutput.output(feed.createWireFeed(), writer, prettyPrint);
}
/**
@ -158,14 +192,17 @@ public class SyndFeedOutput {
* <p>
* This method does not use the feed encoding property.
* <p>
* @param feed Abstract feed to create W3C DOM document from. The type of the SyndFeedImpl must match
* the type given to the FeedOuptut constructor.
*
* @param feed Abstract feed to create W3C DOM document from. The type of
* the SyndFeedImpl must match the type given to the FeedOuptut
* constructor.
* @return the W3C DOM document for the given SyndFeedImpl.
* @throws FeedException thrown if the W3C DOM document for the feed could not be created.
* @throws FeedException thrown if the W3C DOM document for the feed could
* not be created.
*
*/
public org.w3c.dom.Document outputW3CDom(SyndFeed feed) throws FeedException {
return _feedOutput.outputW3CDom(feed.createWireFeed());
public org.w3c.dom.Document outputW3CDom(final SyndFeed feed) throws FeedException {
return this._feedOutput.outputW3CDom(feed.createWireFeed());
}
/**
@ -173,14 +210,17 @@ public class SyndFeedOutput {
* <p>
* This method does not use the feed encoding property.
* <p>
* @param feed Abstract feed to create JDOM document from. The type of the SyndFeedImpl must match
* the type given to the FeedOuptut constructor.
*
* @param feed Abstract feed to create JDOM document from. The type of the
* SyndFeedImpl must match the type given to the FeedOuptut
* constructor.
* @return the JDOM document for the given SyndFeedImpl.
* @throws FeedException thrown if the JDOM document for the feed could not be created.
* @throws FeedException thrown if the JDOM document for the feed could not
* be created.
*
*/
public Document outputJDom(SyndFeed feed) throws FeedException {
return _feedOutput.outputJDom(feed.createWireFeed());
public Document outputJDom(final SyndFeed feed) throws FeedException {
return this._feedOutput.outputJDom(feed.createWireFeed());
}
}

View file

@ -16,10 +16,10 @@
*/
package com.sun.syndication.io;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.io.FeedException;
import org.jdom2.Document;
import com.sun.syndication.feed.WireFeed;
/**
* Generates an XML document (JDOM) out of a feed for a specific real feed type.
* <p>
@ -27,6 +27,7 @@ import org.jdom2.Document;
* <p>
* TODO: explain how developers can plugin their own implementations.
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -35,6 +36,7 @@ public interface WireFeedGenerator {
/**
* Returns the type of feed the generator creates.
* <p>
*
* @see WireFeed for details on the format of this string.
* <p>
* @return the type of feed the generator creates.
@ -45,13 +47,14 @@ public interface WireFeedGenerator {
/**
* Creates an XML document (JDOM) for the given feed bean.
* <p>
*
* @param feed the feed bean to generate the XML document from.
* @return the generated XML document (JDOM).
* @throws IllegalArgumentException thrown if the type of the given feed bean does not
* match with the type of the WireFeedGenerator.
* @throws IllegalArgumentException thrown if the type of the given feed
* bean does not match with the type of the WireFeedGenerator.
* @throws FeedException thrown if the XML Document could not be created.
*
*/
public Document generate(WireFeed feed) throws IllegalArgumentException,FeedException;
public Document generate(WireFeed feed) throws IllegalArgumentException, FeedException;
}

View file

@ -30,6 +30,7 @@ import org.jdom2.Document;
import org.jdom2.JDOMException;
import org.jdom2.input.DOMBuilder;
import org.jdom2.input.JDOMParseException;
import org.jdom2.input.sax.XMLReaders;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXNotRecognizedException;
@ -39,17 +40,18 @@ import org.xml.sax.XMLReader;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.io.impl.FeedParsers;
import com.sun.syndication.io.impl.XmlFixerReader;
import org.jdom2.input.sax.XMLReaders;
/**
* Parses an XML document (File, InputStream, Reader, W3C SAX InputSource, W3C DOM Document or JDom DOcument)
* into an WireFeed (RSS/Atom).
* Parses an XML document (File, InputStream, Reader, W3C SAX InputSource, W3C
* DOM Document or JDom DOcument) into an WireFeed (RSS/Atom).
* <p>
* It accepts all flavors of RSS (0.90, 0.91, 0.92, 0.93, 0.94, 1.0 and 2.0) and
* Atom 0.3 feeds. Parsers are plugable (they must implement the WireFeedParser interface).
* Atom 0.3 feeds. Parsers are plugable (they must implement the WireFeedParser
* interface).
* <p>
* The WireFeedInput useds liberal parsers.
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -58,9 +60,8 @@ public class WireFeedInput {
private static Map clMap = new WeakHashMap();
private static FeedParsers getFeedParsers() {
synchronized(WireFeedInput.class) {
FeedParsers parsers = (FeedParsers)
clMap.get(Thread.currentThread().getContextClassLoader());
synchronized (WireFeedInput.class) {
FeedParsers parsers = (FeedParsers) clMap.get(Thread.currentThread().getContextClassLoader());
if (parsers == null) {
parsers = new FeedParsers();
clMap.put(Thread.currentThread().getContextClassLoader(), parsers);
@ -73,19 +74,23 @@ public class WireFeedInput {
private static final EntityResolver RESOLVER = new EmptyEntityResolver();
private static class EmptyEntityResolver implements EntityResolver {
public InputSource resolveEntity(String publicId, String systemId) {
if(systemId != null && systemId.endsWith(".dtd")) return EMPTY_INPUTSOURCE;
@Override
public InputSource resolveEntity(final String publicId, final String systemId) {
if (systemId != null && systemId.endsWith(".dtd")) {
return EMPTY_INPUTSOURCE;
}
return null;
}
}
private boolean _validate;
private final boolean _validate;
private boolean _xmlHealerOn;
/**
* Returns the list of supported input feed types.
* <p>
*
* @see WireFeed for details on the format of these strings.
* <p>
* @return a list of String elements with the supported input feed types.
@ -101,76 +106,90 @@ public class WireFeedInput {
*
*/
public WireFeedInput() {
this (false);
this(false);
}
/**
* Creates a WireFeedInput instance.
* <p>
* @param validate indicates if the input should be validated. NOT IMPLEMENTED YET (validation does not happen)
*
* @param validate indicates if the input should be validated. NOT
* IMPLEMENTED YET (validation does not happen)
*
*/
public WireFeedInput(boolean validate) {
_validate = false; // TODO FIX THIS THINGY
_xmlHealerOn = true;
public WireFeedInput(final boolean validate) {
this._validate = false; // TODO FIX THIS THINGY
this._xmlHealerOn = true;
}
/**
* Enables XML healing in the WiredFeedInput instance.
* <p>
* Healing trims leading chars from the stream (empty spaces and comments) until the XML prolog.
* Healing trims leading chars from the stream (empty spaces and comments)
* until the XML prolog.
* <p>
* Healing resolves HTML entities (from literal to code number) in the reader.
* Healing resolves HTML entities (from literal to code number) in the
* reader.
* <p>
* The healing is done only with the build(File) and build(Reader) signatures.
* The healing is done only with the build(File) and build(Reader)
* signatures.
* <p>
* By default is TRUE.
* <p>
*
* @param heals TRUE enables stream healing, FALSE disables it.
*
*/
public void setXmlHealerOn(boolean heals) {
_xmlHealerOn = heals;
public void setXmlHealerOn(final boolean heals) {
this._xmlHealerOn = heals;
}
/**
* Indicates if the WiredFeedInput instance will XML heal (if necessary) the character stream.
* Indicates if the WiredFeedInput instance will XML heal (if necessary) the
* character stream.
* <p>
* Healing trims leading chars from the stream (empty spaces and comments) until the XML prolog.
* Healing trims leading chars from the stream (empty spaces and comments)
* until the XML prolog.
* <p>
* Healing resolves HTML entities (from literal to code number) in the reader.
* Healing resolves HTML entities (from literal to code number) in the
* reader.
* <p>
* The healing is done only with the build(File) and build(Reader) signatures.
* The healing is done only with the build(File) and build(Reader)
* signatures.
* <p>
* By default is TRUE.
* <p>
*
* @return TRUE if healing is enabled, FALSE if not.
*
*/
public boolean getXmlHealerOn() {
return _xmlHealerOn;
return this._xmlHealerOn;
}
/**
* Builds an WireFeed (RSS or Atom) from a file.
* <p>
* NOTE: This method delages to the 'AsbtractFeed WireFeedInput#build(org.jdom2.Document)'.
* NOTE: This method delages to the 'AsbtractFeed
* WireFeedInput#build(org.jdom2.Document)'.
* <p>
*
* @param file file to read to create the WireFeed.
* @return the WireFeed read from the file.
* @throws FileNotFoundException thrown if the file could not be found.
* @throws IOException thrown if there is problem reading the file.
* @throws IllegalArgumentException thrown if feed type could not be understood by any of the underlying parsers.
* @throws IllegalArgumentException thrown if feed type could not be
* understood by any of the underlying parsers.
* @throws FeedException if the feed could not be parsed
*
*/
public WireFeed build(File file) throws FileNotFoundException,IOException,IllegalArgumentException,FeedException {
public WireFeed build(final File file) throws FileNotFoundException, IOException, IllegalArgumentException, FeedException {
WireFeed feed;
Reader reader = new FileReader(file);
if (_xmlHealerOn) {
if (this._xmlHealerOn) {
reader = new XmlFixerReader(reader);
}
feed = build(reader);
feed = this.build(reader);
reader.close();
return feed;
}
@ -178,84 +197,85 @@ public class WireFeedInput {
/**
* Builds an WireFeed (RSS or Atom) from an Reader.
* <p>
* NOTE: This method delages to the 'AsbtractFeed WireFeedInput#build(org.jdom2.Document)'.
* NOTE: This method delages to the 'AsbtractFeed
* WireFeedInput#build(org.jdom2.Document)'.
* <p>
*
* @param reader Reader to read to create the WireFeed.
* @return the WireFeed read from the Reader.
* @throws IllegalArgumentException thrown if feed type could not be understood by any of the underlying parsers.
* @throws IllegalArgumentException thrown if feed type could not be
* understood by any of the underlying parsers.
* @throws FeedException if the feed could not be parsed
*
*/
public WireFeed build(Reader reader) throws IllegalArgumentException,FeedException {
SAXBuilder saxBuilder = createSAXBuilder();
public WireFeed build(Reader reader) throws IllegalArgumentException, FeedException {
final SAXBuilder saxBuilder = createSAXBuilder();
try {
if (_xmlHealerOn) {
if (this._xmlHealerOn) {
reader = new XmlFixerReader(reader);
}
Document document = saxBuilder.build(reader);
return build(document);
}
catch (JDOMParseException ex) {
final Document document = saxBuilder.build(reader);
return this.build(document);
} catch (final JDOMParseException ex) {
throw new ParsingFeedException("Invalid XML: " + ex.getMessage(), ex);
}
catch (IllegalArgumentException ex) {
} catch (final IllegalArgumentException ex) {
throw ex;
}
catch (Exception ex) {
throw new ParsingFeedException("Invalid XML",ex);
} catch (final Exception ex) {
throw new ParsingFeedException("Invalid XML", ex);
}
}
/**
* Builds an WireFeed (RSS or Atom) from an W3C SAX InputSource.
* <p>
* NOTE: This method delages to the 'AsbtractFeed WireFeedInput#build(org.jdom2.Document)'.
* NOTE: This method delages to the 'AsbtractFeed
* WireFeedInput#build(org.jdom2.Document)'.
* <p>
*
* @param is W3C SAX InputSource to read to create the WireFeed.
* @return the WireFeed read from the W3C SAX InputSource.
* @throws IllegalArgumentException thrown if feed type could not be understood by any of the underlying parsers.
* @throws IllegalArgumentException thrown if feed type could not be
* understood by any of the underlying parsers.
* @throws FeedException if the feed could not be parsed
*
*/
public WireFeed build(InputSource is) throws IllegalArgumentException,FeedException {
SAXBuilder saxBuilder = createSAXBuilder();
public WireFeed build(final InputSource is) throws IllegalArgumentException, FeedException {
final SAXBuilder saxBuilder = createSAXBuilder();
try {
Document document = saxBuilder.build(is);
return build(document);
}
catch (JDOMParseException ex) {
final Document document = saxBuilder.build(is);
return this.build(document);
} catch (final JDOMParseException ex) {
throw new ParsingFeedException("Invalid XML: " + ex.getMessage(), ex);
}
catch (IllegalArgumentException ex) {
} catch (final IllegalArgumentException ex) {
throw ex;
}
catch (Exception ex) {
throw new ParsingFeedException("Invalid XML",ex);
} catch (final Exception ex) {
throw new ParsingFeedException("Invalid XML", ex);
}
}
/**
* Builds an WireFeed (RSS or Atom) from an W3C DOM document.
* <p>
* NOTE: This method delages to the 'AsbtractFeed WireFeedInput#build(org.jdom2.Document)'.
* NOTE: This method delages to the 'AsbtractFeed
* WireFeedInput#build(org.jdom2.Document)'.
* <p>
*
* @param document W3C DOM document to read to create the WireFeed.
* @return the WireFeed read from the W3C DOM document.
* @throws IllegalArgumentException thrown if feed type could not be understood by any of the underlying parsers.
* @throws IllegalArgumentException thrown if feed type could not be
* understood by any of the underlying parsers.
* @throws FeedException if the feed could not be parsed
*
*/
public WireFeed build(org.w3c.dom.Document document) throws IllegalArgumentException,FeedException {
DOMBuilder domBuilder = new DOMBuilder();
public WireFeed build(final org.w3c.dom.Document document) throws IllegalArgumentException, FeedException {
final DOMBuilder domBuilder = new DOMBuilder();
try {
Document jdomDoc = domBuilder.build(document);
return build(jdomDoc);
}
catch (IllegalArgumentException ex) {
final Document jdomDoc = domBuilder.build(document);
return this.build(jdomDoc);
} catch (final IllegalArgumentException ex) {
throw ex;
}
catch (Exception ex) {
throw new ParsingFeedException("Invalid XML",ex);
} catch (final Exception ex) {
throw new ParsingFeedException("Invalid XML", ex);
}
}
@ -264,18 +284,20 @@ public class WireFeedInput {
* <p>
* NOTE: All other build methods delegate to this method.
* <p>
*
* @param document JDOM document to read to create the WireFeed.
* @return the WireFeed read from the JDOM document.
* @throws IllegalArgumentException thrown if feed type could not be understood by any of the underlying parsers.
* @throws IllegalArgumentException thrown if feed type could not be
* understood by any of the underlying parsers.
* @throws FeedException if the feed could not be parsed
*
*/
public WireFeed build(Document document) throws IllegalArgumentException,FeedException {
WireFeedParser parser = getFeedParsers().getParserFor(document);
if (parser==null) {
public WireFeed build(final Document document) throws IllegalArgumentException, FeedException {
final WireFeedParser parser = getFeedParsers().getParserFor(document);
if (parser == null) {
throw new IllegalArgumentException("Invalid document");
}
return parser.parse(document, _validate);
return parser.parse(document, this._validate);
}
/**
@ -284,48 +306,53 @@ public class WireFeedInput {
* @return a new org.jdom2.input.SAXBuilder object
*/
protected SAXBuilder createSAXBuilder() {
SAXBuilder saxBuilder = new SAXBuilder(_validate ? XMLReaders.DTDVALIDATING : XMLReaders.NONVALIDATING);
final SAXBuilder saxBuilder = new SAXBuilder(this._validate ? XMLReaders.DTDVALIDATING : XMLReaders.NONVALIDATING);
saxBuilder.setEntityResolver(RESOLVER);
//
// This code is needed to fix the security problem outlined in http://www.securityfocus.com/archive/1/297714
// This code is needed to fix the security problem outlined in
// http://www.securityfocus.com/archive/1/297714
//
// Unfortunately there isn't an easy way to check if an XML parser supports a particular feature, so
// we need to set it and catch the exception if it fails. We also need to subclass the JDom SAXBuilder
// class in order to get access to the underlying SAX parser - otherwise the features don't get set until
// we are already building the document, by which time it's too late to fix the problem.
// Unfortunately there isn't an easy way to check if an XML parser
// supports a particular feature, so
// we need to set it and catch the exception if it fails. We also need
// to subclass the JDom SAXBuilder
// class in order to get access to the underlying SAX parser - otherwise
// the features don't get set until
// we are already building the document, by which time it's too late to
// fix the problem.
//
// Crimson is one parser which is known not to support these features.
try {
XMLReader parser = saxBuilder.createParser();
final XMLReader parser = saxBuilder.createParser();
try {
parser.setFeature("http://xml.org/sax/features/external-general-entities", false);
saxBuilder.setFeature("http://xml.org/sax/features/external-general-entities", false);
} catch (SAXNotRecognizedException e) {
} catch (final SAXNotRecognizedException e) {
// ignore
} catch (SAXNotSupportedException e) {
} catch (final SAXNotSupportedException e) {
// ignore
}
try {
parser.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
saxBuilder.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
} catch (SAXNotRecognizedException e) {
} catch (final SAXNotRecognizedException e) {
// ignore
} catch (SAXNotSupportedException e) {
} catch (final SAXNotSupportedException e) {
// ignore
}
try {
parser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
saxBuilder.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
} catch (SAXNotRecognizedException e) {
} catch (final SAXNotRecognizedException e) {
// ignore
} catch (SAXNotSupportedException e) {
} catch (final SAXNotSupportedException e) {
// ignore
}
} catch (JDOMException e) {
} catch (final JDOMException e) {
throw new IllegalStateException("JDOM could not create a SAX parser");
}

View file

@ -16,29 +16,32 @@
*/
package com.sun.syndication.io;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.io.impl.FeedGenerators;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
import org.jdom2.Document;
import org.jdom2.JDOMException;
import org.jdom2.output.DOMOutputter;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import java.io.IOException;
import java.io.Writer;
import java.io.File;
import java.io.FileWriter;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.io.impl.FeedGenerators;
/**
* Generates an XML document (String, File, OutputStream, Writer, W3C DOM document or JDOM document)
* out of an WireFeed (RSS/Atom).
* Generates an XML document (String, File, OutputStream, Writer, W3C DOM
* document or JDOM document) out of an WireFeed (RSS/Atom).
* <p>
* It generates all flavors of RSS (0.90, 0.91, 0.92, 0.93, 0.94, 1.0 and 2.0) and
* Atom 0.3 feeds. Generators are plugable (they must implement the ModuleParser interface).
* It generates all flavors of RSS (0.90, 0.91, 0.92, 0.93, 0.94, 1.0 and 2.0)
* and Atom 0.3 feeds. Generators are plugable (they must implement the
* ModuleParser interface).
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -46,9 +49,8 @@ public class WireFeedOutput {
private static Map clMap = new WeakHashMap();
private static FeedGenerators getFeedGenerators() {
synchronized(WireFeedOutput.class) {
FeedGenerators generators = (FeedGenerators)
clMap.get(Thread.currentThread().getContextClassLoader());
synchronized (WireFeedOutput.class) {
FeedGenerators generators = (FeedGenerators) clMap.get(Thread.currentThread().getContextClassLoader());
if (generators == null) {
generators = new FeedGenerators();
clMap.put(Thread.currentThread().getContextClassLoader(), generators);
@ -60,6 +62,7 @@ public class WireFeedOutput {
/**
* Returns the list of supported output feed types.
* <p>
*
* @see WireFeed for details on the format of these strings.
* <p>
* @return a list of String elements with the supported output feed types.
@ -80,142 +83,186 @@ public class WireFeedOutput {
/**
* Creates a String with the XML representation for the given WireFeed.
* <p>
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. It is the responsibility
* of the developer to ensure that if the String is written to a character stream the stream charset is the same as
* the feed encoding property.
* If the feed encoding is not NULL, it will be used in the XML prolog
* encoding attribute. It is the responsibility of the developer to ensure
* that if the String is written to a character stream the stream charset is
* the same as the feed encoding property.
* <p>
* NOTE: This method delages to the 'Document WireFeedOutput#outputJDom(WireFeed)'.
* NOTE: This method delages to the 'Document
* WireFeedOutput#outputJDom(WireFeed)'.
* <p>
* @param feed Abstract feed to create XML representation from. The type of the WireFeed must match
* the type given to the FeedOuptut constructor.
*
* @param feed Abstract feed to create XML representation from. The type of
* the WireFeed must match the type given to the FeedOuptut
* constructor.
* @return a String with the XML representation for the given WireFeed.
* @throws IllegalArgumentException thrown if the feed type of the WireFeedOutput and WireFeed don't match.
* @throws FeedException thrown if the XML representation for the feed could not be created.
* @throws IllegalArgumentException thrown if the feed type of the
* WireFeedOutput and WireFeed don't match.
* @throws FeedException thrown if the XML representation for the feed could
* not be created.
*
*/
public String outputString(WireFeed feed) throws IllegalArgumentException,FeedException {
return outputString(feed, true);
public String outputString(final WireFeed feed) throws IllegalArgumentException, FeedException {
return this.outputString(feed, true);
}
/**
* Creates a String with the XML representation for the given WireFeed.
* <p>
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. It is the responsibility
* of the developer to ensure that if the String is written to a character stream the stream charset is the same as
* the feed encoding property.
* If the feed encoding is not NULL, it will be used in the XML prolog
* encoding attribute. It is the responsibility of the developer to ensure
* that if the String is written to a character stream the stream charset is
* the same as the feed encoding property.
* <p>
* NOTE: This method delages to the 'Document WireFeedOutput#outputJDom(WireFeed)'.
* NOTE: This method delages to the 'Document
* WireFeedOutput#outputJDom(WireFeed)'.
* <p>
* @param feed Abstract feed to create XML representation from. The type of the WireFeed must match
* the type given to the FeedOuptut constructor.
*
* @param feed Abstract feed to create XML representation from. The type of
* the WireFeed must match the type given to the FeedOuptut
* constructor.
* @param prettyPrint pretty-print XML (true) oder collapsed
* @return a String with the XML representation for the given WireFeed.
* @throws IllegalArgumentException thrown if the feed type of the WireFeedOutput and WireFeed don't match.
* @throws FeedException thrown if the XML representation for the feed could not be created.
* @throws IllegalArgumentException thrown if the feed type of the
* WireFeedOutput and WireFeed don't match.
* @throws FeedException thrown if the XML representation for the feed could
* not be created.
*
*/
public String outputString(WireFeed feed, boolean prettyPrint) throws IllegalArgumentException,FeedException {
Document doc = outputJDom(feed);
String encoding = feed.getEncoding();
Format format = prettyPrint ? Format.getPrettyFormat() : Format.getCompactFormat();
if (encoding!=null) {
public String outputString(final WireFeed feed, final boolean prettyPrint) throws IllegalArgumentException, FeedException {
final Document doc = outputJDom(feed);
final String encoding = feed.getEncoding();
final Format format = prettyPrint ? Format.getPrettyFormat() : Format.getCompactFormat();
if (encoding != null) {
format.setEncoding(encoding);
}
XMLOutputter outputter = new XMLOutputter(format);
final XMLOutputter outputter = new XMLOutputter(format);
return outputter.outputString(doc);
}
/**
* Creates a File containing with the XML representation for the given WireFeed.
* Creates a File containing with the XML representation for the given
* WireFeed.
* <p>
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. The platform
* default charset encoding is used to write the feed to the file. It is the responsibility
* of the developer to ensure the feed encoding is set to the platform charset encoding.
* If the feed encoding is not NULL, it will be used in the XML prolog
* encoding attribute. The platform default charset encoding is used to
* write the feed to the file. It is the responsibility of the developer to
* ensure the feed encoding is set to the platform charset encoding.
* <p>
* NOTE: This method delages to the 'Document WireFeedOutput#outputJDom(WireFeed)'.
* NOTE: This method delages to the 'Document
* WireFeedOutput#outputJDom(WireFeed)'.
* <p>
* @param feed Abstract feed to create XML representation from. The type of the WireFeed must match
* the type given to the FeedOuptut constructor.
* @param file the file where to write the XML representation for the given WireFeed.
* @throws IllegalArgumentException thrown if the feed type of the WireFeedOutput and WireFeed don't match.
*
* @param feed Abstract feed to create XML representation from. The type of
* the WireFeed must match the type given to the FeedOuptut
* constructor.
* @param file the file where to write the XML representation for the given
* WireFeed.
* @throws IllegalArgumentException thrown if the feed type of the
* WireFeedOutput and WireFeed don't match.
* @throws IOException thrown if there was some problem writing to the File.
* @throws FeedException thrown if the XML representation for the feed could not be created.
* @throws FeedException thrown if the XML representation for the feed could
* not be created.
*
*/
public void output(WireFeed feed,File file) throws IllegalArgumentException,IOException,FeedException {
output(feed,file,true);
public void output(final WireFeed feed, final File file) throws IllegalArgumentException, IOException, FeedException {
this.output(feed, file, true);
}
/**
* Creates a File containing with the XML representation for the given WireFeed.
* Creates a File containing with the XML representation for the given
* WireFeed.
* <p>
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. The platform
* default charset encoding is used to write the feed to the file. It is the responsibility
* of the developer to ensure the feed encoding is set to the platform charset encoding.
* If the feed encoding is not NULL, it will be used in the XML prolog
* encoding attribute. The platform default charset encoding is used to
* write the feed to the file. It is the responsibility of the developer to
* ensure the feed encoding is set to the platform charset encoding.
* <p>
* NOTE: This method delages to the 'Document WireFeedOutput#outputJDom(WireFeed)'.
* NOTE: This method delages to the 'Document
* WireFeedOutput#outputJDom(WireFeed)'.
* <p>
* @param feed Abstract feed to create XML representation from. The type of the WireFeed must match
* the type given to the FeedOuptut constructor.
* @param file the file where to write the XML representation for the given WireFeed.
*
* @param feed Abstract feed to create XML representation from. The type of
* the WireFeed must match the type given to the FeedOuptut
* constructor.
* @param file the file where to write the XML representation for the given
* WireFeed.
* @param prettyPrint pretty-print XML (true) oder collapsed
* @throws IllegalArgumentException thrown if the feed type of the WireFeedOutput and WireFeed don't match.
* @throws IllegalArgumentException thrown if the feed type of the
* WireFeedOutput and WireFeed don't match.
* @throws IOException thrown if there was some problem writing to the File.
* @throws FeedException thrown if the XML representation for the feed could not be created.
* @throws FeedException thrown if the XML representation for the feed could
* not be created.
*
*/
public void output(WireFeed feed,File file,boolean prettyPrint) throws IllegalArgumentException,IOException,FeedException {
Writer writer = new FileWriter(file);
output(feed,writer,prettyPrint);
public void output(final WireFeed feed, final File file, final boolean prettyPrint) throws IllegalArgumentException, IOException, FeedException {
final Writer writer = new FileWriter(file);
this.output(feed, writer, prettyPrint);
writer.close();
}
/**
* Writes to an Writer the XML representation for the given WireFeed.
* <p>
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. It is the responsibility
* of the developer to ensure the Writer instance is using the same charset encoding.
* If the feed encoding is not NULL, it will be used in the XML prolog
* encoding attribute. It is the responsibility of the developer to ensure
* the Writer instance is using the same charset encoding.
* <p>
* NOTE: This method delages to the 'Document WireFeedOutput#outputJDom(WireFeed)'.
* NOTE: This method delages to the 'Document
* WireFeedOutput#outputJDom(WireFeed)'.
* <p>
* @param feed Abstract feed to create XML representation from. The type of the WireFeed must match
* the type given to the FeedOuptut constructor.
* @param writer Writer to write the XML representation for the given WireFeed.
* @throws IllegalArgumentException thrown if the feed type of the WireFeedOutput and WireFeed don't match.
* @throws IOException thrown if there was some problem writing to the Writer.
* @throws FeedException thrown if the XML representation for the feed could not be created.
*
* @param feed Abstract feed to create XML representation from. The type of
* the WireFeed must match the type given to the FeedOuptut
* constructor.
* @param writer Writer to write the XML representation for the given
* WireFeed.
* @throws IllegalArgumentException thrown if the feed type of the
* WireFeedOutput and WireFeed don't match.
* @throws IOException thrown if there was some problem writing to the
* Writer.
* @throws FeedException thrown if the XML representation for the feed could
* not be created.
*
*/
public void output(WireFeed feed,Writer writer) throws IllegalArgumentException,IOException, FeedException {
output(feed,writer,true);
public void output(final WireFeed feed, final Writer writer) throws IllegalArgumentException, IOException, FeedException {
this.output(feed, writer, true);
}
/**
* Writes to an Writer the XML representation for the given WireFeed.
* <p>
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. It is the responsibility
* of the developer to ensure the Writer instance is using the same charset encoding.
* If the feed encoding is not NULL, it will be used in the XML prolog
* encoding attribute. It is the responsibility of the developer to ensure
* the Writer instance is using the same charset encoding.
* <p>
* NOTE: This method delages to the 'Document WireFeedOutput#outputJDom(WireFeed)'.
* NOTE: This method delages to the 'Document
* WireFeedOutput#outputJDom(WireFeed)'.
* <p>
* @param feed Abstract feed to create XML representation from. The type of the WireFeed must match
* the type given to the FeedOuptut constructor.
* @param writer Writer to write the XML representation for the given WireFeed.
*
* @param feed Abstract feed to create XML representation from. The type of
* the WireFeed must match the type given to the FeedOuptut
* constructor.
* @param writer Writer to write the XML representation for the given
* WireFeed.
* @param prettyPrint pretty-print XML (true) oder collapsed
* @throws IllegalArgumentException thrown if the feed type of the WireFeedOutput and WireFeed don't match.
* @throws IOException thrown if there was some problem writing to the Writer.
* @throws FeedException thrown if the XML representation for the feed could not be created.
* @throws IllegalArgumentException thrown if the feed type of the
* WireFeedOutput and WireFeed don't match.
* @throws IOException thrown if there was some problem writing to the
* Writer.
* @throws FeedException thrown if the XML representation for the feed could
* not be created.
*
*/
public void output(WireFeed feed,Writer writer,boolean prettyPrint) throws IllegalArgumentException,IOException, FeedException {
Document doc = outputJDom(feed);
String encoding = feed.getEncoding();
Format format = prettyPrint ? Format.getPrettyFormat() : Format.getCompactFormat();
if (encoding!=null) {
public void output(final WireFeed feed, final Writer writer, final boolean prettyPrint) throws IllegalArgumentException, IOException, FeedException {
final Document doc = outputJDom(feed);
final String encoding = feed.getEncoding();
final Format format = prettyPrint ? Format.getPrettyFormat() : Format.getCompactFormat();
if (encoding != null) {
format.setEncoding(encoding);
}
XMLOutputter outputter = new XMLOutputter(format);
outputter.output(doc,writer);
final XMLOutputter outputter = new XMLOutputter(format);
outputter.output(doc, writer);
}
/**
@ -223,23 +270,27 @@ public class WireFeedOutput {
* <p>
* This method does not use the feed encoding property.
* <p>
* NOTE: This method delages to the 'Document WireFeedOutput#outputJDom(WireFeed)'.
* NOTE: This method delages to the 'Document
* WireFeedOutput#outputJDom(WireFeed)'.
* <p>
* @param feed Abstract feed to create W3C DOM document from. The type of the WireFeed must match
* the type given to the FeedOuptut constructor.
*
* @param feed Abstract feed to create W3C DOM document from. The type of
* the WireFeed must match the type given to the FeedOuptut
* constructor.
* @return the W3C DOM document for the given WireFeed.
* @throws IllegalArgumentException thrown if the feed type of the WireFeedOutput and WireFeed don't match.
* @throws FeedException thrown if the W3C DOM document for the feed could not be created.
* @throws IllegalArgumentException thrown if the feed type of the
* WireFeedOutput and WireFeed don't match.
* @throws FeedException thrown if the W3C DOM document for the feed could
* not be created.
*
*/
public org.w3c.dom.Document outputW3CDom(WireFeed feed) throws IllegalArgumentException,FeedException {
Document doc = outputJDom(feed);
DOMOutputter outputter = new DOMOutputter();
public org.w3c.dom.Document outputW3CDom(final WireFeed feed) throws IllegalArgumentException, FeedException {
final Document doc = outputJDom(feed);
final DOMOutputter outputter = new DOMOutputter();
try {
return outputter.output(doc);
}
catch (JDOMException jdomEx) {
throw new FeedException("Could not create DOM",jdomEx);
} catch (final JDOMException jdomEx) {
throw new FeedException("Could not create DOM", jdomEx);
}
}
@ -250,23 +301,26 @@ public class WireFeedOutput {
* <p>
* NOTE: All other output methods delegate to this method.
* <p>
* @param feed Abstract feed to create JDOM document from. The type of the WireFeed must match
* the type given to the FeedOuptut constructor.
*
* @param feed Abstract feed to create JDOM document from. The type of the
* WireFeed must match the type given to the FeedOuptut
* constructor.
* @return the JDOM document for the given WireFeed.
* @throws IllegalArgumentException thrown if the feed type of the WireFeedOutput and WireFeed don't match.
* @throws FeedException thrown if the JDOM document for the feed could not be created.
* @throws IllegalArgumentException thrown if the feed type of the
* WireFeedOutput and WireFeed don't match.
* @throws FeedException thrown if the JDOM document for the feed could not
* be created.
*
*/
public Document outputJDom(WireFeed feed) throws IllegalArgumentException,FeedException {
String type = feed.getFeedType();
WireFeedGenerator generator = getFeedGenerators().getGenerator(type);
if (generator==null) {
throw new IllegalArgumentException("Invalid feed type ["+type+"]");
public Document outputJDom(final WireFeed feed) throws IllegalArgumentException, FeedException {
final String type = feed.getFeedType();
final WireFeedGenerator generator = getFeedGenerators().getGenerator(type);
if (generator == null) {
throw new IllegalArgumentException("Invalid feed type [" + type + "]");
}
if (!generator.getType().equals(type)) {
throw new IllegalArgumentException("WireFeedOutput type["+type+"] and WireFeed type ["+
type+"] don't match");
throw new IllegalArgumentException("WireFeedOutput type[" + type + "] and WireFeed type [" + type + "] don't match");
}
return generator.generate(feed);
}

View file

@ -16,10 +16,10 @@
*/
package com.sun.syndication.io;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.io.FeedException;
import org.jdom2.Document;
import com.sun.syndication.feed.WireFeed;
/**
* Parses an XML document (JDOM) into a feed bean.
* <p>
@ -27,6 +27,7 @@ import org.jdom2.Document;
* <p>
* TODO: explain how developers can plugin their own implementations.
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -35,6 +36,7 @@ public interface WireFeedParser {
/**
* Returns the type of feed the parser handles.
* <p>
*
* @see WireFeed for details on the format of this string.
* <p>
* @return the type of feed the parser handles.
@ -45,10 +47,14 @@ public interface WireFeedParser {
/**
* Inspects an XML Document (JDOM) to check if it can parse it.
* <p>
* It checks if the given document if the type of feeds the parser understands.
* It checks if the given document if the type of feeds the parser
* understands.
* <p>
* @param document XML Document (JDOM) to check if it can be parsed by this parser.
* @return <b>true</b> if the parser know how to parser this feed, <b>false</b> otherwise.
*
* @param document XML Document (JDOM) to check if it can be parsed by this
* parser.
* @return <b>true</b> if the parser know how to parser this feed,
* <b>false</b> otherwise.
*
*/
public boolean isMyType(Document document);
@ -56,14 +62,17 @@ public interface WireFeedParser {
/**
* Parses an XML document (JDOM Document) into a feed bean.
* <p>
*
* @param document XML document (JDOM) to parse.
* @param validate indicates if the feed should be strictly validated (NOT YET IMPLEMENTED).
* @param validate indicates if the feed should be strictly validated (NOT
* YET IMPLEMENTED).
* @return the resulting feed bean.
* @throws IllegalArgumentException thrown if the parser cannot handle the given feed type.
* @throws FeedException thrown if a feed bean cannot be created out of the XML document (JDOM).
* @throws IllegalArgumentException thrown if the parser cannot handle the
* given feed type.
* @throws FeedException thrown if a feed bean cannot be created out of the
* XML document (JDOM).
*
*/
public WireFeed parse(Document document, boolean validate) throws IllegalArgumentException,FeedException;
public WireFeed parse(Document document, boolean validate) throws IllegalArgumentException, FeedException;
}

View file

@ -16,35 +16,45 @@
*/
package com.sun.syndication.io;
import java.io.*;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.HttpURLConnection;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.text.MessageFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Character stream that handles (or at least attemtps to) all the necessary Voodo to figure out
* the charset encoding of the XML document within the stream.
* Character stream that handles (or at least attemtps to) all the necessary
* Voodo to figure out the charset encoding of the XML document within the
* stream.
* <p>
* IMPORTANT: This class is not related in any way to the org.xml.sax.XMLReader. This one IS a
* character stream.
* IMPORTANT: This class is not related in any way to the org.xml.sax.XMLReader.
* This one IS a character stream.
* <p>
* All this has to be done without consuming characters from the stream, if not the XML parser
* will not recognized the document as a valid XML. This is not 100% true, but it's close enough
* (UTF-8 BOM is not handled by all parsers right now, XmlReader handles it and things work in all
* parsers).
* All this has to be done without consuming characters from the stream, if not
* the XML parser will not recognized the document as a valid XML. This is not
* 100% true, but it's close enough (UTF-8 BOM is not handled by all parsers
* right now, XmlReader handles it and things work in all parsers).
* <p>
* The XmlReader class handles the charset encoding of XML documents in Files, raw streams and
* HTTP streams by offering a wide set of constructors.
* The XmlReader class handles the charset encoding of XML documents in Files,
* raw streams and HTTP streams by offering a wide set of constructors.
* <P>
* By default the charset encoding detection is lenient, the constructor with the lenient flag
* can be used for an script (following HTTP MIME and XML specifications).
* All this is nicely explained by Mark Pilgrim in his blog,
* <a href="http://diveintomark.org/archives/2004/02/13/xml-media-types">
* By default the charset encoding detection is lenient, the constructor with
* the lenient flag can be used for an script (following HTTP MIME and XML
* specifications). All this is nicely explained by Mark Pilgrim in his blog, <a
* href="http://diveintomark.org/archives/2004/02/13/xml-media-types">
* Determining the character encoding of a feed</a>.
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -61,11 +71,11 @@ public class XmlReader extends Reader {
private Reader _reader;
private String _encoding;
private String _defaultEncoding;
private final String _defaultEncoding;
/**
* Sets the default encoding to use if none is set in HTTP content-type,
* XML prolog and the rules based on content-type are not adequate.
* Sets the default encoding to use if none is set in HTTP content-type, XML
* prolog and the rules based on content-type are not adequate.
* <p/>
* If it is set to NULL the content-type based rules are used.
* <p/>
@ -74,7 +84,7 @@ public class XmlReader extends Reader {
*
* @param encoding charset encoding to default to.
*/
public static void setDefaultEncoding(String encoding) {
public static void setDefaultEncoding(final String encoding) {
_staticDefaultEncoding = encoding;
}
@ -94,17 +104,18 @@ public class XmlReader extends Reader {
/**
* Creates a Reader for a File.
* <p>
* It looks for the UTF-8 BOM first, if none sniffs the XML prolog charset, if this is also
* missing defaults to UTF-8.
* It looks for the UTF-8 BOM first, if none sniffs the XML prolog charset,
* if this is also missing defaults to UTF-8.
* <p>
* It does a lenient charset encoding detection, check the constructor with the lenient parameter
* for details.
* It does a lenient charset encoding detection, check the constructor with
* the lenient parameter for details.
* <p>
*
* @param file File to create a Reader from.
* @throws IOException thrown if there is a problem reading the file.
*
*/
public XmlReader(File file) throws IOException {
public XmlReader(final File file) throws IOException {
this(new FileInputStream(file));
}
@ -113,26 +124,29 @@ public class XmlReader extends Reader {
* <p>
* It follows the same logic used for files.
* <p>
* It does a lenient charset encoding detection, check the constructor with the lenient parameter
* for details.
* It does a lenient charset encoding detection, check the constructor with
* the lenient parameter for details.
* <p>
*
* @param is InputStream to create a Reader from.
* @throws IOException thrown if there is a problem reading the stream.
*
*/
public XmlReader(InputStream is) throws IOException {
this(is,true);
public XmlReader(final InputStream is) throws IOException {
this(is, true);
}
/**
* Creates a Reader for a raw InputStream and uses the provided default encoding if none is determined.
* Creates a Reader for a raw InputStream and uses the provided default
* encoding if none is determined.
* <p>
* It follows the same logic used for files.
* <p>
* If lenient detection is indicated and the detection above fails as per specifications it then attempts
* the following:
* If lenient detection is indicated and the detection above fails as per
* specifications it then attempts the following:
* <p>
* If the content type was 'text/html' it replaces it with 'text/xml' and tries the detection again.
* If the content type was 'text/html' it replaces it with 'text/xml' and
* tries the detection again.
* <p>
* Else if the XML prolog had a charset encoding that encoding is used.
* <p>
@ -142,25 +156,25 @@ public class XmlReader extends Reader {
* <p>
* If lenient detection is indicated an XmlReaderException is never thrown.
* <p>
*
* @param is InputStream to create a Reader from.
* @param lenient indicates if the charset encoding detection should be relaxed.
* @param lenient indicates if the charset encoding detection should be
* relaxed.
* @param defaultEncoding default encoding to use if one cannot be detected.
* @throws IOException thrown if there is a problem reading the stream.
* @throws XmlReaderException thrown if the charset encoding could not be determined according to the specs.
* @throws XmlReaderException thrown if the charset encoding could not be
* determined according to the specs.
*
*/
public XmlReader(InputStream is, boolean lenient, String defaultEncoding)
throws IOException, XmlReaderException {
_defaultEncoding = (defaultEncoding == null) ? _staticDefaultEncoding : defaultEncoding;
public XmlReader(final InputStream is, final boolean lenient, final String defaultEncoding) throws IOException, XmlReaderException {
this._defaultEncoding = defaultEncoding == null ? _staticDefaultEncoding : defaultEncoding;
try {
doRawStream(is,lenient);
}
catch (XmlReaderException ex) {
doRawStream(is, lenient);
} catch (final XmlReaderException ex) {
if (!lenient) {
throw ex;
}
else {
doLenientDetection(null,ex);
} else {
doLenientDetection(null, ex);
}
}
}
@ -170,10 +184,11 @@ public class XmlReader extends Reader {
* <p>
* It follows the same logic used for files.
* <p>
* If lenient detection is indicated and the detection above fails as per specifications it then attempts
* the following:
* If lenient detection is indicated and the detection above fails as per
* specifications it then attempts the following:
* <p>
* If the content type was 'text/html' it replaces it with 'text/xml' and tries the detection again.
* If the content type was 'text/html' it replaces it with 'text/xml' and
* tries the detection again.
* <p>
* Else if the XML prolog had a charset encoding that encoding is used.
* <p>
@ -183,33 +198,39 @@ public class XmlReader extends Reader {
* <p>
* If lenient detection is indicated an XmlReaderException is never thrown.
* <p>
*
* @param is InputStream to create a Reader from.
* @param lenient indicates if the charset encoding detection should be relaxed.
* @param lenient indicates if the charset encoding detection should be
* relaxed.
* @throws IOException thrown if there is a problem reading the stream.
* @throws XmlReaderException thrown if the charset encoding could not be determined according to the specs.
* @throws XmlReaderException thrown if the charset encoding could not be
* determined according to the specs.
*
*/
public XmlReader(InputStream is,boolean lenient) throws IOException, XmlReaderException {
public XmlReader(final InputStream is, final boolean lenient) throws IOException, XmlReaderException {
this(is, lenient, null);
}
/**
* Creates a Reader using the InputStream of a URL.
* <p>
* If the URL is not of type HTTP and there is not 'content-type' header in the fetched
* data it uses the same logic used for Files.
* If the URL is not of type HTTP and there is not 'content-type' header in
* the fetched data it uses the same logic used for Files.
* <p>
* If the URL is a HTTP Url or there is a 'content-type' header in the fetched
* data it uses the same logic used for an InputStream with content-type.
* If the URL is a HTTP Url or there is a 'content-type' header in the
* fetched data it uses the same logic used for an InputStream with
* content-type.
* <p>
* It does a lenient charset encoding detection, check the constructor with the lenient parameter
* for details.
* It does a lenient charset encoding detection, check the constructor with
* the lenient parameter for details.
* <p>
*
* @param url URL to create a Reader from.
* @throws IOException thrown if there is a problem reading the stream of the URL.
* @throws IOException thrown if there is a problem reading the stream of
* the URL.
*
*/
public XmlReader(URL url) throws IOException {
public XmlReader(final URL url) throws IOException {
this(url.openConnection());
}
@ -217,78 +238,83 @@ public class XmlReader extends Reader {
* Creates a Reader using the InputStream of a URLConnection.
* <p>
* If the URLConnection is not of type HttpURLConnection and there is not
* 'content-type' header in the fetched data it uses the same logic used for files.
* 'content-type' header in the fetched data it uses the same logic used for
* files.
* <p>
* If the URLConnection is a HTTP Url or there is a 'content-type' header in the fetched
* data it uses the same logic used for an InputStream with content-type.
* If the URLConnection is a HTTP Url or there is a 'content-type' header in
* the fetched data it uses the same logic used for an InputStream with
* content-type.
* <p>
* It does a lenient charset encoding detection, check the constructor with the lenient parameter
* for details.
* It does a lenient charset encoding detection, check the constructor with
* the lenient parameter for details.
* <p>
*
* @param conn URLConnection to create a Reader from.
* @throws IOException thrown if there is a problem reading the stream of the URLConnection.
* @throws IOException thrown if there is a problem reading the stream of
* the URLConnection.
*
*/
public XmlReader(URLConnection conn) throws IOException {
_defaultEncoding = _staticDefaultEncoding;
boolean lenient = true;
public XmlReader(final URLConnection conn) throws IOException {
this._defaultEncoding = _staticDefaultEncoding;
final boolean lenient = true;
if (conn instanceof HttpURLConnection) {
try {
doHttpStream(conn.getInputStream(),conn.getContentType(),lenient);
doHttpStream(conn.getInputStream(), conn.getContentType(), lenient);
} catch (final XmlReaderException ex) {
doLenientDetection(conn.getContentType(), ex);
}
catch (XmlReaderException ex) {
doLenientDetection(conn.getContentType(),ex);
}
}
else
if (conn.getContentType()!=null) {
} else if (conn.getContentType() != null) {
try {
doHttpStream(conn.getInputStream(),conn.getContentType(),lenient);
doHttpStream(conn.getInputStream(), conn.getContentType(), lenient);
} catch (final XmlReaderException ex) {
doLenientDetection(conn.getContentType(), ex);
}
catch (XmlReaderException ex) {
doLenientDetection(conn.getContentType(),ex);
}
}
else {
} else {
try {
doRawStream(conn.getInputStream(),lenient);
}
catch (XmlReaderException ex) {
doLenientDetection(null,ex);
doRawStream(conn.getInputStream(), lenient);
} catch (final XmlReaderException ex) {
doLenientDetection(null, ex);
}
}
}
/**
* Creates a Reader using an InputStream and the associated content-type header.
* Creates a Reader using an InputStream and the associated content-type
* header.
* <p>
* First it checks if the stream has BOM. If there is not BOM checks the content-type encoding.
* If there is not content-type encoding checks the XML prolog encoding. If there is not XML
* prolog encoding uses the default encoding mandated by the content-type MIME type.
* First it checks if the stream has BOM. If there is not BOM checks the
* content-type encoding. If there is not content-type encoding checks the
* XML prolog encoding. If there is not XML prolog encoding uses the default
* encoding mandated by the content-type MIME type.
* <p>
* It does a lenient charset encoding detection, check the constructor with the lenient parameter
* for details.
* It does a lenient charset encoding detection, check the constructor with
* the lenient parameter for details.
* <p>
*
* @param is InputStream to create the reader from.
* @param httpContentType content-type header to use for the resolution of the charset encoding.
* @param httpContentType content-type header to use for the resolution of
* the charset encoding.
* @throws IOException thrown if there is a problem reading the file.
*
*/
public XmlReader(InputStream is,String httpContentType) throws IOException {
this(is,httpContentType,true);
public XmlReader(final InputStream is, final String httpContentType) throws IOException {
this(is, httpContentType, true);
}
/**
* Creates a Reader using an InputStream and the associated content-type header.
* Creates a Reader using an InputStream and the associated content-type
* header.
* <p>
* First it checks if the stream has BOM. If there is not BOM checks the content-type encoding.
* If there is not content-type encoding checks the XML prolog encoding. If there is not XML
* prolog encoding uses the default encoding mandated by the content-type MIME type.
* First it checks if the stream has BOM. If there is not BOM checks the
* content-type encoding. If there is not content-type encoding checks the
* XML prolog encoding. If there is not XML prolog encoding uses the default
* encoding mandated by the content-type MIME type.
* <p>
* If lenient detection is indicated and the detection above fails as per specifications it then attempts
* the following:
* If lenient detection is indicated and the detection above fails as per
* specifications it then attempts the following:
* <p>
* If the content type was 'text/html' it replaces it with 'text/xml' and tries the detection again.
* If the content type was 'text/html' it replaces it with 'text/xml' and
* tries the detection again.
* <p>
* Else if the XML prolog had a charset encoding that encoding is used.
* <p>
@ -298,41 +324,46 @@ public class XmlReader extends Reader {
* <p>
* If lenient detection is indicated and XmlReaderException is never thrown.
* <p>
*
* @param is InputStream to create the reader from.
* @param httpContentType content-type header to use for the resolution of the charset encoding.
* @param lenient indicates if the charset encoding detection should be relaxed.
* @param httpContentType content-type header to use for the resolution of
* the charset encoding.
* @param lenient indicates if the charset encoding detection should be
* relaxed.
* @param defaultEncoding default encoding to use if one cannot be detected.
* @throws IOException thrown if there is a problem reading the file.
* @throws XmlReaderException thrown if the charset encoding could not be determined according to the specs.
* @throws XmlReaderException thrown if the charset encoding could not be
* determined according to the specs.
*
*/
public XmlReader(InputStream is,String httpContentType,boolean lenient, String defaultEncoding)
throws IOException, XmlReaderException {
_defaultEncoding = (defaultEncoding == null) ? _staticDefaultEncoding : defaultEncoding;
public XmlReader(final InputStream is, final String httpContentType, final boolean lenient, final String defaultEncoding) throws IOException,
XmlReaderException {
this._defaultEncoding = defaultEncoding == null ? _staticDefaultEncoding : defaultEncoding;
try {
doHttpStream(is,httpContentType,lenient);
}
catch (XmlReaderException ex) {
doHttpStream(is, httpContentType, lenient);
} catch (final XmlReaderException ex) {
if (!lenient) {
throw ex;
}
else {
doLenientDetection(httpContentType,ex);
} else {
doLenientDetection(httpContentType, ex);
}
}
}
/**
* Creates a Reader using an InputStream and the associated content-type header.
* Creates a Reader using an InputStream and the associated content-type
* header.
* <p>
* First it checks if the stream has BOM. If there is not BOM checks the content-type encoding.
* If there is not content-type encoding checks the XML prolog encoding. If there is not XML
* prolog encoding uses the default encoding mandated by the content-type MIME type.
* First it checks if the stream has BOM. If there is not BOM checks the
* content-type encoding. If there is not content-type encoding checks the
* XML prolog encoding. If there is not XML prolog encoding uses the default
* encoding mandated by the content-type MIME type.
* <p>
* If lenient detection is indicated and the detection above fails as per specifications it then attempts
* the following:
* If lenient detection is indicated and the detection above fails as per
* specifications it then attempts the following:
* <p>
* If the content type was 'text/html' it replaces it with 'text/xml' and tries the detection again.
* If the content type was 'text/html' it replaces it with 'text/xml' and
* tries the detection again.
* <p>
* Else if the XML prolog had a charset encoding that encoding is used.
* <p>
@ -342,210 +373,194 @@ public class XmlReader extends Reader {
* <p>
* If lenient detection is indicated and XmlReaderException is never thrown.
* <p>
*
* @param is InputStream to create the reader from.
* @param httpContentType content-type header to use for the resolution of the charset encoding.
* @param lenient indicates if the charset encoding detection should be relaxed.
* @param httpContentType content-type header to use for the resolution of
* the charset encoding.
* @param lenient indicates if the charset encoding detection should be
* relaxed.
* @throws IOException thrown if there is a problem reading the file.
* @throws XmlReaderException thrown if the charset encoding could not be determined according to the specs.
* @throws XmlReaderException thrown if the charset encoding could not be
* determined according to the specs.
*
*/
public XmlReader(InputStream is, String httpContentType, boolean lenient)
throws IOException, XmlReaderException {
public XmlReader(final InputStream is, final String httpContentType, final boolean lenient) throws IOException, XmlReaderException {
this(is, httpContentType, lenient, null);
}
private void doLenientDetection(String httpContentType,XmlReaderException ex) throws IOException {
if (httpContentType!=null) {
private void doLenientDetection(String httpContentType, XmlReaderException ex) throws IOException {
if (httpContentType != null) {
if (httpContentType.startsWith("text/html")) {
httpContentType = httpContentType.substring("text/html".length());
httpContentType = "text/xml" + httpContentType;
try {
doHttpStream(ex.getInputStream(),httpContentType,true);
doHttpStream(ex.getInputStream(), httpContentType, true);
ex = null;
}
catch (XmlReaderException ex2) {
} catch (final XmlReaderException ex2) {
ex = ex2;
}
}
}
if (ex!=null) {
if (ex != null) {
String encoding = ex.getXmlEncoding();
if (encoding==null) {
if (encoding == null) {
encoding = ex.getContentTypeEncoding();
}
if (encoding==null) {
encoding = (_defaultEncoding == null) ? UTF_8 : _defaultEncoding;
if (encoding == null) {
encoding = this._defaultEncoding == null ? UTF_8 : this._defaultEncoding;
}
prepareReader(ex.getInputStream(),encoding);
prepareReader(ex.getInputStream(), encoding);
}
}
/**
* Returns the charset encoding of the XmlReader.
* <p>
*
* @return charset encoding.
*
*/
public String getEncoding() {
return _encoding;
return this._encoding;
}
public int read(char[] buf,int offset,int len) throws IOException {
return _reader.read(buf,offset,len);
@Override
public int read(final char[] buf, final int offset, final int len) throws IOException {
return this._reader.read(buf, offset, len);
}
/**
* Closes the XmlReader stream.
* <p>
*
* @throws IOException thrown if there was a problem closing the stream.
*
*/
@Override
public void close() throws IOException {
_reader.close();
this._reader.close();
}
private void doRawStream(InputStream is,boolean lenient) throws IOException {
BufferedInputStream pis = new BufferedInputStream(is, BUFFER_SIZE);
String bomEnc = getBOMEncoding(pis);
String xmlGuessEnc = getXMLGuessEncoding(pis);
String xmlEnc = getXmlProlog(pis,xmlGuessEnc);
String encoding = calculateRawEncoding(bomEnc, xmlGuessEnc, xmlEnc, pis);
prepareReader(pis,encoding);
private void doRawStream(final InputStream is, final boolean lenient) throws IOException {
final BufferedInputStream pis = new BufferedInputStream(is, BUFFER_SIZE);
final String bomEnc = getBOMEncoding(pis);
final String xmlGuessEnc = getXMLGuessEncoding(pis);
final String xmlEnc = getXmlProlog(pis, xmlGuessEnc);
final String encoding = calculateRawEncoding(bomEnc, xmlGuessEnc, xmlEnc, pis);
prepareReader(pis, encoding);
}
private void doHttpStream(InputStream is,String httpContentType,boolean lenient) throws IOException {
BufferedInputStream pis = new BufferedInputStream(is, BUFFER_SIZE);
String cTMime = getContentTypeMime(httpContentType);
String cTEnc = getContentTypeEncoding(httpContentType);
String bomEnc = getBOMEncoding(pis);
String xmlGuessEnc = getXMLGuessEncoding(pis);
String xmlEnc = getXmlProlog(pis,xmlGuessEnc);
String encoding = calculateHttpEncoding(cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc, pis,lenient);
prepareReader(pis,encoding);
private void doHttpStream(final InputStream is, final String httpContentType, final boolean lenient) throws IOException {
final BufferedInputStream pis = new BufferedInputStream(is, BUFFER_SIZE);
final String cTMime = getContentTypeMime(httpContentType);
final String cTEnc = getContentTypeEncoding(httpContentType);
final String bomEnc = getBOMEncoding(pis);
final String xmlGuessEnc = getXMLGuessEncoding(pis);
final String xmlEnc = getXmlProlog(pis, xmlGuessEnc);
final String encoding = calculateHttpEncoding(cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc, pis, lenient);
prepareReader(pis, encoding);
}
private void prepareReader(InputStream is,String encoding) throws IOException {
_reader = new InputStreamReader(is,encoding);
_encoding = encoding;
private void prepareReader(final InputStream is, final String encoding) throws IOException {
this._reader = new InputStreamReader(is, encoding);
this._encoding = encoding;
}
// InputStream is passed for XmlReaderException creation only
private String calculateRawEncoding(String bomEnc, String xmlGuessEnc, String xmlEnc, InputStream is) throws IOException {
private String calculateRawEncoding(final String bomEnc, final String xmlGuessEnc, final String xmlEnc, final InputStream is) throws IOException {
String encoding;
if (bomEnc==null) {
if (xmlGuessEnc==null || xmlEnc==null) {
encoding = (_defaultEncoding == null) ? UTF_8 : _defaultEncoding;
}
else
if (xmlEnc.equals(UTF_16) && (xmlGuessEnc.equals(UTF_16BE) || xmlGuessEnc.equals(UTF_16LE))) {
if (bomEnc == null) {
if (xmlGuessEnc == null || xmlEnc == null) {
encoding = this._defaultEncoding == null ? UTF_8 : this._defaultEncoding;
} else if (xmlEnc.equals(UTF_16) && (xmlGuessEnc.equals(UTF_16BE) || xmlGuessEnc.equals(UTF_16LE))) {
encoding = xmlGuessEnc;
}
else {
} else {
encoding = xmlEnc;
}
} else if (bomEnc.equals(UTF_8)) {
if (xmlGuessEnc != null && !xmlGuessEnc.equals(UTF_8)) {
throw new XmlReaderException(RAW_EX_1.format(new Object[] { bomEnc, xmlGuessEnc, xmlEnc }), bomEnc, xmlGuessEnc, xmlEnc, is);
}
else
if (bomEnc.equals(UTF_8)) {
if (xmlGuessEnc!=null && !xmlGuessEnc.equals(UTF_8)) {
throw new XmlReaderException(RAW_EX_1.format(new Object[]{bomEnc,xmlGuessEnc,xmlEnc}),
bomEnc,xmlGuessEnc,xmlEnc,is);
}
if (xmlEnc!=null && !xmlEnc.equals(UTF_8)) {
throw new XmlReaderException(RAW_EX_1.format(new Object[]{bomEnc,xmlGuessEnc,xmlEnc}),
bomEnc,xmlGuessEnc,xmlEnc,is);
if (xmlEnc != null && !xmlEnc.equals(UTF_8)) {
throw new XmlReaderException(RAW_EX_1.format(new Object[] { bomEnc, xmlGuessEnc, xmlEnc }), bomEnc, xmlGuessEnc, xmlEnc, is);
}
encoding = UTF_8;
} else if (bomEnc.equals(UTF_16BE) || bomEnc.equals(UTF_16LE)) {
if (xmlGuessEnc != null && !xmlGuessEnc.equals(bomEnc)) {
throw new IOException(RAW_EX_1.format(new Object[] { bomEnc, xmlGuessEnc, xmlEnc }));
}
else
if (bomEnc.equals(UTF_16BE) || bomEnc.equals(UTF_16LE)) {
if (xmlGuessEnc!=null && !xmlGuessEnc.equals(bomEnc)) {
throw new IOException(RAW_EX_1.format(new Object[]{bomEnc,xmlGuessEnc,xmlEnc}));
if (xmlEnc != null && !xmlEnc.equals(UTF_16) && !xmlEnc.equals(bomEnc)) {
throw new XmlReaderException(RAW_EX_1.format(new Object[] { bomEnc, xmlGuessEnc, xmlEnc }), bomEnc, xmlGuessEnc, xmlEnc, is);
}
if (xmlEnc!=null && !xmlEnc.equals(UTF_16) && !xmlEnc.equals(bomEnc)) {
throw new XmlReaderException(RAW_EX_1.format(new Object[]{bomEnc,xmlGuessEnc,xmlEnc}),
bomEnc,xmlGuessEnc,xmlEnc,is);
}
encoding =bomEnc;
}
else {
throw new XmlReaderException(RAW_EX_2.format(new Object[]{bomEnc,xmlGuessEnc,xmlEnc}),
bomEnc,xmlGuessEnc,xmlEnc,is);
encoding = bomEnc;
} else {
throw new XmlReaderException(RAW_EX_2.format(new Object[] { bomEnc, xmlGuessEnc, xmlEnc }), bomEnc, xmlGuessEnc, xmlEnc, is);
}
return encoding;
}
// InputStream is passed for XmlReaderException creation only
private String calculateHttpEncoding(String cTMime, String cTEnc, String bomEnc, String xmlGuessEnc, String xmlEnc, InputStream is,boolean lenient) throws IOException {
private String calculateHttpEncoding(final String cTMime, final String cTEnc, final String bomEnc, final String xmlGuessEnc, final String xmlEnc,
final InputStream is, final boolean lenient) throws IOException {
String encoding;
if (lenient & xmlEnc!=null) {
if (lenient & xmlEnc != null) {
encoding = xmlEnc;
}
else {
boolean appXml = isAppXml(cTMime);
boolean textXml = isTextXml(cTMime);
} else {
final boolean appXml = isAppXml(cTMime);
final boolean textXml = isTextXml(cTMime);
if (appXml || textXml) {
if (cTEnc==null) {
if (cTEnc == null) {
if (appXml) {
encoding = calculateRawEncoding(bomEnc, xmlGuessEnc, xmlEnc, is);
} else {
encoding = this._defaultEncoding == null ? US_ASCII : this._defaultEncoding;
}
else {
encoding = (_defaultEncoding == null) ? US_ASCII : _defaultEncoding;
}
}
else
if (bomEnc!=null && (cTEnc.equals(UTF_16BE) || cTEnc.equals(UTF_16LE))) {
throw new XmlReaderException(HTTP_EX_1.format(new Object[]{cTMime,cTEnc,bomEnc,xmlGuessEnc,xmlEnc}),
cTMime,cTEnc,bomEnc,xmlGuessEnc,xmlEnc,is);
}
else
if (cTEnc.equals(UTF_16)) {
if (bomEnc!=null && bomEnc.startsWith(UTF_16)) {
} else if (bomEnc != null && (cTEnc.equals(UTF_16BE) || cTEnc.equals(UTF_16LE))) {
throw new XmlReaderException(HTTP_EX_1.format(new Object[] { cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc }), cTMime, cTEnc, bomEnc,
xmlGuessEnc, xmlEnc, is);
} else if (cTEnc.equals(UTF_16)) {
if (bomEnc != null && bomEnc.startsWith(UTF_16)) {
encoding = bomEnc;
} else {
throw new XmlReaderException(HTTP_EX_2.format(new Object[] { cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc }), cTMime, cTEnc, bomEnc,
xmlGuessEnc, xmlEnc, is);
}
else {
throw new XmlReaderException(HTTP_EX_2.format(new Object[]{cTMime,cTEnc,bomEnc,xmlGuessEnc,xmlEnc}),
cTMime,cTEnc,bomEnc,xmlGuessEnc,xmlEnc,is);
}
}
else {
} else {
encoding = cTEnc;
}
}
else {
throw new XmlReaderException(HTTP_EX_3.format(new Object[]{cTMime,cTEnc,bomEnc,xmlGuessEnc,xmlEnc}),
cTMime,cTEnc,bomEnc,xmlGuessEnc,xmlEnc,is);
} else {
throw new XmlReaderException(HTTP_EX_3.format(new Object[] { cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc }), cTMime, cTEnc, bomEnc, xmlGuessEnc,
xmlEnc, is);
}
}
return encoding;
}
// returns MIME type or NULL if httpContentType is NULL
private static String getContentTypeMime(String httpContentType) {
private static String getContentTypeMime(final String httpContentType) {
String mime = null;
if (httpContentType!=null) {
int i = httpContentType.indexOf(";");
mime = ((i==-1) ? httpContentType : httpContentType.substring(0,i)).trim();
if (httpContentType != null) {
final int i = httpContentType.indexOf(";");
mime = (i == -1 ? httpContentType : httpContentType.substring(0, i)).trim();
}
return mime;
}
private static final Pattern CHARSET_PATTERN = Pattern.compile("charset=([.[^; ]]*)");
// returns charset parameter value, NULL if not present, NULL if httpContentType is NULL
private static String getContentTypeEncoding(String httpContentType) {
// returns charset parameter value, NULL if not present, NULL if
// httpContentType is NULL
private static String getContentTypeEncoding(final String httpContentType) {
String encoding = null;
if (httpContentType!=null) {
int i = httpContentType.indexOf(";");
if (i>-1) {
String postMime = httpContentType.substring(i+1);
Matcher m = CHARSET_PATTERN.matcher(postMime);
encoding = (m.find()) ? m.group(1) : null;
encoding = (encoding!=null) ? encoding.toUpperCase() : null;
if (httpContentType != null) {
final int i = httpContentType.indexOf(";");
if (i > -1) {
final String postMime = httpContentType.substring(i + 1);
final Matcher m = CHARSET_PATTERN.matcher(postMime);
encoding = m.find() ? m.group(1) : null;
encoding = encoding != null ? encoding.toUpperCase() : null;
}
if (encoding != null &&
((encoding.startsWith("\"") && encoding.endsWith("\"")) ||
(encoding.startsWith("'") && encoding.endsWith("'"))
)) {
if (encoding != null && (encoding.startsWith("\"") && encoding.endsWith("\"") || encoding.startsWith("'") && encoding.endsWith("'"))) {
encoding = encoding.substring(1, encoding.length() - 1);
}
}
@ -554,9 +569,9 @@ public class XmlReader extends Reader {
// returns the BOM in the stream, NULL if not present,
// if there was BOM the in the stream it is consumed
private static String getBOMEncoding(BufferedInputStream is) throws IOException {
private static String getBOMEncoding(final BufferedInputStream is) throws IOException {
String encoding = null;
int[] bytes = new int[3];
final int[] bytes = new int[3];
is.mark(3);
bytes[0] = is.read();
bytes[1] = is.read();
@ -567,28 +582,24 @@ public class XmlReader extends Reader {
is.reset();
is.read();
is.read();
}
else
if (bytes[0] == 0xFF && bytes[1] == 0xFE) {
} else if (bytes[0] == 0xFF && bytes[1] == 0xFE) {
encoding = UTF_16LE;
is.reset();
is.read();
is.read();
}
else
if (bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) {
} else if (bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) {
encoding = UTF_8;
}
else {
} else {
is.reset();
}
return encoding;
}
// returns the best guess for the encoding by looking the first bytes of the stream, '<?'
private static String getXMLGuessEncoding(BufferedInputStream is) throws IOException {
// returns the best guess for the encoding by looking the first bytes of the
// stream, '<?'
private static String getXMLGuessEncoding(final BufferedInputStream is) throws IOException {
String encoding = null;
int[] bytes = new int[4];
final int[] bytes = new int[4];
is.mark(4);
bytes[0] = is.read();
bytes[1] = is.read();
@ -598,61 +609,54 @@ public class XmlReader extends Reader {
if (bytes[0] == 0x00 && bytes[1] == 0x3C && bytes[2] == 0x00 && bytes[3] == 0x3F) {
encoding = UTF_16BE;
}
else
if (bytes[0] == 0x3C && bytes[1] == 0x00 && bytes[2] == 0x3F && bytes[3] == 0x00) {
} else if (bytes[0] == 0x3C && bytes[1] == 0x00 && bytes[2] == 0x3F && bytes[3] == 0x00) {
encoding = UTF_16LE;
}
else
if (bytes[0] == 0x3C && bytes[1] == 0x3F && bytes[2] == 0x78 && bytes[3] == 0x6D) {
} else if (bytes[0] == 0x3C && bytes[1] == 0x3F && bytes[2] == 0x78 && bytes[3] == 0x6D) {
encoding = UTF_8;
}
return encoding;
}
private static final Pattern ENCODING_PATTERN =
Pattern.compile("<\\?xml.*encoding[\\s]*=[\\s]*((?:\".[^\"]*\")|(?:'.[^']*'))", Pattern.MULTILINE);
private static final Pattern ENCODING_PATTERN = Pattern.compile("<\\?xml.*encoding[\\s]*=[\\s]*((?:\".[^\"]*\")|(?:'.[^']*'))", Pattern.MULTILINE);
// returns the encoding declared in the <?xml encoding=...?>, NULL if none
private static String getXmlProlog(BufferedInputStream is,String guessedEnc) throws IOException {
private static String getXmlProlog(final BufferedInputStream is, final String guessedEnc) throws IOException {
String encoding = null;
if (guessedEnc!=null) {
byte[] bytes = new byte[BUFFER_SIZE];
if (guessedEnc != null) {
final byte[] bytes = new byte[BUFFER_SIZE];
is.mark(BUFFER_SIZE);
int offset = 0;
int max = BUFFER_SIZE;
int c = is.read(bytes,offset,max);
int c = is.read(bytes, offset, max);
int firstGT = -1;
while (c!=-1 && firstGT==-1 && offset< BUFFER_SIZE) {
while (c != -1 && firstGT == -1 && offset < BUFFER_SIZE) {
offset += c;
max -= c;
c = is.read(bytes,offset,max);
c = is.read(bytes, offset, max);
firstGT = new String(bytes, 0, offset).indexOf(">");
}
if (firstGT == -1) {
if (c == -1) {
throw new IOException("Unexpected end of XML stream");
}
else {
} else {
throw new IOException("XML prolog or ROOT element not found on first " + offset + " bytes");
}
}
int bytesRead = offset;
if (bytesRead>0) {
final int bytesRead = offset;
if (bytesRead > 0) {
is.reset();
Reader reader = new InputStreamReader(new ByteArrayInputStream(bytes,0,firstGT + 1), guessedEnc);
BufferedReader bReader = new BufferedReader(reader);
StringBuffer prolog = new StringBuffer();
final Reader reader = new InputStreamReader(new ByteArrayInputStream(bytes, 0, firstGT + 1), guessedEnc);
final BufferedReader bReader = new BufferedReader(reader);
final StringBuffer prolog = new StringBuffer();
String line = bReader.readLine();
while (line != null) {
prolog.append(line);
line = bReader.readLine();
}
Matcher m = ENCODING_PATTERN.matcher(prolog);
final Matcher m = ENCODING_PATTERN.matcher(prolog);
if (m.find()) {
encoding = m.group(1).toUpperCase();
encoding = encoding.substring(1,encoding.length()-1);
encoding = encoding.substring(1, encoding.length() - 1);
}
}
}
@ -660,27 +664,20 @@ public class XmlReader extends Reader {
}
// indicates if the MIME type belongs to the APPLICATION XML family
private static boolean isAppXml(String mime) {
return mime!=null &&
(mime.equals("application/xml") ||
mime.equals("application/xml-dtd") ||
mime.equals("application/xml-external-parsed-entity") ||
(mime.startsWith("application/") && mime.endsWith("+xml")));
private static boolean isAppXml(final String mime) {
return mime != null
&& (mime.equals("application/xml") || mime.equals("application/xml-dtd") || mime.equals("application/xml-external-parsed-entity") || mime
.startsWith("application/") && mime.endsWith("+xml"));
}
// indicates if the MIME type belongs to the TEXT XML family
private static boolean isTextXml(String mime) {
return mime!=null &&
(mime.equals("text/xml") ||
mime.equals("text/xml-external-parsed-entity") ||
(mime.startsWith("text/") && mime.endsWith("+xml")));
private static boolean isTextXml(final String mime) {
return mime != null && (mime.equals("text/xml") || mime.equals("text/xml-external-parsed-entity") || mime.startsWith("text/") && mime.endsWith("+xml"));
}
private static final MessageFormat RAW_EX_1 = new MessageFormat(
"Invalid encoding, BOM [{0}] XML guess [{1}] XML prolog [{2}] encoding mismatch");
private static final MessageFormat RAW_EX_1 = new MessageFormat("Invalid encoding, BOM [{0}] XML guess [{1}] XML prolog [{2}] encoding mismatch");
private static final MessageFormat RAW_EX_2 = new MessageFormat(
"Invalid encoding, BOM [{0}] XML guess [{1}] XML prolog [{2}] unknown BOM");
private static final MessageFormat RAW_EX_2 = new MessageFormat("Invalid encoding, BOM [{0}] XML guess [{1}] XML prolog [{2}] unknown BOM");
private static final MessageFormat HTTP_EX_1 = new MessageFormat(
"Invalid encoding, CT-MIME [{0}] CT-Enc [{1}] BOM [{2}] XML guess [{3}] XML prolog [{4}], BOM must be NULL");

View file

@ -1,33 +1,37 @@
package com.sun.syndication.io;
import java.io.InputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* The XmlReaderException is thrown by the XmlReader constructors if the charset encoding
* can not be determined according to the XML 1.0 specification and RFC 3023.
* The XmlReaderException is thrown by the XmlReader constructors if the charset
* encoding can not be determined according to the XML 1.0 specification and RFC
* 3023.
* <p>
* The exception returns the unconsumed InputStream to allow the application to do an
* alternate processing with the stream. Note that the original InputStream given to the
* XmlReader cannot be used as that one has been already read.
* The exception returns the unconsumed InputStream to allow the application to
* do an alternate processing with the stream. Note that the original
* InputStream given to the XmlReader cannot be used as that one has been
* already read.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class XmlReaderException extends IOException {
private String _bomEncoding;
private String _xmlGuessEncoding;
private String _xmlEncoding;
private String _contentTypeMime;
private String _contentTypeEncoding;
private InputStream _is;
private final String _bomEncoding;
private final String _xmlGuessEncoding;
private final String _xmlEncoding;
private final String _contentTypeMime;
private final String _contentTypeEncoding;
private final InputStream _is;
/**
* Creates an exception instance if the charset encoding could not be determined.
* Creates an exception instance if the charset encoding could not be
* determined.
* <p>
* Instances of this exception are thrown by the XmlReader.
* <p>
*
* @param msg message describing the reason for the exception.
* @param bomEnc BOM encoding.
* @param xmlGuessEnc XML guess encoding.
@ -35,15 +39,17 @@ public class XmlReaderException extends IOException {
* @param is the unconsumed InputStream.
*
*/
public XmlReaderException(String msg,String bomEnc,String xmlGuessEnc,String xmlEnc,InputStream is) {
this(msg,null,null,bomEnc,xmlGuessEnc,xmlEnc,is);
public XmlReaderException(final String msg, final String bomEnc, final String xmlGuessEnc, final String xmlEnc, final InputStream is) {
this(msg, null, null, bomEnc, xmlGuessEnc, xmlEnc, is);
}
/**
* Creates an exception instance if the charset encoding could not be determined.
* Creates an exception instance if the charset encoding could not be
* determined.
* <p>
* Instances of this exception are thrown by the XmlReader.
* <p>
*
* @param msg message describing the reason for the exception.
* @param ctMime MIME type in the content-type.
* @param ctEnc encoding in the content-type.
@ -53,77 +59,86 @@ public class XmlReaderException extends IOException {
* @param is the unconsumed InputStream.
*
*/
public XmlReaderException(String msg,String ctMime,String ctEnc,
String bomEnc,String xmlGuessEnc,String xmlEnc,InputStream is) {
public XmlReaderException(final String msg, final String ctMime, final String ctEnc, final String bomEnc, final String xmlGuessEnc, final String xmlEnc,
final InputStream is) {
super(msg);
_contentTypeMime = ctMime;
_contentTypeEncoding = ctEnc;
_bomEncoding = bomEnc;
_xmlGuessEncoding = xmlGuessEnc;
_xmlEncoding = xmlEnc;
_is = is;
this._contentTypeMime = ctMime;
this._contentTypeEncoding = ctEnc;
this._bomEncoding = bomEnc;
this._xmlGuessEncoding = xmlGuessEnc;
this._xmlEncoding = xmlEnc;
this._is = is;
}
/**
* Returns the BOM encoding found in the InputStream.
* <p>
*
* @return the BOM encoding, null if none.
*
*/
public String getBomEncoding() {
return _bomEncoding;
return this._bomEncoding;
}
/**
* Returns the encoding guess based on the first bytes of the InputStream.
* <p>
*
* @return the encoding guess, null if it couldn't be guessed.
*
*/
public String getXmlGuessEncoding() {
return _xmlGuessEncoding;
return this._xmlGuessEncoding;
}
/**
* Returns the encoding found in the XML prolog of the InputStream.
* <p>
*
* @return the encoding of the XML prolog, null if none.
*
*/
public String getXmlEncoding() {
return _xmlEncoding;
return this._xmlEncoding;
}
/**
* Returns the MIME type in the content-type used to attempt determining the encoding.
* Returns the MIME type in the content-type used to attempt determining the
* encoding.
* <p>
* @return the MIME type in the content-type, null if there was not content-type or the encoding detection
* did not involve HTTP.
*
* @return the MIME type in the content-type, null if there was not
* content-type or the encoding detection did not involve HTTP.
*
*/
public String getContentTypeMime() {
return _contentTypeMime;
return this._contentTypeMime;
}
/**
* Returns the encoding in the content-type used to attempt determining the encoding.
* Returns the encoding in the content-type used to attempt determining the
* encoding.
* <p>
* @return the encoding in the content-type, null if there was not content-type, no encoding in it
* or the encoding detection did not involve HTTP.
*
* @return the encoding in the content-type, null if there was not
* content-type, no encoding in it or the encoding detection did not
* involve HTTP.
*
*/
public String getContentTypeEncoding() {
return _contentTypeEncoding;
return this._contentTypeEncoding;
}
/**
* Returns the unconsumed InputStream to allow the application to do an alternate
* encoding detection on the InputStream.
* Returns the unconsumed InputStream to allow the application to do an
* alternate encoding detection on the InputStream.
* <p>
*
* @return the unconsumed InputStream.
*
*/
public InputStream getInputStream() {
return _is;
return this._is;
}
}

View file

@ -16,17 +16,23 @@
*/
package com.sun.syndication.io.impl;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.atom.*;
import com.sun.syndication.io.FeedException;
import java.io.StringReader;
import java.util.List;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.Namespace;
import org.jdom2.input.SAXBuilder;
import java.io.StringReader;
import java.util.List;
import com.sun.syndication.feed.WireFeed;
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.Generator;
import com.sun.syndication.feed.atom.Link;
import com.sun.syndication.feed.atom.Person;
import com.sun.syndication.io.FeedException;
/**
* Feed Generator for Atom
@ -40,106 +46,107 @@ public class Atom03Generator extends BaseWireFeedGenerator {
private static final String ATOM_03_URI = "http://purl.org/atom/ns#";
private static final Namespace ATOM_NS = Namespace.getNamespace(ATOM_03_URI);
private String _version;
private final String _version;
public Atom03Generator() {
this("atom_0.3","0.3");
this("atom_0.3", "0.3");
}
protected Atom03Generator(String type,String version) {
protected Atom03Generator(final String type, final String version) {
super(type);
_version = version;
this._version = version;
}
protected String getVersion() {
return _version;
return this._version;
}
protected Namespace getFeedNamespace() {
return ATOM_NS;
}
public Document generate(WireFeed wFeed) throws FeedException {
Feed feed = (Feed) wFeed;
Element root = createRootElement(feed);
populateFeed(feed,root);
@Override
public Document generate(final WireFeed wFeed) throws FeedException {
final Feed feed = (Feed) wFeed;
final Element root = createRootElement(feed);
populateFeed(feed, root);
purgeUnusedNamespaceDeclarations(root);
return createDocument(root);
}
protected Document createDocument(Element root) {
protected Document createDocument(final Element root) {
return new Document(root);
}
protected Element createRootElement(Feed feed) {
Element root = new Element("feed",getFeedNamespace());
protected Element createRootElement(final Feed feed) {
final Element root = new Element("feed", getFeedNamespace());
root.addNamespaceDeclaration(getFeedNamespace());
Attribute version = new Attribute("version", getVersion());
final Attribute version = new Attribute("version", getVersion());
root.setAttribute(version);
generateModuleNamespaceDefs(root);
return root;
}
protected void populateFeed(Feed feed,Element parent) throws FeedException {
addFeed(feed,parent);
addEntries(feed,parent);
protected void populateFeed(final Feed feed, final Element parent) throws FeedException {
addFeed(feed, parent);
addEntries(feed, parent);
}
protected void addFeed(Feed feed, Element parent) throws FeedException {
Element eFeed = parent;
populateFeedHeader(feed,eFeed);
protected void addFeed(final Feed feed, final Element parent) throws FeedException {
final Element eFeed = parent;
populateFeedHeader(feed, eFeed);
checkFeedHeaderConstraints(eFeed);
generateFeedModules(feed.getModules(),eFeed);
generateForeignMarkup(eFeed, (List<Element>)feed.getForeignMarkup());
generateFeedModules(feed.getModules(), eFeed);
generateForeignMarkup(eFeed, feed.getForeignMarkup());
}
protected void addEntries(Feed feed,Element parent) throws FeedException {
List<Entry> items = feed.getEntries();
for (int i=0;i<items.size();i++) {
addEntry((Entry)items.get(i),parent);
protected void addEntries(final Feed feed, final Element parent) throws FeedException {
final List<Entry> items = feed.getEntries();
for (int i = 0; i < items.size(); i++) {
addEntry(items.get(i), parent);
}
checkEntriesConstraints(parent);
}
protected void addEntry(Entry entry,Element parent) throws FeedException {
Element eEntry = new Element("entry", getFeedNamespace());
populateEntry(entry,eEntry);
protected void addEntry(final Entry entry, final Element parent) throws FeedException {
final Element eEntry = new Element("entry", getFeedNamespace());
populateEntry(entry, eEntry);
checkEntryConstraints(eEntry);
generateItemModules(entry.getModules(),eEntry);
generateItemModules(entry.getModules(), eEntry);
parent.addContent(eEntry);
}
protected void populateFeedHeader(Feed feed, Element eFeed) throws FeedException {
protected void populateFeedHeader(final Feed feed, final Element eFeed) throws FeedException {
if (feed.getTitleEx() != null) {
Element titleElement = new Element("title", getFeedNamespace());
final Element titleElement = new Element("title", getFeedNamespace());
fillContentElement(titleElement, feed.getTitleEx());
eFeed.addContent(titleElement);
}
List<Link> links = feed.getAlternateLinks();
for (int i = 0; i < links.size(); i++) {
eFeed.addContent(generateLinkElement((Link)links.get(i)));
eFeed.addContent(generateLinkElement(links.get(i)));
}
links = feed.getOtherLinks();
for (int i = 0; i < links.size(); i++) {
eFeed.addContent(generateLinkElement((Link)links.get(i)));
eFeed.addContent(generateLinkElement(links.get(i)));
}
if (feed.getAuthors()!=null && feed.getAuthors().size() > 0) {
Element authorElement = new Element("author", getFeedNamespace());
fillPersonElement(authorElement, (Person)feed.getAuthors().get(0));
if (feed.getAuthors() != null && feed.getAuthors().size() > 0) {
final Element authorElement = new Element("author", getFeedNamespace());
fillPersonElement(authorElement, feed.getAuthors().get(0));
eFeed.addContent(authorElement);
}
List<Person> contributors = feed.getContributors();
final List<Person> contributors = feed.getContributors();
for (int i = 0; i < contributors.size(); i++) {
Element contributorElement = new Element("contributor", getFeedNamespace());
fillPersonElement(contributorElement, (Person)contributors.get(i));
final Element contributorElement = new Element("contributor", getFeedNamespace());
fillPersonElement(contributorElement, contributors.get(i));
eFeed.addContent(contributorElement);
}
if (feed.getTagline() != null) {
Element taglineElement = new Element("tagline", getFeedNamespace());
final Element taglineElement = new Element("tagline", getFeedNamespace());
fillContentElement(taglineElement, feed.getTagline());
eFeed.addContent(taglineElement);
}
@ -157,44 +164,44 @@ public class Atom03Generator extends BaseWireFeedGenerator {
}
if (feed.getInfo() != null) {
Element infoElement = new Element("info", getFeedNamespace());
final Element infoElement = new Element("info", getFeedNamespace());
fillContentElement(infoElement, feed.getInfo());
eFeed.addContent(infoElement);
}
if (feed.getModified() != null) {
Element modifiedElement = new Element("modified", getFeedNamespace());
final Element modifiedElement = new Element("modified", getFeedNamespace());
modifiedElement.addContent(DateParser.formatW3CDateTime(feed.getModified()));
eFeed.addContent(modifiedElement);
}
}
protected void populateEntry(Entry entry, Element eEntry) throws FeedException {
protected void populateEntry(final Entry entry, final Element eEntry) throws FeedException {
if (entry.getTitleEx() != null) {
Element titleElement = new Element("title", getFeedNamespace());
final Element titleElement = new Element("title", getFeedNamespace());
fillContentElement(titleElement, entry.getTitleEx());
eEntry.addContent(titleElement);
}
List<Link> links = entry.getAlternateLinks();
for (int i = 0; i < links.size(); i++) {
eEntry.addContent(generateLinkElement((Link)links.get(i)));
eEntry.addContent(generateLinkElement(links.get(i)));
}
links = entry.getOtherLinks();
for (int i = 0; i < links.size(); i++) {
eEntry.addContent(generateLinkElement((Link)links.get(i)));
eEntry.addContent(generateLinkElement(links.get(i)));
}
if (entry.getAuthors()!=null && entry.getAuthors().size() > 0) {
Element authorElement = new Element("author", getFeedNamespace());
fillPersonElement(authorElement, (Person)entry.getAuthors().get(0));
if (entry.getAuthors() != null && entry.getAuthors().size() > 0) {
final Element authorElement = new Element("author", getFeedNamespace());
fillPersonElement(authorElement, entry.getAuthors().get(0));
eEntry.addContent(authorElement);
}
List<Person> contributors = entry.getContributors();
final List<Person> contributors = entry.getContributors();
for (int i = 0; i < contributors.size(); i++) {
Element contributorElement = new Element("contributor", getFeedNamespace());
fillPersonElement(contributorElement, (Person)contributors.get(i));
final Element contributorElement = new Element("contributor", getFeedNamespace());
fillPersonElement(contributorElement, contributors.get(i));
eEntry.addContent(contributorElement);
}
if (entry.getId() != null) {
@ -202,71 +209,69 @@ public class Atom03Generator extends BaseWireFeedGenerator {
}
if (entry.getModified() != null) {
Element modifiedElement = new Element("modified", getFeedNamespace());
final Element modifiedElement = new Element("modified", getFeedNamespace());
modifiedElement.addContent(DateParser.formatW3CDateTime(entry.getModified()));
eEntry.addContent(modifiedElement);
}
if (entry.getIssued() != null) {
Element issuedElement = new Element("issued", getFeedNamespace());
final Element issuedElement = new Element("issued", getFeedNamespace());
issuedElement.addContent(DateParser.formatW3CDateTime(entry.getIssued()));
eEntry.addContent(issuedElement);
}
if (entry.getCreated() != null) {
Element createdElement = new Element("created", getFeedNamespace());
final Element createdElement = new Element("created", getFeedNamespace());
createdElement.addContent(DateParser.formatW3CDateTime(entry.getCreated()));
eEntry.addContent(createdElement);
}
if (entry.getSummary() != null) {
Element summaryElement = new Element("summary", getFeedNamespace());
final Element summaryElement = new Element("summary", getFeedNamespace());
fillContentElement(summaryElement, entry.getSummary());
eEntry.addContent(summaryElement);
}
List<Content> contents = entry.getContents();
final List<Content> contents = entry.getContents();
for (int i = 0; i < contents.size(); i++) {
Element contentElement = new Element("content", getFeedNamespace());
fillContentElement(contentElement, (Content)contents.get(i));
final Element contentElement = new Element("content", getFeedNamespace());
fillContentElement(contentElement, contents.get(i));
eEntry.addContent(contentElement);
}
generateForeignMarkup(eEntry, (List<Element>)entry.getForeignMarkup());
generateForeignMarkup(eEntry, entry.getForeignMarkup());
}
protected void checkFeedHeaderConstraints(Element eFeed) throws FeedException {
protected void checkFeedHeaderConstraints(final Element eFeed) throws FeedException {
}
protected void checkEntriesConstraints(Element parent) throws FeedException {
protected void checkEntriesConstraints(final Element parent) throws FeedException {
}
protected void checkEntryConstraints(Element eEntry) throws FeedException {
protected void checkEntryConstraints(final Element eEntry) throws FeedException {
}
protected Element generateLinkElement(Link link) {
Element linkElement = new Element("link", getFeedNamespace());
protected Element generateLinkElement(final Link link) {
final Element linkElement = new Element("link", getFeedNamespace());
if (link.getRel() != null) {
Attribute relAttribute = new Attribute("rel", link.getRel().toString());
final Attribute relAttribute = new Attribute("rel", link.getRel().toString());
linkElement.setAttribute(relAttribute);
}
if (link.getType() != null) {
Attribute typeAttribute = new Attribute("type", link.getType());
final Attribute typeAttribute = new Attribute("type", link.getType());
linkElement.setAttribute(typeAttribute);
}
if (link.getHref() != null) {
Attribute hrefAttribute = new Attribute("href", link.getHref());
final Attribute hrefAttribute = new Attribute("href", link.getHref());
linkElement.setAttribute(hrefAttribute);
}
return linkElement;
}
protected void fillPersonElement(Element element, Person person) {
protected void fillPersonElement(final Element element, final Person person) {
if (person.getName() != null) {
element.addContent(generateSimpleElement("name", person.getName()));
}
@ -279,11 +284,11 @@ public class Atom03Generator extends BaseWireFeedGenerator {
}
}
protected Element generateTagLineElement(Content tagline) {
Element taglineElement = new Element("tagline", getFeedNamespace());
protected Element generateTagLineElement(final Content tagline) {
final Element taglineElement = new Element("tagline", getFeedNamespace());
if (tagline.getType() != null) {
Attribute typeAttribute = new Attribute("type", tagline.getType());
final Attribute typeAttribute = new Attribute("type", tagline.getType());
taglineElement.setAttribute(typeAttribute);
}
@ -293,17 +298,16 @@ public class Atom03Generator extends BaseWireFeedGenerator {
return taglineElement;
}
protected void fillContentElement(Element contentElement, Content content)
throws FeedException {
protected void fillContentElement(final Element contentElement, final Content content) throws FeedException {
if (content.getType() != null) {
Attribute typeAttribute = new Attribute("type", content.getType());
final Attribute typeAttribute = new Attribute("type", content.getType());
contentElement.setAttribute(typeAttribute);
}
String mode = content.getMode();
final String mode = content.getMode();
if (mode != null) {
Attribute modeAttribute = new Attribute("mode", content.getMode().toString());
final Attribute modeAttribute = new Attribute("mode", content.getMode().toString());
contentElement.setAttribute(modeAttribute);
}
@ -315,36 +319,35 @@ public class Atom03Generator extends BaseWireFeedGenerator {
contentElement.addContent(Base64.encode(content.getValue()));
} else if (mode.equals(Content.XML)) {
StringBuffer tmpDocString = new StringBuffer("<tmpdoc>");
final StringBuffer tmpDocString = new StringBuffer("<tmpdoc>");
tmpDocString.append(content.getValue());
tmpDocString.append("</tmpdoc>");
StringReader tmpDocReader = new StringReader(tmpDocString.toString());
final StringReader tmpDocReader = new StringReader(tmpDocString.toString());
Document tmpDoc;
try {
SAXBuilder saxBuilder = new SAXBuilder();
final SAXBuilder saxBuilder = new SAXBuilder();
tmpDoc = saxBuilder.build(tmpDocReader);
}
catch (Exception ex) {
throw new FeedException("Invalid XML",ex);
} catch (final Exception ex) {
throw new FeedException("Invalid XML", ex);
}
List<org.jdom2.Content> children = tmpDoc.getRootElement().removeContent();
final List<org.jdom2.Content> children = tmpDoc.getRootElement().removeContent();
contentElement.addContent(children);
}
}
}
protected Element generateGeneratorElement(Generator generator) {
Element generatorElement = new Element("generator", getFeedNamespace());
protected Element generateGeneratorElement(final Generator generator) {
final Element generatorElement = new Element("generator", getFeedNamespace());
if (generator.getUrl() != null) {
Attribute urlAttribute = new Attribute("url", generator.getUrl());
final Attribute urlAttribute = new Attribute("url", generator.getUrl());
generatorElement.setAttribute(urlAttribute);
}
if (generator.getVersion() != null) {
Attribute versionAttribute = new Attribute("version", generator.getVersion());
final Attribute versionAttribute = new Attribute("version", generator.getVersion());
generatorElement.setAttribute(versionAttribute);
}
@ -356,8 +359,8 @@ public class Atom03Generator extends BaseWireFeedGenerator {
}
protected Element generateSimpleElement(String name, String value) {
Element element = new Element(name, getFeedNamespace());
protected Element generateSimpleElement(final String name, final String value) {
final Element element = new Element(name, getFeedNamespace());
element.addContent(value);
return element;
}

View file

@ -16,15 +16,22 @@
*/
package com.sun.syndication.io.impl;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.atom.*;
import com.sun.syndication.io.FeedException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.Namespace;
import org.jdom2.output.XMLOutputter;
import java.util.*;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.atom.Content;
import com.sun.syndication.feed.atom.Entry;
import com.sun.syndication.feed.atom.Generator;
import com.sun.syndication.feed.atom.Link;
import com.sun.syndication.feed.atom.Person;
import com.sun.syndication.io.FeedException;
/**
*/
@ -36,7 +43,7 @@ public class Atom03Parser extends BaseWireFeedParser {
this("atom_0.3", ATOM_03_NS);
}
protected Atom03Parser(String type, Namespace ns) {
protected Atom03Parser(final String type, final Namespace ns) {
super(type, ns);
}
@ -44,186 +51,187 @@ public class Atom03Parser extends BaseWireFeedParser {
return ATOM_03_NS;
}
public boolean isMyType(Document document) {
Element rssRoot = document.getRootElement();
Namespace defaultNS = rssRoot.getNamespace();
return (defaultNS!=null) && defaultNS.equals(getAtomNamespace());
@Override
public boolean isMyType(final Document document) {
final Element rssRoot = document.getRootElement();
final Namespace defaultNS = rssRoot.getNamespace();
return defaultNS != null && defaultNS.equals(getAtomNamespace());
}
public WireFeed parse(Document document, boolean validate) throws IllegalArgumentException,FeedException {
@Override
public WireFeed parse(final Document document, final boolean validate) throws IllegalArgumentException, FeedException {
if (validate) {
validateFeed(document);
}
Element rssRoot = document.getRootElement();
final Element rssRoot = document.getRootElement();
return parseFeed(rssRoot);
}
protected void validateFeed(Document document) throws FeedException {
protected void validateFeed(final Document document) throws FeedException {
// TBD
// here we have to validate the Feed against a schema or whatever
// not sure how to do it
// one posibility would be to produce an ouput and attempt to parse it again
// one posibility would be to produce an ouput and attempt to parse it
// again
// with validation turned on.
// otherwise will have to check the document elements by hand.
}
protected WireFeed parseFeed(Element eFeed) {
protected WireFeed parseFeed(final Element eFeed) {
com.sun.syndication.feed.atom.Feed feed = new com.sun.syndication.feed.atom.Feed(getType());
final com.sun.syndication.feed.atom.Feed feed = new com.sun.syndication.feed.atom.Feed(getType());
Element e = eFeed.getChild("title",getAtomNamespace());
if (e!=null) {
Element e = eFeed.getChild("title", getAtomNamespace());
if (e != null) {
feed.setTitleEx(parseContent(e));
}
List<Element> eList = eFeed.getChildren("link",getAtomNamespace());
List<Element> eList = eFeed.getChildren("link", getAtomNamespace());
feed.setAlternateLinks(parseAlternateLinks(eList));
feed.setOtherLinks(parseOtherLinks(eList));
e = eFeed.getChild("author",getAtomNamespace());
if (e!=null) {
List<Person> authors = new ArrayList<Person>();
e = eFeed.getChild("author", getAtomNamespace());
if (e != null) {
final List<Person> authors = new ArrayList<Person>();
authors.add(parsePerson(e));
feed.setAuthors(authors);
}
eList = eFeed.getChildren("contributor",getAtomNamespace());
if (eList.size()>0) {
eList = eFeed.getChildren("contributor", getAtomNamespace());
if (eList.size() > 0) {
feed.setContributors(parsePersons(eList));
}
e = eFeed.getChild("tagline",getAtomNamespace());
if (e!=null) {
e = eFeed.getChild("tagline", getAtomNamespace());
if (e != null) {
feed.setTagline(parseContent(e));
}
e = eFeed.getChild("id",getAtomNamespace());
if (e!=null) {
e = eFeed.getChild("id", getAtomNamespace());
if (e != null) {
feed.setId(e.getText());
}
e = eFeed.getChild("generator",getAtomNamespace());
if (e!=null) {
Generator gen = new Generator();
e = eFeed.getChild("generator", getAtomNamespace());
if (e != null) {
final Generator gen = new Generator();
gen.setValue(e.getText());
String att = getAttributeValue(e, "url");
if (att!=null) {
if (att != null) {
gen.setUrl(att);
}
att = getAttributeValue(e, "version");
if (att!=null) {
if (att != null) {
gen.setVersion(att);
}
feed.setGenerator(gen);
}
e = eFeed.getChild("copyright",getAtomNamespace());
if (e!=null) {
e = eFeed.getChild("copyright", getAtomNamespace());
if (e != null) {
feed.setCopyright(e.getText());
}
e = eFeed.getChild("info",getAtomNamespace());
if (e!=null) {
e = eFeed.getChild("info", getAtomNamespace());
if (e != null) {
feed.setInfo(parseContent(e));
}
e = eFeed.getChild("modified",getAtomNamespace());
if (e!=null) {
e = eFeed.getChild("modified", getAtomNamespace());
if (e != null) {
feed.setModified(DateParser.parseDate(e.getText()));
}
feed.setModules(parseFeedModules(eFeed));
eList = eFeed.getChildren("entry",getAtomNamespace());
if (eList.size()>0) {
eList = eFeed.getChildren("entry", getAtomNamespace());
if (eList.size() > 0) {
feed.setEntries(parseEntries(eList));
}
List<Element> foreignMarkup =
extractForeignMarkup(eFeed, feed, getAtomNamespace());
final List<Element> foreignMarkup = extractForeignMarkup(eFeed, feed, getAtomNamespace());
if (foreignMarkup.size() > 0) {
feed.setForeignMarkup(foreignMarkup);
}
return feed;
}
private Link parseLink(Element eLink) {
Link link = new Link();
private Link parseLink(final Element eLink) {
final Link link = new Link();
String att = getAttributeValue(eLink, "rel");
if (att!=null) {
if (att != null) {
link.setRel(att);
}
att = getAttributeValue(eLink, "type");
if (att!=null) {
if (att != null) {
link.setType(att);
}
att = getAttributeValue(eLink, "href");
if (att!=null) {
if (att != null) {
link.setHref(att);
}
return link;
}
// List(Elements) -> List(Link)
private List<Link> parseLinks(List<Element> eLinks,boolean alternate) {
List<Link> links = new ArrayList<Link>();
for (int i=0;i<eLinks.size();i++) {
Element eLink = (Element) eLinks.get(i);
String rel = getAttributeValue(eLink, "rel");
private List<Link> parseLinks(final List<Element> eLinks, final boolean alternate) {
final List<Link> links = new ArrayList<Link>();
for (int i = 0; i < eLinks.size(); i++) {
final Element eLink = eLinks.get(i);
final String rel = getAttributeValue(eLink, "rel");
if (alternate) {
if ("alternate".equals(rel)) {
links.add(parseLink(eLink));
}
}
else {
if (!("alternate".equals(rel))) {
} else {
if (!"alternate".equals(rel)) {
links.add(parseLink(eLink));
}
}
}
return (links.size()>0) ? links : null;
return links.size() > 0 ? links : null;
}
// List(Elements) -> List(Link)
private List<Link> parseAlternateLinks(List<Element> eLinks) {
return parseLinks(eLinks,true);
private List<Link> parseAlternateLinks(final List<Element> eLinks) {
return parseLinks(eLinks, true);
}
// List(Elements) -> List(Link)
private List<Link> parseOtherLinks(List<Element> eLinks) {
return parseLinks(eLinks,false);
private List<Link> parseOtherLinks(final List<Element> eLinks) {
return parseLinks(eLinks, false);
}
private Person parsePerson(Element ePerson) {
Person person = new Person();
Element e = ePerson.getChild("name",getAtomNamespace());
if (e!=null) {
private Person parsePerson(final Element ePerson) {
final Person person = new Person();
Element e = ePerson.getChild("name", getAtomNamespace());
if (e != null) {
person.setName(e.getText());
}
e = ePerson.getChild("url",getAtomNamespace());
if (e!=null) {
e = ePerson.getChild("url", getAtomNamespace());
if (e != null) {
person.setUrl(e.getText());
}
e = ePerson.getChild("email",getAtomNamespace());
if (e!=null) {
e = ePerson.getChild("email", getAtomNamespace());
if (e != null) {
person.setEmail(e.getText());
}
return person;
}
// List(Elements) -> List(Persons)
private List<Person> parsePersons(List<Element> ePersons) {
List<Person> persons = new ArrayList<Person>();
for (int i=0;i<ePersons.size();i++) {
persons.add(parsePerson((Element)ePersons.get(i)));
private List<Person> parsePersons(final List<Element> ePersons) {
final List<Person> persons = new ArrayList<Person>();
for (int i = 0; i < ePersons.size(); i++) {
persons.add(parsePerson(ePersons.get(i)));
}
return (persons.size()>0) ? persons : null;
return persons.size() > 0 ? persons : null;
}
private Content parseContent(Element e) {
private Content parseContent(final Element e) {
String value = null;
String type = getAttributeValue(e, "type");
type = (type!=null) ? type : "text/plain";
type = type != null ? type : "text/plain";
String mode = getAttributeValue(e, "mode");
if (mode == null) {
mode = Content.XML; // default to xml content
@ -231,29 +239,25 @@ public class Atom03Parser extends BaseWireFeedParser {
if (mode.equals(Content.ESCAPED)) {
// do nothing XML Parser took care of this
value = e.getText();
}
else
if (mode.equals(Content.BASE64)) {
} else if (mode.equals(Content.BASE64)) {
value = Base64.decode(e.getText());
}
else
if (mode.equals(Content.XML)) {
XMLOutputter outputter = new XMLOutputter();
List<org.jdom2.Content> eContent = e.getContent();
Iterator<org.jdom2.Content> i = eContent.iterator();
} else if (mode.equals(Content.XML)) {
final XMLOutputter outputter = new XMLOutputter();
final List<org.jdom2.Content> eContent = e.getContent();
final Iterator<org.jdom2.Content> i = eContent.iterator();
while (i.hasNext()) {
org.jdom2.Content c = (org.jdom2.Content) i.next();
final org.jdom2.Content c = i.next();
if (c instanceof Element) {
Element eC = (Element) c;
final Element eC = (Element) c;
if (eC.getNamespace().equals(getAtomNamespace())) {
((Element)c).setNamespace(Namespace.NO_NAMESPACE);
((Element) c).setNamespace(Namespace.NO_NAMESPACE);
}
}
}
value = outputter.outputString(eContent);
}
Content content = new Content();
final Content content = new Content();
content.setType(type);
content.setMode(mode);
content.setValue(value);
@ -261,81 +265,79 @@ public class Atom03Parser extends BaseWireFeedParser {
}
// List(Elements) -> List(Entries)
private List<Entry> parseEntries(List<Element> eEntries) {
List<Entry> entries = new ArrayList<Entry>();
for (int i=0;i<eEntries.size();i++) {
entries.add(parseEntry((Element)eEntries.get(i)));
private List<Entry> parseEntries(final List<Element> eEntries) {
final List<Entry> entries = new ArrayList<Entry>();
for (int i = 0; i < eEntries.size(); i++) {
entries.add(parseEntry(eEntries.get(i)));
}
return (entries.size()>0) ? entries : null;
return entries.size() > 0 ? entries : null;
}
private Entry parseEntry(Element eEntry) {
Entry entry = new Entry();
private Entry parseEntry(final Element eEntry) {
final Entry entry = new Entry();
Element e = eEntry.getChild("title",getAtomNamespace());
if (e!=null) {
Element e = eEntry.getChild("title", getAtomNamespace());
if (e != null) {
entry.setTitleEx(parseContent(e));
}
List<Element> eList = eEntry.getChildren("link",getAtomNamespace());
List<Element> eList = eEntry.getChildren("link", getAtomNamespace());
entry.setAlternateLinks(parseAlternateLinks(eList));
entry.setOtherLinks(parseOtherLinks(eList));
e = eEntry.getChild("author",getAtomNamespace());
if (e!=null) {
List<Person> authors = new ArrayList<Person>();
e = eEntry.getChild("author", getAtomNamespace());
if (e != null) {
final List<Person> authors = new ArrayList<Person>();
authors.add(parsePerson(e));
entry.setAuthors(authors);
}
eList = eEntry.getChildren("contributor",getAtomNamespace());
if (eList.size()>0) {
eList = eEntry.getChildren("contributor", getAtomNamespace());
if (eList.size() > 0) {
entry.setContributors(parsePersons(eList));
}
e = eEntry.getChild("id",getAtomNamespace());
if (e!=null) {
e = eEntry.getChild("id", getAtomNamespace());
if (e != null) {
entry.setId(e.getText());
}
e = eEntry.getChild("modified",getAtomNamespace());
if (e!=null) {
e = eEntry.getChild("modified", getAtomNamespace());
if (e != null) {
entry.setModified(DateParser.parseDate(e.getText()));
}
e = eEntry.getChild("issued",getAtomNamespace());
if (e!=null) {
e = eEntry.getChild("issued", getAtomNamespace());
if (e != null) {
entry.setIssued(DateParser.parseDate(e.getText()));
}
e = eEntry.getChild("created",getAtomNamespace());
if (e!=null) {
e = eEntry.getChild("created", getAtomNamespace());
if (e != null) {
entry.setCreated(DateParser.parseDate(e.getText()));
}
e = eEntry.getChild("summary",getAtomNamespace());
if (e!=null) {
e = eEntry.getChild("summary", getAtomNamespace());
if (e != null) {
entry.setSummary(parseContent(e));
}
eList = eEntry.getChildren("content",getAtomNamespace());
if (eList.size()>0) {
List<Content> content = new ArrayList<Content>();
for (int i=0;i<eList.size();i++) {
content.add(parseContent((Element)eList.get(i)));
eList = eEntry.getChildren("content", getAtomNamespace());
if (eList.size() > 0) {
final List<Content> content = new ArrayList<Content>();
for (int i = 0; i < eList.size(); i++) {
content.add(parseContent(eList.get(i)));
}
entry.setContents(content);
}
entry.setModules(parseItemModules(eEntry));
List<Element> foreignMarkup =
extractForeignMarkup(eEntry, entry, getAtomNamespace());
final List<Element> foreignMarkup = extractForeignMarkup(eEntry, entry, getAtomNamespace());
if (foreignMarkup.size() > 0) {
entry.setForeignMarkup(foreignMarkup);
}
return entry;
}
}

View file

@ -16,8 +16,10 @@
*/
package com.sun.syndication.io.impl;
import java.io.IOException;
import java.io.StringReader;
import java.util.Iterator;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import org.jdom2.Attribute;
@ -25,6 +27,7 @@ import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.Namespace;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.XMLOutputter;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.atom.Category;
@ -36,10 +39,6 @@ import com.sun.syndication.feed.atom.Link;
import com.sun.syndication.feed.atom.Person;
import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.WireFeedOutput;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import org.jdom2.output.XMLOutputter;
/**
* Feed Generator for Atom
@ -54,42 +53,43 @@ public class Atom10Generator extends BaseWireFeedGenerator {
private static final String ATOM_10_URI = "http://www.w3.org/2005/Atom";
private static final Namespace ATOM_NS = Namespace.getNamespace(ATOM_10_URI);
private String _version;
private final String _version;
public Atom10Generator() {
this("atom_1.0","1.0");
this("atom_1.0", "1.0");
}
protected Atom10Generator(String type,String version) {
protected Atom10Generator(final String type, final String version) {
super(type);
_version = version;
this._version = version;
}
protected String getVersion() {
return _version;
return this._version;
}
protected Namespace getFeedNamespace() {
return ATOM_NS;
}
public Document generate(WireFeed wFeed) throws FeedException {
Feed feed = (Feed) wFeed;
Element root = createRootElement(feed);
populateFeed(feed,root);
@Override
public Document generate(final WireFeed wFeed) throws FeedException {
final Feed feed = (Feed) wFeed;
final Element root = createRootElement(feed);
populateFeed(feed, root);
purgeUnusedNamespaceDeclarations(root);
return createDocument(root);
}
protected Document createDocument(Element root) {
protected Document createDocument(final Element root) {
return new Document(root);
}
protected Element createRootElement(Feed feed) {
Element root = new Element("feed",getFeedNamespace());
protected Element createRootElement(final Feed feed) {
final Element root = new Element("feed", getFeedNamespace());
root.addNamespaceDeclaration(getFeedNamespace());
//Attribute version = new Attribute("version", getVersion());
//root.setAttribute(version);
// Attribute version = new Attribute("version", getVersion());
// root.setAttribute(version);
if (feed.getXmlBase() != null) {
root.setAttribute("base", feed.getXmlBase(), Namespace.XML_NAMESPACE);
}
@ -97,80 +97,86 @@ public class Atom10Generator extends BaseWireFeedGenerator {
return root;
}
protected void populateFeed(Feed feed,Element parent) throws FeedException {
addFeed(feed,parent);
addEntries(feed,parent);
protected void populateFeed(final Feed feed, final Element parent) throws FeedException {
addFeed(feed, parent);
addEntries(feed, parent);
}
protected void addFeed(Feed feed,Element parent) throws FeedException {
Element eFeed = parent;
populateFeedHeader(feed,eFeed);
generateForeignMarkup(eFeed, (List<Element>)feed.getForeignMarkup());
protected void addFeed(final Feed feed, final Element parent) throws FeedException {
final Element eFeed = parent;
populateFeedHeader(feed, eFeed);
generateForeignMarkup(eFeed, feed.getForeignMarkup());
checkFeedHeaderConstraints(eFeed);
generateFeedModules(feed.getModules(),eFeed);
generateFeedModules(feed.getModules(), eFeed);
}
protected void addEntries(Feed feed,Element parent) throws FeedException {
List<Entry> items = feed.getEntries();
for (int i=0;i<items.size();i++) {
addEntry((Entry)items.get(i),parent);
protected void addEntries(final Feed feed, final Element parent) throws FeedException {
final List<Entry> items = feed.getEntries();
for (int i = 0; i < items.size(); i++) {
addEntry(items.get(i), parent);
}
checkEntriesConstraints(parent);
}
protected void addEntry(Entry entry,Element parent) throws FeedException {
Element eEntry = new Element("entry", getFeedNamespace());
protected void addEntry(final Entry entry, final Element parent) throws FeedException {
final Element eEntry = new Element("entry", getFeedNamespace());
if (entry.getXmlBase() != null) {
eEntry.setAttribute("base", entry.getXmlBase(), Namespace.XML_NAMESPACE);
}
populateEntry(entry,eEntry);
generateForeignMarkup(eEntry, (List<Element>)entry.getForeignMarkup());
populateEntry(entry, eEntry);
generateForeignMarkup(eEntry, entry.getForeignMarkup());
checkEntryConstraints(eEntry);
generateItemModules(entry.getModules(),eEntry);
generateItemModules(entry.getModules(), eEntry);
parent.addContent(eEntry);
}
protected void populateFeedHeader(Feed feed,Element eFeed) throws FeedException {
protected void populateFeedHeader(final Feed feed, final Element eFeed) throws FeedException {
if (feed.getTitleEx() != null) {
Element titleElement = new Element("title", getFeedNamespace());
final Element titleElement = new Element("title", getFeedNamespace());
fillContentElement(titleElement, feed.getTitleEx());
eFeed.addContent(titleElement);
}
List<Link> links = feed.getAlternateLinks();
if (links != null) for (int i = 0; i < links.size(); i++) {
eFeed.addContent(generateLinkElement((Link)links.get(i)));
if (links != null) {
for (int i = 0; i < links.size(); i++) {
eFeed.addContent(generateLinkElement(links.get(i)));
}
}
links = feed.getOtherLinks();
if (links != null) for (int j = 0; j < links.size(); j++) {
eFeed.addContent(generateLinkElement((Link)links.get(j)));
if (links != null) {
for (int j = 0; j < links.size(); j++) {
eFeed.addContent(generateLinkElement(links.get(j)));
}
}
List<Category> cats = feed.getCategories();
if (cats != null) for (Iterator<Category> iter=cats.iterator(); iter.hasNext();) {
eFeed.addContent(generateCategoryElement((Category)iter.next()));
final List<Category> cats = feed.getCategories();
if (cats != null) {
for (final Category category : cats) {
eFeed.addContent(generateCategoryElement(category));
}
}
List<Person> authors = feed.getAuthors();
final List<Person> authors = feed.getAuthors();
if (authors != null && authors.size() > 0) {
for (int i = 0; i < authors.size(); i++) {
Element authorElement = new Element("author", getFeedNamespace());
fillPersonElement(authorElement, (Person)feed.getAuthors().get(i));
final Element authorElement = new Element("author", getFeedNamespace());
fillPersonElement(authorElement, feed.getAuthors().get(i));
eFeed.addContent(authorElement);
}
}
List<Person> contributors = feed.getContributors();
final List<Person> contributors = feed.getContributors();
if (contributors != null && contributors.size() > 0) {
for (int i = 0; i < contributors.size(); i++) {
Element contributorElement = new Element("contributor", getFeedNamespace());
fillPersonElement(contributorElement, (Person)contributors.get(i));
final Element contributorElement = new Element("contributor", getFeedNamespace());
fillPersonElement(contributorElement, contributors.get(i));
eFeed.addContent(contributorElement);
}
}
if (feed.getSubtitle() != null) {
Element subtitleElement = new Element("subtitle", getFeedNamespace());
final Element subtitleElement = new Element("subtitle", getFeedNamespace());
fillContentElement(subtitleElement, feed.getSubtitle());
eFeed.addContent(subtitleElement);
}
@ -196,52 +202,52 @@ public class Atom10Generator extends BaseWireFeedGenerator {
}
if (feed.getUpdated() != null) {
Element updatedElement = new Element("updated", getFeedNamespace());
final Element updatedElement = new Element("updated", getFeedNamespace());
updatedElement.addContent(DateParser.formatW3CDateTime(feed.getUpdated()));
eFeed.addContent(updatedElement);
}
}
protected void populateEntry(Entry entry, Element eEntry) throws FeedException {
protected void populateEntry(final Entry entry, final Element eEntry) throws FeedException {
if (entry.getTitleEx() != null) {
Element titleElement = new Element("title", getFeedNamespace());
final Element titleElement = new Element("title", getFeedNamespace());
fillContentElement(titleElement, entry.getTitleEx());
eEntry.addContent(titleElement);
}
List<Link> links = entry.getAlternateLinks();
if (links != null) {
for (int i = 0; i < links.size(); i++) {
eEntry.addContent(generateLinkElement((Link)links.get(i)));
eEntry.addContent(generateLinkElement(links.get(i)));
}
}
links = entry.getOtherLinks();
if (links != null) {
for (int i = 0; i < links.size(); i++) {
eEntry.addContent(generateLinkElement((Link)links.get(i)));
eEntry.addContent(generateLinkElement(links.get(i)));
}
}
List<Category> cats = entry.getCategories();
final List<Category> cats = entry.getCategories();
if (cats != null) {
for (int i = 0; i < cats.size(); i++) {
eEntry.addContent(generateCategoryElement((Category)cats.get(i)));
eEntry.addContent(generateCategoryElement(cats.get(i)));
}
}
List<Person> authors = entry.getAuthors();
final List<Person> authors = entry.getAuthors();
if (authors != null && authors.size() > 0) {
for (int i = 0; i < authors.size(); i++) {
Element authorElement = new Element("author", getFeedNamespace());
fillPersonElement(authorElement, (Person)entry.getAuthors().get(i));
final Element authorElement = new Element("author", getFeedNamespace());
fillPersonElement(authorElement, entry.getAuthors().get(i));
eEntry.addContent(authorElement);
}
}
List<Person> contributors = entry.getContributors();
final List<Person> contributors = entry.getContributors();
if (contributors != null && contributors.size() > 0) {
for (int i = 0; i < contributors.size(); i++) {
Element contributorElement = new Element("contributor", getFeedNamespace());
fillPersonElement(contributorElement, (Person)contributors.get(i));
final Element contributorElement = new Element("contributor", getFeedNamespace());
fillPersonElement(contributorElement, contributors.get(i));
eEntry.addContent(contributorElement);
}
}
@ -250,102 +256,100 @@ public class Atom10Generator extends BaseWireFeedGenerator {
}
if (entry.getUpdated() != null) {
Element updatedElement = new Element("updated", getFeedNamespace());
final Element updatedElement = new Element("updated", getFeedNamespace());
updatedElement.addContent(DateParser.formatW3CDateTime(entry.getUpdated()));
eEntry.addContent(updatedElement);
}
if (entry.getPublished() != null) {
Element publishedElement = new Element("published", getFeedNamespace());
final Element publishedElement = new Element("published", getFeedNamespace());
publishedElement.addContent(DateParser.formatW3CDateTime(entry.getPublished()));
eEntry.addContent(publishedElement);
}
if (entry.getContents() != null && entry.getContents().size() > 0) {
Element contentElement = new Element("content", getFeedNamespace());
Content content = (Content)entry.getContents().get(0);
final Element contentElement = new Element("content", getFeedNamespace());
final Content content = entry.getContents().get(0);
fillContentElement(contentElement, content);
eEntry.addContent(contentElement);
}
if (entry.getSummary() != null) {
Element summaryElement = new Element("summary", getFeedNamespace());
final Element summaryElement = new Element("summary", getFeedNamespace());
fillContentElement(summaryElement, entry.getSummary());
eEntry.addContent(summaryElement);
}
if (entry.getSource() != null) {
Element sourceElement = new Element("source", getFeedNamespace());
final Element sourceElement = new Element("source", getFeedNamespace());
populateFeedHeader(entry.getSource(), sourceElement);
eEntry.addContent(sourceElement);
}
}
protected void checkFeedHeaderConstraints(Element eFeed) throws FeedException {
protected void checkFeedHeaderConstraints(final Element eFeed) throws FeedException {
}
protected void checkEntriesConstraints(Element parent) throws FeedException {
protected void checkEntriesConstraints(final Element parent) throws FeedException {
}
protected void checkEntryConstraints(Element eEntry) throws FeedException {
protected void checkEntryConstraints(final Element eEntry) throws FeedException {
}
protected Element generateCategoryElement(Category cat) {
Element catElement = new Element("category", getFeedNamespace());
protected Element generateCategoryElement(final Category cat) {
final Element catElement = new Element("category", getFeedNamespace());
if (cat.getTerm() != null) {
Attribute termAttribute = new Attribute("term", cat.getTerm());
final Attribute termAttribute = new Attribute("term", cat.getTerm());
catElement.setAttribute(termAttribute);
}
if (cat.getLabel() != null) {
Attribute labelAttribute = new Attribute("label", cat.getLabel());
final Attribute labelAttribute = new Attribute("label", cat.getLabel());
catElement.setAttribute(labelAttribute);
}
if (cat.getScheme() != null) {
Attribute schemeAttribute = new Attribute("scheme", cat.getScheme());
final Attribute schemeAttribute = new Attribute("scheme", cat.getScheme());
catElement.setAttribute(schemeAttribute);
}
return catElement;
}
protected Element generateLinkElement(Link link) {
Element linkElement = new Element("link", getFeedNamespace());
protected Element generateLinkElement(final Link link) {
final Element linkElement = new Element("link", getFeedNamespace());
if (link.getRel() != null) {
Attribute relAttribute = new Attribute("rel", link.getRel());
final Attribute relAttribute = new Attribute("rel", link.getRel());
linkElement.setAttribute(relAttribute);
}
if (link.getType() != null) {
Attribute typeAttribute = new Attribute("type", link.getType());
final Attribute typeAttribute = new Attribute("type", link.getType());
linkElement.setAttribute(typeAttribute);
}
if (link.getHref() != null) {
Attribute hrefAttribute = new Attribute("href", link.getHref());
final Attribute hrefAttribute = new Attribute("href", link.getHref());
linkElement.setAttribute(hrefAttribute);
}
if (link.getHreflang() != null) {
Attribute hreflangAttribute = new Attribute("hreflang", link.getHreflang());
final Attribute hreflangAttribute = new Attribute("hreflang", link.getHreflang());
linkElement.setAttribute(hreflangAttribute);
}
if (link.getTitle() != null) {
Attribute title = new Attribute("title", link.getTitle());
final Attribute title = new Attribute("title", link.getTitle());
linkElement.setAttribute(title);
}
if (link.getLength() != 0) {
Attribute lenght = new Attribute("length", Long.toString(link.getLength()));
final Attribute lenght = new Attribute("length", Long.toString(link.getLength()));
linkElement.setAttribute(lenght);
}
return linkElement;
}
protected void fillPersonElement(Element element, Person person) {
protected void fillPersonElement(final Element element, final Person person) {
if (person.getName() != null) {
element.addContent(generateSimpleElement("name", person.getName()));
}
@ -359,11 +363,11 @@ public class Atom10Generator extends BaseWireFeedGenerator {
generatePersonModules(person.getModules(), element);
}
protected Element generateTagLineElement(Content tagline) {
Element taglineElement = new Element("subtitle", getFeedNamespace());
protected Element generateTagLineElement(final Content tagline) {
final Element taglineElement = new Element("subtitle", getFeedNamespace());
if (tagline.getType() != null) {
Attribute typeAttribute = new Attribute("type", tagline.getType());
final Attribute typeAttribute = new Attribute("type", tagline.getType());
taglineElement.setAttribute(typeAttribute);
}
@ -373,43 +377,44 @@ public class Atom10Generator extends BaseWireFeedGenerator {
return taglineElement;
}
protected void fillContentElement(Element contentElement, Content content)
throws FeedException {
protected void fillContentElement(final Element contentElement, final Content content) throws FeedException {
String type = content.getType();
final String type = content.getType();
String atomType = type;
if (type != null) {
// Fix for issue #39 "Atom 1.0 Text Types Not Set Correctly"
// we're not sure who set this value, so ensure Atom types are used
if ("text/plain".equals(type)) atomType = Content.TEXT;
else if ("text/html".equals(type)) atomType = Content.HTML;
else if ("application/xhtml+xml".equals(type)) atomType = Content.XHTML;
if ("text/plain".equals(type)) {
atomType = Content.TEXT;
} else if ("text/html".equals(type)) {
atomType = Content.HTML;
} else if ("application/xhtml+xml".equals(type)) {
atomType = Content.XHTML;
}
Attribute typeAttribute = new Attribute("type", atomType);
final Attribute typeAttribute = new Attribute("type", atomType);
contentElement.setAttribute(typeAttribute);
}
String href = content.getSrc();
final String href = content.getSrc();
if (href != null) {
Attribute srcAttribute = new Attribute("src", href);
final Attribute srcAttribute = new Attribute("src", href);
contentElement.setAttribute(srcAttribute);
}
if (content.getValue() != null) {
if (atomType != null && (atomType.equals(Content.XHTML) || (atomType.indexOf("/xml")) != -1 ||
(atomType.indexOf("+xml")) != -1)) {
if (atomType != null && (atomType.equals(Content.XHTML) || atomType.indexOf("/xml") != -1 || atomType.indexOf("+xml") != -1)) {
StringBuffer tmpDocString = new StringBuffer("<tmpdoc>");
final StringBuffer tmpDocString = new StringBuffer("<tmpdoc>");
tmpDocString.append(content.getValue());
tmpDocString.append("</tmpdoc>");
StringReader tmpDocReader = new StringReader(tmpDocString.toString());
final StringReader tmpDocReader = new StringReader(tmpDocString.toString());
Document tmpDoc;
try {
SAXBuilder saxBuilder = new SAXBuilder();
final SAXBuilder saxBuilder = new SAXBuilder();
tmpDoc = saxBuilder.build(tmpDocReader);
} catch (final Exception ex) {
throw new FeedException("Invalid XML", ex);
}
catch (Exception ex) {
throw new FeedException("Invalid XML",ex);
}
List<org.jdom2.Content> children = tmpDoc.getRootElement().removeContent();
final List<org.jdom2.Content> children = tmpDoc.getRootElement().removeContent();
contentElement.addContent(children);
} else {
// must be type html, text or some other non-XML format
@ -419,16 +424,16 @@ public class Atom10Generator extends BaseWireFeedGenerator {
}
}
protected Element generateGeneratorElement(Generator generator) {
Element generatorElement = new Element("generator", getFeedNamespace());
protected Element generateGeneratorElement(final Generator generator) {
final Element generatorElement = new Element("generator", getFeedNamespace());
if (generator.getUrl() != null) {
Attribute urlAttribute = new Attribute("uri", generator.getUrl());
final Attribute urlAttribute = new Attribute("uri", generator.getUrl());
generatorElement.setAttribute(urlAttribute);
}
if (generator.getVersion() != null) {
Attribute versionAttribute = new Attribute("version", generator.getVersion());
final Attribute versionAttribute = new Attribute("version", generator.getVersion());
generatorElement.setAttribute(versionAttribute);
}
@ -440,8 +445,8 @@ public class Atom10Generator extends BaseWireFeedGenerator {
}
protected Element generateSimpleElement(String name, String value) {
Element element = new Element(name, getFeedNamespace());
protected Element generateSimpleElement(final String name, final String value) {
final Element element = new Element(name, getFeedNamespace());
element.addContent(value);
return element;
}
@ -449,24 +454,23 @@ public class Atom10Generator extends BaseWireFeedGenerator {
/**
* Utility method to serialize an entry to writer.
*/
public static void serializeEntry(Entry entry, Writer writer)
throws IllegalArgumentException, FeedException, IOException {
public static void serializeEntry(final Entry entry, final Writer writer) throws IllegalArgumentException, FeedException, IOException {
// Build a feed containing only the entry
List<Entry> entries = new ArrayList<Entry>();
final List<Entry> entries = new ArrayList<Entry>();
entries.add(entry);
Feed feed1 = new Feed();
final Feed feed1 = new Feed();
feed1.setFeedType("atom_1.0");
feed1.setEntries(entries);
// Get Rome to output feed as a JDOM document
WireFeedOutput wireFeedOutput = new WireFeedOutput();
Document feedDoc = wireFeedOutput.outputJDom(feed1);
final WireFeedOutput wireFeedOutput = new WireFeedOutput();
final Document feedDoc = wireFeedOutput.outputJDom(feed1);
// Grab entry element from feed and get JDOM to serialize it
Element entryElement= (Element)feedDoc.getRootElement().getChildren().get(0);
final Element entryElement = feedDoc.getRootElement().getChildren().get(0);
XMLOutputter outputter = new XMLOutputter();
final XMLOutputter outputter = new XMLOutputter();
outputter.output(entryElement, writer);
}

View file

@ -16,13 +16,21 @@
*/
package com.sun.syndication.io.impl;
import java.io.IOException;
import java.io.Reader;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.Namespace;
import org.jdom2.Parent;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.XMLOutputter;
import com.sun.syndication.feed.WireFeed;
@ -36,17 +44,10 @@ import com.sun.syndication.feed.atom.Person;
import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.WireFeedInput;
import com.sun.syndication.io.WireFeedOutput;
import java.io.IOException;
import java.io.Reader;
import java.net.MalformedURLException;
import java.util.regex.Pattern;
import org.jdom2.Attribute;
import org.jdom2.JDOMException;
import org.jdom2.Parent;
import org.jdom2.input.SAXBuilder;
/**
* Parser for Atom 1.0
*
* @author Dave Johnson
*/
public class Atom10Parser extends BaseWireFeedParser {
@ -55,7 +56,7 @@ public class Atom10Parser extends BaseWireFeedParser {
private static boolean resolveURIs = false;
public static void setResolveURIs(boolean resolveURIs) {
public static void setResolveURIs(final boolean resolveURIs) {
Atom10Parser.resolveURIs = resolveURIs;
}
@ -67,7 +68,7 @@ public class Atom10Parser extends BaseWireFeedParser {
this("atom_1.0");
}
protected Atom10Parser(String type) {
protected Atom10Parser(final String type) {
super(type, ATOM_10_NS);
}
@ -75,169 +76,169 @@ public class Atom10Parser extends BaseWireFeedParser {
return ATOM_10_NS;
}
public boolean isMyType(Document document) {
Element rssRoot = document.getRootElement();
Namespace defaultNS = rssRoot.getNamespace();
return (defaultNS!=null) && defaultNS.equals(getAtomNamespace());
@Override
public boolean isMyType(final Document document) {
final Element rssRoot = document.getRootElement();
final Namespace defaultNS = rssRoot.getNamespace();
return defaultNS != null && defaultNS.equals(getAtomNamespace());
}
public WireFeed parse(Document document, boolean validate)
throws IllegalArgumentException,FeedException {
@Override
public WireFeed parse(final Document document, final boolean validate) throws IllegalArgumentException, FeedException {
if (validate) {
validateFeed(document);
}
Element rssRoot = document.getRootElement();
final Element rssRoot = document.getRootElement();
return parseFeed(rssRoot);
}
protected void validateFeed(Document document) throws FeedException {
protected void validateFeed(final Document document) throws FeedException {
// TBD
// here we have to validate the Feed against a schema or whatever
// not sure how to do it
// one posibility would be to produce an ouput and attempt to parse it again
// one posibility would be to produce an ouput and attempt to parse it
// again
// with validation turned on.
// otherwise will have to check the document elements by hand.
}
protected WireFeed parseFeed(Element eFeed) throws FeedException {
protected WireFeed parseFeed(final Element eFeed) throws FeedException {
String baseURI = null;
try {
baseURI = findBaseURI(eFeed);
} catch (Exception e) {
} catch (final Exception e) {
throw new FeedException("ERROR while finding base URI of feed", e);
}
Feed feed = parseFeedMetadata(baseURI, eFeed);
final Feed feed = parseFeedMetadata(baseURI, eFeed);
String xmlBase = eFeed.getAttributeValue("base", Namespace.XML_NAMESPACE);
final String xmlBase = eFeed.getAttributeValue("base", Namespace.XML_NAMESPACE);
if (xmlBase != null) {
feed.setXmlBase(xmlBase);
}
feed.setModules(parseFeedModules(eFeed));
List<Element> eList = eFeed.getChildren("entry",getAtomNamespace());
if (eList.size()>0) {
final List<Element> eList = eFeed.getChildren("entry", getAtomNamespace());
if (eList.size() > 0) {
feed.setEntries(parseEntries(feed, baseURI, eList));
}
List<Element> foreignMarkup =
extractForeignMarkup(eFeed, feed, getAtomNamespace());
final List<Element> foreignMarkup = extractForeignMarkup(eFeed, feed, getAtomNamespace());
if (foreignMarkup.size() > 0) {
feed.setForeignMarkup(foreignMarkup);
}
return feed;
}
private Feed parseFeedMetadata(String baseURI, Element eFeed) {
com.sun.syndication.feed.atom.Feed feed =
new com.sun.syndication.feed.atom.Feed(getType());
private Feed parseFeedMetadata(final String baseURI, final Element eFeed) {
final com.sun.syndication.feed.atom.Feed feed = new com.sun.syndication.feed.atom.Feed(getType());
Element e = eFeed.getChild("title",getAtomNamespace());
if (e!=null) {
Content c = new Content();
Element e = eFeed.getChild("title", getAtomNamespace());
if (e != null) {
final Content c = new Content();
c.setValue(parseTextConstructToString(e));
c.setType(getAttributeValue(e, "type"));
feed.setTitleEx(c);
}
List<Element> eList = eFeed.getChildren("link",getAtomNamespace());
List<Element> eList = eFeed.getChildren("link", getAtomNamespace());
feed.setAlternateLinks(parseAlternateLinks(feed, null, baseURI, eList));
feed.setOtherLinks(parseOtherLinks(feed, null, baseURI, eList));
List<Element> cList = eFeed.getChildren("category",getAtomNamespace());
final List<Element> cList = eFeed.getChildren("category", getAtomNamespace());
feed.setCategories(parseCategories(baseURI, cList));
eList = eFeed.getChildren("author", getAtomNamespace());
if (eList.size()>0) {
if (eList.size() > 0) {
feed.setAuthors(parsePersons(baseURI, eList));
}
eList = eFeed.getChildren("contributor",getAtomNamespace());
if (eList.size()>0) {
eList = eFeed.getChildren("contributor", getAtomNamespace());
if (eList.size() > 0) {
feed.setContributors(parsePersons(baseURI, eList));
}
e = eFeed.getChild("subtitle",getAtomNamespace());
if (e!=null) {
Content subtitle = new Content();
e = eFeed.getChild("subtitle", getAtomNamespace());
if (e != null) {
final Content subtitle = new Content();
subtitle.setValue(parseTextConstructToString(e));
subtitle.setType(getAttributeValue(e, "type"));
feed.setSubtitle(subtitle);
}
e = eFeed.getChild("id",getAtomNamespace());
if (e!=null) {
e = eFeed.getChild("id", getAtomNamespace());
if (e != null) {
feed.setId(e.getText());
}
e = eFeed.getChild("generator",getAtomNamespace());
if (e!=null) {
Generator gen = new Generator();
e = eFeed.getChild("generator", getAtomNamespace());
if (e != null) {
final Generator gen = new Generator();
gen.setValue(e.getText());
String att = getAttributeValue(e, "uri");
if (att!=null) {
if (att != null) {
gen.setUrl(att);
}
att = getAttributeValue(e, "version");
if (att!=null) {
if (att != null) {
gen.setVersion(att);
}
feed.setGenerator(gen);
}
e = eFeed.getChild("rights",getAtomNamespace());
if (e!=null) {
e = eFeed.getChild("rights", getAtomNamespace());
if (e != null) {
feed.setRights(parseTextConstructToString(e));
}
e = eFeed.getChild("icon",getAtomNamespace());
if (e!=null) {
e = eFeed.getChild("icon", getAtomNamespace());
if (e != null) {
feed.setIcon(e.getText());
}
e = eFeed.getChild("logo",getAtomNamespace());
if (e!=null) {
e = eFeed.getChild("logo", getAtomNamespace());
if (e != null) {
feed.setLogo(e.getText());
}
e = eFeed.getChild("updated",getAtomNamespace());
if (e!=null) {
e = eFeed.getChild("updated", getAtomNamespace());
if (e != null) {
feed.setUpdated(DateParser.parseDate(e.getText()));
}
return feed;
}
private Link parseLink(Feed feed , Entry entry, String baseURI, Element eLink) {
Link link = new Link();
private Link parseLink(final Feed feed, final Entry entry, final String baseURI, final Element eLink) {
final Link link = new Link();
String att = getAttributeValue(eLink, "rel");
if (att!=null) {
if (att != null) {
link.setRel(att);
}
att = getAttributeValue(eLink, "type");
if (att!=null) {
if (att != null) {
link.setType(att);
}
att = getAttributeValue(eLink, "href");
if (att!=null) {
if (att != null) {
link.setHref(att);
if (isRelativeURI(att)) {
link.setHrefResolved(resolveURI(baseURI, eLink, att));
}
}
att = getAttributeValue(eLink, "title");
if (att!=null) {
if (att != null) {
link.setTitle(att);
}
att = getAttributeValue(eLink, "hreflang");
if (att!=null) {
if (att != null) {
link.setHreflang(att);
}
att = getAttributeValue(eLink, "length");
if (att!=null) {
Long val = NumberParser.parseLong(att);
if (att != null) {
final Long val = NumberParser.parseLong(att);
if (val != null) {
link.setLength(val.longValue());
}
@ -246,47 +247,45 @@ public class Atom10Parser extends BaseWireFeedParser {
}
// List(Elements) -> List(Link)
private List<Link> parseAlternateLinks(Feed feed, Entry entry, String baseURI, List<Element> eLinks) {
List<Link> links = new ArrayList<Link>();
for (int i=0;i<eLinks.size();i++) {
Element eLink = (Element) eLinks.get(i);
Link link = parseLink(feed, entry, baseURI, eLink);
if (link.getRel() == null
|| "".equals(link.getRel().trim())
|| "alternate".equals(link.getRel())) {
private List<Link> parseAlternateLinks(final Feed feed, final Entry entry, final String baseURI, final List<Element> eLinks) {
final List<Link> links = new ArrayList<Link>();
for (int i = 0; i < eLinks.size(); i++) {
final Element eLink = eLinks.get(i);
final Link link = parseLink(feed, entry, baseURI, eLink);
if (link.getRel() == null || "".equals(link.getRel().trim()) || "alternate".equals(link.getRel())) {
links.add(link);
}
}
return (links.size()>0) ? links : null;
return links.size() > 0 ? links : null;
}
private List<Link> parseOtherLinks(Feed feed, Entry entry, String baseURI, List<Element> eLinks) {
List<Link> links = new ArrayList<Link>();
for (int i=0;i<eLinks.size();i++) {
Element eLink = (Element) eLinks.get(i);
Link link = parseLink(feed, entry, baseURI, eLink);
private List<Link> parseOtherLinks(final Feed feed, final Entry entry, final String baseURI, final List<Element> eLinks) {
final List<Link> links = new ArrayList<Link>();
for (int i = 0; i < eLinks.size(); i++) {
final Element eLink = eLinks.get(i);
final Link link = parseLink(feed, entry, baseURI, eLink);
if (!"alternate".equals(link.getRel())) {
links.add(link);
}
}
return (links.size()>0) ? links : null;
return links.size() > 0 ? links : null;
}
private Person parsePerson(String baseURI, Element ePerson) {
Person person = new Person();
Element e = ePerson.getChild("name",getAtomNamespace());
if (e!=null) {
private Person parsePerson(final String baseURI, final Element ePerson) {
final Person person = new Person();
Element e = ePerson.getChild("name", getAtomNamespace());
if (e != null) {
person.setName(e.getText());
}
e = ePerson.getChild("uri",getAtomNamespace());
if (e!=null) {
e = ePerson.getChild("uri", getAtomNamespace());
if (e != null) {
person.setUri(e.getText());
if (isRelativeURI(e.getText())) {
person.setUriResolved(resolveURI(baseURI, ePerson, e.getText()));
}
}
e = ePerson.getChild("email",getAtomNamespace());
if (e!=null) {
e = ePerson.getChild("email", getAtomNamespace());
if (e != null) {
person.setEmail(e.getText());
}
person.setModules(parsePersonModules(ePerson));
@ -294,40 +293,40 @@ public class Atom10Parser extends BaseWireFeedParser {
}
// List(Elements) -> List(Persons)
private List<Person> parsePersons(String baseURI, List<Element> ePersons) {
List<Person> persons = new ArrayList<Person>();
for (int i=0;i<ePersons.size();i++) {
persons.add(parsePerson(baseURI, (Element)ePersons.get(i)));
private List<Person> parsePersons(final String baseURI, final List<Element> ePersons) {
final List<Person> persons = new ArrayList<Person>();
for (int i = 0; i < ePersons.size(); i++) {
persons.add(parsePerson(baseURI, ePersons.get(i)));
}
return (persons.size()>0) ? persons : null;
return persons.size() > 0 ? persons : null;
}
private Content parseContent(Element e) {
String value = parseTextConstructToString(e);
String src = getAttributeValue(e, "src");
String type = getAttributeValue(e, "type");
Content content = new Content();
private Content parseContent(final Element e) {
final String value = parseTextConstructToString(e);
final String src = getAttributeValue(e, "src");
final String type = getAttributeValue(e, "type");
final Content content = new Content();
content.setSrc(src);
content.setType(type);
content.setValue(value);
return content;
}
private String parseTextConstructToString(Element e) {
private String parseTextConstructToString(final Element e) {
String value = null;
String type = getAttributeValue(e, "type");
type = (type!=null) ? type : Content.TEXT;
if (type.equals(Content.XHTML) || (type.indexOf("/xml")) != -1 || (type.indexOf("+xml")) != -1) {
type = type != null ? type : Content.TEXT;
if (type.equals(Content.XHTML) || type.indexOf("/xml") != -1 || type.indexOf("+xml") != -1) {
// XHTML content needs special handling
XMLOutputter outputter = new XMLOutputter();
List<org.jdom2.Content> eContent = e.getContent();
Iterator<org.jdom2.Content> i = eContent.iterator();
final XMLOutputter outputter = new XMLOutputter();
final List<org.jdom2.Content> eContent = e.getContent();
final Iterator<org.jdom2.Content> i = eContent.iterator();
while (i.hasNext()) {
org.jdom2.Content c = (org.jdom2.Content) i.next();
final org.jdom2.Content c = i.next();
if (c instanceof Element) {
Element eC = (Element) c;
final Element eC = (Element) c;
if (eC.getNamespace().equals(getAtomNamespace())) {
((Element)c).setNamespace(Namespace.NO_NAMESPACE);
((Element) c).setNamespace(Namespace.NO_NAMESPACE);
}
}
}
@ -340,119 +339,118 @@ public class Atom10Parser extends BaseWireFeedParser {
}
// List(Elements) -> List(Entries)
protected List<Entry> parseEntries(Feed feed, String baseURI, List<Element> eEntries) {
List<Entry> entries = new ArrayList<Entry>();
for (int i=0;i<eEntries.size();i++) {
entries.add(parseEntry(feed, (Element)eEntries.get(i), baseURI));
protected List<Entry> parseEntries(final Feed feed, final String baseURI, final List<Element> eEntries) {
final List<Entry> entries = new ArrayList<Entry>();
for (int i = 0; i < eEntries.size(); i++) {
entries.add(this.parseEntry(feed, eEntries.get(i), baseURI));
}
return (entries.size()>0) ? entries : null;
return entries.size() > 0 ? entries : null;
}
protected Entry parseEntry(Feed feed, Element eEntry, String baseURI) {
Entry entry = new Entry();
protected Entry parseEntry(final Feed feed, final Element eEntry, final String baseURI) {
final Entry entry = new Entry();
String xmlBase = eEntry.getAttributeValue("base", Namespace.XML_NAMESPACE);
final String xmlBase = eEntry.getAttributeValue("base", Namespace.XML_NAMESPACE);
if (xmlBase != null) {
entry.setXmlBase(xmlBase);
}
Element e = eEntry.getChild("title",getAtomNamespace());
if (e!=null) {
Content c = new Content();
Element e = eEntry.getChild("title", getAtomNamespace());
if (e != null) {
final Content c = new Content();
c.setValue(parseTextConstructToString(e));
c.setType(getAttributeValue(e, "type"));
entry.setTitleEx(c);
}
List<Element> eList = eEntry.getChildren("link",getAtomNamespace());
List<Element> eList = eEntry.getChildren("link", getAtomNamespace());
entry.setAlternateLinks(parseAlternateLinks(feed, entry, baseURI, eList));
entry.setOtherLinks(parseOtherLinks(feed, entry, baseURI, eList));
eList = eEntry.getChildren("author", getAtomNamespace());
if (eList.size()>0) {
if (eList.size() > 0) {
entry.setAuthors(parsePersons(baseURI, eList));
}
eList = eEntry.getChildren("contributor",getAtomNamespace());
if (eList.size()>0) {
eList = eEntry.getChildren("contributor", getAtomNamespace());
if (eList.size() > 0) {
entry.setContributors(parsePersons(baseURI, eList));
}
e = eEntry.getChild("id",getAtomNamespace());
if (e!=null) {
e = eEntry.getChild("id", getAtomNamespace());
if (e != null) {
entry.setId(e.getText());
}
e = eEntry.getChild("updated",getAtomNamespace());
if (e!=null) {
e = eEntry.getChild("updated", getAtomNamespace());
if (e != null) {
entry.setUpdated(DateParser.parseDate(e.getText()));
}
e = eEntry.getChild("published",getAtomNamespace());
if (e!=null) {
e = eEntry.getChild("published", getAtomNamespace());
if (e != null) {
entry.setPublished(DateParser.parseDate(e.getText()));
}
e = eEntry.getChild("summary",getAtomNamespace());
if (e!=null) {
e = eEntry.getChild("summary", getAtomNamespace());
if (e != null) {
entry.setSummary(parseContent(e));
}
e = eEntry.getChild("content",getAtomNamespace());
if (e!=null) {
List<Content> contents = new ArrayList<Content>();
e = eEntry.getChild("content", getAtomNamespace());
if (e != null) {
final List<Content> contents = new ArrayList<Content>();
contents.add(parseContent(e));
entry.setContents(contents);
}
e = eEntry.getChild("rights",getAtomNamespace());
if (e!=null) {
e = eEntry.getChild("rights", getAtomNamespace());
if (e != null) {
entry.setRights(e.getText());
}
List<Element> cList = eEntry.getChildren("category",getAtomNamespace());
final List<Element> cList = eEntry.getChildren("category", getAtomNamespace());
entry.setCategories(parseCategories(baseURI, cList));
// TODO: SHOULD handle Atom entry source element
e = eEntry.getChild("source", getAtomNamespace());
if (e!=null) {
if (e != null) {
entry.setSource(parseFeedMetadata(baseURI, e));
}
entry.setModules(parseItemModules(eEntry));
List<Element> foreignMarkup =
extractForeignMarkup(eEntry, entry, getAtomNamespace());
final List<Element> foreignMarkup = extractForeignMarkup(eEntry, entry, getAtomNamespace());
if (foreignMarkup.size() > 0) {
entry.setForeignMarkup(foreignMarkup);
}
return entry;
}
private List<Category> parseCategories(String baseURI, List<Element> eCategories) {
List<Category> cats = new ArrayList<Category>();
for (int i=0;i<eCategories.size();i++) {
Element eCategory = (Element) eCategories.get(i);
private List<Category> parseCategories(final String baseURI, final List<Element> eCategories) {
final List<Category> cats = new ArrayList<Category>();
for (int i = 0; i < eCategories.size(); i++) {
final Element eCategory = eCategories.get(i);
cats.add(parseCategory(baseURI, eCategory));
}
return (cats.size()>0) ? cats : null;
return cats.size() > 0 ? cats : null;
}
private Category parseCategory(String baseURI, Element eCategory) {
Category category = new Category();
private Category parseCategory(final String baseURI, final Element eCategory) {
final Category category = new Category();
String att = getAttributeValue(eCategory, "term");
if (att!=null) {
if (att != null) {
category.setTerm(att);
}
att = getAttributeValue(eCategory, "scheme");
if (att!=null) {
if (att != null) {
category.setScheme(att);
if (isRelativeURI(att)) {
category.setSchemeResolved(resolveURI(baseURI, eCategory, att));
}
}
att = getAttributeValue(eCategory, "label");
if (att!=null) {
if (att != null) {
category.setLabel(att);
}
return category;
@ -462,41 +460,43 @@ public class Atom10Parser extends BaseWireFeedParser {
// Once following relative URI methods are made public in the ROME
// Atom10Parser, then use them instead and delete these.
// Fix for issue #34 "valid IRI href attributes are stripped for atom:link"
// URI's that didn't start with http were being treated as relative URIs.
// So now consider an absolute URI to be any alpha-numeric string followed
// by a colon, followed by anything -- specified by this regex:
static Pattern absoluteURIPattern = Pattern.compile("^[a-z0-9]*:.*$");
public static boolean isAbsoluteURI(String uri) {
public static boolean isAbsoluteURI(final String uri) {
return absoluteURIPattern.matcher(uri).find();
}
/** Returns true if URI is relative. */
public static boolean isRelativeURI(String uri) {
public static boolean isRelativeURI(final String uri) {
return !isAbsoluteURI(uri);
}
/**
* Resolve URI via base URL and parent element.
* Resolve URI based considering xml:base and baseURI.
* Resolve URI via base URL and parent element. Resolve URI based
* considering xml:base and baseURI.
*
* @param baseURI Base URI used to fetch the XML document
* @param parent Parent element from which to consider xml:base
* @param url URL to be resolved
*/
public static String resolveURI(String baseURI, Parent parent, String url) {
public static String resolveURI(final String baseURI, final Parent parent, String url) {
if (!resolveURIs) {
return url;
}
if (isRelativeURI(url)) {
url = (!".".equals(url) && !"./".equals(url)) ? url : "";
url = !".".equals(url) && !"./".equals(url) ? url : "";
if (url.startsWith("/") && baseURI != null) {
String base = null;
int slashslash = baseURI.indexOf("//");
int nextslash = baseURI.indexOf("/", slashslash + 2);
if (nextslash != -1) base = baseURI.substring(0, nextslash);
final int slashslash = baseURI.indexOf("//");
final int nextslash = baseURI.indexOf("/", slashslash + 2);
if (nextslash != -1) {
base = baseURI.substring(0, nextslash);
}
return formURI(base, url);
}
@ -504,16 +504,17 @@ public class Atom10Parser extends BaseWireFeedParser {
if (parent != null && parent instanceof Element) {
// Do we have an xml:base?
String xmlbase = ((Element)parent).getAttributeValue(
"base", Namespace.XML_NAMESPACE);
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("/")) {
// Host relative URI
int slashslash = xmlbase.indexOf("//");
int nextslash = xmlbase.indexOf("/", slashslash + 2);
if (nextslash != -1) xmlbase = xmlbase.substring(0, nextslash);
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("/")) {
@ -523,14 +524,14 @@ public class Atom10Parser extends BaseWireFeedParser {
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);
}
@ -540,35 +541,40 @@ public class Atom10Parser extends BaseWireFeedParser {
/**
* Find base URI of feed considering relative URIs.
*
* @param root Root element of feed.
*/
private String findBaseURI(Element root) throws MalformedURLException {
private String findBaseURI(final Element root) throws MalformedURLException {
String ret = null;
if (findAtomLink(root, "self") != null) {
ret = findAtomLink(root, "self");
if (".".equals(ret) || "./".equals(ret)) ret = "";
if (ret.indexOf("/") != -1) ret = ret.substring(0, ret.lastIndexOf("/"));
if (".".equals(ret) || "./".equals(ret)) {
ret = "";
}
if (ret.indexOf("/") != -1) {
ret = ret.substring(0, ret.lastIndexOf("/"));
}
ret = resolveURI(null, root, ret);
}
return ret;
}
/**
* Return URL string of Atom link element under parent element.
* Link with no rel attribute is considered to be rel="alternate"
* Return URL string of Atom link element under parent element. Link with no
* rel attribute is considered to be rel="alternate"
*
* @param parent Consider only children of this parent element
* @param rel Consider only links with this relationship
*/
private String findAtomLink(Element parent, String rel) {
private String findAtomLink(final Element parent, final String rel) {
String ret = null;
List<Element> linksList = parent.getChildren("link", ATOM_10_NS);
final List<Element> linksList = parent.getChildren("link", ATOM_10_NS);
if (linksList != null) {
for (Iterator<Element> links = linksList.iterator(); links.hasNext(); ) {
Element link = (Element)links.next();
Attribute relAtt = getAttribute(link, "rel");
Attribute hrefAtt = getAttribute(link, "href");
if ( (relAtt == null && "alternate".equals(rel))
|| (relAtt != null && relAtt.getValue().equals(rel))) {
for (final Element element : linksList) {
final Element link = element;
final Attribute relAtt = getAttribute(link, "rel");
final Attribute hrefAtt = getAttribute(link, "href");
if (relAtt == null && "alternate".equals(rel) || relAtt != null && relAtt.getValue().equals(rel)) {
ret = hrefAtt.getValue();
break;
}
@ -578,8 +584,9 @@ public class Atom10Parser extends BaseWireFeedParser {
}
/**
* Form URI by combining base with append portion and giving
* special consideration to append portions that begin with ".."
* 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 ".."
*/
@ -587,16 +594,17 @@ public class Atom10Parser extends BaseWireFeedParser {
base = stripTrailingSlash(base);
append = stripStartingSlash(append);
if (append.startsWith("..")) {
String ret = null;
String[] parts = append.split("/");
for (int i=0; i<parts.length; i++) {
if ("..".equals(parts[i])) {
int last = base.lastIndexOf("/");
final String ret = null;
final String[] parts = append.split("/");
for (final String part : parts) {
if ("..".equals(part)) {
final int last = base.lastIndexOf("/");
if (last != -1) {
base = base.substring(0, last);
append = append.substring(3, append.length());
} else {
break;
}
else break;
}
}
}
@ -623,33 +631,30 @@ public class Atom10Parser extends BaseWireFeedParser {
return s;
}
/**
* Parse entry from reader.
*/
public static Entry parseEntry(Reader rd, String baseURI)
throws JDOMException, IOException, IllegalArgumentException, FeedException {
public static Entry parseEntry(final Reader rd, final String baseURI) throws JDOMException, IOException, IllegalArgumentException, FeedException {
// Parse entry into JDOM tree
SAXBuilder builder = new SAXBuilder();
Document entryDoc = builder.build(rd);
Element fetchedEntryElement = entryDoc.getRootElement();
final SAXBuilder builder = new SAXBuilder();
final Document entryDoc = builder.build(rd);
final Element fetchedEntryElement = entryDoc.getRootElement();
fetchedEntryElement.detach();
// Put entry into a JDOM document with 'feed' root so that Rome can handle it
Feed feed = new Feed();
// Put entry into a JDOM document with 'feed' root so that Rome can
// handle it
final Feed feed = new Feed();
feed.setFeedType("atom_1.0");
WireFeedOutput wireFeedOutput = new WireFeedOutput();
Document feedDoc = wireFeedOutput.outputJDom(feed);
final WireFeedOutput wireFeedOutput = new WireFeedOutput();
final Document feedDoc = wireFeedOutput.outputJDom(feed);
feedDoc.getRootElement().addContent(fetchedEntryElement);
if (baseURI != null) {
feedDoc.getRootElement().setAttribute("base", baseURI, Namespace.XML_NAMESPACE);
}
WireFeedInput input = new WireFeedInput();
Feed parsedFeed = (Feed)input.build(feedDoc);
return (Entry)parsedFeed.getEntries().get(0);
final WireFeedInput input = new WireFeedInput();
final Feed parsedFeed = (Feed) input.build(feedDoc);
return parsedFeed.getEntries().get(0);
}
}

View file

@ -20,14 +20,17 @@ package com.sun.syndication.io.impl;
/**
* Encodes/decodes byte arrays and Strings into/from a base 64 String.
* <p>
*
* @author Alejandro Abdelnur
*
*/
public class Base64 {
/**
* Encodes a String into a base 64 String. The resulting encoding is chunked at 76 bytes.
* Encodes a String into a base 64 String. The resulting encoding is chunked
* at 76 bytes.
* <p>
*
* @param s String to encode.
* @return encoded string.
*
@ -42,9 +45,11 @@ public class Base64 {
/**
* Decodes a base 64 String into a String.
* <p>
*
* @param s String to decode.
* @return encoded string.
* @throws java.lang.IllegalArgumentException thrown if the given byte array was not valid com.sun.syndication.io.impl.Base64 encoding.
* @throws java.lang.IllegalArgumentException thrown if the given byte array
* was not valid com.sun.syndication.io.impl.Base64 encoding.
*
*/
public static String decode(String s) throws IllegalArgumentException {
@ -56,9 +61,7 @@ public class Base64 {
return s;
}
private static final byte[] ALPHASET =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".getBytes();
private static final byte[] ALPHASET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".getBytes();
private static final int I6O2 = 255 - 3;
private static final int O6I2 = 3;
@ -70,50 +73,49 @@ public class Base64 {
/**
* Encodes a byte array into a base 64 byte array.
* <p>
*
* @param dData byte array to encode.
* @return encoded byte array.
*
*/
public static byte[] encode(byte[] dData) {
if (dData==null) {
public static byte[] encode(final byte[] dData) {
if (dData == null) {
throw new IllegalArgumentException("Cannot encode null");
}
byte[] eData = new byte[((dData.length+2)/3)*4];
final byte[] eData = new byte[(dData.length + 2) / 3 * 4];
int eIndex = 0;
for (int i = 0; i<dData.length; i += 3) {
for (int i = 0; i < dData.length; i += 3) {
int d1;
int d2=0;
int d3=0;
int d2 = 0;
int d3 = 0;
int e1;
int e2;
int e3;
int e4;
int pad=0;
int pad = 0;
d1 = dData[i];
if ((i+1)<dData.length) {
d2 = dData[i+1];
if ((i+2)<dData.length) {
d3 = dData[i+2];
if (i + 1 < dData.length) {
d2 = dData[i + 1];
if (i + 2 < dData.length) {
d3 = dData[i + 2];
} else {
pad = 1;
}
else {
pad =1;
}
}
else {
pad =2;
} else {
pad = 2;
}
e1 = ALPHASET[(d1&I6O2)>>2];
e2 = ALPHASET[(d1&O6I2)<<4 | (d2&I4O4)>>4];
e3 = ALPHASET[(d2&O4I4)<<2 | (d3&I2O6)>>6];
e4 = ALPHASET[(d3&O2I6)];
e1 = ALPHASET[(d1 & I6O2) >> 2];
e2 = ALPHASET[(d1 & O6I2) << 4 | (d2 & I4O4) >> 4];
e3 = ALPHASET[(d2 & O4I4) << 2 | (d3 & I2O6) >> 6];
e4 = ALPHASET[d3 & O2I6];
eData[eIndex++] = (byte)e1;
eData[eIndex++] = (byte)e2;
eData[eIndex++] = (pad<2) ?(byte)e3 : (byte)'=';
eData[eIndex++] = (pad<1) ?(byte)e4 : (byte)'=';
eData[eIndex++] = (byte) e1;
eData[eIndex++] = (byte) e2;
eData[eIndex++] = pad < 2 ? (byte) e3 : (byte) '=';
eData[eIndex++] = pad < 1 ? (byte) e4 : (byte) '=';
}
return eData;
@ -122,10 +124,10 @@ public class Base64 {
private final static int[] CODES = new int[256];
static {
for (int i=0;i<CODES.length;i++) {
for (int i = 0; i < CODES.length; i++) {
CODES[i] = 64;
}
for (int i=0;i<ALPHASET.length;i++) {
for (int i = 0; i < ALPHASET.length; i++) {
CODES[ALPHASET[i]] = i;
}
}
@ -133,25 +135,27 @@ public class Base64 {
/**
* Dencodes a com.sun.syndication.io.impl.Base64 byte array.
* <p>
*
* @param eData byte array to decode.
* @return decoded byte array.
* @throws java.lang.IllegalArgumentException thrown if the given byte array was not valid com.sun.syndication.io.impl.Base64 encoding.
* @throws java.lang.IllegalArgumentException thrown if the given byte array
* was not valid com.sun.syndication.io.impl.Base64 encoding.
*
*/
public static byte[] decode(byte[] eData) {
if (eData==null) {
public static byte[] decode(final byte[] eData) {
if (eData == null) {
throw new IllegalArgumentException("Cannot decode null");
}
byte[] cleanEData = (byte[]) eData.clone();
final byte[] cleanEData = eData.clone();
int cleanELength = 0;
for (int i=0;i<eData.length;i++) {
if (eData[i]<256 && CODES[eData[i]]<64) {
cleanEData[cleanELength++] = eData[i];
for (final byte element : eData) {
if (element < 256 && CODES[element] < 64) {
cleanEData[cleanELength++] = element;
}
}
int dLength = (cleanELength/4)*3;
switch (cleanELength%4) {
int dLength = cleanELength / 4 * 3;
switch (cleanELength % 4) {
case 3:
dLength += 2;
break;
@ -160,42 +164,39 @@ public class Base64 {
break;
}
byte[] dData = new byte[dLength];
final byte[] dData = new byte[dLength];
int dIndex = 0;
for (int i = 0; i < eData.length; i += 4) {
if ((i + 3) > eData.length) {
if (i + 3 > eData.length) {
throw new IllegalArgumentException("byte array is not a valid com.sun.syndication.io.impl.Base64 encoding");
}
int e1 = CODES[cleanEData[i]];
int e2 = CODES[cleanEData[i+1]];
int e3 = CODES[cleanEData[i+2]];
int e4 = CODES[cleanEData[i+3]];
dData[dIndex++] = (byte) ((e1<<2)|(e2>>4));
if (dIndex<dData.length) {
dData[dIndex++] = (byte) ((e2<<4) | (e3>>2));
final int e1 = CODES[cleanEData[i]];
final int e2 = CODES[cleanEData[i + 1]];
final int e3 = CODES[cleanEData[i + 2]];
final int e4 = CODES[cleanEData[i + 3]];
dData[dIndex++] = (byte) (e1 << 2 | e2 >> 4);
if (dIndex < dData.length) {
dData[dIndex++] = (byte) (e2 << 4 | e3 >> 2);
}
if (dIndex<dData.length) {
dData[dIndex++] = (byte) ((e3<<6) | (e4));
if (dIndex < dData.length) {
dData[dIndex++] = (byte) (e3 << 6 | e4);
}
}
return dData;
}
public static void main(String[] args) throws Exception {
String s =
"\nPGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+V2UncmUgcHJvcG9zaW5nIDxhIGhy\n"+
"ZWY9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9jb3Jwb3JhdGUvc29mdHdhcmVfcHJpbmNpcGxlcy5odG1sIj5z\n"+
"b21lIGd1aWRlbGluZXMgPC9hPnRvIGhlbHAgY3VyYiB0aGUgcHJvYmxlbSBvZiBJbnRlcm5ldCBzb2Z0d2Fy\n"+
"ZSB0aGF0IGluc3RhbGxzIGl0c2VsZiB3aXRob3V0IHRlbGxpbmcgeW91LCBvciBiZWhhdmVzIGJhZGx5IG9u\n"+
"Y2UgaXQgZ2V0cyBvbiB5b3VyIGNvbXB1dGVyLiBXZSd2ZSBiZWVuIGhlYXJpbmcgYSBsb3Qgb2YgY29tcGxh\n"+
"aW50cyBhYm91dCB0aGlzIGxhdGVseSBhbmQgaXQgc2VlbXMgdG8gYmUgZ2V0dGluZyB3b3JzZS4gV2UgdGhp\n"+
"bmsgaXQncyBpbXBvcnRhbnQgdGhhdCB5b3UgcmV0YWluIGNvbnRyb2wgb2YgeW91ciBjb21wdXRlciBhbmQg\n"+
"dGhhdCB0aGVyZSBiZSBzb21lIGNsZWFyIHN0YW5kYXJkcyBpbiBvdXIgaW5kdXN0cnkuIExldCB1cyBrbm93\n"+
"IGlmIHlvdSB0aGluayB0aGVzZSBndWlkZWxpbmVzIGFyZSB1c2VmdWwgb3IgaWYgeW91IGhhdmUgc3VnZ2Vz\n"+
"dGlvbnMgdG8gaW1wcm92ZSB0aGVtLgo8YnIgLz4KPGJyIC8+Sm9uYXRoYW4gUm9zZW5iZXJnCjxiciAvPgo8\n"+
"L2Rpdj4K\n";
public static void main(final String[] args) throws Exception {
final String s = "\nPGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+V2UncmUgcHJvcG9zaW5nIDxhIGhy\n"
+ "ZWY9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9jb3Jwb3JhdGUvc29mdHdhcmVfcHJpbmNpcGxlcy5odG1sIj5z\n"
+ "b21lIGd1aWRlbGluZXMgPC9hPnRvIGhlbHAgY3VyYiB0aGUgcHJvYmxlbSBvZiBJbnRlcm5ldCBzb2Z0d2Fy\n"
+ "ZSB0aGF0IGluc3RhbGxzIGl0c2VsZiB3aXRob3V0IHRlbGxpbmcgeW91LCBvciBiZWhhdmVzIGJhZGx5IG9u\n"
+ "Y2UgaXQgZ2V0cyBvbiB5b3VyIGNvbXB1dGVyLiBXZSd2ZSBiZWVuIGhlYXJpbmcgYSBsb3Qgb2YgY29tcGxh\n"
+ "aW50cyBhYm91dCB0aGlzIGxhdGVseSBhbmQgaXQgc2VlbXMgdG8gYmUgZ2V0dGluZyB3b3JzZS4gV2UgdGhp\n"
+ "bmsgaXQncyBpbXBvcnRhbnQgdGhhdCB5b3UgcmV0YWluIGNvbnRyb2wgb2YgeW91ciBjb21wdXRlciBhbmQg\n"
+ "dGhhdCB0aGVyZSBiZSBzb21lIGNsZWFyIHN0YW5kYXJkcyBpbiBvdXIgaW5kdXN0cnkuIExldCB1cyBrbm93\n"
+ "IGlmIHlvdSB0aGluayB0aGVzZSBndWlkZWxpbmVzIGFyZSB1c2VmdWwgb3IgaWYgeW91IGhhdmUgc3VnZ2Vz\n"
+ "dGlvbnMgdG8gaW1wcm92ZSB0aGVtLgo8YnIgLz4KPGJyIC8+Sm9uYXRoYW4gUm9zZW5iZXJnCjxiciAvPgo8\n" + "L2Rpdj4K\n";
System.out.println(decode(s));
}
}

View file

@ -1,15 +1,16 @@
package com.sun.syndication.io.impl;
import com.sun.syndication.io.WireFeedGenerator;
import org.jdom2.Element;
import org.jdom2.Namespace;
import org.jdom2.Parent;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.jdom2.Element;
import org.jdom2.Namespace;
import org.jdom2.Parent;
import com.sun.syndication.io.WireFeedGenerator;
/**
* @author Alejandro Abdelnur
*/
@ -30,63 +31,63 @@ public abstract class BaseWireFeedGenerator implements WireFeedGenerator {
*/
private static final String PERSON_MODULE_GENERATORS_POSFIX_KEY = ".person.ModuleGenerator.classes";
private final String _type;
private final ModuleGenerators _feedModuleGenerators;
private final ModuleGenerators _itemModuleGenerators;
private final ModuleGenerators _personModuleGenerators;
private final Namespace[] _allModuleNamespaces;
private String _type;
private ModuleGenerators _feedModuleGenerators;
private ModuleGenerators _itemModuleGenerators;
private ModuleGenerators _personModuleGenerators;
private Namespace[] _allModuleNamespaces;
protected BaseWireFeedGenerator(String type) {
_type = type;
_feedModuleGenerators = new ModuleGenerators(type + FEED_MODULE_GENERATORS_POSFIX_KEY, this);
_itemModuleGenerators = new ModuleGenerators(type + ITEM_MODULE_GENERATORS_POSFIX_KEY, this);
_personModuleGenerators = new ModuleGenerators(type + PERSON_MODULE_GENERATORS_POSFIX_KEY, this);
Set allModuleNamespaces = new HashSet();
Iterator i = _feedModuleGenerators.getAllNamespaces().iterator();
protected BaseWireFeedGenerator(final String type) {
this._type = type;
this._feedModuleGenerators = new ModuleGenerators(type + FEED_MODULE_GENERATORS_POSFIX_KEY, this);
this._itemModuleGenerators = new ModuleGenerators(type + ITEM_MODULE_GENERATORS_POSFIX_KEY, this);
this._personModuleGenerators = new ModuleGenerators(type + PERSON_MODULE_GENERATORS_POSFIX_KEY, this);
final Set allModuleNamespaces = new HashSet();
Iterator i = this._feedModuleGenerators.getAllNamespaces().iterator();
while (i.hasNext()) {
allModuleNamespaces.add(i.next());
}
i = _itemModuleGenerators.getAllNamespaces().iterator();
i = this._itemModuleGenerators.getAllNamespaces().iterator();
while (i.hasNext()) {
allModuleNamespaces.add(i.next());
}
i = _personModuleGenerators.getAllNamespaces().iterator();
i = this._personModuleGenerators.getAllNamespaces().iterator();
while (i.hasNext()) {
allModuleNamespaces.add(i.next());
}
_allModuleNamespaces = new Namespace[allModuleNamespaces.size()];
allModuleNamespaces.toArray(_allModuleNamespaces);
this._allModuleNamespaces = new Namespace[allModuleNamespaces.size()];
allModuleNamespaces.toArray(this._allModuleNamespaces);
}
@Override
public String getType() {
return _type;
return this._type;
}
protected void generateModuleNamespaceDefs(Element root) {
for (int i = 0; i < _allModuleNamespaces.length; i++) {
root.addNamespaceDeclaration(_allModuleNamespaces[i]);
protected void generateModuleNamespaceDefs(final Element root) {
for (final Namespace _allModuleNamespace : this._allModuleNamespaces) {
root.addNamespaceDeclaration(_allModuleNamespace);
}
}
protected void generateFeedModules(List modules, Element feed) {
_feedModuleGenerators.generateModules(modules, feed);
protected void generateFeedModules(final List modules, final Element feed) {
this._feedModuleGenerators.generateModules(modules, feed);
}
public void generateItemModules(List modules, Element item) {
_itemModuleGenerators.generateModules(modules, item);
public void generateItemModules(final List modules, final Element item) {
this._itemModuleGenerators.generateModules(modules, item);
}
public void generatePersonModules(List modules, Element person) {
_personModuleGenerators.generateModules(modules, person);
public void generatePersonModules(final List modules, final Element person) {
this._personModuleGenerators.generateModules(modules, person);
}
protected void generateForeignMarkup(Element e, List foreignMarkup) {
protected void generateForeignMarkup(final Element e, final List foreignMarkup) {
if (foreignMarkup != null) {
Iterator elems = (Iterator) foreignMarkup.iterator();
final Iterator elems = foreignMarkup.iterator();
while (elems.hasNext()) {
Element elem = (Element) elems.next();
Parent parent = elem.getParent();
final Element elem = (Element) elems.next();
final Parent parent = elem.getParent();
if (parent != null) {
parent.removeContent(elem);
}
@ -96,40 +97,45 @@ public abstract class BaseWireFeedGenerator implements WireFeedGenerator {
}
/**
* Purging unused declarations is less optimal, performance-wise, than never adding them in the first place. So, we
* should still ask the ROME guys to fix their code (not adding dozens of unnecessary module declarations). Having
* said that: purging them here, before XML generation, is more efficient than parsing and re-molding the XML after
* ROME generates it.
* Purging unused declarations is less optimal, performance-wise, than never
* adding them in the first place. So, we should still ask the ROME guys to
* fix their code (not adding dozens of unnecessary module declarations).
* Having said that: purging them here, before XML generation, is more
* efficient than parsing and re-molding the XML after ROME generates it.
* <p/>
* Note that the calling app could still add declarations/modules to the Feed tree after this. Which is fine. But
* those modules are then responsible for crawling to the root of the tree, at generate() time, to make sure their
* namespace declarations are present.
* Note that the calling app could still add declarations/modules to the
* Feed tree after this. Which is fine. But those modules are then
* responsible for crawling to the root of the tree, at generate() time, to
* make sure their namespace declarations are present.
*/
protected static void purgeUnusedNamespaceDeclarations(Element root) {
java.util.Set usedPrefixes = new java.util.HashSet();
protected static void purgeUnusedNamespaceDeclarations(final Element root) {
final java.util.Set usedPrefixes = new java.util.HashSet();
collectUsedPrefixes(root, usedPrefixes);
List list = root.getAdditionalNamespaces();
List additionalNamespaces = new java.util.ArrayList();
additionalNamespaces.addAll(list); // the duplication will prevent a ConcurrentModificationException below
final List list = root.getAdditionalNamespaces();
final List additionalNamespaces = new java.util.ArrayList();
additionalNamespaces.addAll(list); // the duplication will prevent a
// ConcurrentModificationException
// below
for (int i = 0; i < additionalNamespaces.size(); i++) {
Namespace ns = (Namespace) additionalNamespaces.get(i);
String prefix = ns.getPrefix();
final Namespace ns = (Namespace) additionalNamespaces.get(i);
final String prefix = ns.getPrefix();
if (prefix != null && prefix.length() > 0 && !usedPrefixes.contains(prefix)) {
root.removeNamespaceDeclaration(ns);
}
}
}
private static void collectUsedPrefixes(Element el, java.util.Set collector) {
String prefix = el.getNamespacePrefix();
private static void collectUsedPrefixes(final Element el, final java.util.Set collector) {
final String prefix = el.getNamespacePrefix();
if (prefix != null && prefix.length() > 0 && !collector.contains(prefix)) {
collector.add(prefix);
}
List kids = el.getChildren();
final List kids = el.getChildren();
for (int i = 0; i < kids.size(); i++) {
collectUsedPrefixes((Element) kids.get(i), collector); // recursion - worth it
collectUsedPrefixes((Element) kids.get(i), collector); // recursion
// - worth it
}
}

View file

@ -1,16 +1,17 @@
package com.sun.syndication.io.impl;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jdom2.Attribute;
import org.jdom2.Element;
import org.jdom2.Namespace;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.module.Extendable;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.io.WireFeedParser;
import java.util.ArrayList;
import java.util.Iterator;
import org.jdom2.Element;
import java.util.List;
import org.jdom2.Namespace;
import org.jdom2.Attribute;
/**
* @author Alejandro Abdelnur
@ -34,50 +35,51 @@ public abstract class BaseWireFeedParser implements WireFeedParser {
*/
private static final String PERSON_MODULE_PARSERS_POSFIX_KEY = ".person.ModuleParser.classes";
private final String _type;
private final ModuleParsers _feedModuleParsers;
private final ModuleParsers _itemModuleParsers;
private final ModuleParsers _personModuleParsers;
private final Namespace _namespace;
private String _type;
private ModuleParsers _feedModuleParsers;
private ModuleParsers _itemModuleParsers;
private ModuleParsers _personModuleParsers;
private Namespace _namespace;
protected BaseWireFeedParser(String type, Namespace namespace) {
_type = type;
_namespace = namespace;
_feedModuleParsers = new ModuleParsers(type+FEED_MODULE_PARSERS_POSFIX_KEY, this);
_itemModuleParsers = new ModuleParsers(type+ITEM_MODULE_PARSERS_POSFIX_KEY, this);
_personModuleParsers = new ModuleParsers(type+PERSON_MODULE_PARSERS_POSFIX_KEY, this);
protected BaseWireFeedParser(final String type, final Namespace namespace) {
this._type = type;
this._namespace = namespace;
this._feedModuleParsers = new ModuleParsers(type + FEED_MODULE_PARSERS_POSFIX_KEY, this);
this._itemModuleParsers = new ModuleParsers(type + ITEM_MODULE_PARSERS_POSFIX_KEY, this);
this._personModuleParsers = new ModuleParsers(type + PERSON_MODULE_PARSERS_POSFIX_KEY, this);
}
/**
* Returns the type of feed the parser handles.
* <p>
*
* @see WireFeed for details on the format of this string.
* <p>
* @return the type of feed the parser handles.
*
*/
@Override
public String getType() {
return _type;
return this._type;
}
protected List<Module> parseFeedModules(Element feedElement) {
return _feedModuleParsers.parseModules(feedElement);
protected List<Module> parseFeedModules(final Element feedElement) {
return this._feedModuleParsers.parseModules(feedElement);
}
protected List<Module> parseItemModules(Element itemElement) {
return _itemModuleParsers.parseModules(itemElement);
protected List<Module> parseItemModules(final Element itemElement) {
return this._itemModuleParsers.parseModules(itemElement);
}
protected List<Module> parsePersonModules(Element itemElement) {
return _personModuleParsers.parseModules(itemElement);
protected List<Module> parsePersonModules(final Element itemElement) {
return this._personModuleParsers.parseModules(itemElement);
}
protected List<Element> extractForeignMarkup(Element e, Extendable ext, Namespace basens) {
ArrayList<Element> foreignMarkup = new ArrayList<Element>();
Iterator<Element> children = e.getChildren().iterator();
protected List<Element> extractForeignMarkup(final Element e, final Extendable ext, final Namespace basens) {
final ArrayList<Element> foreignMarkup = new ArrayList<Element>();
final Iterator<Element> children = e.getChildren().iterator();
while (children.hasNext()) {
Element elem = (Element)children.next();
final Element elem = children.next();
if (
// if elemet not in the RSS namespace
!basens.equals(elem.getNamespace())
@ -90,26 +92,25 @@ public abstract class BaseWireFeedParser implements WireFeedParser {
}
}
// Now we can detach the foreign markup elements
Iterator<Element> fm = foreignMarkup.iterator();
final Iterator<Element> fm = foreignMarkup.iterator();
while (fm.hasNext()) {
Element elem = (Element)fm.next();
final Element elem = fm.next();
elem.detach();
}
return foreignMarkup;
}
protected Attribute getAttribute(Element e, String attributeName) {
protected Attribute getAttribute(final Element e, final String attributeName) {
Attribute attribute = e.getAttribute(attributeName);
if (attribute == null) {
attribute = e.getAttribute(attributeName, _namespace);
attribute = e.getAttribute(attributeName, this._namespace);
}
return attribute;
}
protected String getAttributeValue(Element e, String attributeName) {
Attribute attr = getAttribute(e, attributeName);
return (attr != null) ? attr.getValue() : null;
protected String getAttributeValue(final Element e, final String attributeName) {
final Attribute attr = getAttribute(e, attributeName);
return attr != null ? attr.getValue() : null;
}
}

View file

@ -16,22 +16,21 @@
*/
package com.sun.syndication.io.impl;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.feed.module.DCModule;
import com.sun.syndication.feed.module.DCSubject;
import com.sun.syndication.io.ModuleGenerator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.jdom2.Attribute;
import org.jdom2.Element;
import org.jdom2.Namespace;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.HashSet;
import java.util.Collections;
import com.sun.syndication.feed.module.DCModule;
import com.sun.syndication.feed.module.DCSubject;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.io.ModuleGenerator;
/**
* Feed Generator for DublinCore Module.
@ -53,13 +52,14 @@ public class DCModuleGenerator implements ModuleGenerator {
private static final Set<Namespace> NAMESPACES;
static {
Set<Namespace> nss = new HashSet<Namespace>();
final Set<Namespace> nss = new HashSet<Namespace>();
nss.add(DC_NS);
nss.add(TAXO_NS);
nss.add(RDF_NS);
NAMESPACES = Collections.unmodifiableSet(nss);
}
@Override
public final String getNamespaceUri() {
return DC_URI;
}
@ -81,12 +81,13 @@ public class DCModuleGenerator implements ModuleGenerator {
* generator uses.
* <p/>
* It is used by the the feed generators to add their namespace definition
* in the root element of the generated document (forward-missing of
* Java 5.0 Generics).
* in the root element of the generated document (forward-missing of Java
* 5.0 Generics).
* <p/>
*
* @return a set with all the URIs this module generator uses.
*/
@Override
public final Set<Namespace> getNamespaces() {
return NAMESPACES;
}
@ -94,11 +95,13 @@ public class DCModuleGenerator implements ModuleGenerator {
/**
* Populate an element tree with elements for a module.
* <p>
*
* @param module the module to populate from.
* @param element the root element to attach child elements to.
*/
public final void generate(Module module, Element element) {
DCModule dcModule = (DCModule) module;
@Override
public final void generate(final Module module, final Element element) {
final DCModule dcModule = (DCModule) module;
if (dcModule.getTitle() != null) {
element.addContent(generateSimpleElementList("title", dcModule.getTitles()));
@ -106,9 +109,9 @@ public class DCModuleGenerator implements ModuleGenerator {
if (dcModule.getCreator() != null) {
element.addContent(generateSimpleElementList("creator", dcModule.getCreators()));
}
List<DCSubject> subjects = dcModule.getSubjects();
final List<DCSubject> subjects = dcModule.getSubjects();
for (int i = 0; i < subjects.size(); i++) {
element.addContent(generateSubjectElement((DCSubject) subjects.get(i)));
element.addContent(generateSubjectElement(subjects.get(i)));
}
if (dcModule.getDescription() != null) {
element.addContent(generateSimpleElementList("description", dcModule.getDescriptions()));
@ -120,9 +123,8 @@ public class DCModuleGenerator implements ModuleGenerator {
element.addContent(generateSimpleElementList("contributor", dcModule.getContributors()));
}
if (dcModule.getDate() != null) {
for (Iterator<Date> i = dcModule.getDates().iterator(); i.hasNext();) {
element.addContent(generateSimpleElement("date",
DateParser.formatW3CDateTime((Date) i.next())));
for (final Date date : dcModule.getDates()) {
element.addContent(generateSimpleElement("date", DateParser.formatW3CDateTime(date)));
}
}
if (dcModule.getType() != null) {
@ -154,21 +156,22 @@ public class DCModuleGenerator implements ModuleGenerator {
/**
* Utility method to generate an element for a subject.
* <p>
*
* @param subject the subject to generate an element for.
* @return the element for the subject.
*/
protected final Element generateSubjectElement(DCSubject subject) {
Element subjectElement = new Element("subject", getDCNamespace());
protected final Element generateSubjectElement(final DCSubject subject) {
final Element subjectElement = new Element("subject", getDCNamespace());
if (subject.getTaxonomyUri() != null) {
Element descriptionElement = new Element("Description", getRDFNamespace());
Element topicElement = new Element("topic", getTaxonomyNamespace());
Attribute resourceAttribute = new Attribute("resource", subject.getTaxonomyUri(), getRDFNamespace());
final Element descriptionElement = new Element("Description", getRDFNamespace());
final Element topicElement = new Element("topic", getTaxonomyNamespace());
final Attribute resourceAttribute = new Attribute("resource", subject.getTaxonomyUri(), getRDFNamespace());
topicElement.setAttribute(resourceAttribute);
descriptionElement.addContent(topicElement);
if (subject.getValue() != null) {
Element valueElement = new Element("value", getRDFNamespace());
final Element valueElement = new Element("value", getRDFNamespace());
valueElement.addContent(subject.getValue());
descriptionElement.addContent(valueElement);
}
@ -179,16 +182,16 @@ public class DCModuleGenerator implements ModuleGenerator {
return subjectElement;
}
/**
* Utility method to generate a single element containing a string.
* <p>
*
* @param name the name of the elment to generate.
* @param value the value of the text in the element.
* @return the element generated.
*/
protected final Element generateSimpleElement(String name, String value) {
Element element = new Element(name, getDCNamespace());
protected final Element generateSimpleElement(final String name, final String value) {
final Element element = new Element(name, getDCNamespace());
element.addContent(value);
return element;
@ -197,14 +200,15 @@ public class DCModuleGenerator implements ModuleGenerator {
/**
* Utility method to generate a list of simple elements.
* <p>
*
* @param name the name of the element list to generate.
* @param value the list of values for the elements.
* @return a list of Elements created.
*/
protected final List<Element> generateSimpleElementList(String name, List<String> value) {
List<Element> elements = new ArrayList<Element>();
for (Iterator<String> i = value.iterator(); i.hasNext();) {
elements.add(generateSimpleElement(name, (String) i.next()));
protected final List<Element> generateSimpleElementList(final String name, final List<String> value) {
final List<Element> elements = new ArrayList<Element>();
for (final String string : value) {
elements.add(generateSimpleElement(name, string));
}
return elements;

View file

@ -16,20 +16,20 @@
*/
package com.sun.syndication.io.impl;
import com.sun.syndication.feed.module.DCModuleImpl;
import com.sun.syndication.feed.module.DCSubjectImpl;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.feed.module.DCModule;
import com.sun.syndication.feed.module.DCSubject;
import com.sun.syndication.io.ModuleParser;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.jdom2.Attribute;
import org.jdom2.Element;
import org.jdom2.Namespace;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import com.sun.syndication.feed.module.DCModule;
import com.sun.syndication.feed.module.DCModuleImpl;
import com.sun.syndication.feed.module.DCSubject;
import com.sun.syndication.feed.module.DCSubjectImpl;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.io.ModuleParser;
/**
* Parser for the Dublin Core module.
@ -43,6 +43,7 @@ public class DCModuleParser implements ModuleParser {
private static final Namespace RDF_NS = Namespace.getNamespace(RDF_URI);
private static final Namespace TAXO_NS = Namespace.getNamespace(TAXO_URI);
@Override
public final String getNamespaceUri() {
return DCModule.URI;
}
@ -62,12 +63,14 @@ public class DCModuleParser implements ModuleParser {
/**
* Parse an element tree and return the module found in it.
* <p>
*
* @param dcRoot the root element containing the module elements.
* @return the module parsed from the element tree, <i>null</i> if none.
*/
public Module parse(Element dcRoot) {
@Override
public Module parse(final Element dcRoot) {
boolean foundSomething = false;
DCModule dcm = new DCModuleImpl();
final DCModule dcm = new DCModuleImpl();
List<Element> eList = dcRoot.getChildren("title", getDCNamespace());
if (eList.size() > 0) {
@ -145,21 +148,22 @@ public class DCModuleParser implements ModuleParser {
dcm.setRightsList(parseElementList(eList));
}
return (foundSomething) ? dcm : null;
return foundSomething ? dcm : null;
}
/**
* Utility method to parse a taxonomy from an element.
* <p>
*
* @param desc the taxonomy description element.
* @return the string contained in the resource of the element.
*/
protected final String getTaxonomy(Element desc) {
protected final String getTaxonomy(final Element desc) {
String d = null;
Element taxo = desc.getChild("topic", getTaxonomyNamespace());
if (taxo!=null) {
Attribute a = taxo.getAttribute("resource", getRDFNamespace());
if (a!=null) {
final Element taxo = desc.getChild("topic", getTaxonomyNamespace());
if (taxo != null) {
final Attribute a = taxo.getAttribute("resource", getRDFNamespace());
if (a != null) {
d = a.getValue();
}
}
@ -169,26 +173,27 @@ public class DCModuleParser implements ModuleParser {
/**
* Utility method to parse a list of subjects out of a list of elements.
* <p>
*
* @param eList the element list to parse.
* @return a list of subjects parsed from the elements.
*/
protected final List<DCSubject> parseSubjects(List<Element> eList) {
List<DCSubject> subjects = new ArrayList<DCSubject>();
for (Iterator<Element> i = eList.iterator(); i.hasNext();) {
Element eSubject = (Element) i.next();
Element eDesc = eSubject.getChild("Description", getRDFNamespace());
protected final List<DCSubject> parseSubjects(final List<Element> eList) {
final List<DCSubject> subjects = new ArrayList<DCSubject>();
for (final Element element : eList) {
final Element eSubject = element;
final Element eDesc = eSubject.getChild("Description", getRDFNamespace());
if (eDesc != null) {
String taxonomy = getTaxonomy(eDesc);
List<Element> eValues = eDesc.getChildren("value", getRDFNamespace());
for (Iterator<Element> v = eValues.iterator(); v.hasNext();) {
Element eValue = (Element) v.next();
DCSubject subject = new DCSubjectImpl();
final String taxonomy = getTaxonomy(eDesc);
final List<Element> eValues = eDesc.getChildren("value", getRDFNamespace());
for (final Element element2 : eValues) {
final Element eValue = element2;
final DCSubject subject = new DCSubjectImpl();
subject.setTaxonomyUri(taxonomy);
subject.setValue(eValue.getText());
subjects.add(subject);
}
} else {
DCSubject subject = new DCSubjectImpl();
final DCSubject subject = new DCSubjectImpl();
subject.setValue(eSubject.getText());
subjects.add(subject);
}
@ -200,13 +205,14 @@ public class DCModuleParser implements ModuleParser {
/**
* Utility method to parse a list of strings out of a list of elements.
* <p>
*
* @param eList the list of elements to parse.
* @return the list of strings
*/
protected final List<String> parseElementList(List<Element> eList) {
List<String> values= new ArrayList<String>();
for (Iterator<Element> i = eList.iterator(); i.hasNext();) {
Element e = (Element) i.next();
protected final List<String> parseElementList(final List<Element> eList) {
final List<String> values = new ArrayList<String>();
for (final Element element : eList) {
final Element e = element;
values.add(e.getText());
}
@ -216,13 +222,14 @@ public class DCModuleParser implements ModuleParser {
/**
* Utility method to parse a list of dates out of a list of elements.
* <p>
*
* @param eList the list of elements to parse.
* @return the list of dates.
*/
protected final List<Date> parseElementListDate(List<Element> eList) {
List<Date> values = new ArrayList<Date>();
for (Iterator<Element> i = eList.iterator(); i.hasNext();) {
Element e = (Element) i.next();
protected final List<Date> parseElementListDate(final List<Element> eList) {
final List<Date> values = new ArrayList<Date>();
for (final Element element : eList) {
final Element e = element;
values.add(DateParser.parseDate(e.getText()));
}

View file

@ -17,19 +17,19 @@
package com.sun.syndication.io.impl;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.Locale;
import java.util.TimeZone;
/**
* A helper class that parses Dates out of Strings with date time in RFC822 and W3CDateTime
* formats plus the variants Atom (0.3) and RSS (0.9, 0.91, 0.92, 0.93, 0.94, 1.0 and 2.0)
* specificators added to those formats.
* A helper class that parses Dates out of Strings with date time in RFC822 and
* W3CDateTime formats plus the variants Atom (0.3) and RSS (0.9, 0.91, 0.92,
* 0.93, 0.94, 1.0 and 2.0) specificators added to those formats.
* <p/>
* It uses the JDK java.text.SimpleDateFormat class attemtping the parse using a mask for
* each one of the possible formats.
* It uses the JDK java.text.SimpleDateFormat class attemtping the parse using a
* mask for each one of the possible formats.
* <p/>
*
* @author Alejandro Abdelnur
@ -40,73 +40,50 @@ public class DateParser {
private static String[] ADDITIONAL_MASKS;
static {
ADDITIONAL_MASKS = PropertiesLoader.getPropertiesLoader().getTokenizedProperty("datetime.extra.masks","|");
ADDITIONAL_MASKS = PropertiesLoader.getPropertiesLoader().getTokenizedProperty("datetime.extra.masks", "|");
}
// order is like this because the SimpleDateFormat.parse does not fail with exception
// if it can parse a valid date out of a substring of the full string given the mask
// so we have to check the most complete format first, then it fails with exception
private static final String[] RFC822_MASKS = {
"EEE, dd MMM yy HH:mm:ss z",
"EEE, dd MMM yy HH:mm z",
"dd MMM yy HH:mm:ss z",
"dd MMM yy HH:mm z"
};
// order is like this because the SimpleDateFormat.parse does not fail with exception
// if it can parse a valid date out of a substring of the full string given the mask
// so we have to check the most complete format first, then it fails with exception
private static final String[] W3CDATETIME_MASKS = {
"yyyy-MM-dd'T'HH:mm:ss.SSSz",
"yyyy-MM-dd't'HH:mm:ss.SSSz",
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
"yyyy-MM-dd't'HH:mm:ss.SSS'z'",
"yyyy-MM-dd'T'HH:mm:ssz",
"yyyy-MM-dd't'HH:mm:ssz",
"yyyy-MM-dd'T'HH:mm:ssZ",
"yyyy-MM-dd't'HH:mm:ssZ",
"yyyy-MM-dd'T'HH:mm:ss'Z'",
"yyyy-MM-dd't'HH:mm:ss'z'",
"yyyy-MM-dd'T'HH:mmz", // together with logic in the parseW3CDateTime they
"yyyy-MM'T'HH:mmz", // handle W3C dates without time forcing them to be GMT
"yyyy'T'HH:mmz",
"yyyy-MM-dd't'HH:mmz",
"yyyy-MM-dd'T'HH:mm'Z'",
"yyyy-MM-dd't'HH:mm'z'",
"yyyy-MM-dd",
"yyyy-MM",
"yyyy"
};
// order is like this because the SimpleDateFormat.parse does not fail with
// exception
// if it can parse a valid date out of a substring of the full string given
// the mask
// so we have to check the most complete format first, then it fails with
// exception
private static final String[] RFC822_MASKS = { "EEE, dd MMM yy HH:mm:ss z", "EEE, dd MMM yy HH:mm z", "dd MMM yy HH:mm:ss z", "dd MMM yy HH:mm z" };
// order is like this because the SimpleDateFormat.parse does not fail with
// exception
// if it can parse a valid date out of a substring of the full string given
// the mask
// so we have to check the most complete format first, then it fails with
// exception
private static final String[] W3CDATETIME_MASKS = { "yyyy-MM-dd'T'HH:mm:ss.SSSz", "yyyy-MM-dd't'HH:mm:ss.SSSz", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
"yyyy-MM-dd't'HH:mm:ss.SSS'z'", "yyyy-MM-dd'T'HH:mm:ssz", "yyyy-MM-dd't'HH:mm:ssz", "yyyy-MM-dd'T'HH:mm:ssZ", "yyyy-MM-dd't'HH:mm:ssZ",
"yyyy-MM-dd'T'HH:mm:ss'Z'", "yyyy-MM-dd't'HH:mm:ss'z'", "yyyy-MM-dd'T'HH:mmz", // together
// with
// logic
// in
// the
// parseW3CDateTime
// they
"yyyy-MM'T'HH:mmz", // handle W3C dates without time forcing them to
// be GMT
"yyyy'T'HH:mmz", "yyyy-MM-dd't'HH:mmz", "yyyy-MM-dd'T'HH:mm'Z'", "yyyy-MM-dd't'HH:mm'z'", "yyyy-MM-dd", "yyyy-MM", "yyyy" };
/**
* The masks used to validate and parse the input to this Atom date.
* These are a lot more forgiving than what the Atom spec allows.
* The forms that are invalid according to the spec are indicated.
* The masks used to validate and parse the input to this Atom date. These
* are a lot more forgiving than what the Atom spec allows. The forms that
* are invalid according to the spec are indicated.
*/
private static final String[] masks = {
"yyyy-MM-dd'T'HH:mm:ss.SSSz",
"yyyy-MM-dd't'HH:mm:ss.SSSz", // invalid
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
"yyyy-MM-dd't'HH:mm:ss.SSS'z'", // invalid
"yyyy-MM-dd'T'HH:mm:ssz",
"yyyy-MM-dd't'HH:mm:ssz", // invalid
"yyyy-MM-dd'T'HH:mm:ss'Z'",
"yyyy-MM-dd't'HH:mm:ss'z'", // invalid
private static final String[] masks = { "yyyy-MM-dd'T'HH:mm:ss.SSSz", "yyyy-MM-dd't'HH:mm:ss.SSSz", // invalid
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "yyyy-MM-dd't'HH:mm:ss.SSS'z'", // invalid
"yyyy-MM-dd'T'HH:mm:ssz", "yyyy-MM-dd't'HH:mm:ssz", // invalid
"yyyy-MM-dd'T'HH:mm:ss'Z'", "yyyy-MM-dd't'HH:mm:ss'z'", // invalid
"yyyy-MM-dd'T'HH:mmz", // invalid
"yyyy-MM-dd't'HH:mmz", // invalid
"yyyy-MM-dd'T'HH:mm'Z'", // invalid
"yyyy-MM-dd't'HH:mm'z'", // invalid
"yyyy-MM-dd",
"yyyy-MM",
"yyyy"
};
"yyyy-MM-dd", "yyyy-MM", "yyyy" };
/**
* Private constructor to avoid DateParser instances creation.
@ -122,28 +99,28 @@ public class DateParser {
*
* @param masks array of masks to use for parsing the string
* @param sDate string to parse for a date.
* @return the Date represented by the given string using one of the given masks.
* It returns <b>null</b> if it was not possible to parse the the string with any of the masks.
* @return the Date represented by the given string using one of the given
* masks. It returns <b>null</b> if it was not possible to parse the
* the string with any of the masks.
*
*/
private static Date parseUsingMask(String[] masks,String sDate) {
sDate = (sDate!=null) ? sDate.trim() : null;
private static Date parseUsingMask(final String[] masks, String sDate) {
sDate = sDate != null ? sDate.trim() : null;
ParsePosition pp = null;
Date d = null;
for (int i=0;d==null && i<masks.length;i++) {
DateFormat df = new SimpleDateFormat(masks[i],Locale.US);
//df.setLenient(false);
for (int i = 0; d == null && i < masks.length; i++) {
final DateFormat df = new SimpleDateFormat(masks[i], Locale.US);
// df.setLenient(false);
df.setLenient(true);
try {
pp = new ParsePosition(0);
d = df.parse(sDate,pp);
if (pp.getIndex()!=sDate.length()) {
d = df.parse(sDate, pp);
if (pp.getIndex() != sDate.length()) {
d = null;
}
//System.out.println("pp["+pp.getIndex()+"] s["+sDate+" m["+masks[i]+"] d["+d+"]");
}
catch (Exception ex1) {
//System.out.println("s: "+sDate+" m: "+masks[i]+" d: "+null);
// System.out.println("pp["+pp.getIndex()+"] s["+sDate+" m["+masks[i]+"] d["+d+"]");
} catch (final Exception ex1) {
// System.out.println("s: "+sDate+" m: "+masks[i]+" d: "+null);
}
}
return d;
@ -164,24 +141,26 @@ public class DateParser {
* <li>"dd MMM yy HH:mm z"</li>
* </ul>
* <p/>
* Refer to the java.text.SimpleDateFormat javadocs for details on the format of each element.
* Refer to the java.text.SimpleDateFormat javadocs for details on the
* format of each element.
* <p/>
*
* @param sDate string to parse for a date.
* @return the Date represented by the given RFC822 string.
* It returns <b>null</b> if it was not possible to parse the given string into a Date.
* @return the Date represented by the given RFC822 string. It returns
* <b>null</b> if it was not possible to parse the given string into
* a Date.
*
*/
public static Date parseRFC822(String sDate) {
int utIndex = sDate.indexOf(" UT");
if (utIndex>-1) {
String pre = sDate.substring(0,utIndex);
String post = sDate.substring(utIndex+3);
final int utIndex = sDate.indexOf(" UT");
if (utIndex > -1) {
final String pre = sDate.substring(0, utIndex);
final String post = sDate.substring(utIndex + 3);
sDate = pre + " GMT" + post;
}
return parseUsingMask(RFC822_MASKS,sDate);
return parseUsingMask(RFC822_MASKS, sDate);
}
/**
* Parses a Date out of a String with a date in W3C date-time format.
* <p/>
@ -194,57 +173,61 @@ public class DateParser {
* <li>"yyyy"</li>
* </ul>
* <p/>
* Refer to the java.text.SimpleDateFormat javadocs for details on the format of each element.
* Refer to the java.text.SimpleDateFormat javadocs for details on the
* format of each element.
* <p/>
*
* @param sDate string to parse for a date.
* @return the Date represented by the given W3C date-time string.
* It returns <b>null</b> if it was not possible to parse the given string into a Date.
* @return the Date represented by the given W3C date-time string. It
* returns <b>null</b> if it was not possible to parse the given
* string into a Date.
*
*/
public static Date parseW3CDateTime(String sDate) {
// if sDate has time on it, it injects 'GTM' before de TZ displacement to
// if sDate has time on it, it injects 'GTM' before de TZ displacement
// to
// allow the SimpleDateFormat parser to parse it properly
int tIndex = sDate.indexOf("T");
if (tIndex>-1) {
final int tIndex = sDate.indexOf("T");
if (tIndex > -1) {
if (sDate.endsWith("Z")) {
sDate = sDate.substring(0,sDate.length()-1)+"+00:00";
sDate = sDate.substring(0, sDate.length() - 1) + "+00:00";
}
int tzdIndex = sDate.indexOf("+",tIndex);
if (tzdIndex==-1) {
tzdIndex = sDate.indexOf("-",tIndex);
int tzdIndex = sDate.indexOf("+", tIndex);
if (tzdIndex == -1) {
tzdIndex = sDate.indexOf("-", tIndex);
}
if (tzdIndex>-1) {
String pre = sDate.substring(0,tzdIndex);
int secFraction = pre.indexOf(",");
if (secFraction>-1) {
pre = pre.substring(0,secFraction);
if (tzdIndex > -1) {
String pre = sDate.substring(0, tzdIndex);
final int secFraction = pre.indexOf(",");
if (secFraction > -1) {
pre = pre.substring(0, secFraction);
}
String post = sDate.substring(tzdIndex);
final String post = sDate.substring(tzdIndex);
sDate = pre + "GMT" + post;
}
}
else {
} else {
sDate += "T00:00GMT";
}
return parseUsingMask(W3CDATETIME_MASKS,sDate);
return parseUsingMask(W3CDATETIME_MASKS, sDate);
}
/**
* Parses a Date out of a String with a date in W3C date-time format or
* in a RFC822 format.
* Parses a Date out of a String with a date in W3C date-time format or in a
* RFC822 format.
* <p>
*
* @param sDate string to parse for a date.
* @return the Date represented by the given W3C date-time string.
* It returns <b>null</b> if it was not possible to parse the given string into a Date.
* @return the Date represented by the given W3C date-time string. It
* returns <b>null</b> if it was not possible to parse the given
* string into a Date.
*
* */
public static Date parseDate(String sDate) {
public static Date parseDate(final String sDate) {
Date d = parseW3CDateTime(sDate);
if (d==null) {
if (d == null) {
d = parseRFC822(sDate);
if (d==null && ADDITIONAL_MASKS.length>0) {
d = parseUsingMask(ADDITIONAL_MASKS,sDate);
if (d == null && ADDITIONAL_MASKS.length > 0) {
d = parseUsingMask(ADDITIONAL_MASKS, sDate);
}
}
return d;
@ -253,15 +236,17 @@ public class DateParser {
/**
* create a RFC822 representation of a date.
* <p/>
* Refer to the java.text.SimpleDateFormat javadocs for details on the format of each element.
* Refer to the java.text.SimpleDateFormat javadocs for details on the
* format of each element.
* <p/>
*
* @param date Date to parse
* @return the RFC822 represented by the given Date
* It returns <b>null</b> if it was not possible to parse the date.
* @return the RFC822 represented by the given Date It returns <b>null</b>
* if it was not possible to parse the date.
*
*/
public static String formatRFC822(Date date) {
SimpleDateFormat dateFormater = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'",Locale.US);
public static String formatRFC822(final Date date) {
final SimpleDateFormat dateFormater = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
dateFormater.setTimeZone(TimeZone.getTimeZone("GMT"));
return dateFormater.format(date);
}
@ -269,15 +254,17 @@ public class DateParser {
/**
* create a W3C Date Time representation of a date.
* <p/>
* Refer to the java.text.SimpleDateFormat javadocs for details on the format of each element.
* Refer to the java.text.SimpleDateFormat javadocs for details on the
* format of each element.
* <p/>
*
* @param date Date to parse
* @return the W3C Date Time represented by the given Date
* It returns <b>null</b> if it was not possible to parse the date.
* @return the W3C Date Time represented by the given Date It returns
* <b>null</b> if it was not possible to parse the date.
*
*/
public static String formatW3CDateTime(Date date) {
SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'",Locale.US);
public static String formatW3CDateTime(final Date date) {
final SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
dateFormater.setTimeZone(TimeZone.getTimeZone("GMT"));
return dateFormater.format(date);
}

View file

@ -16,21 +16,23 @@
*/
package com.sun.syndication.io.impl;
import com.sun.syndication.io.WireFeedGenerator;
import java.util.List;
import com.sun.syndication.io.WireFeedGenerator;
/**
* Generates an XML document (JDOM Document) out of a Feed.
* <p>
* It can generate all flavors of RSS (0.90, 0.91, 0.92, 0.93, 0.94, 1.0 and 2.0) and
* Atom 0.3 feed.
* It can generate all flavors of RSS (0.90, 0.91, 0.92, 0.93, 0.94, 1.0 and
* 2.0) and Atom 0.3 feed.
* <p>
* WireFeedGenerator instances are thread safe.
* <p>
* Generators for a specific type must extend this class and register in the generator list.
* (Right now registration is hardcoded in the WireFeedGenerator constructor).
* Generators for a specific type must extend this class and register in the
* generator list. (Right now registration is hardcoded in the WireFeedGenerator
* constructor).
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -42,17 +44,17 @@ public class FeedGenerators extends PluginManager {
*/
public static final String FEED_GENERATORS_KEY = "WireFeedGenerator.classes";
public FeedGenerators() {
super(FEED_GENERATORS_KEY);
}
public WireFeedGenerator getGenerator(String feedType) {
public WireFeedGenerator getGenerator(final String feedType) {
return (WireFeedGenerator) getPlugin(feedType);
}
protected String getKey(Object obj) {
return ((WireFeedGenerator)obj).getType();
@Override
protected String getKey(final Object obj) {
return ((WireFeedGenerator) obj).getType();
}
public List getSupportedFeedTypes() {

View file

@ -16,10 +16,12 @@
*/
package com.sun.syndication.io.impl;
import com.sun.syndication.io.WireFeedParser;
import org.jdom2.Document;
import java.util.List;
import org.jdom2.Document;
import com.sun.syndication.io.WireFeedParser;
/**
* Parses an XML document (JDOM Document) into a Feed.
* <p>
@ -30,9 +32,11 @@ import java.util.List;
* <p>
* WireFeedParser instances are thread safe.
* <p>
* Parsers for a specific type must extend this class and register in the parser list.
* (Right now registration is hardcoded in the WireFeedParser constructor).
* Parsers for a specific type must extend this class and register in the parser
* list. (Right now registration is hardcoded in the WireFeedParser
* constructor).
* <p>
*
* @author Alejandro Abdelnur
*
*/
@ -60,14 +64,16 @@ public class FeedParsers extends PluginManager {
/**
* Finds the real parser type for the given document feed.
* <p>
*
* @param document document feed to find the parser for.
* @return the parser for the given document or <b>null</b> if there is no parser for that document.
* @return the parser for the given document or <b>null</b> if there is no
* parser for that document.
*
*/
public WireFeedParser getParserFor(Document document) {
List parsers = getPlugins();
public WireFeedParser getParserFor(final Document document) {
final List parsers = getPlugins();
WireFeedParser parser = null;
for (int i=0;parser==null && i<parsers.size();i++) {
for (int i = 0; parser == null && i < parsers.size(); i++) {
parser = (WireFeedParser) parsers.get(i);
if (!parser.isMyType(document)) {
parser = null;
@ -76,8 +82,9 @@ public class FeedParsers extends PluginManager {
return parser;
}
protected String getKey(Object obj) {
return ((WireFeedParser)obj).getType();
@Override
protected String getKey(final Object obj) {
return ((WireFeedParser) obj).getType();
}
}

View file

@ -16,42 +16,44 @@
*/
package com.sun.syndication.io.impl;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.io.ModuleGenerator;
import org.jdom2.Element;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jdom2.Element;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.io.ModuleGenerator;
/**
*/
public class ModuleGenerators extends PluginManager {
private Set _allNamespaces;
public ModuleGenerators(String propertyKey, BaseWireFeedGenerator parentGenerator) {
public ModuleGenerators(final String propertyKey, final BaseWireFeedGenerator parentGenerator) {
super(propertyKey, null, parentGenerator);
}
public ModuleGenerator getGenerator(String uri) {
public ModuleGenerator getGenerator(final String uri) {
return (ModuleGenerator) getPlugin(uri);
}
protected String getKey(Object obj) {
return ((ModuleGenerator)obj).getNamespaceUri();
@Override
protected String getKey(final Object obj) {
return ((ModuleGenerator) obj).getNamespaceUri();
}
public List getModuleNamespaces() {
return getKeys();
}
public void generateModules(List modules, Element element) {
Map generators = getPluginMap();
public void generateModules(final List modules, final Element element) {
final Map generators = getPluginMap();
for (int i = 0; i < modules.size(); i++) {
Module module = (Module) modules.get(i);
String namespaceUri = module.getUri();
ModuleGenerator generator = (ModuleGenerator)generators.get(namespaceUri);
final Module module = (Module) modules.get(i);
final String namespaceUri = module.getUri();
final ModuleGenerator generator = (ModuleGenerator) generators.get(namespaceUri);
if (generator != null) {
generator.generate(module, element);
}
@ -59,14 +61,14 @@ public class ModuleGenerators extends PluginManager {
}
public Set getAllNamespaces() {
if (_allNamespaces==null) {
_allNamespaces = new HashSet();
List mUris = getModuleNamespaces();
for (int i=0;i<mUris.size();i++) {
ModuleGenerator mGen = getGenerator((String)mUris.get(i));
_allNamespaces.addAll(mGen.getNamespaces());
if (this._allNamespaces == null) {
this._allNamespaces = new HashSet();
final List mUris = getModuleNamespaces();
for (int i = 0; i < mUris.size(); i++) {
final ModuleGenerator mGen = getGenerator((String) mUris.get(i));
this._allNamespaces.addAll(mGen.getNamespaces());
}
}
return _allNamespaces;
return this._allNamespaces;
}
}

View file

@ -16,39 +16,41 @@
*/
package com.sun.syndication.io.impl;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.io.ModuleParser;
import com.sun.syndication.io.WireFeedParser;
import java.util.ArrayList;
import java.util.List;
import org.jdom2.Element;
import org.jdom2.Namespace;
import java.util.ArrayList;
import java.util.List;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.io.ModuleParser;
import com.sun.syndication.io.WireFeedParser;
/**
*/
public class ModuleParsers extends PluginManager {
public ModuleParsers(String propertyKey, WireFeedParser parentParser) {
public ModuleParsers(final String propertyKey, final WireFeedParser parentParser) {
super(propertyKey, parentParser, null);
}
public String getKey(Object obj) {
return ((ModuleParser)obj).getNamespaceUri();
@Override
public String getKey(final Object obj) {
return ((ModuleParser) obj).getNamespaceUri();
}
public List getModuleNamespaces() {
return getKeys();
}
public List<Module> parseModules(Element root) {
List<ModuleParser> parsers = getPlugins();
public List<Module> parseModules(final Element root) {
final List<ModuleParser> parsers = getPlugins();
List<Module> modules = null;
for (int i=0;i<parsers.size();i++) {
ModuleParser parser = (ModuleParser) parsers.get(i);
String namespaceUri = parser.getNamespaceUri();
Namespace namespace = Namespace.getNamespace(namespaceUri);
for (int i = 0; i < parsers.size(); i++) {
final ModuleParser parser = parsers.get(i);
final String namespaceUri = parser.getNamespaceUri();
final Namespace namespace = Namespace.getNamespace(namespaceUri);
if (hasElementsFrom(root, namespace)) {
Module module = parser.parse(root);
final Module module = parser.parse(root);
if (module != null) {
if (modules == null) {
modules = new ArrayList<Module>();
@ -60,14 +62,14 @@ public class ModuleParsers extends PluginManager {
return modules;
}
private boolean hasElementsFrom(Element root, Namespace namespace) {
private boolean hasElementsFrom(final Element root, final Namespace namespace) {
boolean hasElements = false;
// boolean hasElements = namespace.equals(root.getNamespace());
// boolean hasElements = namespace.equals(root.getNamespace());
if (!hasElements) {
List<Element> children = root.getChildren();
for (int i=0;!hasElements && i < children.size();i++) {
Element child = (Element) children.get(i);
final List<Element> children = root.getChildren();
for (int i = 0; !hasElements && i < children.size(); i++) {
final Element child = children.get(i);
hasElements = namespace.equals(child.getNamespace());
}
}

View file

@ -1,15 +1,12 @@
package com.sun.syndication.io.impl;
/**
* A helper class that parses Numbers out of Strings in a lenient manner.
*
* <p>
* No method will throw any sort of Exception when parsing a string.
* All methods accept any Java String or null as legal input, if the
* input is non null, whitespace will be trimmed first, and then parsing
* will be attempted.
* No method will throw any sort of Exception when parsing a string. All methods
* accept any Java String or null as legal input, if the input is non null,
* whitespace will be trimmed first, and then parsing will be attempted.
* </p>
* <p>
* :TODO: Add Integer, Float, and Double methods as needed.
@ -27,14 +24,14 @@ public class NumberParser {
* Parses a Long out of a string.
*
* @param str string to parse for a Long.
* @return the Long represented by the given string,
* It returns <b>null</b> if it was not possible to parse the the string.
* @return the Long represented by the given string, It returns <b>null</b>
* if it was not possible to parse the the string.
*/
public static Long parseLong(String str) {
public static Long parseLong(final String str) {
if (null != str) {
try {
return new Long(Long.parseLong(str.trim()));
} catch (Exception e) {
} catch (final Exception e) {
// :IGNORE:
}
}
@ -42,17 +39,18 @@ public class NumberParser {
}
/**
* Parse an Integer from a String. If the String is not an integer <b>null</b> is returned
* and no exception is thrown.
* Parse an Integer from a String. If the String is not an integer
* <b>null</b> is returned and no exception is thrown.
*
* @param str the String to parse
* @return The Integer represented by the String, or null if it could not be parsed.
* @return The Integer represented by the String, or null if it could not be
* parsed.
*/
public static Integer parseInt(String str) {
public static Integer parseInt(final String str) {
if (null != str) {
try {
return new Integer(Integer.parseInt(str.trim()));
} catch (Exception e) {
} catch (final Exception e) {
// :IGNORE:
}
}
@ -60,16 +58,18 @@ public class NumberParser {
}
/**
* Parse a Float from a String without exceptions. If the String is not a Float then null is returned
* Parse a Float from a String without exceptions. If the String is not a
* Float then null is returned
*
* @param str the String to parse
* @return The Float represented by the String, or null if it could not be parsed.
* @return The Float represented by the String, or null if it could not be
* parsed.
*/
public static Float parseFloat(String str) {
public static Float parseFloat(final String str) {
if (null != str) {
try {
return new Float(Float.parseFloat(str.trim()));
} catch (Exception e) {
} catch (final Exception e) {
// :IGNORE:
}
}
@ -83,22 +83,22 @@ public class NumberParser {
* @param def the value to return if the String cannot be parsed
* @return
*/
public static float parseFloat(String str, float def) {
Float result = parseFloat(str);
return (result == null) ? def : result.floatValue();
public static float parseFloat(final String str, final float def) {
final Float result = parseFloat(str);
return result == null ? def : result.floatValue();
}
/**
* Parses a long out of a string.
*
* @param str string to parse for a long.
* @param def default value to return if it is not possible to parse the the string.
* @param def default value to return if it is not possible to parse the the
* string.
* @return the long represented by the given string, or the default.
*/
public static long parseLong(String str, long def) {
Long ret = parseLong(str);
return (null == ret) ? def : ret.longValue();
public static long parseLong(final String str, final long def) {
final Long ret = parseLong(str);
return null == ret ? def : ret.longValue();
}
}

View file

@ -16,127 +16,139 @@
*/
package com.sun.syndication.io.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.sun.syndication.io.DelegatingModuleGenerator;
import com.sun.syndication.io.DelegatingModuleParser;
import com.sun.syndication.io.WireFeedGenerator;
import com.sun.syndication.io.WireFeedParser;
import java.util.*;
/**
* <p>
*
* @author Alejandro Abdelnur
*
*/
public abstract class PluginManager {
private String[] _propertyValues;
private final String[] _propertyValues;
private Map _pluginsMap;
private List _pluginsList;
private List _keys;
private WireFeedParser _parentParser;
private WireFeedGenerator _parentGenerator;
private final List _keys;
private final WireFeedParser _parentParser;
private final WireFeedGenerator _parentGenerator;
/**
* Creates a PluginManager
* <p>
*
* @param propertyKey property key defining the plugins classes
*
*/
protected PluginManager(String propertyKey) {
protected PluginManager(final String propertyKey) {
this(propertyKey, null, null);
}
protected PluginManager(String propertyKey, WireFeedParser parentParser,
WireFeedGenerator parentGenerator)
{
_parentParser = parentParser;
_parentGenerator = parentGenerator;
_propertyValues = PropertiesLoader.getPropertiesLoader().getTokenizedProperty(propertyKey,", ");
protected PluginManager(final String propertyKey, final WireFeedParser parentParser, final WireFeedGenerator parentGenerator) {
this._parentParser = parentParser;
this._parentGenerator = parentGenerator;
this._propertyValues = PropertiesLoader.getPropertiesLoader().getTokenizedProperty(propertyKey, ", ");
loadPlugins();
_pluginsMap = Collections.unmodifiableMap(_pluginsMap);
_pluginsList = Collections.unmodifiableList(_pluginsList);
_keys = Collections.unmodifiableList(new ArrayList(_pluginsMap.keySet()));
this._pluginsMap = Collections.unmodifiableMap(this._pluginsMap);
this._pluginsList = Collections.unmodifiableList(this._pluginsList);
this._keys = Collections.unmodifiableList(new ArrayList(this._pluginsMap.keySet()));
}
protected abstract String getKey(Object obj);
protected List getKeys() {
return _keys;
return this._keys;
}
protected List getPlugins() {
return _pluginsList;
return this._pluginsList;
}
protected Map getPluginMap() {
return _pluginsMap;
return this._pluginsMap;
}
protected Object getPlugin(String key) {
return _pluginsMap.get(key);
protected Object getPlugin(final String key) {
return this._pluginsMap.get(key);
}
// PRIVATE - LOADER PART
private void loadPlugins() {
List finalPluginsList = new ArrayList();
_pluginsList = new ArrayList();
_pluginsMap = new HashMap();
final List finalPluginsList = new ArrayList();
this._pluginsList = new ArrayList();
this._pluginsMap = new HashMap();
String className = null;
try {
Class[] classes = getClasses();
for (int i=0;i<classes.length;i++) {
className = classes[i].getName();
Object plugin = classes[i].newInstance();
final Class[] classes = getClasses();
for (final Class classe : classes) {
className = classe.getName();
final Object plugin = classe.newInstance();
if (plugin instanceof DelegatingModuleParser) {
((DelegatingModuleParser) plugin).setFeedParser(_parentParser);
((DelegatingModuleParser) plugin).setFeedParser(this._parentParser);
}
if (plugin instanceof DelegatingModuleGenerator) {
((DelegatingModuleGenerator) plugin).setFeedGenerator(_parentGenerator);
((DelegatingModuleGenerator) plugin).setFeedGenerator(this._parentGenerator);
}
_pluginsMap.put(getKey(plugin), plugin);
_pluginsList.add(plugin); // to preserve the order of definition in the rome.properties files
this._pluginsMap.put(getKey(plugin), plugin);
this._pluginsList.add(plugin); // to preserve the order of
// definition
// in the rome.properties files
}
Iterator i = _pluginsMap.values().iterator();
Iterator i = this._pluginsMap.values().iterator();
while (i.hasNext()) {
finalPluginsList.add(i.next()); // to remove overridden plugin impls
finalPluginsList.add(i.next()); // to remove overridden plugin
// impls
}
i = _pluginsList.iterator();
i = this._pluginsList.iterator();
while (i.hasNext()) {
Object plugin = i.next();
final Object plugin = i.next();
if (!finalPluginsList.contains(plugin)) {
i.remove();
}
}
}
catch (Exception ex) {
throw new RuntimeException("could not instantiate plugin "+className,ex);
}catch (ExceptionInInitializerError er) {
throw new RuntimeException("could not instantiate plugin "+className,er);
} catch (final Exception ex) {
throw new RuntimeException("could not instantiate plugin " + className, ex);
} catch (final ExceptionInInitializerError er) {
throw new RuntimeException("could not instantiate plugin " + className, er);
}
}
/**
* Loads and returns the classes defined in the properties files. If the system property "rome.pluginmanager.useloadclass" is
* set to true then classLoader.loadClass will be used to load classes (instead of Class.forName). This is designed to improve
* OSGi compatibility. Further information can be found in https://rome.dev.java.net/issues/show_bug.cgi?id=118
* Loads and returns the classes defined in the properties files. If the
* system property "rome.pluginmanager.useloadclass" is set to true then
* classLoader.loadClass will be used to load classes (instead of
* Class.forName). This is designed to improve OSGi compatibility. Further
* information can be found in
* https://rome.dev.java.net/issues/show_bug.cgi?id=118
* <p>
*
* @return array containing the classes defined in the properties files.
* @throws java.lang.ClassNotFoundException thrown if one of the classes defined in the properties file cannot be loaded
* and hard failure is ON.
* @throws java.lang.ClassNotFoundException thrown if one of the classes
* defined in the properties file cannot be loaded and hard
* failure is ON.
*
*/
private Class[] getClasses() throws ClassNotFoundException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
List classes = new ArrayList();
boolean useLoadClass = Boolean.valueOf(System.getProperty("rome.pluginmanager.useloadclass", "false")).booleanValue();
for (int i = 0; i <_propertyValues.length; i++) {
Class mClass = (useLoadClass ? classLoader.loadClass(_propertyValues[i]) : Class.forName(_propertyValues[i], true, classLoader));
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
final List classes = new ArrayList();
final boolean useLoadClass = Boolean.valueOf(System.getProperty("rome.pluginmanager.useloadclass", "false")).booleanValue();
for (final String _propertyValue : this._propertyValues) {
final Class mClass = useLoadClass ? classLoader.loadClass(_propertyValue) : Class.forName(_propertyValue, true, classLoader);
classes.add(mClass);
}
Class[] array = new Class[classes.size()];
final Class[] array = new Class[classes.size()];
classes.toArray(array);
return array;
}

View file

@ -3,19 +3,25 @@ package com.sun.syndication.io.impl;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.WeakHashMap;
/**
* Properties loader that aggregates a master properties file and several extra properties files,
* all from the current classpath.
* Properties loader that aggregates a master properties file and several extra
* properties files, all from the current classpath.
* <P>
* The master properties file has to be in a distinct location than the extra properties files.
* First the master properties file is loaded, then all the extra properties files in their order
* of appearance in the classpath.
* The master properties file has to be in a distinct location than the extra
* properties files. First the master properties file is loaded, then all the
* extra properties files in their order of appearance in the classpath.
* <P>
* Current use cases (plugin manager for parsers/converters/generators for feeds and modules
* and date formats) assume properties are list of tokens, that why the only method to get
* property values is the getTokenizedProperty().
* Current use cases (plugin manager for parsers/converters/generators for feeds
* and modules and date formats) assume properties are list of tokens, that why
* the only method to get property values is the getTokenizedProperty().
* <p>
*
* @author Alejandro Abdelnur
@ -26,27 +32,23 @@ public class PropertiesLoader {
private static final String MASTER_PLUGIN_FILE = "com/sun/syndication/rome.properties";
private static final String EXTRA_PLUGIN_FILE = "rome.properties";
private static Map<ClassLoader, PropertiesLoader> clMap =
new WeakHashMap<ClassLoader, PropertiesLoader>();
private static Map<ClassLoader, PropertiesLoader> clMap = new WeakHashMap<ClassLoader, PropertiesLoader>();
/**
* Returns the PropertiesLoader singleton used by ROME to load plugin components.
* Returns the PropertiesLoader singleton used by ROME to load plugin
* components.
*
* @return PropertiesLoader singleton.
*
*/
public static PropertiesLoader getPropertiesLoader() {
synchronized(PropertiesLoader.class) {
PropertiesLoader loader = (PropertiesLoader)
clMap.get(Thread.currentThread().getContextClassLoader());
synchronized (PropertiesLoader.class) {
PropertiesLoader loader = clMap.get(Thread.currentThread().getContextClassLoader());
if (loader == null) {
try {
loader = new PropertiesLoader(MASTER_PLUGIN_FILE, EXTRA_PLUGIN_FILE);
clMap.put(Thread.currentThread().getContextClassLoader(), loader);
}
catch (IOException ex) {
} catch (final IOException ex) {
throw new RuntimeException(ex);
}
}
@ -54,100 +56,104 @@ public class PropertiesLoader {
}
}
private Properties[] _properties;
private final Properties[] _properties;
/**
* Creates a PropertiesLoader.
* <p>
*
* @param masterFileLocation master file location, there must be only one.
* @param extraFileLocation extra file location, there may be many.
* @throws IOException thrown if one of the properties file could not be read.
* @throws IOException thrown if one of the properties file could not be
* read.
*
*/
private PropertiesLoader(String masterFileLocation,String extraFileLocation) throws IOException {
List<Properties> propertiesList = new ArrayList<Properties>();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
private PropertiesLoader(final String masterFileLocation, final String extraFileLocation) throws IOException {
final List<Properties> propertiesList = new ArrayList<Properties>();
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
try {
InputStream is = classLoader.getResourceAsStream(masterFileLocation);
Properties p = new Properties();
final InputStream is = classLoader.getResourceAsStream(masterFileLocation);
final Properties p = new Properties();
p.load(is);
is.close();
propertiesList.add(p);
}
catch (IOException ioex) {
IOException ex = new IOException("could not load ROME master plugins file ["+masterFileLocation+"], "+
ioex.getMessage());
} catch (final IOException ioex) {
final IOException ex = new IOException("could not load ROME master plugins file [" + masterFileLocation + "], " + ioex.getMessage());
ex.setStackTrace(ioex.getStackTrace());
throw ex;
}
Enumeration<URL> urls = classLoader.getResources(extraFileLocation);
final Enumeration<URL> urls = classLoader.getResources(extraFileLocation);
while (urls.hasMoreElements()) {
URL url = (URL) urls.nextElement();
Properties p = new Properties();
final URL url = urls.nextElement();
final Properties p = new Properties();
try {
InputStream is = url.openStream();
final InputStream is = url.openStream();
p.load(is);
is.close();
}
catch (IOException ioex) {
IOException ex = new IOException("could not load ROME extensions plugins file ["+url.toString()+"], "+
ioex.getMessage());
} catch (final IOException ioex) {
final IOException ex = new IOException("could not load ROME extensions plugins file [" + url.toString() + "], " + ioex.getMessage());
ex.setStackTrace(ioex.getStackTrace());
throw ex;
}
propertiesList.add(p);
}
_properties = new Properties[propertiesList.size()];
propertiesList.toArray(_properties);
this._properties = new Properties[propertiesList.size()];
propertiesList.toArray(this._properties);
}
/**
* Returns an array of tokenized values stored under a property key in all properties files.
* If the master file has this property its tokens will be the first ones in the array.
* Returns an array of tokenized values stored under a property key in all
* properties files. If the master file has this property its tokens will be
* the first ones in the array.
* <p>
*
* @param key property key to retrieve values
* @param separator String with all separator characters to tokenize from the values in all
* properties files.
* @return all the tokens for the given property key from all the properties files.
* @param separator String with all separator characters to tokenize from
* the values in all properties files.
* @return all the tokens for the given property key from all the properties
* files.
*
*/
public String[] getTokenizedProperty(String key,String separator) {
List<String> entriesList = new ArrayList<String>();
for (int i=0;i<_properties.length;i++) {
String values = _properties[i].getProperty(key);
if (values!=null) {
StringTokenizer st = new StringTokenizer(values,separator);
public String[] getTokenizedProperty(final String key, final String separator) {
final List<String> entriesList = new ArrayList<String>();
for (final Properties _propertie : this._properties) {
final String values = _propertie.getProperty(key);
if (values != null) {
final StringTokenizer st = new StringTokenizer(values, separator);
while (st.hasMoreTokens()) {
String token = st.nextToken();
final String token = st.nextToken();
entriesList.add(token);
}
}
}
String[] entries = new String[entriesList.size()];
final String[] entries = new String[entriesList.size()];
entriesList.toArray(entries);
return entries;
}
/**
* Returns an array of values stored under a property key in all properties files.
* If the master file has this property it will be the first ones in the array.
* Returns an array of values stored under a property key in all properties
* files. If the master file has this property it will be the first ones in
* the array.
* <p>
*
* @param key property key to retrieve values
* @return all the values for the given property key from all the properties files.
* @return all the values for the given property key from all the properties
* files.
*
*/
public String[] getProperty(String key) {
List<String> entriesList = new ArrayList<String>();
for (int i=0;i<_properties.length;i++) {
String values = _properties[i].getProperty(key);
if (values!=null) {
public String[] getProperty(final String key) {
final List<String> entriesList = new ArrayList<String>();
for (final Properties _propertie : this._properties) {
final String values = _propertie.getProperty(key);
if (values != null) {
entriesList.add(values);
}
}
String[] entries = new String[entriesList.size()];
final String[] entries = new String[entriesList.size()];
entriesList.toArray(entries);
return entries;
}

View file

@ -16,15 +16,18 @@
*/
package com.sun.syndication.io.impl;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.rss.*;
import com.sun.syndication.io.FeedException;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.Namespace;
import java.util.List;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.rss.Channel;
import com.sun.syndication.feed.rss.Image;
import com.sun.syndication.feed.rss.Item;
import com.sun.syndication.feed.rss.TextInput;
import com.sun.syndication.io.FeedException;
/**
* Feed Generator for RSS 0.90
@ -46,14 +49,15 @@ public class RSS090Generator extends BaseWireFeedGenerator {
this("rss_0.9");
}
protected RSS090Generator(String type) {
protected RSS090Generator(final String type) {
super(type);
}
public Document generate(WireFeed feed) throws FeedException {
Channel channel = (Channel)feed;
Element root = createRootElement(channel);
populateFeed(channel,root);
@Override
public Document generate(final WireFeed feed) throws FeedException {
final Channel channel = (Channel) feed;
final Element root = createRootElement(channel);
populateFeed(channel, root);
purgeUnusedNamespaceDeclarations(root);
return createDocument(root);
}
@ -70,12 +74,12 @@ public class RSS090Generator extends BaseWireFeedGenerator {
return CONTENT_NS;
}
protected Document createDocument(Element root) {
protected Document createDocument(final Element root) {
return new Document(root);
}
protected Element createRootElement(Channel channel) {
Element root = new Element("RDF",getRDFNamespace());
protected Element createRootElement(final Channel channel) {
final Element root = new Element("RDF", getRDFNamespace());
root.addNamespaceDeclaration(getFeedNamespace());
root.addNamespaceDeclaration(getRDFNamespace());
root.addNamespaceDeclaration(getContentNamespace());
@ -83,89 +87,88 @@ public class RSS090Generator extends BaseWireFeedGenerator {
return root;
}
protected void populateFeed(Channel channel, Element parent) throws FeedException {
addChannel(channel,parent);
addImage(channel,parent);
addTextInput(channel,parent);
addItems(channel,parent);
generateForeignMarkup(parent, (List<Element>)channel.getForeignMarkup());
protected void populateFeed(final Channel channel, final Element parent) throws FeedException {
addChannel(channel, parent);
addImage(channel, parent);
addTextInput(channel, parent);
addItems(channel, parent);
generateForeignMarkup(parent, channel.getForeignMarkup());
}
protected void addChannel(Channel channel,Element parent) throws FeedException {
Element eChannel = new Element("channel", getFeedNamespace());
populateChannel(channel,eChannel);
protected void addChannel(final Channel channel, final Element parent) throws FeedException {
final Element eChannel = new Element("channel", getFeedNamespace());
populateChannel(channel, eChannel);
checkChannelConstraints(eChannel);
parent.addContent(eChannel);
generateFeedModules(channel.getModules(),eChannel);
generateFeedModules(channel.getModules(), eChannel);
}
/**
* Populates the given channel with parsed data from the ROME element that holds the
* channel data.
* Populates the given channel with parsed data from the ROME element that
* holds the channel data.
*
* @param channel the channel into which parsed data will be added.
* @param eChannel the XML element that holds the data for the channel.
*/
protected void populateChannel(Channel channel,Element eChannel) {
String title = channel.getTitle();
if (title!=null) {
eChannel.addContent(generateSimpleElement("title",title));
protected void populateChannel(final Channel channel, final Element eChannel) {
final String title = channel.getTitle();
if (title != null) {
eChannel.addContent(generateSimpleElement("title", title));
}
String link = channel.getLink();
if (link!=null) {
eChannel.addContent(generateSimpleElement("link",link));
final String link = channel.getLink();
if (link != null) {
eChannel.addContent(generateSimpleElement("link", link));
}
String description = channel.getDescription();
if (description!=null) {
eChannel.addContent(generateSimpleElement("description",description));
final String description = channel.getDescription();
if (description != null) {
eChannel.addContent(generateSimpleElement("description", description));
}
}
// maxLen == -1 means unlimited.
protected void checkNotNullAndLength(Element parent, String childName, int minLen, int maxLen) throws FeedException {
Element child = parent.getChild(childName,getFeedNamespace());
protected void checkNotNullAndLength(final Element parent, final String childName, final int minLen, final int maxLen) throws FeedException {
final Element child = parent.getChild(childName, getFeedNamespace());
if (child == null) {
throw new FeedException("Invalid "+getType()+" feed, missing "+parent.getName()+" "+childName);
throw new FeedException("Invalid " + getType() + " feed, missing " + parent.getName() + " " + childName);
}
checkLength(parent,childName,minLen,maxLen);
checkLength(parent, childName, minLen, maxLen);
}
// maxLen == -1 means unlimited.
protected void checkLength(Element parent, String childName, int minLen, int maxLen) throws FeedException {
Element child = parent.getChild(childName,getFeedNamespace());
protected void checkLength(final Element parent, final String childName, final int minLen, final int maxLen) throws FeedException {
final Element child = parent.getChild(childName, getFeedNamespace());
if (child != null) {
if (minLen>0 && child.getText().length()<minLen) {
throw new FeedException("Invalid "+getType()+" feed, "+parent.getName()+" "+childName + "short of "+minLen+" length");
if (minLen > 0 && child.getText().length() < minLen) {
throw new FeedException("Invalid " + getType() + " feed, " + parent.getName() + " " + childName + "short of " + minLen + " length");
}
if (maxLen>-1 && child.getText().length()>maxLen) {
throw new FeedException("Invalid "+getType()+" feed, "+parent.getName()+" "+childName + "exceeds "+maxLen+" length");
if (maxLen > -1 && child.getText().length() > maxLen) {
throw new FeedException("Invalid " + getType() + " feed, " + parent.getName() + " " + childName + "exceeds " + maxLen + " length");
}
}
}
protected void addImage(Channel channel,Element parent) throws FeedException {
Image image = channel.getImage();
if (image!=null) {
Element eImage = new Element("image", getFeedNamespace());
populateImage(image,eImage);
protected void addImage(final Channel channel, final Element parent) throws FeedException {
final Image image = channel.getImage();
if (image != null) {
final Element eImage = new Element("image", getFeedNamespace());
populateImage(image, eImage);
checkImageConstraints(eImage);
parent.addContent(eImage);
}
}
protected void populateImage(Image image,Element eImage) {
String title = image.getTitle();
if (title!=null) {
eImage.addContent(generateSimpleElement("title",title));
protected void populateImage(final Image image, final Element eImage) {
final String title = image.getTitle();
if (title != null) {
eImage.addContent(generateSimpleElement("title", title));
}
String url = image.getUrl();
if (url!=null) {
eImage.addContent(generateSimpleElement("url",url));
final String url = image.getUrl();
if (url != null) {
eImage.addContent(generateSimpleElement("url", url));
}
String link = image.getLink();
if (link!=null) {
eImage.addContent(generateSimpleElement("link",link));
final String link = image.getLink();
if (link != null) {
eImage.addContent(generateSimpleElement("link", link));
}
}
@ -174,98 +177,98 @@ public class RSS090Generator extends BaseWireFeedGenerator {
return "textInput";
}
protected void addTextInput(Channel channel,Element parent) throws FeedException {
TextInput textInput = channel.getTextInput();
if (textInput!=null) {
Element eTextInput = new Element(getTextInputLabel(), getFeedNamespace());
populateTextInput(textInput,eTextInput);
protected void addTextInput(final Channel channel, final Element parent) throws FeedException {
final TextInput textInput = channel.getTextInput();
if (textInput != null) {
final Element eTextInput = new Element(getTextInputLabel(), getFeedNamespace());
populateTextInput(textInput, eTextInput);
checkTextInputConstraints(eTextInput);
parent.addContent(eTextInput);
}
}
protected void populateTextInput(TextInput textInput,Element eTextInput) {
String title = textInput.getTitle();
if (title!=null) {
eTextInput.addContent(generateSimpleElement("title",title));
protected void populateTextInput(final TextInput textInput, final Element eTextInput) {
final String title = textInput.getTitle();
if (title != null) {
eTextInput.addContent(generateSimpleElement("title", title));
}
String description = textInput.getDescription();
if (description!=null) {
eTextInput.addContent(generateSimpleElement("description",description));
final String description = textInput.getDescription();
if (description != null) {
eTextInput.addContent(generateSimpleElement("description", description));
}
String name = textInput.getName();
if (name!=null) {
eTextInput.addContent(generateSimpleElement("name",name));
final String name = textInput.getName();
if (name != null) {
eTextInput.addContent(generateSimpleElement("name", name));
}
String link = textInput.getLink();
if (link!=null) {
eTextInput.addContent(generateSimpleElement("link",link));
final String link = textInput.getLink();
if (link != null) {
eTextInput.addContent(generateSimpleElement("link", link));
}
}
protected void addItems(Channel channel,Element parent) throws FeedException {
List<Item> items = channel.getItems();
for (int i=0;i<items.size();i++) {
addItem((Item)items.get(i),parent, i);
protected void addItems(final Channel channel, final Element parent) throws FeedException {
final List<Item> items = channel.getItems();
for (int i = 0; i < items.size(); i++) {
addItem(items.get(i), parent, i);
}
checkItemsConstraints(parent);
}
protected void addItem(Item item, Element parent, int index) throws FeedException {
Element eItem = new Element("item", getFeedNamespace());
populateItem(item,eItem, index);
protected void addItem(final Item item, final Element parent, final int index) throws FeedException {
final Element eItem = new Element("item", getFeedNamespace());
populateItem(item, eItem, index);
checkItemConstraints(eItem);
generateItemModules(item.getModules(),eItem);
generateItemModules(item.getModules(), eItem);
parent.addContent(eItem);
}
protected void populateItem(Item item, Element eItem, int index) {
String title = item.getTitle();
if (title!=null) {
eItem.addContent(generateSimpleElement("title",title));
protected void populateItem(final Item item, final Element eItem, final int index) {
final String title = item.getTitle();
if (title != null) {
eItem.addContent(generateSimpleElement("title", title));
}
String link = item.getLink();
if (link!=null) {
eItem.addContent(generateSimpleElement("link",link));
final String link = item.getLink();
if (link != null) {
eItem.addContent(generateSimpleElement("link", link));
}
generateForeignMarkup(eItem, (List<Element>)item.getForeignMarkup());
generateForeignMarkup(eItem, item.getForeignMarkup());
}
protected Element generateSimpleElement(String name, String value) {
Element element = new Element(name, getFeedNamespace());
protected Element generateSimpleElement(final String name, final String value) {
final Element element = new Element(name, getFeedNamespace());
element.addContent(value);
return element;
}
protected void checkChannelConstraints(Element eChannel) throws FeedException {
checkNotNullAndLength(eChannel,"title", 0, 40);
checkNotNullAndLength(eChannel,"description", 0, 500);
checkNotNullAndLength(eChannel,"link", 0, 500);
protected void checkChannelConstraints(final Element eChannel) throws FeedException {
checkNotNullAndLength(eChannel, "title", 0, 40);
checkNotNullAndLength(eChannel, "description", 0, 500);
checkNotNullAndLength(eChannel, "link", 0, 500);
}
protected void checkImageConstraints(Element eImage) throws FeedException {
checkNotNullAndLength(eImage,"title", 0, 40);
checkNotNullAndLength(eImage,"url", 0, 500);
checkNotNullAndLength(eImage,"link", 0, 500);
protected void checkImageConstraints(final Element eImage) throws FeedException {
checkNotNullAndLength(eImage, "title", 0, 40);
checkNotNullAndLength(eImage, "url", 0, 500);
checkNotNullAndLength(eImage, "link", 0, 500);
}
protected void checkTextInputConstraints(Element eTextInput) throws FeedException {
checkNotNullAndLength(eTextInput,"title", 0, 40);
checkNotNullAndLength(eTextInput,"description", 0, 100);
checkNotNullAndLength(eTextInput,"name", 0, 500);
checkNotNullAndLength(eTextInput,"link", 0, 500);
protected void checkTextInputConstraints(final Element eTextInput) throws FeedException {
checkNotNullAndLength(eTextInput, "title", 0, 40);
checkNotNullAndLength(eTextInput, "description", 0, 100);
checkNotNullAndLength(eTextInput, "name", 0, 500);
checkNotNullAndLength(eTextInput, "link", 0, 500);
}
protected void checkItemsConstraints(Element parent) throws FeedException {
int count = parent.getChildren("item",getFeedNamespace()).size();
if (count<1 || count>15) {
throw new FeedException("Invalid "+getType()+" feed, item count is "+count+" it must be between 1 an 15");
protected void checkItemsConstraints(final Element parent) throws FeedException {
final int count = parent.getChildren("item", getFeedNamespace()).size();
if (count < 1 || count > 15) {
throw new FeedException("Invalid " + getType() + " feed, item count is " + count + " it must be between 1 an 15");
}
}
protected void checkItemConstraints(Element eItem) throws FeedException {
checkNotNullAndLength(eItem,"title", 0, 100);
checkNotNullAndLength(eItem,"link", 0, 500);
protected void checkItemConstraints(final Element eItem) throws FeedException {
checkNotNullAndLength(eItem, "title", 0, 100);
checkNotNullAndLength(eItem, "link", 0, 500);
}
}

View file

@ -16,6 +16,15 @@
*/
package com.sun.syndication.io.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.Namespace;
import com.sun.syndication.feed.WireFeed;
import com.sun.syndication.feed.module.Module;
import com.sun.syndication.feed.rss.Channel;
@ -23,14 +32,6 @@ import com.sun.syndication.feed.rss.Image;
import com.sun.syndication.feed.rss.Item;
import com.sun.syndication.feed.rss.TextInput;
import com.sun.syndication.io.FeedException;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.Namespace;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
/**
*/
@ -44,30 +45,29 @@ public class RSS090Parser extends BaseWireFeedParser {
private static final Namespace RSS_NS = Namespace.getNamespace(RSS_URI);
private static final Namespace CONTENT_NS = Namespace.getNamespace(CONTENT_URI);
public RSS090Parser() {
this("rss_0.9", RSS_NS);
}
protected RSS090Parser(String type, Namespace ns) {
protected RSS090Parser(final String type, final Namespace ns) {
super(type, ns);
}
public boolean isMyType(Document document) {
@Override
public boolean isMyType(final Document document) {
boolean ok = false;
Element rssRoot = document.getRootElement();
Namespace defaultNS = rssRoot.getNamespace();
List<Namespace> additionalNSs = rssRoot.getAdditionalNamespaces();
final Element rssRoot = document.getRootElement();
final Namespace defaultNS = rssRoot.getNamespace();
final List<Namespace> additionalNSs = rssRoot.getAdditionalNamespaces();
ok = defaultNS!=null && defaultNS.equals(getRDFNamespace());
ok = defaultNS != null && defaultNS.equals(getRDFNamespace());
if (ok) {
if (additionalNSs==null) {
if (additionalNSs == null) {
ok = false;
}
else {
} else {
ok = false;
for (int i=0;!ok && i<additionalNSs.size();i++) {
for (int i = 0; !ok && i < additionalNSs.size(); i++) {
ok = getRSSNamespace().equals(additionalNSs.get(i));
}
}
@ -75,25 +75,29 @@ public class RSS090Parser extends BaseWireFeedParser {
return ok;
}
public WireFeed parse(Document document, boolean validate) throws IllegalArgumentException,FeedException {
@Override
public WireFeed parse(final Document document, final boolean validate) throws IllegalArgumentException, FeedException {
if (validate) {
validateFeed(document);
}
Element rssRoot = document.getRootElement();
final Element rssRoot = document.getRootElement();
return parseChannel(rssRoot);
}
protected void validateFeed(Document document) throws FeedException {
protected void validateFeed(final Document document) throws FeedException {
// TBD
// here we have to validate the Feed against a schema or whatever
// not sure how to do it
// one posibility would be to inject our own schema for the feed (they don't exist out there)
// to the document, produce an ouput and attempt to parse it again with validation turned on.
// one posibility would be to inject our own schema for the feed (they
// don't exist out there)
// to the document, produce an ouput and attempt to parse it again with
// validation turned on.
// otherwise will have to check the document elements by hand.
}
/**
* Returns the namespace used by RSS elements in document of the RSS version the parser supports.
* Returns the namespace used by RSS elements in document of the RSS version
* the parser supports.
* <P>
* This implementation returns the EMTPY namespace.
* <p>
@ -105,7 +109,8 @@ public class RSS090Parser extends BaseWireFeedParser {
}
/**
* Returns the namespace used by RDF elements in document of the RSS version the parser supports.
* Returns the namespace used by RDF elements in document of the RSS version
* the parser supports.
* <P>
* This implementation returns the EMTPY namespace.
* <p>
@ -131,30 +136,31 @@ public class RSS090Parser extends BaseWireFeedParser {
/**
* Parses the root element of an RSS document into a Channel bean.
* <p/>
* It reads title, link and description and delegates to parseImage, parseItems
* and parseTextInput. This delegation always passes the root element of the RSS
* document as different RSS version may have this information in different parts
* of the XML tree (no assumptions made thanks to the specs variaty)
* It reads title, link and description and delegates to parseImage,
* parseItems and parseTextInput. This delegation always passes the root
* element of the RSS document as different RSS version may have this
* information in different parts of the XML tree (no assumptions made
* thanks to the specs variaty)
* <p/>
*
* @param rssRoot the root element of the RSS document to parse.
* @return the parsed Channel bean.
*/
protected WireFeed parseChannel(Element rssRoot) {
Element eChannel = rssRoot.getChild("channel", getRSSNamespace());
protected WireFeed parseChannel(final Element rssRoot) {
final Element eChannel = rssRoot.getChild("channel", getRSSNamespace());
Channel channel = new Channel(getType());
final Channel channel = new Channel(getType());
Element e = eChannel.getChild("title",getRSSNamespace());
if (e!=null) {
Element e = eChannel.getChild("title", getRSSNamespace());
if (e != null) {
channel.setTitle(e.getText());
}
e = eChannel.getChild("link",getRSSNamespace());
if (e!=null) {
e = eChannel.getChild("link", getRSSNamespace());
if (e != null) {
channel.setLink(e.getText());
}
e = eChannel.getChild("description",getRSSNamespace());
if (e!=null) {
e = eChannel.getChild("description", getRSSNamespace());
if (e != null) {
channel.setDescription(e.getText());
}
@ -166,9 +172,9 @@ public class RSS090Parser extends BaseWireFeedParser {
// effectively putting the sharing channel module inside the RSS tag
// and not inside the channel itself. So we also need to look for
// channel modules from the root RSS element.
List<Module> allFeedModules = new ArrayList<Module>();
List<Module> rootModules = parseFeedModules(rssRoot);
List<Module> channelModules = parseFeedModules(eChannel);
final List<Module> allFeedModules = new ArrayList<Module>();
final List<Module> rootModules = parseFeedModules(rssRoot);
final List<Module> channelModules = parseFeedModules(eChannel);
if (rootModules != null) {
allFeedModules.addAll(rootModules);
}
@ -178,40 +184,41 @@ public class RSS090Parser extends BaseWireFeedParser {
channel.setModules(allFeedModules);
channel.setItems(parseItems(rssRoot));
List<Element> foreignMarkup =
extractForeignMarkup(eChannel, channel, getRSSNamespace());
final List<Element> foreignMarkup = extractForeignMarkup(eChannel, channel, getRSSNamespace());
if (foreignMarkup.size() > 0) {
channel.setForeignMarkup(foreignMarkup);
}
return channel;
}
/**
* This method exists because RSS0.90 and RSS1.0 have the 'item' elements under the root elemment.
* And RSS0.91, RSS0.02, RSS0.93, RSS0.94 and RSS2.0 have the item elements under the 'channel' element.
* This method exists because RSS0.90 and RSS1.0 have the 'item' elements
* under the root elemment. And RSS0.91, RSS0.02, RSS0.93, RSS0.94 and
* RSS2.0 have the item elements under the 'channel' element.
* <p/>
*/
protected List<Element> getItems(Element rssRoot) {
return rssRoot.getChildren("item",getRSSNamespace());
protected List<Element> getItems(final Element rssRoot) {
return rssRoot.getChildren("item", getRSSNamespace());
}
/**
* This method exists because RSS0.90 and RSS1.0 have the 'image' element under the root elemment.
* And RSS0.91, RSS0.02, RSS0.93, RSS0.94 and RSS2.0 have it under the 'channel' element.
* This method exists because RSS0.90 and RSS1.0 have the 'image' element
* under the root elemment. And RSS0.91, RSS0.02, RSS0.93, RSS0.94 and
* RSS2.0 have it under the 'channel' element.
* <p/>
*/
protected Element getImage(Element rssRoot) {
return rssRoot.getChild("image",getRSSNamespace());
protected Element getImage(final Element rssRoot) {
return rssRoot.getChild("image", getRSSNamespace());
}
/**
* This method exists because RSS0.90 and RSS1.0 have the 'textinput' element under the root elemment.
* And RSS0.91, RSS0.02, RSS0.93, RSS0.94 and RSS2.0 have it under the 'channel' element.
* This method exists because RSS0.90 and RSS1.0 have the 'textinput'
* element under the root elemment. And RSS0.91, RSS0.02, RSS0.93, RSS0.94
* and RSS2.0 have it under the 'channel' element.
* <p/>
*/
protected Element getTextInput(Element rssRoot) {
return rssRoot.getChild("textinput",getRSSNamespace());
protected Element getTextInput(final Element rssRoot) {
return rssRoot.getChild("textinput", getRSSNamespace());
}
/**
@ -220,25 +227,26 @@ public class RSS090Parser extends BaseWireFeedParser {
* It reads title and url out of the 'image' element.
* <p/>
*
* @param rssRoot the root element of the RSS document to parse for image information.
* @param rssRoot the root element of the RSS document to parse for image
* information.
* @return the parsed image bean.
*/
protected Image parseImage(Element rssRoot) {
protected Image parseImage(final Element rssRoot) {
Image image = null;
Element eImage = getImage(rssRoot);
if (eImage!=null) {
final Element eImage = getImage(rssRoot);
if (eImage != null) {
image = new Image();
Element e = eImage.getChild("title",getRSSNamespace());
if (e!=null) {
Element e = eImage.getChild("title", getRSSNamespace());
if (e != null) {
image.setTitle(e.getText());
}
e = eImage.getChild("url",getRSSNamespace());
if (e!=null) {
e = eImage.getChild("url", getRSSNamespace());
if (e != null) {
image.setUrl(e.getText());
}
e = eImage.getChild("link",getRSSNamespace());
if (e!=null) {
e = eImage.getChild("link", getRSSNamespace());
if (e != null) {
image.setLink(e.getText());
}
}
@ -246,22 +254,25 @@ public class RSS090Parser extends BaseWireFeedParser {
}
/**
* Parses the root element of an RSS document looking for all items information.
* Parses the root element of an RSS document looking for all items
* information.
* <p/>
* It iterates through the item elements list, obtained from the getItems() method, and invoke parseItem()
* for each item element. The resulting RSSItem of each item element is stored in a list.
* It iterates through the item elements list, obtained from the getItems()
* method, and invoke parseItem() for each item element. The resulting
* RSSItem of each item element is stored in a list.
* <p/>
*
* @param rssRoot the root element of the RSS document to parse for all items information.
* @param rssRoot the root element of the RSS document to parse for all
* items information.
* @return a list with all the parsed RSSItem beans.
*/
protected List<Item> parseItems(Element rssRoot) {
Collection<Element> eItems = getItems(rssRoot);
protected List<Item> parseItems(final Element rssRoot) {
final Collection<Element> eItems = getItems(rssRoot);
List<Item> items = new ArrayList<Item>();
for (Iterator<Element> i=eItems.iterator();i.hasNext();) {
Element eItem = (Element) i.next();
items.add(parseItem(rssRoot,eItem));
final List<Item> items = new ArrayList<Item>();
for (final Element element : eItems) {
final Element eItem = element;
items.add(parseItem(rssRoot, eItem));
}
return items;
}
@ -272,32 +283,34 @@ public class RSS090Parser extends BaseWireFeedParser {
* It reads title and link out of the 'item' element.
* <p/>
*
* @param rssRoot the root element of the RSS document in case it's needed for context.
* @param rssRoot the root element of the RSS document in case it's needed
* for context.
* @param eItem the item element to parse.
* @return the parsed RSSItem bean.
*/
protected Item parseItem(Element rssRoot,Element eItem) {
Item item = new Item();
Element e = eItem.getChild("title",getRSSNamespace());
if (e!=null) {
protected Item parseItem(final Element rssRoot, final Element eItem) {
final Item item = new Item();
Element e = eItem.getChild("title", getRSSNamespace());
if (e != null) {
item.setTitle(e.getText());
}
e = eItem.getChild("link",getRSSNamespace());
if (e!=null) {
e = eItem.getChild("link", getRSSNamespace());
if (e != null) {
item.setLink(e.getText());
item.setUri(e.getText());
}
item.setModules(parseItemModules(eItem));
List<Element> foreignMarkup =
extractForeignMarkup(eItem, item, getRSSNamespace());
//content:encoded elements are treated special, without a module, they have to be removed from the foreign
//markup to avoid duplication in case of read/write. Note that this fix will break if a content module is
//used
Iterator<Element> iterator = foreignMarkup.iterator();
final List<Element> foreignMarkup = extractForeignMarkup(eItem, item, getRSSNamespace());
// content:encoded elements are treated special, without a module, they
// have to be removed from the foreign
// markup to avoid duplication in case of read/write. Note that this fix
// will break if a content module is
// used
final Iterator<Element> iterator = foreignMarkup.iterator();
while (iterator.hasNext()) {
Element ie = (Element)iterator.next();
final Element ie = iterator.next();
if (getContentNamespace().equals(ie.getNamespace()) && ie.getName().equals("encoded")) {
iterator.remove();
}
@ -308,40 +321,41 @@ public class RSS090Parser extends BaseWireFeedParser {
return item;
}
/**
* Parses the root element of an RSS document looking for text-input information.
* Parses the root element of an RSS document looking for text-input
* information.
* <p/>
* It reads title, description, name and link out of the 'textinput' or 'textInput' element.
* It reads title, description, name and link out of the 'textinput' or
* 'textInput' element.
* <p/>
*
* @param rssRoot the root element of the RSS document to parse for text-input information.
* @param rssRoot the root element of the RSS document to parse for
* text-input information.
* @return the parsed RSSTextInput bean.
*/
protected TextInput parseTextInput(Element rssRoot) {
protected TextInput parseTextInput(final Element rssRoot) {
TextInput textInput = null;
Element eTextInput = getTextInput(rssRoot);
if (eTextInput!=null) {
final Element eTextInput = getTextInput(rssRoot);
if (eTextInput != null) {
textInput = new TextInput();
Element e = eTextInput.getChild("title",getRSSNamespace());
if (e!=null) {
Element e = eTextInput.getChild("title", getRSSNamespace());
if (e != null) {
textInput.setTitle(e.getText());
}
e = eTextInput.getChild("description",getRSSNamespace());
if (e!=null) {
e = eTextInput.getChild("description", getRSSNamespace());
if (e != null) {
textInput.setDescription(e.getText());
}
e = eTextInput.getChild("name",getRSSNamespace());
if (e!=null) {
e = eTextInput.getChild("name", getRSSNamespace());
if (e != null) {
textInput.setName(e.getText());
}
e = eTextInput.getChild("link",getRSSNamespace());
if (e!=null) {
e = eTextInput.getChild("link", getRSSNamespace());
if (e != null) {
textInput.setLink(e.getText());
}
}
return textInput;
}
}

View file

@ -31,22 +31,22 @@ public class RSS091NetscapeGenerator extends RSS091UserlandGenerator {
private String _version;
public RSS091NetscapeGenerator() {
this("rss_0.91N","0.91");
this("rss_0.91N", "0.91");
}
protected RSS091NetscapeGenerator(String type,String version) {
super(type,version);
protected RSS091NetscapeGenerator(final String type, final String version) {
super(type, version);
}
protected Document createDocument(Element root) {
Document doc = new Document(root);
DocType docType = new DocType(RSS091NetscapeParser.ELEMENT_NAME,
RSS091NetscapeParser.PUBLIC_ID,
RSS091NetscapeParser.SYSTEM_ID);
@Override
protected Document createDocument(final Element root) {
final Document doc = new Document(root);
final DocType docType = new DocType(RSS091NetscapeParser.ELEMENT_NAME, RSS091NetscapeParser.PUBLIC_ID, RSS091NetscapeParser.SYSTEM_ID);
doc.setDocType(docType);
return doc;
}
@Override
protected String getTextInputLabel() {
return "textinput";
}
@ -54,6 +54,7 @@ public class RSS091NetscapeGenerator extends RSS091UserlandGenerator {
/**
* To be overriden by RSS 0.91 Netscape and RSS 0.94
*/
@Override
protected boolean isHourFormat24() {
return false;
}

Some files were not shown because too many files have changed in this diff Show more