01: /*
02: * Licensed to the Apache Software Foundation (ASF) under one or more
03: * contributor license agreements. See the NOTICE file distributed with
04: * this work for additional information regarding copyright ownership.
05: * The ASF licenses this file to You under the Apache License, Version 2.0
06: * (the "License"); you may not use this file except in compliance with
07: * the License. You may obtain a copy of the License at
08: *
09: * http://www.apache.org/licenses/LICENSE-2.0
10: *
11: * Unless required by applicable law or agreed to in writing, software
12: * distributed under the License is distributed on an "AS IS" BASIS,
13: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14: * See the License for the specific language governing permissions and
15: * limitations under the License.
16: *
17: */
18:
19: package org.apache.tools.ant.taskdefs.rmic;
20:
21: import org.apache.tools.ant.BuildException;
22: import org.apache.tools.ant.Project;
23: import org.apache.tools.ant.util.JavaEnvUtils;
24: import org.apache.tools.ant.taskdefs.Rmic;
25: import org.apache.tools.ant.taskdefs.Execute;
26: import org.apache.tools.ant.taskdefs.LogStreamHandler;
27: import org.apache.tools.ant.types.Commandline;
28:
29: import java.io.IOException;
30:
31: /**
32: * This is an extension of the sun rmic compiler, which forks rather than
33: * executes it inline. Why so? Because rmic is dog slow, but if you fork the
34: * compiler you can have multiple copies compiling different bits of your project
35: * at the same time. Which, on a multi-cpu system results in significant speedups.
36: *
37: * Also, Java1.6 behaves oddly with -XNew, so we switch it on here if needed.
38: * @since ant1.7
39: */
40: public class ForkingSunRmic extends DefaultRmicAdapter {
41:
42: /**
43: * the name of this adapter for users to select
44: */
45: public static final String COMPILER_NAME = "forking";
46:
47: /**
48: * exec by creating a new command
49: * @return true if the command ran successfully
50: * @throws BuildException on error
51: */
52: public boolean execute() throws BuildException {
53: Rmic owner = getRmic();
54: Commandline cmd = setupRmicCommand();
55: Project project = owner.getProject();
56: //rely on RMIC being on the path
57: cmd.setExecutable(JavaEnvUtils
58: .getJdkExecutable(getExecutableName()));
59:
60: //set up the args
61: String[] args = cmd.getCommandline();
62:
63: try {
64: Execute exe = new Execute(new LogStreamHandler(owner,
65: Project.MSG_INFO, Project.MSG_WARN));
66: exe.setAntRun(project);
67: exe.setWorkingDirectory(project.getBaseDir());
68: exe.setCommandline(args);
69: exe.execute();
70: return !exe.isFailure();
71: } catch (IOException exception) {
72: throw new BuildException("Error running "
73: + getExecutableName()
74: + " -maybe it is not on the path", exception);
75: }
76: }
77:
78: /**
79: * Override point.
80: * @return the executable name.
81: */
82: protected String getExecutableName() {
83: return SunRmic.RMIC_EXECUTABLE;
84: }
85: }
|