/* * SmithArgs: the arguments parser of Smith * Copyright (C) 2007 Federico Fissore * * 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 it.fridrik.agent; import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; /** * SmithArgs takes care about the parameters you use to start Smith, parsing and * making them available with some getters * * @author Federico Fissore (federico@fissore.org) * @since 1.0 */ public class SmithArgs { private static final String KEY_CLASSES = "classes"; private static final String KEY_JARS = "jars"; private static final String KEY_PERIOD = "period"; private static final String KEY_LOG_LEVEL = "loglevel"; private String classFolder; private String jarFolder; private int period; private Level logLevel; private SmithArgs() { this.classFolder = null; this.jarFolder = null; this.period = -1; this.logLevel = Level.WARNING; } public SmithArgs(String agentArgs) { this(); if (agentArgs != null && agentArgs.length() > 0) { if (agentArgs.indexOf("=") != -1) { initWithNamedArgs(agentArgs); } else { initOldArgs(agentArgs); } } } public SmithArgs(String classFolder, String jarFolder, int period, String logLevel) { this(); setClassFolder(classFolder); setJarFolder(jarFolder); setLogLevel(logLevel); this.period = period; } public String getClassFolder() { return classFolder; } public String getJarFolder() { return jarFolder; } public Level getLogLevel() { return logLevel; } public int getPeriod() { return period; } private void initOldArgs(String agentArgs) { String[] args = agentArgs.split(","); setClassFolder(args[0]); if (args.length > 1) { setJarFolder(args[1]); } if (args.length > 2) { setPeriod(args[2]); } if (args.length > 3) { setLogLevel(args[3]); } } private void initWithNamedArgs(String agentArgs) { String[] args = agentArgs.split(","); Map<String, String> argsMap = new HashMap<String, String>(); for (String s : args) { String[] param = s.split("="); argsMap.put(param[0].trim(), param[1]); } if (argsMap.containsKey(KEY_CLASSES)) { setClassFolder(argsMap.get(KEY_CLASSES)); } if (argsMap.containsKey(KEY_JARS)) { setJarFolder(argsMap.get(KEY_JARS)); } if (argsMap.containsKey(KEY_PERIOD)) { setPeriod(argsMap.get(KEY_PERIOD)); } if (argsMap.containsKey(KEY_LOG_LEVEL)) { setLogLevel(argsMap.get(KEY_LOG_LEVEL)); } } public boolean isValid() { return classFolder != null; } private void setClassFolder(String classFolder) { this.classFolder = parseFolderPath(classFolder); } private void setJarFolder(String jarFolder) { this.jarFolder = parseFolderPath(jarFolder); } private void setLogLevel(String logLevel) { try { this.logLevel = Level.parse(logLevel.trim()); } catch (Exception e) { this.logLevel = Level.WARNING; } } private void setPeriod(String period) { try { this.period = Integer.parseInt(period.trim()); } catch (NumberFormatException e) { this.period = -1; } } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(KEY_CLASSES).append("=").append(classFolder); if (jarFolder != null) { sb.append(",").append(KEY_JARS).append("=").append(jarFolder); } sb.append(",").append(KEY_PERIOD).append("=").append(period); sb.append(",").append(KEY_LOG_LEVEL).append("=") .append(logLevel.toString()); return sb.toString(); } private static String parseFolderPath(String folder) { if (folder != null) { String trimmed = folder.trim(); return trimmed.endsWith(File.separator) ? trimmed : trimmed + File.separator; } return null; } }