diff --git a/rome/src/main/java/com/rometools/rome/feed/atom/Content.java b/rome/src/main/java/com/rometools/rome/feed/atom/Content.java index 0519b9660..bf10a06eb 100644 --- a/rome/src/main/java/com/rometools/rome/feed/atom/Content.java +++ b/rome/src/main/java/com/rometools/rome/feed/atom/Content.java @@ -36,6 +36,7 @@ public class Content implements Cloneable, Serializable { private String type; private String value; private String src; + private String xmlBase; /** @since Atom 1.0 */ public static final String TEXT = "text"; @@ -219,4 +220,26 @@ public String getSrc() { public void setSrc(final String src) { this.src = src; } + + /** + * Returns the xmlBase + + * + * @return Returns the xmlBase. + * @since Atom 1.0 + */ + public String getXmlBase() { + return xmlBase; + } + + /** + * Set the xmlBase + + * + * @param xmlBase The xmlBase to set. + * @since Atom 1.0 + */ + public void setXmlBase(final String xmlBase) { + this.xmlBase = xmlBase; + } } diff --git a/rome/src/main/java/com/rometools/rome/feed/synd/SyndContent.java b/rome/src/main/java/com/rometools/rome/feed/synd/SyndContent.java index c5ec591a7..ac44b373e 100644 --- a/rome/src/main/java/com/rometools/rome/feed/synd/SyndContent.java +++ b/rome/src/main/java/com/rometools/rome/feed/synd/SyndContent.java @@ -78,6 +78,24 @@ public interface SyndContent extends Cloneable, CopyFrom { */ void setValue(String value); + /** + * Returns the content xmlBase. + *

+ * + * @return the content xmlBase, null if none. + * + */ + String getXmlBase(); + + /** + * Sets the content xmlBase. + *

+ * + * @param xmlBase the content xmlBase to set, null if none. + * + */ + void setXmlBase(String xmlBase); + /** * Creates a deep clone of the object. *

diff --git a/rome/src/main/java/com/rometools/rome/feed/synd/SyndContentImpl.java b/rome/src/main/java/com/rometools/rome/feed/synd/SyndContentImpl.java index d257e1052..11653b6b9 100644 --- a/rome/src/main/java/com/rometools/rome/feed/synd/SyndContentImpl.java +++ b/rome/src/main/java/com/rometools/rome/feed/synd/SyndContentImpl.java @@ -39,6 +39,7 @@ public class SyndContentImpl implements Serializable, SyndContent { private String type; private String value; private String mode; + private String xmlBase; static { final Map> basePropInterfaceMap = new HashMap>(); @@ -179,6 +180,35 @@ public void setValue(final String value) { this.value = value; } + /** + * Returns the content xmlBase. + *

+ * + * @return the content xmlBase, null if none. + * + */ + @Override + public String getXmlBase() { + return this.xmlBase; + } + + /** + * Sets the content xmlBase. + *

+ * + * @param xmlBase the content xmlBase to set, null if none. + * + */ + @Override + public void setXmlBase(final String xmlBase) { + this.xmlBase = xmlBase; + } + + /** + * Return the Class interface + * + * @return the class interface. + */ @Override public Class getInterface() { return SyndContent.class; diff --git a/rome/src/main/java/com/rometools/rome/feed/synd/impl/ConverterForAtom10.java b/rome/src/main/java/com/rometools/rome/feed/synd/impl/ConverterForAtom10.java index 2142d682c..c2bcbfc02 100644 --- a/rome/src/main/java/com/rometools/rome/feed/synd/impl/ConverterForAtom10.java +++ b/rome/src/main/java/com/rometools/rome/feed/synd/impl/ConverterForAtom10.java @@ -449,6 +449,7 @@ protected SyndContent createSyndContent(final Content content) { final SyndContent sContent = new SyndContentImpl(); sContent.setType(content.getType()); sContent.setValue(content.getValue()); + sContent.setXmlBase(content.getXmlBase()); return sContent; } diff --git a/rome/src/main/java/com/rometools/rome/io/impl/Atom10Generator.java b/rome/src/main/java/com/rometools/rome/io/impl/Atom10Generator.java index f8db783fe..d53c46bd1 100644 --- a/rome/src/main/java/com/rometools/rome/io/impl/Atom10Generator.java +++ b/rome/src/main/java/com/rometools/rome/io/impl/Atom10Generator.java @@ -502,6 +502,12 @@ protected void fillContentElement(final Element contentElement, final Content co } } + + final String xmlBase = content.getXmlBase(); + if (xmlBase != null) { + final Attribute xmlBaseAttribute = new Attribute("base", xmlBase, Namespace.XML_NAMESPACE); + contentElement.setAttribute(xmlBaseAttribute); + } } protected Element generateGeneratorElement(final Generator generator) { diff --git a/rome/src/main/java/com/rometools/rome/io/impl/Atom10Parser.java b/rome/src/main/java/com/rometools/rome/io/impl/Atom10Parser.java index 02d4ef8ca..d73550a2a 100644 --- a/rome/src/main/java/com/rometools/rome/io/impl/Atom10Parser.java +++ b/rome/src/main/java/com/rometools/rome/io/impl/Atom10Parser.java @@ -333,11 +333,13 @@ private Content parseContent(final Element e) { final String value = parseTextConstructToString(e); final String src = getAttributeValue(e, "src"); final String type = getAttributeValue(e, "type"); + final String xmlBase = e.getAttributeValue("base", Namespace.XML_NAMESPACE); final Content content = new Content(); content.setSrc(src); content.setType(type); content.setValue(value); + content.setXmlBase(xmlBase); return content; } diff --git a/rome/src/test/java/com/rometools/rome/io/impl/Atom10ParserTest.java b/rome/src/test/java/com/rometools/rome/io/impl/Atom10ParserTest.java index 1f07e9b72..dbe462741 100644 --- a/rome/src/test/java/com/rometools/rome/io/impl/Atom10ParserTest.java +++ b/rome/src/test/java/com/rometools/rome/io/impl/Atom10ParserTest.java @@ -13,7 +13,11 @@ import org.junit.Test; import com.rometools.rome.feed.atom.Entry; +import com.rometools.rome.feed.synd.SyndEntry; +import com.rometools.rome.feed.synd.SyndFeed; import com.rometools.rome.io.FeedException; +import com.rometools.rome.io.SyndFeedInput; +import com.rometools.rome.io.XmlReader; public class Atom10ParserTest { @@ -41,4 +45,14 @@ public void testParseEntryCatchingXxe() throws IllegalArgumentException, JDOMExc } + @Test + public void testIssue689() throws Exception { + String url = "http://feeds.kottke.org/main"; + SyndFeed feed = new SyndFeedInput().build(new XmlReader(new java.net.URL(url))); + for (SyndEntry e : feed.getEntries()) { + assertEquals("https://kottke.org/", e.getContents().iterator().next().getXmlBase()); + } + + } + }