⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proxygeneratortask.java

📁 一个java方面的消息订阅发送的源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
     * @param reference the reference
     */
    public void setClasspathRef(Reference reference) {
        createClasspath().setRefid(reference);
    }

    /**
     * Returns the classpath.
     *
     * @return the classpath
     */
    public Path getClasspath() {
        return _compileClasspath;
    }

    /**
     * Execute the task.
     *
     * @throws BuildException if the build fails
     */
    public void execute() throws BuildException {
        if (_base == null) {
            throw new BuildException("base attribute must be set!", location);
        }
        if (!_base.exists()) {
            throw new BuildException("base does not exist", location);
        }
        if (!_base.isDirectory()) {
            throw new BuildException("base is not a directory", location);
        }

        if (_sourceBase != null) {
            if (!_sourceBase.exists()) {
                throw new BuildException("sourceBase does not exist",
                                         location);
            }
            if (!_sourceBase.isDirectory()) {
                throw new BuildException("sourceBase is not a directory",
                                         location);
            }
        } else {
            _sourceBase = _base;
        }

        String[] files;
        String[] generateList;

        if (_classname == null) {
            // scan base dir to build up generation lists only if a
            // specific classname is not given
            DirectoryScanner scanner = getDirectoryScanner(_base);
            files = scanner.getIncludedFiles();
        } else {
            // otherwise perform a timestamp comparison - at least
            files = new String[]{
                _classname.replace('.', File.separatorChar) + ".class"};
        }
        generateList = scanDir(files);

        int count = generateList.length;
        if (count > 0) {
            log("Generating " + count + " prox" + (count > 1 ? "ies" : "y")
                + " to " + _base, Project.MSG_INFO);

            Path classpath = getCompileClasspath();
            AntClassLoader loader = new AntClassLoader(project, classpath);

            for (int i = 0; i < count; ++i) {
                generate(generateList[i], loader);
            }

            Javac javac = new Javac();
            javac.setProject(project);
            javac.createSrc().setLocation(_sourceBase);
            javac.setDestdir(_base);
            javac.setDebug(_debug);
            javac.setClasspath(classpath);
            javac.execute();
        }
    }

    /**
     * Helper class for specifying nested ThrowableAdapter implementations.
     */
    public static final class Adapter {

        /**
         * The class name.
         */
        private String _classname;

        /**
         * Sets the adapter class name.
         *
         * @param classname the adapter class name
         */
        public void setClassname(String classname) {
            _classname = classname;
        }

        /**
         * Returns the adapter class name.
         *
         * @return the adapter class name
         */
        public String getClassname() {
            return _classname;
        }
    }

    /**
     * Generate the proxy source.
     *
     * @param classname the name of the class
     * @param loader    the classloader to locate the class and its
     *                  dependencies
     * @return the path of the generated source
     * @throws BuildException if the source generation fails
     */
    protected String generate(String classname, ClassLoader loader)
            throws BuildException {

        String path = classname.replace('.', File.separatorChar)
                + "__Proxy.java";
        File file = new File(_sourceBase, path);
        File parent = file.getParentFile();
        if (parent.exists()) {
            if (!parent.isDirectory()) {
                throw new BuildException("Cannot generate sources to "
                                         + parent
                                         + ": path is not a directory", location);
            }
        } else if (!parent.mkdirs()) {
            throw new BuildException("Failed to create directory " + parent,
                                     location);
        }

        log("Generating proxy " + file, Project.MSG_DEBUG);

        FileOutputStream stream = null;
        try {
            stream = new FileOutputStream(file);
            Class clazz = loader.loadClass(classname);
            Class[] adapters = getAdapters(loader);
            ProxyGenerator generator = new ProxyGenerator(clazz, adapters);
            generator.generate(stream);
            stream.close();
        } catch (ClassNotFoundException exception) {
            throw new BuildException("proxygen failed - class not found: "
                                     + exception.getMessage(), exception,
                                     location);
        } catch (IOException exception) {
            throw new BuildException(
                    "proxygen failed - I/O error: " + exception.getMessage(),
                    exception, location);
        } catch (Exception exception) {
            throw new BuildException(
                    "proxygen failed: " + exception.getMessage(),
                    exception, location);
        } finally {
            if (stream != null) {
                try {
                    stream.close();
                } catch (IOException exception) {
                    throw new BuildException("proxygen failed - I/O error: "
                                             + exception.getMessage(),
                                             exception, location);
                }
            }
        }
        return path;
    }

    /**
     * Returns the class path for compilation.
     *
     * @return the compilation classpath
     */
    protected Path getCompileClasspath() {
        Path classpath = new Path(project);

        // add dest dir to classpath so that previously compiled and
        // untouched classes are on classpath
        classpath.setLocation(_base);

        if (getClasspath() == null) {
            classpath.addExisting(Path.systemClasspath);
        } else {
            classpath.addExisting(getClasspath().concatSystemClasspath("last"));
        }

        return classpath;
    }

    /**
     * Scans the base directory looking for class files to generate proxies
     * for.
     *
     * @param files the file paths
     * @return a list of class names to generate proxies for
     */
    protected String[] scanDir(String[] files) {
        ArrayList result = new ArrayList();
        String[] newFiles = files;

        SourceFileScanner scanner = new SourceFileScanner(this);
        FileNameMapper mapper = new GlobPatternMapper();
        mapper.setFrom("*.class");
        mapper.setTo("*__Proxy.java");
        newFiles = scanner.restrict(files, _base, _sourceBase, mapper);

        for (int i = 0; i < newFiles.length; i++) {
            String classname = newFiles[i].replace(File.separatorChar, '.');
            classname = classname.substring(0, classname.lastIndexOf(".class"));
            result.add(classname);
        }
        return (String[]) result.toArray(new String[0]);
    }

    /**
     * Returns the adapter classes.
     *
     * @param loader the class loader to use
     * @return the adapter classes
     * @throws ClassNotFoundException if an adapter class can't be found
     */
    private Class[] getAdapters(ClassLoader loader)
            throws ClassNotFoundException {
        Class[] result = new Class[_adapters.size()];
        Iterator iterator = _adapters.iterator();
        for (int i = 0; iterator.hasNext(); ++i) {
            String classname = (String) iterator.next();
            Class adapter = loader.loadClass(classname);
            result[i] = adapter;
        }
        return result;
    }
}

⌨️ 快捷键说明

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