/*
* $RCSfile: JavaBuilderPersister.java,v $
* @modification $Date: 2001/09/28 19:41:42 $
* @version $Id: JavaBuilderPersister.java,v 1.1 2001/09/28 19:41:42 hfalk Exp $
*
*/
package com.memoire.vainstall.builder.util;
import com.memoire.vainstall.builder.*;
import java.awt.Rectangle;
import java.io.File;
import java.io.IOException;
import java.util.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.w3c.dom.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
/**
* This class performs the persistance of the VAInstall Builder
*
* @see com.memoire.vainstall.VAIBuilderModel
* @see com.memoire.vainstall.util.BuilderPersisterInterface
*
* @author Henrik Falk
* @version $Id: JavaBuilderPersister.java,v 1.1 2001/09/28 19:41:42 hfalk Exp $
*/
public class JavaBuilderPersister implements BuilderPersisterInterface {
/**
* The Builder data model
*/
VAIBuilderModel model = null;
/**
* A not so elegant way to find out where the VAInstall shared
* directory is located.
* Used for saving the vaibuilder.xml file which contains data
* from the builder data model.
*/
String vai_home = XmlUtil.findVAISharedDir().getAbsolutePath();
/**
* Default constructor
*/
public JavaBuilderPersister() {
super();
}
/**
* Initializes this class in order to know which datamodel to save
* and load.
* @param model The builder model
*/
public void initialize(VAIBuilderModel model) {
this.model = model;
}
/**
* Loads the data from datastore
*/
public void load() {
// check if we are initialized
if (model == null) {
return;
}
// Check if vaibuilder.xml exists
String vaibuilder = vai_home + java.io.File.separator + "vaibuilder.xml";
if (new File(vaibuilder).exists() == false) {
// this is the first time we run the builder
return;
}
// Parse the XML file at the moment non-validating
Document doc = null;
try {
doc = XmlUtil.parse(vaibuilder,null);
} catch (XmlParseException exc) {
// System.out.println("Could not load preferences.");
return;
}
// extract data from the Document to the data model
importData(doc);
}
/**
* Saves the data in datastore
*/
public void save() {
// check if we are initialized
if (model == null) {
return;
}
// create a new Document
Document doc = null;
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
doc = builder.newDocument();
} catch(ParserConfigurationException exc) {
return;
}
// Extract data from the model to the Document
exportData(doc);
// Create a Transformer which enables us to export the Document
Transformer transformer = null;
try {
transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty("indent","yes");
} catch(TransformerConfigurationException exc) {
exc.printStackTrace();
return;
}
// Export the Document
String vaibuilder = vai_home + java.io.File.separator + "vaibuilder.xml";
try {
transformer.transform(new DOMSource(doc),new StreamResult(new File(vaibuilder)));
} catch (TransformerException exc) {
exc.printStackTrace();
}
}
/**
* Extract data from a Document and updates the data model
* @param doc a Document
*/
private void importData(Document doc) {
NodeList nodelist;
Element rootElement = doc.getDocumentElement();
// get saved window positions
nodelist = rootElement.getElementsByTagName("window");
for(int i = 0 ; i < nodelist.getLength() ; i++) {
Node window = (Node)nodelist.item(i);
NamedNodeMap map = window.getAttributes();
Rectangle rect = new Rectangle(XmlUtil.getAttributeAsInt(map,"x"),
XmlUtil.getAttributeAsInt(map,"y"),
XmlUtil.getAttributeAsInt(map,"width"),
XmlUtil.getAttributeAsInt(map,"height"));
model.getWindowList().put(XmlUtil.getAttribute(map,"name"),rect);
}
// get saved last opened projects
nodelist = rootElement.getElementsByTagName("lastfile");
LinkedList tmpList = new LinkedList();
for(int i = 0 ; i < nodelist.getLength() ; i++) {
tmpList.add("");
}
for(int i = 0 ; i < nodelist.getLength() ; i++) {
int number = new Integer(XmlUtil.getAttribute(nodelist.item(i),"number")).intValue();
String lastproject = XmlUtil.getAttribute(nodelist.item(i),"file");
tmpList.set(number,lastproject);
}
for(int i = tmpList.size()-1 ; i >= 0 ; i--) {
model.addLastOpenedProject((String)tmpList.get(i));
}
// get builder properties
nodelist = rootElement.getElementsByTagName("property");
for(int i = 0 ; i < nodelist.getLength() ; i++) {
String name = XmlUtil.getAttribute(nodelist.item(i),"name");
String value = XmlUtil.getAttribute(nodelist.item(i),"value");
model.getPropertyList().put(name,value);
}
}
/**
* Extract data from the data model and updates a Document
* @param doc a Document
*/
private void exportData(Document doc) {
// create root element
Element root = doc.createElement("vaibuilder");
doc.appendChild(root);
// create <window> elements
Hashtable windowList = model.getWindowList();
Enumeration keys = windowList.keys();
while (keys.hasMoreElements() == true) {
String key = (String)keys.nextElement();
Rectangle rect = (Rectangle)windowList.get(key);
Element element = doc.createElement("window");
element.setAttribute("name",key);
element.setAttribute("x",String.valueOf(rect.x));
element.setAttribute("y",String.valueOf(rect.y));
element.setAttribute("width",String.valueOf(rect.width));
element.setAttribute("height",String.valueOf(rect.height));
root.appendChild(element);
}
// create <lastproject> elements
LinkedList lastproject = model.getLastOpenedProjectList();
for (int i = 0; i < lastproject.size() ; i++) {
Element element = doc.createElement("lastfile");
element.setAttribute("number",String.valueOf(i));
element.setAttribute("file",String.valueOf(lastproject.get(i)));
root.appendChild(element);
}
// create <property> elements
Hashtable propertyList = model.getPropertyList();
Enumeration propertyKeys = propertyList.keys();
while (propertyKeys.hasMoreElements() == true) {
String name = (String)propertyKeys.nextElement();
String value = (String)propertyList.get(name);
Element element = doc.createElement("property");
element.setAttribute("name",name);
element.setAttribute("value",value);
root.appendChild(element);
}
}
}
|