/* * Copyright 2006 Google Inc. * * 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 com.google.gwt.util.tools; import com.google.gwt.dev.util.Empty; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; /** * Argument handler for boolean flags that have no parameters. * * Supports toggling the boolean value on and off using -label and -nolabel tag variants and * calculating a meaningful purpose including default value. */ public abstract class ArgHandlerFlag extends ArgHandler { private Map<String, Boolean> valuesByTag; protected void addTagValue(String tag, boolean value) { initValuesByTag(); valuesByTag.put(tag, value); } /** * Returns the default value that will appear in help messages. */ public abstract boolean getDefaultValue(); @Override public String getHelpTag() { return "-" + (isExperimental() ? "X" : "") + "[no]" + getLabel(); } /** * The root String that will be munged into -label and -nolabel variants for flag value toggling. * Should follow the verb[Adjective]Noun naming pattern. For example: * * @Override * public String getLabel() { * return "allowMissingSrc"; * } */ public String getLabel() { return ""; } @Override public final String getPurpose() { return (isExperimental() ? "EXPERIMENTAL: " : "") + getPurposeSnippet() + " " + "(defaults to " + (getDefaultValue() ? "ON" : "OFF") + ")"; } /** * Returns a description that will be mixed together with default value to come up with the * overall flag purpose. */ public abstract String getPurposeSnippet(); /** * The primary tag matched by this argument handler. */ @Override public final String getTag() { String label = getLabel(); if (label == "") { return ""; } return "-" + (isExperimental() ? "X" : "") + label; } @Override public String[] getTagArgs() { return Empty.STRINGS; } @Override public final String[] getTags() { initValuesByTag(); Set<String> tags = valuesByTag.keySet(); return tags.toArray(new String[tags.size()]); } // @VisibleForTesting boolean getValueByTag(String tag) { initValuesByTag(); return valuesByTag.get(tag); } @Override public int handle(String[] args, int startIndex) { String tag = args[startIndex]; Boolean value = getValueByTag(tag); return setFlag(value) ? 0 : 1; } private void initValuesByTag() { if (valuesByTag != null) { return; } valuesByTag = new LinkedHashMap<String, Boolean>(); valuesByTag.put("-" + (isExperimental() ? "X" : "") + getLabel(), true); valuesByTag.put("-" + (isExperimental() ? "X" : "") + "no" + getLabel(), false); } @Override public boolean isRequired() { return false; } /** * Takes the explicitly provided value and propagates it into whatever option settings this flag * controls. * * @param value the new value for the flag. * @return whether the assignment was valid. */ public abstract boolean setFlag(boolean value); }