package com.yanek.cfg;
import java.io.*;
import java.util.*;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.*;
import org.apache.log4j.Logger;
public class XMLSystemProperties
implements SystemProperties
{
static Logger logger = Logger.getLogger(XMLSystemProperties.class.getName());
private File file;
private Document doc;
private Map propertyCache;
private Object propLock;
public XMLSystemProperties(InputStream in)
throws Exception
{
propertyCache = new HashMap();
propLock = new Object();
Reader reader = new BufferedReader(new InputStreamReader(in));
buildDoc(reader);
}
public XMLSystemProperties(String fileName)
throws IOException
{
File tempFile;
boolean error=false;
Reader reader;
propertyCache = new HashMap();
propLock = new Object();
file = new File(fileName);
if(!file.exists())
{
tempFile = new File(file.getParentFile(), file.getName() + ".tmp");
if(tempFile.exists())
{
logger.error("WARNING: " + fileName + " was not found, but temp file from " + "previous write operation was. Attempting automatic recovery. Please " + "check file for data consistency.");
tempFile.renameTo(file);
} else
{
throw new FileNotFoundException("XML properties file does not exist: " + fileName);
}
}
tempFile = new File(file.getParentFile(), file.getName() + ".tmp");
if(tempFile.exists())
{
logger.error("WARNING: found a temp file: " + tempFile.getName() +
". This may " +
"indicate that a previous write operation failed. Attempting automatic " +
"recovery. Please check file " + fileName +
" for data consistency.");
if (tempFile.lastModified() > file.lastModified())
{
error = false;
reader = null;
try{
reader = new InputStreamReader(new FileInputStream(tempFile),
"UTF-8");
SAXReader xmlReader = new SAXReader();
xmlReader.read(reader);
}catch(Exception e){
try
{
reader.close();
}
catch (Exception ex)
{}
error = true;
}
}
}
if(error)
{
String bakFile = tempFile.getName() + "-" + System.currentTimeMillis() + ".bak";
tempFile.renameTo(new File(tempFile.getParentFile(), bakFile));
} else
{
/*String bakFile = file.getName() + "-" + System.currentTimeMillis() + ".bak";
file.renameTo(new File(file.getParentFile(), bakFile));
try
{
Thread.sleep(100L);
}
catch(Exception e) { }
tempFile.renameTo(file);*/
}
error = false;
reader = null;
try{
reader = new InputStreamReader(new FileInputStream(file), "UTF-8");
SAXReader xmlReader = new SAXReader();
xmlReader.read(reader);
try
{
reader.close();
}
catch (Exception e)
{}
}catch(Exception e){
error = true;
}
if(error)
{
String bakFileName = file.getName() + "-" + System.currentTimeMillis() + ".bak";
File bakFile = new File(file.getParentFile(), bakFileName);
file.renameTo(bakFile);
try
{
Thread.sleep(100L);
}
catch(Exception e) { }
tempFile.renameTo(file);
} /*else
{
String bakFile = tempFile.getName() + "-" + System.currentTimeMillis() + ".bak";
tempFile.renameTo(new File(tempFile.getParentFile(), bakFile));
}*/
if(!file.canRead())
throw new IOException("XML properties file must be readable: " + fileName);
if(!file.canWrite())
throw new IOException("XML properties file must be writable: " + fileName);
reader = null;
try
{
reader = new InputStreamReader(new FileInputStream(file), "UTF-8");
buildDoc(reader);
}
catch(Exception e)
{
logger.error("Error creating XML properties file " + fileName + ": " + e.getMessage());
throw new IOException(e.getMessage());
}
finally { }
try
{
reader.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public Object get(Object o)
{
String name;
String value;
Element element;
name = (String)o;
value = (String)propertyCache.get(name);
if(value != null)
return value;
String propName[] = parsePropertyName(name);
element = doc.getRootElement();
for(int i = 0; i < propName.length; i++)
{
element = element.element(propName[i]);
if(element == null)
return null;
}
synchronized(propLock){
value = element.getText();
if ("".equals(value))
return null;
value = value.trim();
propertyCache.put(name, value);
return value;
}
}
public Collection getChildrenNames(String parent)
{
String propName[] = parsePropertyName(parent);
Element element = doc.getRootElement();
for(int i = 0; i < propName.length; i++)
{
element = element.element(propName[i]);
if(element == null)
return Collections.EMPTY_LIST;
}
List children = element.elements();
int childCount = children.size();
List childrenNames = new ArrayList(childCount);
for(Iterator i = children.iterator(); i.hasNext(); childrenNames.add(((Element)i.next()).getName()));
return childrenNames;
}
public Collection getPropertyNames()
{
List propNames = new java.util.LinkedList();
List elements = doc.getRootElement().elements();
if(elements.size() == 0)
return Collections.EMPTY_LIST;
for(int i = 0; i < elements.size(); i++)
{
Element element = (Element)elements.get(i);
getElementNames(propNames, element, element.getName());
}
return propNames;
}
public String getAttribute(String name, String attribute)
{
if(name == null || attribute == null)
return null;
String propName[] = parsePropertyName(name);
Element element = doc.getRootElement();
int i = 0;
do
{
if(i >= propName.length)
break;
String child = propName[i];
element = element.element(child);
if(element == null)
break;
i++;
} while(true);
if(element != null)
return element.attributeValue(attribute);
else
return null;
}
private void getElementNames(List list, Element e, String name)
{
if(e.elements().isEmpty())
{
list.add(name);
} else
{
List children = e.elements();
for(int i = 0; i < children.size(); i++)
{
Ele
评论3
最新资源