All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.alogic.event.loader.FromClasspath Maven / Gradle / Ivy

There is a newer version: 1.6.17
Show newest version
package com.alogic.event.loader;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.w3c.dom.Document;

import com.alogic.load.Loader;
import com.alogic.event.Process;
import com.anysoft.util.IOTools;
import com.anysoft.util.Properties;
import com.anysoft.util.PropertiesConstants;
import com.anysoft.util.Settings;
import com.anysoft.util.XmlTools;

/**
 * 从类加载路径装入Process
 * 
 * @author yyduan
 * @since 1.6.11.1
 * 
 * @version 1.6.11.2 [20171218 duanyy] 
* - 增加扫描路径时的日志
* * @version 1.6.11.4 [20171222 duanyy]
* - 修正资源无法找到的错误
* * @version 1.6.11.20 [20180223 duanyy]
* - 修正错误字符串的异常
*/ public class FromClasspath extends Loader.Abstract{ /** * 类路径 */ protected String path; /** * 引导类 */ protected String bootstrap; /** * 预加载的对象 */ private Map processes = new ConcurrentHashMap(); @Override public Process load(String id, boolean cacheAllowed) { return processes.get(id); } @Override public void configure(Properties p){ super.configure(p); path = PropertiesConstants.getString(p, "path", ""); bootstrap = PropertiesConstants.getString(p, "bootstrap", ""); if (StringUtils.isNotEmpty(path) && StringUtils.isNotEmpty(bootstrap)){ ClassLoader cl = Settings.getClassLoader(); try { Class clazz = cl.loadClass(bootstrap); scanResource(path,clazz); }catch (Exception ex){ LOG.error("Can not load class " + bootstrap); LOG.error(ExceptionUtils.getStackTrace(ex)); } }else{ LOG.error("Can not scan class path,because the path or the bootstap is null"); } } /** * 从指定的CLASSPATH路径中扫描资源 * * @param home 路径 * @param clazz 引导类 */ protected void scanResource(String home, Class clazz) { URL url = clazz.getResource(home); if (url == null){ LOG.warn(String.format("Can not find resource path:%s",home)); return ; } if(url.toString().startsWith("file:")){ File file; try { file = new File(url.toURI()); } catch (URISyntaxException e) { LOG.error("Can not scan home:" + path,e); LOG.error(ExceptionUtils.getStackTrace(e)); return; } LOG.info(String.format("Scan event processor in %s",url.toString())); scanFileSystem(home,file,clazz); } else{ if (url.toString().startsWith("jar:")){ JarFile jfile; try { String jarUrl = url.toString(); jarUrl = jarUrl.substring(9, jarUrl.indexOf('!')); jfile = new JarFile(jarUrl); } catch (IOException e) { LOG.error("Can not scan home:" + path,e); LOG.error(ExceptionUtils.getStackTrace(e)); return; } LOG.info(String.format("Scan event processor in %s",url.toString())); scanJar(home,jfile,clazz); } } } /** * 扫描指定的Jar * @param home Jar中的路径 * @param jarFile jarFile */ protected void scanJar(String home, JarFile jarFile,Class clazz) { Enumeration files = jarFile.entries(); while (files.hasMoreElements()) { JarEntry entry = files.nextElement(); String name = entry.getName(); if (name.endsWith(".xml")) { int end = name.lastIndexOf('/'); String path = '/' + name.substring(0, end); if (path.equals(home)) { // got LOG.info(String.format("Found event processor : %s",entry.getName())); String classPath = "/" + name;; InputStream in = null; try { in = clazz.getResourceAsStream(classPath); Document doc = XmlTools.loadFromInputStream(in); Process p = new Process.Default(); p.configure(doc.getDocumentElement(), Settings.get()); if (!p.isNull()) { processes.put(p.getId(), p); } } catch (Exception ex) { LOG.error("Can not load file:" + classPath); LOG.error(ExceptionUtils.getStackTrace(ex)); } finally { IOTools.close(in); } } } } } /** * 扫描文件系统 * @param path * @param file * @param clazz */ protected void scanFileSystem(String path, File file,Class clazz) { File[] files = file.listFiles(); for (File item:files){ if (item.getName().endsWith(".xml")){ LOG.info(String.format("Found event processor : %s",item.getName())); InputStream in = null; try { in = new FileInputStream(item); Document doc = XmlTools.loadFromInputStream(in); Process p = new Process.Default(); p.configure(doc.getDocumentElement(), Settings.get()); if (!p.isNull()){ processes.put(p.getId(), p); } }catch (Exception ex){ LOG.error("Can not load file:" + item.getPath()); LOG.error(ExceptionUtils.getStackTrace(ex)); }finally{ IOTools.close(in); } } } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy