/*
* Copyright 2015 the original author or authors.
* @https://github.com/scouter-project/scouter
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package scouter.agent.netio.request.handle;
import java.io.File;
import java.io.InputStream;
import java.net.JarURLConnection;
import java.net.URL;
import scouter.agent.JavaAgent;
import scouter.agent.Logger;
import scouter.agent.netio.request.anotation.RequestHandler;
import scouter.lang.pack.MapPack;
import scouter.lang.pack.Pack;
import scouter.lang.value.BlobValue;
import scouter.lang.value.ListValue;
import scouter.lang.value.MapValue;
import scouter.lang.value.Value;
import scouter.net.RequestCmd;
import scouter.util.ClassUtil;
import scouter.util.FileUtil;
public class AgentClassHandle {
@RequestHandler(RequestCmd.OBJECT_LOAD_CLASS_BY_STREAM)
public Pack loadClassAsStream(Pack param) {
MapPack p = (MapPack) param;
String className = p.getText("class");
InputStream is = null;
try {
Class clazz = getClass(className);
if (clazz == null) {
p.put("error", "Not found class " + className);
return p;
}
String clsAsResource = "/" + className.replace('.', '/').concat(".class");
is = clazz.getResourceAsStream(clsAsResource);
p.put("class", new BlobValue(FileUtil.readAll(is)));
} catch (Throwable th) {
Logger.println("A126", th);
p.put("error", th.getMessage());
return p;
} finally {
FileUtil.close(is);
}
return p;
}
@RequestHandler(RequestCmd.OBJECT_CLASS_DESC)
public Pack getClassInfo(Pack param) {
MapPack p = (MapPack) param;
String className = p.getText("class");
try {
Class clazz = getClass(className);
if (clazz == null) {
p.put("error", "Not found class " + className);
return p;
}
p.put("class", ClassUtil.getClassDescription(clazz));
} catch (Throwable th) {
Logger.println("A904", th);
p.put("error", th.getMessage());
return p;
}
return p;
}
private ListValue toValue(Class[] inf) {
ListValue v = new ListValue();
for (int i = 0; i < inf.length; i++) {
v.add(inf[i].getName());
}
return v;
}
private Class getClass(String className) {
Class[] loadedClasses = JavaAgent.getInstrumentation().getAllLoadedClasses();
for (Class c : loadedClasses) {
if (c.getName().equals(className)) {
return c;
}
}
return null;
}
@RequestHandler(RequestCmd.OBJECT_CHECK_RESOURCE_FILE)
public Pack checkJarFile(Pack param) {
MapPack p = (MapPack) param;
String resource = p.getText("resource");
MapPack m = new MapPack();
try {
URL url = new URL(resource);
JarURLConnection connection = (JarURLConnection) url.openConnection();
File file = new File(connection.getJarFileURL().toURI());
if (file.exists() == false) {
m.put("error", "Cannot find jar file.");
} else {
if (file.canRead()) {
m.put("name", file.getName());
m.put("size", file.length());
} else {
m.put("error", "Cannot read jar file.");
}
}
} catch (Exception e) {
m.put("error", e.toString());
}
return m;
}
@RequestHandler(RequestCmd.OBJECT_DOWNLOAD_JAR)
public Pack downloadJar(Pack param) {
MapPack p = (MapPack) param;
String resource = p.getText("resource");
MapPack m = new MapPack();
try {
URL url = new URL(resource);
JarURLConnection connection = (JarURLConnection) url.openConnection();
File file = new File(connection.getJarFileURL().toURI());
if (file.exists() == false) {
m.put("error", "Cannot find jar file.");
} else {
if (file.canRead()) {
m.put("jar", new BlobValue(FileUtil.readAll(file)));
} else {
m.put("error", "Cannot read jar file.");
}
}
} catch (Exception e) {
m.put("error", e.toString());
}
return m;
}
}