Java tutorial
/* * Copyright 2004 Sun Microsystems, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package com.rometools.rome.io.impl; import java.util.ArrayList; import java.util.List; import java.util.Locale; import org.jdom2.Content; import org.jdom2.Element; import org.jdom2.output.XMLOutputter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.rometools.rome.feed.WireFeed; import com.rometools.rome.feed.rss.Category; import com.rometools.rome.feed.rss.Channel; import com.rometools.rome.feed.rss.Cloud; import com.rometools.rome.feed.rss.Description; import com.rometools.rome.feed.rss.Enclosure; import com.rometools.rome.feed.rss.Item; import com.rometools.rome.feed.rss.Source; /** */ public class RSS092Parser extends RSS091UserlandParser { private static final Logger LOG = LoggerFactory.getLogger(RSS092Parser.class); public RSS092Parser() { this("rss_0.92"); } protected RSS092Parser(final String type) { super(type); } @Override protected String getRSSVersion() { return "0.92"; } @Override protected WireFeed parseChannel(final Element rssRoot, final Locale locale) { final Channel channel = (Channel) super.parseChannel(rssRoot, locale); final Element eChannel = rssRoot.getChild("channel", getRSSNamespace()); final Element eCloud = eChannel.getChild("cloud", getRSSNamespace()); if (eCloud != null) { final Cloud cloud = new Cloud(); final String domain = eCloud.getAttributeValue("domain"); if (domain != null) { cloud.setDomain(domain); } // getRSSNamespace()); DONT KNOW WHY DOESN'T WORK final String port = eCloud.getAttributeValue("port"); if (port != null) { cloud.setPort(Integer.parseInt(port.trim())); } // getRSSNamespace()); DONT KNOW WHY DOESN'T WORK final String path = eCloud.getAttributeValue("path"); if (path != null) { cloud.setPath(path); } // getRSSNamespace()); DONT KNOW WHY DOESN'T WORK final String registerProcedure = eCloud.getAttributeValue("registerProcedure"); if (registerProcedure != null) { cloud.setRegisterProcedure(registerProcedure); } // getRSSNamespace()); DONT KNOW WHY DOESN'T WORK final String protocol = eCloud.getAttributeValue("protocol"); if (protocol != null) { cloud.setProtocol(protocol); } channel.setCloud(cloud); } return channel; } @Override protected Item parseItem(final Element rssRoot, final Element eItem, final Locale locale) { final Item item = super.parseItem(rssRoot, eItem, locale); final Element eSource = eItem.getChild("source", getRSSNamespace()); if (eSource != null) { final Source source = new Source(); // getRSSNamespace()); DONT KNOW WHY DOESN'T WORK final String url = eSource.getAttributeValue("url"); source.setUrl(url); source.setValue(eSource.getText()); item.setSource(source); } // 0.92 allows one enclosure occurrence, 0.93 multiple just saving to write some code. // getRSSNamespace()); DONT KNOW WHY DOESN'T WORK final List<Element> eEnclosures = eItem.getChildren("enclosure"); if (!eEnclosures.isEmpty()) { final List<Enclosure> enclosures = new ArrayList<Enclosure>(); for (final Element eEnclosure : eEnclosures) { final Enclosure enclosure = new Enclosure(); // getRSSNamespace()); DONT KNOW WHY DOESN'T WORK final String url = eEnclosure.getAttributeValue("url"); if (url != null) { enclosure.setUrl(url); } // getRSSNamespace()); DONT KNOW WHY DOESN'T WORK final String length = eEnclosure.getAttributeValue("length"); enclosure.setLength(NumberParser.parseLong(length, 0L)); // getRSSNamespace()); DONT KNOW WHY DOESN'T WORK final String type = eEnclosure.getAttributeValue("type"); if (type != null) { enclosure.setType(type); } enclosures.add(enclosure); } item.setEnclosures(enclosures); } // getRSSNamespace()); DONT KNOW WHY DOESN'T WORK final List<Element> categories = eItem.getChildren("category"); item.setCategories(parseCategories(categories)); return item; } protected List<Category> parseCategories(final List<Element> eCats) { List<Category> cats = null; if (!eCats.isEmpty()) { cats = new ArrayList<Category>(); for (final Element eCat : eCats) { final Category cat = new Category(); // getRSSNamespace()); DONT KNOW WHY DOESN'T WORK final String domain = eCat.getAttributeValue("domain"); if (domain != null) { cat.setDomain(domain); } cat.setValue(eCat.getText()); cats.add(cat); } } return cats; } @Override protected Description parseItemDescription(final Element rssRoot, final Element eDesc) { final Description desc = new Description(); final StringBuilder sb = new StringBuilder(); final XMLOutputter xmlOut = new XMLOutputter(); for (final Content c : eDesc.getContent()) { switch (c.getCType()) { case Text: case CDATA: sb.append(c.getValue()); break; case EntityRef: LOG.debug("Entity: {}", c.getValue()); sb.append(c.getValue()); break; case Element: sb.append(xmlOut.outputString((Element) c)); break; default: // ignore break; } } desc.setValue(sb.toString()); String att = eDesc.getAttributeValue("type"); if (att == null) { att = "text/html"; } desc.setType(att); return desc; } }