mirror of
https://github.com/Athou/commafeed.git
synced 2026-03-21 21:37:29 +00:00
import OPML
This commit is contained in:
@@ -48,7 +48,7 @@ public class FeedFetcher {
|
||||
String content = EntityUtils.toString(entity, "UTF-8");
|
||||
feed = parser.parse(feedUrl, content);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException(e);
|
||||
} finally {
|
||||
httpclient.getConnectionManager().shutdown();
|
||||
}
|
||||
|
||||
@@ -47,8 +47,9 @@ public class FeedParser {
|
||||
feed.getEntries().add(entry);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new FeedException("Could not parse feed : " + e.getMessage(),
|
||||
e);
|
||||
throw new FeedException(String.format(
|
||||
"Could not parse feed from %s : %s", feedUrl,
|
||||
e.getMessage()), e);
|
||||
}
|
||||
return feed;
|
||||
}
|
||||
|
||||
@@ -1,20 +1,26 @@
|
||||
package com.commafeed.backend.feeds;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Calendar;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
import javax.ejb.Schedule;
|
||||
import javax.ejb.Singleton;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.commafeed.backend.dao.FeedEntryService;
|
||||
import com.commafeed.backend.dao.FeedService;
|
||||
import com.commafeed.backend.model.Feed;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
@Singleton
|
||||
public class FeedTimer {
|
||||
|
||||
private static Logger log = LoggerFactory.getLogger(FeedTimer.class);
|
||||
|
||||
@Inject
|
||||
FeedService feedService;
|
||||
|
||||
@@ -26,21 +32,32 @@ public class FeedTimer {
|
||||
|
||||
@Schedule(hour = "*", minute = "*", persistent = false)
|
||||
private void timeout() {
|
||||
List<Feed> feeds = feedService.findAll();
|
||||
|
||||
List<Future<Feed>> futures = Lists.newArrayList();
|
||||
for (Feed feed : feeds) {
|
||||
Future<Feed> future = fetcher.fetch(feed.getUrl());
|
||||
futures.add(future);
|
||||
Map<String, Feed> feeds = Maps.newHashMap();
|
||||
for (Feed feed : feedService.findAll()) {
|
||||
feeds.put(feed.getUrl(), feed);
|
||||
}
|
||||
|
||||
for (Future<Feed> future : futures) {
|
||||
Map<String, Future<Feed>> futures = Maps.newHashMap();
|
||||
for (Feed feed : feeds.values()) {
|
||||
Future<Feed> future = fetcher.fetch(feed.getUrl());
|
||||
futures.put(feed.getUrl(), future);
|
||||
}
|
||||
|
||||
for (String key : futures.keySet()) {
|
||||
Future<Feed> future = futures.get(key);
|
||||
try {
|
||||
Feed feed = future.get();
|
||||
feedEntryService
|
||||
.updateEntries(feed.getUrl(), feed.getEntries());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
log.info(
|
||||
"Unable to refresh feed " + key + " : "
|
||||
+ e.getMessage(), e);
|
||||
|
||||
Feed feed = feeds.get(key);
|
||||
feed.setLastUpdated(Calendar.getInstance().getTime());
|
||||
feed.setMessage("Unable to refresh feed: " + e.getMessage());
|
||||
feedService.update(feed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
85
src/main/java/com/commafeed/backend/feeds/OPMLImporter.java
Normal file
85
src/main/java/com/commafeed/backend/feeds/OPMLImporter.java
Normal file
@@ -0,0 +1,85 @@
|
||||
package com.commafeed.backend.feeds;
|
||||
|
||||
import java.io.StringReader;
|
||||
import java.util.List;
|
||||
|
||||
import javax.ejb.Singleton;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
import com.commafeed.backend.dao.FeedCategoryService;
|
||||
import com.commafeed.backend.dao.FeedService;
|
||||
import com.commafeed.backend.dao.FeedSubscriptionService;
|
||||
import com.commafeed.backend.model.Feed;
|
||||
import com.commafeed.backend.model.FeedCategory;
|
||||
import com.commafeed.backend.model.FeedSubscription;
|
||||
import com.commafeed.backend.model.User;
|
||||
import com.sun.syndication.feed.opml.Opml;
|
||||
import com.sun.syndication.feed.opml.Outline;
|
||||
import com.sun.syndication.io.FeedException;
|
||||
import com.sun.syndication.io.WireFeedInput;
|
||||
|
||||
@Singleton
|
||||
public class OPMLImporter {
|
||||
|
||||
@Inject
|
||||
FeedService feedService;
|
||||
|
||||
@Inject
|
||||
FeedSubscriptionService feedSubscriptionService;
|
||||
|
||||
@Inject
|
||||
FeedCategoryService feedCategoryService;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void importOpml(User user, String xml) throws FeedException {
|
||||
|
||||
WireFeedInput input = new WireFeedInput();
|
||||
Opml feed = (Opml) input.build(new StringReader(xml));
|
||||
List<Outline> outlines = (List<Outline>) feed.getOutlines();
|
||||
for (Outline outline : outlines) {
|
||||
handleOutline(user, outline, null);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void handleOutline(User user, Outline outline, FeedCategory parent) {
|
||||
|
||||
if (StringUtils.isEmpty(outline.getType())) {
|
||||
FeedCategory category = feedCategoryService.findByName(user,
|
||||
outline.getText(), parent);
|
||||
if (category == null) {
|
||||
category = new FeedCategory();
|
||||
category.setName(outline.getText());
|
||||
category.setParent(parent);
|
||||
category.setUser(user);
|
||||
feedCategoryService.save(category);
|
||||
}
|
||||
|
||||
List<Outline> children = outline.getChildren();
|
||||
for (Outline child : children) {
|
||||
handleOutline(user, child, category);
|
||||
}
|
||||
} else {
|
||||
Feed feed = feedService.findByUrl(outline.getXmlUrl());
|
||||
if (feed == null) {
|
||||
feed = new Feed();
|
||||
feed.setUrl(outline.getXmlUrl());
|
||||
feedService.save(feed);
|
||||
}
|
||||
|
||||
FeedSubscription sub = feedSubscriptionService.findByFeed(user,
|
||||
feed);
|
||||
if (sub == null) {
|
||||
sub = new FeedSubscription();
|
||||
sub.setFeed(feed);
|
||||
sub.setUser(user);
|
||||
feedSubscriptionService.save(sub);
|
||||
}
|
||||
sub.setCategory(parent);
|
||||
sub.setTitle(outline.getText());
|
||||
feedSubscriptionService.update(sub);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user