RSS news reader; initially copied from "all the news"
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.news / src / net / sourceforge / phpeclipse / news / pref / ChannelStore.java
diff --git a/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/pref/ChannelStore.java b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/pref/ChannelStore.java
new file mode 100644 (file)
index 0000000..f48c494
--- /dev/null
@@ -0,0 +1,173 @@
+/*
+ * Created on 9 juin 2004
+ * Copyright 2004 Jérôme Nègre
+ */
+package net.sourceforge.phpeclipse.news.pref;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Properties;
+
+import net.sourceforge.phpeclipse.news.Channel;
+import net.sourceforge.phpeclipse.news.Item;
+import net.sourceforge.phpeclipse.news.Plugin;
+
+import org.eclipse.jface.dialogs.IDialogSettings;
+
+/**
+ * @author Jérôme Nègre
+ */
+public class ChannelStore {
+       
+       private final static String DEFAULT_CHANNELS_FILE = "default_feeds.properties";
+       
+       private final static String BACKENDS_SECTION = "backends";
+       
+       private final static String CHANNELS_ORDER_KEY = "order";
+       private final static String TITLE_KEY = "title";
+       private final static String URL_KEY = "url";
+       private final static String TYPE_KEY = "type";
+       private final static String READ_KEY = "read";
+       
+       private final static int TYPE_CHANNEL = 1;
+       
+       private static Plugin plugin = null;
+       
+       public static void init(Plugin plugin) {
+               ChannelStore.plugin = plugin;
+       }
+       
+       public static synchronized ArrayList getChannels() {
+               IDialogSettings section = getChannelsSection();
+               String[] uids =  section.getArray(CHANNELS_ORDER_KEY);
+               ArrayList result = new ArrayList();
+               for(int i=0; i<uids.length; i++) {
+                       String uid = uids[i];
+                       IDialogSettings channelSection = section.getSection(uid);
+                       String title = channelSection.get(TITLE_KEY);
+                       String url = channelSection.get(URL_KEY);
+                       
+                       String[] readUids = channelSection.getArray(READ_KEY);
+                       HashSet set = new HashSet();
+                       if(readUids != null) {
+                               for(int k=0; k<readUids.length; k++) {
+                                       set.add(readUids[k]);
+                               }
+                       }
+                       
+                       result.add(new Channel(title, url, set));
+               }
+               return result;
+       }
+
+       public static synchronized void setChannels(ArrayList channels) {
+               IDialogSettings section = getChannelsSection();
+               section.put(CHANNELS_ORDER_KEY,new String[0]);
+               int newSize = channels.size();
+               for(int i=0; i<newSize; i++) {
+                       Channel channel = (Channel)channels.get(i); 
+                       addChannel(section,channel);
+               }
+       }
+       
+       public static synchronized void saveReadStatus(ArrayList channels) {
+               IDialogSettings channelsSection = getChannelsSection();
+               Iterator channelIter = channels.iterator();
+               while(channelIter.hasNext()) {
+                       Channel channel = (Channel)channelIter.next();
+                       IDialogSettings section = channelsSection.getSection(channel.getUID());
+                       Iterator itemIter = channel.getItems().iterator();
+                       ArrayList readItems = new ArrayList();
+                       while(itemIter.hasNext()) {
+                               Item item = (Item)itemIter.next();
+                               if(item.isReadFlag()) {
+                                       readItems.add(item.getUID());
+                               }
+                       }
+                       section.put(READ_KEY,(String[])readItems.toArray(new String[0]));
+               }
+       }
+       
+       public static synchronized ArrayList getDefaultChannels() {
+               ArrayList result = new ArrayList();
+               try {
+                       Properties prop = new Properties();
+                       URL propLocation = new URL(Plugin.getDefault().getDescriptor().getInstallURL(), DEFAULT_CHANNELS_FILE);
+                       prop.load(propLocation.openStream());
+                       Enumeration e = prop.propertyNames();
+                       while(e.hasMoreElements()) {
+                               String url = (String)e.nextElement();
+                               String title = prop.getProperty(url);
+                               result.add(new Channel(title, url));
+                       }
+               } catch(Exception e) {
+                       Plugin.logError("Error while getting default feed list", e);
+               }
+               return result;
+               
+       }
+       
+       /**
+        * Returns a non null Channels Section,
+        * creating it if needed.
+        * @return
+        */
+       private static IDialogSettings getChannelsSection() {
+        IDialogSettings section = plugin.getDialogSettings().getSection(BACKENDS_SECTION);
+        if(section == null) {
+               section = createDefaultChannelsSection();
+        }
+        return section;
+       }
+       
+       private static IDialogSettings createDefaultChannelsSection() {
+               IDialogSettings section = plugin.getDialogSettings().addNewSection(BACKENDS_SECTION);
+               section.put(CHANNELS_ORDER_KEY,new String[0]);
+               //add some default channels from config file
+               Iterator iterator = getDefaultChannels().iterator();
+               while(iterator.hasNext()) {
+                       addChannel(section, (Channel)iterator.next());
+               }
+               return section;
+       }
+       
+       private static void addChannel(IDialogSettings backendSection, Channel channel) {
+               String title = channel.getTitle();
+               String url = channel.getUrl();
+               String uid = channel.getUID();
+               //check that section does not already exist before
+               //creating it, and if it exists, add it to the order key
+               //only if it's not already in it.
+               IDialogSettings section = backendSection.getSection(uid);
+               boolean addInOrder = true;
+               if(section == null) {
+                       //create section
+                       section = backendSection.addNewSection(uid);
+               } else {
+                       //check if the section is already in the order key
+                       String[] orders = backendSection.getArray(CHANNELS_ORDER_KEY);
+                       for(int i=0; i<orders.length; i++) {
+                               if(orders[i].equals(uid)) {
+                                       addInOrder = false;
+                                       break;
+                               }
+                       }
+               }
+               //set data
+               section.put(TITLE_KEY, title);
+               section.put(URL_KEY, url);
+               section.put(TYPE_KEY, TYPE_CHANNEL);
+               //set order key if needed
+               if(addInOrder) {
+                       String[] oldOrder = backendSection.getArray(CHANNELS_ORDER_KEY);
+                       String[] newOrder = new String[oldOrder.length+1];
+                       System.arraycopy(oldOrder, 0, newOrder, 0, oldOrder.length);
+                       newOrder[oldOrder.length] = uid;
+                       backendSection.put(CHANNELS_ORDER_KEY,newOrder);
+               }
+       }
+       
+}