1 package com.jdon.util.jdom; 2 3 13 14 15 import java.io.BufferedOutputStream ; 16 import java.io.File ; 17 import java.io.FileOutputStream ; 18 import java.io.InputStream ; 19 import java.io.OutputStream ; 20 import java.io.Writer ; 21 import java.util.HashMap ; 22 import java.util.List ; 23 import java.util.Map ; 24 import java.util.StringTokenizer ; 25 26 import org.jdom.Document; 27 import org.jdom.Element; 28 import org.jdom.input.SAXBuilder; 29 import org.jdom.output.XMLOutputter; 30 31 46 public class XMLProperties { 47 48 private Document doc; 49 53 private Map propertyCache = new HashMap (); 54 55 61 public XMLProperties(String fileName) { 62 try { 63 SAXBuilder builder = new SAXBuilder(); 64 DataUnformatFilter format = new DataUnformatFilter(); 66 builder.setXMLFilter(format); 67 doc = builder.build(new File (fileName)); 68 } 69 catch (Exception e) { 70 System.err.println("Error creating XML parser in " 71 + "PropertyManager.java"); 72 e.printStackTrace(); 73 } 74 } 75 76 82 public XMLProperties(InputStream inputStream) { 83 try { 84 SAXBuilder builder = new SAXBuilder(); 85 DataUnformatFilter format = new DataUnformatFilter(); 87 builder.setXMLFilter(format); 88 doc = builder.build(inputStream); 89 } 90 catch (Exception e) { 91 System.err.println("Error creating XML parser in " 92 + "PropertyManager.java"); 93 e.printStackTrace(); 94 } 95 } 96 97 98 99 105 public String getProperty(String name) { 106 if (propertyCache.containsKey(name)) { 107 return (String )propertyCache.get(name); 108 } 109 110 String [] propName = parsePropertyName(name); 111 Element element = doc.getRootElement(); 113 for (int i = 0; i < propName.length; i++) { 114 element = element.getChild(propName[i]); 115 if (element == null) { 116 return null; 119 } 120 } 121 String value = element.getText(); 124 if ("".equals(value)) { 125 return null; 126 } 127 else { 128 value = value.trim(); 130 propertyCache.put(name, value); 131 return value; 132 } 133 } 134 135 145 public String [] getChildrenProperties(String parent) { 146 String [] propName = parsePropertyName(parent); 147 Element element = doc.getRootElement(); 149 for (int i = 0; i < propName.length; i++) { 150 element = element.getChild(propName[i]); 151 if (element == null) { 152 return new String [] { }; 155 } 156 } 157 List children = element.getChildren(); 159 int childCount = children.size(); 160 String [] childrenNames = new String [childCount]; 161 for (int i=0; i<childCount; i++) { 162 childrenNames[i] = ((Element)children.get(i)).getName(); 163 } 164 return childrenNames; 165 } 166 167 174 public void setProperty(String name, String value) { 175 propertyCache.put(name, value); 177 178 String [] propName = parsePropertyName(name); 179 Element element = doc.getRootElement(); 181 for (int i=0; i<propName.length; i++) { 182 if (element.getChild(propName[i]) == null) { 185 element.addContent(new Element(propName[i])); 186 } 187 element = element.getChild(propName[i]); 188 } 189 element.setText(value); 191 192 } 193 194 199 public void deleteProperty(String name) { 200 String [] propName = parsePropertyName(name); 201 Element element = doc.getRootElement(); 203 for (int i=0; i<propName.length-1; i++) { 204 element = element.getChild(propName[i]); 205 if (element == null) { 207 return; 208 } 209 } 210 element.removeChild(propName[propName.length-1]); 212 213 } 214 215 219 public synchronized void saveProperties(String fileName) { 220 OutputStream out = null; 221 boolean error = false; 222 File file = new File (fileName); 223 File tempFile = null; 225 try { 226 tempFile = new File (file.getParentFile(), file.getName() + ".tmp"); 227 XMLOutputter outputter = new XMLOutputter(" ", true); 230 out = new BufferedOutputStream (new FileOutputStream (tempFile)); 231 outputter.output(doc, out); 232 } 233 catch (Exception e) { 234 e.printStackTrace(); 235 error = true; 237 } 238 finally { 239 try { out.close(); } 240 catch (Exception e) { 241 e.printStackTrace(); 242 error = true; 243 } 244 } 245 if (!error) { 247 file.delete(); 249 tempFile.renameTo(file); 253 } 254 } 255 256 public synchronized void savePropertiesToStream(OutputStream out) { 257 boolean error = false; 258 try { 259 XMLOutputter outputter = new XMLOutputter(" ", true); 262 outputter.output(doc, out); 263 } 264 catch (Exception e) { 265 e.printStackTrace(); 266 } 267 finally { 268 try { out.close(); } 269 catch (Exception e) { 270 e.printStackTrace(); 271 } 272 } 273 } 274 275 276 public synchronized void savePropertiesToStream(Writer writer) { 277 boolean error = false; 278 try { 279 XMLOutputter outputter = new XMLOutputter(" ", true); 282 outputter.output(doc, writer); 283 } 284 catch (Exception e) { 285 e.printStackTrace(); 286 } 287 finally { 288 try { writer.close(); } 289 catch (Exception e) { 290 e.printStackTrace(); 291 } 292 } 293 } 294 295 296 304 private String [] parsePropertyName(String name) { 305 int size = 1; 308 for (int i=0; i<name.length(); i++) { 309 if (name.charAt(i) == '.') { 310 size++; 311 } 312 } 313 String [] propName = new String [size]; 314 StringTokenizer tokenizer = new StringTokenizer (name, "."); 316 int i = 0; 317 while (tokenizer.hasMoreTokens()) { 318 propName[i] = tokenizer.nextToken(); 319 i++; 320 } 321 return propName; 322 } 323 } 324 | Popular Tags |