static JSParameters parseArgs()

in modules/jdktools/src/main/java/org/apache/harmony/tools/jarsigner/ArgParser.java [107:331]


    static JSParameters parseArgs(String[] args, JSParameters param)
            throws JarSignerException, IOException, KeyStoreException,
            UnrecoverableKeyException, NoSuchAlgorithmException {
        if (args == null){
            return null;
        }
        if (args.length == 0){
            return null;
        }
        if (param == null){
            param = new JSParameters();
        } else {
            // clean the param
            param.setDefault();
        }
        
        try {
            for (int i = 0; i < args.length; i++) {
                if (args[i].equalsIgnoreCase(sVerify)) {
                    param.setVerify(true);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sKeyStore)) {
                    param.setStoreURI(args[++i]);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sStoreType)) {
                    param.setStoreType(args[++i]);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sStorePass)) {
                    param.setStorePass(args[++i].toCharArray());
                    continue;
                }
                if (args[i].equalsIgnoreCase(sKeyPass)) {
                    param.setKeyPass(args[++i].toCharArray());
                    continue;
                }
                if (args[i].equalsIgnoreCase(sSigFile)) {
                    param.setSigFileName(args[++i]);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sSignedJAR)) {
                    param.setSignedJARName(args[++i]);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sCerts)) {
                    param.setCerts(true);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sVerbose)) {
                    param.setVerbose(true);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sSilent)) {
                    param.setSilent(true);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sInternalSF)) {
                    param.setInternalSF(true);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sSectionsOnly)) {
                    param.setSectionsOnly(true);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sProvider)) {
                    param.setProvider(args[++i]);
                    addProvider(args[i]);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sProviderName)) {
                    param.setProviderName(args[++i]);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sCertProvider)) {
                    param.setCertProvider(args[++i]);
                    addProvider(args[i]);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sCertProviderName)) {
                    param.setCertProviderName(args[++i]);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sSigProvider)) {
                    param.setSigProvider(args[++i]);
                    addProvider(args[i]);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sSigProviderName)) {
                    param.setSigProviderName(args[++i]);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sKSProvider)) {
                    param.setKsProvider(args[++i]);
                    addProvider(args[i]);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sKSProviderName)) {
                    param.setKsProviderName(args[++i]);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sMDProvider)) {
                    param.setMdProvider(args[++i]);
                    addProvider(args[i]);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sMDProviderName)) {
                    param.setMdProviderName(args[++i]);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sTSA)) {
                    try {
                        param.setTsaURI(new URI(args[++i]));
                    } catch (URISyntaxException e) {
                        throw new JarSignerException("Argument " + args[i]
                                + " is not an URI");
                    }
                    continue;
                }
                if (args[i].equalsIgnoreCase(sTSAcert)) {
                    param.setTsaCertAlias(args[++i]);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sProxy)) {
                    int colonPos = args[++i].lastIndexOf(':');
                    if (colonPos == -1) {
                        param.setProxy(args[i]);
                        continue;
                    } 

                    String proxy = args[i].substring(0, colonPos);
                    int port;
                    try {
                        port = Integer.parseInt(args[i].substring(colonPos + 1,
                                args[i].length()));
                    } catch (NumberFormatException e) {
                        throw new JarSignerException(
                                "Proxy port must be an integer value.");
                    }
                    param.setProxy(proxy);
                    param.setProxyPort(port);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sAltSigner)) {
                    param.setAltSigner(args[++i]);
                    continue;
                }
                if (args[i].equalsIgnoreCase(sAltSignerPath)) {
                    param.setAltSignerPath(args[++i]);
                    continue;
                }
                
                if ((param.isVerify() && i == args.length - 1)
                        || (!param.isVerify() && i == args.length - 2)) {
                    param.setJarURIorPath(args[i]);
                    continue;
                }
                if (!param.isVerify() && i == args.length - 1){
                    param.setAlias(args[i]);
                    continue;
                }
                
                System.out.println("Illegal option: " + args[i]);
                return null;
            }
        } catch(ArrayIndexOutOfBoundsException e){
            // ignore the last option if its value is not provided
        }
        
        // set specific provider names the same as the main provider name
        // if their values are not set.
        String providerName = param.getProviderName();
        if (providerName != null){
            if (param.getCertProviderName() == null){
                param.setCertProviderName(providerName);
            }
            if (param.getSigProviderName() == null){
                param.setSigProviderName(providerName);
            }
            if (param.getKsProviderName() == null){
                param.setKsProviderName(providerName);
            }
            if (param.getMdProviderName() == null){
                param.setMdProviderName(providerName);
            }
        }
        
        // if the store password is not given, prompt for it
        if (param.getStorePass() == null) {
            param.setStorePass(UserInteractor
                    .getDataFromUser("Enter keystore password:  "));
            // check the password
            param.getKeyStore();
        }
        
        if (param.getAlias() == null && !param.isVerify()) {
            param.setAlias(new String(UserInteractor
                    .getDataFromUser("Enter alias name:  ")));
        }
        if (!param.getKeyStore().containsAlias(param.getAlias())) {
            throw new JarSignerException("The alias " + param.getAlias()
                    + " does not exist in keystore");
        }
            
        // if key password is not given, try to inplace it with store password
        if (param.getKeyPass() == null) {
            param.setKeyPass(tryStorePassAsKeyPass(param.getKeyStore(), param
                    .getAlias(), param.getStorePass()));
        }

        // TODO: if decide to implement such abilities, remove this code
        if (param.isInternalSF() || param.isSectionsOnly()
                || param.getAltSigner() != null
                || param.getAltSignerPath() != null) {
            Logger.getLogger(JSParameters.loggerName).warning(
                    "Options " + sAltSigner + ", " + sAltSignerPath + ", "
                            + sInternalSF + ", " + sSectionsOnly
                            + " are currently ignored since they eliminate "
                            + "useful optimizations. ");
        }
        
        
        return param;
    }