package com.github.ompc.greys.core.command;
import com.github.ompc.greys.core.command.annotation.IndexArg;
import com.github.ompc.greys.core.server.Session;
import com.github.ompc.greys.core.util.affect.RowAffect;
import java.lang.instrument.Instrumentation;
import java.net.URL;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* 资源查询命令
* Created by vlinux on 16/9/24.
*/
//@Cmd(name = "resource", sort = 8, summary = "Finds the resource with the given name",
// eg = {
// "resource *spring-manager.xml"
// })
// TODO : 尚未想好如何输出格式内容,有待后续完善
public class ResourceCommand implements Command {
@IndexArg(index = 0, name = "resource-name", summary = "Path and resource of Pattern Matching")
private String resourceName;
@Override
public Command.Action getAction() {
return new Command.RowAction() {
// 列出所有已经被加载的ClassLoader
private Set<ClassLoader> listLoadedClassLoader(Instrumentation inst) {
final Set<ClassLoader> classLoaderSet = new HashSet<ClassLoader>();
for (Class<?> clazz : inst.getAllLoadedClasses()) {
if (null == clazz) {
continue;
}
final ClassLoader loader = clazz.getClassLoader();
if (null != loader) {
classLoaderSet.add(loader);
}
}
return classLoaderSet;
}
private Map<ClassLoader, URL> searchResourceMapByName(final Set<ClassLoader> classLoaderSet,
final String resourceName) {
final Map<ClassLoader, URL> classLoaderResourceMapping = new HashMap<ClassLoader, URL>();
for (final ClassLoader loader : classLoaderSet) {
final URL resourceURL = loader.getResource(resourceName);
if (null != resourceURL
&& !classLoaderResourceMapping.containsKey(loader)) {
classLoaderResourceMapping.put(loader, resourceURL);
}
}
return classLoaderResourceMapping;
}
@Override
public RowAffect action(Session session, Instrumentation inst, Printer printer) throws Throwable {
final Map<ClassLoader, URL> resourceMap = searchResourceMapByName(listLoadedClassLoader(inst), resourceName);
for (final Map.Entry<ClassLoader, URL> entry : resourceMap.entrySet()) {
final String title = String.format("// RESOURCE INFORMATION FOR \"%s\" @ClassLoader:%s",
entry.getValue().toString(),
entry.getKey()
);
}
return new RowAffect(resourceMap.size());
}
};
}
}