static KeytoolParameters parseArgs()

in modules/jretools/src/main/java/org/apache/harmony/jretools/keytool/ArgumentsParser.java [180:484]


    static KeytoolParameters parseArgs(String[] args)
            throws NumberFormatException, KeytoolException, IOException {
        if (args == null || args.length == 0) {
            return null;
        }
        KeytoolParameters param = new KeytoolParameters();

        // look for known options and get their values.
        try {
            for (int i = 0; i < args.length; i++) {

                // commands
                if (args[i].compareToIgnoreCase(sGenkey) == 0) {
                    param.setCommand(Command.GENKEY);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sSelfcert) == 0) {
                    param.setCommand(Command.SELFCERT);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sImport) == 0) {
                    param.setCommand(Command.IMPORT);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sExport) == 0) {
                    param.setCommand(Command.EXPORT);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sStorepasswd) == 0) {
                    param.setCommand(Command.STOREPASSWD);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sKeypasswd) == 0) {
                    param.setCommand(Command.KEYPASSWD);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sCertreq) == 0) {
                    param.setCommand(Command.CERTREQ);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sCheck) == 0) {
                    param.setCommand(Command.CHECK);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sConvert) == 0) {
                    param.setCommand(Command.CONVERT);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sVerify) == 0) {
                    param.setCommand(Command.VERIFY);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sPrintcert) == 0) {
                    param.setCommand(Command.PRINTCERT);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sKeyclone) == 0) {
                    param.setCommand(Command.KEYCLONE);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sDelete) == 0) {
                    param.setCommand(Command.DELETE);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sList) == 0) {
                    param.setCommand(Command.LIST);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sHelp) == 0) {
                    param.setCommand(Command.HELP);
                    if (args.length == i + 2){
                        param.setHelpTopic(args[++i]);
                    }
                    continue;
                }

                // additional options
                if (args[i].compareToIgnoreCase(sKeystore) == 0) {
                    param.setStorePath(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sStoretype) == 0) {
                    param.setStoreType(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sProvider) == 0) {
                    param.setProvider(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sCertProvider) == 0) {
                    param.setCertProvider(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sKeyProvider) == 0) {
                    param.setKeyProvider(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sMdProvider) == 0) {
                    param.setMdProvider(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sSigProvider) == 0) {
                    param.setSigProvider(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sKsProvider) == 0) {
                    param.setKsProvider(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sConvKsProvider) == 0) {
                    param.setConvKsProvider(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sAlias) == 0) {
                    param.setAlias(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sKeyalg) == 0) {
                    param.setKeyAlg(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sSigalg) == 0) {
                    param.setSigAlg(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sDname) == 0) {
                    param.setDName(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sFile) == 0) {
                    param.setFileName(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sIssuerAlias) == 0) {
                    param.setIssuerAlias(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sStorepass) == 0) {
                    param.setStorePass(args[++i].toCharArray());
                    continue;
                }
                if (args[i].compareToIgnoreCase(sKeypass) == 0) {
                    param.setKeyPass(args[++i].toCharArray());
                    continue;
                }
                if (args[i].compareToIgnoreCase(sIssuerPass) == 0) {
                    param.setIssuerPass(args[++i].toCharArray());
                    continue;
                }
                if (args[i].compareToIgnoreCase(sCRLfile) == 0) {
                    param.setCrlFile(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sDestAlias) == 0) {
                    param.setDestAlias(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sNew) == 0) {
                    param.setNewPasswd(args[++i].toCharArray());
                    continue;
                }
                if (args[i].compareToIgnoreCase(sConvStorePath) == 0) {
                    param.setConvertedKeyStorePath(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sConvStoreType) == 0) {
                    param.setConvertedKeyStoreType(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sConvStorePass) == 0) {
                    param.setConvertedKeyStorePass(args[++i].toCharArray());
                    continue;
                }
                if (args[i].compareToIgnoreCase(sCAcertsPath) == 0) {
                    param.setCacertsPath(args[++i]);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sCAcertsPass) == 0) {
                    param.setCacertsPass(args[++i].toCharArray());
                    continue;
                }
                if (args[i].compareToIgnoreCase(sKeysize) == 0) {

                    param.setKeySize((new Integer(args[++i])).intValue());
                    if (param.getKeySize() <= 0) {
                        throw new KeytoolException("Key size"
                                + " must be more than zero.");
                    }
                    continue;
                }
                if (args[i].compareToIgnoreCase(sValidity) == 0) {
                    param.setValidity((new Integer(args[++i])).intValue());
                    if (param.getValidity() <= 0) {
                        throw new KeytoolException("Validity"
                                + " must be more than zero.");
                    }
                    continue;
                }
                if (args[i].compareToIgnoreCase(sX509Version) == 0) {
                    param.setX509version((new Integer(args[++i])).intValue());
                    if (param.getX509version() < 1
                            || param.getX509version() > 3) {
                        throw new KeytoolException(
                                "Certificate version must be " + "1, 2 or 3");
                    }
                    continue;
                }
                if (args[i].compareToIgnoreCase(sCertSerial) == 0) {
                    param.setCertSerialNr((new Integer(args[++i])).intValue());
                    if (param.getCertSerialNr() <= 0) {
                        throw new KeytoolException("Certificate serial number"
                                + " must be more than zero.");
                    }
                    continue;
                }

                // flags
                if (args[i].compareToIgnoreCase(sNoprompt) == 0) {
                    param.setNoPrompt(true);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sTrustcacerts) == 0) {
                    param.setTrustCACerts(true);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sRfc) == 0) {
                    param.setRfc(true);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sV) == 0) {
                    param.setVerbose(true);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sSecretkey) == 0) {
                    param.setSecretKey(true);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sCA) == 0) {
                    param.setCA(true);
                    continue;
                }
                if (args[i].compareToIgnoreCase(sConvKeyEntries) == 0) {
                    param.setConvertKeyEntries(true);
                    continue;
                }

                System.out.println("Illegal option: " + args[i]);
                return null;
            }
        } catch (ArrayIndexOutOfBoundsException e) {
            // ignore the last option if its value is not provided
        }

        Command cmd = param.getCommand();

        // check whether -v and -rfc options are used separately with -list.
        if (cmd == Command.LIST && param.isRfc() && param.isVerbose()) {
            throw new KeytoolException("There must not be both -v and -rfc "
                    + "options specified");
        }

        // skip the store password setting if -printcert or -help commands were
        // given.
        if (cmd == Command.PRINTCERT || cmd == Command.HELP) {
            return param;
        }

        // if the store password has not been entered, prompt for it
        if (param.getStorePass() == null) {
            // get path to the store
            String storePath = (param.getStorePath() != null) ? param
                    .getStorePath() : KeytoolParameters.defaultKeystorePath;
            // get store password
            String prompt = "Enter keystore password: ";
            System.out.print(prompt);
            charsRead = in.read(readData);
            char[] storePass;
            File storeFile = new File(storePath);
            if (storeFile.isDirectory()) {
                throw new KeytoolException("The keystore path " + storePath
                        + " points to a directory.");
            }
            // Allow short passwords to unlock existing stores and
            // disallow passwords shorter than minPwdLength symbols for new
            // ones.
            // Check whether the file exists
            if (!storeFile.exists()) {
                // check of password length and additional prompts for
                // password are made here
                storePass = promptLongerPassword(prompt);
            } else {
                // if the store exists don't check the length
                storePass = new char[charsRead - newLineLength];// remove "\r\n"
                System.arraycopy(readData, 0, storePass, 0, charsRead
                        - newLineLength);
            }
            if (storePass.length != 0) {
                param.setStorePass(storePass);
            } else {
                param.setStorePass(null);
            }
        }

        return param;
    }