package org.jivesoftware.sparkplugin.phonebook;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import net.java.sipmack.common.Log;
import org.jivesoftware.Spark;
import org.jivesoftware.spark.plugin.phone.resource.PhoneRes;
import org.xmlpull.mxp1.MXParser;
import org.xmlpull.v1.XmlPullParser;
public class PhonebookManager implements BookManager
{
private static final PhonebookManager instance = new PhonebookManager();
private List<PhoneNumber> phonenumbers = new ArrayList<PhoneNumber>();
public PhonebookManager() {
}
public static PhonebookManager getInstance() {
return instance;
}
/**
* makes a new Phonenumber-Object and write it into the file
*/
public boolean add(String name, String number) {
if(getPhonebookEntry(name, number) != null)
return false;
PhoneNumber entry = new PhoneNumber();
entry.setName(name);
entry.setNumber(number);
phonenumbers.add(entry);
commit();
return true;
}
/**
* checks whether the entry already exists or not.
* if it exists it returns the entry.
*
* @param entry: Phonenumber
* @return
*/
public PhoneNumber getPhonebookEntry(String name, String number) {
PhoneNumber entry = new PhoneNumber();
entry.setName(name);
entry.setNumber(number);
for(PhoneNumber numbers : phonenumbers) {
if(entry.getName().equals(numbers.getName())
&& entry.getNumber().equals(numbers.getNumber())) {
return numbers;
}
}
return null;
}
public void deleteEntry(String name, String number) {
PhoneNumber existing = getPhonebookEntry(name, number);
if(existing != null) {
phonenumbers.remove(existing);
commit();
}
}
public List<PhoneNumber> getPhoneNumbers() {
// if there are no entries, read the phonebook
if(phonenumbers == null
|| phonenumbers.size() == 0)
loadPhonebook();
return phonenumbers;
}
private File getPhonebookFile() {
File file = new File(Spark.getSparkUserHome());
if (!file.exists()) {
file.mkdirs();
}
return new File(file, "spark-phonebook.xml");
}
/**
* Reads in the transcript file using the Xml Pull Parser.
*/
private void loadPhonebook() {
File bookFile = getPhonebookFile();
if (!bookFile.exists()) {
return;
}
// Otherwise load
try {
final MXParser parser = new MXParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(bookFile), "UTF-8"));
parser.setInput(in);
boolean done = false;
while (!done) {
int eventType = parser.next();
if (eventType == XmlPullParser.START_TAG && "entry".equals(parser.getName())) {
phonenumbers.add(getBookEntry(parser));
}
else if (eventType == XmlPullParser.END_TAG && "book".equals(parser.getName())) {
done = true;
}
}
}
catch (Exception e) {
Log.error(e);
}
}
/**
* xml-structure:
*
* <book><entry><name>ABC</name><number>123</number></entry><entry>...</entry></book>
*
* @param parser
* @return
* @throws Exception
*/
private static PhoneNumber getBookEntry(XmlPullParser parser) throws Exception {
PhoneNumber entry = new PhoneNumber();
// Check for Names
boolean done = false;
while (!done) {
int eventType = parser.next();
if (eventType == XmlPullParser.START_TAG && "name".equals(parser.getName())) {
entry.setName(parser.nextText());
}
else if (eventType == XmlPullParser.START_TAG && "number".equals(parser.getName())) {
entry.setNumber(parser.nextText());
}
else if (eventType == XmlPullParser.END_TAG && "entry".equals(parser.getName())) {
done = true;
}
}
return entry;
}
public void commit() {
final StringBuilder builder = new StringBuilder();
builder.append("<book>");
for (PhoneNumber m : phonenumbers) {
builder.append("<entry>");
builder.append("<name>").append(m.getName()).append("</name>");
builder.append("<number>").append(m.getNumber()).append("</number>");
builder.append("</entry>");
}
builder.append("</book>");
// Write out new File
try {
getPhonebookFile().getParentFile().mkdirs();
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(getPhonebookFile()), "UTF-8"));
out.write(builder.toString());
out.close();
}
catch (IOException e) {
org.jivesoftware.spark.util.log.Log.error(e);
}
}
public boolean update(PhoneNumber original, String name, String number) {
// if the entry was added succesfully
if(add(name, number)) {
// delete the old one
deleteEntry(original.getName(), original.getNumber());
return true;
}
else {
JOptionPane.showMessageDialog(null, PhoneRes.getIString("book.exists"),
PhoneRes.getIString("book.warning"), JOptionPane.WARNING_MESSAGE);
return false;
}
}
}