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

📄 groovyscriptengine.java

📁 大名鼎鼎的java动态脚本语言。已经通过了sun的认证
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    public GroovyScriptEngine(String url, ClassLoader parentClassLoader) throws IOException {        this(url);        this.parentClassLoader = parentClassLoader;    }    public GroovyScriptEngine(ResourceConnector rc) {        this.rc = rc;    }    public GroovyScriptEngine(ResourceConnector rc, ClassLoader parentClassLoader) {        this(rc);        this.parentClassLoader = parentClassLoader;    }    /**     * Get the <code>ClassLoader</code> that will serve as the parent ClassLoader of the     * {@link GroovyClassLoader} in which scripts will be executed. By default, this is the     * ClassLoader that loaded the <code>GroovyScriptEngine</code> class.     *     * @return parent classloader used to load scripts     */    public ClassLoader getParentClassLoader() {        return parentClassLoader;    }    /**     * @param parentClassLoader ClassLoader to be used as the parent ClassLoader for scripts executed by the engine     */    public void setParentClassLoader(ClassLoader parentClassLoader) {        if (parentClassLoader == null) {            throw new IllegalArgumentException("The parent class loader must not be null.");        }        this.parentClassLoader = parentClassLoader;    }    /**     * Get the class of the scriptName in question, so that you can instantiate Groovy objects with caching and reloading.     *     * @param scriptName     * @return the loaded scriptName as a compiled class     * @throws ResourceException     * @throws ScriptException     */    public Class loadScriptByName(String scriptName) throws ResourceException, ScriptException {        return loadScriptByName( scriptName, getClass().getClassLoader());    }    /**     * Get the class of the scriptName in question, so that you can instantiate Groovy objects with caching and reloading.     *     * @param scriptName     * @return the loaded scriptName as a compiled class     * @throws ResourceException     * @throws ScriptException     */    public Class loadScriptByName(String scriptName, ClassLoader parentClassLoader)            throws ResourceException, ScriptException {        scriptName = scriptName.replace('.', File.separatorChar) + ".groovy";        ScriptCacheEntry entry = updateCacheEntry(scriptName, parentClassLoader);        return entry.scriptClass;    }    /**     * Locate the class and reload it or any of its dependencies     *     * @param scriptName     * @param parentClassLoader     * @return the scriptName cache entry     * @throws ResourceException     * @throws ScriptException     */    private ScriptCacheEntry updateCacheEntry(String scriptName, final ClassLoader parentClassLoader)            throws ResourceException, ScriptException    {        ScriptCacheEntry entry;        scriptName = scriptName.intern();        synchronized (scriptName) {            URLConnection groovyScriptConn = rc.getResourceConnection(scriptName);            // URL last modified            long lastModified = groovyScriptConn.getLastModified();            // Check the cache for the scriptName            entry = (ScriptCacheEntry) scriptCache.get(scriptName);            // If the entry isn't null check all the dependencies            boolean dependencyOutOfDate = false;            if (entry != null) {                for (Iterator i = entry.dependencies.keySet().iterator(); i.hasNext();) {                    URLConnection urlc = null;                    URL url = (URL) i.next();                    try {                        urlc = url.openConnection();                        urlc.setDoInput(false);                        urlc.setDoOutput(false);                        long dependentLastModified = urlc.getLastModified();                        if (dependentLastModified > ((Long) entry.dependencies.get(url)).longValue()) {                            dependencyOutOfDate = true;                            break;                        }                    } catch (IOException ioe) {                        dependencyOutOfDate = true;                        break;                    }                }            }            if (entry == null || entry.lastModified < lastModified || dependencyOutOfDate) {                // Make a new entry                entry = new ScriptCacheEntry();                // Closure variable                final ScriptCacheEntry finalEntry = entry;                // Compile the scriptName into an object                GroovyClassLoader groovyLoader =                        (GroovyClassLoader) AccessController.doPrivileged(new PrivilegedAction() {                            public Object run() {                                return new GroovyClassLoader(parentClassLoader) {                                    protected Class findClass(String className) throws ClassNotFoundException {                                        String filename = className.replace('.', File.separatorChar) + ".groovy";                                        URLConnection dependentScriptConn = null;                                        try {                                            dependentScriptConn = rc.getResourceConnection(filename);                                            finalEntry.dependencies.put(                                                    dependentScriptConn.getURL(),                                                    new Long(dependentScriptConn.getLastModified()));                                        } catch (ResourceException e1) {                                            throw new ClassNotFoundException("Could not read " + className + ": " + e1);                                        }                                        try {                                            return parseClass(dependentScriptConn.getInputStream(), filename);                                        } catch (CompilationFailedException e2) {                                            throw new ClassNotFoundException("Syntax error in " + className + ": " + e2);                                        } catch (IOException e2) {                                            throw new ClassNotFoundException("Problem reading " + className + ": " + e2);                                        }                                    }                                };                            }                        });                try {                    entry.scriptClass = groovyLoader.parseClass(groovyScriptConn.getInputStream(), scriptName);                } catch (Exception e) {                    throw new ScriptException("Could not parse scriptName: " + scriptName, e);                }                entry.lastModified = lastModified;                scriptCache.put(scriptName, entry);            }        }        return entry;    }    /**     * Run a script identified by name.     *     * @param scriptName name of the script to run     * @param argument a single argument passed as a variable named <code>arg</code> in the binding     * @return a <code>toString()</code> representation of the result of the execution of the script     * @throws ResourceException     * @throws ScriptException     */    public String run(String scriptName, String argument) throws ResourceException, ScriptException {        Binding binding = new Binding();        binding.setVariable("arg", argument);        Object result = run(scriptName, binding);        return result == null ? "" : result.toString();    }    /**     * Run a script identified by name.     *     * @param scriptName name of the script to run     * @param binding binding to pass to the script     * @return an object     * @throws ResourceException     * @throws ScriptException     */    public Object run(String scriptName, Binding binding) throws ResourceException, ScriptException {        ScriptCacheEntry entry = updateCacheEntry(scriptName, getParentClassLoader());        Script scriptObject = InvokerHelper.createScript(entry.scriptClass, binding);        return scriptObject.run();    }}

⌨️ 快捷键说明

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