public void execute()

in nbm-maven-plugin/src/main/java/org/apache/netbeans/nbm/CreateWebstartAppMojo.java [204:556]


    public void execute()
            throws MojoExecutionException, MojoFailureException {
        if (!"nbm-application".equals(project.getPackaging())) {
            throw new MojoExecutionException(
                    "This goal only makes sense on project with nbm-application packaging.");
        }
        Project antProject = antProject();

        getLog().warn(
                "WARNING: Unsigned and self-signed WebStart applications are deprecated from JDK7u21 onwards. "
                + "To ensure future correct functionality please use trusted certificate.");

        if (keystore != null && keystorealias != null && keystorepassword != null) {
            File ks = new File(keystore);
            if (!ks.exists()) {
                throw new MojoFailureException("Cannot find keystore file at " + ks.getAbsolutePath());
            } else {
                //proceed..
            }
        } else if (keystore != null || keystorepassword != null || keystorealias != null) {
            throw new MojoFailureException("If you want to sign the jnlp application, "
                    + "you need to define all three keystore related parameters.");
        } else {
            File generatedKeystore = new File(outputDirectory, "generated.keystore");
            if (!generatedKeystore.exists()) {
                getLog().warn("Keystore related parameters not set, generating a default keystore.");
                GenerateKey genTask = (GenerateKey) antProject.createTask("genkey");
                genTask.setAlias("jnlp");
                genTask.setStorepass("netbeans");
                genTask.setDname("CN=" + System.getProperty("user.name"));
                genTask.setKeystore(generatedKeystore.getAbsolutePath());
                genTask.execute();
            }
            keystore = generatedKeystore.getAbsolutePath();
            keystorepassword = "netbeans";
            keystorealias = "jnlp";
        }

        Taskdef taskdef = (Taskdef) antProject.createTask("taskdef");
        taskdef.setClassname("org.netbeans.nbbuild.MakeJNLP");
        taskdef.setName("makejnlp");
        taskdef.execute();

        taskdef = (Taskdef) antProject.createTask("taskdef");
        taskdef.setClassname("org.netbeans.nbbuild.VerifyJNLP");
        taskdef.setName("verifyjnlp");
        taskdef.execute();

        try {
            File webstartBuildDir = new File(
                    outputDirectory + File.separator + "webstart" + File.separator + brandingToken);
            if (webstartBuildDir.exists()) {
                FileUtils.deleteDirectory(webstartBuildDir);
            }
            webstartBuildDir.mkdirs();
            final String localCodebase = codebase != null ? codebase : webstartBuildDir.toURI().toString();
            getLog().info("Generating webstartable binaries at " + webstartBuildDir.getAbsolutePath());

            File nbmBuildDirFile = new File(outputDirectory, brandingToken);

//            FileUtils.copyDirectoryStructureIfModified( nbmBuildDirFile, webstartBuildDir );
            MakeJNLP jnlpTask = (MakeJNLP) antProject.createTask("makejnlp");
            jnlpTask.setDir(webstartBuildDir);
            jnlpTask.setCodebase(localCodebase);
            //TODO, how to figure verify excludes..
            jnlpTask.setVerify(false);
            jnlpTask.setPermissions("<security><all-permissions/></security>");
            jnlpTask.setSignJars(true);

            jnlpTask.setAlias(keystorealias);
            jnlpTask.setKeystore(keystore);
            jnlpTask.setStorePass(keystorepassword);
            if (keystoretype != null) {
                jnlpTask.setStoreType(keystoretype);
            }
            jnlpTask.setProcessJarVersions(processJarVersions);

            FileSet fs = jnlpTask.createModules();
            fs.setDir(nbmBuildDirFile);
            OrSelector or = new OrSelector();
            AndSelector and = new AndSelector();
            FilenameSelector inc = new FilenameSelector();
            inc.setName("*/modules/**/*.jar");
            or.addFilename(inc);
            inc = new FilenameSelector();
            inc.setName("*/lib/**/*.jar");
            or.addFilename(inc);
            inc = new FilenameSelector();
            inc.setName("*/core/**/*.jar");
            or.addFilename(inc);

            ModuleSelector ms = new ModuleSelector();
            Parameter included = new Parameter();
            included.setName("includeClusters");
            included.setValue("");
            Parameter excluded = new Parameter();
            excluded.setName("excludeClusters");
            excluded.setValue("");
            Parameter exModules = new Parameter();
            exModules.setName("excludeModules");
            exModules.setValue("");
            ms.setParameters(new Parameter[]{
                included,
                excluded,
                exModules
            });
            and.add(or);
            and.add(ms);
            fs.addAnd(and);
            jnlpTask.execute();

            //TODO is it really netbeans/
            String extSnippet = generateExtensions(fs, antProject, ""); // "netbeans/"

            if (masterJnlpFileName == null) {
                masterJnlpFileName = brandingToken;
            }

            Properties props = new Properties();
            props.setProperty("jnlp.codebase", localCodebase);
            props.setProperty("app.name", brandingToken);
            props.setProperty("app.title", project.getName());
            if (project.getOrganization() != null) {
                props.setProperty("app.vendor", project.getOrganization().getName());
            } else {
                props.setProperty("app.vendor", "Nobody");
            }
            String description = project.getDescription() != null ? project.getDescription() : "No Project Description";
            props.setProperty("app.description", description);
            props.setProperty("branding.token", brandingToken);
            props.setProperty("master.jnlp.file.name", masterJnlpFileName);
            props.setProperty("netbeans.jnlp.fixPolicy", "false");

            StringBuilder stBuilder = new StringBuilder();
            if (additionalArguments != null) {
                StringTokenizer st = new StringTokenizer(additionalArguments);
                while (st.hasMoreTokens()) {
                    String arg = st.nextToken();
                    if (arg.startsWith("-J")) {
                        if (stBuilder.length() > 0) {
                            stBuilder.append(' ');
                        }
                        stBuilder.append(arg.substring(2));
                    }
                }
            }
            props.setProperty("netbeans.run.params", stBuilder.toString());

            File masterJnlp = new File(
                    webstartBuildDir.getAbsolutePath() + File.separator + masterJnlpFileName + ".jnlp");
            filterCopy(masterJnlpFile, "master.jnlp", masterJnlp, props);

            File startup = copyLauncher(outputDirectory, nbmBuildDirFile);
            File jnlpDestination = new File(
                    webstartBuildDir.getAbsolutePath() + File.separator + "startup.jar");

            SignJar signTask = (SignJar) antProject.createTask("signjar");
            signTask.setKeystore(keystore);
            signTask.setStorepass(keystorepassword);
            signTask.setAlias(keystorealias);
            if (keystoretype != null) {
                signTask.setStoretype(keystoretype);
            }
            signTask.setSignedjar(jnlpDestination);
            signTask.setJar(startup);
            signTask.execute();

            //branding
            DirectoryScanner ds = new DirectoryScanner();
            ds.setBasedir(nbmBuildDirFile);
            ds.setIncludes(new String[]{
                "**/locale/*.jar"
            });
            ds.scan();
            String[] includes = ds.getIncludedFiles();
            StringBuilder brandRefs = new StringBuilder();
            if (includes != null && includes.length > 0) {
                File brandingDir = new File(webstartBuildDir, "branding");
                brandingDir.mkdirs();
                for (String incBran : includes) {
                    File source = new File(nbmBuildDirFile, incBran);
                    File dest = new File(brandingDir, source.getName());
                    FileUtils.copyFile(source, dest);
                    brandRefs.append("    <jar href=\'branding/").append(dest.getName()).append("\'/>\n");
                }

                signTask = (SignJar) antProject.createTask("signjar");
                signTask.setKeystore(keystore);
                signTask.setStorepass(keystorepassword);
                signTask.setAlias(keystorealias);
                if (keystoretype != null) {
                    signTask.setStoretype(keystoretype);
                }

                FileSet set = new FileSet();
                set.setDir(brandingDir);
                set.setIncludes("*.jar");
                signTask.addFileset(set);
                signTask.execute();
            }

            File modulesJnlp = new File(
                    webstartBuildDir.getAbsolutePath() + File.separator + "modules.jnlp");
            props.setProperty("jnlp.branding.jars", brandRefs.toString());
            props.setProperty("jnlp.resources", extSnippet);
            filterCopy(null, /* filename is historical */ "branding.jnlp", modulesJnlp, props);

            getLog().info("Verifying generated webstartable content.");
            VerifyJNLP verifyTask = (VerifyJNLP) antProject.createTask("verifyjnlp");
            FileSet verify = new FileSet();
            verify.setFile(masterJnlp);
            verifyTask.addConfiguredFileset(verify);
            verifyTask.execute();

            // create zip archive
            if (destinationFile.exists()) {
                destinationFile.delete();
            }
            ZipArchiver archiver = new ZipArchiver();
            if (codebase != null) {
                getLog().warn("Defining <codebase>/${nbm.webstart.codebase} is generally unnecessary");
                archiver.addDirectory(webstartBuildDir);
            } else {
                archiver.addDirectory(webstartBuildDir, null, new String[]{
                    "**/*.jnlp"
                });
                for (final File jnlp : webstartBuildDir.listFiles()) {
                    if (!jnlp.getName().endsWith(".jnlp")) {
                        continue;
                    }
                    archiver.addResource(new PlexusIoResource() {
                        public @Override
                        InputStream getContents() throws IOException {
                            return new ByteArrayInputStream(FileUtils.fileRead(jnlp, "UTF-8").replace(localCodebase,
                                    "$$codebase").getBytes("UTF-8"));
                        }

                        public @Override
                        long getLastModified() {
                            return jnlp.lastModified();
                        }

                        public @Override
                        boolean isExisting() {
                            return true;
                        }

                        public @Override
                        long getSize() {
                            return UNKNOWN_RESOURCE_SIZE;
                        }

                        public @Override
                        URL getURL() throws IOException {
                            return null;
                        }

                        public @Override
                        String getName() {
                            return jnlp.getAbsolutePath();
                        }

                        public @Override
                        boolean isFile() {
                            return true;
                        }

                        public @Override
                        boolean isDirectory() {
                            return false;
                        }

                        @Override
                        public boolean isSymbolicLink() {
                            return false;
                        }
                    }, jnlp.getName(), archiver.getDefaultFileMode());
                }
            }
            File jdkhome = new File(System.getProperty("java.home"));
            File servlet = new File(jdkhome, "sample/jnlp/servlet/jnlp-servlet.jar");
            if (!servlet.isFile()) {
                servlet = new File(jdkhome.getParentFile(), "sample/jnlp/servlet/jnlp-servlet.jar");
            }
            if (servlet.isFile()) {
                archiver.addFile(servlet, "WEB-INF/lib/jnlp-servlet.jar");
                archiver.addResource(new PlexusIoResource() {
                    public @Override
                    InputStream getContents() throws IOException {
                        return new ByteArrayInputStream((""
                                + "<web-app>\n"
                                + "    <servlet>\n"
                                + "        <servlet-name>JnlpDownloadServlet</servlet-name>\n"
                                + "        <servlet-class>jnlp.sample.servlet.JnlpDownloadServlet</servlet-class>\n"
                                + "    </servlet>\n"
                                + "    <servlet-mapping>\n"
                                + "        <servlet-name>JnlpDownloadServlet</servlet-name>\n"
                                + "        <url-pattern>*.jnlp</url-pattern>\n"
                                + "    </servlet-mapping>\n"
                                + "</web-app>\n").getBytes());
                    }

                    public @Override
                    long getLastModified() {
                        return UNKNOWN_MODIFICATION_DATE;
                    }

                    public @Override
                    boolean isExisting() {
                        return true;
                    }

                    public @Override
                    long getSize() {
                        return UNKNOWN_RESOURCE_SIZE;
                    }

                    public @Override
                    URL getURL() throws IOException {
                        return null;
                    }

                    public @Override
                    String getName() {
                        return "web.xml";
                    }

                    public @Override
                    boolean isFile() {
                        return true;
                    }

                    public @Override
                    boolean isDirectory() {
                        return false;
                    }

                    @Override
                    public boolean isSymbolicLink() {
                        return false;
                    }
                }, "WEB-INF/web.xml", archiver.getDefaultFileMode());
            }
            archiver.setDestFile(destinationFile);
            archiver.createArchive();

            // attach standalone so that it gets installed/deployed
            projectHelper.attachArtifact(project, "war", webstartClassifier, destinationFile);

        } catch (Exception ex) {
            throw new MojoExecutionException("Error creating webstartable binary.", ex);
        }
    }