jikes.java

来自「Java有关XML编程需要用到axis 的源代码 把里面bin下的包导入相应」· Java 代码 · 共 257 行

JAVA
257
字号
/* * Copyright 2001-2004 The Apache Software Foundation. *  * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *  *      http://www.apache.org/licenses/LICENSE-2.0 *  * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.axis.components.compiler;import org.apache.axis.components.logger.LogFactory;import org.apache.axis.utils.Messages;import org.apache.commons.logging.Log;import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import java.util.StringTokenizer;/** * This class wraps IBM's <i>Jikes</i> Java compiler * NOTE: inspired by the Apache Jasper implementation. * @author <a href="mailto:dims@yahoo.com">Davanum Srinivas</a> * @author <a href="mailto:stefano@apache.org">Stefano Mazzocchi</a> * @since 2.0 */public class Jikes extends AbstractCompiler{    protected static Log log =            LogFactory.getLog(Jikes.class.getName());        static final int OUTPUT_BUFFER_SIZE = 1024;    static final int BUFFER_SIZE = 512;    private class StreamPumper extends Thread {        private BufferedInputStream stream;        private boolean endOfStream = false;        private boolean stopSignal  = false;        private int SLEEP_TIME = 5;        private OutputStream out;        public StreamPumper(BufferedInputStream is, OutputStream out) {            this.stream = is;            this.out = out;        }        public void pumpStream() throws IOException {            byte[] buf = new byte[BUFFER_SIZE];            if (!endOfStream) {                int bytesRead = stream.read(buf, 0, BUFFER_SIZE);                if (bytesRead > 0) {                    out.write(buf, 0, bytesRead);                } else if (bytesRead == -1) {                    endOfStream = true;                }            }        }        public void run() {            try {                while (!endOfStream) {                    pumpStream();                    sleep(SLEEP_TIME);                }            } catch (Exception e) {               // getLogger().warn("Jikes.run()", e);            }        }    }    /**     * Copy arguments to a string array     *     * @param arguments The compiler arguments     * @return A string array containing compilation arguments     */    protected String[] toStringArray(List arguments) {        int i;        for (i = 0; i < arguments.size(); i++) {            String arg = (String) arguments.get(i);            if (arg.equals("-sourcepath")) {                // Remove -sourcepath option. Jikes does not understand that.                arguments.remove(i);                arguments.remove(i);                break;            }        }        String[] args = new String[arguments.size() + fileList.size()];        for (i = 0; i < arguments.size(); i++) {            args[i] = (String) arguments.get(i);        }        for (int j=0; j < fileList.size(); i++,j++) {            args[i] = (String)fileList.get(j);        }        return args;    }    /**     * Execute the compiler     */    public boolean compile() throws IOException {        List args = new ArrayList();        // command line name        args.add("jikes");        // indicate Emacs output mode must be used        args.add("+E");        // avoid warnings        // Option nowarn with one hyphen only        args.add("-nowarn");        int exitValue;        ByteArrayOutputStream tmpErr = new ByteArrayOutputStream(OUTPUT_BUFFER_SIZE);        try {            Process p = Runtime.getRuntime().exec(toStringArray(fillArguments(args)));            BufferedInputStream compilerErr = new BufferedInputStream(p.getErrorStream());            StreamPumper errPumper = new StreamPumper(compilerErr, tmpErr);            errPumper.start();            p.waitFor();            exitValue = p.exitValue();            // Wait until the complete error stream has been read            errPumper.join();            compilerErr.close();            p.destroy();            tmpErr.close();            this.errors = new ByteArrayInputStream(tmpErr.toByteArray());        } catch (InterruptedException somethingHappened) {            log.debug("Jikes.compile():SomethingHappened", somethingHappened);            return false;        }        // Jikes returns 0 even when there are some types of errors.        // Check if any error output as well        // Return should be OK when both exitValue and        // tmpErr.size() are 0 ?!        return ((exitValue == 0) && (tmpErr.size() == 0));    }    /**     * Parse the compiler error stream to produce a list of     * <code>CompilerError</code>s     *     * @param input The error stream     * @return The list of compiler error messages     * @exception IOException If an error occurs during message collection     */    protected List parseStream(BufferedReader input) throws IOException {        List errors = null;        String line = null;        StringBuffer buffer = null;        while (true) {            // cleanup the buffer            buffer = new StringBuffer(); // this is faster than clearing it            // first line is not space-starting            if (line == null) line = input.readLine();            if (line == null) return errors;            log.debug(line);            buffer.append(line);            // all other space-starting lines are one error            while (true) {                line = input.readLine();                // EOF                if (line == null)                    break;                // Continuation of previous error starts with ' '                if (line.length() > 0 && line.charAt(0) != ' ')                    break;                log.debug(line);                buffer.append('\n');                buffer.append(line);            }            // if error is found create the vector            if (errors == null) errors = new ArrayList();            // add the error bean            errors.add(parseError(buffer.toString()));        }    }    /**     * Parse an individual compiler error message     *     * @param error The error text     * @return A mssaged <code>CompilerError</code>     */    private CompilerError parseError(String error) {        StringTokenizer tokens = new StringTokenizer(error, ":");        String file = tokens.nextToken();        if (file.length() == 1) file = new StringBuffer(file).append(":").append(tokens.nextToken()).toString();        StringBuffer message = new StringBuffer();        String type = "";        int startline = 0;        int startcolumn = 0;        int endline = 0;        int endcolumn = 0;        try {            startline = Integer.parseInt(tokens.nextToken());            startcolumn = Integer.parseInt(tokens.nextToken());            endline = Integer.parseInt(tokens.nextToken());            endcolumn = Integer.parseInt(tokens.nextToken());        } catch (Exception e) {            // FIXME: VG: This is not needed anymore?            message.append(Messages.getMessage("compilerFail00"));            type="error";            log.error(Messages.getMessage("compilerFail00"), e);        }        if ("".equals(message)) {            type = tokens.nextToken().trim().toLowerCase();            message.append(tokens.nextToken("\n").substring(1).trim());            while (tokens.hasMoreTokens())                message.append("\n").append(tokens.nextToken());        }        return new CompilerError(file, type.equals("error"), startline, startcolumn, endline, endcolumn, message.toString());    }    public String toString() {        return Messages.getMessage("ibmJikes");    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?