package de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization; /* This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures Copyright (C) 2013 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 . */ import java.util.Iterator; import java.util.LinkedList; import java.util.List; import de.lmu.ifi.dbs.elki.logging.LoggingUtil; import de.lmu.ifi.dbs.elki.utilities.optionhandling.NoParameterValueException; import de.lmu.ifi.dbs.elki.utilities.optionhandling.ParameterException; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Flag; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Parameter; /** * Manage a parameterization serialized as String array, e.g. from command line. * * When building parameter lists, use {@link ListParameterization} where possible. * * @author Erich Schubert */ public class SerializedParameterization extends AbstractParameterization { /** * Prefix of option markers on the command line. *

* The option markers are supposed to be given on the command line with * leading -. */ public static final String OPTION_PREFIX = "-"; /** * Parameter storage */ LinkedList parameters = null; /** * Constructor */ public SerializedParameterization() { super(); parameters = new LinkedList<>(); } /** * Constructor * * @param args Parameters */ public SerializedParameterization(String[] args) { this(); for (String arg : args) { parameters.add(arg); } } /** * Constructor * * @param args Parameter list */ public SerializedParameterization(List args) { this(); parameters.addAll(args); } /** * Return the yet unused parameters. * * @return Unused parameters. */ public List getRemainingParameters() { return parameters; } @Override public boolean hasUnusedParameters() { return (parameters.size() > 0); } /** * Log a warning if there were unused parameters. */ public void logUnusedParameters() { if(hasUnusedParameters()) { LoggingUtil.warning("The following parameters were not processed: " + parameters); } } @Override public boolean setValueForOption(Parameter opt) throws ParameterException { Iterator piter = parameters.iterator(); while(piter.hasNext()) { String cur = piter.next(); if(!cur.startsWith(OPTION_PREFIX)) { continue; // throw new NoParameterValueException(cur + " is no parameter!"); } // get the option without the option prefix - String noPrefixOption = cur.substring(OPTION_PREFIX.length()); if(opt.getName().equals(noPrefixOption)) { // Consume. piter.remove(); // check if the option is a parameter or a flag if(opt instanceof Flag) { String set = Flag.SET; // The next element must be a parameter if(piter.hasNext()) { String next = piter.next(); if(Flag.SET.equals(next)) { set = Flag.SET; piter.remove(); } else if(Flag.NOT_SET.equals(next)) { set = Flag.NOT_SET; piter.remove(); } else if(!next.startsWith(OPTION_PREFIX)) { throw new NoParameterValueException("Flag " + opt.getName() + " requires no parameter-value! " + "(read parameter-value: " + next + ")"); } // We do not consume the next if it's not for us ... } // set the Flag opt.setValue(set); return true; } else { // Ensure there is a potential value for this parameter if(!piter.hasNext()) { throw new NoParameterValueException("Parameter " + opt.getName() + " requires a parameter value!"); } opt.setValue(piter.next()); // Consume parameter piter.remove(); // Success - return. return true; } } } return false; } /** {@inheritDoc} * Default implementation, for flat parameterizations. */ @Override public Parameterization descend(Object option) { return this; } }