package fi.otavanopisto.muikku.plugins.feed;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.ejb.EJBContext;
import javax.ejb.Schedule;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.inject.Inject;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Entities.EscapeMode;
import org.jsoup.safety.Cleaner;
import org.jsoup.safety.Whitelist;
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;
import fi.otavanopisto.muikku.plugins.feed.model.Feed;
@Stateless
public class FeedSynchronizer {
@Inject
private FeedDAO feedDao;
@Inject
private FeedItemDAO feedItemDao;
@Inject
private Logger logger;
@Resource
EJBContext ejbContext;
private String clean(String html) {
Document doc = Jsoup.parse(html);
doc = new Cleaner(Whitelist.basic()).clean(doc);
doc.select("a[target]").attr("rel", "noopener noreferer");
doc.outputSettings().escapeMode(EscapeMode.xhtml);
return doc.body().html();
}
@Schedule(second = "0", minute = "0", hour = "*")
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void updateFeeds() {
Client client = ClientBuilder.newClient();
feedItemDao.deleteAll();
List<Feed> feeds = feedDao.listAll();
for (Feed feed : feeds) {
WebTarget target = client.target(feed.getUrl());
try (InputStream stream = target.request("*").get(InputStream.class)) {
SyndFeedInput input = new SyndFeedInput();
SyndFeed syndFeed = input.build(new XmlReader(stream));
List<SyndEntry> entries = syndFeed.getEntries();
for (SyndEntry entry : entries) {
feedItemDao.create(
entry.getTitle(),
entry.getLink(),
entry.getAuthor(),
entry.getDescription() == null
? null
: clean(entry.getDescription().getValue()),
entry.getPublishedDate(),
(String)null,
feed);
}
} catch (IOException | IllegalArgumentException | FeedException e) {
logger.warning(String.format("Error while synchronizing feeds: %s", e.getMessage()));
ejbContext.setRollbackOnly();
}
}
}
}