scriptedcreator.java
来自「反向的AJAX。最大的特性是我们成为反向的Ajax。DWR1.x允许你用java」· Java 代码 · 共 351 行
JAVA
351 行
/* * Copyright 2005 Joe Walker * * 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.directwebremoting.create;import java.io.File;import java.io.RandomAccessFile;import javax.servlet.ServletContext;import org.apache.bsf.BSFException;import org.apache.bsf.BSFManager;import org.directwebremoting.WebContext;import org.directwebremoting.WebContextFactory;import org.directwebremoting.extend.Creator;import org.directwebremoting.util.LocalUtil;import org.directwebremoting.util.Logger;import org.directwebremoting.util.Messages;/** * A creator that uses BeanShell to evaluate some script to create an object. * @author Joe Walker [joe at getahead dot ltd dot uk] * @author Dennis [devel at muhlesteins dot com] */public class ScriptedCreator extends AbstractCreator implements Creator{ /** * Set up some defaults */ public ScriptedCreator() { // The default is <b>true</b>. This parameter is only used if scriptPath is // used instead of script. When reloadable is true, ScriptedCreator will // check to see if the script has been modified before returning the // existing created class. setCacheable(false); } /** * The language that we are scripting in. Passed to BSF. * @return Returns the language. */ public String getLanguage() { return language; } /** * @param language The language to set. */ public void setLanguage(String language) { // It would be good to be ablt to check this, but this seems to fail // almost all the time // if (BSFManager.isLanguageRegistered(language)) // { // throw new IllegalArgumentException(Messages.getString("ScriptedCreator.IllegalLanguage", language)); // } this.language = language; } /** * Are we caching the script (default: false) * @return Returns the reloadable variable */ public boolean isReloadable() { return reloadable; } /** * @param reloadable Whether or not to reload the script. * The default is <b>true</b>. This parameter is only used if scriptPath is * used instead of script. When reloadable is true, ScriptedCreator will * check to see if the script has been modified before returning the * existing created class. */ public void setReloadable(boolean reloadable) { this.reloadable = reloadable; if (reloadable) { setCacheable(false); } } /** * Are we using dynamic classes (i.e. classes generated by BeanShell or * similar) in which case we want to reuse class defs. * @return Returns the useDynamicClasses flag state. */ public boolean isUseDynamicClasses() { return useDynamicClasses; } /** * Are we using dynamic classes (i.e. classes generated by BeanShell or * similar) in which case we want to reuse class defs. * @param useDynamicClasses The useDynamicClasses flag state. */ public void setUseDynamicClasses(boolean useDynamicClasses) { this.useDynamicClasses = useDynamicClasses; } /** * @return Returns the path of the script. */ public String getScriptPath() { return scriptPath; } /** * @param scriptPath Context reletive path to script. */ public void setScriptPath(String scriptPath) { if (scriptSrc != null) { throw new IllegalArgumentException(Messages.getString("ScriptCreator.MultipleScript")); } this.scriptPath = scriptPath; } /** * @return Whether or not the script (located at scriptPath) has been modified. */ private boolean scriptUpdated() { if (null == scriptPath) { return false; } ServletContext sc = WebContextFactory.get().getServletContext(); File scriptFile = new File(sc.getRealPath(scriptPath)); if (scriptModified < scriptFile.lastModified()) { log.debug("Script has been updated."); clazz = null; // make sure that this gets re-compiled. return true; } return false; } /** * @return Returns the script. * @throws InstantiationException */ public String getScript() throws InstantiationException { if (scriptSrc != null) { return scriptSrc; } if (scriptPath == null) { throw new InstantiationException(Messages.getString("ScriptedCreator.MissingScript")); } if (cachedScript != null && (!reloadable || !scriptUpdated())) { return cachedScript; } // load the script from the path log.debug("Loading Script from Path: " + scriptPath); RandomAccessFile in = null; try { ServletContext sc = WebContextFactory.get().getServletContext(); File scriptFile = new File(sc.getRealPath(scriptPath)); // This uses the platform default encoding. If there are complaints // from people wanting to read script files that are not in the // default platform encoding then we will need a new param that is // used here. scriptModified = scriptFile.lastModified(); in = new RandomAccessFile(scriptFile, "r"); byte bytes[] = new byte[(int) in.length()]; in.readFully(bytes); cachedScript = new String(bytes); return cachedScript; } catch (Exception ex) { log.error(ex.getMessage(), ex); throw new InstantiationException(Messages.getString("ScriptCreator.MissingScript")); } finally { LocalUtil.close(in); } } /** * @param scriptSrc The script to set. */ public void setScript(String scriptSrc) { if (scriptPath != null) { throw new IllegalArgumentException(Messages.getString("ScriptCreator.MultipleScript")); } if (scriptSrc == null || scriptSrc.trim().length() == 0) { throw new IllegalArgumentException(Messages.getString("ScriptedCreator.MissingScript")); } this.scriptSrc = scriptSrc; } /** * What sort of class do we create? * @param classname The name of the class */ public void setClass(String classname) { try { this.clazz = LocalUtil.classForName(classname); } catch (ClassNotFoundException ex) { throw new IllegalArgumentException(Messages.getString("Creator.ClassNotFound", classname)); } } /* (non-Javadoc) * @see org.directwebremoting.Creator#getType() */ public Class getType() { if (clazz == null || (reloadable && scriptUpdated())) { try { clazz = getInstance().getClass(); } catch (InstantiationException ex) { log.error("Failed to instansiate object to detect type.", ex); return Object.class; } } return clazz; } /* (non-Javadoc) * @see org.directwebremoting.Creator#getInstance() */ public Object getInstance() throws InstantiationException { try { if (useDynamicClasses && clazz != null) { return clazz.newInstance(); } BSFManager bsfman = new BSFManager(); try { WebContext context = WebContextFactory.get(); bsfman.declareBean("context", context, context.getClass()); } catch (BSFException ex) { log.warn("Failed to register WebContext with scripting engine: " + ex.getMessage()); } return bsfman.eval(language, (null == scriptPath ? "dwr.xml" : scriptPath), 0, 0, getScript()); } catch (Exception ex) { log.error("Error executing script", ex); throw new InstantiationException(Messages.getString("Creator.IllegalAccess")); } } /** * The log stream */ private static final Logger log = Logger.getLogger(ScriptedCreator.class); /** * The cached type of object that we are creating. */ private Class clazz = null; /** * The language that we are scripting in. Passed to BSF. */ private String language = null; /** * The script that we are asking BSF to execute in order to get an object. */ private String scriptSrc = null; /** * The path of the script we are asking BSF to execute. */ private String scriptPath = null; /** * Whether or not to reload the script. Only used if scriptPath is used. * ie: An inline script is not reloadable */ private boolean reloadable = true; /** * By default we assume that our scripts do not create classes dynamically. * If they do then we need to take some special care of them. */ private boolean useDynamicClasses = false; /** * Script modified time. Only used when scriptPath is used. */ private long scriptModified = -1; /** * Contents of script loaded from scriptPath */ private String cachedScript;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?