| /* |
| * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code 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 General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package anttasks; |
| |
| import genstubs.GenStubs; |
| |
| import java.io.*; |
| import java.util.*; |
| |
| import org.apache.tools.ant.BuildException; |
| import org.apache.tools.ant.DirectoryScanner; |
| import org.apache.tools.ant.taskdefs.MatchingTask; |
| import org.apache.tools.ant.types.Path; |
| import org.apache.tools.ant.types.Reference; |
| |
| /** |
| * Files are specified with an implicit fileset, using srcdir as a base directory. |
| * The set of files to be included is specified with an includes attribute or |
| * nested <includes> set. However, unlike a normal fileset, an empty includes attribute |
| * means "no files" instead of "all files". The Ant task also accepts "fork=true" and |
| * classpath attribute or nested <classpath> element to run GenStubs in a separate VM |
| * with the specified path. This is likely necessary if a JDK 7 parser is required to read the |
| * JDK 7 input files. |
| */ |
| public class GenStubsTask extends MatchingTask { |
| private File srcDir; |
| private File destDir; |
| private boolean fork; |
| private Path classpath; |
| private String includes; |
| |
| public void setSrcDir(File dir) { |
| this.srcDir = dir; |
| } |
| |
| public void setDestDir(File dir) { |
| this.destDir = dir; |
| } |
| |
| public void setFork(boolean v) { |
| this.fork = v; |
| } |
| |
| public void setClasspath(Path cp) { |
| if (classpath == null) |
| classpath = cp; |
| else |
| classpath.append(cp); |
| } |
| |
| public Path createClasspath() { |
| if (classpath == null) { |
| classpath = new Path(getProject()); |
| } |
| return classpath.createPath(); |
| } |
| |
| public void setClasspathRef(Reference r) { |
| createClasspath().setRefid(r); |
| } |
| |
| @Override |
| public void setIncludes(String includes) { |
| super.setIncludes(includes); |
| this.includes = includes; |
| } |
| |
| @Override |
| public void execute() { |
| if (includes != null && includes.trim().isEmpty()) |
| return; |
| |
| DirectoryScanner s = getDirectoryScanner(srcDir); |
| String[] files = s.getIncludedFiles(); |
| // System.err.println("Ant.execute: srcDir " + srcDir); |
| // System.err.println("Ant.execute: destDir " + destDir); |
| // System.err.println("Ant.execute: files " + Arrays.asList(files)); |
| |
| files = filter(srcDir, destDir, files); |
| if (files.length == 0) |
| return; |
| System.out.println("Generating " + files.length + " stub files to " + destDir); |
| |
| List<String> classNames = new ArrayList<>(); |
| for (String file: files) { |
| classNames.add(file.replaceAll(".java$", "").replace('/', '.')); |
| } |
| |
| if (!fork) { |
| GenStubs m = new GenStubs(); |
| boolean ok = m.run(srcDir.getPath(), destDir, classNames); |
| if (!ok) |
| throw new BuildException("genstubs failed"); |
| } else { |
| List<String> cmd = new ArrayList<>(); |
| String java_home = System.getProperty("java.home"); |
| cmd.add(new File(new File(java_home, "bin"), "java").getPath()); |
| if (classpath != null) |
| cmd.add("-Xbootclasspath/p:" + classpath); |
| cmd.add(GenStubs.class.getName()); |
| cmd.add("-sourcepath"); |
| cmd.add(srcDir.getPath()); |
| cmd.add("-s"); |
| cmd.add(destDir.getPath()); |
| cmd.addAll(classNames); |
| //System.err.println("GenStubs exec " + cmd); |
| ProcessBuilder pb = new ProcessBuilder(cmd); |
| pb.redirectErrorStream(true); |
| try { |
| Process p = pb.start(); |
| try (BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()))) { |
| String line; |
| while ((line = in.readLine()) != null) |
| System.out.println(line); |
| } |
| int rc = p.waitFor(); |
| if (rc != 0) |
| throw new BuildException("genstubs failed"); |
| } catch (IOException | InterruptedException e) { |
| throw new BuildException("genstubs failed", e); |
| } |
| } |
| } |
| |
| String[] filter(File srcDir, File destDir, String[] files) { |
| List<String> results = new ArrayList<String>(); |
| for (String f: files) { |
| long srcTime = new File(srcDir, f).lastModified(); |
| long destTime = new File(destDir, f).lastModified(); |
| if (srcTime > destTime) |
| results.add(f); |
| } |
| return results.toArray(new String[results.size()]); |
| } |
| } |