1 package net.sf.flock.support;
2
3 import java.net.URL;
4 import java.util.ArrayList;
5 import java.util.Arrays;
6 import java.util.Iterator;
7 import java.util.List;
8
9 import net.sf.flock.FeedFactoryI;
10 import net.sf.flock.FeedI;
11 import net.sf.flock.FeedInfoI;
12 import net.sf.flock.FlockResourceException;
13 import net.sf.flock.MetaData;
14 import net.sf.flock.SubscriptionI;
15 import net.sf.flock.SubscriptionInfoI;
16 import net.sf.flock.SubscriptionManagerI;
17 import net.sf.flock.parser.FeedLoader;
18 import net.sf.flock.parser.UnsupportedFeedFormatException;
19 import net.sf.flock.util.DocumentLoader;
20
21 import org.apache.log4j.LogManager;
22 import org.apache.log4j.Logger;
23 import org.jdom.Document;
24
25 public abstract class AbstractSubscriptionManager implements SubscriptionManagerI {
26
27 private final static Logger LOGGER = LogManager.getLogger(AbstractSubscriptionManager.class);
28
29 public SubscriptionI[] subscribe(final URL location, final MetaData metaData) throws FlockResourceException {
30 return this.subscribe(new SubscriptionInfoI() {
31
32 public URL getLocation() {
33 return location;
34 }
35 public MetaData getMetaData() {
36 return metaData;
37 }
38
39 public FeedInfoI getFeedInfo() {
40 return new FeedInfoI() {
41 public String getTitle() {
42 return "New feed";
43 }
44 public URL getSite() {
45 return null;
46 }
47 public SubscriptionInfoI getSubscriptionInfo() {
48 return null;
49 }
50
51 };
52 }
53
54 }, true);
55 }
56
57 protected abstract SubscriptionI createSubscription(SubscriptionInfoI subscriptionInfo) throws FlockResourceException;
58
59 /***
60 * @return List of new ItemI objects
61 */
62 protected List refresh(SubscriptionI subscription) throws FlockResourceException {
63 Document doc = new DocumentLoader().loadDocument(subscription.getLocation());
64 return refresh(subscription, doc);
65 }
66
67 /***
68 * @return List of new ItemI objects
69 */
70 protected List refresh(SubscriptionI subscription, Document doc) throws FlockResourceException {
71 FeedLoader factory = new FeedLoader(this.getFeedFactory());
72 FeedI feed = factory.parseFeed(subscription, doc);
73 return subscription.getFeed().merge( feed );
74 }
75
76 protected abstract FeedFactoryI getFeedFactory();
77
78 public SubscriptionI[] subscribe(SubscriptionInfoI si, boolean loadFeed) throws FlockResourceException {
79
80 Document doc = null;
81 try {
82
83 SubscriptionI subscription = this.createSubscription(si);
84
85
86
87 if (loadFeed) {
88 doc = new DocumentLoader().loadDocument(si.getLocation());
89 this.refresh(subscription,doc);
90 }
91
92 return new SubscriptionI[] { subscription };
93
94 } catch (UnsupportedFeedFormatException e) {
95
96 LOGGER.info("Unknown feed format, trying OPML...");
97 OpmlSubscriptionImport importer = new OpmlSubscriptionImport( si.getMetaData() );
98
99 // doc must be not null, unless there is no UnsupportedFeedFormatException,
100 // nice, isn't it ? :-)
101
102 if (!importer.isSuitable(doc)) {
103 throw new FlockResourceException("Unsupported feed format");
104 }
105
106 LOGGER.info("Parsing as OPML");
107 SubscriptionInfoI[] subInfos = importer.load(doc);
108
109 List subs = new ArrayList(subInfos.length);
110 for (int i=0; i<subInfos.length; i++) {
111 try {
112 subs.addAll( Arrays.asList(
113 this.subscribe(subInfos[i], false)
114 ) );
115 } catch (FlockResourceException ex) {
116 LOGGER.warn("Unable to subscribe to "+subInfos[i].getLocation(), ex);
117 }
118 }
119
120 return (SubscriptionI[])subs.toArray( new SubscriptionI[subs.size()] );
121 }
122
123 }
124
125
126 boolean alreadyRunningRefreshThread = false;
127
128 /***
129 * TODO: implement proper balking
130 */
131 public boolean refreshAll() {
132 synchronized(this) {
133 if (alreadyRunningRefreshThread)
134 return false;
135 alreadyRunningRefreshThread = true;
136 }
137 Thread t = new Thread("FlockAsyncRefresh") {
138 public void run() {
139 try {
140 doRefreshAll();
141 } catch (FlockResourceException e) {
142 LOGGER.warn("Problem in refreshAll", e);
143 } finally {
144 alreadyRunningRefreshThread = false;
145 }
146 }
147 };
148 t.start();
149 return true;
150 }
151
152 protected void doRefreshAll() throws FlockResourceException {
153 for (Iterator i=this.getSubscriptionInfos().iterator(); i.hasNext(); ) {
154 SubscriptionInfoI si = (SubscriptionInfoI) i.next();
155 SubscriptionI subscription = this.getSubscription( si.getLocation() );
156 try {
157 refresh( subscription );
158 } catch (FlockResourceException e) {
159 LOGGER.warn("Failed to refresh feed["+subscription.getLocation()+"], skipping", e);
160 }
161 }
162 }
163
164
165 }
This page was automatically generated by Maven