diff options
Diffstat (limited to 'elki/src/main/java/de/lmu/ifi/dbs/elki/workflow/LoggingStep.java')
-rw-r--r-- | elki/src/main/java/de/lmu/ifi/dbs/elki/workflow/LoggingStep.java | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/workflow/LoggingStep.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/workflow/LoggingStep.java new file mode 100644 index 00000000..167f8c8b --- /dev/null +++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/workflow/LoggingStep.java @@ -0,0 +1,141 @@ +package de.lmu.ifi.dbs.elki.workflow; + +/* + This file is part of ELKI: + Environment for Developing KDD-Applications Supported by Index-Structures + + Copyright (C) 2015 + Ludwig-Maximilians-Universität München + Lehr- und Forschungseinheit für Datenbanksysteme + ELKI Development Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +import de.lmu.ifi.dbs.elki.application.AbstractApplication; +import de.lmu.ifi.dbs.elki.logging.Logging; +import de.lmu.ifi.dbs.elki.logging.Logging.Level; +import de.lmu.ifi.dbs.elki.logging.LoggingConfiguration; +import de.lmu.ifi.dbs.elki.utilities.exceptions.AbortException; +import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; +import de.lmu.ifi.dbs.elki.utilities.optionhandling.WrongParameterValueException; +import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization; +import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Flag; +import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.StringParameter; + +/** + * Pseudo-step to configure logging / verbose mode. + * + * @author Erich Schubert + * + * @apiviz.uses LoggingConfiguration + */ +public class LoggingStep implements WorkflowStep { + /** + * Logger + */ + private static final Logging LOG = Logging.getLogger(LoggingStep.class); + + /** + * Constructor. + * + * @param verbose Verbose flag + * @param levels Level settings array + */ + public LoggingStep(int verbose, String[][] levels) { + super(); + if (verbose <= 0) { + LoggingConfiguration.setVerbose(Level.WARNING); + } else if (verbose == 1) { + LoggingConfiguration.setVerbose(Level.VERBOSE); + } else if (verbose > 1) { + // Extra verbosity - do not call with "false" to not undo! + LoggingConfiguration.setVerbose(Level.VERYVERBOSE); + } + if (levels != null) { + for (String[] pair : levels) { + try { + if (pair.length == 1) { + // Try to parse as level: + try { + java.util.logging.Level level = Level.parse(pair[0]); + LoggingConfiguration.setDefaultLevel(level); + } catch (IllegalArgumentException e) { + LoggingConfiguration.setLevelFor(pair[0], Level.FINEST.getName()); + } + } else if (pair.length == 2) { + LoggingConfiguration.setLevelFor(pair[0], pair[1]); + } else { + throw new AbortException("Invalid logging settings"); + } + } catch (IllegalArgumentException e) { + LOG.warning("Invalid logging statement for package " + pair[0] + ": " + e.getMessage()); + } + } + } + } + + /** + * Parameterization class. + * + * @author Erich Schubert + * + * @apiviz.exclude + */ + public static class Parameterizer extends AbstractParameterizer { + /** + * Verbose mode. + */ + protected int verbose = 0; + + /** + * Enable logging levels manually + */ + protected String[][] levels = null; + + @Override + protected void makeOptions(Parameterization config) { + super.makeOptions(config); + final Flag verboseF = new Flag(AbstractApplication.Parameterizer.VERBOSE_ID); + if (config.grab(verboseF) && verboseF.isTrue()) { + verbose++; + final Flag verbose2F = new Flag(AbstractApplication.Parameterizer.VERBOSE_ID); + if (config.grab(verbose2F) && verbose2F.isTrue()) { + verbose++; + } + } + final StringParameter debugP = new StringParameter(AbstractApplication.Parameterizer.DEBUG_ID); + debugP.setOptional(true); + if (config.grab(debugP)) { + String[] opts = debugP.getValue().split(","); + levels = new String[opts.length][]; + int i = 0; + for (String opt : opts) { + String[] chunks = opt.split("="); + if (chunks.length != 1 && chunks.length != 2) { + config.reportError(new WrongParameterValueException(debugP, debugP.getValue(), "Invalid debug option.")); + break; + } + levels[i] = chunks; + i++; + } + } + } + + @Override + protected LoggingStep makeInstance() { + return new LoggingStep(verbose, levels); + } + } +} |