1 17 package com.sun.syndication.io.impl; 18 19 import com.sun.syndication.feed.WireFeed; 20 import com.sun.syndication.feed.atom.*; 21 import com.sun.syndication.io.FeedException; 22 import org.jdom.Document; 23 import org.jdom.Element; 24 import org.jdom.Namespace; 25 import org.jdom.output.XMLOutputter; 26 27 import java.util.*; 28 29 31 public class Atom03Parser extends BaseWireFeedParser { 32 private static final String ATOM_URI = "http://purl.org/atom/ns#"; 33 34 public Atom03Parser() { 35 this("atom_0.3"); 36 } 37 38 protected Atom03Parser(String type) { 39 super(type); 40 } 41 42 protected Namespace getAtomNamespace() { 43 return Namespace.getNamespace(ATOM_URI); 44 } 45 46 public boolean isMyType(Document document) { 47 Element rssRoot = document.getRootElement(); 48 Namespace defaultNS = rssRoot.getNamespace(); 49 return (defaultNS!=null) && defaultNS.equals(getAtomNamespace()); 50 } 51 52 public WireFeed parse(Document document, boolean validate) throws IllegalArgumentException ,FeedException { 53 if (validate) { 54 validateFeed(document); 55 } 56 Element rssRoot = document.getRootElement(); 57 return parseFeed(rssRoot); 58 } 59 60 protected void validateFeed(Document document) throws FeedException { 61 } 68 69 protected WireFeed parseFeed(Element eFeed) { 70 71 com.sun.syndication.feed.atom.Feed feed = new com.sun.syndication.feed.atom.Feed(getType()); 72 73 Element e = eFeed.getChild("title",getAtomNamespace()); 74 if (e!=null) { 75 feed.setTitle(e.getText()); 76 } 77 78 List eList = eFeed.getChildren("link",getAtomNamespace()); 79 feed.setAlternateLinks(parseAlternateLinks(eList)); 80 feed.setOtherLinks(parseOtherLinks(eList)); 81 82 e = eFeed.getChild("author",getAtomNamespace()); 83 if (e!=null) { 84 feed.setAuthor(parsePerson(e)); 85 } 86 87 eList = eFeed.getChildren("contributor",getAtomNamespace()); 88 if (eList.size()>0) { 89 feed.setContributors(parsePersons(eList)); 90 } 91 92 e = eFeed.getChild("tagline",getAtomNamespace()); 93 if (e!=null) { 94 feed.setTagline(parseContent(e)); 95 } 96 97 e = eFeed.getChild("id",getAtomNamespace()); 98 if (e!=null) { 99 feed.setId(e.getText()); 100 } 101 102 e = eFeed.getChild("generator",getAtomNamespace()); 103 if (e!=null) { 104 Generator gen = new Generator(); 105 gen.setValue(e.getText()); 106 String att = e.getAttributeValue("url"); if (att!=null) { 108 gen.setUrl(att); 109 } 110 att = e.getAttributeValue("version"); if (att!=null) { 112 gen.setVersion(att); 113 } 114 feed.setGenerator(gen); 115 } 116 117 e = eFeed.getChild("copyright",getAtomNamespace()); 118 if (e!=null) { 119 feed.setCopyright(e.getText()); 120 } 121 122 e = eFeed.getChild("info",getAtomNamespace()); 123 if (e!=null) { 124 feed.setInfo(parseContent(e)); 125 } 126 127 e = eFeed.getChild("modified",getAtomNamespace()); 128 if (e!=null) { 129 feed.setModified(DateParser.parseW3CDateTime(e.getText())); 130 } 131 132 eList = eFeed.getChildren("entry",getAtomNamespace()); 133 if (eList.size()>0) { 134 feed.setEntries(parseEntries(eList)); 135 } 136 137 feed.setModules(parseFeedModules(eFeed)); 138 139 return feed; 140 } 141 142 private Link parseLink(Element eLink) { 143 Link link = new Link(); 144 String att = eLink.getAttributeValue("rel"); if (att!=null) { 146 link.setRel(att); 147 } 148 att = eLink.getAttributeValue("type"); if (att!=null) { 150 link.setType(att); 151 } 152 att = eLink.getAttributeValue("href"); if (att!=null) { 154 link.setHref(att); 155 } 156 return link; 157 } 158 159 private List parseLinks(List eLinks,boolean alternate) { 161 List links = new ArrayList(); 162 for (int i=0;i<eLinks.size();i++) { 163 Element eLink = (Element) eLinks.get(i); 164 String rel = eLink.getAttributeValue("rel"); if (alternate) { 167 if ("alternate".equals(rel)) { 168 links.add(parseLink(eLink)); 169 } 170 } 171 else { 172 if (!("alternate".equals(rel))) { 173 links.add(parseLink(eLink)); 174 } 175 } 176 } 177 return (links.size()>0) ? links : null; 178 } 179 180 private List parseAlternateLinks(List eLinks) { 182 return parseLinks(eLinks,true); 183 } 184 185 private List parseOtherLinks(List eLinks) { 187 return parseLinks(eLinks,false); 188 } 189 190 private Person parsePerson(Element ePerson) { 191 Person person = new Person(); 192 Element e = ePerson.getChild("name",getAtomNamespace()); 193 if (e!=null) { 194 person.setName(e.getText()); 195 } 196 e = ePerson.getChild("url",getAtomNamespace()); 197 if (e!=null) { 198 person.setUrl(e.getText()); 199 } 200 e = ePerson.getChild("email",getAtomNamespace()); 201 if (e!=null) { 202 person.setEmail(e.getText()); 203 } 204 return person; 205 } 206 207 private List parsePersons(List ePersons) { 209 List persons = new ArrayList(); 210 for (int i=0;i<ePersons.size();i++) { 211 persons.add(parsePerson((Element)ePersons.get(i))); 212 } 213 return (persons.size()>0) ? persons : null; 214 } 215 216 private Content parseContent(Element e) { 217 String value = null; 218 String type = e.getAttributeValue("type"); type = (type!=null) ? type : "text/plain"; 220 String mode = e.getAttributeValue("mode"); if (mode == null) { 222 mode = Content.XML; } 224 if (mode.equals(Content.ESCAPED)) { 225 value = e.getText(); 227 } 228 else 229 if (mode.equals(Content.BASE64)) { 230 value = Base64.decode(e.getText()); 231 } 232 else 233 if (mode.equals(Content.XML)) { 234 XMLOutputter outputter = new XMLOutputter(); 235 List eContent = e.getContent(); 236 Iterator i = eContent.iterator(); 237 while (i.hasNext()) { 238 org.jdom.Content c = (org.jdom.Content) i.next(); 239 if (c instanceof Element) { 240 Element eC = (Element) c; 241 if (eC.getNamespace().equals(getAtomNamespace())) { 242 ((Element)c).setNamespace(Namespace.NO_NAMESPACE); 243 } 244 } 245 } 246 value = outputter.outputString(eContent); 247 } 248 249 Content content = new Content(); 250 content.setType(type); 251 content.setMode(mode); 252 content.setValue(value); 253 return content; 254 } 255 256 private List parseEntries(List eEntries) { 258 List entries = new ArrayList(); 259 for (int i=0;i<eEntries.size();i++) { 260 entries.add(parseEntry((Element)eEntries.get(i))); 261 } 262 return (entries.size()>0) ? entries : null; 263 } 264 265 private Entry parseEntry(Element eEntry) { 266 Entry entry = new Entry(); 267 268 Element e = eEntry.getChild("title",getAtomNamespace()); 269 if (e!=null) { 270 entry.setTitle(e.getText()); 271 } 272 273 List eList = eEntry.getChildren("link",getAtomNamespace()); 274 entry.setAlternateLinks(parseAlternateLinks(eList)); 275 entry.setOtherLinks(parseOtherLinks(eList)); 276 277 e = eEntry.getChild("author",getAtomNamespace()); 278 if (e!=null) { 279 entry.setAuthor(parsePerson(e)); 280 } 281 282 eList = eEntry.getChildren("contributor",getAtomNamespace()); 283 if (eList.size()>0) { 284 entry.setContributors(parsePersons(eList)); 285 } 286 287 e = eEntry.getChild("id",getAtomNamespace()); 288 if (e!=null) { 289 entry.setId(e.getText()); 290 } 291 292 e = eEntry.getChild("modified",getAtomNamespace()); 293 if (e!=null) { 294 entry.setModified(DateParser.parseW3CDateTime(e.getText())); 295 } 296 297 e = eEntry.getChild("issued",getAtomNamespace()); 298 if (e!=null) { 299 entry.setIssued(DateParser.parseW3CDateTime(e.getText())); 300 } 301 302 e = eEntry.getChild("summary",getAtomNamespace()); 303 if (e!=null) { 304 entry.setSummary(parseContent(e)); 305 } 306 307 eList = eEntry.getChildren("content",getAtomNamespace()); 308 if (eList.size()>0) { 309 List content = new ArrayList(); 310 for (int i=0;i<eList.size();i++) { 311 content.add(parseContent((Element)eList.get(i))); 312 } 313 entry.setContents(content); 314 } 315 316 entry.setModules(parseItemModules(eEntry)); 317 318 return entry; 319 } 320 321 322 } 323 | Popular Tags |