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());
+ }
+
+ }
+
}