You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by do...@apache.org on 2007/12/10 16:15:29 UTC

svn commit: r602928 - in /felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox: sosoc/ sosoc/descriptor/json/ sosoc/extender/ sosoc/manager/rhino/ sosoc/manager/script/ util/load/

Author: donsez
Date: Mon Dec 10 07:15:27 2007
New Revision: 602928

URL: http://svn.apache.org/viewvc?rev=602928&view=rev
Log:
add compiled script support

Added:
    felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/descriptor/json/
    felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/extender/
Modified:
    felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/SOSOCActivator.java
    felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/rhino/JavaScriptComponentManager.java
    felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/rhino/JavaScriptContainer.java
    felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/script/ScriptComponentManager.java
    felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/script/ScriptContainer.java
    felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/util/load/LoadUtils.java

Modified: felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/SOSOCActivator.java
URL: http://svn.apache.org/viewvc/felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/SOSOCActivator.java?rev=602928&r1=602927&r2=602928&view=diff
==============================================================================
--- felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/SOSOCActivator.java (original)
+++ felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/SOSOCActivator.java Mon Dec 10 07:15:27 2007
@@ -236,10 +236,10 @@
 			componentManager = new JavaComponentManager(this, descriptor,m_logger);
 		} else if(language.toLowerCase().startsWith("javascript") || language.toLowerCase().startsWith("jscript")) {
 			 // create the instance manager for JavaScript component
-			 componentManager = new JavaScriptComponentManager(this, descriptor,m_logger,m_baseUrlStr);
+			 componentManager = new JavaScriptComponentManager(this, bundleContext, descriptor,m_logger,m_baseUrlStr);
 		} else {
 			 // create the instance manager for Script component (javax.script)
-			componentManager = new ScriptComponentManager(this,descriptor,m_logger,m_baseUrlStr);
+			componentManager = new ScriptComponentManager(this, bundleContext, descriptor,m_logger,m_baseUrlStr);
 		}
 //		 else {
 //			throw new IllegalArgumentException(language+ " components are not supported in this version");

Modified: felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/rhino/JavaScriptComponentManager.java
URL: http://svn.apache.org/viewvc/felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/rhino/JavaScriptComponentManager.java?rev=602928&r1=602927&r2=602928&view=diff
==============================================================================
--- felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/rhino/JavaScriptComponentManager.java (original)
+++ felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/rhino/JavaScriptComponentManager.java Mon Dec 10 07:15:27 2007
@@ -27,6 +27,7 @@
 import java.util.Map;
 
 import org.apache.felix.sandbox.sosoc.SOSOCActivator;
+import org.apache.felix.sandbox.sosoc.descriptor.xml.Attribute;
 import org.apache.felix.sandbox.sosoc.descriptor.xml.Component;
 import org.apache.felix.sandbox.sosoc.descriptor.xml.Implementation;
 import org.apache.felix.sandbox.sosoc.descriptor.xml.Reference;
@@ -37,6 +38,8 @@
 import org.apache.felix.sandbox.sosoc.manager.ReferenceManager;
 import org.apache.felix.sandbox.util.load.LoadUtils;
 import org.apache.felix.sandbox.util.replace.ReplaceUtility;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
 
 /**
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
@@ -45,10 +48,13 @@
 
 	JavaScriptContainer container;
 	
+	private BundleContext bundleContext; 	
+	
 	private String baseUrlStr; 
 	
-	public JavaScriptComponentManager(SOSOCActivator activator, Component componentDescriptor, Logger logger, String baseUrlStr) throws Exception {
+	public JavaScriptComponentManager(SOSOCActivator activator, BundleContext bundleContext, Component componentDescriptor, Logger logger, String baseUrlStr) throws Exception {
 		super(activator, componentDescriptor, logger);
+		this.bundleContext=bundleContext;
 		this.baseUrlStr=baseUrlStr;
 	}
 
@@ -57,6 +63,18 @@
 		// load the text of the script
 		Implementation implementation = componentDescription.getImplementation();
 		List attributes=implementation.getAttributes();
+		
+		Map/*<String, String>*/ mapAttributes=new HashMap/*<String, String>*/();
+		if(attributes!=null) {
+			for (Iterator iterator = attributes.iterator(); iterator.hasNext();) {
+				Attribute attribute = (Attribute) iterator.next();
+				String value=attribute.getValue();
+				if(value==null) value=attribute.getText();
+				if(value!=null) mapAttributes.put(attribute.getName(), value);
+				
+			}
+		}
+		
 		List sources=implementation.getSources();
 		
 		String scriptText = null;
