package org.rhq.plugins.jdbctrace; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.util.stream.StreamUtil; import org.rhq.plugins.byteman.BytemanAgentComponent; /** * A utility that performs things that both the discovery component and resource component * need. Be aware that this class will exist in the discovery and resource classloaders, so * be careful when modifying this class. * * @author John Mazzitelli */ public class JdbcTracerUtil { private final Log log = LogFactory.getLog(JdbcTracerUtil.class); public static final String PLUGINCONFIG_ENABLED = "enabled"; public static final String PLUGINCONFIG_SCRIPTNAME = "scriptName"; public static final String DEFAULT_JDBC_TRACER_SCRIPT_NAME = "jdbctrace-rules.txt"; public static final String DEFAULT_JDBC_TRACER_HELPER_JAR = "rhq-jdbctrace-plugin-helper.jar"; /** * Given the byteman agent resource where the JDBC tracer resource is hosted, * returns the file where the jdbc trace rules script file should exist. * * @param bytemanAgentComponent resource context of the byteman agent resource * @param scriptName the name of the jdbc rules script file (not path name, just the short file name) * @return the file where the script should be * * @throws Exception */ public File getJdbcTraceRulesScriptFile(BytemanAgentComponent bytemanAgentComponent, String scriptName) { File dataDir = bytemanAgentComponent.getResourceDataDirectory("jdbctrace"); dataDir.mkdirs(); File scriptFile = new File(dataDir, scriptName.replace('/', '-').replace('\\', '-')); // don't want it in subdirectory return scriptFile; } /** * Given the parent byteman agent resource where the JDBC tracer resource is hosted, * this will extract the jdbc trace rules script file and store it in a persisted data directory * * @param bytemanAgentComponent byteman agent resource * @param scriptName the name of the jdbc rules script file (not path name, just the short file name) * @return the file where the script was extracted * * @throws Exception */ public File extractJdbcTraceRulesScriptFile(BytemanAgentComponent bytemanAgentComponent, String scriptName) throws Exception { // extract the script file from our plugin jar into our parent byteman component's data directory File scriptFile = getJdbcTraceRulesScriptFile(bytemanAgentComponent, scriptName); InputStream resourceAsStream = getClass().getResourceAsStream("/" + scriptName); if (resourceAsStream == null) { throw new Exception("Cannot find JDBC tracer rules file from classloader"); } StreamUtil.copy(resourceAsStream, new FileOutputStream(scriptFile), true); log.debug("Extracted jdbc trace script file from plugin jar to [" + scriptFile.getAbsolutePath() + "]"); return scriptFile; } /** * Given the byteman agent resource where the JDBC tracer resource is hosted, * returns the file where the helper jar should exist. * * @param bytemanAgentComponent resource context of the byteman agent resource * @param jarFileName the short name of the helper jar file * @return the file where the helper jar should be * * @throws Exception */ public File getHelperJarFile(BytemanAgentComponent bytemanAgentComponent, String jarFileName) { File dataDir = bytemanAgentComponent.getResourceDataDirectory("jdbctrace"); dataDir.mkdirs(); File scriptFile = new File(dataDir, jarFileName); return scriptFile; } /** * Given the parent byteman agent resource where the JDBC tracer resource is hosted, * this will extract the helper jar file that contains classes needed by the rules. * The helper jar is persisted in a data directory which can then be loaded in the byteman agent VM. * * @param bytemanAgentComponent byteman agent resource * @param jarFileName the short name of the helper jar file * @return the extracted helper jar file * * @throws Exception */ public File extractHelperJarFile(BytemanAgentComponent bytemanAgentComponent, String jarFileName) throws Exception { // extract the helper jar from our plugin jar into our parent byteman component's data directory File helperFile = getHelperJarFile(bytemanAgentComponent, jarFileName); InputStream resourceAsStream = getClass().getResourceAsStream("/helper/" + jarFileName); if (resourceAsStream == null) { throw new Exception("Cannot find JDBC helper jar file from classloader"); } StreamUtil.copy(resourceAsStream, new FileOutputStream(helperFile), true); log.debug("Extracted helper jar file from plugin jar to [" + helperFile.getAbsolutePath() + "]"); return helperFile; } }