From dd5ee330f0c67b8b5ce0c8a1755d56b4e101a68a Mon Sep 17 00:00:00 2001 From: lresende Date: Tue, 24 Mar 2009 04:04:57 +0000 Subject: TUSCANY-2838 - Updating implementation widget to properly register component java script in a webapp environment git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@757655 13f79535-47bb-0310-9956-ffa450edef68 --- .../provider/WidgetImplementationInvoker.java | 185 +-------------------- .../provider/WidgetImplementationProvider.java | 55 +++++- .../WidgetImplementationProviderFactory.java | 7 +- 3 files changed, 61 insertions(+), 186 deletions(-) (limited to 'branches/sca-java-1.x/modules/implementation-widget-runtime/src') diff --git a/branches/sca-java-1.x/modules/implementation-widget-runtime/src/main/java/org/apache/tuscany/sca/implementation/widget/provider/WidgetImplementationInvoker.java b/branches/sca-java-1.x/modules/implementation-widget-runtime/src/main/java/org/apache/tuscany/sca/implementation/widget/provider/WidgetImplementationInvoker.java index cbeb2566b3..3b8e92be5e 100644 --- a/branches/sca-java-1.x/modules/implementation-widget-runtime/src/main/java/org/apache/tuscany/sca/implementation/widget/provider/WidgetImplementationInvoker.java +++ b/branches/sca-java-1.x/modules/implementation-widget-runtime/src/main/java/org/apache/tuscany/sca/implementation/widget/provider/WidgetImplementationInvoker.java @@ -19,26 +19,15 @@ package org.apache.tuscany.sca.implementation.widget.provider; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.PrintWriter; import java.net.MalformedURLException; -import java.net.URI; import java.net.URISyntaxException; import java.net.URL; -import java.util.HashMap; -import java.util.Map; -import org.apache.tuscany.sca.assembly.Binding; -import org.apache.tuscany.sca.assembly.ComponentProperty; -import org.apache.tuscany.sca.assembly.ComponentReference; import org.apache.tuscany.sca.invocation.Invoker; import org.apache.tuscany.sca.invocation.Message; import org.apache.tuscany.sca.runtime.RuntimeComponent; -import org.w3c.dom.Document; -import org.w3c.dom.Element; /** @@ -75,7 +64,7 @@ class WidgetImplementationInvoker implements Invoker { } else if (id.equals(widgetName)) { // Generate JavaScript header for use in the Widget - InputStream is = generateWidgetCode(); + InputStream is = WidgetComponentScriptGenerator.generateWidgetCode(component); msg.setBody(is); } else { @@ -103,176 +92,4 @@ class WidgetImplementationInvoker implements Invoker { } return msg; } - - /** - * This helper class concatenates the necessary JavaScript client code into a - * single JavaScript per component - */ - private InputStream generateWidgetCode() throws IOException, URISyntaxException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - PrintWriter pw = new PrintWriter(bos); - - pw.println(); - pw.println("/* Apache Tuscany SCA Widget header */"); - pw.println(); - - Map bindingClientProcessed = new HashMap(); - - for(ComponentReference reference : component.getReferences()) { - for(Binding binding : reference.getBindings()) { - String [] bindingProxyNames = WidgetProxyHelper.getJavaScriptProxyFile(binding.getClass().getName()); - //check if binding client code was already processed and inject to the generated script - if ( bindingProxyNames != null ) { - for ( int i = 0; i < bindingProxyNames.length; i++ ) { - String bindingProxyName = bindingProxyNames[ i ]; - if(bindingProxyName != null) { - Boolean processedFlag = bindingClientProcessed.get(bindingProxyName); - if( processedFlag == null || processedFlag.booleanValue() == false) { - generateJavaScriptBindingProxy(pw,bindingProxyName); - bindingClientProcessed.put(bindingProxyName, Boolean.TRUE); - } - } - } - } - } - } - - //define tuscany.sca namespace - generateJavaScriptNamespace(pw); - - pw.println(); - - //process properties - generateJavaScriptPropertyFunction(pw); - - pw.println(); - - //process references - generateJavaScriptReferenceFunction(pw); - - - pw.println(); - pw.println("/** End of Apache Tuscany SCA Widget */"); - pw.println(); - pw.flush(); - pw.close(); - - return new ByteArrayInputStream(bos.toByteArray()); - } - - /** - * Retrieve the binding proxy based on the bind name - * and embedded the JavaScript into this js - */ - private void generateJavaScriptBindingProxy(PrintWriter pw, String bindingProxyName) throws IOException { - //FIXME: Handle the case where the JavaScript binding client is not found - InputStream is = getClass().getClassLoader().getResourceAsStream(bindingProxyName); - if (is != null) { - int i; - while ((i = is.read()) != -1) { - pw.write(i); - } - } - - pw.println(); - pw.println(); - } - - private void generateJavaScriptNamespace(PrintWriter pw) throws IOException { - pw.println("if (!tuscany) { \n" + - "var tuscany = {}; \n" + - "}"); - pw.println("if (!tuscany.sca) { \n" + - "tuscany.sca = {}; \n" + - "}"); - } - - /** - * Generate JavaScript code to inject SCA Properties - * @param pw - * @throws IOException - */ - private void generateJavaScriptPropertyFunction(PrintWriter pw) throws IOException { - pw.println("tuscany.sca.propertyMap = new String();"); - for(ComponentProperty property : component.getProperties()) { - String propertyName = property.getName(); - - pw.println("tuscany.sca.propertyMap." + propertyName + " = \"" + getPropertyValue(property) + "\""); - } - - pw.println("tuscany.sca.Property = function (name) {"); - pw.println(" return tuscany.sca.propertyMap[name];"); - pw.println("}"); - } - - /** - * Convert property value to String - * @param property - * @return - */ - private String getPropertyValue(ComponentProperty property) { - Document doc = (Document)property.getValue(); - Element rootElement = doc.getDocumentElement(); - - String value = null; - - //FIXME : Provide support for isMany and other property types - - if (rootElement.getChildNodes().getLength() > 0) { - value = rootElement.getChildNodes().item(0).getTextContent(); - } - - return value; - } - - /** - * Generate JavaScript code to inject SCA References - * @param pw - * @throws IOException - */ - private void generateJavaScriptReferenceFunction (PrintWriter pw) throws IOException, URISyntaxException { - - pw.println("tuscany.sca.referenceMap = new Object();"); - for(ComponentReference reference : component.getReferences()) { - String referenceName = reference.getName(); - Binding binding = reference.getBindings().get(0); - if (binding != null) { - - String proxyClient = WidgetProxyHelper.getJavaScriptProxyClient(binding.getClass().getName()); - if(proxyClient != null) { - - // Generate the JavaScript proxy configuration code - // Proxies are configured with the target URI path, as at this point we shouldn't - // be generating proxies that communicate with other hosts (if a proxy needs to - // communicate with another host it should be generated on and served by - // that particular host) - - /* - URI targetURI = URI.create(binding.getURI()); - String targetPath; - if(targetURI.getScheme() == null) { - targetPath = targetURI.getPath(); - } else { - targetPath = targetURI.toString(); - } - */ - - URI targetURI = URI.create(binding.getURI()); - String targetPath = targetURI.getPath(); - - if(proxyClient.equals("JSONRpcClient")) { - //FIXME Proxies should follow the same pattern, saving us from having to test for JSONRpc here - pw.println("tuscany.sca.referenceMap." + referenceName + " = new " + proxyClient + "(\"" + targetPath + "\").Service;"); - } else { - pw.println("tuscany.sca.referenceMap." + referenceName + " = new " + proxyClient + "(\"" + targetPath + "\");"); - } - } - } - } - - pw.println("tuscany.sca.Reference = function (name) {"); - pw.println(" return tuscany.sca.referenceMap[name];"); - pw.println("}"); - } - } diff --git a/branches/sca-java-1.x/modules/implementation-widget-runtime/src/main/java/org/apache/tuscany/sca/implementation/widget/provider/WidgetImplementationProvider.java b/branches/sca-java-1.x/modules/implementation-widget-runtime/src/main/java/org/apache/tuscany/sca/implementation/widget/provider/WidgetImplementationProvider.java index 61176d912c..26f8c78677 100644 --- a/branches/sca-java-1.x/modules/implementation-widget-runtime/src/main/java/org/apache/tuscany/sca/implementation/widget/provider/WidgetImplementationProvider.java +++ b/branches/sca-java-1.x/modules/implementation-widget-runtime/src/main/java/org/apache/tuscany/sca/implementation/widget/provider/WidgetImplementationProvider.java @@ -18,6 +18,12 @@ */ package org.apache.tuscany.sca.implementation.widget.provider; +import java.net.URI; + +import javax.servlet.Servlet; + +import org.apache.tuscany.sca.assembly.ComponentService; +import org.apache.tuscany.sca.host.http.ServletHost; import org.apache.tuscany.sca.implementation.widget.WidgetImplementation; import org.apache.tuscany.sca.interfacedef.Operation; import org.apache.tuscany.sca.invocation.Invoker; @@ -32,16 +38,25 @@ import org.apache.tuscany.sca.runtime.RuntimeComponentService; * @version $Rev$ $Date$ */ class WidgetImplementationProvider implements ImplementationProvider { + private RuntimeComponent component; + + private ServletHost servletHost; + private String widgetLocationURL; private String widgetFolderURL; private String widgetName; + + private String scriptURI; /** * Constructs a new resource implementation provider. */ - WidgetImplementationProvider(RuntimeComponent component, WidgetImplementation implementation) { + WidgetImplementationProvider(RuntimeComponent component, WidgetImplementation implementation, ServletHost servletHost) { this.component = component; + + this.servletHost = servletHost; + widgetLocationURL = implementation.getLocationURL().toString(); int s = widgetLocationURL.lastIndexOf('/'); widgetFolderURL = widgetLocationURL.substring(0, s); @@ -59,9 +74,47 @@ class WidgetImplementationProvider implements ImplementationProvider { } public void start() { + System.out.println(">>> Starting component : " + this.component.getName()); + + String contextRoot = getContextRoot(); + + // get the ScaDomainScriptServlet, if it doesn't yet exist create one + // this uses removeServletMapping / addServletMapping as there is no getServletMapping facility + scriptURI = URI.create(contextRoot + "/" + this.widgetName + ".js").toString(); + Servlet servlet = servletHost.getServletMapping(scriptURI); + if (servlet == null /*|| servlet instanceof HTTPGetListenerServlet*/) { + WidgetComponentScriptServlet widgetScriptServlet; + widgetScriptServlet = new WidgetComponentScriptServlet(this.component); + servletHost.addServletMapping(scriptURI, widgetScriptServlet); + } else { + System.out.println(">>>Servlet::" + servlet.getClass().toString()); + } } public void stop() { + // Unregister the component client script Servlet + WidgetComponentScriptServlet widgetScriptServlet = (WidgetComponentScriptServlet) servletHost.getServletMapping(scriptURI); + if (widgetScriptServlet != null) { + // Remove the Servlet mapping + servletHost.removeServletMapping(scriptURI); + } } + + + private String getContextRoot() { + String contextRoot = null; + + for(ComponentService service : component.getServices()) { + if("Widget".equals(service.getName())) { + for(org.apache.tuscany.sca.assembly.Binding binding : service.getBindings()) { + if( binding.getClass().getName().contains("HTTPBinding")) { + contextRoot = binding.getURI(); + } + } + } + } + + return contextRoot == null ? "" : contextRoot; + } } diff --git a/branches/sca-java-1.x/modules/implementation-widget-runtime/src/main/java/org/apache/tuscany/sca/implementation/widget/provider/WidgetImplementationProviderFactory.java b/branches/sca-java-1.x/modules/implementation-widget-runtime/src/main/java/org/apache/tuscany/sca/implementation/widget/provider/WidgetImplementationProviderFactory.java index c57680fa1c..f702cc7eb5 100644 --- a/branches/sca-java-1.x/modules/implementation-widget-runtime/src/main/java/org/apache/tuscany/sca/implementation/widget/provider/WidgetImplementationProviderFactory.java +++ b/branches/sca-java-1.x/modules/implementation-widget-runtime/src/main/java/org/apache/tuscany/sca/implementation/widget/provider/WidgetImplementationProviderFactory.java @@ -19,6 +19,8 @@ package org.apache.tuscany.sca.implementation.widget.provider; import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.host.http.ServletHost; +import org.apache.tuscany.sca.host.http.ServletHostExtensionPoint; import org.apache.tuscany.sca.implementation.widget.WidgetImplementation; import org.apache.tuscany.sca.provider.ImplementationProvider; import org.apache.tuscany.sca.provider.ImplementationProviderFactory; @@ -30,15 +32,18 @@ import org.apache.tuscany.sca.runtime.RuntimeComponent; * @version $Rev$ $Date$ */ public class WidgetImplementationProviderFactory implements ImplementationProviderFactory { + private ServletHost servletHost; /** * Constructs a resource implementation. */ public WidgetImplementationProviderFactory(ExtensionPointRegistry extensionPoints) { + ServletHostExtensionPoint servletHosts = extensionPoints.getExtensionPoint(ServletHostExtensionPoint.class); + this.servletHost = servletHosts.getServletHosts().get(0); } public ImplementationProvider createImplementationProvider(RuntimeComponent component, WidgetImplementation implementation) { - return new WidgetImplementationProvider(component, implementation); + return new WidgetImplementationProvider(component, implementation, servletHost); } public Class getModelType() { -- cgit v1.2.3