Java tutorial
/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library 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 * Lesser General Public License for more details. */ package org.geotools.utils.progress; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.media.jai.JAI; import javax.media.jai.TileCache; import org.apache.commons.cli2.CommandLine; import org.apache.commons.cli2.Group; import org.apache.commons.cli2.Option; import org.apache.commons.cli2.builder.ArgumentBuilder; import org.apache.commons.cli2.builder.DefaultOptionBuilder; import org.apache.commons.cli2.commandline.Parser; import org.apache.commons.cli2.option.GroupImpl; import org.apache.commons.cli2.util.HelpFormatter; import org.geotools.utils.CoverageToolsConstants; /** * @author Simone Giannecchini, GeoSolutions. * * * * * * @source $URL$ */ public abstract class BaseArgumentsManager extends ProgressManager { /** * Default priority for the underlying {@link Thread}. */ public static final int DEFAULT_PRIORITY = Thread.NORM_PRIORITY; private final static Logger LOGGER = org.geotools.util.logging.Logging .getLogger(BaseArgumentsManager.class.toString()); /** * Options for the command line. */ private final List<Option> cmdOpts = Collections.synchronizedList(new ArrayList<Option>()); private final Parser cmdParser = new Parser(); protected final ArgumentBuilder argumentBuilder = new ArgumentBuilder(); protected final DefaultOptionBuilder optionBuilder = new DefaultOptionBuilder(); private Group optionsGroup; private CommandLine cmdLine; private final Option helpOpt; private final Option priorityOpt; private final Option versionOpt; /** Commons-cli option for the tile cache size to use. */ private final Option tileCacheSizeOpt; /** Default tile cache size. */ private long tileCacheSize = CoverageToolsConstants.DEFAULT_TILE_CACHE_SIZE; private TileCache tileCache; /** * Default priority for the underlying {@link Thread}. */ private int priority = DEFAULT_PRIORITY; private String toolName; private String version; /** ImageIO caching behvaiour controller. */ private boolean useImageIOCache = CoverageToolsConstants.DEFAULT_IMAGEIO_CACHING_BEHAVIOUR; /** * */ public BaseArgumentsManager(final String name, final String version) { super(); toolName = name; this.version = version; versionOpt = optionBuilder.withShortName("v").withLongName("versionOpt") .withDescription("print the versionOpt.").create(); helpOpt = optionBuilder.withShortName("h").withShortName("?").withLongName("helpOpt") .withDescription("print this message.").create(); tileCacheSizeOpt = optionBuilder.withShortName("c").withLongName("cache_size") .withArgument(argumentBuilder.withName("c").withMinimum(0).withMaximum(1).create()) .withDescription("tile cache size").withRequired(false).create(); priorityOpt = optionBuilder.withShortName("p").withLongName("thread_priority") .withArgument(argumentBuilder.withName("priority").withMinimum(0).withMaximum(1).create()) .withDescription("priority for the underlying thread").withRequired(false).create(); cmdOpts.add(versionOpt); cmdOpts.add(helpOpt); cmdOpts.add(tileCacheSizeOpt); cmdOpts.add(priorityOpt); } protected void addOption(Option opt) { if (cmdLine != null) throw new IllegalStateException(); synchronized (cmdOpts) { cmdOpts.add(opt); } } protected boolean removeOption(Option opt) { if (cmdLine != null) throw new IllegalStateException(); synchronized (cmdOpts) { return cmdOpts.remove(opt); } } protected boolean removeOptions(List<Option> opts) { if (cmdLine != null) throw new IllegalStateException(); synchronized (cmdOpts) { return cmdOpts.remove(opts); } } protected void addOptions(List<Option> opts) { if (cmdLine != null) throw new IllegalStateException(); synchronized (cmdOpts) { cmdOpts.addAll(opts); } } protected void finishInitialization() { // ///////////////////////////////////////////////////////////////////// // // Help Formatter // // ///////////////////////////////////////////////////////////////////// final HelpFormatter cmdHlp = new HelpFormatter("| ", " ", " |", 75); cmdHlp.setShellCommand(getToolName()); cmdHlp.setHeader("Help"); cmdHlp.setFooter(new StringBuffer(getToolName() + " - GeoSolutions S.a.s (C) 2006 - v ") .append(getVersion()).toString()); cmdHlp.setDivider("|-------------------------------------------------------------------------|"); // ///////////////////////////////////////////////////////////////////// // // Close Parser // // ///////////////////////////////////////////////////////////////////// optionsGroup = new GroupImpl(cmdOpts, "Options", "All the options", 1, cmdOpts.size()); cmdParser.setGroup(optionsGroup); cmdParser.setHelpOption(helpOpt); cmdParser.setHelpFormatter(cmdHlp); } public boolean parseArgs(String[] args) { cmdLine = cmdParser.parseAndHelp(args); if (cmdLine == null) return false; if (cmdLine.hasOption(versionOpt)) { System.out.print(new StringBuffer(getToolName()).append(" - GeoSolutions S.a.s (C) 2006 - v") .append(getVersion()).toString()); System.exit(0); } // // // // Tile cache size // // // // index name if (cmdLine.hasOption(tileCacheSizeOpt)) try { tileCacheSize = Integer.parseInt((String) cmdLine.getValue(tileCacheSizeOpt)); } catch (Throwable e) { LOGGER.log(Level.SEVERE, e.getLocalizedMessage(), e); return false; } // // // // Thread priority // // // // index name if (cmdLine.hasOption(priorityOpt)) try { priority = Integer.parseInt((String) cmdLine.getValue(priorityOpt)); } catch (Throwable e) { LOGGER.log(Level.SEVERE, e.getLocalizedMessage(), e); return false; } setJAIHints(); return true; } public boolean hasOption(Option opt) { if (cmdLine == null) throw new IllegalStateException(); return this.cmdLine.hasOption(opt); } public boolean hasOption(String optName) { if (cmdLine == null) throw new IllegalStateException(); return this.cmdLine.hasOption(optName); } public Object getOptionValue(Option opt) { if (cmdLine == null) throw new IllegalStateException(); return this.cmdLine.getValue(opt); } public Object getOptionValue(String optName) { if (cmdLine == null) throw new IllegalStateException(); return this.cmdLine.getValue(optName); } public int getPriority() { return priority; } public long getTileCacheSize() { return tileCacheSize; } public String getToolName() { return toolName; } public String getVersion() { return version; } public void setUseImageIOCache(boolean useImageIOCache) { this.useImageIOCache = useImageIOCache; } /** * * This method is a utlity method for setting various JAi wide hints we will * use here and afterwards. * * */ private void setJAIHints() { // // // // JAI cache fine tuning // // // final JAI jaiDef = JAI.getDefaultInstance(); // setting the tile cache final TileCache cache = jaiDef.getTileCache(); cache.setMemoryCapacity(tileCacheSize * 1024 * 1024); // // // Imageio caching behaviour in case it is ever needed. // // ImageIO.setUseCache(useImageIOCache); } public boolean isUseImageIOCache() { return useImageIOCache; } public void setTileCacheSize(long tileCacheSize) { this.tileCacheSize = tileCacheSize; } public void setPriority(int priority) { this.priority = priority; } public TileCache getTileCache() { return tileCache; } public void setTileCache(TileCache tileCache) { this.tileCache = tileCache; } }