change in extension-mechanism:
initScripting() now returns a HashMap (key=varname, value=ESValue) which will be added to the global object by FesiEvaluator. This ensures that global vars are (re-)set before each request. DemoExtension was updated to reflect this change.
This commit is contained in:
		
							parent
							
								
									a4a0405241
								
							
						
					
					
						commit
						236a819d86
					
				
					 3 changed files with 33 additions and 30 deletions
				
			
		| 
						 | 
					@ -1,5 +1,7 @@
 | 
				
			||||||
package helma.extensions;
 | 
					package helma.extensions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.HashMap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import helma.framework.core.Application;
 | 
					import helma.framework.core.Application;
 | 
				
			||||||
import helma.main.Server;
 | 
					import helma.main.Server;
 | 
				
			||||||
import helma.scripting.ScriptingEngine;
 | 
					import helma.scripting.ScriptingEngine;
 | 
				
			||||||
| 
						 | 
					@ -19,26 +21,25 @@ public abstract class HelmaExtension {
 | 
				
			||||||
	public abstract void init (Server server) throws ConfigurationException;
 | 
						public abstract void init (Server server) throws ConfigurationException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	  * called when an Application is started.
 | 
						  * called when an Application is started. This should be <b>synchronized</b> when
 | 
				
			||||||
	  * This should be synchronized. Every application starting calls this method. Otherwise this could
 | 
						  * any self-initialization is performed.
 | 
				
			||||||
	  * lead to problems when more than one application starts at the same time.
 | 
					 | 
				
			||||||
	  */
 | 
						  */
 | 
				
			||||||
	public abstract void applicationStarted (Application app) throws ConfigurationException;
 | 
						public abstract void applicationStarted (Application app) throws ConfigurationException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	  * called when an Application is stopped.
 | 
						  * called when an Application is stopped.
 | 
				
			||||||
	  * This should be synchronized. Otherwise this could lead to problems when more than one
 | 
						  * This should be <b>synchronized</b> when any self-destruction is performed.
 | 
				
			||||||
	  * application gets stopped.
 | 
					 | 
				
			||||||
	  */
 | 
						  */
 | 
				
			||||||
	public abstract void applicationStopped (Application app);
 | 
						public abstract void applicationStopped (Application app);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	  * called by the ScriptingEngine when it is initizalized. throws a ConfigurationException
 | 
						  * called by the ScriptingEngine when it is initizalized. Throws a ConfigurationException
 | 
				
			||||||
	  * when this type of ScriptingEngine is not supported.
 | 
						  * when this type of ScriptingEngine is not supported. New methods and prototypes can be
 | 
				
			||||||
	  * This should be synchronized. Every application starting calls this method. Otherwise this could
 | 
						  * added to the scripting environment. New global vars should be returned in a HashMap
 | 
				
			||||||
	  * lead to problems when more than one application starts at the same time.
 | 
						  * with pairs of varname and ESObjects. This method should be <b>synchronized</b>, if it
 | 
				
			||||||
 | 
						  * performs any other self-initialization outside the scripting environment.
 | 
				
			||||||
	  */
 | 
						  */
 | 
				
			||||||
	public abstract void initScripting (Application app, ScriptingEngine engine) throws ConfigurationException;
 | 
						public abstract HashMap initScripting (Application app, ScriptingEngine engine) throws ConfigurationException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public abstract String getName ();
 | 
						public abstract String getName ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,7 @@
 | 
				
			||||||
package helma.extensions.demo;
 | 
					package helma.extensions.demo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.HashMap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import helma.extensions.HelmaExtension;
 | 
					import helma.extensions.HelmaExtension;
 | 
				
			||||||
import helma.extensions.ConfigurationException;
 | 
					import helma.extensions.ConfigurationException;
 | 
				
			||||||
import helma.framework.core.Application;
 | 
					import helma.framework.core.Application;
 | 
				
			||||||
| 
						 | 
					@ -41,29 +43,22 @@ public class DemoExtension extends HelmaExtension {
 | 
				
			||||||
	app.logEvent ("DemoExtension stopped on app " + app.getName () );
 | 
						app.logEvent ("DemoExtension stopped on app " + app.getName () );
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public void initScripting (Application app, ScriptingEngine engine) throws ConfigurationException {
 | 
						public HashMap initScripting (Application app, ScriptingEngine engine) throws ConfigurationException {
 | 
				
			||||||
	if (engine instanceof FesiEvaluator) {
 | 
						if (!(engine instanceof FesiEvaluator))
 | 
				
			||||||
	    try {
 | 
					 | 
				
			||||||
	        initFesi (app, engine);
 | 
					 | 
				
			||||||
	        app.logEvent("initScripting DemoExtension with " + app.getName () + " and " + engine.toString() );
 | 
					 | 
				
			||||||
	    } catch (EcmaScriptException ecma) {
 | 
					 | 
				
			||||||
	        throw new ConfigurationException (ecma.getMessage());
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
	    throw new ConfigurationException ("scripting engine " + engine.toString () + " not supported in DemoExtension");
 | 
						    throw new ConfigurationException ("scripting engine " + engine.toString () + " not supported in DemoExtension");
 | 
				
			||||||
	}
 | 
						app.logEvent("initScripting DemoExtension with " + app.getName () + " and " + engine.toString() );
 | 
				
			||||||
 | 
						// fesi-specific code:
 | 
				
			||||||
 | 
						Evaluator evaluator = ((FesiEvaluator)engine).getEvaluator ();
 | 
				
			||||||
 | 
						// initialize prototypes and global vars here, but don't add them to fesi's global object
 | 
				
			||||||
 | 
						ESWrapper demo = new ESWrapper(Server.getServer (), evaluator);
 | 
				
			||||||
 | 
						HashMap globals = new HashMap ();
 | 
				
			||||||
 | 
						globals.put ("demo",demo);
 | 
				
			||||||
 | 
						return globals;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public String getName () {
 | 
						public String getName () {
 | 
				
			||||||
	return "DemoExtension";
 | 
						return "DemoExtension";
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private void initFesi (Application app, ScriptingEngine engine) throws EcmaScriptException {
 | 
					 | 
				
			||||||
	Evaluator evaluator = ((FesiEvaluator)engine).getEvaluator ();
 | 
					 | 
				
			||||||
    ESObject demo = new ESWrapper(Server.getServer (), evaluator);
 | 
					 | 
				
			||||||
    GlobalObject go = evaluator.getGlobalObject();
 | 
					 | 
				
			||||||
	go.putHiddenProperty ("demo", demo);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,6 +60,8 @@ public final class FesiEvaluator implements ScriptingEngine {
 | 
				
			||||||
    // do lazy cleanup
 | 
					    // do lazy cleanup
 | 
				
			||||||
    Map lastGlobals = null;
 | 
					    Map lastGlobals = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// the global vars set by extensions
 | 
				
			||||||
 | 
						HashMap extensionGlobals;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public FesiEvaluator (Application app, RequestEvaluator reval) {
 | 
					    public FesiEvaluator (Application app, RequestEvaluator reval) {
 | 
				
			||||||
	this.app = app;
 | 
						this.app = app;
 | 
				
			||||||
| 
						 | 
					@ -78,13 +80,15 @@ public final class FesiEvaluator implements ScriptingEngine {
 | 
				
			||||||
	    mailx.setProperties (app.getProperties ());
 | 
						    mailx.setProperties (app.getProperties ());
 | 
				
			||||||
	    Database dbx = (Database) evaluator.addExtension ("helma.scripting.fesi.extensions.Database");
 | 
						    Database dbx = (Database) evaluator.addExtension ("helma.scripting.fesi.extensions.Database");
 | 
				
			||||||
	    dbx.setApplication (app);
 | 
						    dbx.setApplication (app);
 | 
				
			||||||
 | 
						    // load extensions defined in server.properties:
 | 
				
			||||||
	    // load extensions defined in server.properties
 | 
							extensionGlobals = new HashMap ();
 | 
				
			||||||
	    Vector extVec = Server.getServer ().getExtensions ();
 | 
						    Vector extVec = Server.getServer ().getExtensions ();
 | 
				
			||||||
	    for (int i=0; i<extVec.size(); i++ ) {
 | 
						    for (int i=0; i<extVec.size(); i++ ) {
 | 
				
			||||||
	        HelmaExtension ext = (HelmaExtension)extVec.get(i);
 | 
						        HelmaExtension ext = (HelmaExtension)extVec.get(i);
 | 
				
			||||||
	        try {
 | 
						        try {
 | 
				
			||||||
	            ext.initScripting (app,this);
 | 
						            HashMap tmpGlobals = ext.initScripting (app,this);
 | 
				
			||||||
 | 
						            if (tmpGlobals!=null)
 | 
				
			||||||
 | 
						                extensionGlobals.putAll(tmpGlobals);
 | 
				
			||||||
	        } catch (ConfigurationException e) {
 | 
						        } catch (ConfigurationException e) {
 | 
				
			||||||
	            app.logEvent ("Couldn't initialize extension " + ext.getName () + ": " + e.getMessage ());
 | 
						            app.logEvent ("Couldn't initialize extension " + ext.getName () + ": " + e.getMessage ());
 | 
				
			||||||
	        }
 | 
						        }
 | 
				
			||||||
| 
						 | 
					@ -279,6 +283,7 @@ public final class FesiEvaluator implements ScriptingEngine {
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public void enterContext (HashMap globals) throws ScriptingException {
 | 
					    public void enterContext (HashMap globals) throws ScriptingException {
 | 
				
			||||||
	// set globals on the global object
 | 
						// set globals on the global object
 | 
				
			||||||
 | 
						globals.putAll(extensionGlobals);
 | 
				
			||||||
	if (globals != null && globals != lastGlobals) {
 | 
						if (globals != null && globals != lastGlobals) {
 | 
				
			||||||
	    // loop through global vars and set them
 | 
						    // loop through global vars and set them
 | 
				
			||||||
	    for (Iterator i=globals.keySet().iterator(); i.hasNext(); ) {
 | 
						    for (Iterator i=globals.keySet().iterator(); i.hasNext(); ) {
 | 
				
			||||||
| 
						 | 
					@ -313,6 +318,8 @@ public final class FesiEvaluator implements ScriptingEngine {
 | 
				
			||||||
	                sv = new ESBeanWrapper (new SessionBean ((Session)v), this);
 | 
						                sv = new ESBeanWrapper (new SessionBean ((Session)v), this);
 | 
				
			||||||
	            } else if ("app".equals (k)) {
 | 
						            } else if ("app".equals (k)) {
 | 
				
			||||||
	                sv = new ESBeanWrapper (new ApplicationBean ((Application)v), this);
 | 
						                sv = new ESBeanWrapper (new ApplicationBean ((Application)v), this);
 | 
				
			||||||
 | 
						            } else if (v instanceof ESValue) {
 | 
				
			||||||
 | 
						                sv = (ESValue)v;
 | 
				
			||||||
	            } else {
 | 
						            } else {
 | 
				
			||||||
	                sv = ESLoader.normalizeValue (v, evaluator);
 | 
						                sv = ESLoader.normalizeValue (v, evaluator);
 | 
				
			||||||
	            }
 | 
						            }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue