View Javadoc
1 package net.sf.flock.impl; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.ObjectInputStream; 8 import java.io.ObjectOutputStream; 9 import java.io.OutputStreamWriter; 10 import java.io.Writer; 11 import java.net.URL; 12 import java.util.List; 13 14 import net.sf.flock.FlockResourceException; 15 import net.sf.flock.SubscriptionI; 16 import net.sf.flock.SubscriptionInfoI; 17 import net.sf.flock.support.OpmlSubscriptionExport; 18 import net.sf.flock.support.OpmlSubscriptionImport; 19 import org.apache.log4j.LogManager; 20 import org.apache.log4j.Logger; 21 import org.jdom.Document; 22 import org.jdom.JDOMException; 23 import org.jdom.input.SAXBuilder; 24 import org.jdom.output.XMLOutputter; 25 26 /*** 27 * 28 * @version $Revision: 1.7 $ 29 * @author $Author: zombi $ 30 */ 31 public class PersistentSubscriptionManager extends SimpleSubscriptionManager { 32 33 private final static Logger LOGGER = LogManager.getLogger(PersistentSubscriptionManager.class); 34 35 private final File storeDirectory; 36 37 public PersistentSubscriptionManager(File storeDirectory) throws FlockResourceException { 38 this.storeDirectory = storeDirectory; 39 this.initStore(); 40 } 41 42 /*** 43 * @see net.sf.flock.impl.SimpleSubscriptionManager#refresh(net.sf.flock.SubscriptionI) 44 */ 45 protected List refresh(SubscriptionI subscription) throws FlockResourceException { 46 List l = super.refresh(subscription); 47 if (l.size()>0) { 48 this.storeSubscription(subscription); 49 } 50 return l; 51 } 52 53 public SubscriptionI[] subscribe(SubscriptionInfoI si, boolean loadFeed) throws FlockResourceException { 54 SubscriptionI[] subscriptions = super.subscribe(si, loadFeed); 55 this.saveSubscriptions(); 56 return subscriptions; 57 } 58 59 /*** 60 * @see net.sf.flock.SubscriptionManagerI#unsubscribe(java.net.URL) 61 */ 62 public void unsubscribe(URL url) throws FlockResourceException { 63 super.unsubscribe(url); 64 65 this.saveSubscriptions(); 66 67 File feedFile = this.getFeedFile(url); 68 feedFile.delete(); 69 } 70 71 72 protected void initStore() throws FlockResourceException { 73 74 if (!this.storeDirectory.exists()) { 75 LOGGER.info("First run - creating directory " + this.storeDirectory); 76 if (!this.storeDirectory.mkdir()) { 77 throw new FlockResourceException("Unable to create directory "+storeDirectory); 78 } 79 } 80 81 File storeFile = new File(storeDirectory, "flock.opml"); 82 if (!storeFile.exists()) { 83 LOGGER.info("No flock.opml - create"); 84 this.saveSubscriptions(); 85 return; 86 } 87 88 Document doc; 89 try { 90 doc = new SAXBuilder().build(storeFile); 91 } catch (JDOMException e) { 92 throw new FlockResourceException("Unable to load store file "+storeFile, e); 93 } 94 95 SubscriptionInfoI[] subs = new OpmlSubscriptionImport().load(doc); 96 for (int i=0; i<subs.length; i++) { 97 try { 98 this.addSubscription( 99 this.loadSubscription(subs[i].getLocation()) 100 ); 101 } catch (FlockResourceException e) { 102 LOGGER.warn("Failed to load subscription contents: " + e); 103 super.subscribe( subs[i], false ); 104 } 105 } 106 107 } 108 109 /*** Save subscription list as OPML */ 110 protected void saveSubscriptions() throws FlockResourceException { 111 Document doc = new OpmlSubscriptionExport().export( this.getSubscriptions() ); 112 XMLOutputter outputter = new XMLOutputter(" ", true); 113 File storeFile = new File(storeDirectory, "flock.opml"); 114 try { 115 Writer writer = new OutputStreamWriter( new FileOutputStream(storeFile), "UTF8"); 116 outputter.output(doc, writer); 117 writer.close(); 118 } catch (IOException e) { 119 throw new FlockResourceException("Unable to save store file "+storeFile, e); 120 } 121 } 122 123 124 125 protected SubscriptionI loadSubscription(URL location) throws FlockResourceException { 126 127 File feedFile = this.getFeedFile(location); 128 if (!feedFile.exists()) { 129 throw new FlockResourceException("No subscription stored for "+location); 130 } 131 try { 132 ObjectInputStream ois = new ObjectInputStream( new FileInputStream(feedFile) ); 133 SubscriptionI sub = (SubscriptionI)ois.readObject(); 134 ois.close(); 135 136 return sub; 137 138 } catch (ClassNotFoundException e) { 139 throw new FlockResourceException(e); 140 } catch (IOException e) { 141 throw new FlockResourceException(e); 142 } 143 144 } 145 146 protected void storeSubscription(SubscriptionI subscription) throws FlockResourceException { 147 File feedFile = this.getFeedFile(subscription.getLocation()); 148 ObjectOutputStream oos; 149 try { 150 oos = new ObjectOutputStream(new FileOutputStream(feedFile)); 151 oos.writeObject(subscription); 152 oos.close(); 153 } catch (IOException e) { 154 throw new FlockResourceException(e); 155 } 156 } 157 158 private File getFeedFile(URL url) { 159 return new File(this.storeDirectory, "feed"+url.hashCode() + ".ser" ); 160 } 161 162 }

This page was automatically generated by Maven