com.logicbus.backend.websocket.scanner.FromPackage Maven / Gradle / Ivy
package com.logicbus.backend.websocket.scanner;
import com.alogic.load.Scanner;
import com.anysoft.util.*;
import com.logicbus.backend.websocket.WSEndpointInfo;
import com.logicbus.backend.websocket.WSEndpointScanner;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import javax.websocket.server.ServerEndpoint;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/**
* 扫描package,通过Annotation来发现
*
* @version 1.6.14.11 [20210524 duanyy]
* - 修复jar搜索问题
*/
public class FromPackage extends Scanner.Abstract implements WSEndpointScanner,Scanner.Listener {
protected List objList = new ArrayList();
protected boolean hasScan = false;
protected String packages = null;
protected String delimiter = ";";
@Override
public void configure(Properties p){
super.configure(p);
packages = PropertiesConstants.getString(p,"package","",true);
delimiter = PropertiesConstants.getString(p,"delimiter",delimiter,true);
}
@Override
public void scan(Listener listener) {
if (listener != null) {
Object cookies = listener.begin(this.getId());
String[] list = packages.split(delimiter);
for (String item:list){
LOG.info(String.format("Scan endpoint in package %s",item));
scan(cookies,listener,item);
}
listener.end(cookies,this.getId());
}
}
protected static String dotToSplash(String name){
return name.replaceAll("\\.","/");
}
protected static String trimExtension(String name){
int pos = name.indexOf(".");
if (-1 != pos){
return name.substring(0,pos);
}
return name;
}
private Class> loadClass(String aClass) {
Class> found = null;
if (StringUtils.isNotEmpty(aClass)){
ClassLoader cl = Settings.getClassLoader();
try {
found = cl.loadClass(aClass);
}catch (Exception ex){
LOG.error("Can not load class:" + aClass);
}
}
return found;
}
protected void scan(Object cookies,Listener listener,String packageName){
String home = dotToSplash(packageName);
URL url = Settings.getClassLoader().getResource(home);
if (url == null){
LOG.warn("Package is not found:" + packageName);
return ;
}
if(url.toString().startsWith("file:")){
File file;
try {
file = new File(url.toURI());
} catch (URISyntaxException e) {
LOG.error("Can not scan home:" + home,e);
LOG.error(ExceptionUtils.getStackTrace(e));
return;
}
LOG.info(String.format("Scan endpoint in %s",url.toString()));
scanFileSystem(home,file,packageName,cookies,listener);
}
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:" + home,e);
LOG.error(ExceptionUtils.getStackTrace(e));
return;
}
LOG.info(String.format("Scan endpoint in %s",url.toString()));
scanJar(home,jfile,packageName,cookies,listener);
}
}
}
protected void scanFileSystem(String home, File file, String packageName, Object cookies, Listener listener) {
File[] files = file.listFiles();
for (File item:files){
String filename = item.getName();
if (filename.endsWith(".class")){
String className = packageName + "." + trimExtension(filename);
scanClass(className,cookies,listener);
}
}
}
protected void scanJar(String home, JarFile jarFile, String packageName, Object cookies, Listener listener) {
Enumeration files = jarFile.entries();
while (files.hasMoreElements()) {
JarEntry entry = files.nextElement();
String name = entry.getName();
if (name.endsWith(".class")) {
int end = name.lastIndexOf('/');
if (end > 0) {
String path = name.substring(0, end);
if (path.equals(home)) {
String filename = name.substring(end + 1);
String className = packageName + "." + trimExtension(filename);
scanClass(className, cookies, listener);
}
}
}
}
}
protected void scanClass(String classname,Object cookies,Listener listener){
Class> clazz = loadClass(classname);
if (clazz != null){
ServerEndpoint anno = (ServerEndpoint)clazz.getAnnotation(ServerEndpoint.class);
if (anno != null) {
WSEndpointInfo info = new WSEndpointInfo(clazz,anno.value());
if (listener != null) {
listener.found(cookies, info);
}
}
}
}
@Override
public List getList() {
if (!hasScan){
scan(this);
hasScan = true;
}
return objList;
}
@Override
public Object begin(String scannerId) {
return this;
}
@Override
public void found(Object cookie, WSEndpointInfo data) {
objList.add(data);
}
@Override
public void end(Object cookie, String scannerId) {
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy