All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hazelcast.org.codehaus.commons.compiler.AbstractJavaSourceClassLoader Maven / Gradle / Ivy

There is a newer version: 5.5.0
Show newest version

/*
 * Janino - An embedded Java[TM] compiler
 *
 * Copyright (c) 2001-2010 Arno Unkrig. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
 * following conditions are met:
 *
 *    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
 *       following disclaimer.
 *    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
 *       following disclaimer in the documentation and/or other materials provided with the distribution.
 *    3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
 *       products derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package com.hazelcast.org.codehaus.commons.compiler;

import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.nio.charset.Charset;
import java.security.ProtectionDomain;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import com.hazelcast.org.codehaus.commons.compiler.util.resource.ResourceFinder;
import com.hazelcast.org.codehaus.commons.nullanalysis.NotNullByDefault;
import com.hazelcast.org.codehaus.commons.nullanalysis.Nullable;

/**
 * A {@link ClassLoader} that, unlike usual {@link ClassLoader}s, does not load byte code, but reads Java source
 * code and then scans, parses, compiles and loads it into the virtual machine.
 * 

* As with any {@link ClassLoader}, it is not possible to "update" classes after they've been loaded. The way to * achieve this is to give up on the {@link AbstractJavaSourceClassLoader} and create a new one. *

*/ public abstract class AbstractJavaSourceClassLoader extends ClassLoader { /** * @see ClassLoader#defineClass(String, byte[], int, int, ProtectionDomain) */ @Nullable protected ProtectionDomainFactory protectionDomainFactory; public AbstractJavaSourceClassLoader() {} public AbstractJavaSourceClassLoader(ClassLoader parentClassLoader) { super(parentClassLoader); } // Override and delegate to parent. @Override @NotNullByDefault(false) public InputStream getResourceAsStream(String name) { return super.getParent().getResourceAsStream(name); } /** * @param sourcePath The sequence of directories to search for Java source files */ public abstract void setSourcePath(File[] sourcePath); /** * @param sourceFinder Is used when searching for Java source files */ public abstract void setSourceFinder(ResourceFinder sourceFinder); /** * @param charsetName if {@code null}, use platform default encoding */ public void setSourceFileCharacterEncoding(@Nullable String charsetName) { this.setSourceCharset(charsetName == null ? Charset.defaultCharset() : Charset.forName(charsetName)); } /** * @param charset The character set to using when reading characters from a source file */ public abstract void setSourceCharset(Charset charset); /** * @param lines Whether line number debugging information should be generated * @param vars Whether variables debugging information should be generated * @param source Whether source file debugging information should be generated */ public abstract void setDebuggingInfo(boolean lines, boolean vars, boolean source); /** * @see ClassLoader#defineClass(String, byte[], int, int, ProtectionDomain) */ public final void setProtectionDomainFactory(@Nullable ProtectionDomainFactory protectionDomainFactory) { this.protectionDomainFactory = protectionDomainFactory; } /** * @see AbstractJavaSourceClassLoader#setProtectionDomainFactory */ public interface ProtectionDomainFactory { /** * @param sourceResourceName E.g. "pkg1/pkg2/Outer.java" */ ProtectionDomain getProtectionDomain(String sourceResourceName); } /** * Reads Java source code for a given class name, scan, parse, compile and load it into the virtual machine, * and invoke its "main()" method with the given arguments. *

* Usage is as follows: *

*
     *   java {@link AbstractJavaSourceClassLoader} [ option ] ... class-name [ argument ] ...
     *
     *   option:
     *     -sourcepath colon-separated-list-of-source-directories
     *     -encoding character-encoding
     *     -g                           Generate all debugging info
     *     -g:none                      Generate no debugging info
     *     -g:{source,lines,vars}       Generate only some debugging info
     * 
*/ public static void main(String[] args) throws Exception { File[] sourcePath = null; String characterEncoding = null; boolean debuggingInfoLines = false; boolean debuggingInfoVars = false; boolean debuggingInfoSource = false; boolean haveDebuggingInfo = false; // Scan command line options. int i; for (i = 0; i < args.length; ++i) { String arg = args[i]; if (!arg.startsWith("-")) break; if ("-sourcepath".equals(arg)) { sourcePath = AbstractJavaSourceClassLoader.splitPath(args[++i]); } else if ("-encoding".equals(arg)) { characterEncoding = args[++i]; } else if ("-g".equals(arg)) { debuggingInfoLines = true; debuggingInfoVars = true; debuggingInfoSource = true; haveDebuggingInfo = true; } else if ("-g:none".equals(arg)) { debuggingInfoLines = false; debuggingInfoVars = false; debuggingInfoSource = false; haveDebuggingInfo = true; } else if ("-g:".startsWith(arg)) { debuggingInfoLines = arg.indexOf("lines") != -1; debuggingInfoVars = arg.indexOf("vars") != -1; debuggingInfoSource = arg.indexOf("source") != -1; haveDebuggingInfo = true; } else if ("-help".equals(arg)) { System.out.println("Usage:"); System.out.println( " java " + AbstractJavaSourceClassLoader.class.getName() + " {




© 2015 - 2024 Weber Informatics LLC | Privacy Policy