diff options
Diffstat (limited to 'sca-java-2.x/tags/2.0-Beta1-RC2/modules/implementation-web-client/src/main')
3 files changed, 351 insertions, 0 deletions
diff --git a/sca-java-2.x/tags/2.0-Beta1-RC2/modules/implementation-web-client/src/main/java/org/apache/tuscany/sca/implementation/web/client/ClientServlet.java b/sca-java-2.x/tags/2.0-Beta1-RC2/modules/implementation-web-client/src/main/java/org/apache/tuscany/sca/implementation/web/client/ClientServlet.java new file mode 100644 index 0000000000..f827c56241 --- /dev/null +++ b/sca-java-2.x/tags/2.0-Beta1-RC2/modules/implementation-web-client/src/main/java/org/apache/tuscany/sca/implementation/web/client/ClientServlet.java @@ -0,0 +1,259 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.tuscany.sca.implementation.web.client; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.core.invocation.ExtensibleProxyFactory; +import org.apache.tuscany.sca.interfacedef.java.JavaInterface; +import org.apache.tuscany.sca.runtime.RuntimeEndpointReference; +import org.directwebremoting.Container; +import org.directwebremoting.create.AbstractCreator; +import org.directwebremoting.extend.CreatorManager; +import org.directwebremoting.extend.Handler; +import org.directwebremoting.extend.Remoter; +import org.directwebremoting.servlet.DwrServlet; +import org.directwebremoting.servlet.EngineHandler; +import org.directwebremoting.servlet.PathConstants; +import org.directwebremoting.servlet.UrlProcessor; + +/** + * Tuscany customized DWR Servlet to implement support for the DWR binding + * + * Handles requests for SCA services and references that use <binding.dwr> + */ +public class ClientServlet extends DwrServlet { + private static final long serialVersionUID = 1L; + + private transient Map<String, RuntimeEndpointReference> serviceRefs; +// private transient List<String> referenceNames; + private transient boolean initialized; + private transient Map<String, String> initParams; + + public static final String SCRIPT_PATH = "/org.oasisopen.sca.componentContext.js"; + + public ClientServlet() { + this.serviceRefs = new HashMap<String, RuntimeEndpointReference>(); +// this.referenceNames = new ArrayList<String>(); + + this.initParams = new HashMap<String, String>(); + // maybe use <binding.dwr> attributes to define the init params + initParams.put("activeReverseAjaxEnabled", "true"); + } + + @Override + public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { + super.service(req, res); + } + + /** + * Initialize the Servlet + * There is a single instance of this Servlet which is registered + * for multiple path mappings, but the init should only run once. + */ + @Override + public void init(ServletConfig servletConfig) throws ServletException { + if (!initialized) { + super.init(patchConfig(servletConfig)); + addScriptHandler(); + // initServices(); + initialized = true; + } + } + + /** + * Add in the handler to process the HTTP get for /sca/scaDomain.js + * + * This wrappers the DWR Engine handler which returns the DWR engine.js script, + * this wrappers that handler so as to add Tuscany specific header and footer code + * to the DWR engine.js to define the Tuscany SCADomain control functions and + * functions for each SCA service and reference that use <binding.dwr>. + */ + private void addScriptHandler() { + + UrlProcessor urlProcessor = (UrlProcessor)getContainer().getBean(UrlProcessor.class.getName()); + + final EngineHandler engineHandler = + (EngineHandler)getContainer().getBean(PathConstants.URL_PREFIX + "/engine.js"); + + final Handler scaDomainScriptHandler = new Handler() { + public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException { + PrintWriter out = response.getWriter(); + out.println("/** Apache Tuscany componentContext.js Header */"); + + engineHandler.handle(request, response); + + tuscanyFooter(request, out); + } + + }; + + // add the scaDomainScriptHandler to the urlProcessor + // bit of a hack, there's probably cleaner way to get it registered + urlProcessor.afterContainerSetup(new Container() { + public Object getBean(String name) { + return scaDomainScriptHandler; + } + public Collection<?> getBeanNames() { + return Arrays.asList(new String[] {PathConstants.URL_PREFIX + SCRIPT_PATH}); + } + }); + } + + /** + * Adds the JavaScript defining SCADomain, its control functions, + * and functions for all the available SCA services and references. + */ + private void tuscanyFooter(HttpServletRequest request, PrintWriter out) { + out.println("if (SCA == undefined) var SCA = new Object();"); + out.println("if (SCA.componentContext == undefined) {"); + out.println(" SCA.componentContext = new Object();"); + out.println(" SCA.componentContext.serviceNames = [];"); + out.println(" SCA.componentContext.serviceProxys = [];"); + out.println(" SCA.componentContext.getService = function(serviceName){"); + out.println(" var i = SCA.componentContext.serviceNames.indexOf(serviceName);"); + out.println(" return SCA.componentContext.serviceProxys[i];"); + out.println(" };"); + out.println(" if (componentContext == undefined) var componentContext = SCA.componentContext;"); + out.println("}"); + +// out.println("/** Apache Tuscany scaDomain.js Footer */"); +// out.println(); +// out.println("function scaDomain() { }"); +// out.println(); +// out.println("// SCA services"); + + // Use the DWR remoter to generate the JavaScipt function for each SCA service + Remoter remoter = (Remoter)getContainer().getBean(Remoter.class.getName()); + + + for (String serviceName : serviceRefs.keySet()) { + String path = request.getServletPath() + "/" + serviceName; + String serviceScript = remoter.generateInterfaceScript(serviceName, path); + out.println(serviceScript); + out.println("SCA.componentContext.serviceNames.push('" + serviceName + "');"); + out.println("SCA.componentContext.serviceProxys.push(" + serviceName + ");"); +// ServiceHolder s = services.get(serviceName); +// final Class<?> iface = ((JavaInterface)s.cr.getInterfaceContract().getInterface()).getJavaClass(); +// for (Method m : iface.getMethods()) { +// out.println("if (" + serviceName + " == null) var " + serviceName + " = {};"); +// out.println("SCA.componentContext.serviceNames.push('" + serviceName + "');"); +//// out.println("SCA.componentContext.serviceProxys.push(new JSONRpcClient('" + serviceName + "').Service);"); +// out.println(serviceName + "." + m.getName() + " = function(p0, callback) {"); +// out.println(" dwr.engine._execute(" + serviceName + "._path, '" + serviceName + "', '" + m.getName() + "', p0, callback);"); +// out.println(" }"); +// } + } + +// if (referenceNames.size() > 0) { +// +// out.println("// SCA reverse ajax control functions"); +// out.println(); +// out.println("scaDomain.open = function() { dwr.engine.setActiveReverseAjax(true); };"); +// out.println("scaDomain.close = function() { dwr.engine.setActiveReverseAjax(false); };"); +// +// out.println(); +// out.println("// SCA references"); +// out.println(); +// +// // the JavaScript function for SCA references has an +// // empty impl as it uses DWR severside "push" +// for (String referenceName : referenceNames) { +// out.println("function " + referenceName + "() { }"); +// } +// } + + out.println(); + out.println("/** End of Apache Tuscany componentContext.js */"); + out.println(); + } + +// /** +// * Add an SCA reference to be added to the DWR runtime +// */ +// public void addReference(String name) { +// referenceNames.add(name); +// } + + /** + * Add an SCA service to be added to the DWR runtime + */ + public void addService(RuntimeEndpointReference epr) { + + CreatorManager creatorManager = (CreatorManager)getContainer().getBean(CreatorManager.class.getName()); + addService(creatorManager, epr); + serviceRefs.put(epr.getReference().getName(), epr); + } + + private void addService(CreatorManager creatorManager, final RuntimeEndpointReference epr) { + final Class<?> iface = ((JavaInterface)epr.getComponentTypeReferenceInterfaceContract().getInterface()).getJavaClass(); + + creatorManager.addCreator(epr.getReference().getName(), new AbstractCreator() { + public Class<?> getType() { + return iface; + } + + public Object getInstance() throws InstantiationException { + ExtensionPointRegistry registry = epr.getCompositeContext().getExtensionPointRegistry(); + ExtensibleProxyFactory proxyFactory = ExtensibleProxyFactory.getInstance(registry); + return proxyFactory.createProxy(iface, epr); + } + }); + } + + /** + * Patch the ServletConfig to enable setting init params for DWR + * and so DWR can't see the Tuscany servlet's init params. + */ + private ServletConfig patchConfig(final ServletConfig servletConfig) { + ServletConfig patchedContext = new ServletConfig() { + public String getInitParameter(String name) { + return initParams.get(name); + } + public Enumeration<?> getInitParameterNames() { + return Collections.enumeration(initParams.keySet()); + } + public ServletContext getServletContext() { + return servletConfig.getServletContext(); + } + public String getServletName() { + return servletConfig.getServletName(); + } + }; + return patchedContext; + } + +} diff --git a/sca-java-2.x/tags/2.0-Beta1-RC2/modules/implementation-web-client/src/main/java/org/apache/tuscany/sca/implementation/web/client/JSClientExtensionPointImpl.java b/sca-java-2.x/tags/2.0-Beta1-RC2/modules/implementation-web-client/src/main/java/org/apache/tuscany/sca/implementation/web/client/JSClientExtensionPointImpl.java new file mode 100644 index 0000000000..9c95eaea3b --- /dev/null +++ b/sca-java-2.x/tags/2.0-Beta1-RC2/modules/implementation-web-client/src/main/java/org/apache/tuscany/sca/implementation/web/client/JSClientExtensionPointImpl.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.tuscany.sca.implementation.web.client; + +import org.apache.tuscany.sca.assembly.ComponentReference; +import org.apache.tuscany.sca.assembly.EndpointReference; +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.host.http.ServletHost; +import org.apache.tuscany.sca.host.http.ServletHostHelper; +import org.apache.tuscany.sca.implementation.web.WebImplementation; +import org.apache.tuscany.sca.implementation.web.runtime.ClientExtensionPoint; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.invocation.Invoker; +import org.apache.tuscany.sca.provider.ImplementationProvider; +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.apache.tuscany.sca.runtime.RuntimeComponentService; +import org.apache.tuscany.sca.runtime.RuntimeEndpointReference; + +public class JSClientExtensionPointImpl implements ClientExtensionPoint { + + private ServletHost servletHost; + + public JSClientExtensionPointImpl(ExtensionPointRegistry extensionPoints) { + this.servletHost = ServletHostHelper.getServletHost(extensionPoints); + } + + public ImplementationProvider createImplementationProvider(RuntimeComponent component, WebImplementation implementation) { + ClientServlet clientServlet = new ClientServlet(); + servletHost.addServletMapping(ClientServlet.SCRIPT_PATH, clientServlet); + servletHost.addServletMapping(ClientServlet.SCRIPT_PATH + "/" + component.getName() + "/*", clientServlet); + + if (component.getReferences().size() > 0) { + for (ComponentReference cr : component.getReferences()) { + for (EndpointReference epr : cr.getEndpointReferences()) { + clientServlet.addService((RuntimeEndpointReference)epr); + } + } + } + + return new ImplementationProvider() { + public Invoker createInvoker(RuntimeComponentService arg0, Operation arg1) { + return null; + } + public void start() { + } + public void stop() { + } + public boolean supportsOneWayInvocation() { + return false; + } + }; + } +} diff --git a/sca-java-2.x/tags/2.0-Beta1-RC2/modules/implementation-web-client/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.web.runtime.ClientExtensionPoint b/sca-java-2.x/tags/2.0-Beta1-RC2/modules/implementation-web-client/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.web.runtime.ClientExtensionPoint new file mode 100644 index 0000000000..d11c486a4b --- /dev/null +++ b/sca-java-2.x/tags/2.0-Beta1-RC2/modules/implementation-web-client/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.web.runtime.ClientExtensionPoint @@ -0,0 +1,22 @@ +# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+
+# Implementation class for the implementation extension
+org.apache.tuscany.sca.implementation.web.client.JSClientExtensionPointImpl
+
+
+
|