package org.intrace.agent; import java.util.Arrays; import java.util.HashMap; import java.util.Locale; import java.util.Map; import org.intrace.output.trace.TraceHandler; import org.intrace.shared.AgentConfigConstants; /** * Args Format: "[arg1[arg2[arg3" * * where argx is of the form value-parameter */ public class AgentSettings implements VerboseLogger { // Static settings which control agent startup private int serverPort = 9123; private int callbackPort = -1; private boolean waitStart = false; // Static state private int actualServerPort = -1; // Dynamic settings private InstrCriteria classesToInclude = null; public InstrCriteria getClassesToInclude() { return classesToInclude; } public InstrCriteria getClassesToExclude() { return classesToExclude; } private InstrCriteria classesToExclude = null; private boolean instruEnabled = true; private boolean saveTracedClassfiles = false; private boolean verboseMode = false; public AgentSettings(AgentSettings oldInstance) { // Copy all static state and dynamic settings actualServerPort = oldInstance.getActualServerPort(); this.classesToInclude = oldInstance.classesToInclude; this.classesToExclude = oldInstance.classesToExclude; instruEnabled = oldInstance.isInstrumentationEnabled(); saveTracedClassfiles = oldInstance.saveTracedClassfiles(); verboseMode = oldInstance.isVerboseMode(); } public AgentSettings(String args) { parseArgs(args); } public void parseArgs(String args) { String[] seperateArgs = args.split("\\["); for (int ii = 0; ii < seperateArgs.length; ii++) { parseArg("[" + seperateArgs[ii]); } } private void parseArg(String arg) { if (arg.toLowerCase(Locale.ROOT).equals(AgentConfigConstants.VERBOSE_MODE + "true")) { verboseMode = true; } else if (arg.toLowerCase(Locale.ROOT).equals( AgentConfigConstants.VERBOSE_MODE + "false")) { verboseMode = false; } else if (arg.toLowerCase(Locale.ROOT).startsWith(AgentConfigConstants.OPT_SERVER_PORT)) { String serverPortStr = arg.replace(AgentConfigConstants.OPT_SERVER_PORT, ""); serverPort = Integer.parseInt(serverPortStr); } else if (arg.toLowerCase(Locale.ROOT).startsWith(AgentConfigConstants.CALLBACK_PORT)) { String callbackPortStr = arg.replace(AgentConfigConstants.CALLBACK_PORT, ""); callbackPort = Integer.parseInt(callbackPortStr); } else if (arg.toLowerCase(Locale.ROOT).equals( AgentConfigConstants.INSTRU_ENABLED + "true")) { instruEnabled = true; } else if (arg.toLowerCase(Locale.ROOT).equals( AgentConfigConstants.INSTRU_ENABLED + "false")) { instruEnabled = false; } else if (arg.toLowerCase(Locale.ROOT) .equals(AgentConfigConstants.SAVE_TRACED_CLASSFILES + "true")) { saveTracedClassfiles = true; } else if (arg.toLowerCase(Locale.ROOT) .equals(AgentConfigConstants.SAVE_TRACED_CLASSFILES + "false")) { saveTracedClassfiles = false; } else if (arg.toLowerCase(Locale.ROOT) .equals(AgentConfigConstants.START_WAIT)) { waitStart = true; } else if (arg.toLowerCase(Locale.ROOT).equals(AgentConfigConstants.START_ACTIVATE)) { waitStart = false; } else if (arg.startsWith(AgentConfigConstants.CLASS_REGEX)) { String classRegexStr = arg.replace(AgentConfigConstants.CLASS_REGEX, ""); this.classesToInclude = new InstrCriteria(classRegexStr); this.classesToInclude.verboseLogger = this; } else if (arg.startsWith(AgentConfigConstants.EXCLUDE_CLASS_REGEX)) { String classExcludeRegexStr = arg .replace( AgentConfigConstants.EXCLUDE_CLASS_REGEX, ""); this.classesToExclude = new InstrCriteria(classExcludeRegexStr); this.classesToExclude.verboseLogger = this; } } public boolean isWaitStart() { return waitStart; } public int getActualServerPort() { return actualServerPort; } public void setActualServerPort(int xiActualServerPort) { actualServerPort = xiActualServerPort; } public int getServerPort() { return serverPort; } public int getCallbackPort() { return callbackPort; } public String[] getClassRegex() { String[] rc = {}; if (this.classesToInclude!=null) rc = this.classesToInclude.getClassRegex(); return rc; } public String[] getExcludeClassRegex() { String[] rc = {}; if (this.classesToExclude!=null) rc = this.classesToInclude.getClassRegex(); return rc; } public boolean isInstrumentationEnabled() { return instruEnabled; } public boolean saveTracedClassfiles() { return saveTracedClassfiles; } public boolean isVerboseMode() { return verboseMode; } @Override public String toString() { // Output key settings String currentSettings = ""; String includeString = ""; if (this.classesToInclude != null) includeString = this.classesToInclude.toString(); currentSettings += "Include Class Regex : " + includeString + "\n"; String excludeString = ""; if (this.classesToExclude != null) excludeString = this.classesToExclude.toString(); currentSettings += "Exclude Class Regex : " + excludeString + "\n"; currentSettings += "Tracing Enabled : " + instruEnabled + "\n"; currentSettings += "Save Traced Class Files : " + saveTracedClassfiles + "\n"; return currentSettings; } public Map<String, String> getSettingsMap() { Map<String, String> settingsMap = new HashMap<String, String>(); settingsMap.put(AgentConfigConstants.INSTRU_ENABLED, Boolean.toString(instruEnabled)); String includeSettings = ""; if (this.classesToInclude!=null) { includeSettings = this.classesToInclude.toString(); } settingsMap.put(AgentConfigConstants.CLASS_REGEX, includeSettings); String excludeSettings = ""; if (this.classesToExclude!=null) { includeSettings = this.classesToExclude.toString(); } settingsMap.put(AgentConfigConstants.EXCLUDE_CLASS_REGEX, excludeSettings); settingsMap.put(AgentConfigConstants.VERBOSE_MODE, Boolean.toString(verboseMode)); settingsMap.put(AgentConfigConstants.SAVE_TRACED_CLASSFILES, Boolean.toString(saveTracedClassfiles)); settingsMap.put(AgentConfigConstants.SERVER_PORT, Integer.toString(actualServerPort)); settingsMap.put(AgentConfigConstants.START_WAIT, Boolean.toString(waitStart)); return settingsMap; } public void logVerbose(String v) { if (isVerboseMode()) { TraceHandler.INSTANCE.writeTraceOutput("DEBUG: " + v); } } }