/**
* Copyright 2013, WebGate Consulting AG
*
* 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 org.openntf.xpt.rss.model;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.openntf.xpt.core.utils.logging.LoggerFactory;
import org.openntf.xpt.rss.XPTRSSActivator;
import com.ibm.commons.util.StringUtil;
import com.sun.syndication.feed.synd.SyndCategoryImpl;
import com.sun.syndication.feed.synd.SyndContentImpl;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndPerson;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;
public class FeedReaderService {
private static FeedReaderService m_Service;
private FeedReaderService() {
}
public static FeedReaderService getInstance() {
if (m_Service == null) {
m_Service = new FeedReaderService();
}
return m_Service;
}
public List<RSSEntry> getAllEntriesFromURL(String strURL) {
List<RSSEntry> lstRC = new ArrayList<RSSEntry>();
if (!StringUtil.isEmpty(strURL)) {
Thread currentThread = Thread.currentThread();
ClassLoader clCurrent = currentThread.getContextClassLoader();
try {
currentThread.setContextClassLoader(XPTRSSActivator.class.getClassLoader());
URL feedUrl = new URL(strURL);
SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = input.build(new XmlReader(feedUrl));
lstRC = processFeed2List(feed);
} catch (Exception e) {
LoggerFactory.logError(getClass(), "getAllEntriesFromURL", e);
} finally {
currentThread.setContextClassLoader(clCurrent);
}
}
return lstRC;
}
public RSSFeed getFeedFromURL(String strURL) {
RSSFeed rssFeed = new RSSFeed();
rssFeed.setURL(strURL);
Thread currentThread = Thread.currentThread();
ClassLoader clCurrent = currentThread.getContextClassLoader();
try {
currentThread.setContextClassLoader(XPTRSSActivator.class.getClassLoader());
URL feedUrl = new URL(strURL);
SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = input.build(new XmlReader(feedUrl));
rssFeed.setAuthor(feed.getAuthor());
rssFeed.setDescription(feed.getDescription());
rssFeed.setTitle(feed.getTitle());
if (feed.getImage() != null) {
rssFeed.setImageURL(feed.getImage().getUrl());
}
rssFeed.setEntries(processFeed2List(feed));
} catch (Exception e) {
LoggerFactory.logError(getClass(), "getFeedFromURL", e);
} finally {
currentThread.setContextClassLoader(clCurrent);
}
return rssFeed;
}
private List<RSSEntry> processFeed2List(SyndFeed feed) {
List<RSSEntry> lstRC = new ArrayList<RSSEntry>();
for (Object synEntryObject : feed.getEntries()) {
SyndEntry sEntry = (SyndEntry) synEntryObject;
RSSEntry rssEntry = new RSSEntry();
rssEntry.setTitle(sEntry.getTitle());
rssEntry.setLink(sEntry.getLink());
if (sEntry.getDescription() != null) {
rssEntry.setDescription(sEntry.getDescription().getValue());
} else {
rssEntry.setDescription("");
}
rssEntry.setAuthors(buildStringList(sEntry.getAuthors()));
rssEntry.setCategories(buildStringList(sEntry.getCategories()));
rssEntry.setContents(buildStringList(sEntry.getContents()));
rssEntry.setLinks(buildStringList(sEntry.getLinks()));
rssEntry.setCreated(sEntry.getPublishedDate());
rssEntry.setUpdated(sEntry.getUpdatedDate());
lstRC.add(rssEntry);
}
return lstRC;
}
private List<String> buildStringList(List<?> lstConvert) {
List<String> lstRC = new ArrayList<String>();
if (lstConvert.isEmpty()) {
return lstRC;
}
for (Object objX : lstConvert) {
if (objX instanceof SyndPerson) {
lstRC.add(((SyndPerson) objX).getName());
} else if (objX instanceof SyndContentImpl) {
lstRC.add(((SyndContentImpl) objX).getValue());
} else if (objX instanceof SyndCategoryImpl) {
lstRC.add(((SyndCategoryImpl) objX).getName());
} else {
lstRC.add(objX.toString());
}
}
return lstRC;
}
}