001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018: package org.apache.tools.ant.taskdefs;
019:
020: import java.io.File;
021: import java.io.FileWriter;
022: import java.io.IOException;
023: import java.io.PrintWriter;
024: import java.util.Random;
025:
026: import org.apache.tools.ant.BuildException;
027: import org.apache.tools.ant.Project;
028: import org.apache.tools.ant.util.FileUtils;
029:
030: /**
031: * Encapsulates a Jikes compiler, by directly executing an external
032: * process.
033: *
034: * <p><strong>As of Ant 1.2, this class is considered to be dead code
035: * by the Ant developers and is unmaintained. Don't use
036: * it.</strong></p>
037: *
038: * @deprecated since 1.2.
039: * Merged into the class Javac.
040: */
041: public class Jikes {
042:
043: // CheckStyle:VisibilityModifier OFF - bc
044: protected JikesOutputParser jop;
045: protected String command;
046: protected Project project;
047:
048: // CheckStyle:VisibilityModifier ON
049:
050: /**
051: * Constructs a new Jikes object.
052: * @param jop Parser to send jike's output to
053: * @param command name of jikes executable
054: * @param project the current project
055: */
056: protected Jikes(JikesOutputParser jop, String command,
057: Project project) {
058: super ();
059:
060: System.err.println("As of Ant 1.2 released in October 2000, "
061: + "the Jikes class");
062: System.err.println("is considered to be dead code by the Ant "
063: + "developers and is unmaintained.");
064: System.err.println("Don\'t use it!");
065:
066: this .jop = jop;
067: this .command = command;
068: this .project = project;
069: }
070:
071: /**
072: * Do the compile with the specified arguments.
073: * @param args - arguments to pass to process on command line
074: */
075: protected void compile(String[] args) {
076: String[] commandArray = null;
077: File tmpFile = null;
078:
079: try {
080: String myos = System.getProperty("os.name");
081:
082: // Windows has a 32k limit on total arg size, so
083: // create a temporary file to store all the arguments
084:
085: // There have been reports that 300 files could be compiled
086: // so 250 is a conservative approach
087: if (myos.toLowerCase().indexOf("windows") >= 0
088: && args.length > 250) {
089: PrintWriter out = null;
090: try {
091: String tempFileName = "jikes"
092: + (new Random(System.currentTimeMillis()))
093: .nextLong();
094: tmpFile = new File(tempFileName);
095: out = new PrintWriter(new FileWriter(tmpFile));
096: for (int i = 0; i < args.length; i++) {
097: out.println(args[i]);
098: }
099: out.flush();
100: commandArray = new String[] { command,
101: "@" + tmpFile.getAbsolutePath() };
102: } catch (IOException e) {
103: throw new BuildException(
104: "Error creating temporary file", e);
105: } finally {
106: FileUtils.close(out);
107: }
108: } else {
109: commandArray = new String[args.length + 1];
110: commandArray[0] = command;
111: System.arraycopy(args, 0, commandArray, 1, args.length);
112: }
113:
114: // We assume, that everything jikes writes goes to
115: // standard output, not to standard error. The option
116: // -Xstdout that is given to Jikes in Javac.doJikesCompile()
117: // should guarantee this. At least I hope so. :)
118: try {
119: Execute exe = new Execute(jop);
120: exe.setAntRun(project);
121: exe.setWorkingDirectory(project.getBaseDir());
122: exe.setCommandline(commandArray);
123: exe.execute();
124: } catch (IOException e) {
125: throw new BuildException(
126: "Error running Jikes compiler", e);
127: }
128: } finally {
129: if (tmpFile != null) {
130: tmpFile.delete();
131: }
132: }
133: }
134: }
|