blob: 61b5bc2b1656b8bac5b8dec4dce1634a443b8716 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. The ASF licenses this file to You
* 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. For additional information regarding
* copyright in this work, please see the NOTICE file in the top level
* directory of this distribution.
*/
package org.apache.abdera.contrib.rss;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.apache.abdera.Abdera;
import org.apache.abdera.factory.Factory;
import org.apache.abdera.i18n.iri.IRI;
import org.apache.abdera.model.Category;
import org.apache.abdera.model.DateTime;
import org.apache.abdera.model.Div;
import org.apache.abdera.model.Element;
import org.apache.abdera.model.ElementWrapper;
import org.apache.abdera.model.Entry;
import org.apache.abdera.model.ExtensibleElement;
import org.apache.abdera.model.ExtensibleElementWrapper;
import org.apache.abdera.model.Generator;
import org.apache.abdera.model.IRIElement;
import org.apache.abdera.model.Link;
import org.apache.abdera.model.Person;
import org.apache.abdera.model.Text;
import org.apache.abdera.model.Text.Type;
import org.apache.abdera.parser.stax.util.FOMElementIterator;
import org.apache.abdera.parser.stax.util.FOMHelper;
import org.apache.abdera.parser.stax.util.FOMList;
import org.apache.abdera.util.Constants;
import org.apache.abdera.xpath.XPath;
import org.apache.abdera.xpath.XPathException;
public class RssChannel
extends ExtensibleElementWrapper {
public RssChannel(Element internal) {
super(internal);
}
public RssChannel(Factory factory, QName qname) {
super(factory, qname);
}
public void addEntry(Entry entry) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Entry addEntry() {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public List<Entry> getEntries() {
QName qname = getQName();
if (qname.getNamespaceURI().equals(RssConstants.RSS1_NS) &&
qname.getLocalPart().equals("channel")) {
List<Entry> entries = new ArrayList<Entry>();
ExtensibleElement items = getExtension(RssConstants.QNAME_RDF_ITEMS);
if (items != null) {
ExtensibleElement se = items.getExtension(RssConstants.QNAME_RDF_SEQ);
if (se != null) {
List<Element> seq = se.getExtensions(RssConstants.QNAME_RDF_LI);
for (Element el : seq) {
String res = el.getAttributeValue("resource");
if (res != null) {
String path = "//rss:item[@rdf:about='" + res + "']";
Element entryel = null;
try {
entryel = locate(path);
} catch (Exception e) {}
if (entryel != null) {
//TODO:fix this.. entryel should already be an RssItem
entries.add(new RssItem(entryel));
}
}
}
}
}
return entries;
} else {
return getExtensions(RssConstants.QNAME_ITEM);
}
}
public Entry getEntry(String id) {
if (id == null) return null;
List<Entry> l = getEntries();
for (Entry e : l) {
IRI eid = e.getId();
if (eid != null && eid.equals(new IRI(id))) return e;
}
return null;
}
public void insertEntry(Entry entry) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Entry insertEntry() {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public void sortEntries(Comparator<Entry> comparator) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public void sortEntriesByEdited(boolean new_first) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public void sortEntriesByUpdated(boolean new_first) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public void addAuthor(Person person) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Person addAuthor(String name) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Person addAuthor(String name, String email, String iri) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public void addCategory(Category category) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Category addCategory(String term) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Category addCategory(String scheme, String term, String label) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public void addLink(Link link) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Link addLink(String href) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Link addLink(String href, String rel) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Link addLink(String href, String rel, String type, String title,
String hreflang, long length) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Link getAlternateLink() {
Link link = getExtension(RssConstants.QNAME_LINK);
if (link == null) link = getExtension(RssConstants.QNAME_RDF_LINK);
return link;
}
public Link getAlternateLink(String type, String hreflang){
return getAlternateLink();
}
public IRI getAlternateLinkResolvedHref() {
Link link = getAlternateLink();
return (link != null) ? link.getResolvedHref() : null;
}
public IRI getAlternateLinkResolvedHref(String type, String hreflang){
return getAlternateLinkResolvedHref();
}
public Person getAuthor() {
Person person = getExtension(RssConstants.QNAME_MANAGINGEDITOR);
if (person == null) person = getExtension(RssConstants.QNAME_DC_CREATOR);
return person;
}
public List<Person> getAuthors() {
List<Person> people = getExtensions(RssConstants.QNAME_MANAGINGEDITOR);
if (people == null || people.size() == 0) people = getExtensions(RssConstants.QNAME_DC_CREATOR);
return people;
}
public List<Person> getContributors() {
List<Person> people = getExtensions(RssConstants.QNAME_DC_CONTRIBUTOR);
return people;
}
public List<Category> getCategories() {
List<Category> cats = getExtensions(RssConstants.QNAME_CATEGORY);
if (cats == null || cats.size() == 0) cats = getExtensions(RssConstants.QNAME_DC_SUBJECT);
return cats;
}
@SuppressWarnings("unchecked")
public List<Category> getCategories(String scheme) {
return (scheme != null) ?
new FOMList<Category>(
new FOMElementIterator(getInternal(), RssCategory.class, new QName("domain"), scheme, null)
) : getCategories();
}
public Generator getGenerator() {
return getExtension(RssConstants.QNAME_GENERATOR);
}
public IRI getIcon() {
IRIElement iri = getIconElement();
return (iri != null) ? iri.getValue() : null;
}
public IRIElement getIconElement() {
return getLogoElement();
}
public IRI getId() {
IRIElement id = getIdElement();
return (id != null) ? id.getValue() : null;
}
public IRIElement getIdElement() {
return getExtension(RssConstants.QNAME_DC_IDENTIFIER);
}
public Link getLink(String rel) {
if (rel.equals(Link.REL_ALTERNATE) || rel.equals(Link.REL_ALTERNATE_IANA)) {
RssGuid guid = (RssGuid) getIdElement();
if (guid != null && guid.isPermalink()) return guid;
return getAlternateLink();
}
List<Link> links = FOMHelper.getLinks(getInternal(), rel);
return (links != null && links.size() > 0) ? links.get(0) : null;
}
public IRI getLinkResolvedHref(String rel) {
Link link = getLink(rel);
return (link != null) ? link.getResolvedHref() : null;
}
public List<Link> getLinks() {
return getExtensions(Constants.LINK);
}
public List<Link> getLinks(String rel) {
return FOMHelper.getLinks(getInternal(), rel);
}
public List<Link> getLinks(String... rel) {
return FOMHelper.getLinks(getInternal(), rel);
}
public IRI getLogo() {
IRIElement iri = getLogoElement();
return (iri != null) ? iri.getValue() : null;
}
public IRIElement getLogoElement() {
IRIElement iri = getExtension(RssConstants.QNAME_IMAGE);
if (iri == null) {
Element image = getExtension(RssConstants.QNAME_RDF_IMAGE);
if (image != null) {
String id = image.getAttributeValue(RssConstants.QNAME_RDF_RESOURCE);
if (id != null) {
String path = "//rss:image[@rdf:about='" + id + "']";
Element res = null;
try {
res = locate(path);
} catch (Exception e) {
e.printStackTrace();
}
if (res != null) {
// TODO: Need to fix
return new RssImage(res);
}
} else {
return (IRIElement) image;
}
}
}
return iri;
}
public String getRights() {
Text text = getRightsElement();
return (text != null) ? text.getValue() : null;
}
public Text getRightsElement() {
Text text = getExtension(RssConstants.QNAME_COPYRIGHT);
if (text == null) text = getExtension(RssConstants.QNAME_DC_RIGHTS);
return text;
}
public Type getRightsType() {
Text text = getRightsElement();
return (text != null) ? text.getTextType() : null;
}
public Link getSelfLink() {
return getLink("self");
}
public IRI getSelfLinkResolvedHref() {
Link link = getSelfLink();
return (link != null) ? link.getResolvedHref() : null;
}
public String getSubtitle() {
Text text = getSubtitleElement();
return (text != null) ? text.getValue() : null;
}
public Text getSubtitleElement() {
Text text = getExtension(RssConstants.QNAME_DESCRIPTION);
if (text == null) text = getExtension(RssConstants.QNAME_RDF_DESCRIPTION);
if (text == null) text = getExtension(RssConstants.QNAME_DC_DESCRIPTION);
return text;
}
public Type getSubtitleType() {
Text text = getSubtitleElement();
return (text != null) ? text.getTextType() : null;
}
public String getTitle() {
Text text = getTitleElement();
return (text != null) ? text.getValue() : null;
}
public Text getTitleElement() {
Text text = getExtension(RssConstants.QNAME_TITLE);
if (text == null) text = getExtension(RssConstants.QNAME_RDF_TITLE);
if (text == null) text = getExtension(RssConstants.QNAME_DC_TITLE);
return text;
}
public Type getTitleType() {
Text text = getTitleElement();
return (text != null) ? text.getTextType() : null;
}
public Date getUpdated() {
DateTime dt = getUpdatedElement();
return (dt != null) ? dt.getDate() : null;
}
public DateTime getUpdatedElement() {
DateTime dt = getExtension(RssConstants.QNAME_LASTBUILDDATE);
if (dt == null) dt = getExtension(RssConstants.QNAME_LASTBUILDDATE2);
if (dt == null) dt = getExtension(RssConstants.QNAME_PUBDATE);
if (dt == null) dt = getExtension(RssConstants.QNAME_PUBDATE2);
if (dt == null) dt = getExtension(RssConstants.QNAME_DC_DATE);
return dt;
}
public String getUpdatedString() {
DateTime dt = getUpdatedElement();
return (dt != null) ? dt.getString() : null;
}
public Date getPublished() {
DateTime dt = getPublishedElement();
return (dt != null) ? dt.getDate() : null;
}
public DateTime getPublishedElement() {
DateTime dt = getExtension(RssConstants.QNAME_PUBDATE);
if (dt == null) dt = getExtension(RssConstants.QNAME_PUBDATE2);
if (dt == null) dt = getExtension(RssConstants.QNAME_DC_DATE);
return dt;
}
public String getPublishedString() {
DateTime dt = getPublishedElement();
return (dt != null) ? dt.getString() : null;
}
public IRIElement newId() {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public void setGenerator(Generator generator) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Generator setGenerator(String iri, String version, String value) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public IRIElement setIcon(String iri) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public void setIconElement(IRIElement iri) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public IRIElement setId(String id) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public IRIElement setId(String id, boolean normalize) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public void setIdElement(IRIElement id) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public IRIElement setLogo(String iri) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public void setLogoElement(IRIElement iri) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Text setRights(String value) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Text setRights(String value, Type type) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Text setRights(Div value) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Text setRightsAsHtml(String value) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Text setRightsAsXhtml(String value) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public void setRightsElement(Text text) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Text setSubtitle(String value) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Text setSubtitle(String value, Type type) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Text setSubtitle(Div value) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Text setSubtitleAsHtml(String value) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Text setSubtitleAsXhtml(String value) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public void setSubtitleElement(Text text) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Text setTitle(String value) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Text setTitle(String value, Type type) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Text setTitle(Div value) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Text setTitleAsHtml(String value) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public Text setTitleAsXhtml(String value) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public void setTitleElement(Text text) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public DateTime setUpdated(Date value) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public DateTime setUpdated(String value) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public void setUpdatedElement(DateTime dateTime) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
public String getLanguage() {
String lang = getSimpleExtension(RssConstants.QNAME_LANGUAGE);
if (lang == null) lang = getSimpleExtension(RssConstants.QNAME_DC_LANGUAGE);
return lang;
}
public <T extends Element>T setLanguage(String language) {
throw new UnsupportedOperationException("Modifications are not allowed");
}
private Element locate(String path) throws XPathException {
Abdera abdera = this.getFactory().getAbdera();
XPath xpath = abdera.getXPath();
Map<String,String> ns = xpath.getDefaultNamespaces();
ns.put("rdf", RssConstants.RDF_NS);
ns.put("rss", RssConstants.RSS1_NS);
Element el = getDocument().getRoot();
if (el instanceof ElementWrapper) {
el = ((ElementWrapper)el).getInternal();
}
return (Element) xpath.selectSingleNode(path,el,ns);
}
}