@@ -83,7 +101,7 @@
 					}
 					scriptText = LoadUtils.loadAsUrl(url.toExternalForm());
 				} else if (source.getEntry() != null) {
-					scriptText = LoadUtils.loadAsRessource(m_activator.getClass().getClassLoader(), source.getEntry());
+					scriptText = LoadUtils.loadAsRessource(bundleContext, source.getEntry());
 				}
 						
 				// text is appended to the external script texts
@@ -111,18 +129,20 @@
 		}
 		
 		String[] interfaceNames = componentDescription.getServiceInterfaces();
-		ClassLoader cl = m_activator.getClass().getClassLoader();
 		Class[] interfaces=null;
+		Bundle bundle=bundleContext.getBundle();
 		if(interfaceNames!=null){
 			interfaces = new Class[interfaceNames.length];
 			for (int i = 0; i < interfaceNames.length; i++) {
-				interfaces[i] = cl.loadClass(interfaceNames[i]);
+				interfaces[i] = bundle.loadClass(interfaceNames[i]);
 			}
 		}
 
-		container=new JavaScriptContainer(scriptText,m_logger);
+		container=new JavaScriptContainer(scriptText,m_logger,"true".equalsIgnoreCase((String)mapAttributes.get("compile")));
 
 		if(interfaces!=null){
+			// May not work with extender model
+			ClassLoader cl=m_activator.getClass().getClassLoader();
 			return Proxy.newProxyInstance(cl, interfaces, container);
 		} else {
 			return container;

Modified: felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/rhino/JavaScriptContainer.java
URL: http://svn.apache.org/viewvc/felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/rhino/JavaScriptContainer.java?rev=602928&r1=602927&r2=602928&view=diff
==============================================================================
--- felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/rhino/JavaScriptContainer.java (original)
+++ felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/rhino/JavaScriptContainer.java Mon Dec 10 07:15:27 2007
@@ -42,11 +42,14 @@
 
 		private Scriptable scope = null;
 
+		private boolean compile;
+
 		private Logger m_logger;
 
-		public JavaScriptContainer(String scriptText, Logger logger) {
+		public JavaScriptContainer(String scriptText, Logger logger, boolean compile) {
 			this.scriptText = scriptText;
 			this.m_logger = logger;
+			this.compile = compile;
 			start();
 
 		}
@@ -74,8 +77,13 @@
 			// Now we can evaluate a script. Let's create a new object
 			// using the object literal notation.
 			/* Object result = */
-			scriptContext.evaluateString(scope, scriptText, this.getClass().getName()
-			/* + (++javaScriptInstanceNumber) */, 1, null);
+			
+			if(compile){
+				scriptContext.compileString(scriptText, this.getClass().getName()/* + (++javaScriptInstanceNumber) */, 1, null);				
+			} else {
+				scriptContext.evaluateString(scope, scriptText, this.getClass().getName()/* + (++javaScriptInstanceNumber) */, 1, null);
+			}
+			
 			// TODO give a script instance number instead of the name of the manager
 
 			Context.exit();

Modified: felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/script/ScriptComponentManager.java
URL: http://svn.apache.org/viewvc/felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/script/ScriptComponentManager.java?rev=602928&r1=602927&r2=602928&view=diff
==============================================================================
--- felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/script/ScriptComponentManager.java (original)
+++ felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/script/ScriptComponentManager.java Mon Dec 10 07:15:27 2007
@@ -27,6 +27,7 @@
 import java.util.Map;
 
 import org.apache.felix.sandbox.sosoc.SOSOCActivator;
+import org.apache.felix.sandbox.sosoc.descriptor.xml.Attribute;
 import org.apache.felix.sandbox.sosoc.descriptor.xml.Component;
 import org.apache.felix.sandbox.sosoc.descriptor.xml.Implementation;
 import org.apache.felix.sandbox.sosoc.descriptor.xml.Reference;
@@ -37,6 +38,8 @@
 import org.apache.felix.sandbox.sosoc.manager.ReferenceManager;
 import org.apache.felix.sandbox.util.load.LoadUtils;
 import org.apache.felix.sandbox.util.replace.ReplaceUtility;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
 
 /**
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
@@ -47,8 +50,12 @@
 
 	private String baseUrlStr; 
 	
-	public ScriptComponentManager(SOSOCActivator activator, Component componentDescriptor, Logger logger, String baseUrlStr) throws Exception {
+	private BundleContext bundleContext; 	
+
+	
+	public ScriptComponentManager(SOSOCActivator activator, BundleContext bundleContext, Component componentDescriptor, Logger logger, String baseUrlStr) throws Exception {
 		super(activator, componentDescriptor,logger);
+		this.bundleContext=bundleContext;
 		this.baseUrlStr=baseUrlStr;
 	}
 
@@ -57,6 +64,18 @@
 		// load the text of the script
 		Implementation implementation = componentDescription.getImplementation();
 		List attributes=implementation.getAttributes();
+		
+		Map/*<String, String>*/ mapAttributes=new HashMap/*<String, String>*/();
+		if(attributes!=null) {
+			for (Iterator iterator = attributes.iterator(); iterator.hasNext();) {
+				Attribute attribute = (Attribute) iterator.next();
+				String value=attribute.getValue();
+				if(value==null) value=attribute.getText();
+				if(value!=null) mapAttributes.put(attribute.getName(), value);
+				
+			}
+		}
+				
 		List sources=implementation.getSources();
 		
 		String scriptText = null;
@@ -83,7 +102,7 @@
 					}
 					scriptText = LoadUtils.loadAsUrl(url.toExternalForm());
 				} else if (source.getEntry() != null) {
-					scriptText = LoadUtils.loadAsRessource(m_activator.getClass().getClassLoader(), source.getEntry());
+					scriptText = LoadUtils.loadAsRessource(bundleContext, source.getEntry());
 				}
 						
 				// text is appended to the external script texts
