3789983e89
Reviewed-by: darcy, ihse
159 lines
5.6 KiB
Java
159 lines
5.6 KiB
Java
/*
|
|
* 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()]);
|
|
}
|
|
}
|