package frame.config; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.log4j.Logger; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.xml.sax.EntityResolver; import frame.role.UserRightContainer; public class ContextConfigerLoader { protected static Logger logger; private static ContextConfigerLoader instance; private static LoaderContainer configLoaderContainer; private static UserRightContainer userRightContainer; private List virtualPathList; private List callablList; static { logger = Logger.getLogger(ContextConfigerLoader.class); configLoaderContainer = LoaderContainer.getInstance(); userRightContainer = UserRightContainer.getInstance(); } private ContextConfigerLoader() { virtualPathList = new ArrayList(); callablList = new ArrayList(); } public synchronized static ContextConfigerLoader getInstance() { if (instance == null) { instance = new ContextConfigerLoader(); } return instance; } public void load() { String path = Configer.getPath_MainConfig(); File file = new File(path); loadOneFile(file); } private void loadOneFile(File file) { try { logger.debug("load dispatch file:" + file); InputStream inputStream = new FileInputStream(file); try { SAXReader reader = new SAXReader(); reader.setValidation(false); Document doc = reader.read(inputStream); Element root = doc.getRootElement(); loadParams(root); loadConfigLoader(root); loadFreeVisit(root); loadLimitedVisit(root); loadVirtualPathConfig(root); loadCallableConfig(root); loadDataRight(root); } catch (DocumentException e) { logger.error("can not load dispatch file: " + file); logger.error(e); } finally { try { inputStream.close(); } catch (IOException e) { } } } catch (Exception e) { logger.error(e); } } public void loadClasses() throws Exception { //1. for (VirtualPathConfig virtualPath: virtualPathList) { loadOneVirtualPath(virtualPath); } //2. for (CallableConfig callableConfig: callablList) { loadOneDispatch(callableConfig); } } private void loadParams(Element root) throws Exception { Iterator iterator = root.elementIterator(Node_Param); while (iterator.hasNext()) { Element element = (Element) iterator.next(); String name = element.attributeValue(Node_Param_Name); String value = element.attributeValue(Node_Param_Value); boolean client = Util.stringToBoolean(element.attributeValue(Node_Param_Client)); Configer.addParam(name, value, client); } Configer.afterLoadParams(); } private void loadFreeVisit(Element root) throws Exception { Iterator iterator = root.elementIterator(Node_FreeVisit); while (iterator.hasNext()) { Element element = (Element) iterator.next(); Iterator typeIterator = element.elementIterator(Node_Type); while (typeIterator.hasNext()) { Element elemnet = (Element) typeIterator.next(); String type = elemnet.getTextTrim(); loadOneFreeVisitType(type); } Iterator resourceIterator = element.elementIterator(Node_Resource); while (resourceIterator.hasNext()) { Element elemnet = (Element) resourceIterator.next(); String resource = elemnet.getTextTrim(); loadOneFreeVisitResource(resource); } Iterator callIterator = element.elementIterator(Node_Call); while (callIterator.hasNext()) { Element elemnet = (Element) callIterator.next(); String call = elemnet.getTextTrim(); loadOneFreeVisitCall(call); } Iterator excludeIterator = element.elementIterator(Node_Exclude); while (excludeIterator.hasNext()) { Element elemnet = (Element) excludeIterator.next(); String exclude = elemnet.getTextTrim(); loadOneExcludeResource(exclude); } } } private void loadLimitedVisit(Element root) { Iterator iterator = root.elementIterator(Node_LimitedVisit); while (iterator.hasNext()) { Element element = (Element) iterator.next(); Iterator typeIterator = element.elementIterator(Node_RoleResource); while (typeIterator.hasNext()) { Element elemnet = (Element) typeIterator.next(); String role = elemnet.attributeValue(Node_RoleResource_Role); String resource = elemnet.attributeValue(Node_RoleResource_Resource); userRightContainer.addRoleResource(role, resource); } } } private void loadVirtualPathConfig(Element root) throws Exception { Iterator iterator = root.elementIterator("virtualPaths"); while (iterator.hasNext()) { Element element = (Element) iterator.next(); Iterator mappingIterator = element.elementIterator("virtualPath"); while (mappingIterator.hasNext()) { Element elemnet = (Element) mappingIterator.next(); String path = elemnet.attributeValue("path"); String target = elemnet.attributeValue("target"); String className = elemnet.attributeValue("classname"); VirtualPathConfig virtualPath = new VirtualPathConfig(path, target, className); virtualPathList.add(virtualPath); } } } private void loadCallableConfig(Element root) throws Exception { Iterator iterator = root.elementIterator(Node_Callable); while (iterator.hasNext()) { Element element = (Element) iterator.next(); Iterator mappingIterator = element.elementIterator(Node_Mapping); while (mappingIterator.hasNext()) { Element elemnet = (Element) mappingIterator.next(); String path = elemnet.attributeValue(Node_Mapping_Path); String classname = elemnet.attributeValue(Node_Mapping_ClassName); CallableConfig callableConfig = new CallableConfig(path, classname); callablList.add(callableConfig); } } } private void loadConfigLoader(Element root) throws Exception { Iterator iterator = root.elementIterator(Node_ConfigLoader); while (iterator.hasNext()) { Element element = (Element) iterator.next(); Iterator configIterator = element.elementIterator(Node_ConfigLoader_Loader); while (configIterator.hasNext()) { Element loaderEl = (Element) configIterator.next(); String name = loaderEl.attributeValue(Node_ConfigLoader_Loader_Name); String active = loaderEl.attributeValue(Node_ConfigLoader_Loader_Active); String classname = loaderEl.attributeValue(Node_ConfigLoader_Loader_ClassName); Class clazz = Class.forName(classname); ILoader configLoader; Method getInstance = null; try { getInstance = clazz.getDeclaredMethod("getInstance"); } catch (NoSuchMethodException e) { } if (getInstance != null) { configLoader = (ILoader) getInstance.invoke(null); } else { configLoader = (ILoader) clazz.newInstance(); } configLoader.setName(name); configLoader.setActive(Util.stringToBoolean(active)); configLoaderContainer.add(configLoader); } } } private void loadDataRight(Element root) throws Exception { Iterator iterator = root.elementIterator(Node_DataFilter); while (iterator.hasNext()) { Element element = (Element) iterator.next(); Iterator filterIterator = element.elementIterator(Node_DataFilter_Filter); while (filterIterator.hasNext()) { Element filterEl = (Element) filterIterator.next(); String tablename = filterEl.attributeValue(Node_DataFilter_Filter_TableName); String where = filterEl.attributeValue(Node_DataFilter_Filter_Where); userRightContainer.addDataRight(tablename, where); } } } private void loadOneFreeVisitType(String type) { if (Util.isEmptyStr(type)) { return; } mainDispatcher.appendFreeVisitType(type); } private void loadOneFreeVisitResource(String resource) { if (Util.isEmptyStr(resource)) { return; } mainDispatcher.appendFreeVisitResource(resource); } private void loadOneFreeVisitCall(String call) { if (Util.isEmptyStr(call)) { return; } mainDispatcher.appendFreeVisitCalls(call); } private void loadOneExcludeResource(String exclude) { if (Util.isEmptyStr(exclude)) { return; } mainDispatcher.appendExcludeResources(exclude); } private void loadOneVirtualPath(VirtualPathConfig virtualPath) throws Exception { if (virtualPath.invalid()) { return; } mainDispatcher.appendVirtualPaths(virtualPath.getPath(), virtualPath.getTarget(), virtualPath.getClassName()); } private void loadOneDispatch(CallableConfig callableConfig) throws Exception { if (callableConfig.invalid()) { return; } mainDispatcher.appendCallableClass(callableConfig.getPath(), callableConfig.getClassName()); } }