001 /*
002 * Copyright 2002-2004 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.richclient.settings.xml;
017
018 import java.io.File;
019 import java.io.FileInputStream;
020 import java.io.FileNotFoundException;
021 import java.io.FileOutputStream;
022 import java.io.IOException;
023
024 import javax.xml.parsers.DocumentBuilderFactory;
025 import javax.xml.parsers.FactoryConfigurationError;
026 import javax.xml.parsers.ParserConfigurationException;
027 import javax.xml.transform.TransformerConfigurationException;
028 import javax.xml.transform.TransformerException;
029 import javax.xml.transform.TransformerFactory;
030 import javax.xml.transform.TransformerFactoryConfigurationError;
031 import javax.xml.transform.dom.DOMSource;
032 import javax.xml.transform.stream.StreamResult;
033
034 import org.springframework.richclient.settings.SettingsException;
035 import org.w3c.dom.Document;
036 import org.w3c.dom.Element;
037 import org.xml.sax.SAXException;
038
039 /**
040 * <code>XmlSettingsReaderWriter</code> implementation that reads and writes
041 * the xml from and to the file system.
042 *
043 * @author Peter De Bruycker
044 *
045 */
046 public class FileSystemXmlSettingsReaderWriter implements XmlSettingsReaderWriter {
047
048 private String location;
049
050 /**
051 * Creates a new instance.
052 *
053 * @param location
054 * the location where the xml files will be located
055 */
056 public FileSystemXmlSettingsReaderWriter(String location) {
057 this.location = location;
058 }
059
060 public void write(RootXmlSettings settings) throws SettingsException {
061 try {
062 File file = createFile(settings.getName());
063 file.getParentFile().mkdirs();
064
065 TransformerFactory.newInstance().newTransformer().transform(new DOMSource(settings.getDocument()),
066 new StreamResult(new FileOutputStream(file)));
067 } catch (TransformerConfigurationException e) {
068 throw new SettingsException("Unable to write document", e);
069 } catch (TransformerException e) {
070 throw new SettingsException("Unable to write document", e);
071 } catch (TransformerFactoryConfigurationError e) {
072 throw new SettingsException("Unable to write document", e);
073 } catch (FileNotFoundException e) {
074 throw new SettingsException("Unable to write document", e);
075 }
076 }
077
078 /*
079 * TODO: create DTD + validate parsing
080 */
081 public RootXmlSettings read(String key) throws SettingsException {
082 try {
083 File file = createFile(key);
084 Document doc = null;
085 if (file.exists()) {
086 doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new FileInputStream(file));
087 } else {
088 doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
089 Element element = doc.createElement("settings");
090 element.setAttribute("name", key);
091 doc.appendChild(element);
092 }
093
094 RootXmlSettings settings = new RootXmlSettings(doc, this);
095
096 return settings;
097 } catch (SAXException e) {
098 throw new SettingsException("Unable to read xml", e);
099 } catch (IOException e) {
100 throw new SettingsException("Unable to read xml", e);
101 } catch (ParserConfigurationException e) {
102 throw new SettingsException("Unable to read xml", e);
103 } catch (FactoryConfigurationError e) {
104 throw new SettingsException("Unable to read xml", e);
105 }
106 }
107
108 private File createFile(String key) {
109 return new File(location, key + ".settings.xml");
110 }
111
112 /**
113 * Returns the current location.
114 *
115 * @return the location
116 */
117 public String getLocation() {
118 return location;
119 }
120
121 /**
122 * Sets the location.
123 *
124 * @param location
125 * the new location
126 */
127 public void setLocation(String location) {
128 this.location = location;
129 }
130
131 }