/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.sun.jini.system;
import java.io.*;
/**
* <code>CommandLine</code> is a base class for command line parsing
* classes. It provides several useful methods for the implementor
* of the subclass and for the programmer. It also defines exceptions
* that can be generated during parsing commands.
* <p>
* <code>CommandLine</code> provides you several methods to get input
* streams from the command line. If these do not suffice for your
* particular needs, you can get the argument as a <code>String</code>
* and do your own processing.
* <p>
* You can use these methods to parse your own operand arguments. For
* example, if your operands are integers, you may want to use
* <code>parseInt</code> to parse them to provide consistency to the
* user.
*
* @author Sun Microsystems, Inc.
*
* @see POSIXCommandLine
* @see MultiCommandLine
*/
public abstract class CommandLine {
/**
* Return the result of parsing the given string from the command
* line. If <code>str</code> is <code>null</code>, return
* <code>defaultValue</code>.
*/
public static String parseString(String str, String defaultValue) {
return (str != null ? str : defaultValue);
}
/**
* Return the result of parsing the given <code>int</code> from the
* command line. If <code>str</code> is <code>null</code>, return
* <code>defaultValue</code>. The value is parsed using to
* understand leading <code>0x</code> or <code>#</code> to
* introduce a hexidecimal number, leading <code>0</code> to
* introduce an octal number, and anything else to be a decimal
* number.
*/
public static int parseInt(String str, int defaultValue)
throws NumberFormatException
{
if (str == null)
return defaultValue;
if (str.startsWith("0x"))
return Integer.parseInt(str.substring(2), 16);
else if (str.startsWith("#"))
return Integer.parseInt(str.substring(1), 16);
else if (str.startsWith("0"))
return Integer.parseInt(str.substring(1), 8);
return Integer.parseInt(str);
}
/**
* Return the result of parsing the given <code>long</code> from
* the command line. If <code>str</code> is <code>null</code>,
* return <code>defaultValue</code>. The value is parsed using to
* understand leading <code>0x</code> or <code>#</code> to
* introduce a hexidecimal number, leading <code>0</code> to
* introduce an octal number, and anything else to be a decimal
* number.
*/
public static long parseLong(String str, long defaultValue)
throws NumberFormatException
{
if (str == null)
return defaultValue;
if (str.startsWith("0x"))
return Long.parseLong(str.substring(2), 16);
else if (str.startsWith("#"))
return Long.parseLong(str.substring(1), 16);
else if (str.startsWith("0"))
return Long.parseLong(str.substring(1), 8);
return Long.parseLong(str);
}
/**
* Return the result of parsing the given <code>double</code> from
* the command line. If <code>str</code> is <code>null</code>,
* return <code>defaultValue</code>. The value is parsed using
* <code>Double.value</code>.
*/
public static double parseDouble(String str, double defaultValue)
throws NumberFormatException
{
if (str == null)
return defaultValue;
return new Double(str).doubleValue();
}
/**
* Return a <code>Writer</code> that is the result of creating a
* new <code>FileWriter</code> object for the file named by the
* given <code>path</code>. If the argument is `<code>-</code>' then
* an <code>OutputStreamWriter</code> for <code>System.out</code>
* is returned. If <code>path</code> is <code>null</code>, return
* <code>defaultValue</code>.
*/
public static Writer parseWriter(String path, Writer defaultValue)
throws IOException
{
if (path == null)
return defaultValue;
if (path.equals("-"))
return new OutputStreamWriter(System.out);
return new FileWriter(path);
}
/**
* Return a <code>Writer</code> that is the result of creating a
* new <code>FileWriter</code> object for the file named by the
* given <code>path</code>. If the argument is `<code>-</code>' then
* an <code>OutputStreamWriter</code> for <code>System.out</code>
* is returned. If <code>path</code> is <code>null</code>, the
* string <code>path</code> is used as the file name.
*/
public static Writer parseWriter(String path, String defaultPath)
throws IOException
{
if (path == null)
path = defaultPath;
if (path.equals("-"))
return new OutputStreamWriter(System.out);
return new FileWriter(path);
}
/**
* Return a <code>Reader</code> that is the result of creating a
* new <code>FileReader</code> object for the file named by the
* given <code>path</code>. If the argument is `<code>-</code>' then
* an <code>InputStreamReader</code> for <code>System.in</code> is
* returned. If <code>path</code> is <code>null</code>, return
* <code>defaultValue</code>.
*/
public static Reader parseReader(String path, Reader defaultValue)
throws IOException
{
if (path == null)
return defaultValue;
if (path.equals("-"))
return new InputStreamReader(System.in);
return new FileReader(path);
}
/**
* Return a <code>Reader</code> that is the result of creating a
* new <code>FileReader</code> object for the file named by the
* given <code>path</code>. If the argument is `<code>-</code>' then
* an <code>InputStreamReader</code> for <code>System.in</code> is
* returned. If <code>path</code> is <code>null</code>, the string
* <code>path</code> is used as the file name.
*/
public static Reader parseReader(String path, String defaultPath)
throws IOException
{
if (path == null)
path = defaultPath;
if (path.equals("-"))
return new InputStreamReader(System.in);
return new FileReader(path);
}
/**
* Return a <code>OutputStream</code> that is the result of
* creating a new <code>FileOutputStream</code> object for the file
* named by the given <code>path</code>. If the argument is
* `<code>-</code>' then <code>System.out</code> is returned. If
* <code>path</code> is <code>null</code>, return
* <code>defaultValue</code>.
*/
public static OutputStream
parseOutputStream(String path, OutputStream defaultValue)
throws IOException
{
if (path == null)
return defaultValue;
if (path.equals("-"))
return System.out;
return new FileOutputStream(path);
}
/**
* Return a <code>InputStream</code> that is the result of creating
* a new <code>FileInputStream</code> object for the file named by
* the given <code>path</code>. If the argument is `<code>-</code>'
* then <code>System.in</code> is returned. If <code>path</code>
* is <code>null</code>, the string <code>path</code> is used as
* the file name.
*/
public static OutputStream
parseOutputStream(String path, String defaultPath)
throws IOException
{
if (path == null)
path = defaultPath;
if (path.equals("-"))
return System.out;
return new FileOutputStream(path);
}
/**
* Return a <code>InputStream</code> that is the result of creating
* a new <code>FileInputStream</code> object for the file named by
* the given <code>path</code>. If the argument is `<code>-</code>'
* then <code>System.in</code> is returned. If <code>path</code>
* is <code>null</code>, return <code>defaultValue</code>.
*/
public static InputStream
parseInputStream(String path, InputStream defaultValue)
throws IOException
{
if (path == null)
return defaultValue;
if (path.equals("-"))
return System.in;
return new FileInputStream(path);
}
/**
* Return a <code>InputStream</code> that is the result of creating
* a new <code>FileInputStream</code> object for the file named by
* the given <code>path</code>. If the argument is `<code>-</code>'
* then <code>System.in</code> is returned. If <code>path</code>
* is <code>null</code>, the string <code>path</code> is used as
* the file name.
*/
public static InputStream parseInputStream(String path, String defaultPath)
throws IOException
{
if (path == null)
path = defaultPath;
if (path.equals("-"))
return System.in;
return new FileInputStream(path);
}
/**
* Return a <code>RandomAccessFile</code> that is the result of
* creating a new <code>RandomAccessFile</code> object for the file
* named by the given <code>path</code>, using the given
* <code>mode</code>. If <code>path</code> is <code>null</code>,
* return <code>defaultValue</code>.
*/
public static RandomAccessFile
parseRandomAccessFile(String path, RandomAccessFile defaultValue,
String mode)
throws IOException
{
if (path == null)
return defaultValue;
return new RandomAccessFile(path, mode);
}
/**
* Return a <code>RandomAccessFile</code> that is the result of
* creating a new <code>RandomAccessFile</code> object for the file
* named by the given <code>path</code>, using the given
* <code>mode</code>. If <code>path</code> is <code>null</code>,
* the string <code>path</code> is used as the file name.
*/
public static RandomAccessFile
parseRandomAccessFile(String path, String defaultPath, String mode)
throws IOException
{
if (path == null)
path = defaultPath;
return new RandomAccessFile(path, mode);
}
/**
* Signal that the programmer has invoked a method out of order.
* The specific errors that generate this exception are defined
* by subclasses.
*/
public static class ProgrammingException extends RuntimeException {
static final long serialVersionUID = 2401745757311140184L;
/** Create an exception with the given detail string. */
public ProgrammingException(String str) {
super(str);
}
}
/**
* Signal that the user specified an option in an improper way.
* The most common errors are not providing an argument to an
* option that needed one or specifying an unknown option.
*/
public static class BadInvocationException extends Exception {
static final long serialVersionUID = 4503820475450471907L;
/** Create an "Argument required" exception for the given option. */
public BadInvocationException(Object opt) {
super("Argument required for '" + opt + "'");
}
/** Create an exception with the given detail string. */
public BadInvocationException(String str) {
super(str);
}
}
/**
* Signal that this was a "help only" invocation. The program is
* expected to catch this and simply exit successfully.
*/
public static class HelpOnlyException extends Exception {
static final long serialVersionUID = -8973201446772368025L;
/**
* Create a new <code>HelpOnlyException</code> with a descriptive
* string.
*/
public HelpOnlyException() {
super("User only asked for help");
}
}
}