@@ -111,16 +130,18 @@
 		}
 				
 		String[] interfaceNames = componentDescription.getServiceInterfaces();
-		ClassLoader cl = m_activator.getClass().getClassLoader();
 		Class[] interfaces=null;
+		Bundle bundle=bundleContext.getBundle();
 		if(interfaceNames!=null){
 			interfaces = new Class[interfaceNames.length];
 			for (int i = 0; i < interfaceNames.length; i++) {
-				interfaces[i] = cl.loadClass(interfaceNames[i]);
+				interfaces[i] = bundle.loadClass(interfaceNames[i]);
 			}
 		}
-
-		container = new ScriptContainer(implementation.getLanguage(),scriptText,m_logger);
+		
+		// May not work with extender model
+		ClassLoader cl=m_activator.getClass().getClassLoader();
+		container = new ScriptContainer(implementation.getLanguage(),scriptText,cl,m_logger,"true".equalsIgnoreCase((String)mapAttributes.get("compile")));
 
 		if(interfaces!=null){
 			return Proxy.newProxyInstance(cl, interfaces, container);

Modified: felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/script/ScriptContainer.java
URL: http://svn.apache.org/viewvc/felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/script/ScriptContainer.java?rev=602928&r1=602927&r2=602928&view=diff
==============================================================================
--- felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/script/ScriptContainer.java (original)
+++ felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/sosoc/manager/script/ScriptContainer.java Mon Dec 10 07:15:27 2007
@@ -22,6 +22,7 @@
 import java.lang.reflect.Method;
 
 import javax.script.Bindings;
+import javax.script.Compilable;
 import javax.script.Invocable;
 import javax.script.ScriptContext;
 import javax.script.ScriptEngine;
@@ -37,7 +38,7 @@
  */
 public class ScriptContainer implements InvocationHandler {
 
-	private static ScriptEngineManager manager = new ScriptEngineManager();
+	private ScriptEngineManager manager;
 	
 	private String scriptText;
 
@@ -51,10 +52,13 @@
 
 	private Logger m_logger;
 
-	public ScriptContainer(String language, String scriptText, Logger logger) throws Exception {
+	public ScriptContainer(String language, String scriptText, ClassLoader classLoader, Logger logger, boolean compile) throws Exception {
 		this.scriptText = scriptText;
 		this.m_logger = logger;
+		this.language=language;
 		// Return script engine by name
+		//manager= new ScriptEngineManager(classLoader);
+		manager= new ScriptEngineManager();
 		engine = manager.getEngineByName(language);
 
 		if (engine == null)
@@ -65,7 +69,12 @@
 	    scriptContext = engine.getContext();
 	    bindings=engine.getBindings(ScriptContext.ENGINE_SCOPE);
 	    scriptContext.setBindings(bindings,ScriptContext.ENGINE_SCOPE);
-		engine.eval(this.scriptText);
+	    
+	    if(compile && engine instanceof Compilable) {
+	    	((Compilable)engine).compile(this.scriptText);
+	    } else {
+	    	engine.eval(this.scriptText);
+	    }
 	}
 
 	/**

Modified: felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/util/load/LoadUtils.java
URL: http://svn.apache.org/viewvc/felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/util/load/LoadUtils.java?rev=602928&r1=602927&r2=602928&view=diff
==============================================================================
--- felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/util/load/LoadUtils.java (original)
+++ felix/sandbox/donsez/sosoc/src/main/java/org/apache/felix/sandbox/util/load/LoadUtils.java Mon Dec 10 07:15:27 2007
@@ -25,6 +25,8 @@
 import java.io.InputStream;
 import java.net.URL;
 
+import org.osgi.framework.BundleContext;
+
 /**
  * Utility class to load text from URL or Ressources
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
@@ -34,53 +36,25 @@
 	public static String loadAsUrl(String urlStr) throws Exception {
 		URL url = null;
 		url = new URL(urlStr);
-		InputStream inputStream = null;
-		BufferedInputStream bufferedInputStream = null;
-		ByteArrayOutputStream byteArrayOutputStream = null;
+		return load(url.openStream());
+	}
 
-		try {
-			inputStream = url.openStream();
-			bufferedInputStream = new BufferedInputStream(inputStream);
-			byteArrayOutputStream = new ByteArrayOutputStream();
-			int n;
-			byte[] buffer = new byte[512];
-			while ((n = bufferedInputStream.read(buffer)) != -1) {
-				byteArrayOutputStream.write(buffer, 0, n);
-			}
-			bufferedInputStream.close();
-			inputStream=null;
-			bufferedInputStream=null;
+	public static String loadAsRessource(ClassLoader classLoader, String path)
+	 throws Exception {
+		return load(classLoader.getResourceAsStream(path));
+	}
 
-			String res = new String(byteArrayOutputStream.toByteArray());
-			return res;
-		} finally {
-			if (bufferedInputStream != null)
-				try {
-					bufferedInputStream.close();
-					inputStream = null;
-				} catch (IOException e) {
-				}
-			if (inputStream != null)
-				try {
-					inputStream.close();
-				} catch (IOException e) {
-				}
-			if (byteArrayOutputStream != null)
-				try {
-					byteArrayOutputStream.close();
-				} catch (IOException e) {
-				}
-		}
+	public static String loadAsRessource(BundleContext bundleContext, String path)
+	 throws Exception {
+		return load(bundleContext.getBundle().getEntry(path).openStream());
 	}
 
-	public static String loadAsRessource(ClassLoader classLoader, String path)
+	public static String load(InputStream inputStream)
 	 throws Exception {
-		InputStream inputStream = null;
 		BufferedInputStream bufferedInputStream = null;
 		ByteArrayOutputStream byteArrayOutputStream = null;
 
 		try {
-			inputStream = classLoader.getResourceAsStream(path);
 			bufferedInputStream = new BufferedInputStream(inputStream);
 			byteArrayOutputStream = new ByteArrayOutputStream();
 			int n;
@@ -112,6 +86,5 @@
 				} catch (IOException e) {
 				}
 		}
-	}
-
+	}	
 }