package hu.ppke.itk.itkStock.client.rss;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
public class RSSConfigManager {
//Singleton pattern
//Use this to access feeds!!
private static RSSConfigManager singleton = null;
public static RSSConfigManager defaultManager(){
if (singleton == null) {
singleton = new RSSConfigManager();
}
return singleton;
}
// *************** Possible methods: ***************
// public List<String> getFeeds(); unmodifiable list!!
// !! ALL ADD OR REMOVE METHOD WILL SAVE THE STATE IMMEDIATLY !!
// public void addFeed(String feed);
// public void addFeeds(List<String> feedsToAdd);
// public void removeFeed(String feed);
// public void removeFeeds(List<String> feedsToRemove);
// Instanse stuff
private List<String> feeds;
private Document configFile;
// Default constructor, this will load all feeds from the cofnig file
private RSSConfigManager(){
feeds = new ArrayList<String>();
String fileName = "ClientConfig.xml";
SAXBuilder builder = new SAXBuilder(/*XMLReaders.XSDVALIDATING*/);
try {
configFile = builder.build(fileName);
readRSSFeeds();
} catch (JDOMException | IOException e) {
// TODO Auto-generated catch block
System.err.println("Config file error!");
}
}
// !! ALL ADD AND REMOVE METHOD WILL SAVE THE STATE IMMEDIATLY !!
//Add a single feed
public void addFeed(String feed){
if (feeds.contains(feed)) {
return;
}
feeds.add(feed);
saveFeeds();
}
//Add feed(s) from arraylist
public void addFeeds(List<String> feedsToAdd){
for (String feed : feedsToAdd) {
if (feeds.contains(feed)) {
continue;
}
feeds.add(feed);
}
saveFeeds();
}
//Remove a single feed
public void removeFeed(String feed){
if (!feeds.contains(feed)) {
return;
}
feeds.remove(feed);
saveFeeds();
}
//Remove feed(s) from arraylist
public void removeFeeds(List<String> feedsToRemove){
for (String feed : feedsToRemove) {
if (!feeds.contains(feed)) {
continue;
}
feeds.remove(feed);
}
saveFeeds();
}
//Read feeds from the config file
private void readRSSFeeds(){
System.out.println("Loading feed(s)...");
Element root = configFile.getRootElement();
Element rssNode = root.getChild("rss");
if (rssNode != null) {
List<Element> feedList = rssNode.getChildren();
for (Element element : feedList) {
feeds.add(element.getText());
}
}
System.out.println(feeds.size() + " feed(s) loaded.");
}
//Save the actual state to the config file
private void saveFeeds(){
System.out.println("Saving feed(s)...");
Element root = configFile.getRootElement();
Element newRoot = root.clone();
newRoot.removeChild("rss");
Element feedList = new Element("rss");
for (String string : feeds) {
feedList.addContent(new Element("feed").setText(string));
}
newRoot.addContent(feedList);
Document doc = new Document();
doc.addContent(newRoot);
XMLOutputter out = new XMLOutputter(Format.getPrettyFormat());
try {
File f = new File("ClientConfig.xml");
PrintWriter pw = new PrintWriter(f);
out.output(doc, pw);
} catch (IOException e1) {
e1.printStackTrace();
}
System.out.println("Feed(s) saved.");
}
//Getters
public List<String> getFeeds() {
return Collections.unmodifiableList(feeds);
}
}