summaryrefslogtreecommitdiffstats
path: root/branches
diff options
context:
space:
mode:
authorlresende <lresende@13f79535-47bb-0310-9956-ffa450edef68>2009-03-24 04:04:57 +0000
committerlresende <lresende@13f79535-47bb-0310-9956-ffa450edef68>2009-03-24 04:04:57 +0000
commitdd5ee330f0c67b8b5ce0c8a1755d56b4e101a68a (patch)
treea3ee30d1297f53c08dad9f3b8792eecf97633ca5 /branches
parent078e9b5b20bddce7f0077416c2853e0a613ce80a (diff)
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
Diffstat (limited to 'branches')
-rw-r--r--branches/sca-java-1.x/modules/implementation-widget-runtime/src/main/java/org/apache/tuscany/sca/implementation/widget/provider/WidgetImplementationInvoker.java185
-rw-r--r--branches/sca-java-1.x/modules/implementation-widget-runtime/src/main/java/org/apache/tuscany/sca/implementation/widget/provider/WidgetImplementationProvider.java55
-rw-r--r--branches/sca-java-1.x/modules/implementation-widget-runtime/src/main/java/org/apache/tuscany/sca/implementation/widget/provider/WidgetImplementationProviderFactory.java7
3 files changed, 61 insertions, 186 deletions
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<String, Boolean> bindingClientProcessed = new HashMap<String, Boolean>();
-
- 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<WidgetImplementation> {
+ 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<WidgetImplementation> getModelType() {