Reformatting and cleaning up code (step 1/2)
This commit is contained in:
parent
f84f0ae10e
commit
95b9121a77
156 changed files with 10329 additions and 8629 deletions
|
@ -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.
|
||||
*
|
||||
*/
|
||||
|
|
|
@ -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,41 +55,46 @@ 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;
|
||||
}
|
||||
|
@ -96,9 +102,9 @@ public abstract class WireFeed implements Cloneable, Serializable, Extendable {
|
|||
return false;
|
||||
}
|
||||
// can't use foreign markup in equals, due to JDOM equals impl
|
||||
List<Element> fm = getForeignMarkup();
|
||||
final List<Element> fm = getForeignMarkup();
|
||||
setForeignMarkup(((WireFeed) other).getForeignMarkup());
|
||||
boolean ret = _objBean.equals(other);
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
||||
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) {
|
||||
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;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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,84 +483,94 @@ 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;
|
||||
}
|
||||
|
@ -528,10 +578,10 @@ public class Entry implements Cloneable, Serializable, Extendable {
|
|||
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,28 +593,29 @@ 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){
|
||||
public Link findRelatedLink(final String relation) {
|
||||
for (final Link l : this._otherLinks) {
|
||||
if (relation.equals(l.getRel())) {
|
||||
return l;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
||||
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) {
|
||||
public void setRel(final String rel) {
|
||||
// TODO add check, ask P@ about the check
|
||||
_rel = rel;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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,7 +43,7 @@ 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) {
|
||||
descriptors = getPDs(klass);
|
||||
|
@ -44,12 +52,12 @@ public class BeanIntrospector {
|
|||
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,30 +66,24 @@ 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -92,29 +94,28 @@ public class BeanIntrospector {
|
|||
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);
|
||||
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;
|
||||
|
|
|
@ -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,10 +79,11 @@ public class CloneableBean implements Serializable, Cloneable {
|
|||
* }
|
||||
* </code>
|
||||
* <p>
|
||||
*
|
||||
* @param obj object bean to clone.
|
||||
*
|
||||
*/
|
||||
public CloneableBean(Object obj) {
|
||||
public CloneableBean(final Object obj) {
|
||||
this(obj, null);
|
||||
}
|
||||
|
||||
|
@ -82,32 +91,38 @@ public class CloneableBean implements Serializable, Cloneable {
|
|||
* 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,26 +131,49 @@ 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());
|
||||
clonedBean = this._obj.getClass().newInstance();
|
||||
final PropertyDescriptor[] pds = BeanIntrospector.getPropertyDescriptors(this._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);
|
||||
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 });
|
||||
|
@ -143,83 +181,71 @@ public class CloneableBean implements Serializable, Cloneable {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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();
|
||||
final Class vClass = value.getClass();
|
||||
if (vClass.isArray()) {
|
||||
value = cloneArray(value);
|
||||
}
|
||||
else
|
||||
if (value instanceof Collection) {
|
||||
} else if (value instanceof Collection) {
|
||||
value = cloneCollection((Collection) value);
|
||||
}
|
||||
else
|
||||
if (value instanceof Map) {
|
||||
} else if (value instanceof Map) {
|
||||
value = cloneMap((Map) value);
|
||||
}
|
||||
else
|
||||
if (isBasicType(vClass)) {
|
||||
} 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);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
throw new CloneNotSupportedException("Cannot clone a " + value.getClass() + " object, clone() is not public");
|
||||
}
|
||||
}
|
||||
else {
|
||||
} 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);
|
||||
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++) {
|
||||
Object element = doClone(Array.get(array,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());
|
||||
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;
|
||||
|
@ -253,20 +279,17 @@ public class CloneableBean implements Serializable, Cloneable {
|
|||
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; }
|
||||
**/
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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,82 +36,90 @@ 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);
|
||||
final PropertyDescriptor[] pds = BeanIntrospector.getPropertyDescriptors(this._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
|
||||
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) {
|
||||
Class baseInterface = (Class) _baseInterfaceMap.get(propertyName);
|
||||
final Class baseInterface = (Class) this._baseInterfaceMap.get(propertyName);
|
||||
value = doCopy(value, baseInterface);
|
||||
pWriteMethod.invoke(target, new Object[] { value });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception 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 {
|
||||
private Object doCopy(Object value, final Class baseInterface) throws Exception {
|
||||
if (value != null) {
|
||||
Class vClass = value.getClass();
|
||||
final Class vClass = value.getClass();
|
||||
if (vClass.isArray()) {
|
||||
value = doCopyArray(value, baseInterface);
|
||||
}
|
||||
else
|
||||
if (value instanceof Collection) {
|
||||
} else if (value instanceof Collection) {
|
||||
value = doCopyCollection((Collection) value, baseInterface);
|
||||
}
|
||||
else
|
||||
if (value instanceof Map) {
|
||||
} else if (value instanceof Map) {
|
||||
value = doCopyMap((Map) value, baseInterface);
|
||||
}
|
||||
else
|
||||
if (isBasicType(vClass)) {
|
||||
} else if (isBasicType(vClass)) {
|
||||
// value = value; // nothing to do here
|
||||
if (value instanceof Date) { // because Date it is not inmutable
|
||||
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 {
|
||||
} else {
|
||||
throw new Exception("unsupported class for 'copyFrom' " + value.getClass());
|
||||
}
|
||||
}
|
||||
|
@ -113,35 +127,35 @@ public class CopyFromHelper {
|
|||
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);
|
||||
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++) {
|
||||
Object element = doCopy(Array.get(array,i),baseInterface);
|
||||
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);
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
_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) {
|
||||
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);
|
||||
final PropertyDescriptor[] pds = BeanIntrospector.getPropertyDescriptors(this._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 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) {
|
||||
private boolean doEquals(final Object obj1, final Object obj2) {
|
||||
boolean eq = obj1 == obj2;
|
||||
if (!eq && obj1 != null && obj2 != null) {
|
||||
Class classObj1 = obj1.getClass();
|
||||
Class classObj2 = obj2.getClass();
|
||||
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);
|
||||
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);
|
||||
final Object e1 = Array.get(array1, i);
|
||||
final Object e2 = Array.get(array2, i);
|
||||
eq = doEquals(e1, e2);
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
eq = false;
|
||||
}
|
||||
return eq;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -16,43 +16,45 @@
|
|||
*/
|
||||
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) {
|
||||
public ObjectBean(final Class beanClass, final Object obj) {
|
||||
this(beanClass, obj, null);
|
||||
}
|
||||
|
||||
|
@ -60,42 +62,50 @@ public class ObjectBean implements Serializable, Cloneable {
|
|||
* 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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -17,25 +17,28 @@
|
|||
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) {
|
||||
|
@ -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();
|
||||
final String className = this._obj.getClass().getName();
|
||||
prefix = className.substring(className.lastIndexOf(".") + 1);
|
||||
}
|
||||
else {
|
||||
} 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);
|
||||
final PropertyDescriptor[] pds = BeanIntrospector.getPropertyDescriptors(this._beanClass);
|
||||
if (pds != null) {
|
||||
for (int i=0;i<pds.length;i++) {
|
||||
String pName = pds[i].getName();
|
||||
Method pReadMethod = pds[i].getReadMethod();
|
||||
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
|
||||
Object value = pReadMethod.invoke(_obj,NO_PARAMS);
|
||||
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) {
|
||||
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()) {
|
||||
} 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 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];
|
||||
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) {
|
||||
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];
|
||||
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) {
|
||||
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) {
|
||||
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);
|
||||
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++) {
|
||||
Object obj = Array.get(array,i);
|
||||
final Object obj = Array.get(array, i);
|
||||
printProperty(sb, prefix + "[" + i + "]", obj);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
*/
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -21,7 +21,9 @@ 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
|
||||
*
|
||||
*/
|
||||
|
@ -29,6 +31,7 @@ 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;
|
||||
|
|
|
@ -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;
|
||||
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) {
|
||||
public boolean equals(final Object other) {
|
||||
if (!(other instanceof DCSubjectImpl)) {
|
||||
return false;
|
||||
}
|
||||
return _objBean.equals(other);
|
||||
return this._objBean.equals(other);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -78,81 +84,94 @@ 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) {
|
||||
@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();
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -16,13 +16,15 @@
|
|||
*/
|
||||
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
|
||||
*
|
||||
*/
|
||||
|
@ -31,6 +33,7 @@ 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;
|
||||
|
|
|
@ -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;
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
*
|
||||
*/
|
||||
|
@ -39,7 +47,6 @@ public class SyModuleImpl extends ModuleImpl implements SyModule {
|
|||
PERIODS.add(YEARLY);
|
||||
}
|
||||
|
||||
|
||||
private String _updatePeriod;
|
||||
private int _updateFrequency;
|
||||
private Date _updateBase;
|
||||
|
@ -56,83 +63,100 @@ public class SyModuleImpl extends ModuleImpl implements SyModule {
|
|||
/**
|
||||
* 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 + "]");
|
||||
}
|
||||
_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) {
|
||||
@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();
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -16,25 +16,24 @@
|
|||
*/
|
||||
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) {
|
||||
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) {
|
||||
} catch (final Exception ex) {
|
||||
throw new RuntimeException("Cloning modules " + module.getUri(), ex);
|
||||
}
|
||||
}
|
||||
|
@ -51,7 +50,7 @@ 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++) {
|
||||
module = modules.get(i);
|
||||
|
|
|
@ -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;
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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,7 +50,7 @@ public class Channel extends WireFeed {
|
|||
private static final Set<String> DAYS;
|
||||
|
||||
static {
|
||||
HashSet<String> days = new HashSet<String>();
|
||||
final HashSet<String> days = new HashSet<String>();
|
||||
days.add(SUNDAY);
|
||||
days.add(MONDAY);
|
||||
days.add(TUESDAY);
|
||||
|
@ -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) {
|
||||
public void setSkipHours(final List<Integer> skipHours) {
|
||||
if (skipHours != null) {
|
||||
for (int i = 0; i < skipHours.size(); i++) {
|
||||
Integer iHour = (Integer) skipHours.get(i);
|
||||
final Integer iHour = skipHours.get(i);
|
||||
if (iHour != null) {
|
||||
int hour = iHour.intValue();
|
||||
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) {
|
||||
public void setSkipDays(final List<String> skipDays) {
|
||||
if (skipDays != null) {
|
||||
for (int i = 0; i < skipDays.size(); i++) {
|
||||
String day = (String) skipDays.get(i);
|
||||
String day = skipDays.get(i);
|
||||
if (day != null) {
|
||||
day = day.toLowerCase();
|
||||
if (!DAYS.contains(day)) {
|
||||
throw new IllegalArgumentException("Invalid day [" + day + "]");
|
||||
}
|
||||
skipDays.set(i, day);
|
||||
}
|
||||
else {
|
||||
} 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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
final List<Element> fm = getForeignMarkup();
|
||||
setForeignMarkup(((Item) other).getForeignMarkup());
|
||||
boolean ret = _objBean.equals(other);
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
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,91 +207,104 @@ 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) {
|
||||
sList = new ArrayList<DCSubject>();
|
||||
for (int i = 0; i < cList.size(); i++) {
|
||||
SyndCategoryImpl sCat = (SyndCategoryImpl) cList.get(i);
|
||||
final SyndCategoryImpl sCat = (SyndCategoryImpl) cList.get(i);
|
||||
DCSubject subject = null;
|
||||
if (sCat != null) {
|
||||
subject = sCat.getSubject();
|
||||
|
|
|
@ -18,10 +18,10 @@ package com.sun.syndication.feed.synd;
|
|||
|
||||
import com.sun.syndication.feed.CopyFrom;
|
||||
|
||||
|
||||
/**
|
||||
* Bean interface for content of SyndFeedImpl entries.
|
||||
* <p>
|
||||
*
|
||||
* @author Alejandro Abdelnur
|
||||
*
|
||||
*/
|
||||
|
@ -29,8 +29,10 @@ 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;
|
||||
|
|
|
@ -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,102 +80,121 @@ 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) {
|
||||
@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();
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
*/
|
||||
|
|
|
@ -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;
|
||||
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,27 +142,30 @@ 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) {
|
||||
@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();
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -94,36 +110,41 @@ public class SyndEntryImpl implements Serializable,SyndEntry {
|
|||
/**
|
||||
* 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();
|
||||
final List<Element> fm = getForeignMarkup();
|
||||
setForeignMarkup(((SyndEntryImpl) other).getForeignMarkup());
|
||||
boolean ret = _objBean.equals(other);
|
||||
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) {
|
||||
@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,18 +482,20 @@ public class SyndEntryImpl implements Serializable,SyndEntry {
|
|||
return (DCModule) getModule(DCModule.URI);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class getInterface() {
|
||||
return SyndEntry.class;
|
||||
}
|
||||
|
||||
public void copyFrom(CopyFrom 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();
|
||||
final Map basePropInterfaceMap = new HashMap();
|
||||
basePropInterfaceMap.put("uri", String.class);
|
||||
basePropInterfaceMap.put("title", String.class);
|
||||
basePropInterfaceMap.put("link", String.class);
|
||||
|
@ -427,7 +505,7 @@ public class SyndEntryImpl implements Serializable,SyndEntry {
|
|||
basePropInterfaceMap.put("enclosures", SyndEnclosure.class);
|
||||
basePropInterfaceMap.put("modules", Module.class);
|
||||
|
||||
Map basePropClassImplMap = new HashMap();
|
||||
final Map basePropClassImplMap = new HashMap();
|
||||
basePropClassImplMap.put(SyndContent.class, SyndContentImpl.class);
|
||||
basePropClassImplMap.put(SyndEnclosure.class, SyndEnclosureImpl.class);
|
||||
basePropClassImplMap.put(DCModule.class, DCModuleImpl.class);
|
||||
|
@ -439,65 +517,79 @@ public class SyndEntryImpl implements Serializable,SyndEntry {
|
|||
/**
|
||||
* 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,73 +603,88 @@ 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()){
|
||||
@Override
|
||||
public SyndLink findRelatedLink(final String relation) {
|
||||
for (final SyndLink l : getLinks()) {
|
||||
if (relation.equals(l.getRel())) {
|
||||
return l;
|
||||
}
|
||||
|
|
|
@ -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
|
@ -22,6 +22,7 @@ import com.sun.syndication.feed.CopyFrom;
|
|||
/**
|
||||
* Bean interface for images of SyndFeedImpl feeds.
|
||||
* <p>
|
||||
*
|
||||
* @author Alejandro Abdelnur
|
||||
*
|
||||
*/
|
||||
|
@ -29,6 +30,7 @@ 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;
|
||||
|
|
|
@ -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;
|
||||
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,121 +81,143 @@ 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) {
|
||||
@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();
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
||||
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) {
|
||||
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) {
|
||||
@Override
|
||||
public void setRel(final String rel) {
|
||||
// TODO add check, ask P@ about the check
|
||||
_rel = rel;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
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) {
|
||||
@Override
|
||||
public Module getModule(final String uri) {
|
||||
return ModuleUtils.getModule(getModules(), uri);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,30 +76,26 @@ 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();
|
||||
final Content tagline = aFeed.getTagline();
|
||||
if (tagline != null) {
|
||||
syndFeed.setDescription(tagline.getValue());
|
||||
}
|
||||
|
||||
|
||||
List<Entry> aEntries = aFeed.getEntries();
|
||||
final List<Entry> aEntries = aFeed.getEntries();
|
||||
if (aEntries != null) {
|
||||
syndFeed.setEntries(createSyndEntries(aEntries, syndFeed.isPreservingWireFeed()));
|
||||
}
|
||||
|
@ -108,42 +103,42 @@ public class ConverterForAtom03 implements Converter {
|
|||
// Core Atom language/author/copyright/modified elements have precedence
|
||||
// over DC equivalent info.
|
||||
|
||||
String language = aFeed.getLanguage();
|
||||
final String language = aFeed.getLanguage();
|
||||
if (language != null) {
|
||||
syndFeed.setLanguage(language);
|
||||
}
|
||||
|
||||
List<Person> authors = aFeed.getAuthors();
|
||||
final List<Person> authors = aFeed.getAuthors();
|
||||
if (authors != null && authors.size() > 0) {
|
||||
syndFeed.setAuthors(createSyndPersons(authors));
|
||||
}
|
||||
|
||||
String copyright = aFeed.getCopyright();
|
||||
final String copyright = aFeed.getCopyright();
|
||||
if (copyright != null) {
|
||||
syndFeed.setCopyright(copyright);
|
||||
}
|
||||
|
||||
Date date = aFeed.getModified();
|
||||
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();
|
||||
public SyndLink createSyndLink(final Link link) {
|
||||
final SyndLink syndLink = new SyndLinkImpl();
|
||||
syndLink.setRel(link.getRel());
|
||||
syndLink.setType(link.getType());
|
||||
syndLink.setHref(link.getHrefResolved());
|
||||
|
@ -151,88 +146,84 @@ public class ConverterForAtom03 implements Converter {
|
|||
return syndLink;
|
||||
}
|
||||
|
||||
protected List<SyndEntry> createSyndEntries(List<Entry> atomEntries, boolean preserveWireItems) {
|
||||
List<SyndEntry> syndEntries = new ArrayList<SyndEntry>();
|
||||
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((Entry) atomEntries.get(i), preserveWireItems));
|
||||
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();
|
||||
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();
|
||||
final List<Content> contents = entry.getContents();
|
||||
if (contents != null && contents.size() > 0) {
|
||||
content = (Content) contents.get(0);
|
||||
content = contents.get(0);
|
||||
}
|
||||
}
|
||||
if (content != null) {
|
||||
SyndContent sContent = new SyndContentImpl();
|
||||
final SyndContent sContent = new SyndContentImpl();
|
||||
sContent.setType(content.getType());
|
||||
sContent.setValue(content.getValue());
|
||||
syndEntry.setDescription(sContent);
|
||||
}
|
||||
|
||||
List<Content> contents = entry.getContents();
|
||||
final List<Content> contents = entry.getContents();
|
||||
if (contents.size() > 0) {
|
||||
List<SyndContent> sContents = new ArrayList<SyndContent>();
|
||||
final List<SyndContent> sContents = new ArrayList<SyndContent>();
|
||||
for (int i = 0; i < contents.size(); i++) {
|
||||
content = (Content) contents.get(i);
|
||||
SyndContent sContent = new SyndContentImpl();
|
||||
content = contents.get(i);
|
||||
final SyndContent sContent = new SyndContentImpl();
|
||||
sContent.setType(content.getType());
|
||||
sContent.setValue(content.getValue());
|
||||
sContent.setMode(content.getMode());
|
||||
|
@ -241,10 +232,10 @@ public class ConverterForAtom03 implements Converter {
|
|||
syndEntry.setContents(sContents);
|
||||
}
|
||||
|
||||
List<Person> authors = entry.getAuthors();
|
||||
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());
|
||||
}
|
||||
|
||||
|
@ -262,25 +253,26 @@ public class ConverterForAtom03 implements Converter {
|
|||
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,25 +302,29 @@ 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();
|
||||
final String sDesc = syndFeed.getDescription();
|
||||
if (sDesc != null) {
|
||||
Content tagline = new Content();
|
||||
final Content tagline = new Content();
|
||||
tagline.setValue(sDesc);
|
||||
aFeed.setTagline(tagline);
|
||||
}
|
||||
|
||||
aFeed.setLanguage(syndFeed.getLanguage());
|
||||
|
||||
List<SyndPerson> authors = syndFeed.getAuthors();
|
||||
final List<SyndPerson> authors = syndFeed.getAuthors();
|
||||
if (authors != null && authors.size() > 0) {
|
||||
aFeed.setAuthors(createAtomPersons(authors));
|
||||
}
|
||||
|
@ -339,7 +333,7 @@ public class ConverterForAtom03 implements Converter {
|
|||
|
||||
aFeed.setModified(syndFeed.getPublishedDate());
|
||||
|
||||
List<SyndEntry> sEntries = syndFeed.getEntries();
|
||||
final List<SyndEntry> sEntries = syndFeed.getEntries();
|
||||
if (sEntries != null) {
|
||||
aFeed.setEntries(createAtomEntries(sEntries));
|
||||
}
|
||||
|
@ -347,11 +341,11 @@ public class ConverterForAtom03 implements Converter {
|
|||
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>();
|
||||
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((SyndEntry)syndEntries.get(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();
|
||||
final SyndContent sTitle = sEntry.getTitleEx();
|
||||
if (sTitle != null) {
|
||||
Content title = new Content();
|
||||
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();
|
||||
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();
|
||||
final List<SyndContent> contents = sEntry.getContents();
|
||||
if (contents.size() > 0) {
|
||||
List<Content> aContents = new ArrayList<Content>();
|
||||
final List<Content> aContents = new ArrayList<Content>();
|
||||
for (int i = 0; i < contents.size(); i++) {
|
||||
sContent = (SyndContentImpl) contents.get(i);
|
||||
Content content = new Content();
|
||||
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();
|
||||
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,8 +478,8 @@ public class ConverterForAtom03 implements Converter {
|
|||
return aEntry;
|
||||
}
|
||||
|
||||
public Link createAtomLink(SyndLink syndLink) {
|
||||
Link link = new Link();
|
||||
public Link createAtomLink(final SyndLink syndLink) {
|
||||
final Link link = new Link();
|
||||
link.setRel(syndLink.getRel());
|
||||
link.setType(syndLink.getType());
|
||||
link.setHref(syndLink.getHref());
|
||||
|
@ -492,8 +487,8 @@ public class ConverterForAtom03 implements Converter {
|
|||
return link;
|
||||
}
|
||||
|
||||
public Link createAtomEnclosure(SyndEnclosure syndEnclosure) {
|
||||
Link link = new Link();
|
||||
public Link createAtomEnclosure(final SyndEnclosure syndEnclosure) {
|
||||
final Link link = new Link();
|
||||
link.setRel("enclosure");
|
||||
link.setType(syndEnclosure.getType());
|
||||
link.setHref(syndEnclosure.getUrl());
|
||||
|
|
|
@ -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,75 +42,71 @@ 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();
|
||||
final Content aSubtitle = aFeed.getSubtitle();
|
||||
if (aSubtitle != null) {
|
||||
SyndContent c = new SyndContentImpl();
|
||||
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();
|
||||
final List<Entry> aEntries = aFeed.getEntries();
|
||||
if (aEntries != null) {
|
||||
syndFeed.setEntries(createSyndEntries(aFeed, aEntries, syndFeed.isPreservingWireFeed()));
|
||||
}
|
||||
|
@ -119,85 +114,85 @@ public class ConverterForAtom10 implements Converter {
|
|||
// Core Atom language/author/copyright/modified elements have precedence
|
||||
// over DC equivalent info.
|
||||
|
||||
List<Person> authors = aFeed.getAuthors();
|
||||
final List<Person> authors = aFeed.getAuthors();
|
||||
if (authors != null && authors.size() > 0) {
|
||||
syndFeed.setAuthors(ConverterForAtom03.createSyndPersons(authors));
|
||||
}
|
||||
|
||||
List<Person> contributors = aFeed.getContributors();
|
||||
final List<Person> contributors = aFeed.getContributors();
|
||||
if (contributors != null && contributors.size() > 0) {
|
||||
syndFeed.setContributors(ConverterForAtom03.createSyndPersons(contributors));
|
||||
}
|
||||
|
||||
String rights = aFeed.getRights();
|
||||
final String rights = aFeed.getRights();
|
||||
if (rights != null) {
|
||||
syndFeed.setCopyright(rights);
|
||||
}
|
||||
|
||||
Date date = aFeed.getUpdated();
|
||||
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>();
|
||||
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, (Entry) atomEntries.get(i), preserveWireItems));
|
||||
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();
|
||||
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();
|
||||
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();
|
||||
final List<Person> contributors = entry.getContributors();
|
||||
if (contributors != null && contributors.size() > 0) {
|
||||
syndEntry.setContributors(ConverterForAtom03.createSyndPersons(contributors));
|
||||
}
|
||||
|
@ -212,12 +207,12 @@ public class ConverterForAtom10 implements Converter {
|
|||
syndEntry.setUpdatedDate(date);
|
||||
}
|
||||
|
||||
List<Category> categories = entry.getCategories();
|
||||
final 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<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,67 +223,62 @@ 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();
|
||||
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();
|
||||
public Link createAtomEnclosure(final SyndEnclosure syndEnclosure) {
|
||||
final Link link = new Link();
|
||||
link.setRel("enclosure");
|
||||
link.setType(syndEnclosure.getType());
|
||||
link.setHref(syndEnclosure.getUrl());
|
||||
|
@ -296,8 +286,8 @@ public class ConverterForAtom10 implements Converter {
|
|||
return link;
|
||||
}
|
||||
|
||||
public SyndLink createSyndLink(Link link) {
|
||||
SyndLink syndLink = new SyndLinkImpl();
|
||||
public SyndLink createSyndLink(final Link link) {
|
||||
final SyndLink syndLink = new SyndLinkImpl();
|
||||
syndLink.setRel(link.getRel());
|
||||
syndLink.setType(link.getType());
|
||||
syndLink.setHref(link.getHrefResolved());
|
||||
|
@ -307,8 +297,8 @@ public class ConverterForAtom10 implements Converter {
|
|||
return syndLink;
|
||||
}
|
||||
|
||||
public Link createAtomLink(SyndLink syndLink) {
|
||||
Link link = new Link();
|
||||
public Link createAtomLink(final SyndLink syndLink) {
|
||||
final Link link = new Link();
|
||||
link.setRel(syndLink.getRel());
|
||||
link.setType(syndLink.getType());
|
||||
link.setHref(syndLink.getHref());
|
||||
|
@ -318,41 +308,40 @@ public class ConverterForAtom10 implements Converter {
|
|||
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,34 +350,40 @@ 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();
|
||||
final List<SyndPerson> authors = syndFeed.getAuthors();
|
||||
if (authors != null && authors.size() > 0) {
|
||||
aFeed.setAuthors(ConverterForAtom03.createAtomPersons(authors));
|
||||
}
|
||||
|
||||
List<SyndPerson> contributors = syndFeed.getContributors();
|
||||
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();
|
||||
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>();
|
||||
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((SyndEntry)syndEntries.get(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>();
|
||||
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((SyndContent)syndContents.get(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();
|
||||
final SyndContent sTitle = sEntry.getTitleEx();
|
||||
if (sTitle != null) {
|
||||
Content title = new Content();
|
||||
final Content title = new Content();
|
||||
title.setType(sTitle.getType());
|
||||
title.setValue(sTitle.getValue());
|
||||
aEntry.setTitleEx(title);
|
||||
}
|
||||
|
||||
SyndContent sDescription = sEntry.getDescription();
|
||||
final SyndContent sDescription = sEntry.getDescription();
|
||||
if (sDescription != null) {
|
||||
Content summary = new Content();
|
||||
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,44 +488,50 @@ 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) {
|
||||
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();
|
||||
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;
|
||||
|
|
|
@ -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();
|
||||
final Image image = channel.getImage();
|
||||
if (image != null) {
|
||||
syndFeed.setImage(createSyndImage(image));
|
||||
}
|
||||
|
||||
List<Item> items = channel.getItems();
|
||||
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>();
|
||||
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((Item) rssItems.get(i), preserveWireItems));
|
||||
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();
|
||||
final SyndImage sImage = syndFeed.getImage();
|
||||
if (sImage != null) {
|
||||
channel.setImage(createRSSImage(sImage));
|
||||
}
|
||||
|
||||
List<SyndEntry> sEntries = syndFeed.getEntries();
|
||||
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>();
|
||||
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((SyndEntry)sEntries.get(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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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,18 +43,18 @@ 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
|
||||
|
||||
Date pubDate = channel.getPubDate();
|
||||
final Date pubDate = channel.getPubDate();
|
||||
|
||||
if (pubDate != null) {
|
||||
syndFeed.setPublishedDate(pubDate); // c
|
||||
|
@ -63,13 +62,15 @@ public class ConverterForRSS091Userland extends ConverterForRSS090 {
|
|||
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);
|
||||
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;
|
||||
|
|
|
@ -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();
|
||||
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) {
|
||||
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)
|
||||
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
|
||||
}
|
||||
List<Enclosure> enclosures = item.getEnclosures();
|
||||
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>();
|
||||
protected List<SyndCategory> createSyndCategories(final List<Category> rssCats) {
|
||||
final List<SyndCategory> syndCats = new ArrayList<SyndCategory>();
|
||||
for (int i = 0; i < rssCats.size(); i++) {
|
||||
Category rssCat = (Category) rssCats.get(i);
|
||||
SyndCategory sCat = new SyndCategoryImpl();
|
||||
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>();
|
||||
protected List<SyndEnclosure> createSyndEnclosures(final List<Enclosure> enclosures) {
|
||||
final List<SyndEnclosure> sEnclosures = new ArrayList<SyndEnclosure>();
|
||||
for (int i = 0; i < enclosures.size(); i++) {
|
||||
Enclosure enc = (Enclosure) enclosures.get(i);
|
||||
SyndEnclosure sEnc = new SyndEnclosureImpl();
|
||||
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
|
||||
final List<SyndCategory> sCats = sEntry.getCategories(); // c
|
||||
if (sCats.size() > 0) {
|
||||
item.setCategories(createRSSCategories(sCats));
|
||||
}
|
||||
List<SyndEnclosure> sEnclosures = sEntry.getEnclosures();
|
||||
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>();
|
||||
protected List<Category> createRSSCategories(final List<SyndCategory> sCats) {
|
||||
final List<Category> cats = new ArrayList<Category>();
|
||||
for (int i = 0; i < sCats.size(); i++) {
|
||||
SyndCategory sCat = (SyndCategory) sCats.get(i);
|
||||
Category cat = new Category();
|
||||
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>();
|
||||
protected List<Enclosure> createEnclosures(final List<SyndEnclosure> sEnclosures) {
|
||||
final List<Enclosure> enclosures = new ArrayList<Enclosure>();
|
||||
for (int i = 0; i < sEnclosures.size(); i++) {
|
||||
SyndEnclosure sEnc = (SyndEnclosure) sEnclosures.get(i);
|
||||
Enclosure enc = new Enclosure();
|
||||
final SyndEnclosure sEnc = sEnclosures.get(i);
|
||||
final Enclosure enc = new Enclosure();
|
||||
enc.setUrl(sEnc.getUrl());
|
||||
enc.setType(sEnc.getType());
|
||||
enc.setLength(sEnc.getLength());
|
||||
|
|
|
@ -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,14 +29,14 @@ 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();
|
||||
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
|
||||
}
|
||||
|
@ -44,8 +44,8 @@ public class ConverterForRSS093 extends ConverterForRSS092 {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected Item createRSSItem(SyndEntry sEntry) {
|
||||
Item item = super.createRSSItem(sEntry);
|
||||
protected Item createRSSItem(final SyndEntry sEntry) {
|
||||
final Item item = super.createRSSItem(sEntry);
|
||||
item.setPubDate(sEntry.getPublishedDate()); // c
|
||||
return item;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
public void copyInto(final WireFeed feed, final SyndFeed syndFeed) {
|
||||
final Channel channel = (Channel) feed;
|
||||
super.copyInto(channel, syndFeed);
|
||||
List<Category> cats = channel.getCategories(); //c
|
||||
final 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)
|
||||
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();
|
||||
final String author = item.getAuthor();
|
||||
if (author != null) {
|
||||
List<String> creators = ((DCModule)syndEntry.getModule(DCModule.URI)).getCreators();
|
||||
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();
|
||||
final Guid guid = item.getGuid();
|
||||
if (guid != null) {
|
||||
syndEntry.setUri(guid.getValue());
|
||||
if (item.getLink() == null && guid.isPermaLink()) {
|
||||
syndEntry.setLink(guid.getValue());
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
syndEntry.setUri(item.getLink());
|
||||
}
|
||||
if (item.getComments() != null) {
|
||||
SyndLinkImpl comments = new SyndLinkImpl();
|
||||
final SyndLinkImpl comments = new SyndLinkImpl();
|
||||
comments.setRel("comments");
|
||||
comments.setHref(item.getComments());
|
||||
comments.setType("text/html");
|
||||
|
@ -95,11 +101,10 @@ 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
|
||||
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));
|
||||
}
|
||||
|
@ -107,22 +112,21 @@ public class ConverterForRSS094 extends ConverterForRSS093 {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected Item createRSSItem(SyndEntry sEntry) {
|
||||
Item item = super.createRSSItem(sEntry);
|
||||
protected Item createRSSItem(final SyndEntry sEntry) {
|
||||
final Item item = super.createRSSItem(sEntry);
|
||||
if (sEntry.getAuthors() != null && sEntry.getAuthors().size() > 0) {
|
||||
SyndPerson author = (SyndPerson)sEntry.getAuthors().get(0);
|
||||
final SyndPerson author = sEntry.getAuthors().get(0);
|
||||
item.setAuthor(author.getEmail());
|
||||
}
|
||||
|
||||
Guid guid = null;
|
||||
String uri = sEntry.getUri();
|
||||
final String uri = sEntry.getUri();
|
||||
if (uri != null) {
|
||||
guid = new Guid();
|
||||
guid.setPermaLink(false);
|
||||
guid.setValue(uri);
|
||||
}
|
||||
else {
|
||||
String link = sEntry.getLink();
|
||||
} else {
|
||||
final String link = sEntry.getLink();
|
||||
if (link != null) {
|
||||
guid = new Guid();
|
||||
guid.setPermaLink(true);
|
||||
|
@ -130,7 +134,7 @@ public class ConverterForRSS094 extends ConverterForRSS093 {
|
|||
}
|
||||
}
|
||||
item.setGuid(guid);
|
||||
SyndLink comments = sEntry.findRelatedLink("comments");
|
||||
final SyndLink comments = sEntry.findRelatedLink("comments");
|
||||
if (comments != null && (comments.getType() == null || comments.getType().endsWith("html"))) {
|
||||
item.setComments(comments.getHref());
|
||||
}
|
||||
|
|
|
@ -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,13 +37,13 @@ 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;
|
||||
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());
|
||||
|
@ -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();
|
||||
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 contContent = new SyndContentImpl();
|
||||
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();
|
||||
final SyndContent desc = sEntry.getDescription();
|
||||
if (desc != null) {
|
||||
item.setDescription(createItemDescription(desc));
|
||||
}
|
||||
List<SyndContent> contents = sEntry.getContents();
|
||||
final List<SyndContent> contents = sEntry.getContents();
|
||||
if (contents != null && contents.size() > 0) {
|
||||
item.setContent(createItemContent((SyndContent)contents.get(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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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,11 +37,12 @@ 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) {
|
||||
@Override
|
||||
protected String getKey(final Object obj) {
|
||||
return ((Converter) obj).getType();
|
||||
}
|
||||
|
||||
|
|
|
@ -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,10 +11,12 @@ 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
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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,21 +29,23 @@ 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) {
|
||||
public FeedException(final String msg, final Throwable rootCause) {
|
||||
super(msg, rootCause);
|
||||
}
|
||||
|
||||
|
|
|
@ -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,25 +38,30 @@ 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.
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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,10 +47,11 @@ 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.
|
||||
*
|
||||
*/
|
||||
|
|
|
@ -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
|
||||
*
|
||||
*/
|
||||
|
@ -59,8 +61,7 @@ public class WireFeedInput {
|
|||
|
||||
private static FeedParsers getFeedParsers() {
|
||||
synchronized (WireFeedInput.class) {
|
||||
FeedParsers parsers = (FeedParsers)
|
||||
clMap.get(Thread.currentThread().getContextClassLoader());
|
||||
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.
|
||||
|
@ -107,70 +112,84 @@ public class WireFeedInput {
|
|||
/**
|
||||
* 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,30 +197,30 @@ 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();
|
||||
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) {
|
||||
} catch (final Exception ex) {
|
||||
throw new ParsingFeedException("Invalid XML", ex);
|
||||
}
|
||||
}
|
||||
|
@ -209,27 +228,27 @@ public class WireFeedInput {
|
|||
/**
|
||||
* 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) {
|
||||
} catch (final Exception ex) {
|
||||
throw new ParsingFeedException("Invalid XML", ex);
|
||||
}
|
||||
}
|
||||
|
@ -237,24 +256,25 @@ public class WireFeedInput {
|
|||
/**
|
||||
* 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) {
|
||||
} 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);
|
||||
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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
*
|
||||
*/
|
||||
|
@ -47,8 +50,7 @@ public class WireFeedOutput {
|
|||
|
||||
private static FeedGenerators getFeedGenerators() {
|
||||
synchronized (WireFeedOutput.class) {
|
||||
FeedGenerators generators = (FeedGenerators)
|
||||
clMap.get(Thread.currentThread().getContextClassLoader());
|
||||
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,141 +83,185 @@ 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();
|
||||
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();
|
||||
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);
|
||||
final XMLOutputter outputter = new XMLOutputter(format);
|
||||
outputter.output(doc, writer);
|
||||
}
|
||||
|
||||
|
@ -223,22 +270,26 @@ 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) {
|
||||
} 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);
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
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,24 +156,24 @@ 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) {
|
||||
} catch (final XmlReaderException ex) {
|
||||
if (!lenient) {
|
||||
throw ex;
|
||||
}
|
||||
else {
|
||||
} 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);
|
||||
}
|
||||
catch (XmlReaderException ex) {
|
||||
} catch (final XmlReaderException ex) {
|
||||
doLenientDetection(conn.getContentType(), ex);
|
||||
}
|
||||
}
|
||||
else
|
||||
if (conn.getContentType()!=null) {
|
||||
} else if (conn.getContentType() != null) {
|
||||
try {
|
||||
doHttpStream(conn.getInputStream(), conn.getContentType(), lenient);
|
||||
}
|
||||
catch (XmlReaderException ex) {
|
||||
} catch (final XmlReaderException ex) {
|
||||
doLenientDetection(conn.getContentType(), ex);
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
try {
|
||||
doRawStream(conn.getInputStream(), lenient);
|
||||
}
|
||||
catch (XmlReaderException ex) {
|
||||
} 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 {
|
||||
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) {
|
||||
} catch (final XmlReaderException ex) {
|
||||
if (!lenient) {
|
||||
throw ex;
|
||||
}
|
||||
else {
|
||||
} 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,15 +373,18 @@ 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);
|
||||
}
|
||||
|
||||
|
@ -362,8 +396,7 @@ public class XmlReader extends Reader {
|
|||
try {
|
||||
doHttpStream(ex.getInputStream(), httpContentType, true);
|
||||
ex = null;
|
||||
}
|
||||
catch (XmlReaderException ex2) {
|
||||
} catch (final XmlReaderException ex2) {
|
||||
ex = ex2;
|
||||
}
|
||||
}
|
||||
|
@ -374,7 +407,7 @@ public class XmlReader extends Reader {
|
|||
encoding = ex.getContentTypeEncoding();
|
||||
}
|
||||
if (encoding == null) {
|
||||
encoding = (_defaultEncoding == null) ? UTF_8 : _defaultEncoding;
|
||||
encoding = this._defaultEncoding == null ? UTF_8 : this._defaultEncoding;
|
||||
}
|
||||
prepareReader(ex.getInputStream(), encoding);
|
||||
}
|
||||
|
@ -383,169 +416,151 @@ public class XmlReader extends Reader {
|
|||
/**
|
||||
* 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);
|
||||
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);
|
||||
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))) {
|
||||
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)) {
|
||||
} 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);
|
||||
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);
|
||||
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)) {
|
||||
} 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);
|
||||
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);
|
||||
} 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) {
|
||||
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 (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)) {
|
||||
} 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();
|
||||
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(";");
|
||||
final 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;
|
||||
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,27 +609,21 @@ 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];
|
||||
final byte[] bytes = new byte[BUFFER_SIZE];
|
||||
is.mark(BUFFER_SIZE);
|
||||
int offset = 0;
|
||||
int max = BUFFER_SIZE;
|
||||
|
@ -633,23 +638,22 @@ public class XmlReader extends Reader {
|
|||
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;
|
||||
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);
|
||||
|
@ -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");
|
||||
|
|
|
@ -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) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
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);
|
||||
@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 {
|
||||
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;
|
||||
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());
|
||||
generateForeignMarkup(eFeed, feed.getForeignMarkup());
|
||||
}
|
||||
|
||||
protected void addEntries(Feed feed,Element parent) throws FeedException {
|
||||
List<Entry> items = feed.getEntries();
|
||||
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((Entry)items.get(i),parent);
|
||||
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());
|
||||
populateEntry(entry, eEntry);
|
||||
checkEntryConstraints(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));
|
||||
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));
|
||||
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) {
|
||||
} 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;
|
||||
}
|
||||
|
|
|
@ -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,32 +51,35 @@ 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) {
|
||||
|
@ -82,7 +92,7 @@ public class Atom03Parser extends BaseWireFeedParser {
|
|||
|
||||
e = eFeed.getChild("author", getAtomNamespace());
|
||||
if (e != null) {
|
||||
List<Person> authors = new ArrayList<Person>();
|
||||
final List<Person> authors = new ArrayList<Person>();
|
||||
authors.add(parsePerson(e));
|
||||
feed.setAuthors(authors);
|
||||
}
|
||||
|
@ -104,7 +114,7 @@ public class Atom03Parser extends BaseWireFeedParser {
|
|||
|
||||
e = eFeed.getChild("generator", getAtomNamespace());
|
||||
if (e != null) {
|
||||
Generator gen = new Generator();
|
||||
final Generator gen = new Generator();
|
||||
gen.setValue(e.getText());
|
||||
String att = getAttributeValue(e, "url");
|
||||
if (att != null) {
|
||||
|
@ -139,16 +149,15 @@ public class Atom03Parser extends BaseWireFeedParser {
|
|||
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) {
|
||||
link.setRel(att);
|
||||
|
@ -165,37 +174,36 @@ public class Atom03Parser extends BaseWireFeedParser {
|
|||
}
|
||||
|
||||
// List(Elements) -> List(Link)
|
||||
private List<Link> parseLinks(List<Element> eLinks,boolean alternate) {
|
||||
List<Link> links = new ArrayList<Link>();
|
||||
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++) {
|
||||
Element eLink = (Element) eLinks.get(i);
|
||||
String rel = getAttributeValue(eLink, "rel");
|
||||
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) {
|
||||
private List<Link> parseAlternateLinks(final List<Element> eLinks) {
|
||||
return parseLinks(eLinks, true);
|
||||
}
|
||||
|
||||
// List(Elements) -> List(Link)
|
||||
private List<Link> parseOtherLinks(List<Element> eLinks) {
|
||||
private List<Link> parseOtherLinks(final List<Element> eLinks) {
|
||||
return parseLinks(eLinks, false);
|
||||
}
|
||||
|
||||
private Person parsePerson(Element ePerson) {
|
||||
Person person = new Person();
|
||||
private Person parsePerson(final Element ePerson) {
|
||||
final Person person = new Person();
|
||||
Element e = ePerson.getChild("name", getAtomNamespace());
|
||||
if (e != null) {
|
||||
person.setName(e.getText());
|
||||
|
@ -212,18 +220,18 @@ public class Atom03Parser extends BaseWireFeedParser {
|
|||
}
|
||||
|
||||
// List(Elements) -> List(Persons)
|
||||
private List<Person> parsePersons(List<Element> ePersons) {
|
||||
List<Person> persons = new ArrayList<Person>();
|
||||
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((Element)ePersons.get(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,20 +239,16 @@ 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);
|
||||
}
|
||||
|
@ -253,7 +257,7 @@ public class Atom03Parser extends BaseWireFeedParser {
|
|||
value = outputter.outputString(eContent);
|
||||
}
|
||||
|
||||
Content content = new Content();
|
||||
final Content content = new Content();
|
||||
content.setType(type);
|
||||
content.setMode(mode);
|
||||
content.setValue(value);
|
||||
|
@ -261,16 +265,16 @@ public class Atom03Parser extends BaseWireFeedParser {
|
|||
}
|
||||
|
||||
// List(Elements) -> List(Entries)
|
||||
private List<Entry> parseEntries(List<Element> eEntries) {
|
||||
List<Entry> entries = new ArrayList<Entry>();
|
||||
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((Element)eEntries.get(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) {
|
||||
|
@ -283,7 +287,7 @@ public class Atom03Parser extends BaseWireFeedParser {
|
|||
|
||||
e = eEntry.getChild("author", getAtomNamespace());
|
||||
if (e != null) {
|
||||
List<Person> authors = new ArrayList<Person>();
|
||||
final List<Person> authors = new ArrayList<Person>();
|
||||
authors.add(parsePerson(e));
|
||||
entry.setAuthors(authors);
|
||||
}
|
||||
|
@ -320,22 +324,20 @@ public class Atom03Parser extends BaseWireFeedParser {
|
|||
|
||||
eList = eEntry.getChildren("content", getAtomNamespace());
|
||||
if (eList.size() > 0) {
|
||||
List<Content> content = new ArrayList<Content>();
|
||||
final List<Content> content = new ArrayList<Content>();
|
||||
for (int i = 0; i < eList.size(); i++) {
|
||||
content.add(parseContent((Element)eList.get(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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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,39 +53,40 @@ 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");
|
||||
}
|
||||
|
||||
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);
|
||||
@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);
|
||||
|
@ -97,80 +97,86 @@ public class Atom10Generator extends BaseWireFeedGenerator {
|
|||
return root;
|
||||
}
|
||||
|
||||
protected void populateFeed(Feed feed,Element parent) throws FeedException {
|
||||
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;
|
||||
protected void addFeed(final Feed feed, final Element parent) throws FeedException {
|
||||
final Element eFeed = parent;
|
||||
populateFeedHeader(feed, eFeed);
|
||||
generateForeignMarkup(eFeed, (List<Element>)feed.getForeignMarkup());
|
||||
generateForeignMarkup(eFeed, feed.getForeignMarkup());
|
||||
checkFeedHeaderConstraints(eFeed);
|
||||
generateFeedModules(feed.getModules(), eFeed);
|
||||
}
|
||||
|
||||
protected void addEntries(Feed feed,Element parent) throws FeedException {
|
||||
List<Entry> items = feed.getEntries();
|
||||
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((Entry)items.get(i),parent);
|
||||
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());
|
||||
generateForeignMarkup(eEntry, entry.getForeignMarkup());
|
||||
checkEntryConstraints(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 (Exception 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);
|
||||
} 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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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,68 +76,68 @@ 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());
|
||||
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();
|
||||
final Content c = new Content();
|
||||
c.setValue(parseTextConstructToString(e));
|
||||
c.setType(getAttributeValue(e, "type"));
|
||||
feed.setTitleEx(c);
|
||||
|
@ -146,7 +147,7 @@ public class Atom10Parser extends BaseWireFeedParser {
|
|||
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());
|
||||
|
@ -161,7 +162,7 @@ public class Atom10Parser extends BaseWireFeedParser {
|
|||
|
||||
e = eFeed.getChild("subtitle", getAtomNamespace());
|
||||
if (e != null) {
|
||||
Content subtitle = new Content();
|
||||
final Content subtitle = new Content();
|
||||
subtitle.setValue(parseTextConstructToString(e));
|
||||
subtitle.setType(getAttributeValue(e, "type"));
|
||||
feed.setSubtitle(subtitle);
|
||||
|
@ -174,7 +175,7 @@ public class Atom10Parser extends BaseWireFeedParser {
|
|||
|
||||
e = eFeed.getChild("generator", getAtomNamespace());
|
||||
if (e != null) {
|
||||
Generator gen = new Generator();
|
||||
final Generator gen = new Generator();
|
||||
gen.setValue(e.getText());
|
||||
String att = getAttributeValue(e, "uri");
|
||||
if (att != null) {
|
||||
|
@ -210,8 +211,8 @@ public class Atom10Parser extends BaseWireFeedParser {
|
|||
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) {
|
||||
link.setRel(att);
|
||||
|
@ -237,7 +238,7 @@ public class Atom10Parser extends BaseWireFeedParser {
|
|||
}
|
||||
att = getAttributeValue(eLink, "length");
|
||||
if (att != null) {
|
||||
Long val = NumberParser.parseLong(att);
|
||||
final Long val = NumberParser.parseLong(att);
|
||||
if (val != null) {
|
||||
link.setLength(val.longValue());
|
||||
}
|
||||
|
@ -246,34 +247,32 @@ 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>();
|
||||
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++) {
|
||||
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())) {
|
||||
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>();
|
||||
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++) {
|
||||
Element eLink = (Element) eLinks.get(i);
|
||||
Link link = parseLink(feed, entry, baseURI, eLink);
|
||||
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();
|
||||
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());
|
||||
|
@ -294,38 +293,38 @@ public class Atom10Parser extends BaseWireFeedParser {
|
|||
}
|
||||
|
||||
// List(Elements) -> List(Persons)
|
||||
private List<Person> parsePersons(String baseURI, List<Element> ePersons) {
|
||||
List<Person> persons = new ArrayList<Person>();
|
||||
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, (Element)ePersons.get(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);
|
||||
}
|
||||
|
@ -340,25 +339,25 @@ 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>();
|
||||
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(parseEntry(feed, (Element)eEntries.get(i), baseURI));
|
||||
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();
|
||||
final Content c = new Content();
|
||||
c.setValue(parseTextConstructToString(e));
|
||||
c.setType(getAttributeValue(e, "type"));
|
||||
entry.setTitleEx(c);
|
||||
|
@ -400,7 +399,7 @@ public class Atom10Parser extends BaseWireFeedParser {
|
|||
|
||||
e = eEntry.getChild("content", getAtomNamespace());
|
||||
if (e != null) {
|
||||
List<Content> contents = new ArrayList<Content>();
|
||||
final List<Content> contents = new ArrayList<Content>();
|
||||
contents.add(parseContent(e));
|
||||
entry.setContents(contents);
|
||||
}
|
||||
|
@ -410,7 +409,7 @@ public class Atom10Parser extends BaseWireFeedParser {
|
|||
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
|
||||
|
@ -421,25 +420,24 @@ public class Atom10Parser extends BaseWireFeedParser {
|
|||
|
||||
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>();
|
||||
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++) {
|
||||
Element eCategory = (Element) eCategories.get(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) {
|
||||
category.setTerm(att);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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,15 +73,16 @@ 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) {
|
||||
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) {
|
||||
|
@ -92,28 +96,26 @@ public class Base64 {
|
|||
int pad = 0;
|
||||
|
||||
d1 = dData[i];
|
||||
if ((i+1)<dData.length) {
|
||||
if (i + 1 < dData.length) {
|
||||
d2 = dData[i + 1];
|
||||
if ((i+2)<dData.length) {
|
||||
if (i + 2 < dData.length) {
|
||||
d3 = dData[i + 2];
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
pad = 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
} 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)];
|
||||
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++] = pad < 2 ? (byte) e3 : (byte) '=';
|
||||
eData[eIndex++] = pad < 1 ? (byte) e4 : (byte) '=';
|
||||
|
||||
}
|
||||
return eData;
|
||||
|
@ -133,24 +135,26 @@ 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) {
|
||||
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;
|
||||
int dLength = cleanELength / 4 * 3;
|
||||
switch (cleanELength % 4) {
|
||||
case 3:
|
||||
dLength += 2;
|
||||
|
@ -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));
|
||||
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));
|
||||
dData[dIndex++] = (byte) (e2 << 4 | e3 >> 2);
|
||||
}
|
||||
if (dIndex < dData.length) {
|
||||
dData[dIndex++] = (byte) ((e3<<6) | (e4));
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,20 +148,21 @@ 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());
|
||||
final Element taxo = desc.getChild("topic", getTaxonomyNamespace());
|
||||
if (taxo != null) {
|
||||
Attribute a = taxo.getAttribute("resource", getRDFNamespace());
|
||||
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()));
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
@ -43,70 +43,47 @@ public class DateParser {
|
|||
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,16 +99,17 @@ 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);
|
||||
final DateFormat df = new SimpleDateFormat(masks[i], Locale.US);
|
||||
// df.setLenient(false);
|
||||
df.setLenient(true);
|
||||
try {
|
||||
|
@ -141,8 +119,7 @@ public class DateParser {
|
|||
d = null;
|
||||
}
|
||||
// System.out.println("pp["+pp.getIndex()+"] s["+sDate+" m["+masks[i]+"] d["+d+"]");
|
||||
}
|
||||
catch (Exception ex1) {
|
||||
} catch (final Exception ex1) {
|
||||
// System.out.println("s: "+sDate+" m: "+masks[i]+" d: "+null);
|
||||
}
|
||||
}
|
||||
|
@ -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");
|
||||
final int utIndex = sDate.indexOf(" UT");
|
||||
if (utIndex > -1) {
|
||||
String pre = sDate.substring(0,utIndex);
|
||||
String post = sDate.substring(utIndex+3);
|
||||
final String pre = sDate.substring(0, utIndex);
|
||||
final String post = sDate.substring(utIndex + 3);
|
||||
sDate = pre + " GMT" + post;
|
||||
}
|
||||
return parseUsingMask(RFC822_MASKS, sDate);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parses a Date out of a String with a date in W3C date-time format.
|
||||
* <p/>
|
||||
|
@ -194,17 +173,21 @@ 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");
|
||||
final int tIndex = sDate.indexOf("T");
|
||||
if (tIndex > -1) {
|
||||
if (sDate.endsWith("Z")) {
|
||||
sDate = sDate.substring(0, sDate.length() - 1) + "+00:00";
|
||||
|
@ -215,31 +198,31 @@ public class DateParser {
|
|||
}
|
||||
if (tzdIndex > -1) {
|
||||
String pre = sDate.substring(0, tzdIndex);
|
||||
int secFraction = pre.indexOf(",");
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 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) {
|
||||
d = parseRFC822(sDate);
|
||||
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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,16 +44,16 @@ 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) {
|
||||
@Override
|
||||
protected String getKey(final Object obj) {
|
||||
return ((WireFeedGenerator) obj).getType();
|
||||
}
|
||||
|
||||
|
|
|
@ -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,12 +64,14 @@ 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++) {
|
||||
parser = (WireFeedParser) parsers.get(i);
|
||||
|
@ -76,7 +82,8 @@ public class FeedParsers extends PluginManager {
|
|||
return parser;
|
||||
}
|
||||
|
||||
protected String getKey(Object obj) {
|
||||
@Override
|
||||
protected String getKey(final Object obj) {
|
||||
return ((WireFeedParser) obj).getType();
|
||||
}
|
||||
|
||||
|
|
|
@ -16,29 +16,31 @@
|
|||
*/
|
||||
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) {
|
||||
@Override
|
||||
protected String getKey(final Object obj) {
|
||||
return ((ModuleGenerator) obj).getNamespaceUri();
|
||||
}
|
||||
|
||||
|
@ -46,12 +48,12 @@ public class ModuleGenerators extends PluginManager {
|
|||
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();
|
||||
if (this._allNamespaces == null) {
|
||||
this._allNamespaces = new HashSet();
|
||||
final List mUris = getModuleNamespaces();
|
||||
for (int i = 0; i < mUris.size(); i++) {
|
||||
ModuleGenerator mGen = getGenerator((String)mUris.get(i));
|
||||
_allNamespaces.addAll(mGen.getNamespaces());
|
||||
final ModuleGenerator mGen = getGenerator((String) mUris.get(i));
|
||||
this._allNamespaces.addAll(mGen.getNamespaces());
|
||||
}
|
||||
}
|
||||
return _allNamespaces;
|
||||
return this._allNamespaces;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,23 +16,25 @@
|
|||
*/
|
||||
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) {
|
||||
@Override
|
||||
public String getKey(final Object obj) {
|
||||
return ((ModuleParser) obj).getNamespaceUri();
|
||||
}
|
||||
|
||||
|
@ -40,15 +42,15 @@ public class ModuleParsers extends PluginManager {
|
|||
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);
|
||||
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());
|
||||
|
||||
if (!hasElements) {
|
||||
List<Element> children = root.getChildren();
|
||||
final List<Element> children = root.getChildren();
|
||||
for (int i = 0; !hasElements && i < children.size(); i++) {
|
||||
Element child = (Element) children.get(i);
|
||||
final Element child = children.get(i);
|
||||
hasElements = namespace.equals(child.getNamespace());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
} catch (final Exception ex) {
|
||||
throw new RuntimeException("could not instantiate plugin " + className, ex);
|
||||
}catch (ExceptionInInitializerError er) {
|
||||
} 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;
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
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);
|
||||
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) {
|
||||
StringTokenizer st = new StringTokenizer(values,separator);
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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,13 +49,14 @@ 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);
|
||||
@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,16 +87,16 @@ public class RSS090Generator extends BaseWireFeedGenerator {
|
|||
return root;
|
||||
}
|
||||
|
||||
protected void populateFeed(Channel channel, Element parent) throws FeedException {
|
||||
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, (List<Element>)channel.getForeignMarkup());
|
||||
generateForeignMarkup(parent, channel.getForeignMarkup());
|
||||
}
|
||||
|
||||
protected void addChannel(Channel channel,Element parent) throws FeedException {
|
||||
Element eChannel = new Element("channel", getFeedNamespace());
|
||||
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);
|
||||
|
@ -100,30 +104,30 @@ public class RSS090Generator extends BaseWireFeedGenerator {
|
|||
}
|
||||
|
||||
/**
|
||||
* 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();
|
||||
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();
|
||||
final String link = channel.getLink();
|
||||
if (link != null) {
|
||||
eChannel.addContent(generateSimpleElement("link", link));
|
||||
}
|
||||
String description = channel.getDescription();
|
||||
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);
|
||||
}
|
||||
|
@ -131,8 +135,8 @@ public class RSS090Generator extends BaseWireFeedGenerator {
|
|||
}
|
||||
|
||||
// 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");
|
||||
|
@ -143,27 +147,26 @@ public class RSS090Generator extends BaseWireFeedGenerator {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
protected void addImage(Channel channel,Element parent) throws FeedException {
|
||||
Image image = channel.getImage();
|
||||
protected void addImage(final Channel channel, final Element parent) throws FeedException {
|
||||
final Image image = channel.getImage();
|
||||
if (image != null) {
|
||||
Element eImage = new Element("image", getFeedNamespace());
|
||||
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();
|
||||
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();
|
||||
final String url = image.getUrl();
|
||||
if (url != null) {
|
||||
eImage.addContent(generateSimpleElement("url", url));
|
||||
}
|
||||
String link = image.getLink();
|
||||
final String link = image.getLink();
|
||||
if (link != null) {
|
||||
eImage.addContent(generateSimpleElement("link", link));
|
||||
}
|
||||
|
@ -174,96 +177,96 @@ public class RSS090Generator extends BaseWireFeedGenerator {
|
|||
return "textInput";
|
||||
}
|
||||
|
||||
protected void addTextInput(Channel channel,Element parent) throws FeedException {
|
||||
TextInput textInput = channel.getTextInput();
|
||||
protected void addTextInput(final Channel channel, final Element parent) throws FeedException {
|
||||
final TextInput textInput = channel.getTextInput();
|
||||
if (textInput != null) {
|
||||
Element eTextInput = new Element(getTextInputLabel(), getFeedNamespace());
|
||||
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();
|
||||
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();
|
||||
final String description = textInput.getDescription();
|
||||
if (description != null) {
|
||||
eTextInput.addContent(generateSimpleElement("description", description));
|
||||
}
|
||||
String name = textInput.getName();
|
||||
final String name = textInput.getName();
|
||||
if (name != null) {
|
||||
eTextInput.addContent(generateSimpleElement("name", name));
|
||||
}
|
||||
String link = textInput.getLink();
|
||||
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();
|
||||
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((Item)items.get(i),parent, 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());
|
||||
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);
|
||||
parent.addContent(eItem);
|
||||
}
|
||||
|
||||
protected void populateItem(Item item, Element eItem, int index) {
|
||||
String title = item.getTitle();
|
||||
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();
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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();
|
||||
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 {
|
||||
protected void checkItemConstraints(final Element eItem) throws FeedException {
|
||||
checkNotNullAndLength(eItem, "title", 0, 100);
|
||||
checkNotNullAndLength(eItem, "link", 0, 500);
|
||||
}
|
||||
|
|
|
@ -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,28 +45,27 @@ 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());
|
||||
if (ok) {
|
||||
if (additionalNSs == null) {
|
||||
ok = false;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
ok = false;
|
||||
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,19 +136,20 @@ 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) {
|
||||
|
@ -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,39 +184,40 @@ 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) {
|
||||
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) {
|
||||
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) {
|
||||
protected Element getTextInput(final Element rssRoot) {
|
||||
return rssRoot.getChild("textinput", getRSSNamespace());
|
||||
}
|
||||
|
||||
|
@ -220,12 +227,13 @@ 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);
|
||||
final Element eImage = getImage(rssRoot);
|
||||
if (eImage != null) {
|
||||
image = new Image();
|
||||
|
||||
|
@ -246,21 +254,24 @@ 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();
|
||||
final List<Item> items = new ArrayList<Item>();
|
||||
for (final Element element : eItems) {
|
||||
final Element eItem = element;
|
||||
items.add(parseItem(rssRoot, eItem));
|
||||
}
|
||||
return items;
|
||||
|
@ -272,12 +283,13 @@ 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();
|
||||
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());
|
||||
|
@ -290,14 +302,15 @@ public class RSS090Parser extends BaseWireFeedParser {
|
|||
|
||||
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
|
||||
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
|
||||
Iterator<Element> iterator = foreignMarkup.iterator();
|
||||
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,19 +321,21 @@ 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);
|
||||
final Element eTextInput = getTextInput(rssRoot);
|
||||
if (eTextInput != null) {
|
||||
textInput = new TextInput();
|
||||
Element e = eTextInput.getChild("title", getRSSNamespace());
|
||||
|
@ -343,5 +358,4 @@ public class RSS090Parser extends BaseWireFeedParser {
|
|||
return textInput;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -34,19 +34,19 @@ public class RSS091NetscapeGenerator extends RSS091UserlandGenerator {
|
|||
this("rss_0.91N", "0.91");
|
||||
}
|
||||
|
||||
protected RSS091NetscapeGenerator(String type,String 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
Loading…
Reference in a new issue