/*
* <p>
* 版权: ©2011
* </p>
*/
package org.young.isocket.parse;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.young.icore.util.ClassLoaderUtils;
import org.young.isocket.exception.ConfigException;
import org.young.isocket.util.SocketKeys;
/**
* <p>
*
* </p>
*
* @see
* @author yangjun2
* @email yangjun1120@gmail.com
*
*/
abstract public class AbstractXmlConfigParser<T> implements IXmlConfigParser {
private static final Logger logger = LoggerFactory.getLogger(AbstractXmlConfigParser.class);
abstract protected void doStartElement(XMLStreamReader r, Map<String, T> m);
abstract protected void doEndElement(XMLStreamReader r, Map<String, T> m);
public final Map<String, T> parse(final String fileLocations) {
Map<String, T> map = new HashMap<String, T>();
String[] locations = StringUtils.split(fileLocations, ",");
XMLInputFactory factory = XMLInputFactory.newInstance();
ClassLoader defaultClassLoader = ClassLoaderUtils.getDefaultClassLoader();
for (String s : locations) {
String ns = s;
if (ns.isEmpty())
continue;
XMLStreamReader r = null;
//FileReader fr = null;
//BufferedReader br = null;
try {
///fr = new FileReader(defaultClassLoader.getResource(ns).getFile());
//br = new BufferedReader(fr);
Stack<Object> stack = new Stack<Object>();
r = factory.createXMLStreamReader(defaultClassLoader.getResourceAsStream(ns),
SocketKeys.CHARSET_NAME_UTF8);
int event = r.getEventType();
while (true) {
switch (event) {
case XMLStreamConstants.START_ELEMENT:
doStartElement(r, map);
break;
case XMLStreamConstants.END_ELEMENT:
doEndElement(r, map);
break;
default:
dummy();
}
//退出while循环
if (!r.hasNext()) {
break;
}
//System.out.println("localName:" + r.getElementText());
event = r.next();
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
if (e instanceof ConfigException)
throw (ConfigException) e;
else
throw new ConfigException(e.getMessage(), e);
} finally {
try {
if (r != null) {
r.close();
}
} catch (XMLStreamException e) {
logger.error(e.getMessage(), e);
throw new ConfigException(e.getMessage(), e);
}
// try {
// if (fr != null) {
// fr.close();
// }
// } catch (IOException e) {
// logger.error(e.getMessage(), e);
// throw new ConfigException(e.getMessage(), e);
// }
// try {
// if (br != null) {
// br.close();
// }
// } catch (IOException e) {
// logger.error(e.getMessage(), e);
// throw new ConfigException(e.getMessage(), e);
// }
}
}
return map;
}
protected void dummy() {
}
}