package com.swingsane.preferences;
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.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import com.swingsane.preferences.model.BooleanOption;
import com.swingsane.preferences.model.ButtonOption;
import com.swingsane.preferences.model.Constraints;
import com.swingsane.preferences.model.FixedOption;
import com.swingsane.preferences.model.GroupOption;
import com.swingsane.preferences.model.IntegerOption;
import com.swingsane.preferences.model.Login;
import com.swingsane.preferences.model.Option;
import com.swingsane.preferences.model.OptionsOrderValuePair;
import com.swingsane.preferences.model.Scanner;
import com.swingsane.preferences.model.StringOption;
import com.thoughtworks.xstream.XStream;
/**
* @author Roland Quast (roland@formreturn.com)
*
*/
public final class PreferencesUtils {
private static Constraints copy(Constraints c1) {
if (c1 == null) {
return null;
}
Constraints c2 = new Constraints();
c2.setFixedList(copyDoubleList(c1.getFixedList()));
c2.setIntegerList(copyIntegerList(c1.getIntegerList()));
c2.setMaximumFixed(copyDouble(c1.getMaximumFixed()));
c2.setMaximumInteger(copyInteger(c1.getMaximumInteger()));
c2.setMinimumFixed(copyDouble(c1.getMinimumFixed()));
c2.setMinimumInteger(copyInteger(c1.getMinimumInteger()));
c2.setQuantumFixed(copyDouble(c1.getQuantumFixed()));
c2.setQuantumInteger(copyInteger(c1.getQuantumInteger()));
c2.setStringList(copyStringList(c1.getStringList()));
return c2;
}
public static HashMap<String, Login> copy(HashMap<String, Login> sl1) {
HashMap<String, Login> sl2 = new HashMap<String, Login>();
for (String resource : sl1.keySet()) {
Login login = new Login();
login.setUsername(sl1.get(resource).getUsername());
login.setPassword(sl1.get(resource).getPassword());
sl2.put(resource, login);
}
return sl2;
}
public static Option copy(Option o1) {
Option o2 = null;
OptionsOrderValuePair vp1 = o1.getOptionsOrderValuePair();
OptionsOrderValuePair vp2 = new OptionsOrderValuePair();
vp2.setActive(vp1.isActive());
vp2.setSaneOptionType(vp1.getSaneOptionType());
vp2.setKey(vp1.getKey());
switch (vp1.getSaneOptionType()) {
case STRING:
StringOption so1 = (StringOption) o1;
StringOption so2 = new StringOption();
so2.setName(so1.getName());
so2.setDescription(so1.getDescription());
so2.setConstraints(copy(so1.getConstraints()));
so2.setConstraintType(so1.getConstraintType());
so2.setValue(so1.getValue());
so2.setOptionsOrderValuePair(vp2);
return so2;
case INTEGER:
IntegerOption io1 = (IntegerOption) o1;
IntegerOption io2 = new IntegerOption();
io2.setName(io1.getName());
io2.setDescription(io1.getDescription());
io2.setConstraints(copy(io1.getConstraints()));
io2.setConstraintType(io1.getConstraintType());
io2.setValue(io1.getValue());
// cast to ArrayList - SaneOptions calls newArrayList
io2.setValueList(copyIntegerList(io1.getValueList()));
io2.setOptionsOrderValuePair(vp2);
return io2;
case BOOLEAN:
BooleanOption bo1 = (BooleanOption) o1;
BooleanOption bo2 = new BooleanOption();
bo2.setName(bo1.getName());
bo2.setDescription(bo1.getDescription());
bo2.setConstraints(copy(bo1.getConstraints()));
bo2.setConstraintType(bo1.getConstraintType());
bo2.setValue(bo1.getValue());
bo2.setOptionsOrderValuePair(vp2);
return bo2;
case FIXED:
FixedOption fo1 = (FixedOption) o1;
FixedOption fo2 = new FixedOption();
fo2.setName(fo1.getName());
fo2.setDescription(fo1.getDescription());
fo2.setConstraints(copy(fo1.getConstraints()));
fo2.setConstraintType(fo1.getConstraintType());
fo2.setValue(fo1.getValue());
// cast to ArrayList - SaneOptions calls newArrayList
fo2.setValueList(copyDoubleList(fo1.getValueList()));
fo2.setOptionsOrderValuePair(vp2);
return fo2;
case BUTTON:
ButtonOption bto1 = (ButtonOption) o1;
ButtonOption bto2 = new ButtonOption();
copyBooleanOptions(bto1.getBooleanOptions(), bto2.getBooleanOptions());
copyIntegerOptions(bto1.getIntegerOptions(), bto2.getIntegerOptions());
copyStringOptions(bto1.getStringOptions(), bto2.getStringOptions());
copyFixedOptions(bto1.getFixedOptions(), bto2.getFixedOptions());
copyButtonOptions(bto1.getButtonOptions(), bto2.getButtonOptions());
copyGroupOptions(bto1.getGroupOptions(), bto2.getGroupOptions());
bto2.setName(bto1.getName());
bto2.setDescription(bto1.getDescription());
bto2.setOptionsOrderValuePair(vp2);
bto2.setOptionOrdering(null); // TODO!!!!
return bto2;
case GROUP:
GroupOption go1 = (GroupOption) o1;
GroupOption go2 = new GroupOption();
copyBooleanOptions(go1.getBooleanOptions(), go2.getBooleanOptions());
copyIntegerOptions(go1.getIntegerOptions(), go2.getIntegerOptions());
copyStringOptions(go1.getStringOptions(), go2.getStringOptions());
copyFixedOptions(go1.getFixedOptions(), go2.getFixedOptions());
copyGroupOptions(go1.getGroupOptions(), go2.getGroupOptions());
copyGroupOptions(go1.getGroupOptions(), go2.getGroupOptions());
go2.setName(go1.getName());
go2.setDescription(go1.getDescription());
go2.setOptionsOrderValuePair(vp2);
go2.setOptionOrdering(null); // TODO!!!!
return go2;
default:
break;
}
return o2;
}
public static Scanner copy(Scanner s1) {
Scanner s2 = new Scanner();
s2.setGuid(s1.getGuid());
s2.setDescription(s1.getDescription());
s2.setBatchPrefix(s1.getBatchPrefix());
s2.setModel(s1.getModel());
s2.setName(s1.getName());
s2.setPagesToScan(s1.getPagesToScan());
s2.setRemoteAddress(s1.getRemoteAddress());
s2.setRemotePortNumber(s1.getRemotePortNumber());
s2.setServiceName(s1.getServiceName());
s2.setType(s1.getType());
s2.setUsingCustomOptions(s1.isUsingCustomOptions());
s2.setVendor(s1.getVendor());
// deep copy the option maps
copyBooleanOptions(s1.getBooleanOptions(), s2.getBooleanOptions());
copyIntegerOptions(s1.getIntegerOptions(), s2.getIntegerOptions());
copyFixedOptions(s1.getFixedOptions(), s2.getFixedOptions());
copyStringOptions(s1.getStringOptions(), s2.getStringOptions());
copyButtonOptions(s1.getButtonOptions(), s2.getButtonOptions());
copyGroupOptions(s1.getGroupOptions(), s2.getGroupOptions());
// reconnect the circular referencing
copyOptionOrdering(s1.getOptionOrdering(), s2.getOptionOrdering(), s1.getBooleanOptions(),
s1.getIntegerOptions(), s1.getFixedOptions(), s1.getStringOptions(), s1.getButtonOptions(),
s1.getGroupOptions());
return s2;
}
private static void copyBooleanOptions(HashMap<String, BooleanOption> bo1,
HashMap<String, BooleanOption> bo2) {
for (String key : bo1.keySet()) {
bo2.put(key, (BooleanOption) copy(bo1.get(key)));
}
}
private static void copyButtonOptions(HashMap<String, ButtonOption> bo1,
HashMap<String, ButtonOption> bo2) {
for (String key : bo1.keySet()) {
bo2.put(key, (ButtonOption) copy(bo1.get(key)));
}
}
private static Double copyDouble(Double d1) {
if (d1 == null) {
return null;
}
return new Double(d1.doubleValue());
}
public static ArrayList<Double> copyDoubleList(List<Double> l1) {
if (l1 == null) {
return null;
}
ArrayList<Double> l2 = new ArrayList<Double>(l1.size());
for (Double i : l1) {
l2.add(i.doubleValue());
}
return l2;
}
private static void copyFixedOptions(HashMap<String, FixedOption> fo1,
HashMap<String, FixedOption> fo2) {
for (String key : fo1.keySet()) {
fo2.put(key, (FixedOption) copy(fo1.get(key)));
}
}
private static void copyGroupOptions(HashMap<String, GroupOption> go1,
HashMap<String, GroupOption> go2) {
for (String key : go1.keySet()) {
go2.put(key, (GroupOption) copy(go1.get(key)));
}
}
private static Integer copyInteger(Integer i1) {
if (i1 == null) {
return null;
}
return new Integer(i1.intValue());
}
public static ArrayList<Integer> copyIntegerList(List<Integer> l1) {
if (l1 == null) {
return null;
}
ArrayList<Integer> l2 = new ArrayList<Integer>(l1.size());
for (Integer i : l1) {
l2.add(i.intValue());
}
return l2;
}
private static void copyIntegerOptions(HashMap<String, IntegerOption> io1,
HashMap<String, IntegerOption> io2) {
for (String key : io1.keySet()) {
io2.put(key, (IntegerOption) copy(io1.get(key)));
}
}
public static void copyOptionOrdering(ArrayList<OptionsOrderValuePair> oo1,
ArrayList<OptionsOrderValuePair> oo2, HashMap<String, BooleanOption> booleanOptions,
HashMap<String, IntegerOption> integerOptions, HashMap<String, FixedOption> fixedOptions,
HashMap<String, StringOption> stringOptions, HashMap<String, ButtonOption> buttonOptions,
HashMap<String, GroupOption> groupOptions) {
for (OptionsOrderValuePair vp1 : oo1) {
switch (vp1.getSaneOptionType()) {
case STRING:
oo2.add(stringOptions.get(vp1.getKey()).getOptionsOrderValuePair());
break;
case INTEGER:
oo2.add(integerOptions.get(vp1.getKey()).getOptionsOrderValuePair());
break;
case FIXED:
oo2.add(fixedOptions.get(vp1.getKey()).getOptionsOrderValuePair());
break;
case BOOLEAN:
oo2.add(booleanOptions.get(vp1.getKey()).getOptionsOrderValuePair());
break;
case BUTTON:
oo2.add(buttonOptions.get(vp1.getKey()).getOptionsOrderValuePair());
break;
case GROUP:
oo2.add(groupOptions.get(vp1.getKey()).getOptionsOrderValuePair());
break;
default:
break;
}
}
}
private static ArrayList<String> copyStringList(List<String> l1) {
if (l1 == null) {
return null;
}
ArrayList<String> l2 = new ArrayList<String>(l1.size());
for (String str : l1) {
l2.add(str);
}
return l2;
}
private static void copyStringOptions(HashMap<String, StringOption> so1,
HashMap<String, StringOption> so2) {
for (String key : so1.keySet()) {
so2.put(key, (StringOption) copy(so1.get(key)));
}
}
public static void exportScannerXML(XStream xstream, Scanner scanner, File file)
throws IOException {
String rootNodeName = "swingsane";
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),
"UTF-8"));
out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
ObjectOutputStream oos;
oos = xstream.createObjectOutputStream(out, rootNodeName);
oos.writeObject(scanner);
oos.close();
}
public static Scanner importScannerXML(XStream xstream, File file) throws IOException,
ClassNotFoundException {
ObjectInputStream s = null;
FileInputStream fis = null;
Scanner scanner = null;
try {
fis = new FileInputStream(file);
s = xstream.createObjectInputStream(new InputStreamReader(fis, "UTF-8"));
scanner = ((Scanner) s.readObject());
restoreCircularReferences(scanner);
return scanner;
} catch (IOException ex) {
throw ex;
} finally {
if (s != null) {
s.close();
}
if (fis != null) {
fis.close();
}
}
}
static void restoreCircularReferences(Scanner scanner) {
ArrayList<OptionsOrderValuePair> ordering = new ArrayList<OptionsOrderValuePair>();
for (OptionsOrderValuePair vp : scanner.getOptionOrdering()) {
switch (vp.getSaneOptionType()) {
case STRING:
ordering.add(scanner.getStringOptions().get(vp.getKey()).getOptionsOrderValuePair());
break;
case INTEGER:
ordering.add(scanner.getIntegerOptions().get(vp.getKey()).getOptionsOrderValuePair());
break;
case FIXED:
ordering.add(scanner.getFixedOptions().get(vp.getKey()).getOptionsOrderValuePair());
break;
case BOOLEAN:
ordering.add(scanner.getBooleanOptions().get(vp.getKey()).getOptionsOrderValuePair());
break;
case BUTTON:
ordering.add(scanner.getButtonOptions().get(vp.getKey()).getOptionsOrderValuePair());
break;
case GROUP:
ordering.add(scanner.getGroupOptions().get(vp.getKey()).getOptionsOrderValuePair());
break;
default:
break;
}
}
scanner.setOptionOrdering(ordering);
}
public static void update(HashMap<String, Login> sl1, HashMap<String, Login> sl2) {
sl1.clear();
sl1.putAll(sl2);
}
public static void update(Scanner s1, Scanner s2) {
s1.setDescription(s2.getDescription());
s1.setBatchPrefix(s2.getBatchPrefix());
s1.setBooleanOptions(s2.getBooleanOptions());
s1.setButtonOptions(s2.getButtonOptions());
s1.setFixedOptions(s2.getFixedOptions());
s1.setGroupOptions(s2.getGroupOptions());
s1.setIntegerOptions(s2.getIntegerOptions());
s1.setModel(s2.getModel());
s1.setName(s2.getName());
s1.setOptionOrdering(s2.getOptionOrdering());
s1.setPagesToScan(s2.getPagesToScan());
s1.setRemoteAddress(s2.getRemoteAddress());
s1.setRemotePortNumber(s2.getRemotePortNumber());
s1.setServiceName(s2.getServiceName());
s1.setStringOptions(s2.getStringOptions());
s1.setType(s2.getType());
s1.setUsingCustomOptions(s2.isUsingCustomOptions());
s1.setVendor(s2.getVendor());
}
private PreferencesUtils() {
}
}