diff options
author | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2009-11-21 07:55:01 +0000 |
---|---|---|
committer | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2009-11-21 07:55:01 +0000 |
commit | 0f72626e59d77f0365c1e6bbb9420f6693ffc67d (patch) | |
tree | 2193cafc8131ad1ddbd9066fcd832a5797e9ba55 /sca-java-1.x/tags/java-M1-20060518/java/sca | |
parent | 2ae32b04b9d771118a7cafc1d7edec86fbe9c3c0 (diff) |
Moving 1.x tags
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@882848 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-1.x/tags/java-M1-20060518/java/sca')
868 files changed, 69769 insertions, 0 deletions
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/LICENSE.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/LICENSE.txt new file mode 100644 index 0000000000..75b52484ea --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/LICENSE.txt @@ -0,0 +1,202 @@ +
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed 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.
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/README.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/README.txt new file mode 100644 index 0000000000..9b26d1690a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/README.txt @@ -0,0 +1,35 @@ +Apache Tuscany M1 build (May, 2006) +=================================== + +http://incubator.apache.org/tuscany/ + +Tuscany is an effort undergoing incubation at the Apache Software Foundation +(ASF), sponsored by the Web Services PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness or +stability of the code, it does indicate that the project has yet to be fully +endorsed by the ASF. + + +Support +------- + +Any problem with this release can be reported to the Tuscany mailing list +or in the JIRA issue tracker. + +Mailing list subscription: + tuscany-dev-subscribe@ws.apache.org + +Jira: + http://issues.apache.org/jira/browse/Tuscany + + +Thank you for using Tuscany! + + +The Tuscany Team. + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/pom.xml new file mode 100644 index 0000000000..f35a4735fb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/pom.xml @@ -0,0 +1,150 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.
+ -->
+<project>
+
+ <parent>
+ <groupId>org.apache.tuscany.sca.bindings</groupId>
+ <artifactId>tuscany-sca-bindings</artifactId>
+ <version>incubating-M1</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>tuscany-binding-axis2</artifactId>
+ <name>Tuscany Axis2 Binding</name>
+ <description>Implementation of the SCA Web Services binding using Axis2.</description>
+ <version>incubating-M1</version>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany</groupId>
+ <artifactId>tuscany-core</artifactId>
+ <version>${pom.version}</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.databinding</groupId>
+ <artifactId>tuscany-databinding-sdo</artifactId> <!-- Reqd for E4X -->
+ <version>${pom.version}</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca.containers</groupId>
+ <artifactId>tuscany-container-java</artifactId>
+ <version>${pom.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <!-- axis 2.0 -->
+ <dependency>
+ <groupId>axis2</groupId>
+ <artifactId>axis2-kernel</artifactId>
+ <version>1.0</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>ws-commons</groupId>
+ <artifactId>axiom-api</artifactId>
+ <version>1.0</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>ws-commons</groupId>
+ <artifactId>axiom-impl</artifactId>
+ <version>1.0</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>ws-commons</groupId>
+ <artifactId>neethi</artifactId>
+ <version>1.0.1</version>
+ <scope>runtime</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.ws.commons</groupId>
+ <artifactId>XmlSchema</artifactId>
+ <version>1.0.2</version>
+ <scope>runtime</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-httpclient</groupId>
+ <artifactId>commons-httpclient</artifactId>
+ <version>3.0</version>
+ <scope>runtime</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ <version>1.3</version>
+ <scope>runtime</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>wsdl4j</groupId>
+ <artifactId>wsdl4j</artifactId>
+ <version>1.5.2</version>
+ </dependency>
+
+ <dependency>
+ <groupId>stax</groupId>
+ <artifactId>stax-api</artifactId>
+ <version>1.0</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>woodstox</groupId>
+ <artifactId>wstx-asl</artifactId>
+ <version>2.9.3</version>
+ <scope>runtime</scope>
+ </dependency>
+
+ <!-- end of axis 2.0 -->
+
+ <dependency>
+ <groupId>tomcat</groupId>
+ <artifactId>servlet-api</artifactId>
+ <version>5.0.18</version>
+ <scope>provided</scope>
+ </dependency>
+
+ </dependencies>
+ <!-- buildSource>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.5</source>
+ <target>1.5</target>
+ <excludes>
+ <exclude>**/org/apache/tuscany/binding/axis/engine/config/AxisEngineConfigurationFactory.java</exclude>
+ <exclude>**/org/apache/tuscany/binding/axis/handler/WebServiceEntryPointBean.java</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+ </plugins>
+
+ </buildSource -->
+</project>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/assembly/WebServiceAssemblyFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/assembly/WebServiceAssemblyFactory.java new file mode 100644 index 0000000000..8114b348d1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/assembly/WebServiceAssemblyFactory.java @@ -0,0 +1,31 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.assembly; + +import org.apache.tuscany.model.assembly.AssemblyFactory; + +/** + * The <b>Factory</b> for the model. + */ +public interface WebServiceAssemblyFactory extends AssemblyFactory { + + /** + * Returns a new WebServiceBinding. + */ + WebServiceBinding createWebServiceBinding(); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/assembly/WebServiceBinding.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/assembly/WebServiceBinding.java new file mode 100644 index 0000000000..ea9f3f116f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/assembly/WebServiceBinding.java @@ -0,0 +1,75 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.assembly; + +import javax.wsdl.Definition; +import javax.wsdl.Port; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.model.assembly.Binding; + +import commonj.sdo.helper.TypeHelper; + +/** + * Represents a Web service binding. + */ +public interface WebServiceBinding extends Binding { + + /** + * Set the URI of the WSDL port for this binding. + * + * @param portURI + * the URI of the WSDL port + */ + void setPortURI(String portURI); + + /** + * Returns the WSDL port defining this binding. + */ + Port getWSDLPort(); + + /** + * Returns the WSDL definition containing the WSDL port. + * + * @return the WSDL definition containing the WSDL port + */ + Definition getWSDLDefinition(); + + /** + * Sets the WSDL port defining this binding. + */ + void setWSDLPort(Port value); + + /** + * Sets the WSDL definition containing the WSDL port. + * + * @param definition + */ + void setWSDLDefinition(Definition definition); + + TypeHelper getTypeHelper(); + + void setTypeHelper(TypeHelper typeHelper); + + ResourceLoader getResourceLoader(); + + void setResourceLoader(ResourceLoader resourceLoader); + + public void setWebAppName(String webAppName); + + public String getWebAppName(); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/assembly/impl/WebServiceAssemblyFactoryImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/assembly/impl/WebServiceAssemblyFactoryImpl.java new file mode 100644 index 0000000000..5523d8fdc0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/assembly/impl/WebServiceAssemblyFactoryImpl.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.assembly.impl; + +import org.apache.tuscany.binding.axis2.assembly.WebServiceAssemblyFactory; +import org.apache.tuscany.binding.axis2.assembly.WebServiceBinding; +import org.apache.tuscany.model.assembly.impl.AssemblyFactoryImpl; + +/** + * An implementation of the model <b>Factory</b>. + */ +public class WebServiceAssemblyFactoryImpl extends AssemblyFactoryImpl implements WebServiceAssemblyFactory { + + /** + * Creates an instance of the factory. + */ + public WebServiceAssemblyFactoryImpl() { + super(); + } + + /** + * @see org.apache.tuscany.binding.axis2.assembly.WebServiceAssemblyFactory#createWebServiceBinding() + */ + public WebServiceBinding createWebServiceBinding() { + return new WebServiceBindingImpl(); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/assembly/impl/WebServiceBindingImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/assembly/impl/WebServiceBindingImpl.java new file mode 100644 index 0000000000..5be1b87e01 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/assembly/impl/WebServiceBindingImpl.java @@ -0,0 +1,176 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.assembly.impl; + +import java.util.Collection; +import java.util.List; + +import javax.wsdl.Definition; +import javax.wsdl.Port; +import javax.wsdl.Service; + +import org.apache.tuscany.binding.axis2.assembly.WebServiceBinding; +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.impl.BindingImpl; + +import commonj.sdo.helper.TypeHelper; + +/** + * An implementation of WebServiceBinding. + */ +public class WebServiceBindingImpl extends BindingImpl implements WebServiceBinding { + + private Definition definition; + + private Port port; + + private String portURI; + + private TypeHelper typeHelper; + + private ResourceLoader resourceLoader; + + private String webAppName; + + /** + * Constructor + */ + protected WebServiceBindingImpl() { + } + + public TypeHelper getTypeHelper() { + return typeHelper; + } + + public void setTypeHelper(TypeHelper typeHelper) { + this.typeHelper = typeHelper; + } + + public ResourceLoader getResourceLoader() { + return resourceLoader; + } + + public void setResourceLoader(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } + + /** + * @see org.apache.tuscany.binding.axis2.assembly.WebServiceBinding#getWSDLPort() + */ + public Port getWSDLPort() { + return port; + } + + /** + * @see org.apache.tuscany.binding.axis2.assembly.WebServiceBinding#setWSDLPort(javax.wsdl.Port) + */ + public void setWSDLPort(Port value) { + checkNotFrozen(); + this.port = value; + } + + /** + * @see org.apache.tuscany.binding.axis2.assembly.WebServiceBinding#getWSDLDefinition() + */ + public Definition getWSDLDefinition() { + return definition; + } + + /** + */ + public void setWSDLDefinition(Definition pdefinition) { + checkNotFrozen(); + this.definition = pdefinition; + } + + /** + * @param portURI + * The portURI to set. + */ + public void setPortURI(String portURI) { + this.portURI = portURI; + } + + public void setWebAppName(String webAppName) { + this.webAppName = webAppName; + } + + public String getWebAppName() { + return webAppName; + } + + /** + */ + @SuppressWarnings("unchecked") + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) { + return; + } + super.initialize(modelContext); + + // Get the WSDL port namespace and name + // We currently support two syntaxes for specifying a WSDL port: + // namespace#portName, this is what we supported in the initial contribution, we will + // deprecate this after M1 + // namespace#wsdl.endpoint(serviceName/portName), this is the WSDL 2.0 syntax + if (port == null && portURI != null) { + int h = portURI.indexOf('#'); + String portNamespace = portURI.substring(0, h); + String serviceName; + String portName; + + String fragment = portURI.substring(h + 1); + if (fragment.startsWith("wsdl.endpoint(") && fragment.endsWith(")")) { + fragment = fragment.substring(14, fragment.length()-1); + int slash = fragment.indexOf('/'); + if (slash != -1) { + serviceName = fragment.substring(0, slash); + portName = fragment.substring(slash+1); + } else { + serviceName = null; + portName = fragment; + } + } else { + serviceName = null; + portName = fragment; + } + + // Load the WSDL definitions for the given namespace + List<Definition> definitions = modelContext.getAssemblyLoader().loadDefinitions(portNamespace); + if (definitions == null) { + throw new IllegalArgumentException("Cannot find WSDL definition for " + portNamespace); + } + for (Definition def : definitions) { + + // Find the port with the given name + for (Service service : (Collection<Service>) def.getServices().values()) { + if (serviceName != null && !serviceName.equals(service.getQName().getLocalPart())) + continue; + Port prt = service.getPort(portName); + if (prt != null) { + this.definition = def; + this.port = prt; + return; + } + } + } + throw new IllegalArgumentException("Cannot find WSDL port " + portURI); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/builder/ExternalWebServiceBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/builder/ExternalWebServiceBuilder.java new file mode 100644 index 0000000000..9b428f8be8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/builder/ExternalWebServiceBuilder.java @@ -0,0 +1,146 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.builder; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.wsdl.Definition; +import javax.xml.namespace.QName; + +import org.apache.axiom.om.OMAbstractFactory; +import org.apache.axiom.soap.SOAPFactory; +import org.apache.axis2.AxisFault; +import org.apache.axis2.addressing.EndpointReference; +import org.apache.axis2.client.Options; +import org.apache.axis2.client.ServiceClient; +import org.apache.axis2.context.ConfigurationContext; +import org.apache.axis2.context.MessageContextConstants; +import org.apache.axis2.description.AxisService; +import org.apache.tuscany.binding.axis2.assembly.WebServiceBinding; +import org.apache.tuscany.binding.axis2.config.WSExternalServiceContextFactory; +import org.apache.tuscany.binding.axis2.externalservice.Axis2OperationInvoker; +import org.apache.tuscany.binding.axis2.externalservice.Axis2ServiceInvoker; +import org.apache.tuscany.binding.axis2.util.SDODataBinding; +import org.apache.tuscany.binding.axis2.util.TuscanyAxisConfigurator; +import org.apache.tuscany.binding.axis2.util.WebServiceOperationMetaData; +import org.apache.tuscany.binding.axis2.util.WebServicePortMetaData; +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.extension.ExternalServiceBuilderSupport; +import org.apache.tuscany.core.extension.ExternalServiceContextFactory; +import org.apache.tuscany.core.injection.SingletonObjectFactory; +import org.apache.tuscany.model.assembly.ExternalService; +import org.osoa.sca.annotations.Scope; + +import commonj.sdo.helper.TypeHelper; + +/** + * Creates a <code>ContextFactory</code> for an external service configured with the {@link WebServiceBinding} + */ +@Scope("MODULE") +public class ExternalWebServiceBuilder extends ExternalServiceBuilderSupport<WebServiceBinding> { + + /* + * (non-Javadoc) + * + * @see org.apache.tuscany.core.extension.ExternalServiceBuilderSupport#createExternalServiceContextFactory(org.apache.tuscany.model.assembly.ExternalService) + */ + @Override + protected ExternalServiceContextFactory createExternalServiceContextFactory(ExternalService externalService) { + + WebServiceBinding wsBinding = (WebServiceBinding) externalService.getBindings().get(0); + Definition wsdlDefinition = wsBinding.getWSDLDefinition(); + WebServicePortMetaData wsPortMetaData = new WebServicePortMetaData(wsdlDefinition, wsBinding.getWSDLPort(), wsBinding.getURI(), false); + + ServiceClient serviceClient = createServiceClient(externalService.getName(), wsdlDefinition, wsPortMetaData); + + TypeHelper typeHelper = wsBinding.getTypeHelper(); + ClassLoader cl = wsBinding.getResourceLoader().getClassLoader(); + Class serviceInterface = externalService.getConfiguredService().getPort().getServiceContract().getInterface(); + Map<String, Axis2OperationInvoker> invokers = createOperationInvokers(serviceInterface, typeHelper, cl, wsPortMetaData); + + Axis2ServiceInvoker axis2Client = new Axis2ServiceInvoker(serviceClient, invokers); + + return new WSExternalServiceContextFactory(externalService.getName(), new SingletonObjectFactory<Axis2ServiceInvoker>(axis2Client)); + + } + + /** + * Create an Axis2 ServiceClient configured for the externalService + */ + protected ServiceClient createServiceClient(String externalServiceName, Definition wsdlDefinition, WebServicePortMetaData wsPortMetaData) { + + TuscanyAxisConfigurator tuscanyAxisConfigurator = new TuscanyAxisConfigurator(null, null); + ConfigurationContext configurationContext = tuscanyAxisConfigurator.getConfigurationContext(); + + QName serviceQName = wsPortMetaData.getServiceName(); + String portName = wsPortMetaData.getPortName().getLocalPart(); + + ServiceClient serviceClient; + try { + + AxisService axisService = AxisService.createClientSideAxisService(wsdlDefinition, serviceQName, portName, new Options()); + serviceClient = new ServiceClient(configurationContext, axisService); + + } catch (AxisFault e) { + BuilderConfigException bce = new BuilderConfigException("AxisFault creating external service", e); + bce.addContextName(externalServiceName); + throw bce; + } + + return serviceClient; + } + + /** + * Create and configure an Axis2OperationInvoker for each operation in the externalService + */ + protected Map<String, Axis2OperationInvoker> createOperationInvokers(Class sc, TypeHelper typeHelper, ClassLoader cl, WebServicePortMetaData wsPortMetaData) { + SOAPFactory soapFactory = OMAbstractFactory.getSOAP11Factory(); + String portTypeNS = wsPortMetaData.getPortTypeName().getNamespaceURI(); + Map<String, Axis2OperationInvoker> invokers = new HashMap<String, Axis2OperationInvoker>(); + + for (Method m : sc.getMethods()) { + String methodName = m.getName(); + + WebServiceOperationMetaData operationMetaData = wsPortMetaData.getOperationMetaData(methodName); + boolean isWrapped = operationMetaData.isDocLitWrapped(); + List<?> sig = operationMetaData.getOperationSignature(); + SDODataBinding dataBinding = new SDODataBinding(cl, typeHelper, sig.size() > 0 ? (QName) sig.get(0) : null, isWrapped); + + Options options = new Options(); + options.setTo(new EndpointReference(wsPortMetaData.getEndpoint())); + options.setProperty(MessageContextConstants.CHUNKED, Boolean.FALSE); + + String wsdlOperationName = operationMetaData.getBindingOperation().getOperation().getName(); + + String soapAction = wsPortMetaData.getOperationMetaData(wsdlOperationName).getSOAPAction(); + if (soapAction != null && soapAction.length() > 1) { + options.setAction(soapAction); + } + + QName wsdlOperationQName = new QName(portTypeNS, wsdlOperationName); + Axis2OperationInvoker invoker = new Axis2OperationInvoker(wsdlOperationQName, options, dataBinding, soapFactory); + + invokers.put(methodName, invoker); + } + + return invokers; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/builder/ExternalWebServiceWireBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/builder/ExternalWebServiceWireBuilder.java new file mode 100644 index 0000000000..be526a2a9a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/builder/ExternalWebServiceWireBuilder.java @@ -0,0 +1,36 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.builder; + +import java.lang.reflect.Method; + +import org.apache.tuscany.binding.axis2.config.WSExternalServiceContextFactory; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.extension.ExternalServiceTargetInvoker; +import org.apache.tuscany.core.extension.WireBuilderSupport; +import org.apache.tuscany.core.wire.TargetInvoker; +import org.osoa.sca.annotations.Scope; + +@Scope("MODULE") +public class ExternalWebServiceWireBuilder extends WireBuilderSupport<WSExternalServiceContextFactory> { + + @Override + protected TargetInvoker createInvoker(QualifiedName targetName, Method operation, ScopeContext context, boolean downScope) { + return new ExternalServiceTargetInvoker(targetName, operation, context); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/builder/WebServiceEntryPointBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/builder/WebServiceEntryPointBuilder.java new file mode 100644 index 0000000000..de0d54f505 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/builder/WebServiceEntryPointBuilder.java @@ -0,0 +1,49 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.builder; + +import org.apache.tuscany.binding.axis2.assembly.WebServiceBinding; +import org.apache.tuscany.binding.axis2.config.WSEntryPointContextFactory; +import org.apache.tuscany.core.extension.EntryPointBuilderSupport; +import org.apache.tuscany.core.extension.EntryPointContextFactory; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.webapp.ServletHost; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.osoa.sca.annotations.Scope; + +/** + * Creates a <code>ContextFactory</code> for an entry point configured with the {@link WebServiceBinding} + * + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class WebServiceEntryPointBuilder extends EntryPointBuilderSupport<WebServiceBinding> { + + private ServletHost tomcatHost; + + @Autowire + public void setTomcatHost(ServletHost tomcatHost) { + this.tomcatHost = tomcatHost; + } + + protected EntryPointContextFactory createEntryPointContextFactory(EntryPoint entryPoint, MessageFactory msgFactory) { + WebServiceBinding wsBinding = (WebServiceBinding) entryPoint.getBindings().get(0); + return new WSEntryPointContextFactory(entryPoint.getName(), messageFactory, tomcatHost, wsBinding); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/config/WSEntryPointContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/config/WSEntryPointContextFactory.java new file mode 100644 index 0000000000..9e836b43e5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/config/WSEntryPointContextFactory.java @@ -0,0 +1,276 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.config; + +import java.io.InputStream; +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Enumeration; +import java.util.Set; +import java.util.Vector; + +import javax.servlet.RequestDispatcher; +import javax.servlet.Servlet; +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.wsdl.Definition; +import javax.wsdl.Operation; +import javax.wsdl.PortType; +import javax.xml.namespace.QName; + +import org.apache.axis2.AxisFault; +import org.apache.axis2.description.AxisOperation; +import org.apache.axis2.description.AxisService; +import org.apache.axis2.description.WSDL2AxisServiceBuilder; +import org.apache.axis2.wsdl.WSDLConstants; +import org.apache.tuscany.binding.axis2.assembly.WebServiceBinding; +import org.apache.tuscany.binding.axis2.entrypoint.WebServiceEntryPointInOutSyncMessageReceiver; +import org.apache.tuscany.binding.axis2.entrypoint.WebServiceEntryPointServlet; +import org.apache.tuscany.binding.axis2.util.SDODataBinding; +import org.apache.tuscany.binding.axis2.util.WebServiceOperationMetaData; +import org.apache.tuscany.binding.axis2.util.WebServicePortMetaData; +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.builder.ContextCreationException; +import org.apache.tuscany.core.context.EntryPointContext; +import org.apache.tuscany.core.extension.EntryPointContextFactory; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.webapp.ServletHost; + +import commonj.sdo.helper.TypeHelper; + +/** + * Creates instances of {@link org.apache.tuscany.core.context.EntryPointContext} configured with the appropriate wire chains and bindings. This + * implementation serves as a marker for + * + * @version $Rev$ $Date$ + */ +public class WSEntryPointContextFactory extends EntryPointContextFactory { + + private ServletHost tomcatHost; + + private WebServiceBinding wsBinding; + + public WSEntryPointContextFactory(String name, MessageFactory messageFactory, ServletHost tomcatHost, WebServiceBinding wsBinding) { + super(name, messageFactory); + this.tomcatHost = tomcatHost; + this.wsBinding = wsBinding; + } + + public EntryPointContext createContext() throws ContextCreationException { + EntryPointContext epc = super.createContext(); + initServlet(epc); + return epc; + } + + private void initServlet(EntryPointContext epc) { + AxisService axisService; + try { + axisService = createAxisService(epc, wsBinding); + } catch (AxisFault e) { + throw new BuilderConfigException(e); + } + WebServiceEntryPointServlet servlet = new WebServiceEntryPointServlet(axisService); + ServletConfig sc = createDummyServletConfig(); + try { + servlet.init(sc ); + } catch (ServletException e) { + throw new BuilderConfigException(e); + } + + String servletMapping = wsBinding.getWebAppName() + "/services/" + epc.getName(); + tomcatHost.registerMapping(servletMapping, servlet); + } + + private ServletConfig createDummyServletConfig() { + ServletConfig sc = new ServletConfig() { + + public String getServletName() { + return "TuscanyWSServlet"; + } + + public ServletContext getServletContext() { + return new ServletContext() { + + public ServletContext getContext(String arg0) { + return null; + } + + public int getMajorVersion() { + return 0; + } + + public int getMinorVersion() { + return 0; + } + + public String getMimeType(String arg0) { + return null; + } + + public Set getResourcePaths(String arg0) { + return null; + } + + public URL getResource(String arg0) throws MalformedURLException { + return null; + } + + public InputStream getResourceAsStream(String arg0) { + return null; + } + + public RequestDispatcher getRequestDispatcher(String arg0) { + return null; + } + + public RequestDispatcher getNamedDispatcher(String arg0) { + return null; + } + + public Servlet getServlet(String arg0) throws ServletException { + return null; + } + + public Enumeration getServlets() { + return null; + } + + public Enumeration getServletNames() { + return null; + } + + public void log(String arg0) { + } + + public void log(Exception arg0, String arg1) { + } + + public void log(String arg0, Throwable arg1) { + } + + public String getRealPath(String arg0) { + return null; + } + + public String getServerInfo() { + return null; + } + + public String getInitParameter(String arg0) { + return null; + } + + public Enumeration getInitParameterNames() { + return null; + } + + public Object getAttribute(String arg0) { + return null; + } + + public Enumeration getAttributeNames() { + return null; + } + + public void setAttribute(String arg0, Object arg1) { + } + + public void removeAttribute(String arg0) { + } + + public String getServletContextName() { + return null; + }}; + } + + public String getInitParameter(String arg0) { + return null; + } + + public Enumeration getInitParameterNames() { + return new Vector().elements(); + }}; + return sc; + } + + private AxisService createAxisService(EntryPointContext entryPointContext, WebServiceBinding wsBinding) throws AxisFault { + + String entryPointName = entryPointContext.getName(); + + Definition definition = wsBinding.getWSDLDefinition(); + WebServicePortMetaData wsdlPortInfo = new WebServicePortMetaData(definition, wsBinding.getWSDLPort(), null, false); + + // AxisServiceGroup serviceGroup = new AxisServiceGroup(axisConfig); + // serviceGroup.setServiceGroupName(wsdlPortInfo.getServiceName().getLocalPart()); + // axisConfig.addServiceGroup(serviceGroup); + + WSDL2AxisServiceBuilder builder = new WSDL2AxisServiceBuilder(definition, wsdlPortInfo.getServiceName(), wsdlPortInfo.getPort().getName()); + builder.setServerSide(true); + AxisService axisService = builder.populateService(); + + axisService.setName(entryPointName); + // axisService.setParent(serviceGroup); + axisService.setServiceDescription("Tuscany configured AxisService for EntryPoint: '" + entryPointName + '\''); + + TypeHelper typeHelper = wsBinding.getTypeHelper(); + ClassLoader cl = wsBinding.getResourceLoader().getClassLoader(); + + Class<?> serviceInterface = entryPointContext.getServiceInterface(); + + PortType wsdlPortType = wsdlPortInfo.getPortType(); + for (Object o : wsdlPortType.getOperations()) { + Operation wsdlOperation = (Operation) o; + String operationName = wsdlOperation.getName(); + QName operationQN = new QName(definition.getTargetNamespace(), operationName); + Object entryPointProxy = entryPointContext.getInstance(null); + + WebServiceOperationMetaData omd = wsdlPortInfo.getOperationMetaData(operationName); + QName responseTypeQN = omd.getOutputPart(0).getElementName(); + + Method operationMethod = getMethod(serviceInterface, operationName); + SDODataBinding dataBinding = new SDODataBinding(cl, typeHelper, responseTypeQN, omd.isDocLitWrapped()); + WebServiceEntryPointInOutSyncMessageReceiver msgrec = new WebServiceEntryPointInOutSyncMessageReceiver(entryPointProxy, operationMethod, + dataBinding, cl); + + AxisOperation axisOp = axisService.getOperation(operationQN); + axisOp.setMessageExchangePattern(WSDLConstants.MEP_URI_IN_OUT); + axisOp.setMessageReceiver(msgrec); + } + + return axisService; + } + + protected Method getMethod(Class<?> serviceInterface, String operationName) { + // Note: this doesn't support overloaded operations + Method[] methods = serviceInterface.getMethods(); + for (Method m : methods) { + if (m.getName().equals(operationName)) { + return m; + } + // tolerate WSDL with capatalized operation name + StringBuilder sb = new StringBuilder(operationName); + sb.setCharAt(0, Character.toLowerCase(sb.charAt(0))); + if (m.getName().equals(sb.toString())) { + return m; + } + } + throw new BuilderConfigException("no operation named " + operationName + " found on service interface: " + serviceInterface.getName()); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/config/WSExternalServiceContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/config/WSExternalServiceContextFactory.java new file mode 100644 index 0000000000..0a2e308587 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/config/WSExternalServiceContextFactory.java @@ -0,0 +1,34 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.config; + +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.extension.ExternalServiceContextFactory; + +/** + * Creates instances of {@link org.apache.tuscany.core.context.ExternalServiceContext} configured with the appropriate wire chains and bindings. This + * implementation serves as a marker for {@link org.apache.tuscany.binding.axis2.builder.ExternalWebServiceWireBuilder} + * + * @version $Rev$ $Date$ + */ +public class WSExternalServiceContextFactory extends ExternalServiceContextFactory { + + public WSExternalServiceContextFactory(String name, ObjectFactory objectFactory) { + super(name, objectFactory); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/entrypoint/WebServiceEntryPointInOutSyncMessageReceiver.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/entrypoint/WebServiceEntryPointInOutSyncMessageReceiver.java new file mode 100644 index 0000000000..bb9f0e307a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/entrypoint/WebServiceEntryPointInOutSyncMessageReceiver.java @@ -0,0 +1,101 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.entrypoint; + +import java.lang.reflect.Method; + +import org.apache.axiom.om.OMElement; +import org.apache.axiom.soap.SOAPEnvelope; +import org.apache.axis2.AxisFault; +import org.apache.axis2.Constants; +import org.apache.axis2.context.MessageContext; +import org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver; +import org.apache.tuscany.binding.axis2.util.SDODataBinding; +import org.apache.tuscany.core.wire.InvocationRuntimeException; + +public class WebServiceEntryPointInOutSyncMessageReceiver extends AbstractInOutSyncMessageReceiver { + + private Object entryPointProxy; + + protected Method operationMethod; + + protected SDODataBinding dataBinding; + + protected ClassLoader classLoader; + + public WebServiceEntryPointInOutSyncMessageReceiver(Object entryPointProxy, Method operationMethod, SDODataBinding dataBinding, ClassLoader classLoader) { + this.entryPointProxy = entryPointProxy; + this.operationMethod = operationMethod; + this.dataBinding = dataBinding; + this.classLoader = classLoader; + } + + @Override + public void invokeBusinessLogic(MessageContext inMC, MessageContext outMC) throws AxisFault { + try { + + OMElement requestOM = inMC.getEnvelope().getBody().getFirstElement(); + Object[] request; + if (requestOM != null) { + request = dataBinding.fromOMElement(requestOM); + } else { + request = new Object[0]; + } + + Object response; + ClassLoader tccl = Thread.currentThread().getContextClassLoader(); + try { + if (tccl != classLoader) { + Thread.currentThread().setContextClassLoader(classLoader); + } + + response = operationMethod.invoke(entryPointProxy, request); + + } finally { + if (tccl != classLoader) { + Thread.currentThread().setContextClassLoader(tccl); + } + } + + SOAPEnvelope soapEnvelope = getSOAPFactory(inMC).getDefaultEnvelope(); + + OMElement responseOM = null; + if (response != null) { + responseOM = dataBinding.toOMElement(new Object[] { response }); + soapEnvelope.getBody().addChild(responseOM); + } + + outMC.setEnvelope(soapEnvelope); + outMC.getOperationContext().setProperty(Constants.RESPONSE_WRITTEN, Constants.VALUE_TRUE); + + } catch (InvocationRuntimeException e) { + // throw new InvocationRuntimeException(e); + Throwable t = e.getCause(); + if(t instanceof Exception) { + + throw AxisFault.makeFault((Exception)t); + + } + throw e; + + + } catch (Exception e) { + throw AxisFault.makeFault(e); + } + + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/entrypoint/WebServiceEntryPointServlet.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/entrypoint/WebServiceEntryPointServlet.java new file mode 100644 index 0000000000..4e6173b671 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/entrypoint/WebServiceEntryPointServlet.java @@ -0,0 +1,113 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.entrypoint; + +import java.io.IOException; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.axis2.description.AxisService; +import org.apache.axis2.transport.http.AxisServlet; + +/** + * @version $Rev: 383148 $ $Date: 2006-03-04 08:07:17 -0800 (Sat, 04 Mar 2006) $ + */ +public class WebServiceEntryPointServlet extends AxisServlet { + + private static final long serialVersionUID = 1L; + + private AxisService axisService; + + public WebServiceEntryPointServlet(AxisService axisService) { + this.axisService = axisService; + } + + public void init(final ServletConfig config) throws ServletException { + ClassLoader tccl = Thread.currentThread().getContextClassLoader(); + ClassLoader scl = this.getClass().getClassLoader(); + try { + if (tccl != scl) { + Thread.currentThread().setContextClassLoader(scl); + } + + try { + + super.init(config); + + configContext.getAxisConfiguration().addService(axisService); + + } catch (Exception e) { + throw new ServletException(e); + } + + } finally { + if (tccl != scl) { + Thread.currentThread().setContextClassLoader(tccl); + } + } + } + + @Override + protected void doGet(final HttpServletRequest arg0, final HttpServletResponse arg1) throws ServletException, IOException { + ClassLoader tccl = Thread.currentThread().getContextClassLoader(); + ClassLoader scl = this.getClass().getClassLoader(); + try { + if (tccl != scl) { + Thread.currentThread().setContextClassLoader(scl); + } + + try { + super.doGet(arg0, arg1); + } catch (Exception e) { + e.printStackTrace(); + throw new ServletException(e); + } + + } finally { + if (tccl != scl) { + Thread.currentThread().setContextClassLoader(tccl); + } + } + } + + @Override + protected void doPost(final HttpServletRequest arg0, final HttpServletResponse arg1) throws ServletException, IOException { + ClassLoader tccl = Thread.currentThread().getContextClassLoader(); + ClassLoader scl = this.getClass().getClassLoader(); + try { + if (tccl != scl) { + Thread.currentThread().setContextClassLoader(scl); + } + + try { + super.doPost(arg0, arg1); + } catch (Exception e) { + e.printStackTrace(); + throw new ServletException(e); + } + + } finally { + if (tccl != scl) { + Thread.currentThread().setContextClassLoader(tccl); + } + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/externalservice/Axis2OperationInvoker.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/externalservice/Axis2OperationInvoker.java new file mode 100644 index 0000000000..32767012df --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/externalservice/Axis2OperationInvoker.java @@ -0,0 +1,114 @@ +/**
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.axis2.externalservice;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.soap.SOAPFactory;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.client.OperationClient;
+import org.apache.axis2.client.Options;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.wsdl.WSDLConstants;
+import org.apache.tuscany.binding.axis2.util.SDODataBinding;
+
+/**
+ * Axis2OperationInvoker uses an Axis2 OperationClient to invoke a remote web service
+ */
+public class Axis2OperationInvoker {
+
+ public QName wsdlOperationName;
+
+ public Options options;
+
+ public SDODataBinding dataBinding;
+
+ private SOAPFactory soapFactory;
+
+ public Axis2OperationInvoker(QName wsdlOperationName, Options options, SDODataBinding dataBinding, SOAPFactory soapFactory) {
+ this.wsdlOperationName = wsdlOperationName;
+ this.options = options;
+ this.dataBinding = dataBinding;
+ this.soapFactory = soapFactory;
+ }
+
+ /**
+ * Invoke a WS operation
+ *
+ * @param operationClient
+ * @param args
+ * @return
+ * @throws AxisFault
+ */
+ protected Object invokeOperation(OperationClient operationClient, Object[] args) throws AxisFault {
+
+ operationClient.setOptions(options);
+
+ SOAPEnvelope env = soapFactory.getDefaultEnvelope();
+
+ if (args != null && args.length > 0) {
+ OMElement requestOM = dataBinding.toOMElement(args);
+ env.getBody().addChild(requestOM);
+ }
+
+ MessageContext requestMC = new MessageContext();
+ requestMC.setEnvelope(env);
+
+ operationClient.addMessageContext(requestMC);
+
+ ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+ ClassLoader scl = this.getClass().getClassLoader();
+ try {
+ if (tccl != scl) {
+ Thread.currentThread().setContextClassLoader(scl);
+ }
+
+ operationClient.execute(true);
+
+ } finally {
+ if (tccl != scl) {
+ Thread.currentThread().setContextClassLoader(tccl);
+ }
+ }
+
+ MessageContext responseMC = operationClient.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
+ OMElement responseOM = responseMC.getEnvelope().getBody().getFirstElement();
+
+ Object[] os = null;
+ if (responseOM != null) {
+ os = dataBinding.fromOMElement(responseOM);
+ }
+
+ Object response;
+ if (os == null || os.length < 1) {
+ response = null;
+ } else {
+ response = os[0];
+ }
+
+ return response;
+ }
+
+ /**
+ * Get the WSDL operation name that this can invoke
+ */
+ public QName getWSDLOperationName() {
+ return wsdlOperationName;
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/externalservice/Axis2ServiceInvoker.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/externalservice/Axis2ServiceInvoker.java new file mode 100644 index 0000000000..38b9e40d2e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/externalservice/Axis2ServiceInvoker.java @@ -0,0 +1,60 @@ +/**
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.axis2.externalservice;
+
+import java.util.Map;
+
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.client.OperationClient;
+import org.apache.axis2.client.ServiceClient;
+import org.apache.tuscany.core.extension.ExternalServiceInvoker;
+import org.osoa.sca.ServiceRuntimeException;
+
+/**
+ * Axis2ServiceInvoker uses Axis2 to invoke a remote web service
+ */
+public class Axis2ServiceInvoker implements ExternalServiceInvoker {
+
+ private ServiceClient serviceClient;
+
+ private Map<String, Axis2OperationInvoker> operationInvokers;
+
+ public Axis2ServiceInvoker(ServiceClient serviceClient, Map<String, Axis2OperationInvoker> operationInvokers) {
+ this.serviceClient = serviceClient;
+ this.operationInvokers = operationInvokers;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.tuscany.binding.axis2.handler.ExternalServiceInvoker#invoke(java.lang.String, java.lang.Object[])
+ */
+ public Object invoke(String methodName, Object[] args) {
+ try {
+
+ Axis2OperationInvoker invoker = operationInvokers.get(methodName);
+
+ // Axis2 operationClients can not be shared so create a new one for each request
+ OperationClient operationClient = serviceClient.createClient(invoker.getWSDLOperationName());
+
+ return invoker.invokeOperation(operationClient, args);
+
+ } catch (AxisFault e) {
+ throw new ServiceRuntimeException(e);
+ }
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/loader/WebServiceBindingLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/loader/WebServiceBindingLoader.java new file mode 100644 index 0000000000..b4a67d1ab2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/loader/WebServiceBindingLoader.java @@ -0,0 +1,72 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.binding.axis2.loader; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.binding.axis2.assembly.WebServiceAssemblyFactory; +import org.apache.tuscany.binding.axis2.assembly.WebServiceBinding; +import org.apache.tuscany.binding.axis2.assembly.impl.WebServiceAssemblyFactoryImpl; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.core.loader.StAXElementLoader; +import org.apache.tuscany.core.loader.StAXLoaderRegistry; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.osoa.sca.annotations.Destroy; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Scope; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class WebServiceBindingLoader implements StAXElementLoader<WebServiceBinding> { + public static final QName BINDING_WS = new QName("http://www.osoa.org/xmlns/sca/0.9", "binding.ws"); + + private static final WebServiceAssemblyFactory WS_FACTORY = new WebServiceAssemblyFactoryImpl(); + + protected StAXLoaderRegistry registry; + + @Autowire + public void setRegistry(StAXLoaderRegistry registry) { + this.registry = registry; + } + + @Init(eager = true) + public void start() { + registry.registerLoader(BINDING_WS, this); + } + + @Destroy + public void stop() { + registry.unregisterLoader(BINDING_WS, this); + } + + @SuppressWarnings("deprecation") + public WebServiceBinding load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + + WebServiceBinding binding = WS_FACTORY.createWebServiceBinding(); + binding.setURI(reader.getAttributeValue(null, "uri")); + binding.setPortURI(reader.getAttributeValue(null, "port")); + binding.setTypeHelper(registry.getContext().getTypeHelper()); + binding.setWebAppName(registry.getContext().getWebAppName()); + binding.setResourceLoader(loaderContext.getResourceLoader()); + return binding; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/SDODataBinding.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/SDODataBinding.java new file mode 100644 index 0000000000..0caf2293d6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/SDODataBinding.java @@ -0,0 +1,104 @@ +/**
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.axis2.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.FactoryConfigurationError;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.llom.factory.OMXMLBuilderFactory;
+import org.apache.tuscany.core.wire.InvocationRuntimeException;
+import org.apache.tuscany.databinding.sdo.SDOXMLHelper;
+import org.apache.tuscany.sdo.util.SDOUtil;
+import org.osoa.sca.ServiceRuntimeException;
+
+import commonj.sdo.DataObject;
+import commonj.sdo.helper.TypeHelper;
+import commonj.sdo.helper.XMLHelper;
+
+/**
+ * DataBinding for converting between AXIOM OMElement and Java Objects
+ */
+public class SDODataBinding {
+
+ private ClassLoader classLoader;
+
+ private TypeHelper typeHelper;
+
+ private QName elementQName;
+
+ private boolean isWrapped;
+
+ public SDODataBinding(ClassLoader classLoader, TypeHelper typeHelper, QName elementQName, boolean isWrapped) {
+ this.classLoader = classLoader;
+ this.typeHelper = typeHelper;
+ this.elementQName = elementQName;
+ this.isWrapped = isWrapped;
+ }
+
+ public Object[] fromOMElement(OMElement omElement) {
+ try {
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ omElement.serialize(baos);
+
+ baos.flush();
+ baos.close();
+
+ return SDOXMLHelper.toObjects(classLoader,typeHelper, baos.toByteArray(), isWrapped);
+
+ } catch (IOException e) {
+ throw new InvocationRuntimeException(e);
+ } catch (XMLStreamException e) {
+ throw new InvocationRuntimeException(e);
+ }
+ }
+
+ public OMElement toOMElement(Object[] os) {
+ try {
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ DataObject dataObject = SDOXMLHelper.toDataObject(classLoader, typeHelper, os, elementQName, isWrapped);
+ XMLHelper xmlHelper = SDOUtil.createXMLHelper(typeHelper);
+ xmlHelper.save(dataObject, elementQName.getNamespaceURI(), elementQName.getLocalPart(), baos);
+ baos.close();
+
+ XMLStreamReader xsr = XMLInputFactory.newInstance().createXMLStreamReader(new ByteArrayInputStream(baos.toByteArray()));
+ OMXMLParserWrapper builder = OMXMLBuilderFactory.createStAXOMBuilder(OMAbstractFactory.getOMFactory(), xsr);
+ OMElement omElement = builder.getDocumentElement();
+
+ return omElement;
+
+ } catch (IOException e) {
+ throw new ServiceRuntimeException(e);
+ } catch (XMLStreamException e) {
+ throw new ServiceRuntimeException(e);
+ } catch (FactoryConfigurationError e) {
+ throw new ServiceRuntimeException(e);
+ }
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/TuscanyAxisConfigurator.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/TuscanyAxisConfigurator.java new file mode 100644 index 0000000000..a5795d076e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/TuscanyAxisConfigurator.java @@ -0,0 +1,88 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.axis2.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.ConfigurationContextFactory;
+import org.apache.axis2.deployment.AxisConfigBuilder;
+import org.apache.axis2.deployment.DeploymentEngine;
+import org.apache.axis2.engine.AxisConfiguration;
+import org.apache.axis2.engine.AxisConfigurator;
+import org.apache.tuscany.common.resource.ResourceLoader;
+import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl;
+import org.osoa.sca.ServiceRuntimeException;
+
+/**
+ * Helps configure Axis2 from a resource in binding.axis2 instead of Axis2.xml
+ *
+ * TODO: Review: should there be a single global Axis ConfigurationContext
+ */
+public class TuscanyAxisConfigurator implements AxisConfigurator {
+
+ protected AxisConfiguration axisConfiguration;
+
+ protected final ResourceLoader resourceLoader;
+
+ /**
+ * @param resourceLoader
+ * desired resource loader if null use thread context.
+ * @param axisConfiguration
+ * Starting axis configuration, null then use uninitialized configuration.
+ */
+ public TuscanyAxisConfigurator(ResourceLoader resourceLoader, AxisConfiguration axisConfiguration) {
+ this.resourceLoader = resourceLoader != null ? resourceLoader : new ResourceLoaderImpl(getClass().getClassLoader());
+ this.axisConfiguration = axisConfiguration == null ? new AxisConfiguration() : axisConfiguration;
+ }
+
+ public AxisConfiguration getAxisConfiguration() {
+
+ return axisConfiguration;
+ }
+
+ public ConfigurationContext getConfigurationContext() throws ServiceRuntimeException {
+
+ try {
+ URL url = resourceLoader.getResource("org/apache/tuscany/binding/axis2/engine/config/axis2.xml");
+
+ InputStream serviceInputStream = url.openStream();
+ AxisConfigBuilder axisConfigBuilder = new AxisConfigBuilder(serviceInputStream, new DeploymentEngine(), axisConfiguration);
+ axisConfigBuilder.populateConfig();
+ serviceInputStream.close();
+ return ConfigurationContextFactory.createConfigurationContext(this);
+ } catch (IOException e) {
+
+ throw new ServiceRuntimeException(e);
+ }
+
+ }
+
+ public void loadServices() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void engageGlobalModules() throws AxisFault {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/WebServiceOperationMetaData.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/WebServiceOperationMetaData.java new file mode 100644 index 0000000000..1ebca5d3fc --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/WebServiceOperationMetaData.java @@ -0,0 +1,499 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.util; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import javax.wsdl.Binding; +import javax.wsdl.BindingInput; +import javax.wsdl.BindingOperation; +import javax.wsdl.BindingOutput; +import javax.wsdl.Input; +import javax.wsdl.Message; +import javax.wsdl.Operation; +import javax.wsdl.Output; +import javax.wsdl.Part; +import javax.wsdl.extensions.soap.SOAPBinding; +import javax.wsdl.extensions.soap.SOAPHeader; +import javax.wsdl.extensions.soap.SOAPOperation; +import javax.xml.namespace.QName; + +/** + * Metadata for a WSDL operation + * + */ +public class WebServiceOperationMetaData { + // WSDL Binding and BindingOperation + private Binding binding; + + private BindingOperation bindingOperation; + + // Fields to cache derived metadata + private transient Set<Part> inputHeaderParts; + + private transient Set<Part> outputHeaderParts; + + private transient String style; + + private transient String use; + + private transient String soapAction; + + private transient List<Object> signature; + + private String encoding; + + private transient QName rpcOperationName; + + public WebServiceOperationMetaData(Binding binding, BindingOperation bindingOperation) { + this.binding = binding; + this.bindingOperation = bindingOperation; + } + + public WebServiceOperationMetaData(Binding binding, BindingOperation bindingOperation, String style, String use, String encoding, + String soapAction) { + this.binding = binding; + this.bindingOperation = bindingOperation; + this.style = style; + this.use = use; + this.encoding = encoding; + this.soapAction = soapAction; + } + + public Set<Part> getInputHeaderParts() { + if (inputHeaderParts == null) { + // Build a set of header parts that we need to exclude + inputHeaderParts = new HashSet<Part>(); + BindingInput bindingInput = bindingOperation.getBindingInput(); + + if (bindingInput != null) { + Operation operation = bindingOperation.getOperation(); + javax.wsdl.Message message = operation.getInput().getMessage(); + List elements = bindingInput.getExtensibilityElements(); + for (Iterator i = elements.iterator(); i.hasNext();) { + Object extensibilityElement = i.next(); + Part part = getPartFromSOAPHeader(message, extensibilityElement); + if (part != null) { + inputHeaderParts.add(part); + } + } + } + } + return inputHeaderParts; + } + + public Set<Part> getOutputHeaderParts() { + if (outputHeaderParts == null) { + // Build a set of header parts that we need to exclude + outputHeaderParts = new HashSet<Part>(); + BindingOutput bindingOutput = bindingOperation.getBindingOutput(); + + if (bindingOutput != null) { + Operation operation = bindingOperation.getOperation(); + javax.wsdl.Message message = operation.getOutput().getMessage(); + List elements = bindingOutput.getExtensibilityElements(); + for (Iterator i = elements.iterator(); i.hasNext();) { + Object extensibilityElement = i.next(); + Part part = getPartFromSOAPHeader(message, extensibilityElement); + if (part != null) { + outputHeaderParts.add(part); + } + } + } + } + return outputHeaderParts; + } + + private Part getPartFromSOAPHeader(Message message, Object extensibilityElement) { + Part part = null; + if (extensibilityElement instanceof SOAPHeader) { + SOAPHeader soapHeader = (SOAPHeader) extensibilityElement; + QName msgName = soapHeader.getMessage(); + if (message.getQName().equals(msgName)) { + part = message.getPart(soapHeader.getPart()); + } + } else if (extensibilityElement instanceof SOAPHeader) { + SOAPHeader soapHeader = (SOAPHeader) extensibilityElement; + QName msgName = soapHeader.getMessage(); + if (message.getQName().equals(msgName)) { + part = message.getPart(soapHeader.getPart()); + } + } + return part; + } + + public String getStyle() { + if (style == null) { + SOAPOperation soapOperation = (SOAPOperation) WebServicePortMetaData.getExtensibilityElement(bindingOperation.getExtensibilityElements(), + SOAPOperation.class); + if (soapOperation != null) { + style = soapOperation.getStyle(); + } + if (style == null) { + SOAPBinding soapBinding = WebServicePortMetaData.getExtensibilityElement(binding.getExtensibilityElements(), SOAPBinding.class); + if (soapBinding != null) { + style = soapBinding.getStyle(); + } + } + if (style == null) { + style = "document"; + } + } + return style; + } + + /** + * Returns the SOAP action for the given operation. + * + * @param wsdlBindingOperation + * @return + */ + public String getSOAPAction() { + if (soapAction == null) { + final List wsdlBindingOperationExtensions = bindingOperation.getExtensibilityElements(); + final SOAPOperation soapOp = WebServicePortMetaData.getExtensibilityElement(wsdlBindingOperationExtensions, SOAPOperation.class); + if (soapOp != null) { + soapAction = soapOp.getSoapActionURI(); + } + } + return soapAction; + } + + public QName getRPCOperationName() { + if (rpcOperationName == null) { + javax.wsdl.extensions.soap.SOAPBody soapBody = getSOAPBody(true); + String ns = (soapBody != null) ? soapBody.getNamespaceURI() : binding.getPortType().getQName().getNamespaceURI(); + String name = bindingOperation.getOperation().getName(); + rpcOperationName = new QName(ns, name); + } + return rpcOperationName; + } + + private List<String> getSOAPBodyParts(boolean input) { + javax.wsdl.extensions.soap.SOAPBody soapBody = getSOAPBody(input); + if (soapBody != null) { + List parts = soapBody.getParts(); + if (parts != null) { + List<String> names = new ArrayList<String>(); + for (Iterator i = parts.iterator(); i.hasNext();) { + Object part = i.next(); + if (part instanceof String) { + names.add((String) part); + } else if (part instanceof Part) { + names.add(((Part) part).getName()); + } + } + return names; + } else { + return null; + } + } else { + return null; + } + } + + private javax.wsdl.extensions.soap.SOAPBody getSOAPBody(boolean input) { + List elements = null; + if (input) { + BindingInput bindingInput = bindingOperation.getBindingInput(); + if (bindingInput == null) { + return null; + } + elements = bindingInput.getExtensibilityElements(); + } else { + BindingOutput bindingOutput = bindingOperation.getBindingOutput(); + if (bindingOutput == null) { + return null; + } + elements = bindingOutput.getExtensibilityElements(); + } + javax.wsdl.extensions.soap.SOAPBody soapBody = WebServicePortMetaData.getExtensibilityElement(elements, + javax.wsdl.extensions.soap.SOAPBody.class); + return soapBody; + } + + /** + * Returns the use attribute + * + * @param wsdlOperation + * @return + */ + public String getUse() { + if (use == null) { + javax.wsdl.extensions.soap.SOAPBody soapBody = getSOAPBody(true); + if (soapBody != null) { + use = soapBody.getUse(); + } + if (use == null) { + use = "literal"; + } + } + return use; + } + + @SuppressWarnings("unchecked") + public String getEncoding() { + if (encoding == null) { + javax.wsdl.extensions.soap.SOAPBody soapBody = getSOAPBody(true); + if (soapBody != null) { + List<String> styles = (List<String>) soapBody.getEncodingStyles(); + if (styles != null && !styles.isEmpty()) { + encoding = styles.get(0); + } + } + if (encoding == null) { + encoding = ""; + } + } + return encoding; + } + + public boolean isDocLitWrapped() { + boolean flag = getStyle().equals("document") && getUse().equals("literal"); + if (!flag) { + return false; + } + Message msg = getMessage(true); + if (msg == null) { + return false; + } + List parts = msg.getOrderedParts(null); + if (parts.size() != 1) { + return false; + } + Part part = (Part) parts.get(0); + QName element = part.getElementName(); + if (element == null) { + return false; + } + return element.getLocalPart().equals(bindingOperation.getOperation().getName()); + } + + /* + * public SOAPMediator createMediator(boolean serverMode) throws SOAPException { // create a new mediator for each invoke for thread-safety + * boolean rpcStyle = getStyle().equals("rpc"); boolean rpcEncoded = isEncoded(); + * + * SOAPMediator mediator = null; + * + * if (!rpcStyle) { // Document mediator = new SOAPDocumentLiteralMediatorImpl(this, serverMode); } else { if (!rpcEncoded) mediator = new + * SOAPRPCLiteralMediatorImpl(this, serverMode); // RPC-literal else mediator = new SOAPRPCEncodedMediatorImpl(this, serverMode); // RPC-encoded } + * return mediator; } + */ + + /** + * Get the operation signature from the WSDL operation + * + * @param wsdlBinding + * @param bindingOperation + * @return + */ + public List<?> getOperationSignature() { + if (signature == null) { + signature = new ArrayList<Object>(); + + Operation operation = bindingOperation.getOperation(); + if (operation == null) { + return signature; + } + + final Input input = operation.getInput(); + if (input == null) { + return signature; + } + + String sstyle = getStyle(); + + if ("rpc".equals(sstyle)) { + Collection partNames = input.getMessage().getParts().values(); + for (Iterator i = partNames.iterator(); i.hasNext();) { + Part part = (Part) i.next(); + signature.add(part.getName()); + } + } else { + /* + * WS-I Basic Profile 1.1 4.7.6 Operation Signatures Definition: operation signature + * + * The profile defines the "operation signature" to be the fully qualified name of the child element of SOAP body of the SOAP input + * message described by an operation in a WSDL binding. + * + * In the case of rpc-literal binding, the operation name is used as a wrapper for the part accessors. In the document-literal case, + * since a wrapper with the operation name is not present, the message signatures must be correctly designed so that they meet this + * requirement. + * + * An endpoint that supports multiple operations must unambiguously identify the operation being invoked based on the input message + * that it receives. This is only possible if all the operations specified in the wsdl:binding associated with an endpoint have a + * unique operation signature. + * + * R2710 The operations in a wsdl:binding in a DESCRIPTION MUST result in operation signatures that are different from one another. + */ + List<String> bodyParts = getSOAPBodyParts(true); + + Collection<?> parts = input.getMessage().getParts().values(); + // Exclude the parts to be transmitted in SOAP header + if (bodyParts == null) { + parts.removeAll(getInputHeaderParts()); + } + for (Iterator i = parts.iterator(); i.hasNext();) { + Part part = (Part) i.next(); + if (bodyParts == null) { + // All parts + QName elementName = part.getElementName(); + if (elementName == null) { + elementName = new QName("", part.getName()); + // TODO: [rfeng] throw new + // ServiceRuntimeException("Message part for + // document style must refer to an XSD element + // using a QName: " + part); + } + signature.add(elementName); + } else { + // "parts" in soap:body + if (bodyParts.contains(part.getName())) { + QName elementName = part.getElementName(); + if (elementName == null) { + elementName = new QName("", part.getName()); + // TODO: [rfeng] throw new + // ServiceRuntimeException("Message part for + // document style must refer to an XSD + // element using a QName: " + part); + } + signature.add(elementName); + } + + } + } + } + } + return signature; + } + + public Message getMessage(boolean isInput) { + Operation operation = bindingOperation.getOperation(); + if (operation == null) { + return null; + } + + if (isInput) { + final Input input = operation.getInput(); + return input == null ? null : input.getMessage(); + } else { + final Output output = operation.getOutput(); + return output == null ? null : output.getMessage(); + } + } + + public Part getInputPart(int index) { + Part part = null; + Message message = getMessage(true); + if (message == null) { + return part; + } + + List parts = message.getOrderedParts(null); + return (Part) parts.get(index); + + } + + public Part getOutputPart(int index) { + Part part = null; + Message message = getMessage(false); + if (message == null) { + return part; + } + + List parts = message.getOrderedParts(null); + return (Part) parts.get(index); + + } + + /** + * Get a list of indexes for each part in the SOAP body + * + * @param isInput + * TODO + * @return + */ + public List<Integer> getBodyPartIndexes(boolean isInput) { + List<Integer> indexes = new ArrayList<Integer>(); + + Message message = getMessage(isInput); + if (message == null) { + return indexes; + } + + List<String> bodyParts = getSOAPBodyParts(isInput); + List parts = message.getOrderedParts(null); + Set headerParts = isInput ? getInputHeaderParts() : getOutputHeaderParts(); + + int index = 0; + for (Iterator i = parts.iterator(); i.hasNext(); index++) { + Part part = (Part) i.next(); + if (headerParts.contains(part)) { + continue; + } + if (bodyParts == null) { + // All parts + indexes.add(index); + } else { + // "parts" in soap:body + if (bodyParts.contains(part.getName())) { + indexes.add(index); + } + } + } + return indexes; + } + + /** + * Get the corresponding index for a part in the SOAP header by element name + * + * @param elementName + * @param isInput + * TODO + * @return + */ + public int getHeaderPartIndex(QName elementName, boolean isInput) { + + Message message = getMessage(isInput); + if (message == null) { + return -1; + } + + List parts = message.getOrderedParts(null); + Set headerParts = isInput ? getInputHeaderParts() : getOutputHeaderParts(); + + int index = 0; + for (Iterator i = parts.iterator(); i.hasNext(); index++) { + Part part = (Part) i.next(); + // Test if the part is in header section + if (headerParts.contains(part) && elementName.equals(part.getElementName())) { + return index; + } + } + return -1; + } + + public BindingOperation getBindingOperation() { + return bindingOperation; + } + +}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/WebServicePortMetaData.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/WebServicePortMetaData.java new file mode 100644 index 0000000000..694a8fbf5f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/java/org/apache/tuscany/binding/axis2/util/WebServicePortMetaData.java @@ -0,0 +1,400 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.util; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import javax.wsdl.Binding; +import javax.wsdl.BindingOperation; +import javax.wsdl.Definition; +import javax.wsdl.Operation; +import javax.wsdl.Port; +import javax.wsdl.PortType; +import javax.wsdl.Service; +import javax.wsdl.extensions.soap.SOAPAddress; +import javax.wsdl.extensions.soap.SOAPBinding; +import javax.xml.namespace.QName; + +import org.apache.tuscany.model.types.wsdl.WSDLServiceContract; + +/** + * Metadata for a WSDL port + * + */ +public class WebServicePortMetaData { + + private Service wsdlService; + + private QName wsdlServiceName; + + private Port wsdlPort; + + private Binding wsdlBinding; + + private QName wsdlPortName; + + private PortType wsdlPortType; + + private QName wsdlPortTypeName; + + private String endpoint; + + private boolean managed; + + private List<WebServiceOperationMetaData> allOperationMetaData; + + private WSDLServiceContract interfaceType; + + /** + * Constructor + * + * @param wsdlDefinition + * @param portName + */ + public WebServicePortMetaData(Definition wsdlDefinition, Port wsdlPort, String endpoint, boolean managed) { + + // Lookup the named port + this.wsdlPort = wsdlPort; + wsdlPortName = new QName(wsdlDefinition.getTargetNamespace(), wsdlPort.getName()); + + Collection services = wsdlDefinition.getServices().values(); + for (Object serviceObj : services) { + Service service = (Service) serviceObj; + if (service.getPorts().containsValue(wsdlPort)) { + wsdlService = service; + wsdlServiceName = service.getQName(); + break; + } + } + + // Save the binding + wsdlBinding = wsdlPort.getBinding(); + if (wsdlBinding == null) { + throw new IllegalArgumentException("WSDL binding cannot be found for " + wsdlPortName); + } + + // Save the portType + wsdlPortType = wsdlBinding.getPortType(); + if (wsdlPortType == null) { + throw new IllegalArgumentException("WSDL portType cannot be found for " + wsdlPortName); + } + wsdlPortTypeName = wsdlPortType.getQName(); + + // Save the endpoint + this.endpoint = endpoint; + + // Track if this endpoint is managed or not + this.managed = managed; + } + + /** + * Constructor + * + * @param serviceName + * @param portName + * @param portType + */ + public WebServicePortMetaData(QName serviceName, String portName, QName portTypeName, String endpoint) { + wsdlServiceName = serviceName; + wsdlPortName = new QName(serviceName.getNamespaceURI(), portName); + wsdlPortTypeName = portTypeName; + this.endpoint = endpoint; + } + + /** + * @return Returns the wsdlPort. + */ + public javax.wsdl.Port getPort() { + return wsdlPort; + } + + /** + * @return Returns the wsdlService. + */ + public QName getServiceName() { + return wsdlServiceName; + } + + /** + * @return Returns the wsdlService. + */ + public javax.wsdl.Service getService() { + return wsdlService; + } + + /** + * @return Returns the wsdlPortType. + */ + public PortType getPortType() { + return wsdlPortType; + } + + /** + * @return Returns the wsdlPortType. + */ + public QName getPortTypeName() { + return wsdlPortTypeName; + } + + /** + * @return Returns the wsdlBinding. + */ + public Binding getBinding() { + return wsdlBinding; + } + + /** + * @return Returns the wsdlPortName. + */ + public QName getPortName() { + return wsdlPortName; + } + + /** + * Returns the endpoint of a given port. + * + * @param wsdlPort + * @return + */ + public String getEndpoint() { + + // Return the specified endpoint + if (endpoint != null) { + return endpoint; + } + + // Find the target endpoint on the port + if (wsdlPort != null) { + final List wsdlPortExtensions = wsdlPort.getExtensibilityElements(); + for (Iterator i = wsdlPortExtensions.iterator(); i.hasNext();) { + final Object extension = i.next(); + if (extension instanceof SOAPAddress) { + return ((SOAPAddress) extension).getLocationURI(); + } + } + } + + return null; + } + + /** + * Returns the SOAP binding style. + * + * @return + */ + public String getStyle() { + + // Find the binding style + String style = null; + if (wsdlBinding != null) { + final List wsdlBindingExtensions = wsdlBinding.getExtensibilityElements(); + SOAPBinding soapBinding = getExtensibilityElement(wsdlBindingExtensions, SOAPBinding.class); + if (soapBinding != null) { + style = soapBinding.getStyle(); + } + } + + // Default to document + return (style == null) ? "document" : style; + } + + /** + * Returns the use attribute + * + * @return + */ + public String getUse() { + List<WebServiceOperationMetaData> list = getAllOperationMetaData(); + return list.get(0).getUse(); + } + + /** + * Returns the encoding attribute + * + * @return + */ + public String getEncoding() { + List<WebServiceOperationMetaData> list = getAllOperationMetaData(); + return list.get(0).getEncoding(); + } + + /** + * @return Returns true if this is a managed web service. + */ + public boolean isManaged() { + return managed; + } + + /** + * Returns the first extensibility element of the given type. + * + * @param elements + * @param type + * @return + */ + public static <T> T getExtensibilityElement(List elements, Class<T> type) { + for (Iterator i = elements.iterator(); i.hasNext();) { + Object element = i.next(); + if (type.isInstance(element)) { + return type.cast(element); + } + } + return null; + } + + /** + * Returns the extensibility elements of the given type. + * + * @param elements + * @param type + * @return + */ + public static <T> List<T> getExtensibilityElements(List elements, Class<T> type) { + List<T> result = new ArrayList<T>(); + for (Iterator i = elements.iterator(); i.hasNext();) { + Object element = i.next(); + if (type.isInstance(element)) { + result.add(type.cast(element)); + } + } + return result; + } + + /** + * Get the operation signature from the SOAP Body + * + * @param body + * @return A list of QNames + */ + // public static List getOperationSignature(javax.xml.soap.SOAPBody body) { + // List signature = new ArrayList(); + // for (Iterator i = body.getChildElements(); i.hasNext();) { + // Object child = i.next(); + // if (child instanceof SOAPBodyElement) { + // Name name = ((SOAPBodyElement) child).getElementName(); + // QName qname = new QName(name.getURI(), name.getLocalName(), name.getPrefix()); + // signature.add(qname); + // } + // } + // return signature; + // } + // public static List getRPCOperationSignature(javax.xml.soap.SOAPBody body) { + // List signature = new ArrayList(); + // for (Iterator i = body.getChildElements(); i.hasNext();) { + // Object child = i.next(); + // if (child instanceof SOAPBodyElement) { + // SOAPBodyElement op = ((SOAPBodyElement) child); + // for (Iterator j = op.getChildElements(); j.hasNext();) { + // Object part = i.next(); + // if (part instanceof SOAPElement) { + // SOAPElement p = (SOAPElement) part; + // signature.add(p.getLocalName()); + // } + // } + // } + // } + // return signature; + // } + // public WebServiceOperationMetaData getOperationMetaData(javax.xml.soap.SOAPBody body) { + // List s1 = getOperationSignature(body); + // // List rpcParts = getRPCOperationSignature(body); + // for (Iterator it = getAllOperationMetaData().iterator(); it.hasNext();) { + // WebServiceOperationMetaData descriptor = (WebServiceOperationMetaData) it.next(); + // + // String style = descriptor.getStyle(); + // + // if (style.equals("document")) { + // List s2 = descriptor.getOperationSignature(); + // if (s1.equals(s2)) + // return descriptor; + // } else { + // QName op1 = (QName) s1.get(0); + // QName op2 = descriptor.getRPCOperationName(); + // if (op1.equals(op2)) { + // /* + // * // FIXME: [rfeng] We don't support method overloading + // * List partNames = getOperationSignature(binding, + // * bindingOperation); if (rpcParts.equals(partNames)) + // */ + // return descriptor; + // } + // } + // } + // return null; + // } + public List<WebServiceOperationMetaData> getAllOperationMetaData() { + if (allOperationMetaData == null) { + allOperationMetaData = new ArrayList<WebServiceOperationMetaData>(); + for (Iterator it = wsdlBinding.getBindingOperations().iterator(); it.hasNext();) { + final BindingOperation bindingOperation = (BindingOperation) it.next(); + if (bindingOperation.getOperation() != null) { + allOperationMetaData.add(new WebServiceOperationMetaData(wsdlBinding, bindingOperation)); + } + } + } + return allOperationMetaData; + } + + public WebServiceOperationMetaData getOperationMetaData(String operationName) { + StringBuilder sb = new StringBuilder(operationName); + sb.setCharAt(0, Character.toUpperCase(sb.charAt(0))); + String capatalizedOpName = sb.toString(); + + for (Iterator it = getAllOperationMetaData().iterator(); it.hasNext();) { + WebServiceOperationMetaData descriptor = (WebServiceOperationMetaData) it.next(); + String opName = descriptor.getBindingOperation().getOperation().getName(); + + if (opName.equals(operationName) || opName.equals(capatalizedOpName)) { + return descriptor; + } + } + return null; + } + + /** + * Returns the WSDL service contract + * + * @return + */ + public WSDLServiceContract getInterfaceType() { + return interfaceType; + } + + /** + * Get the WSDL operation name for a Java method name + */ + public String getWSDLOperationName(String methodName) { + StringBuilder sb = new StringBuilder(methodName); + sb.setCharAt(0, Character.toUpperCase(sb.charAt(0))); + String capatalizedOpName = sb.toString(); + for (Object o : wsdlPortType.getOperations()) { + Operation operation = (Operation) o; + String wsdlOpName = operation.getName(); + if (wsdlOpName.equals(methodName)) { + return wsdlOpName; + } + if (wsdlOpName.equals(capatalizedOpName)) { + return wsdlOpName; + } + } + return null; + } + +}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/resources/org/apache/tuscany/binding/axis2/engine/config/axis2.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/resources/org/apache/tuscany/binding/axis2/engine/config/axis2.xml new file mode 100644 index 0000000000..3c9e2988ef --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/resources/org/apache/tuscany/binding/axis2/engine/config/axis2.xml @@ -0,0 +1,183 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.
+ -->
+<axisconfig name="AxisJava2.0">
+ <!-- ================================================= -->
+ <!-- Parameters -->
+ <!-- ================================================= -->
+ <parameter name="hotdeployment" locked="false">false</parameter>
+ <parameter name="hotupdate" locked="false">false</parameter>
+ <parameter name="enableMTOM" locked="false">false</parameter>
+ <!-- Uncomment this to enable REST support -->
+ <!-- <parameter name="enableREST" locked="false">true</parameter>-->
+
+
+ <parameter name="userName" locked="false">admin</parameter>
+ <parameter name="password" locked="false">axis2</parameter>
+
+ <parameter name="seralizeLocation" locked="false">.</parameter>
+ <hostConfiguration>
+ <ip>127.0.0.1</ip>
+ <port>5555</port>
+ </hostConfiguration>
+
+
+ <!--if you want to extract the service archive file and work with that please uncomment this-->
+ <!--else , it wont extract archive file or does not take into consideration if someone drop-->
+ <!--exploded directory into /service directory-->
+ <!--<parameter name="extractServiceArchive" locked="false">true</parameter>-->
+
+
+ <!-- The way of adding listener to the system-->
+ <!-- <listener class="org.apache.axis2.ObserverIMPL">-->
+ <!-- <parameter name="RSS_URL" locked="false">http://127.0.0.1/rss</parameter>-->
+ <!-- </listener>-->
+
+ <!-- ================================================= -->
+ <!-- Message Receivers -->
+ <!-- ================================================= -->
+ <!--This is the Deafult Message Receiver for the system , if you want to have MessageReceivers for -->
+ <!--all the other MEP implement it and add the correct entry to here , so that you can refer from-->
+ <!--any operation -->
+ <!--Note : You can ovride this for particular service by adding the same element with your requirement-->
+ <messageReceivers>
+ <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
+ class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>
+ <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
+ class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
+ </messageReceivers>
+ <!-- ================================================= -->
+ <!-- Transport Ins -->
+ <!-- ================================================= -->
+ <transportReceiver name="http" class="org.apache.axis2.transport.http.SimpleHTTPServer">
+ <parameter name="port" locked="false">6060</parameter>
+ </transportReceiver>
+
+ <!-- Uncomment this one with the appropriate papameters to enable the SMTP transport Receiver
+ <transportReceiver name="mail" class="org.apache.axis2.transport.mail.SimpleMailListener">
+ <parameter name="transport.mail.pop3.host" locked="false">127.0.0.1</parameter>
+ <parameter name="transport.mail.pop3.user" locked="false">axis2</parameter>
+ <parameter name="transport.mail.pop3.password" locked="false">axis2</parameter>
+ <parameter name="transport.mail.pop3.port" locked="false">110</parameter>
+ <parameter name="transport.mail.replyToAddress" locked="false">axis2@127.0.0.1</parameter>
+ </transportReceiver> -->
+
+ <!--REMOVED FOR TUSCANY transportReceiver name="tcp" class="org.apache.axis2.transport.tcp.TCPServer">
+ <parameter name="port" locked="false">6060</parameter>
+ </transportReceiver -->
+
+ <!--REMOVED FOR TUSCANY transportReceiver name="jms" class="org.apache.axis2.transport.jms.SimpleJMSListener">
+ <parameter name="transport.jms.Destination" locked="false">dynamicQueues/FOO</parameter>
+ <parameter name="java.naming.factory.initial" locked="false">
+ org.activemq.jndi.ActiveMQInitialContextFactory</parameter>
+ <parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter>
+ </transportReceiver>
+ -->
+
+ <!-- ================================================= -->
+ <!-- Transport Outs -->
+ <!-- ================================================= -->
+
+ <!--REMOVED FOR TUSCANY transportSender name="tcp" class="org.apache.axis2.transport.tcp.TCPTransportSender"/> -->
+ <transportSender name="local" class="org.apache.axis2.transport.local.LocalTransportSender"/>
+ <!--REMOVED FOR TUSCANY transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender"/> -->
+ <transportSender name="http" class="org.apache.axis2.transport.http.CommonsHTTPTransportSender">
+ <parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter>
+ <parameter name="Transfer-Encoding" locked="false">chunked</parameter>
+ </transportSender>
+ <transportSender name="https"
+ class="org.apache.axis2.transport.http.CommonsHTTPTransportSender">
+ <parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter>
+ <parameter name="Transfer-Encoding" locked="false">chunked</parameter>
+ </transportSender>
+
+ <!-- Uncomment this one with the appropriate papameters to enable the SMTP transport Receiver
+ <transportSender name="mailto" class="org.apache.axis2.transport.mail.MailTransportSender">
+ <parameter name="transport.mail.smtp.host" locked="false">127.0.0.1</parameter>
+ <parameter name="transport.mail.smtp.user" locked="false">axis2</parameter>
+ <parameter name="transport.mail.smtp.password" locked="false">axis2</parameter>
+ <parameter name="transport.mail.smtp.port" locked="false">25</parameter>
+ </transportSender>
+ -->
+
+ <!-- ================================================= -->
+ <!-- Global Modules -->
+ <!-- ================================================= -->
+ <!-- Comment this to disable Addressing -->
+ <!--REMOVED FOR TUSCANY module ref="addressing"/> -->
+
+
+ <!--Configuring module , providing parameters for modules whether they refer or not-->
+ <!--<moduleConfig name="addressing">-->
+ <!--<parameter name="addressingPara" locked="false">N/A</parameter>-->
+ <!--</moduleConfig>-->
+
+ <!-- ================================================= -->
+ <!-- Phases -->
+ <!-- ================================================= -->
+ <phaseOrder type="inflow">
+ <!-- System pre defined phases -->
+ <phase name="TransportIn"/>
+ <phase name="PreDispatch"/>
+ <phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase">
+ <handler name="AddressingBasedDispatcher"
+ class="org.apache.axis2.engine.AddressingBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+
+ <handler name="RequestURIBasedDispatcher"
+ class="org.apache.axis2.engine.RequestURIBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+
+ <handler name="SOAPActionBasedDispatcher"
+ class="org.apache.axis2.engine.SOAPActionBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+
+ <handler name="SOAPMessageBodyBasedDispatcher"
+ class="org.apache.axis2.engine.SOAPMessageBodyBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+ <handler name="InstanceDispatcher"
+ class="org.apache.axis2.engine.InstanceDispatcher">
+ <order phase="PostDispatch"/>
+ </handler>
+ </phase>
+ <!-- System pre defined phases -->
+ <!-- After Postdispatch phase module author or or service author can add any phase he want -->
+ <phase name="userphase1"/>
+ </phaseOrder>
+ <phaseOrder type="outflow">
+ <!-- user can add his own phases to this area -->
+ <phase name="userphase1"/>
+ <!--system predefined phase-->
+ <!--these phase will run irrespective of the service-->
+ <phase name="PolicyDetermination"/>
+ <phase name="MessageOut"/>
+ </phaseOrder>
+ <phaseOrder type="INfaultflow">
+ <!-- user can add his own phases to this area -->
+ <phase name="userphase1"/>
+ </phaseOrder>
+ <phaseOrder type="Outfaultflow">
+ <!-- user can add his own phases to this area -->
+ <phase name="userphase1"/>
+ <phase name="PolicyDetermination"/>
+ <phase name="MessageOut"/>
+ </phaseOrder>
+</axisconfig>
+
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/resources/system.fragment b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/resources/system.fragment new file mode 100644 index 0000000000..716019992b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/main/resources/system.fragment @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="ASCII"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<moduleFragment xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9" + xmlns:tuscany="http://org.apache.tuscany/xmlns/system/0.9" + name="org.apache.tuscany.binding.axis"> + + <component name="org.apache.tuscany.binding.axis2.builder.ExternalWebServiceBuilder"> + <tuscany:implementation.system class="org.apache.tuscany.binding.axis2.builder.ExternalWebServiceBuilder"/> + </component> + + <component name="org.apache.tuscany.binding.axis2.builder.ExternalWebServiceWireBuilder"> + <tuscany:implementation.system class="org.apache.tuscany.binding.axis2.builder.ExternalWebServiceWireBuilder"/> + </component> + + <component name="org.apache.tuscany.binding.axis2.builder.WebServiceEntryPointBuilder"> + <tuscany:implementation.system class="org.apache.tuscany.binding.axis2.builder.WebServiceEntryPointBuilder"/> + </component> + + <component name="org.apache.tuscany.binding.axis2.loader.WebServiceBindingLoaderr"> + <tuscany:implementation.system class="org.apache.tuscany.binding.axis2.loader.WebServiceBindingLoader"/> + </component> + +</moduleFragment> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/account/AccountReport.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/account/AccountReport.java new file mode 100644 index 0000000000..0600e14f8d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/account/AccountReport.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.assembly.tests.bigbank.account.services.account; + +import java.util.List; + +/** + * @model + */ + +public interface AccountReport { + + /** + * @model type="services.account.AccountSummary" + */ + + List getAccountSummaries(); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/account/AccountService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/account/AccountService.java new file mode 100644 index 0000000000..b605d19f09 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/account/AccountService.java @@ -0,0 +1,25 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.assembly.tests.bigbank.account.services.account; + +import org.osoa.sca.annotations.Remotable; + +@Remotable +public interface AccountService { + + AccountReport getAccountReport(String customerID); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/account/AccountServiceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/account/AccountServiceImpl.java new file mode 100644 index 0000000000..cd3fcfe1f5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/account/AccountServiceImpl.java @@ -0,0 +1,53 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.assembly.tests.bigbank.account.services.account; + + +import org.apache.tuscany.binding.axis2.assembly.tests.bigbank.account.services.accountdata.AccountDataService; +import org.apache.tuscany.binding.axis2.assembly.tests.bigbank.account.services.stockquote.StockQuoteService; +import org.osoa.sca.annotations.Property; +import org.osoa.sca.annotations.Reference; + +public class AccountServiceImpl implements AccountService { + + @Property + private String currency = "USD"; + @Reference + private AccountDataService accountDataService; + @Reference + private StockQuoteService stockQuoteService; + + public AccountServiceImpl() { + } + + public AccountReport getAccountReport(String customerID) { + return null; + } + + + //methods to access the fields + protected StockQuoteService getStockQuoteService() { + return stockQuoteService; + } + protected AccountDataService getAccountDataService() { + return accountDataService; + } + protected String getCurrency() { + return currency; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/account/AccountSummary.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/account/AccountSummary.java new file mode 100644 index 0000000000..9000e4ba19 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/account/AccountSummary.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.assembly.tests.bigbank.account.services.account; + +/** + * @model + */ + +public interface AccountSummary { + + /** + * @model + */ + String getAccountNumber(); + + void setAccountNumber(String accountNumber); + + /** + * @model + */ + String getAccountType(); + + void setAccountType(String accountType); + + /** + * @model + */ + float getBalance(); + + void setBalance(float balance); +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/accountdata/AccountDataService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/accountdata/AccountDataService.java new file mode 100644 index 0000000000..d2dc72e868 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/accountdata/AccountDataService.java @@ -0,0 +1,26 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.assembly.tests.bigbank.account.services.accountdata; + +public interface AccountDataService { + + CheckingAccount getCheckingAccount(String customerID); + + SavingsAccount getSavingsAccount(String customerID); + + StockAccount getStockAccount(String customerID); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/accountdata/AccountDataServiceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/accountdata/AccountDataServiceImpl.java new file mode 100644 index 0000000000..d945ee1f34 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/accountdata/AccountDataServiceImpl.java @@ -0,0 +1,48 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.assembly.tests.bigbank.account.services.accountdata; + +public class AccountDataServiceImpl implements AccountDataService { + + public CheckingAccount getCheckingAccount(String customerID) { + + CheckingAccount checkingAccount = new CheckingAccount(); + checkingAccount.setAccountNumber(customerID + "_" + "CHA12345"); + checkingAccount.setBalance(1500.0f); + + return checkingAccount; + } + + public SavingsAccount getSavingsAccount(String customerID) { + + SavingsAccount savingsAccount = new SavingsAccount(); + savingsAccount.setAccountNumber(customerID + "_" + "SAA12345"); + savingsAccount.setBalance(1500.0f); + + return savingsAccount; + } + + public StockAccount getStockAccount(String customerID) { + + StockAccount stockAccount = new StockAccount(); + stockAccount.setAccountNumber(customerID + "_" + "STA12345"); + stockAccount.setSymbol("IBM"); + stockAccount.setQuantity(100); + + return stockAccount; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/accountdata/CheckingAccount.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/accountdata/CheckingAccount.java new file mode 100644 index 0000000000..6b75194b98 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/accountdata/CheckingAccount.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.assembly.tests.bigbank.account.services.accountdata; + +public class CheckingAccount { + + private String accountNumber; + private float balance; + + public String getAccountNumber() { + return accountNumber; + } + + public void setAccountNumber(String accountNumber) { + this.accountNumber = accountNumber; + } + + public float getBalance() { + return balance; + } + + public void setBalance(float balance) { + this.balance = balance; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/accountdata/SavingsAccount.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/accountdata/SavingsAccount.java new file mode 100644 index 0000000000..a37b504829 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/accountdata/SavingsAccount.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.assembly.tests.bigbank.account.services.accountdata; + +public class SavingsAccount { + + private String accountNumber; + private float balance; + + public String getAccountNumber() { + return accountNumber; + } + + public void setAccountNumber(String accountNumber) { + this.accountNumber = accountNumber; + } + + public float getBalance() { + return balance; + } + + public void setBalance(float balance) { + this.balance = balance; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/accountdata/StockAccount.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/accountdata/StockAccount.java new file mode 100644 index 0000000000..2a5ac5f4a3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/accountdata/StockAccount.java @@ -0,0 +1,48 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.assembly.tests.bigbank.account.services.accountdata; + +public class StockAccount { + + private String accountNumber; + private String symbol; + private int quantity; + + public String getAccountNumber() { + return accountNumber; + } + + public void setAccountNumber(String accountNumber) { + this.accountNumber = accountNumber; + } + + public int getQuantity() { + return quantity; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/stockquote/StockQuoteService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/stockquote/StockQuoteService.java new file mode 100644 index 0000000000..021b19d14d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/stockquote/StockQuoteService.java @@ -0,0 +1,24 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.axis2.assembly.tests.bigbank.account.services.stockquote; + +public interface StockQuoteService { + + float getQuote(String symbol); +} + +
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/builder/ExternalWebServiceBuilderTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/builder/ExternalWebServiceBuilderTestCase.java new file mode 100644 index 0000000000..d040b87b86 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/builder/ExternalWebServiceBuilderTestCase.java @@ -0,0 +1,379 @@ +/**
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.axis2.builder;
+
+import java.net.URL;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import javax.wsdl.Definition;
+import javax.wsdl.Port;
+import javax.wsdl.factory.WSDLFactory;
+import javax.wsdl.xml.WSDLReader;
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.binding.axis2.assembly.WebServiceBinding;
+import org.apache.tuscany.binding.axis2.externalservice.Axis2OperationInvoker;
+import org.apache.tuscany.binding.axis2.externalservice.Axis2ServiceInvoker;
+import org.apache.tuscany.binding.axis2.util.WebServicePortMetaData;
+import org.apache.tuscany.common.resource.ResourceLoader;
+import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl;
+import org.apache.tuscany.core.extension.ExternalServiceContextFactory;
+import org.apache.tuscany.model.assembly.AssemblyContext;
+import org.apache.tuscany.model.assembly.AssemblyInitializationException;
+import org.apache.tuscany.model.assembly.AssemblyVisitor;
+import org.apache.tuscany.model.assembly.Binding;
+import org.apache.tuscany.model.assembly.Composite;
+import org.apache.tuscany.model.assembly.ConfiguredService;
+import org.apache.tuscany.model.assembly.ExternalService;
+import org.apache.tuscany.model.assembly.OverrideOption;
+import org.apache.tuscany.model.assembly.Part;
+import org.apache.tuscany.model.assembly.Scope;
+import org.apache.tuscany.model.assembly.Service;
+import org.apache.tuscany.model.assembly.ServiceContract;
+
+import commonj.sdo.helper.TypeHelper;
+
+public class ExternalWebServiceBuilderTestCase extends TestCase {
+
+ private Definition definition;
+
+ private static final QName SERVICE_NAME = new QName("http://helloworldaxis.samples.tuscany.apache.org", "HelloWorldServiceImplService");
+
+ private static final String PORTNAME = "helloworld";
+
+ private static final QName GET_GREETINGS_QN = new QName(SERVICE_NAME.getNamespaceURI(), "getGreetings");
+
+ public void testCreateOperationInvokers() {
+ ExternalWebServiceBuilder builder = new ExternalWebServiceBuilder();
+
+ Port port = definition.getService(SERVICE_NAME).getPort(PORTNAME);
+ WebServicePortMetaData wspmd = new WebServicePortMetaData(definition, port, null, false);
+
+ Map<String, Axis2OperationInvoker> invokers = builder.createOperationInvokers(Foo.class, null, getClass().getClassLoader(),wspmd);
+ assertNotNull(invokers);
+ assertEquals(1, invokers.size());
+
+ Axis2OperationInvoker opInvoker = invokers.get(GET_GREETINGS_QN.getLocalPart());
+ assertNotNull(opInvoker);
+ assertEquals(GET_GREETINGS_QN, opInvoker.getWSDLOperationName());
+ }
+
+ public void testCreateExternalServiceContextFactory() {
+ ExternalWebServiceBuilder builder = new ExternalWebServiceBuilder();
+ ExternalService es = createMockExternalService();
+ ExternalServiceContextFactory cf = builder.createExternalServiceContextFactory(es);
+ assertNotNull(cf);
+ Axis2ServiceInvoker si = (Axis2ServiceInvoker) cf.createContext().getHandler();
+ assertNotNull(si);
+ }
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ WSDLReader reader = WSDLFactory.newInstance().newWSDLReader();
+ reader.setFeature("javax.wsdl.verbose", false);
+ URL url = getClass().getResource("helloworld.wsdl");
+ this.definition = reader.readWSDL(url.toString());
+ }
+
+ interface Foo {
+ public void getGreetings();
+ };
+
+ private ExternalService createMockExternalService() {
+ ExternalService es = new ExternalService() {
+
+ public List<Binding> getBindings() {
+ return Arrays.asList(new Binding[] { createMockBinding() });
+ }
+
+ public OverrideOption getOverrideOption() {
+
+ return null;
+ }
+
+ public void setOverrideOption(OverrideOption value) {
+
+ }
+
+ public ConfiguredService getConfiguredService() {
+ return new ConfiguredService() {
+
+ public String getName() {
+
+ return null;
+ }
+
+ public void setName(String name) {
+
+ }
+
+ public Service getPort() {
+ return new Service() {
+
+ public ServiceContract getServiceContract() {
+ return new ServiceContract() {
+
+ public Class getInterface() {
+ return Foo.class;
+ }
+
+ public void setInterface(Class value) {
+
+ }
+
+ public Class getCallbackInterface() {
+
+ return null;
+ }
+
+ public void setCallbackInterface(Class value) {
+
+ }
+
+ public Scope getScope() {
+
+ return null;
+ }
+
+ public void setScope(Scope scope) {
+
+ }
+
+ public List<Object> getExtensibilityElements() {
+
+ return null;
+ }
+
+ public List<Object> getExtensibilityAttributes() {
+
+ return null;
+ }
+
+ public void initialize(AssemblyContext modelContext) throws AssemblyInitializationException {
+
+ }
+
+ public void freeze() {
+
+ }
+
+ public boolean accept(AssemblyVisitor visitor) {
+
+ return false;
+ }
+ };
+ }
+
+ public void setServiceContract(ServiceContract contract) {
+
+ }
+
+ public String getName() {
+
+ return null;
+ }
+
+ public void setName(String name) {
+
+ }
+
+ public void initialize(AssemblyContext modelContext) throws AssemblyInitializationException {
+
+ }
+
+ public void freeze() {
+
+ }
+
+ public boolean accept(AssemblyVisitor visitor) {
+
+ return false;
+ }
+ };
+ }
+
+ public void setPort(Service port) {
+
+ }
+
+ public Part getPart() {
+
+ return null;
+ }
+
+ public void setPart(Part part) {
+
+ }
+
+ public void initialize(AssemblyContext modelContext) throws AssemblyInitializationException {
+
+ }
+
+ public void freeze() {
+
+ }
+
+ public boolean accept(AssemblyVisitor visitor) {
+
+ return false;
+ }
+
+ public void setProxyFactory(Object proxyFactory) {
+
+ }
+
+ public Object getProxyFactory() {
+
+ return null;
+ }
+ };
+ }
+
+ public void setConfiguredService(ConfiguredService configuredService) {
+
+ }
+
+ public String getName() {
+
+ return "myService";
+ }
+
+ public void setName(String value) {
+
+ }
+
+ public Composite getComposite() {
+
+ return null;
+ }
+
+ public void setComposite(Composite composite) {
+
+ }
+
+ public List<Object> getExtensibilityElements() {
+
+ return null;
+ }
+
+ public List<Object> getExtensibilityAttributes() {
+
+ return null;
+ }
+
+ public void initialize(AssemblyContext modelContext) throws AssemblyInitializationException {
+
+ }
+
+ public void freeze() {
+
+ }
+
+ public boolean accept(AssemblyVisitor visitor) {
+
+ return false;
+ }
+
+ public void setContextFactory(Object contextFactory) {
+
+ }
+
+ public Object getContextFactory() {
+
+ return null;
+ }
+ };
+ return es;
+ }
+
+ private Binding createMockBinding() {
+ WebServiceBinding b = new WebServiceBinding() {
+
+ public void setPortURI(String portURI) {
+
+ }
+
+ public Port getWSDLPort() {
+ return definition.getService(SERVICE_NAME).getPort(PORTNAME);
+ }
+
+ public Definition getWSDLDefinition() {
+ return definition;
+ }
+
+ public void setWSDLPort(Port value) {
+
+ }
+
+ public void setWSDLDefinition(Definition definition) {
+
+ }
+
+ public TypeHelper getTypeHelper() {
+
+ return null;
+ }
+
+ public void setTypeHelper(TypeHelper typeHelper) {
+
+ }
+
+ public ResourceLoader getResourceLoader() {
+ return new ResourceLoaderImpl(Thread.currentThread().getContextClassLoader());
+ }
+
+ public void setResourceLoader(ResourceLoader resourceLoader) {
+
+ }
+
+ public String getURI() {
+
+ return null;
+ }
+
+ public void setURI(String value) {
+
+ }
+
+ public void initialize(AssemblyContext modelContext) throws AssemblyInitializationException {
+
+ }
+
+ public void freeze() {
+
+ }
+
+ public boolean accept(AssemblyVisitor visitor) {
+
+ return false;
+ }
+
+ public void setWebAppName(String webAppName) {
+ }
+
+ public String getWebAppName() {
+ return null;
+ }
+
+ };
+ return b;
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/handler/HelloWorldService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/handler/HelloWorldService.java new file mode 100644 index 0000000000..6d046d84c4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/handler/HelloWorldService.java @@ -0,0 +1,26 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.axis2.handler;
+
+/**
+ * This is the business interface of the HelloWorld service component.
+ */
+public interface HelloWorldService {
+
+ String getGreetings(String name);
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/handler/HelloWorldServiceComponentImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/handler/HelloWorldServiceComponentImpl.java new file mode 100644 index 0000000000..972b94e5a7 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/handler/HelloWorldServiceComponentImpl.java @@ -0,0 +1,44 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.axis2.handler;
+
+import org.osoa.sca.annotations.Reference;
+import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.Service;
+
+/**
+ * This class implements the HelloWorld service component.
+ */
+@Service(HelloWorldService.class)
+//FIXME workaround for JIRA TUSCANY-41
+@Scope("MODULE")
+public class HelloWorldServiceComponentImpl implements HelloWorldService {
+
+ @Reference
+ // Injected by the SCA container.
+ private HelloWorldService hellowWorldService;
+
+ /**
+ * @see org.apache.tuscany.samples.helloworldwsclient.HelloWorldService#getGreetings(java.lang.String)
+ */
+ public String getGreetings(final String name) {
+ assert null != hellowWorldService : "helloWorldService was not set by the SCA runtime!";
+
+ return hellowWorldService.getGreetings(name);
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/util/SDODataBindingTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/util/SDODataBindingTestCase.java new file mode 100644 index 0000000000..621f12068c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/java/org/apache/tuscany/binding/axis2/util/SDODataBindingTestCase.java @@ -0,0 +1,123 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.axis2.util;
+
+import java.net.URL;
+
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.tuscany.sdo.util.DataObjectUtil;
+import org.apache.tuscany.sdo.util.SDOUtil;
+
+import commonj.sdo.DataObject;
+import commonj.sdo.helper.DataFactory;
+import commonj.sdo.helper.TypeHelper;
+import commonj.sdo.helper.XSDHelper;
+
+public class SDODataBindingTestCase extends TestCase {
+ public static final QName DOCLITWRAPPED_QN = new QName("http://www.example.org/creditscore/doclitwrapped/", "getCreditScore");
+
+ public static final QName DOCLIT_QN = new QName("http://www.example.org/creditscore/doclit/", "getCreditScoreRequest");
+
+ public static final QName GREETING_QN = new QName("http://helloworldaxis.samples.tuscany.apache.org", "getGreetings");
+
+ private TypeHelper typeHelper;
+
+ private SDODataBinding docLitWrappedDB;
+
+ private SDODataBinding docLitDB;
+
+ private SDODataBinding greetingDB;
+
+ public void testToOMElement() {
+ String s = "petra";
+
+ OMElement omElement = greetingDB.toOMElement(new Object[] { s });
+ assertNotNull(omElement);
+
+ Object[] os = greetingDB.fromOMElement(omElement);
+ assertNotNull(os);
+ assertEquals(1, os.length);
+ assertEquals(s, os[0]);
+ }
+
+ public void testDocLit() {
+ DataFactory dataFactory = SDOUtil.createDataFactory(typeHelper);
+ DataObject dataObject = dataFactory.create("http://www.example.org/creditscore/doclit/", "Customer");
+ dataObject.setString(0, "111-22-3333");
+ dataObject.setString(1, "John");
+ dataObject.setString(2, "Smith");
+
+ OMElement omElement = docLitDB.toOMElement(new Object[] { dataObject });
+ assertNotNull(omElement);
+
+ Object[] os = docLitDB.fromOMElement(omElement);
+ assertNotNull(os);
+ assertEquals(os.length, 1);
+ assertTrue(os[0] instanceof DataObject);
+
+ dataObject = (DataObject) os[0];
+ assertEquals(dataObject.getString(0), "111-22-3333");
+ assertEquals(dataObject.getString(1), "John");
+ assertEquals(dataObject.getString(2), "Smith");
+ }
+
+ public void testDocLitWrapped() {
+ Object[] args = new Object[] { "111-22-3333", "John", "Smith" };
+
+ OMElement omElement = docLitWrappedDB.toOMElement(args);
+ assertNotNull(omElement);
+
+ Object[] os = docLitWrappedDB.fromOMElement(omElement);
+ assertNotNull(os);
+ assertEquals(os.length, 3);
+
+ assertEquals(os[0], "111-22-3333");
+ assertEquals(os[1], "John");
+ assertEquals(os[2], "Smith");
+ }
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ DataObjectUtil.initRuntime();
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+
+ typeHelper = SDOUtil.createTypeHelper();
+ XSDHelper xsdHelper = SDOUtil.createXSDHelper(typeHelper);
+ URL url = getClass().getResource("helloworld.wsdl");
+ xsdHelper.define(url.openStream(), null);
+ url = getClass().getResource("CreditScoreDocLitWrapped.wsdl");
+ xsdHelper.define(url.openStream(), null);
+ url = getClass().getResource("CreditScoreDocLit.wsdl");
+ xsdHelper.define(url.openStream(), null);
+
+ this.greetingDB = new SDODataBinding(getClass().getClassLoader(),typeHelper, GREETING_QN, true);
+ this.docLitWrappedDB = new SDODataBinding(getClass().getClassLoader(),typeHelper, DOCLITWRAPPED_QN, true);
+
+ this.docLitDB = new SDODataBinding(getClass().getClassLoader(),typeHelper, DOCLIT_QN, false);
+
+ } finally {
+ Thread.currentThread().setContextClassLoader(cl);
+ }
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/account/AccountService.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/account/AccountService.wsdl new file mode 100644 index 0000000000..b62a2c09da --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/account/AccountService.wsdl @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:tns="http://www.bigbank.com/AccountService/"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://www.bigbank.com/AccountService/"
+
+ name="AccountService">
+
+ <wsdl:types>
+ <xsd:schema targetNamespace="http://www.bigbank.com/AccountService/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <xsd:element name="customerID" type="xsd:string"/>
+ <xsd:element name="getAccountReportResponse" type="tns:AccountReport"/>
+
+ <xsd:complexType name="AccountReport">
+ <xsd:sequence>
+ <xsd:element name="accountSummary" type="tns:AccountSummary" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ <xsd:complexType name="AccountSummary">
+ <xsd:sequence>
+ <xsd:element name="accountNumber" type="xsd:string"/>
+ <xsd:element name="accountType" type="xsd:string"/>
+ <xsd:element name="balance" type="xsd:float"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ </xsd:schema>
+ </wsdl:types>
+ <wsdl:message name="getAccountReportRequest">
+ <wsdl:part element="tns:customerID" name="getAccountReportRequest"/>
+ </wsdl:message>
+ <wsdl:message name="getAccountReportResponse">
+ <wsdl:part element="tns:getAccountReportResponse" name="getAccountReportResponse"/>
+ </wsdl:message>
+ <wsdl:portType name="AccountService">
+ <wsdl:operation name="getAccountReport">
+ <wsdl:input message="tns:getAccountReportRequest"/>
+ <wsdl:output message="tns:getAccountReportResponse"/>
+ </wsdl:operation>
+ </wsdl:portType>
+ <wsdl:binding name="AccountServiceSOAP" type="tns:AccountService">
+ <soap:binding style="document"
+ transport="http://schemas.xmlsoap.org/soap/http"/>
+ <wsdl:operation name="getAccountReport">
+ <soap:operation
+ soapAction="http://www.bigbank.com/AccountService/getAccountReport"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:service name="AccountService">
+ <wsdl:port binding="tns:AccountServiceSOAP"
+ name="AccountServiceSOAP">
+ <soap:address location="http://localhost:8080/tuscany-binding-axis2/services/AccountService"/>
+ </wsdl:port>
+ </wsdl:service>
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/stockquote/StockQuoteWebService.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/stockquote/StockQuoteWebService.wsdl new file mode 100644 index 0000000000..6af61ef80e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/stockquote/StockQuoteWebService.wsdl @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<wsdl:definitions targetNamespace="http://webservice.stockquote" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://webservice.stockquote" xmlns:intf="http://webservice.stockquote" xmlns:tns1="http://stockquote" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="stockquote">
+ <!--WSDL created by Apache Axis version: 1.2.1
+Built on Jun 14, 2005 (09:15:57 EDT)-->
+ <wsdl:types>
+ <schema elementFormDefault="qualified" targetNamespace="http://stockquote" xmlns="http://www.w3.org/2001/XMLSchema">
+ <complexType name="GetQuoteRequest">
+ <sequence>
+ <element name="symbol" nillable="true" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ <complexType name="GetQuoteResponse">
+ <sequence>
+ <element name="price" type="xsd:float"/>
+ </sequence>
+ </complexType>
+ </schema>
+ <schema elementFormDefault="qualified" targetNamespace="http://webservice.stockquote" xmlns="http://www.w3.org/2001/XMLSchema">
+ <import namespace="http://stockquote"/>
+ <element name="request" type="tns1:GetQuoteRequest"/>
+ <element name="getQuoteReturn" type="tns1:GetQuoteResponse"/>
+ </schema>
+ </wsdl:types>
+
+ <wsdl:message name="getQuoteResponse">
+
+ <wsdl:part element="impl:getQuoteReturn" name="getQuoteReturn"/>
+
+ </wsdl:message>
+
+ <wsdl:message name="getQuoteRequest">
+
+ <wsdl:part element="impl:request" name="request"/>
+
+ </wsdl:message>
+
+ <wsdl:portType name="StockQuoteWebService">
+
+ <wsdl:operation name="getQuote" parameterOrder="request">
+
+ <wsdl:input message="impl:getQuoteRequest" name="getQuoteRequest"/>
+
+ <wsdl:output message="impl:getQuoteResponse" name="getQuoteResponse"/>
+
+ </wsdl:operation>
+
+ </wsdl:portType>
+
+ <wsdl:binding name="StockQuoteWebServiceSoapBinding" type="impl:StockQuoteWebService">
+
+ <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+
+ <wsdl:operation name="getQuote">
+
+ <wsdlsoap:operation soapAction=""/>
+
+ <wsdl:input name="getQuoteRequest">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:input>
+
+ <wsdl:output name="getQuoteResponse">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:output>
+
+ </wsdl:operation>
+
+ </wsdl:binding>
+
+ <wsdl:service name="StockQuoteWebServiceService">
+
+ <wsdl:port binding="impl:StockQuoteWebServiceSoapBinding" name="StockQuoteWebService">
+
+ <wsdlsoap:address location="http://localhost:8123/StockQuoteWebService/services/StockQuoteWebService"/>
+
+ </wsdl:port>
+
+ </wsdl:service>
+
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/assembly/tests/sca.module b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/assembly/tests/sca.module new file mode 100644 index 0000000000..6c0b70b25e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/assembly/tests/sca.module @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ * Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.
+ -->
+<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ name="tuscany.binding.axis2.assembly.tests.bigbank.account">
+
+ <import.wsdl wsdlLocation="org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/account/AccountService.wsdl"/>
+ <import.wsdl wsdlLocation="org/apache/tuscany/binding/axis2/assembly/tests/bigbank/account/services/stockquote/StockQuoteWebService.wsdl"/>
+
+ <entryPoint name="AccountService">
+ <interface.java interface="org.apache.tuscany.binding.axis2.assembly.tests.bigbank.account.services.account.AccountService"/>
+ <binding.ws port="http://www.bigbank.com/AccountService/#wsdl.endpoint(AccountService/AccountServiceSOAP)"/>
+ <reference>AccountExternalService</reference>
+ </entryPoint>
+
+ <entryPoint name="AccountService2"> + <interface.wsdl interface="http://www.bigbank.com/AccountService/#wsdl.interface(AccountService)"/> + <binding.ws port="http://www.bigbank.com/AccountService/#wsdl.endpoint(AccountService/AccountServiceSOAP)"/> + <reference>AccountExternalService</reference> + </entryPoint> + + <component name="AccountServiceComponent">
+ <implementation.java class="org.apache.tuscany.binding.axis2.assembly.tests.bigbank.account.services.account.AccountServiceImpl"/>
+ </component>
+
+ <component name="AccountDataServiceComponent">
+ <implementation.java class="org.apache.tuscany.binding.axis2.assembly.tests.bigbank.account.services.accountdata.AccountDataServiceImpl"/>
+ </component>
+
+ <!--
+ <component name="StockQuoteService">
+ <implementation.java class="org.apache.tuscany.binding.axis2.assembly.tests.bigbank.account.services.stockquote.StockQuoteServiceImpl"/>
+ </component>
+ -->
+
+ <externalService name="AccountExternalService"> + <interface.wsdl interface="http://www.bigbank.com/AccountService/#wsdl.interface(AccountService)"/> + <binding.ws port="http://www.bigbank.com/AccountService/#wsdl.endpoint(AccountService/AccountServiceSOAP)"/> + </externalService> + + <externalService name="StockQuoteService">
+ <interface.java interface="org.apache.tuscany.binding.axis2.assembly.tests.bigbank.account.services.stockquote.StockQuoteService"/>
+ <binding.ws port="http://webservice.stockquote#wsdl.endpoint(StockQuoteWebServiceService/StockQuoteWebService)"/>
+ </externalService> + +</module>
+
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/builder/helloworld.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/builder/helloworld.wsdl new file mode 100644 index 0000000000..465f1fd4af --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/builder/helloworld.wsdl @@ -0,0 +1,103 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<wsdl:definitions targetNamespace="http://helloworldaxis.samples.tuscany.apache.org" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://helloworldaxis.samples.tuscany.apache.org" xmlns:intf="http://helloworldaxis.samples.tuscany.apache.org" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="helloworld">
+ <!--WSDL created by Apache Axis version: 1.2.1
+Built on Jun 14, 2005 (09:15:57 EDT)-->
+ <wsdl:types>
+ <schema elementFormDefault="qualified" targetNamespace="http://helloworldaxis.samples.tuscany.apache.org" xmlns="http://www.w3.org/2001/XMLSchema">
+ <element name="getGreetings">
+ <complexType>
+ <sequence>
+ <element name="in0" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="getGreetingsResponse">
+ <complexType>
+ <sequence>
+ <element name="getGreetingsReturn" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ </element>
+ </schema>
+ </wsdl:types>
+
+ <wsdl:message name="getGreetingsRequest">
+
+ <wsdl:part element="impl:getGreetings" name="parameters"/>
+
+ </wsdl:message>
+
+ <wsdl:message name="getGreetingsResponse">
+
+ <wsdl:part element="impl:getGreetingsResponse" name="parameters"/>
+
+ </wsdl:message>
+
+ <wsdl:portType name="HelloWorldServiceImpl">
+
+ <wsdl:operation name="getGreetings">
+
+ <wsdl:input message="impl:getGreetingsRequest" name="getGreetingsRequest"/>
+
+ <wsdl:output message="impl:getGreetingsResponse" name="getGreetingsResponse"/>
+
+ </wsdl:operation>
+
+ </wsdl:portType>
+
+ <wsdl:binding name="helloworldSoapBinding" type="impl:HelloWorldServiceImpl">
+
+ <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+
+ <wsdl:operation name="getGreetings">
+
+ <wsdlsoap:operation soapAction=""/>
+
+ <wsdl:input name="getGreetingsRequest">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:input>
+
+ <wsdl:output name="getGreetingsResponse">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:output>
+
+ </wsdl:operation>
+
+ </wsdl:binding>
+
+ <wsdl:service name="HelloWorldServiceImplService">
+
+ <wsdl:port binding="impl:helloworldSoapBinding" name="helloworld">
+
+ <!-- Tuscany SCA Service --> + <wsdlsoap:address location="http://localhost:8080/sample-helloworldws/services/HelloWorldService"/> +
+ <!-- Axis Web Service -->
+ <!-- + <wsdlsoap:address location="http://localhost:8081/helloworldaxissvc/services/helloworld"/>
+ --> +
+ </wsdl:port>
+
+ </wsdl:service>
+
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/handler/helloworld.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/handler/helloworld.wsdl new file mode 100644 index 0000000000..465f1fd4af --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/handler/helloworld.wsdl @@ -0,0 +1,103 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<wsdl:definitions targetNamespace="http://helloworldaxis.samples.tuscany.apache.org" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://helloworldaxis.samples.tuscany.apache.org" xmlns:intf="http://helloworldaxis.samples.tuscany.apache.org" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="helloworld">
+ <!--WSDL created by Apache Axis version: 1.2.1
+Built on Jun 14, 2005 (09:15:57 EDT)-->
+ <wsdl:types>
+ <schema elementFormDefault="qualified" targetNamespace="http://helloworldaxis.samples.tuscany.apache.org" xmlns="http://www.w3.org/2001/XMLSchema">
+ <element name="getGreetings">
+ <complexType>
+ <sequence>
+ <element name="in0" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="getGreetingsResponse">
+ <complexType>
+ <sequence>
+ <element name="getGreetingsReturn" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ </element>
+ </schema>
+ </wsdl:types>
+
+ <wsdl:message name="getGreetingsRequest">
+
+ <wsdl:part element="impl:getGreetings" name="parameters"/>
+
+ </wsdl:message>
+
+ <wsdl:message name="getGreetingsResponse">
+
+ <wsdl:part element="impl:getGreetingsResponse" name="parameters"/>
+
+ </wsdl:message>
+
+ <wsdl:portType name="HelloWorldServiceImpl">
+
+ <wsdl:operation name="getGreetings">
+
+ <wsdl:input message="impl:getGreetingsRequest" name="getGreetingsRequest"/>
+
+ <wsdl:output message="impl:getGreetingsResponse" name="getGreetingsResponse"/>
+
+ </wsdl:operation>
+
+ </wsdl:portType>
+
+ <wsdl:binding name="helloworldSoapBinding" type="impl:HelloWorldServiceImpl">
+
+ <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+
+ <wsdl:operation name="getGreetings">
+
+ <wsdlsoap:operation soapAction=""/>
+
+ <wsdl:input name="getGreetingsRequest">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:input>
+
+ <wsdl:output name="getGreetingsResponse">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:output>
+
+ </wsdl:operation>
+
+ </wsdl:binding>
+
+ <wsdl:service name="HelloWorldServiceImplService">
+
+ <wsdl:port binding="impl:helloworldSoapBinding" name="helloworld">
+
+ <!-- Tuscany SCA Service --> + <wsdlsoap:address location="http://localhost:8080/sample-helloworldws/services/HelloWorldService"/> +
+ <!-- Axis Web Service -->
+ <!-- + <wsdlsoap:address location="http://localhost:8081/helloworldaxissvc/services/helloworld"/>
+ --> +
+ </wsdl:port>
+
+ </wsdl:service>
+
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/handler/sca.module b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/handler/sca.module new file mode 100644 index 0000000000..f1433f4648 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/handler/sca.module @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ name="org.apache.tuscany.binding.axis2.handler.helloworld">
+
+ <import.wsdl wsdlLocation="org/apache/tuscany/binding/axis2/handler/helloworld.wsdl"/>
+
+ <component name="HelloWorldServiceComponent">
+ <implementation.java class="org.apache.tuscany.binding.axis2.handler.HelloWorldServiceComponentImpl"/>
+ <references>
+ <v:hellowWorldService>HelloWorldService</v:hellowWorldService>
+ </references>
+ </component>
+
+ <externalService name="HelloWorldService">
+ <interface.wsdl interface="http://helloworldaxis.samples.tuscany.apache.org#wsdl.interface(HelloWorldServiceImpl)"/>
+ <binding.ws port="http://helloworldaxis.samples.tuscany.apache.org#wsdl.endpoint(HelloWorldServiceImplService/helloworld)"/>
+ </externalService> + +</module>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/mediator/tests/DocLit.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/mediator/tests/DocLit.wsdl new file mode 100644 index 0000000000..4aec526803 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/mediator/tests/DocLit.wsdl @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.
+ -->
+<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:tns="http://www.example.org/Test/DocLit"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Test"
+ targetNamespace="http://www.example.org/Test/DocLit">
+ <wsdl:types>
+ <xsd:schema targetNamespace="http://www.example.org/Test/DocLit"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:tns="http://www.example.org/Test/DocLit">
+ <xsd:element name="source" type="xsd:string"/>
+ <xsd:element name="target" type="xsd:string"/>
+ <xsd:element name="context" type="xsd:string"/>
+ <xsd:element name="index" type="xsd:int"/>
+ <xsd:element name="exception" type="xsd:string"/>
+ </xsd:schema>
+ </wsdl:types>
+ <wsdl:message name="testRequest">
+ <wsdl:part element="tns:source" name="part1"/>
+ <wsdl:part element="tns:target" name="part2"/>
+ <wsdl:part element="tns:context" name="part3"/>
+ </wsdl:message>
+ <wsdl:message name="testResponse">
+ <wsdl:part element="tns:index" name="part1"/>
+ </wsdl:message>
+ <wsdl:message name="testFault">
+ <wsdl:part name="testFault" element="tns:exception"></wsdl:part>
+ </wsdl:message>
+ <wsdl:portType name="Test">
+ <wsdl:operation name="indexOf">
+ <wsdl:input name="input" message="tns:testRequest"/>
+ <wsdl:output name="output" message="tns:testResponse"/>
+ <wsdl:fault name="fault" message="tns:testFault"/>
+ </wsdl:operation>
+ </wsdl:portType>
+ <wsdl:binding name="TestSOAP" type="tns:Test">
+ <soap:binding style="document"
+ transport="http://schemas.xmlsoap.org/soap/http"/>
+ <wsdl:operation name="indexOf">
+ <soap:operation
+ soapAction="http://www.example.org/Test/indexOf"/>
+ <wsdl:input>
+ <soap:body parts="part1 part2" use="literal"/>
+ <soap:header message="tns:testRequest" part="part3" use="literal"></soap:header>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ <wsdl:fault name="fault">
+ <soap:fault namespace="http://www.example.org/Test/"
+ use="literal" name="fault"/>
+ </wsdl:fault>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:service name="Test">
+ <wsdl:port binding="tns:TestSOAP" name="TestSOAP">
+ <soap:address
+ location="http://localhost:8080/TestWebServiceMediator/services/Test"/>
+ </wsdl:port>
+ </wsdl:service>
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/mediator/tests/DocLitWrapped.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/mediator/tests/DocLitWrapped.wsdl new file mode 100644 index 0000000000..7839d3ea71 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/mediator/tests/DocLitWrapped.wsdl @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.
+ -->
+<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:tns="http://www.example.org/Test/DocLitWrapped"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Test"
+ targetNamespace="http://www.example.org/Test/DocLitWrapped">
+ <wsdl:types>
+ <xsd:schema targetNamespace="http://www.example.org/Test/DocLitWrapped"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.example.org/Test/DocLitWrapped">
+ <xsd:element name="indexOf">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="source" type="xsd:string"/>
+ <xsd:element name="target" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="indexOfResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="index" type="xsd:int"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="exception" type="xsd:string"/>
+ </xsd:schema>
+ </wsdl:types>
+ <wsdl:message name="testRequest">
+ <wsdl:part element="tns:indexOf" name="part1"/>
+ </wsdl:message>
+ <wsdl:message name="testResponse">
+ <wsdl:part element="tns:indexOfResponse" name="part1"/>
+ </wsdl:message>
+ <wsdl:message name="testFault">
+ <wsdl:part name="testFault" element="tns:exception"></wsdl:part>
+ </wsdl:message>
+ <wsdl:portType name="Test">
+ <wsdl:operation name="indexOf">
+ <wsdl:input name="input" message="tns:testRequest"/>
+ <wsdl:output name="output" message="tns:testResponse"/>
+ <wsdl:fault name="fault" message="tns:testFault"/>
+ </wsdl:operation>
+ </wsdl:portType>
+ <wsdl:binding name="TestSOAP" type="tns:Test">
+ <soap:binding style="document"
+ transport="http://schemas.xmlsoap.org/soap/http"/>
+ <wsdl:operation name="indexOf">
+ <soap:operation
+ soapAction="http://www.example.org/Test/indexOf"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ <wsdl:fault name="fault">
+ <soap:fault namespace="http://www.example.org/Test/"
+ use="literal" name="fault"/>
+ </wsdl:fault>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:service name="Test">
+ <wsdl:port binding="tns:TestSOAP" name="TestSOAP">
+ <soap:address
+ location="http://localhost:8080/TestWebServiceMediator/services/Test"/>
+ </wsdl:port>
+ </wsdl:service>
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/mediator/tests/RpcLit.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/mediator/tests/RpcLit.wsdl new file mode 100644 index 0000000000..8f94f9c66f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/mediator/tests/RpcLit.wsdl @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.
+ -->
+<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:tns="http://www.example.org/Test/RpcLit"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Test"
+ targetNamespace="http://www.example.org/Test/RpcLit">
+ <wsdl:types>
+ <xsd:schema targetNamespace="http://www.example.org/Test/RpcLit"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:tns="http://www.example.org/Test/RpcLit">
+ <!--
+ <xsd:element name="source" type="xsd:string"/>
+ <xsd:element name="target" type="xsd:string"/>
+ <xsd:element name="index" type="xsd:int" />
+ -->
+ <xsd:element name="exception" type="xsd:string"/>
+ </xsd:schema>
+ </wsdl:types>
+ <wsdl:message name="testRequest">
+ <wsdl:part type="xsd:string" name="part1"/>
+ <wsdl:part type="xsd:string" name="part2"/>
+ </wsdl:message>
+ <wsdl:message name="testResponse">
+ <wsdl:part type="xsd:int" name="part1"/>
+ </wsdl:message>
+ <wsdl:message name="testFault">
+ <wsdl:part name="testFault" element="tns:exception"></wsdl:part>
+ </wsdl:message>
+ <wsdl:portType name="Test">
+ <wsdl:operation name="indexOf">
+ <wsdl:input name="input" message="tns:testRequest"/>
+ <wsdl:output name="output" message="tns:testResponse"/>
+ <wsdl:fault name="fault" message="tns:testFault"/>
+ </wsdl:operation>
+ </wsdl:portType>
+ <wsdl:binding name="TestSOAP" type="tns:Test">
+ <soap:binding style="rpc"
+ transport="http://schemas.xmlsoap.org/soap/http"/>
+ <wsdl:operation name="indexOf">
+ <soap:operation
+ soapAction="http://www.example.org/Test/indexOf"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ <wsdl:fault name="fault">
+ <soap:fault namespace="http://www.example.org/Test/"
+ use="literal" name="fault"/>
+ </wsdl:fault>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:service name="Test">
+ <wsdl:port binding="tns:TestSOAP" name="TestSOAP">
+ <soap:address
+ location="http://localhost:8080/TestWebServiceMediator/services/Test"/>
+ </wsdl:port>
+ </wsdl:service>
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/mediator/tests/sca.module b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/mediator/tests/sca.module new file mode 100644 index 0000000000..7d8bb7861f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/mediator/tests/sca.module @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.
+ -->
+<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ name="TestModule">
+
+</module>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/util/CreditScoreDocLit.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/util/CreditScoreDocLit.wsdl new file mode 100644 index 0000000000..09d1a58589 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/util/CreditScoreDocLit.wsdl @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:tns="http://www.example.org/creditscore/doclit/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="CreditScore"
+ targetNamespace="http://www.example.org/creditscore/doclit/">
+ <wsdl:types>
+ <xsd:schema
+ targetNamespace="http://www.example.org/creditscore/doclit/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <xsd:element name="getCreditScoreRequest" type="tns:Customer" />
+ <xsd:complexType name="Customer">
+ <xsd:sequence>
+ <xsd:element name="ssn" type="xsd:string" />
+ <xsd:element name="firstName" type="xsd:string" />
+ <xsd:element name="lastName" type="xsd:string" />
+ </xsd:sequence>
+ </xsd:complexType>
+ <xsd:element name="getCreditScoreResponse" type="tns:CreditReport"/>
+ <xsd:complexType name="CreditReport">
+ <xsd:sequence>
+ <xsd:element name="score" type="xsd:int"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:schema>
+ </wsdl:types>
+ <wsdl:message name="getCreditScoreResponse">
+ <wsdl:part element="tns:getCreditScoreResponse"
+ name="getCreditScoreResponse" />
+ </wsdl:message>
+ <wsdl:message name="getCreditScoreRequest">
+ <wsdl:part element="tns:getCreditScoreRequest"
+ name="getCreditScoreRequest" />
+ </wsdl:message>
+ <wsdl:portType name="CreditScoreDocLit">
+ <wsdl:operation name="getCreditScore">
+ <wsdl:input message="tns:getCreditScoreRequest" />
+ <wsdl:output message="tns:getCreditScoreResponse" />
+ </wsdl:operation>
+ </wsdl:portType>
+ <wsdl:binding name="CreditScoreDocLitSOAP" type="tns:CreditScoreDocLit">
+ <soap:binding style="document"
+ transport="http://schemas.xmlsoap.org/soap/http" />
+ <wsdl:operation name="getCreditScore">
+ <soap:operation
+ soapAction="http://www.example.org/creditscore/doclit/getCreditScore" />
+ <wsdl:input>
+ <soap:body parts="getCreditScoreRequest" use="literal" />
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body parts="getCreditScoreResponse" use="literal" />
+ </wsdl:output>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:service name="CreditScore">
+ <wsdl:port binding="tns:CreditScoreDocLitSOAP"
+ name="CreditScoreDocLitSOAP">
+ <soap:address location="http://www.example.org/" />
+ </wsdl:port>
+ </wsdl:service>
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/util/CreditScoreDocLitWrapped.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/util/CreditScoreDocLitWrapped.wsdl new file mode 100644 index 0000000000..3952c74809 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/util/CreditScoreDocLitWrapped.wsdl @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:tns="http://www.example.org/creditscore/doclitwrapped/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="CreditScore"
+ targetNamespace="http://www.example.org/creditscore/doclitwrapped/">
+ <wsdl:types>
+ <xsd:schema
+ targetNamespace="http://www.example.org/creditscore/doclitwrapped/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <xsd:element name="getCreditScoreResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="score" type="xsd:int" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="getCreditScore">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="ssn" type="xsd:string" />
+ <xsd:element name="firstName" type="xsd:string" />
+ <xsd:element name="lastName" type="xsd:string" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ </wsdl:types>
+ <wsdl:message name="getCreditScoreResponse">
+ <wsdl:part element="tns:getCreditScoreResponse"
+ name="getCreditScoreResponse" />
+ </wsdl:message>
+ <wsdl:message name="getCreditScoreRequest">
+ <wsdl:part element="tns:getCreditScore"
+ name="getCreditScoreRequest" />
+ </wsdl:message>
+ <wsdl:portType name="CreditScoreDocLitWrapped">
+ <wsdl:operation name="getCreditScore">
+ <wsdl:input message="tns:getCreditScoreRequest" />
+ <wsdl:output message="tns:getCreditScoreResponse" />
+ </wsdl:operation>
+ </wsdl:portType>
+ <wsdl:binding name="CreditScoreDocLitWrappedSOAP" type="tns:CreditScoreDocLitWrapped">
+ <soap:binding style="document"
+ transport="http://schemas.xmlsoap.org/soap/http" />
+ <wsdl:operation name="getCreditScore">
+ <soap:operation
+ soapAction="http://www.example.org/creditscore/doclitwrapped/getCreditScore" />
+ <wsdl:input>
+ <soap:body parts="getCreditScoreRequest" use="literal" />
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body parts="getCreditScoreResponse" use="literal" />
+ </wsdl:output>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:service name="CreditScore">
+ <wsdl:port binding="tns:CreditScoreDocLitWrappedSOAP"
+ name="CreditScoreDocLitWrappedSOAP">
+ <soap:address location="http://localhost:8080/CreditScoreService/services/CreditScoreDocLitWrappedSOAP"/>
+ </wsdl:port>
+ </wsdl:service>
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/util/helloworld.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/util/helloworld.wsdl new file mode 100644 index 0000000000..c1d4cdccda --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.axis2/src/test/resources/org/apache/tuscany/binding/axis2/util/helloworld.wsdl @@ -0,0 +1,106 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<wsdl:definitions targetNamespace="http://helloworldaxis.samples.tuscany.apache.org" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://helloworldaxis.samples.tuscany.apache.org" xmlns:intf="http://helloworldaxis.samples.tuscany.apache.org" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="stockquote">
+ <!--WSDL created by Apache Axis version: 1.2.1
+Built on Jun 14, 2005 (09:15:57 EDT)-->
+ <wsdl:types>
+ <schema elementFormDefault="qualified" targetNamespace="http://helloworldaxis.samples.tuscany.apache.org" xmlns="http://www.w3.org/2001/XMLSchema">
+ <element name="getGreetings">
+ <complexType>
+ <sequence>
+ <element name="in0" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="getGreetingsResponse">
+ <complexType>
+ <sequence>
+ <element name="getGreetingsReturn" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ </element>
+ </schema>
+ </wsdl:types>
+
+ <wsdl:message name="getGreetingsRequest">
+
+ <wsdl:part element="impl:getGreetings" name="parameters"/>
+
+ </wsdl:message>
+
+ <wsdl:message name="getGreetingsResponse">
+
+ <wsdl:part element="impl:getGreetingsResponse" name="parameters"/>
+
+ </wsdl:message>
+
+ <wsdl:portType name="HelloWorldServiceImpl">
+
+ <wsdl:operation name="getGreetings">
+
+ <wsdl:input message="impl:getGreetingsRequest" name="getGreetingsRequest"/>
+
+ <wsdl:output message="impl:getGreetingsResponse" name="getGreetingsResponse"/>
+
+ </wsdl:operation>
+
+ </wsdl:portType>
+
+ <wsdl:binding name="helloworldSoapBinding" type="impl:HelloWorldServiceImpl">
+
+ <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+
+ <wsdl:operation name="getGreetings">
+
+ <wsdlsoap:operation soapAction=""/>
+
+ <wsdl:input name="getGreetingsRequest">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:input>
+
+ <wsdl:output name="getGreetingsResponse">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:output>
+
+ </wsdl:operation>
+
+ </wsdl:binding>
+
+ <wsdl:service name="HelloWorldServiceImplService">
+
+ <wsdl:port binding="impl:helloworldSoapBinding" name="helloworld">
+
+ <!-- Tuscany SCA Service --> +<!--
+ <wsdlsoap:address location="http://localhost:8080/tuscany-samples-helloworldws-service/services/HelloWorldService"/>
+--> + <wsdlsoap:address location="http://localhost:9876/tuscany-samples-helloworldws-service/services/HelloWorldService"/>
+
+ <!-- Axis Web Service -->
+ <!-- + <wsdlsoap:address location="http://localhost:8081/sample-helloworldaxissvc/services/helloworld"/>
+ --> +
+ </wsdl:port>
+
+ </wsdl:service>
+
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/.checkstyle b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/.checkstyle new file mode 100644 index 0000000000..048a1cef2e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/.checkstyle @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<fileset-config file-format-version="1.2.0" simple-config="true"> + <fileset name="all" enabled="true" check-config-name="Tuscany Checks" local="false"> + <file-match-pattern match-pattern="." include-pattern="true"/> + </fileset> +</fileset-config> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/.pmd b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/.pmd new file mode 100644 index 0000000000..03e6ecf065 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/.pmd @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<pmd><useProjectRuleSet>true</useProjectRuleSet><rules/></pmd>
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/.ruleset b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/.ruleset new file mode 100644 index 0000000000..0bead9a61c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/.ruleset @@ -0,0 +1,172 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ruleset name="pmd-eclipse"> + <description>PMD Plugin preferences rule set</description> + + + <rule ref="rulesets/basic.xml/BooleanInstantiation"/> + <rule ref="rulesets/basic.xml/CollapsibleIfStatements"/> + <rule ref="rulesets/basic.xml/DoubleCheckedLocking"/> +<!--<rule ref="rulesets/basic.xml/EmptyCatchBlock"/>--> +<!--<rule ref="rulesets/basic.xml/EmptyFinallyBlock"/>--> +<!--<rule ref="rulesets/basic.xml/EmptyIfStmt"/>--> + <rule ref="rulesets/basic.xml/EmptyStatementNotInLoop"/> +<!--<rule ref="rulesets/basic.xml/EmptyStaticInitializer"/>--> +<!--<rule ref="rulesets/basic.xml/EmptySwitchStatements"/>--> +<!--<rule ref="rulesets/basic.xml/EmptySynchronizedBlock"/>--> +<!--<rule ref="rulesets/basic.xml/EmptyTryBlock"/>--> +<!--<rule ref="rulesets/basic.xml/EmptyWhileStmt"/>--> + <rule ref="rulesets/basic.xml/ForLoopShouldBeWhileLoop"/> + <rule ref="rulesets/basic.xml/JumbledIncrementer"/> +<!--<rule ref="rulesets/basic.xml/OverrideBothEqualsAndHashcode"/>--> + <rule ref="rulesets/basic.xml/ReturnFromFinallyBlock"/> + <rule ref="rulesets/basic.xml/UnconditionalIfStatement"/> + <rule ref="rulesets/basic.xml/UnnecessaryConversionTemporary"/> + <rule ref="rulesets/basic.xml/UnnecessaryFinalModifier"/> + <rule ref="rulesets/basic.xml/UnnecessaryReturn"/> +<!--<rule ref="rulesets/basic.xml/UselessOverridingMethod"/>--> + +<!--<rule ref="rulesets/braces.xml/ForLoopsMustUseBraces"/>--> +<!--<rule ref="rulesets/braces.xml/IfElseStmtsMustUseBraces"/>--> +<!--<rule ref="rulesets/braces.xml/IfStmtsMustUseBraces"/>--> +<!--<rule ref="rulesets/braces.xml/WhileLoopsMustUseBraces"/>--> + +<!--<rule ref="rulesets/clone.xml/CloneMethodMustImplementCloneable"/>--> +<!--<rule ref="rulesets/clone.xml/CloneThrowsCloneNotSupportedException"/>--> +<!--<rule ref="rulesets/clone.xml/ProperCloneImplementation"/>--> + +<!--<rule ref="rulesets/codesize.xml/CyclomaticComplexity"/>--> +<!--<rule ref="rulesets/codesize.xml/ExcessiveClassLength"/>--> +<!--<rule ref="rulesets/codesize.xml/ExcessiveMethodLength"/>--> +<!--<rule ref="rulesets/codesize.xml/ExcessiveParameterList"/>--> +<!--<rule ref="rulesets/codesize.xml/ExcessivePublicCount"/>--> +<!--<rule ref="rulesets/codesize.xml/TooManyFields"/>--> + +<rule ref="rulesets/controversial.xml/AssignmentInOperand"/> +<!--<rule ref="rulesets/controversial.xml/AtLeastOneConstructor"/>--> +<!--<rule ref="rulesets/controversial.xml/CallSuperInConstructor"/>--> +<!--<rule ref="rulesets/controversial.xml/DontImportSun"/>--> +<!--<rule ref="rulesets/controversial.xml/NullAssignment"/>--> +<!--<rule ref="rulesets/controversial.xml/OnlyOneReturn"/>--> +<!--<rule ref="rulesets/controversial.xml/SingularField"/>--> +<!--<rule ref="rulesets/controversial.xml/SuspiciousOctalEscape"/>--> +<!--<rule ref="rulesets/controversial.xml/UnnecessaryConstructor"/>--> +<rule ref="rulesets/controversial.xml/UnnecessaryParentheses"/> +<!--<rule ref="rulesets/controversial.xml/UnusedModifier"/>--> + +<!--<rule ref="rulesets/coupling.xml/CouplingBetweenObjects"/>--> +<!--<rule ref="rulesets/coupling.xml/ExcessiveImports"/>--> +<!--<rule ref="rulesets/coupling.xml/LooseCoupling"/>--> + +<!--<rule ref="rulesets/design.xml/AbstractClassWithoutAbstractMethod"/>--> +<!--<rule ref="rulesets/design.xml/AccessorClassGeneration"/>--> +<!--<rule ref="rulesets/design.xml/AssignmentToNonFinalStatic"/>--> +<!--<rule ref="rulesets/design.xml/AvoidDeeplyNestedIfStmts"/>--> +<!--<rule ref="rulesets/design.xml/AvoidInstanceofChecksInCatchClause"/>--> +<rule ref="rulesets/design.xml/AvoidProtectedFieldInFinalClass"/> +<!--<rule ref="rulesets/design.xml/AvoidReassigningParameters"/>--> +<!--<rule ref="rulesets/design.xml/AvoidSynchronizedAtMethodLevel"/>--> +<!--<rule ref="rulesets/design.xml/BadComparison"/>--> +<!--<rule ref="rulesets/design.xml/CloseConnection"/>--> +<!--<rule ref="rulesets/design.xml/CompareObjectsWithEquals"/>--> +<!--<rule ref="rulesets/design.xml/ConfusingTernary"/>--> +<rule ref="rulesets/design.xml/ConstructorCallsOverridableMethod"/> +<!--<rule ref="rulesets/design.xml/DefaultLabelNotLastInSwitchStmt"/>--> +<!--<rule ref="rulesets/design.xml/FinalFieldCouldBeStatic"/>--> +<rule ref="rulesets/design.xml/IdempotentOperations"/> +<!--<rule ref="rulesets/design.xml/ImmutableField"/>--> +<!--<rule ref="rulesets/design.xml/InstantiationToGetClass"/>--> +<!--<rule ref="rulesets/design.xml/MissingBreakInSwitch"/>--> +<!--<rule ref="rulesets/design.xml/MissingStaticMethodInNonInstantiatableClass"/>--> +<!--<rule ref="rulesets/design.xml/NonCaseLabelInSwitchStatement"/>--> +<!--<rule ref="rulesets/design.xml/NonStaticInitializer"/>--> +<rule ref="rulesets/design.xml/OptimizableToArrayCall"/> +<rule ref="rulesets/design.xml/PositionLiteralsFirstInComparisons"/> +<rule ref="rulesets/design.xml/SimplifyBooleanExpressions"/> +<rule ref="rulesets/design.xml/SimplifyBooleanReturns"/> +<rule ref="rulesets/design.xml/SimplifyConditional"/> +<!--<rule ref="rulesets/design.xml/SwitchDensity"/>--> +<!--<rule ref="rulesets/design.xml/SwitchStmtsShouldHaveDefault"/>--> +<rule ref="rulesets/design.xml/UnnecessaryLocalBeforeReturn"/> +<!--<rule ref="rulesets/design.xml/UseLocaleWithCaseConversions"/>--> +<!--<rule ref="rulesets/design.xml/UseNotifyAllInsteadOfNotify"/>--> +<!--<rule ref="rulesets/design.xml/UseSingleton"/>--> + +<!--<rule ref="rulesets/finalizers.xml/EmptyFinalizer"/>--> +<!--<rule ref="rulesets/finalizers.xml/FinalizeOnlyCallsSuperFinalize"/>--> +<!--<rule ref="rulesets/finalizers.xml/FinalizeOverloaded"/>--> +<!--<rule ref="rulesets/finalizers.xml/FinalizeDoesNotCallSuperFinalize"/>--> +<!--<rule ref="rulesets/finalizers.xml/FinalizeShouldBeProtected"/>--> +<!--<rule ref="rulesets/finalizers.xml/AvoidCallingFinalize"/>--> + +<!--<rule ref="rulesets/imports.xml/DuplicateImports"/>--> +<!--<rule ref="rulesets/imports.xml/DontImportJavaLang"/>--> +<!--<rule ref="rulesets/imports.xml/UnusedImports"/>--> +<!--<rule ref="rulesets/imports.xml/ImportFromSamePackage"/>--> + +<!--<rule ref="rulesets/javabeans.xml/BeanMembersShouldSerialize"/>--> +<!--<rule ref="rulesets/javabeans.xml/MissingSerialVersionUID"/>--> + +<!--<rule ref="rulesets/junit.xml/JUnitStaticSuite"/>--> +<!--<rule ref="rulesets/junit.xml/JUnitSpelling"/>--> +<!--<rule ref="rulesets/junit.xml/JUnitAssertionsShouldIncludeMessage"/>--> +<!--<rule ref="rulesets/junit.xml/JUnitTestsShouldIncludeAssert"/>--> +<!--<rule ref="rulesets/junit.xml/TestClassWithoutTestCases"/>--> +<!--<rule ref="rulesets/junit.xml/UnnecessaryBooleanAssertion"/>--> +<!--<rule ref="rulesets/junit.xml/UseAssertEqualsInsteadOfAssertTrue"/>--> +<!--<rule ref="rulesets/junit.xml/UseAssertSameInsteadOfAssertTrue"/>--> + + <!--<rule ref="rulesets/logging-java.xml/AvoidPrintStackTrace"/>--> + <rule ref="rulesets/logging-java.xml/LoggerIsNotStaticFinal"/> + <!--<rule ref="rulesets/logging-java.xml/MoreThanOneLogger"/>--> + <!--<rule ref="rulesets/logging-java.xml/LoggerIsNotStaticFinal"/>--> + <!--<rule ref="rulesets/logging-java.xml/LogBlockWithoutIf"/>--> + <!--<rule ref="rulesets/logging-java.xml/SystemPrintln"/>--> + <!--<rule ref="rulesets/logging-jakarta-commons.xml/UseCorrectExceptionLogging"/>--> + <!--<rule ref="rulesets/logging-jakarta-commons.xml/ProperLogger"/>--> + + <!--<rule ref="rulesets/naming.xml/ShortVariable"/>--> + <!--<rule ref="rulesets/naming.xml/LongVariable"/>--> + <!--<rule ref="rulesets/naming.xml/ShortMethodName"/>--> + <!--<rule ref="rulesets/naming.xml/VariableNamingConventions"/>--> + <!--<rule ref="rulesets/naming.xml/MethodNamingConventions"/>--> + <!--<rule ref="rulesets/naming.xml/ClassNamingConventions"/>--> + <!--<rule ref="rulesets/naming.xml/AbstractNaming"/>--> + <!--<rule ref="rulesets/naming.xml/AvoidDollarSigns"/>--> + <!--<rule ref="rulesets/naming.xml/MethodWithSameNameAsEnclosingClass"/>--> + <!--<rule ref="rulesets/naming.xml/SuspiciousHashcodeMethodName"/>--> + <!--<rule ref="rulesets/naming.xml/SuspiciousConstantFieldName"/>--> + <!--<rule ref="rulesets/naming.xml/AvoidFieldNameMatchingTypeName"/>--> + <!--<rule ref="rulesets/naming.xml/AvoidFieldNameMatchingMethodName"/>--> + <!--<rule ref="rulesets/naming.xml/AvoidNonConstructorMethodsWithClassName"/>--> + <!--<rule ref="rulesets/naming.xml/NoPackage"/>--> + <!--<rule ref="rulesets/naming.xml/PackageCase"/>--> + + <!--<rule ref="rulesets/optimizations.xml/LocalVariableCouldBeFinal"/>--> + <!--<rule ref="rulesets/optimizations.xml/MethodArgumentCouldBeFinal"/>--> + <!--<rule ref="rulesets/optimizations.xml/AvoidInstantiatingObjectsInLoops"/>--> + <!--<rule ref="rulesets/optimizations.xml/UseArrayListInsteadOfVector"/>--> + <!--<rule ref="rulesets/optimizations.xml/SimplifyStartsWith"/>--> + <!--<rule ref="rulesets/optimizations.xml/UseStringBufferForStringAppends"/>--> + + <!--<rule ref="rulesets/strictexception.xml/AvoidCatchingThrowable"/>--> + <!--<rule ref="rulesets/strictexception.xml/SignatureDeclareThrowsException"/>--> + <!--<rule ref="rulesets/strictexception.xml/ExceptionAsFlowControl"/>--> + <!--<rule ref="rulesets/strictexception.xml/AvoidCatchingNPE"/>--> + <!--<rule ref="rulesets/strictexception.xml/AvoidThrowingRawExceptionTypes"/>--> + <!--<rule ref="rulesets/strictexception.xml/AvoidThrowingNullPointerException"/>--> + + <!--<rule ref="rulesets/strings.xml/AvoidDuplicateLiterals"/>--> + <!--<rule ref="rulesets/strings.xml/StringInstantiation"/>--> + <!--<rule ref="rulesets/strings.xml/StringToString"/>--> + <!--<rule ref="rulesets/strings.xml/AvoidConcatenatingNonLiteralsInStringBuffer"/>--> + <!--<rule ref="rulesets/strings.xml/UnnecessaryCaseChange"/>--> + + <!--<rule ref="rulesets/sunsecure.xml/MethodReturnsInternalArray"/>--> + <!--<rule ref="rulesets/sunsecure.xml/ArrayIsStoredDirectly"/>--> + + <rule ref="rulesets/unusedcode.xml/UnusedLocalVariable"/> + <rule ref="rulesets/unusedcode.xml/UnusedPrivateField"/> + <rule ref="rulesets/unusedcode.xml/UnusedPrivateMethod"/> + <!--<rule ref="rulesets/unusedcode.xml/UnusedFormalParameter"/>--> + +</ruleset> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/LICENSE.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/README.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/README.txt new file mode 100644 index 0000000000..9b26d1690a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/README.txt @@ -0,0 +1,35 @@ +Apache Tuscany M1 build (May, 2006) +=================================== + +http://incubator.apache.org/tuscany/ + +Tuscany is an effort undergoing incubation at the Apache Software Foundation +(ASF), sponsored by the Web Services PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness or +stability of the code, it does indicate that the project has yet to be fully +endorsed by the ASF. + + +Support +------- + +Any problem with this release can be reported to the Tuscany mailing list +or in the JIRA issue tracker. + +Mailing list subscription: + tuscany-dev-subscribe@ws.apache.org + +Jira: + http://issues.apache.org/jira/browse/Tuscany + + +Thank you for using Tuscany! + + +The Tuscany Team. + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/checkstyle.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/checkstyle.xml new file mode 100644 index 0000000000..9fa44fb41d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/checkstyle.xml @@ -0,0 +1,279 @@ +<?xml version="1.0"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<!DOCTYPE module PUBLIC + "-//Puppy Crawl//DTD Check Configuration 1.2//EN" + "http://www.puppycrawl.com/dtds/configuration_1_2.dtd"> + +<!-- +Checks to make sure the code meets the Tuscany coding guidelines +http://java.sun.com/docs/codeconv/index.html + +It also enforces aa bunch of other "BestPractices like method +lengths, if/try depths, etc... + +--> + +<module name="Checker"> + <!-- Checks whether files end with a new line. --> + <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile --> + <!-- + <module name="NewlineAtEndOfFile"/> + --> + + <!-- Checks that property files contain the same keys. --> + <!-- See http://checkstyle.sf.net/config_misc.html#Translation --> + <module name="Translation"/> + + <!--<module name="StrictDuplicateCode"/>--> + + <module name="TreeWalker"> + + <!-- Checks for Javadoc comments. --> + <!-- See http://checkstyle.sf.net/config_javadoc.html --> + <!-- + <module name="PackageHtml"/> + <module name="JavadocMethod"/> + <module name="JavadocType"/> + <module name="JavadocVariable"/> + <module name="JavadocStyle"/> + --> + + + <!-- Checks for Naming Conventions. --> + <!-- See http://checkstyle.sf.net/config_naming.html --> + <module name="AbstractClassName"> + <property name="format" + value="^Abstract.*$|^.*Factory$|^.*Bus$|^.*ConfigurationRepository$|^.*Base$|^Exception$|^.*Builder$"/> + </module> + <module name="ConstantName"/> + <module name="LocalFinalVariableName"/> + <module name="LocalVariableName"/> + <module name="MemberName"/> + <module name="MethodName"/> + <module name="PackageName"/> + <module name="ParameterName"/> + <module name="StaticVariableName"/> + <module name="TypeName"/> + + <!-- Header checks --> + <!-- <module name="Header"/> --> + <!-- <module name="RegexpHeader"/> --> + + + <!-- Checks for imports --> + <!-- See http://checkstyle.sf.net/config_import.html --> + <module name="AvoidStarImport"> + <property name="excludes" + value="java.io,java.util,java.net,java.nio,java.nio.channels,java.lang.reflect,org.w3c.dom,org.xml.sax,java.awt,javax.swing,junit.framework"/> + </module> + <module name="IllegalImport"/> + <!-- defaults to sun.* packages --> + <module name="RedundantImport"/> + <module name="UnusedImports"/> + <module name="ImportOrder"> + <property name="groups" value="java,javax,org.w3c,org.xml,w3c"/> + <property name="ordered" value="true"/> + </module> + <!-- + <module name="ImportControl"> + <property name="file" value="etc/import-control.xml"/> + </module> + --> + + + <!-- Checks for Size Violations. --> + <!-- See http://checkstyle.sf.net/config_sizes.html --> + <module name="AnonInnerLength"> + <property name="max" value="40"/> + </module> + <module name="ExecutableStatementCount"> + <property name="max" value="50"/> + </module> + <module name="FileLength"/> + <module name="LineLength"> + <property name="max" value="115"/> + </module> + <module name="MethodLength"> + <property name="max" value="150"/> + <property name="countEmpty" value="false"/> + </module> + <module name="ParameterNumber"> + <property name="max" value="7"/> + </module> + + <!-- Checks for whitespace --> + <!-- See http://checkstyle.sf.net/config_whitespace.html --> + <module name="EmptyForIteratorPad"/> + <module name="EmptyForInitializerPad"/> + <module name="MethodParamPad"/> + <module name="NoWhitespaceAfter"/> + <module name="NoWhitespaceBefore"/> + <module name="OperatorWrap"/> + <module name="ParenPad"/> + <module name="TypecastParenPad"/> + <module name="TabCharacter"/> + <module name="WhitespaceAfter"> + <property name="tokens" value="COMMA, SEMI"/> + </module> + <module name="WhitespaceAround"> + <property name="tokens" + value="ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN, BXOR, BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, EQUAL, GE, GT, LAND, LCURLY, LE, LITERAL_ASSERT, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_RETURN, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, LOR, LT, MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN, NOT_EQUAL, PLUS, PLUS_ASSIGN, QUESTION, RCURLY, SL, SLIST, SL_ASSIGN, SR, SR_ASSIGN, STAR, STAR_ASSIGN,TYPE_EXTENSION_AND"/> + </module> + + + <!-- Modifier Checks --> + <!-- See http://checkstyle.sf.net/config_modifiers.html --> + <module name="ModifierOrder"/> + <module name="RedundantModifier"/> + + + <!-- Checks for blocks. You know, those {}'s --> + <!-- See http://checkstyle.sf.net/config_blocks.html --> + <module name="AvoidNestedBlocks"> + <property name="allowInSwitchCase" value="true"/> + </module> + <module name="EmptyBlock"> + <property name="option" value="text"/> + </module> + <module name="LeftCurly"/> + <module name="NeedBraces"/> + <module name="RightCurly"/> + + + <!-- Checks for common coding problems --> + <!-- See http://checkstyle.sf.net/config_coding.html --> + <!--<module name="ArrayTrailingComma"/>--> + <!--<module name="AvoidInlineConditionals"/>--> + <module name="CovariantEquals"/> + <module name="DoubleCheckedLocking"/> + <module name="EmptyStatement"/> + <module name="EqualsHashCode"/> + <!--<module name="FinalLocalVariable"/>--> + <module name="HiddenField"> + <property name="ignoreConstructorParameter" value="true"/> + <property name="ignoreSetter" value="true"/> + <property name="ignoreAbstractMethods" value="true"/> + </module> + <module name="IllegalInstantiation"/> + <!--<module name="IllegalToken"/>--> + <!--<module name="IllegalTokenText"/>--> + <!--<module name="InnerAssignment"/>--> + <!--<module name="MagicNumber"/>--> + <module name="MissingSwitchDefault"/> + <module name="ModifiedControlVariable"/> + <module name="SimplifyBooleanExpression"/> + <module name="SimplifyBooleanReturn"/> + <module name="StringLiteralEquality"/> + <module name="NestedIfDepth"> + <property name="max" value="3"/> + </module> + <module name="NestedTryDepth"> + <property name="max" value="3"/> + </module> + <module name="SuperClone"/> + <module name="SuperFinalize"/> + <!--<module name="IllegalCatch"/>--> + <module name="IllegalThrows"> + <property name="illegalClassNames" value="java.lang.Error,java.lang.RuntimeException"/> + </module> + <!--<module name="RedundantThrows"/>--> + <module name="PackageDeclaration"/> + <module name="JUnitTestCase"/> + <module name="ReturnCount"> + <property name="max" value="6"/> + </module> + + <module name="IllegalType"> + <property name="format" value="^xxx$"/> + </module> + <module name="DeclarationOrder"/> + <!--<module name="ParameterAssignment"/>--> + <module name="ExplicitInitialization"/> + <module name="DefaultComesLast"/> + <!--<module name="MissingCtor"/>--> + <module name="FallThrough"/> + <!--<module name="MultipleStringLiterals"/>--> + <module name="MultipleVariableDeclarations"/> + <!--<module name="RequireThis"/>--> + <module name="UnnecessaryParentheses"/> + + + <!-- Checks for class design --> + <!-- See http://checkstyle.sf.net/config_design.html --> + <!--<module name="DesignForExtension"/>--> + <module name="FinalClass"/> + <module name="HideUtilityClassConstructor"/> + <module name="InterfaceIsType"/> + <module name="MutableException"/> + <module name="ThrowsCount"> + <property name="max" value="5"/> + </module> + <module name="VisibilityModifier"> + <property name="protectedAllowed" value="true"/> + <property name="packageAllowed" value="true"/> + </module> + + + <!-- Metrics checks. --> + <!-- See http://checkstyle.sf.net/config_metrics.html --> + <module name="BooleanExpressionComplexity"> + <property name="max" value="6"/> + </module> + <!--<module name="ClassDataAbstractionCoupling"/>--> + <!--<module name="ClassFanOutComplexity"/>--> + <!--<module name="CyclomaticComplexity"/>--> + <!--<module name="NPathComplexity"/>--> + <module name="JavaNCSS"> + <property name="methodMaximum" value="75"/> + </module> + + + <!-- Miscellaneous other checks. --> + <!-- See http://checkstyle.sf.net/config_misc.html --> + <!-- + <module name="ArrayTypeStyle"/> + <module name="FinalParameters"/> + --> + <!-- + <module name="GenericIllegalRegexp"> + <property name="format" value="\s+$"/> + <property name="message" value="Line has trailing spaces."/> + </module> + --> + <module name="TodoComment"> + <property name="format" value="WARNING"/> + </module> + + <module name="UpperEll"/> + + <!--Assert statement may have side effects:--> + <module name="DescendantToken"> + <property name="tokens" value="LITERAL_ASSERT"/> + <property name="limitedTokens" + value="ASSIGN,DEC,INC,POST_DEC,POST_INC,PLUS_ASSIGN,MINUS_ASSIGN,STAR_ASSIGN,DIV_ASSIGN,MOD_ASSIGN,BSR_ASSIGN,SR_ASSIGN,SL_ASSIGN,BAND_ASSIGN,BXOR_ASSIGN,BOR_ASSIGN"/> + <property name="maximumNumber" value="0"/> + </module> + + <!--<module name="UncommentedMain"/>--> + <module name="TrailingComment"/> + <module name="Indentation"> + <property name="caseIndent" value="0"/> + </module> + <!--<module name="RequiredRegexp">--> + </module> + +</module> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/pom.xml new file mode 100644 index 0000000000..a33141e5f2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/pom.xml @@ -0,0 +1,165 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + --> +<project> + + <parent> + <groupId>org.apache.tuscany.sca.bindings</groupId> + <artifactId>tuscany-sca-bindings</artifactId> + <version>incubating-M1</version> + </parent> + + <modelVersion>4.0.0</modelVersion> + <artifactId>tuscany-binding-celtix</artifactId> + <name>Tuscany Celtix Binding</name> + <description>Implementation of the SCA Web Services binding using Celtix.</description> + <version>incubating-M1</version> + + <properties> + <celtix.version>1.0</celtix.version> + <compiler.flags>-Xlint:unchecked,deprecation,fallthrough,finally</compiler.flags> + </properties> + <repositories> + <repository> + <id>objectweb</id> + <name>ObjectWeb repo</name> + <url>http://maven.objectweb.org/maven2</url> + <releases> + <enabled>true</enabled> + </releases> + <snapshots> + <enabled>false</enabled> + </snapshots> + </repository> + </repositories> + + <dependencies> + <dependency> + <groupId>org.apache.tuscany</groupId> + <artifactId>tuscany-core</artifactId> + <version>${pom.version}</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.apache.tuscany.databinding</groupId> + <artifactId>tuscany-databinding-sdo</artifactId> + <version>${pom.version}</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.apache.tuscany.sca.containers</groupId> + <artifactId>tuscany-container-java</artifactId> + <version>${pom.version}</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>3.8.1</version> + <scope>test</scope> + </dependency> + + + <dependency> + <groupId>org.easymock</groupId> + <artifactId>easymockclassextension</artifactId> + <version>2.2</version> + <scope>test</scope> + </dependency> + + <!-- Celtix --> + <dependency> + <groupId>org.objectweb.celtix</groupId> + <artifactId>celtix-rt</artifactId> + <version>${celtix.version}</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>1.5</source> + <target>1.5</target> + <showDeprecation>true</showDeprecation> + <compilerArgument>${compile.flags}</compilerArgument> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-checkstyle-plugin</artifactId> + <executions> + <execution> + <id>process-sources</id> + <phase>process-sources</phase> + <configuration> + <configLocation>${basedir}/checkstyle.xml</configLocation> + <consoleOutput>true</consoleOutput> + <failsOnError>true</failsOnError> + </configuration> + <goals> + <goal>checkstyle</goal> + </goals> + </execution> + </executions> + </plugin> + + <!-- This won't work until 2.0 of PMD plugin is released + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-pmd-plugin</artifactId> + <executions> + <execution> + <id>process-sources</id> + <phase>process-sources</phase> + <configuration> + <targetJdk>1.5</targetJdk> + <rulesets> + <ruleset>.ruleset</ruleset> + </rulesets> + <failOnViolation>true</failOnViolation> + </configuration> + <goals> + <goal>check</goal> + </goals> + </execution> + </executions> + </plugin> + --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-eclipse-plugin</artifactId> + <configuration> + <downloadSources>true</downloadSources> + <buildcommands> + <java.lang.String>org.eclipse.jdt.core.javabuilder</java.lang.String> + <java.lang.String>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</java.lang.String> + <java.lang.String>net.sourceforge.pmd.eclipse.pmdBuilder</java.lang.String> + </buildcommands> + <projectnatures> + <nature>org.eclipse.jdt.core.javanature</nature> + <nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature> + <nature>net.sourceforge.pmd.eclipse.pmdNature</nature> + </projectnatures> + </configuration> + </plugin> + </plugins> + </build> + +</project> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/assembly/WebServiceAssemblyFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/assembly/WebServiceAssemblyFactory.java new file mode 100644 index 0000000000..46d5cac4dd --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/assembly/WebServiceAssemblyFactory.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.assembly; + +import org.apache.tuscany.core.loader.WSDLDefinitionRegistry; +import org.apache.tuscany.model.assembly.AssemblyFactory; + +/** + * The <b>Factory</b> for the model. + */ +public interface WebServiceAssemblyFactory extends AssemblyFactory { + + /** + * Returns a new WebServiceBinding. + */ + WebServiceBinding createWebServiceBinding(WSDLDefinitionRegistry wsdlRegistry); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/assembly/WebServiceBinding.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/assembly/WebServiceBinding.java new file mode 100644 index 0000000000..82dd08ef0d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/assembly/WebServiceBinding.java @@ -0,0 +1,80 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.assembly; + +import javax.wsdl.Definition; +import javax.wsdl.Port; +import javax.wsdl.Service; + +import commonj.sdo.helper.TypeHelper; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.model.assembly.Binding; +import org.objectweb.celtix.Bus; + +/** + * Represents a Web service binding. + */ +public interface WebServiceBinding extends Binding { + + /** + * Set the URI of the WSDL port for this binding. + * + * @param portURI the URI of the WSDL port + */ + void setPortURI(String portURI); + + /** + * Returns the WSDL port defining this binding. + */ + Port getWSDLPort(); + + /** + * Returns the WSDL service defining this binding. + */ + Service getWSDLService(); + + /** + * Returns the WSDL definition containing the WSDL port. + * + * @return the WSDL definition containing the WSDL port + */ + Definition getWSDLDefinition(); + + /** + * Sets the WSDL port defining this binding. + */ + void setWSDLPort(Port value); + + /** + * Sets the WSDL definition containing the WSDL port. + * + * @param definition + */ + void setWSDLDefinition(Definition definition); + + TypeHelper getTypeHelper(); + + void setTypeHelper(TypeHelper typeHelper); + + ResourceLoader getResourceLoader(); + + void setResourceLoader(ResourceLoader resourceLoader); + + Bus getBus(); + void setBus(Bus b); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/assembly/impl/WebServiceAssemblyFactoryImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/assembly/impl/WebServiceAssemblyFactoryImpl.java new file mode 100644 index 0000000000..1288f67719 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/assembly/impl/WebServiceAssemblyFactoryImpl.java @@ -0,0 +1,43 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.assembly.impl; + +import org.apache.tuscany.binding.celtix.assembly.WebServiceAssemblyFactory; +import org.apache.tuscany.binding.celtix.assembly.WebServiceBinding; +import org.apache.tuscany.core.loader.WSDLDefinitionRegistry; +import org.apache.tuscany.model.assembly.impl.AssemblyFactoryImpl; + +/** + * An implementation of the model <b>Factory</b>. + */ +public class WebServiceAssemblyFactoryImpl extends AssemblyFactoryImpl implements WebServiceAssemblyFactory { + + /** + * Creates an instance of the factory. + */ + public WebServiceAssemblyFactoryImpl() { + super(); + } + + /** + * @see org.apache.tuscany.binding.celtix.assembly.WebServiceAssemblyFactory#createWebServiceBinding() + */ + public WebServiceBinding createWebServiceBinding(WSDLDefinitionRegistry wsdlRegistry) { + return new WebServiceBindingImpl(wsdlRegistry); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/assembly/impl/WebServiceBindingImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/assembly/impl/WebServiceBindingImpl.java new file mode 100644 index 0000000000..477d2b656a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/assembly/impl/WebServiceBindingImpl.java @@ -0,0 +1,184 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.assembly.impl; + +import java.util.Collection; +import java.util.List; +import javax.wsdl.Definition; +import javax.wsdl.Port; +import javax.wsdl.Service; +import javax.xml.namespace.QName; + +import commonj.sdo.helper.TypeHelper; +import org.apache.tuscany.binding.celtix.assembly.WebServiceBinding; +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.core.loader.WSDLDefinitionRegistry; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.impl.BindingImpl; +import org.objectweb.celtix.Bus; + +/** + * An implementation of WebServiceBinding. + */ +public class WebServiceBindingImpl extends BindingImpl implements WebServiceBinding { + + private WSDLDefinitionRegistry wsdlRegistry; + + private Definition definition; + private Port port; + private Service service; + private String portURI; + private TypeHelper typeHelper; + private ResourceLoader resourceLoader; + private Bus bus; + + /** + * Constructor + */ + protected WebServiceBindingImpl(WSDLDefinitionRegistry reg) { + wsdlRegistry = reg; + } + + /** + * @see org.apache.tuscany.binding.celtix.assembly.WebServiceBinding#getWSDLPort() + */ + public Port getWSDLPort() { + return port; + } + + public Service getWSDLService() { + return service; + } + + + + /** + * @see org.apache.tuscany.binding.celtix.assembly.WebServiceBinding#setWSDLPort(javax.wsdl.Port) + */ + public void setWSDLPort(Port value) { + checkNotFrozen(); + port = value; + } + + /** + * @see org.apache.tuscany.binding.celtix.assembly.WebServiceBinding#getWSDLDefinition() + */ + public Definition getWSDLDefinition() { + return definition; + } + + /** + * @see WebServiceBinding#setWSDLDefinition(javax.wsdl.Definition) + */ + public void setWSDLDefinition(Definition def) { + checkNotFrozen(); + definition = def; + } + + /** + * @param uri The portURI to set. + */ + public void setPortURI(String uri) { + portURI = uri; + } + + public TypeHelper getTypeHelper() { + return typeHelper; + } + + public void setTypeHelper(TypeHelper pTypeHelper) { + this.typeHelper = pTypeHelper; + } + + public ResourceLoader getResourceLoader() { + return resourceLoader; + } + + public void setResourceLoader(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } + + /** + * @see BindingImpl#initialize(org.apache.tuscany.model.assembly.AssemblyContext) + */ + @SuppressWarnings("unchecked") + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) { + return; + } + super.initialize(modelContext); + + // Get the WSDL port namespace and name + if (port == null && portURI != null) { + int h = portURI.indexOf('#'); + String portNamespace = portURI.substring(0, h); + String serviceName; + String portName; + + String fragment = portURI.substring(h + 1); + if (fragment.startsWith("wsdl.endpoint(") && fragment.endsWith(")")) { + fragment = fragment.substring(14, fragment.length() - 1); + int slash = fragment.indexOf('/'); + if (slash != -1) { + serviceName = fragment.substring(0, slash); + portName = fragment.substring(slash + 1); + } else { + serviceName = null; + portName = fragment; + } + } else { + serviceName = null; + portName = fragment; + } + + // Load the WSDL definitions for the given namespace + List<Definition> definitions = wsdlRegistry.getDefinitionsForNamespace(portNamespace, resourceLoader); + if (definitions == null) { + throw new IllegalArgumentException("Cannot find WSDL definition for " + portNamespace); + } + for (Definition def : definitions) { + + // Find the port with the given name + for (Service serv : (Collection<Service>)def.getServices().values()) { + QName sqn = serv.getQName(); + if (serviceName != null + && !serviceName.equals(sqn.getLocalPart())) { + continue; + } + + Port p = serv.getPort(portName); + if (p != null) { + service = serv; + definition = def; + port = p; + return; + } + } + } + throw new IllegalArgumentException("Cannot find WSDL port " + portURI); + } + } + + public Bus getBus() { + return bus; + } + + public void setBus(Bus b) { + bus = b; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/builder/ExternalWebServiceBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/builder/ExternalWebServiceBuilder.java new file mode 100644 index 0000000000..99ffaa5d8a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/builder/ExternalWebServiceBuilder.java @@ -0,0 +1,48 @@ +/* Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.builder; + +import org.apache.tuscany.binding.celtix.assembly.WebServiceBinding; +import org.apache.tuscany.binding.celtix.config.ExternalWebServiceContextFactory; +import org.apache.tuscany.binding.celtix.handler.ExternalWebServiceClient; +import org.apache.tuscany.core.extension.ExternalServiceBuilderSupport; +import org.apache.tuscany.core.extension.ExternalServiceContextFactory; +import org.apache.tuscany.core.injection.SingletonObjectFactory; +import org.apache.tuscany.model.assembly.ExternalService; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Scope; + + +/** + * Creates a <code>ContextFactoryBuilder</code> for an external service configured with the {@link + * WebServiceBinding} + * + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class ExternalWebServiceBuilder extends ExternalServiceBuilderSupport<WebServiceBinding> { + + @Init(eager = true) + public void init() throws Exception { + super.init(); + } + + protected ExternalServiceContextFactory createExternalServiceContextFactory( + ExternalService externalService) { + ExternalWebServiceClient externalWebServiceClient = new ExternalWebServiceClient(externalService); + return new ExternalWebServiceContextFactory(externalService.getName(), + new SingletonObjectFactory<ExternalWebServiceClient>(externalWebServiceClient)); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/builder/ExternalWebServiceWireBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/builder/ExternalWebServiceWireBuilder.java new file mode 100644 index 0000000000..e16456f80c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/builder/ExternalWebServiceWireBuilder.java @@ -0,0 +1,35 @@ +/* Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.builder; + +import java.lang.reflect.Method; + +import org.apache.tuscany.binding.celtix.config.ExternalWebServiceContextFactory; +import org.apache.tuscany.binding.celtix.handler.ExternalWebServiceTargetInvoker; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.extension.WireBuilderSupport; +import org.apache.tuscany.core.wire.TargetInvoker; +import org.osoa.sca.annotations.Scope; + + +@Scope("MODULE") +public class ExternalWebServiceWireBuilder extends WireBuilderSupport<ExternalWebServiceContextFactory> { + + protected TargetInvoker createInvoker(QualifiedName targetName, Method operation, + ScopeContext context, boolean downScope) { + return new ExternalWebServiceTargetInvoker(targetName, operation, context); + } +}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/builder/WebServiceEntryPointBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/builder/WebServiceEntryPointBuilder.java new file mode 100644 index 0000000000..705b8c9784 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/builder/WebServiceEntryPointBuilder.java @@ -0,0 +1,47 @@ +/* Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.builder; + +import org.apache.tuscany.binding.celtix.assembly.WebServiceBinding; +import org.apache.tuscany.binding.celtix.config.WebServiceEntryPointContextFactory; + +import org.apache.tuscany.core.extension.EntryPointBuilderSupport; +import org.apache.tuscany.core.extension.EntryPointContextFactory; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.webapp.ServletHost; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.osoa.sca.annotations.Scope; + +/** + * Creates a <code>ContextFactory</code> for an entry point configured with the {@link WebServiceBinding} + * + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class WebServiceEntryPointBuilder extends EntryPointBuilderSupport<WebServiceBinding> { + ServletHost tomcatHost; + + @Autowire + public void setTomcatHost(ServletHost tomcatHost) { + this.tomcatHost = tomcatHost; + } + + + protected EntryPointContextFactory createEntryPointContextFactory(EntryPoint entryPoint, + MessageFactory msgFactory) { + return new WebServiceEntryPointContextFactory(tomcatHost, entryPoint, msgFactory); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/config/ExternalWebServiceContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/config/ExternalWebServiceContextFactory.java new file mode 100644 index 0000000000..52fedd4b56 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/config/ExternalWebServiceContextFactory.java @@ -0,0 +1,35 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.config; + +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.extension.ExternalServiceContextFactory; + +/** + * Creates instances of {@link org.apache.tuscany.core.context.ExternalServiceContext} configured with the + * appropriate invocation chains and bindings. This implementation serves as a marker for {@link + * org.apache.tuscany.binding.celtix.builder.ExternalWebServiceWireBuilder} + * + * @version $Rev$ $Date$ + */ +public class ExternalWebServiceContextFactory extends ExternalServiceContextFactory { + + public ExternalWebServiceContextFactory(String name, ObjectFactory objectFactory) { + super(name, objectFactory); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/config/WebServiceEntryPointContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/config/WebServiceEntryPointContextFactory.java new file mode 100644 index 0000000000..39e0b10053 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/config/WebServiceEntryPointContextFactory.java @@ -0,0 +1,58 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.config; + +import org.apache.tuscany.binding.celtix.handler.CeltixEntryPointContextImpl; +import org.apache.tuscany.core.builder.ContextCreationException; +import org.apache.tuscany.core.context.EntryPointContext; +import org.apache.tuscany.core.extension.EntryPointContextFactory; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.webapp.ServletHost; +import org.apache.tuscany.model.assembly.EntryPoint; + +/** + * Creates instances of {@link org.apache.tuscany.core.context.EntryPointContext} configured with the + * appropriate invocation chains and bindings. This implementation serves as a marker for + * + * @version $Rev$ $Date$ + */ +public class WebServiceEntryPointContextFactory extends EntryPointContextFactory { + MessageFactory messageFactory; + EntryPoint entryPoint; + ServletHost servlet; + + public WebServiceEntryPointContextFactory(ServletHost tomcatHost, + EntryPoint entryPoint, + MessageFactory mf) { + super(entryPoint.getName(), mf); + messageFactory = mf; + this.entryPoint = entryPoint; + servlet = tomcatHost; + } + + public EntryPointContext createContext() throws ContextCreationException { + if (servlet == null) { + return new CeltixEntryPointContextImpl(entryPoint, + getSourceWireFactories().get(0), + messageFactory); + } else { + //REVISIT - running in tomcat + return null; + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/CeltixEntryPointContextImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/CeltixEntryPointContextImpl.java new file mode 100644 index 0000000000..5b2e0df3d6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/CeltixEntryPointContextImpl.java @@ -0,0 +1,263 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.handler; + +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executor; + +import javax.jws.soap.SOAPBinding.Style; +import javax.wsdl.Binding; +import javax.wsdl.BindingInput; +import javax.wsdl.BindingOperation; +import javax.wsdl.Definition; +import javax.wsdl.Port; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.soap.SOAPAddress; +import javax.wsdl.extensions.soap.SOAPBody; +import javax.xml.namespace.QName; +import javax.xml.ws.WebServiceProvider; + +import commonj.sdo.helper.TypeHelper; + +import org.apache.tuscany.binding.celtix.assembly.WebServiceBinding; +import org.apache.tuscany.binding.celtix.handler.io.SCAServerDataBindingCallback; +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.context.ContextInitException; +import org.apache.tuscany.core.context.CoreRuntimeException; +import org.apache.tuscany.core.context.impl.EntryPointContextImpl; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.objectweb.celtix.Bus; +import org.objectweb.celtix.bindings.DataBindingCallback; +import org.objectweb.celtix.bindings.ServerBinding; +import org.objectweb.celtix.bindings.ServerBindingEndpointCallback; +import org.objectweb.celtix.bindings.ServerDataBindingCallback; +import org.objectweb.celtix.bus.bindings.WSDLMetaDataCache; +import org.objectweb.celtix.bus.bindings.WSDLOperationInfo; +import org.objectweb.celtix.context.ObjectMessageContext; +import org.objectweb.celtix.ws.addressing.AttributedURIType; +import org.objectweb.celtix.ws.addressing.EndpointReferenceType; +import org.objectweb.celtix.wsdl.EndpointReferenceUtils; +import org.osoa.sca.annotations.Destroy; +import org.xmlsoap.schemas.wsdl.http.AddressType; + +public class CeltixEntryPointContextImpl extends EntryPointContextImpl + implements ServerBindingEndpointCallback { + + EntryPoint entry; + private Bus bus; + private Port port; + private TypeHelper typeHelper; + private WSDLMetaDataCache wsdlCache; + private ServerBinding serverBinding; + private Object entryPointProxy; + private WebServiceBinding wsBinding; + + private Map<QName, ServerDataBindingCallback> opMap = + new ConcurrentHashMap<QName, ServerDataBindingCallback>(); + + + public CeltixEntryPointContextImpl(EntryPoint entry, + SourceWireFactory sourceWireFactory, + MessageFactory messageFactory) + throws ContextInitException { + + super(entry.getName(), sourceWireFactory, messageFactory); + this.entry = entry; + } + + public void start() throws ContextInitException { + super.start(); + + entryPointProxy = getInstance(null); + wsBinding = (WebServiceBinding)entry.getBindings().get(0); + bus = wsBinding.getBus(); + typeHelper = wsBinding.getTypeHelper(); + Definition wsdlDef = wsBinding.getWSDLDefinition(); + port = wsBinding.getWSDLPort(); + wsdlCache = new WSDLMetaDataCache(wsdlDef, wsBinding.getWSDLPort()); + + initOperationMap(wsdlDef); + + String key = wsdlDef.getDocumentBaseURI(); + URL url; + try { + url = new URL(key); + } catch (MalformedURLException e) { + throw new ContextInitException(e); + } + + EndpointReferenceType reference = EndpointReferenceUtils.getEndpointReference(url, + wsBinding.getWSDLService().getQName(), + wsBinding.getWSDLPort().getName()); + + AttributedURIType address = new AttributedURIType(); + + String bindingId = null; + Binding binding = wsBinding.getWSDLPort().getBinding(); + if (null != binding) { + List list = binding.getExtensibilityElements(); + if (!list.isEmpty()) { + bindingId = ((ExtensibilityElement)list.get(0)).getElementType().getNamespaceURI(); + } + } + List<?> list = wsBinding.getWSDLPort().getExtensibilityElements(); + for (Object ep : list) { + ExtensibilityElement ext = (ExtensibilityElement)ep; + if (ext instanceof SOAPAddress) { + if (bindingId == null) { + bindingId = ((SOAPAddress)ext).getLocationURI(); + } + address.setValue(((SOAPAddress)ext).getLocationURI()); + } + if (ext instanceof AddressType) { + if (bindingId == null) { + bindingId = ((AddressType)ext).getLocation(); + } + address.setValue(((AddressType)ext).getLocation()); + } + } + if (reference.getAddress() == null) { + //REVIST - bug in Celtix that the HTTP transport won't find the address correctly + reference.setAddress(address); + } + + try { + serverBinding = bus.getBindingManager().getBindingFactory(bindingId).createServerBinding( + reference, this); + serverBinding.activate(); + } catch (Exception e) { + throw new ContextInitException(e); + } + } + + @Destroy + public void stop() throws CoreRuntimeException { + System.out.println("In stop"); + super.stop(); + } + + private void initOperationMap(Definition def) { + List ops = port.getBinding().getBindingOperations(); + Iterator opIt = ops.iterator(); + while (opIt.hasNext()) { + BindingOperation op = (BindingOperation)opIt.next(); + BindingInput bindingInput = op.getBindingInput(); + List elements = bindingInput.getExtensibilityElements(); + QName qn = new QName(def.getTargetNamespace(), op.getName()); + for (Iterator i = elements.iterator(); i.hasNext();) { + Object element = i.next(); + if (SOAPBody.class.isInstance(element)) { + SOAPBody body = (SOAPBody)element; + if (body.getNamespaceURI() != null) { + qn = new QName(body.getNamespaceURI(), op.getName()); + } + } + } + + ServerDataBindingCallback cb = getDataBindingCallback(qn, null, + DataBindingCallback.Mode.PARTS); + opMap.put(qn, cb); + if (!"".equals(cb.getRequestWrapperQName().getLocalPart())) { + opMap.put(cb.getRequestWrapperQName(), cb); + } + } + } + public ServerDataBindingCallback getDataBindingCallback(QName operationName, + ObjectMessageContext objContext, + DataBindingCallback.Mode mode) { + if (opMap.containsKey(operationName)) { + return opMap.get(operationName); + } + WSDLOperationInfo opInfo = wsdlCache.getOperationInfo(operationName.getLocalPart()); + if (opInfo == null) { + //REVISIT - really map the operation name to a WSDL operation + for (String opName : wsdlCache.getAllOperationInfo().keySet()) { + if (operationName.getLocalPart().equalsIgnoreCase(opName)) { + opInfo = wsdlCache.getOperationInfo(opName); + break; + } + } + } + boolean inout = false; + + + Class<?> serviceInterface = getServiceInterface(); + Method meth = getMethod(serviceInterface, operationName.getLocalPart()); + + return new SCAServerDataBindingCallback(opInfo, + typeHelper, + wsBinding.getResourceLoader(), + inout, + meth, + entryPointProxy); + } + protected Method getMethod(Class<?> serviceInterface, String operationName) { + // Note: this doesn't support overloaded operations + Method[] methods = serviceInterface.getMethods(); + for (Method m : methods) { + if (m.getName().equals(operationName)) { + return m; + } + // tolerate WSDL with capatalized operation name + StringBuilder sb = new StringBuilder(operationName); + sb.setCharAt(0, Character.toLowerCase(sb.charAt(0))); + if (m.getName().equals(sb.toString())) { + return m; + } + } + throw new BuilderConfigException("no operation named " + operationName + + " found on service interface: " + serviceInterface.getName()); + } + + + public DataBindingCallback getFaultDataBindingCallback(ObjectMessageContext objContext) { + // REVISIT - what to do about faults + return null; + } + + public Map<QName, ? extends DataBindingCallback> getOperations() { + return opMap; + } + + public Style getStyle() { + return wsdlCache.getStyle(); + } + public DataBindingCallback.Mode getServiceMode() { + return DataBindingCallback.Mode.PARTS; + } + + public WebServiceProvider getWebServiceProvider() { + //not needed I think + return null; + } + + public Executor getExecutor() { + //Let the transport handle it (or it goes to the Bus default wq + //if the transport cannot handle it + return null; + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/ExternalWebServiceClient.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/ExternalWebServiceClient.java new file mode 100644 index 0000000000..01c571a611 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/ExternalWebServiceClient.java @@ -0,0 +1,199 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.handler; + + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.List; +import javax.jws.WebParam.Mode; +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.soap.SOAPAddress; +import javax.xml.ws.Holder; +import javax.xml.ws.ProtocolException; + +import commonj.sdo.helper.TypeHelper; +import org.apache.tuscany.binding.celtix.assembly.WebServiceBinding; +import org.apache.tuscany.binding.celtix.handler.io.SCADataBindingCallback; +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.BuilderInitException; +import org.apache.tuscany.model.assembly.ExternalService; +import org.objectweb.celtix.Bus; +import org.objectweb.celtix.BusException; +import org.objectweb.celtix.bindings.ClientBinding; +import org.objectweb.celtix.bindings.DataBindingCallback; +import org.objectweb.celtix.bus.bindings.WSDLMetaDataCache; +import org.objectweb.celtix.bus.bindings.WSDLOperationInfo; +import org.objectweb.celtix.context.ObjectMessageContext; +import org.objectweb.celtix.ws.addressing.EndpointReferenceType; +import org.objectweb.celtix.wsdl.EndpointReferenceUtils; +import org.xmlsoap.schemas.wsdl.http.AddressType; + + +/** + * An ExternalWebServiceClient using Celtix + */ +public class ExternalWebServiceClient { + + private Bus bus; + private TypeHelper typeHelper; + private WSDLMetaDataCache wsdlCache; + private ClientBinding clientBinding; + private WebServiceBinding wsBinding; + + + + public ExternalWebServiceClient(ExternalService externalService) throws BuilderException { + wsBinding = (WebServiceBinding)externalService.getBindings().get(0); + bus = wsBinding.getBus(); + typeHelper = wsBinding.getTypeHelper(); + Definition wsdlDef = wsBinding.getWSDLDefinition(); + wsdlCache = new WSDLMetaDataCache(wsdlDef, wsBinding.getWSDLPort()); + + try { + String key = wsdlDef.getDocumentBaseURI(); + URL url = new URL(key); + + EndpointReferenceType reference = EndpointReferenceUtils.getEndpointReference(url, + wsBinding.getWSDLService().getQName(), + wsBinding.getWSDLPort().getName()); + + String bindingId = null; + Binding binding = wsBinding.getWSDLPort().getBinding(); + if (null != binding) { + List list = binding.getExtensibilityElements(); + if (!list.isEmpty()) { + bindingId = ((ExtensibilityElement)list.get(0)).getElementType().getNamespaceURI(); + } + } + if (bindingId == null) { + List<?> list = wsBinding.getWSDLPort().getExtensibilityElements(); + for (Object ep : list) { + ExtensibilityElement ext = (ExtensibilityElement)ep; + if (ext instanceof SOAPAddress) { + bindingId = ((SOAPAddress)ext).getLocationURI(); + } + if (ext instanceof AddressType) { + bindingId = ((AddressType)ext).getLocation(); + } + } + + } + clientBinding = bus.getBindingManager().getBindingFactory(bindingId).createClientBinding( + reference); + } catch (MalformedURLException e) { + throw new BuilderInitException(e); + } catch (BusException e) { + throw new BuilderInitException(e); + } catch (WSDLException e) { + throw new BuilderInitException(e); + } catch (IOException e) { + throw new BuilderInitException(e); + } + } + + /** + * Invoke an operation on the external Web service. + * + * @param operationName the name of the WS operation to invoke + * @param args the Java object arguments to the WS operation + * @return the response from the WS as a Java object + */ + public Object invoke(String operationName, Object[] args) { + WSDLOperationInfo opInfo = wsdlCache.getOperationInfo(operationName); + if (opInfo == null) { + //REVISIT - really map the operation name to a WSDL operation + for (String opName : wsdlCache.getAllOperationInfo().keySet()) { + if (operationName.equalsIgnoreCase(opName)) { + opInfo = wsdlCache.getOperationInfo(opName); + break; + } + } + } + ObjectMessageContext objMsgContext = clientBinding.createObjectContext(); + + boolean hasInOut = false; + int inOutCount = 0; + Object realArgs[] = new Object[args.length]; + if (opInfo.getParamsLength() == 0) { + //REVISIT - opInfo doesn't return the needed info for the wrapped doc/lit case. + //Bug in Celtix + realArgs = args; + } else { + for (int x = 0; x < args.length; x++) { + if (opInfo.getWebParam(x).mode() == Mode.IN) { + realArgs[x] = args[x]; + } else { + realArgs[x] = new Holder<Object>(args[x]); + inOutCount++; + hasInOut = true; + } + } + } + + objMsgContext.setMessageObjects(realArgs); + + boolean isOneway = opInfo.isOneWay(); + DataBindingCallback callback = new SCADataBindingCallback(opInfo, typeHelper, + wsBinding.getResourceLoader(), + hasInOut); + + try { + if (isOneway) { + clientBinding.invokeOneWay(objMsgContext, + callback); + } else { + objMsgContext = clientBinding.invoke(objMsgContext, + callback); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + if (objMsgContext.getException() != null) { + //REVISIT - Exceptions + /* + if (isValidException(objMsgContext)) { + throw (Exception)objMsgContext.getException(); + } else { + throw new ProtocolException(objMsgContext.getException()); + } + */ + throw new ProtocolException(objMsgContext.getException()); + } + + if (hasInOut) { + Object ret[] = new Object[inOutCount + 1]; + ret[0] = objMsgContext.getReturn(); + inOutCount = 1; + for (int x = 0; x < args.length; x++) { + if (opInfo.getWebParam(x).mode() != Mode.IN) { + Holder<?> holder = (Holder<?>)realArgs[x]; + ret[inOutCount] = holder.value; + inOutCount++; + } + } + return ret; + } + return objMsgContext.getReturn(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/ExternalWebServiceTargetInvoker.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/ExternalWebServiceTargetInvoker.java new file mode 100644 index 0000000000..06786ca76d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/ExternalWebServiceTargetInvoker.java @@ -0,0 +1,115 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.handler; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.ExternalServiceContext; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.message.Message; +import org.apache.tuscany.core.wire.Interceptor; +import org.apache.tuscany.core.wire.TargetInvoker; + + +/** + * Responsible for invoking an external web service + * + * @version $Rev$ $Date$ + */ +public class ExternalWebServiceTargetInvoker implements TargetInvoker { + + private QualifiedName serviceName; + private String esName; + private Method method; + private ScopeContext container; + + private ExternalServiceContext context; + + /** + * Constructs a new ExternalWebServiceTargetInvoker. + */ + public ExternalWebServiceTargetInvoker(QualifiedName servicename, + Method meth, + ScopeContext cont) { + assert servicename != null : "No service name specified"; + assert meth != null : "No method specified"; + assert cont != null : "No scope container specified"; + this.serviceName = servicename; + this.esName = serviceName.getPartName(); + this.method = meth; + this.container = cont; + } + + public Object invokeTarget(Object payload) throws InvocationTargetException { + if (context == null) { + Context iContext = container.getContext(esName); + if (!(iContext instanceof ExternalServiceContext)) { + TargetException te = new TargetException("Unexpected target context type"); + te.setIdentifier(iContext.getClass().getName()); + te.addContextName(iContext.getName()); + throw te; + } + context = (ExternalServiceContext)iContext; + } + ExternalWebServiceClient client = (ExternalWebServiceClient)context.getHandler(); + if (payload != null) { + return client.invoke(method.getName(), (Object[])payload); + } else { + return client.invoke(method.getName(), new Object[0]); + } + } + + public boolean isCacheable() { + return false; + } + + public Message invoke(Message msg) { + try { + Object resp = invokeTarget(msg.getBody()); + msg.setBody(resp); + } catch (InvocationTargetException e) { + msg.setBody(e.getCause()); + } catch (Throwable e) { + msg.setBody(e); + } + return msg; + } + + public void setNext(Interceptor next) { + throw new UnsupportedOperationException(); + } + + public Object clone() throws CloneNotSupportedException { + try { + ExternalWebServiceTargetInvoker invoker = (ExternalWebServiceTargetInvoker)super.clone(); + invoker.container = container; + invoker.context = this.context; + invoker.esName = this.esName; + invoker.method = this.method; + invoker.serviceName = this.serviceName; + return invoker; + } catch (CloneNotSupportedException e) { + // will not happen + return null; + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/io/NodeDataReader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/io/NodeDataReader.java new file mode 100644 index 0000000000..d1b13f6e17 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/io/NodeDataReader.java @@ -0,0 +1,170 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.handler.io; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import javax.xml.namespace.QName; +import javax.xml.ws.WebServiceException; + +import org.w3c.dom.Node; +import org.w3c.dom.bootstrap.DOMImplementationRegistry; +import org.w3c.dom.ls.DOMImplementationLS; +import org.w3c.dom.ls.LSOutput; +import org.w3c.dom.ls.LSSerializer; +import commonj.sdo.DataObject; +import commonj.sdo.Property; +import commonj.sdo.helper.XMLDocument; + +import org.apache.tuscany.databinding.sdo.SDOXMLHelper; +import org.apache.tuscany.sdo.helper.XMLHelperImpl; +import org.objectweb.celtix.bindings.DataReader; +import org.objectweb.celtix.context.ObjectMessageContext; + +public class NodeDataReader implements DataReader<Node> { + + SCADataBindingCallback callback; + + public NodeDataReader(SCADataBindingCallback cb) { + callback = cb; + } + + public Object read(int idx, Node input) { + return read(null, idx, input); + } + + public Object read(QName name, int idx, Node input) { + try { + byte bytes[] = getNodeBytes(input); + Object os[] = SDOXMLHelper.toObjects(callback.getResourceClassLoader(), + callback.getTypeHelper(), bytes, false); + return os[0]; + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new WebServiceException(e); + } + + } + + public void readWrapper(ObjectMessageContext objCtx, boolean isOutBound, Node input) { + try { + QName wrapperName; + if (isOutBound) { + wrapperName = callback.getOperationInfo().getResponseWrapperQName(); + } else { + wrapperName = callback.getOperationInfo().getRequestWrapperQName(); + } + + Node nd = input.getFirstChild(); + while (nd != null + && !wrapperName.getNamespaceURI().equals(nd.getNamespaceURI()) + && !wrapperName.getLocalPart().equals(nd.getLocalName())) { + nd = nd.getNextSibling(); + } + + //REVISIT - This is SUCH a HACK. This needs to be done with StAX or something + //a bit better than streaming and reparsing + InputStream in = getNodeStream(nd); + XMLDocument document = new XMLHelperImpl(callback.getTypeHelper()).load(in); + DataObject object = document.getRootObject(); + + List ips = object.getInstanceProperties(); + Object[] os = new Object[object.getInstanceProperties().size()]; + for (int i = 0; i < os.length; i++) { + os[i] = object.get((Property)ips.get(i)); + } + + if (callback.hasInOut()) { + //REVISIT - inOuts + } else { + if (isOutBound) { + objCtx.setReturn(os[0]); + } else { + objCtx.setMessageObjects(os); + } + } + } catch (IOException e) { + throw new WebServiceException(e); + } catch (ClassCastException e) { + throw new WebServiceException(e); + } catch (ClassNotFoundException e) { + throw new WebServiceException(e); + } catch (InstantiationException e) { + throw new WebServiceException(e); + } catch (IllegalAccessException e) { + throw new WebServiceException(e); + } + } + private byte[] getNodeBytes(Node node) + throws ClassCastException, ClassNotFoundException, + InstantiationException, IllegalAccessException { + + //This is also a hack, the JDK should already have this set, but it doesn't + DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance(); + if (registry == null) { + System.setProperty(DOMImplementationRegistry.PROPERTY, + "com.sun.org.apache.xerces.internal.dom.DOMImplementationSourceImpl"); + registry = DOMImplementationRegistry.newInstance(); + } + DOMImplementationLS impl = (DOMImplementationLS)registry.getDOMImplementation("LS"); + if (impl == null) { + System.setProperty(DOMImplementationRegistry.PROPERTY, + "com.sun.org.apache.xerces.internal.dom.DOMImplementationSourceImpl"); + registry = DOMImplementationRegistry.newInstance(); + impl = (DOMImplementationLS)registry.getDOMImplementation("LS"); + } + LSOutput output = impl.createLSOutput(); + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + output.setByteStream(bout); + LSSerializer writer = impl.createLSSerializer(); + writer.write(node, output); + + return bout.toByteArray(); + } + + private InputStream getNodeStream(Node node) + throws ClassCastException, ClassNotFoundException, + InstantiationException, IllegalAccessException { + + DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance(); + if (registry == null) { + //This is also a hack, the JDK should already have this set, but it doesn't + System.setProperty(DOMImplementationRegistry.PROPERTY, + "com.sun.org.apache.xerces.internal.dom.DOMImplementationSourceImpl"); + registry = DOMImplementationRegistry.newInstance(); + } + DOMImplementationLS impl = (DOMImplementationLS)registry.getDOMImplementation("LS"); + if (impl == null) { + System.setProperty(DOMImplementationRegistry.PROPERTY, + "com.sun.org.apache.xerces.internal.dom.DOMImplementationSourceImpl"); + registry = DOMImplementationRegistry.newInstance(); + impl = (DOMImplementationLS)registry.getDOMImplementation("LS"); + } + LSOutput output = impl.createLSOutput(); + RawByteArrayOutputStream bout = new RawByteArrayOutputStream(); + output.setByteStream(bout); + LSSerializer writer = impl.createLSSerializer(); + writer.write(node, output); + + return new ByteArrayInputStream(bout.getBytes(), 0, bout.size()); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/io/NodeDataWriter.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/io/NodeDataWriter.java new file mode 100644 index 0000000000..27c2276c2a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/io/NodeDataWriter.java @@ -0,0 +1,179 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.handler.io; + + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.List; +import javax.xml.namespace.QName; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import javax.xml.ws.Holder; +import javax.xml.ws.WebServiceException; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; +import commonj.sdo.DataObject; +import commonj.sdo.Property; +import commonj.sdo.helper.TypeHelper; +import commonj.sdo.helper.XSDHelper; + +import org.apache.tuscany.databinding.sdo.SDOXMLHelper; +import org.apache.tuscany.sdo.helper.DataFactoryImpl; +import org.apache.tuscany.sdo.helper.XMLHelperImpl; +import org.apache.tuscany.sdo.helper.XSDHelperImpl; +import org.objectweb.celtix.bindings.DataWriter; +import org.objectweb.celtix.context.ObjectMessageContext; + +public class NodeDataWriter implements DataWriter<Node> { + SCADataBindingCallback callback; + + public NodeDataWriter(SCADataBindingCallback cb) { + callback = cb; + } + + public void write(Object obj, Node output) { + write(obj, null, output); + } + + public void write(Object obj, QName elName, Node output) { + byte bytes[] = SDOXMLHelper.toXMLBytes( + callback.getResourceClassLoader(), + callback.getTypeHelper(), + new Object[] {obj}, + elName, + false); + ByteArrayInputStream bin = new ByteArrayInputStream(bytes); + SAXParserFactory factory = SAXParserFactory.newInstance(); + factory.setNamespaceAware(true); + try { + SAXParser parser = factory.newSAXParser(); + parser.parse(bin, new NodeContentHandler(output)); + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new WebServiceException(e); + } + + } + + public void writeWrapper(ObjectMessageContext objCtx, boolean isOutbound, Node nd) { + QName wrapperName; + if (isOutbound) { + wrapperName = callback.getOperationInfo().getResponseWrapperQName(); + } else { + wrapperName = callback.getOperationInfo().getRequestWrapperQName(); + } + + DataObject obj = toWrappedDataObject(callback.getTypeHelper(), + isOutbound ? objCtx.getReturn() : null, + objCtx.getMessageObjects(), + wrapperName); + + try { + //REVISIT - this is SUCH a hack. SDO needs to be able to + //go directly to some formats other than streams. They are working + //on stax, but not there yet. + RawByteArrayOutputStream bout = new RawByteArrayOutputStream(); + new XMLHelperImpl(callback.getTypeHelper()).save(obj, + wrapperName.getNamespaceURI(), + wrapperName.getLocalPart(), + bout); + + ByteArrayInputStream bin = new ByteArrayInputStream(bout.getBytes(), + 0, + bout.size()); + SAXParserFactory factory = SAXParserFactory.newInstance(); + factory.setNamespaceAware(true); + SAXParser parser = factory.newSAXParser(); + parser.parse(bin, new NodeContentHandler(nd)); + } catch (IOException e) { + throw new WebServiceException(e); + } catch (ParserConfigurationException e) { + throw new WebServiceException(e); + } catch (SAXException e) { + throw new WebServiceException(e); + } + } + + + public static DataObject toWrappedDataObject(TypeHelper typeHelper, + Object ret, + Object[] os, + QName typeQN) { + XSDHelper xsdHelper = new XSDHelperImpl(typeHelper); + Property property = xsdHelper.getGlobalProperty(typeQN.getNamespaceURI(), + typeQN.getLocalPart(), true); + DataObject dataObject = new DataFactoryImpl(typeHelper).create(property.getType()); + List ips = dataObject.getInstanceProperties(); + int offset = 0; + if (ret != null) { + dataObject.set(0, ret); + offset = 1; + } + for (int i = offset; i < ips.size(); i++) { + if (os[i - offset] instanceof Holder) { + Holder<?> holder = (Holder<?>)os[i - offset]; + dataObject.set(i, holder.value); + } else { + dataObject.set(i, os[i - offset]); + } + } + return dataObject; + } + + private class NodeContentHandler extends DefaultHandler { + Node current; + Document doc; + + public NodeContentHandler(Node nd) { + doc = nd.getOwnerDocument(); + if (doc == null && nd instanceof Document) { + doc = (Document)nd; + } + current = nd; + } + + public void characters(char[] ch, int start, int length) { + current.appendChild(doc.createTextNode(new String(ch, start, length))); + } + + public void startElement(String uri, String localName, + String qName, Attributes attributes) { + Element newEl = doc.createElementNS(uri, qName); + current.appendChild(newEl); + current = newEl; + for (int x = 0; x < attributes.getLength(); x++) { + newEl.setAttributeNS(attributes.getURI(x), + attributes.getQName(x), + attributes.getValue(x)); + } + } + + public void endElement(String uri, String localName, String qName) { + current = current.getParentNode(); + } + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/io/RawByteArrayOutputStream.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/io/RawByteArrayOutputStream.java new file mode 100644 index 0000000000..902a3e618c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/io/RawByteArrayOutputStream.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.handler.io; + +import java.io.ByteArrayOutputStream; + +/** + * Just to allow raw access to the byte[] to avoid a copy + */ +class RawByteArrayOutputStream extends ByteArrayOutputStream { + public byte[] getBytes() { + return buf; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/io/SCADataBindingCallback.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/io/SCADataBindingCallback.java new file mode 100644 index 0000000000..00dc403f2c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/io/SCADataBindingCallback.java @@ -0,0 +1,91 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.handler.io; + + +import org.w3c.dom.Node; +import commonj.sdo.helper.TypeHelper; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.objectweb.celtix.bindings.DataReader; +import org.objectweb.celtix.bindings.DataWriter; +import org.objectweb.celtix.bus.bindings.AbstractWSDLOperationDataBindingCallback; +import org.objectweb.celtix.bus.bindings.WSDLOperationInfo; +import org.objectweb.celtix.context.ObjectMessageContext; + +public class SCADataBindingCallback extends AbstractWSDLOperationDataBindingCallback { + + protected TypeHelper typeHelper; + protected boolean hasInOut; + protected ResourceLoader loader; + + public SCADataBindingCallback(WSDLOperationInfo op, + TypeHelper helper, + ResourceLoader l, + boolean inout) { + super(op); + typeHelper = helper; + hasInOut = inout; + loader = l; + } + + public ResourceLoader getResourceLoader() { + return loader; + } + public ClassLoader getResourceClassLoader() { + return loader.getClassLoader(); + } + + public TypeHelper getTypeHelper() { + return typeHelper; + } + + public boolean hasInOut() { + return hasInOut; + } + + public Mode getMode() { + return Mode.PARTS; + } + + public Class<?>[] getSupportedFormats() { + return new Class<?>[]{Node.class}; + } + + @SuppressWarnings("unchecked") + public <T> DataWriter<T> createWriter(Class<T> cls) { + if (cls == Node.class) { + return (DataWriter<T>)new NodeDataWriter(this); + } + return null; + } + + @SuppressWarnings("unchecked") + public <T> DataReader<T> createReader(Class<T> cls) { + if (cls == Node.class) { + return (DataReader<T>)new NodeDataReader(this); + } + //REVISIT - need to figure out what to do with Faults + return null; + } + + public void initObjectContext(ObjectMessageContext octx) { + //REVISIT - is this even used? + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/io/SCAServerDataBindingCallback.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/io/SCAServerDataBindingCallback.java new file mode 100644 index 0000000000..5926e066c2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/handler/io/SCAServerDataBindingCallback.java @@ -0,0 +1,61 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.handler.io; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import commonj.sdo.helper.TypeHelper; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.objectweb.celtix.bindings.ServerDataBindingCallback; +import org.objectweb.celtix.bus.bindings.WSDLOperationInfo; +import org.objectweb.celtix.context.ObjectMessageContext; + +public class SCAServerDataBindingCallback extends SCADataBindingCallback + implements ServerDataBindingCallback { + Method method; + Object targetObject; + + public SCAServerDataBindingCallback(WSDLOperationInfo op, TypeHelper helper, + ResourceLoader l, + boolean inout, Method meth, Object target) { + super(op, helper, l, inout); + method = meth; + targetObject = target; + } + + + public void invoke(ObjectMessageContext octx) throws InvocationTargetException { + Object ret; + try { + ret = method.invoke(targetObject, octx.getMessageObjects()); + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new InvocationTargetException(e); + } + octx.setReturn(ret); + } + + public void initObjectContext(ObjectMessageContext octx) { + Object o[] = new Object[method.getParameterTypes().length]; + //REVIST - holders? + octx.setMessageObjects(o); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/loader/TuscanyWSDLManager.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/loader/TuscanyWSDLManager.java new file mode 100644 index 0000000000..913b43cfeb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/loader/TuscanyWSDLManager.java @@ -0,0 +1,88 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.loader; + +import java.io.IOException; +import java.net.URL; + +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.wsdl.extensions.ExtensionRegistry; +import javax.wsdl.factory.WSDLFactory; + +import org.w3c.dom.Element; + +import org.apache.tuscany.core.loader.WSDLDefinitionRegistry; + +import org.objectweb.celtix.BusException; +import org.objectweb.celtix.wsdl.WSDLManager; + +public class TuscanyWSDLManager implements WSDLManager { + WSDLDefinitionRegistry wsdlDefinitionRegistry; + + public TuscanyWSDLManager(WSDLDefinitionRegistry w) throws BusException { + wsdlDefinitionRegistry = w; + } + + public WSDLFactory getWSDLFactory() { + //Not supported + return null; + } + + public ExtensionRegistry getExtenstionRegistry() { + return wsdlDefinitionRegistry.getExtensionRegistry(); + } + + public Definition getDefinition(URL url) throws WSDLException { + try { + //FIXME pass the current ResourceLoader + return wsdlDefinitionRegistry.loadDefinition(null, url, null); + } catch (IOException e) { + throw new WSDLException(WSDLException.CONFIGURATION_ERROR, e.getMessage()); + } + } + + public Definition getDefinition(String url) throws WSDLException { + try { + //The namespace is the wsdl targetNamesapce, it is only used + //when the wsdl is created into cache. we are ok here to set it to null. + //FIXME pass the current ResourceLoader + return wsdlDefinitionRegistry.loadDefinition(null, new URL(url), null); + } catch (IOException e) { + throw new WSDLException(WSDLException.CONFIGURATION_ERROR, e.getMessage()); + } + } + + public Definition getDefinition(Element el) throws WSDLException { + //Not supported + return null; + } + + public Definition getDefinition(Class<?> sei) throws WSDLException { + //Not supported + return null; + } + + public void addDefinition(Object key, Definition wsdl) { + //Not supported + } + + public void shutdown() { + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/loader/WebServiceBindingLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/loader/WebServiceBindingLoader.java new file mode 100644 index 0000000000..3520203523 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/java/org/apache/tuscany/binding/celtix/loader/WebServiceBindingLoader.java @@ -0,0 +1,99 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.binding.celtix.loader; + +import java.util.Map; +import java.util.WeakHashMap; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.binding.celtix.assembly.WebServiceAssemblyFactory; +import org.apache.tuscany.binding.celtix.assembly.WebServiceBinding; +import org.apache.tuscany.binding.celtix.assembly.impl.WebServiceAssemblyFactoryImpl; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.core.loader.StAXElementLoader; +import org.apache.tuscany.core.loader.StAXLoaderRegistry; +import org.apache.tuscany.core.loader.WSDLDefinitionRegistry; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.objectweb.celtix.Bus; +import org.osoa.sca.annotations.Destroy; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Scope; + + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class WebServiceBindingLoader implements StAXElementLoader<WebServiceBinding> { + public static final QName BINDING_WS = new QName("http://www.osoa.org/xmlns/sca/0.9", "binding.ws"); + + private static final WebServiceAssemblyFactory WS_FACTORY = new WebServiceAssemblyFactoryImpl(); + + protected StAXLoaderRegistry registry; + protected WSDLDefinitionRegistry wsdlRegistry; + + private Bus bus; + + @Autowire + public void setRegistry(StAXLoaderRegistry reg) { + this.registry = reg; + } + + @Autowire + public void setWsdlRegistry(WSDLDefinitionRegistry wsdlReg) { + try { + Map<String, Object> properties = new WeakHashMap<String, Object>(); + properties.put("celtix.WSDLManager", new TuscanyWSDLManager(wsdlReg)); + bus = Bus.init(new String[0], properties); + wsdlRegistry = wsdlReg; + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Init(eager = true) + public void start() { + registry.registerLoader(BINDING_WS, this); + } + + @Destroy + public void stop() { + try { + registry.unregisterLoader(BINDING_WS, this); + bus.shutdown(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @SuppressWarnings("deprecation") + public WebServiceBinding load(XMLStreamReader reader, LoaderContext loaderContext) + throws XMLStreamException, ConfigurationLoadException { + + WebServiceBinding binding = WS_FACTORY.createWebServiceBinding(wsdlRegistry); + binding.setURI(reader.getAttributeValue(null, "uri")); + binding.setPortURI(reader.getAttributeValue(null, "port")); + binding.setTypeHelper(registry.getContext().getTypeHelper()); + binding.setResourceLoader(loaderContext.getResourceLoader()); + binding.setBus(bus); + return binding; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/resources/system.fragment b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/resources/system.fragment new file mode 100644 index 0000000000..2c89c47dd0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/main/resources/system.fragment @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="ASCII"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<moduleFragment xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9" + xmlns:tuscany="http://org.apache.tuscany/xmlns/system/0.9" + name="org.apache.tuscany.binding.axis"> + + <component name="org.apache.tuscany.binding.celtix.builder.ExternalWebServiceBuilder"> + <tuscany:implementation.system + class="org.apache.tuscany.binding.celtix.builder.ExternalWebServiceBuilder"/> + </component> + + <component name="org.apache.tuscany.binding.celtix.builder.ExternalWebServiceWireBuilder"> + <tuscany:implementation.system + class="org.apache.tuscany.binding.celtix.builder.ExternalWebServiceWireBuilder"/> + </component> + + <component name="org.apache.tuscany.binding.celtix.builder.WebServiceEntryPointBuilder"> + <tuscany:implementation.system + class="org.apache.tuscany.binding.celtix.builder.WebServiceEntryPointBuilder"/> + </component> + + <component name="org.apache.tuscany.binding.celtix.loader.WebServiceBindingLoaderr"> + <tuscany:implementation.system + class="org.apache.tuscany.binding.celtix.loader.WebServiceBindingLoader"/> + </component> + +</moduleFragment> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/test/java/org/apache/tuscany/binding/celtix/assembly/WebServiceAssemblyFactoryTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/test/java/org/apache/tuscany/binding/celtix/assembly/WebServiceAssemblyFactoryTestCase.java new file mode 100644 index 0000000000..dc6389ef93 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/test/java/org/apache/tuscany/binding/celtix/assembly/WebServiceAssemblyFactoryTestCase.java @@ -0,0 +1,110 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.assembly; + +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import javax.wsdl.Definition; +import javax.wsdl.factory.WSDLFactory; +import javax.wsdl.xml.WSDLReader; + +import junit.framework.TestCase; + +import org.apache.tuscany.binding.celtix.assembly.impl.WebServiceAssemblyFactoryImpl; +import org.apache.tuscany.binding.celtix.assembly.impl.WebServiceBindingImpl; +import org.apache.tuscany.core.loader.WSDLDefinitionRegistry; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.easymock.EasyMock; + +public class WebServiceAssemblyFactoryTestCase extends TestCase { + + + private void setupMocks(WSDLDefinitionRegistry reg, + List<Definition> wsdlList) { + EasyMock.reset(new Object[] {reg}); + + //FIXME pass the current ResourceLoader + reg.getDefinitionsForNamespace("http://objectweb.org/hello_world_soap_http", null); + EasyMock.expectLastCall().andReturn(wsdlList); + + EasyMock.replay(new Object[] {reg}); + } + + public void testCreate() throws Exception { + WSDLDefinitionRegistry reg = EasyMock.createNiceMock(WSDLDefinitionRegistry.class); + + WebServiceAssemblyFactoryImpl impl = new WebServiceAssemblyFactoryImpl(); + WebServiceBinding bind = impl.createWebServiceBinding(reg); + assertNotNull("Did not create the binding", bind); + assertTrue("bind object wrong class: " + bind.getClass(), + bind instanceof WebServiceBindingImpl); + + assertNull("Should be initialized with null WSDL", bind.getWSDLDefinition()); + assertNull("Should be initialized with null port", bind.getWSDLPort()); + assertNull("Should be initialized with null service", bind.getWSDLService()); + assertNull("Should be initialized with null URI", bind.getURI()); + assertNull("Should be initialized with null TypeHelper", + bind.getTypeHelper()); + assertNull("Should be initialized with null ResourceLoader", + bind.getResourceLoader()); + + bind.setURI("http://objectweb.org/hello_world_soap_http"); + bind.setPortURI("http://objectweb.org/hello_world_soap_http#SoapPort"); + + AssemblyContext modelContext = EasyMock.createNiceMock(AssemblyContext.class); + + WSDLReader reader = WSDLFactory.newInstance().newWSDLReader(); + reader.setFeature("javax.wsdl.verbose", false); + URL url = getClass().getResource("/wsdl/hello_world.wsdl"); + Definition definition = reader.readWSDL(url.toString()); + + List<Definition> wsdlList = new ArrayList<Definition>(); + + setupMocks(reg, wsdlList); + try { + bind.initialize(modelContext); + fail("Should have failed getting the wsdl"); + } catch (IllegalArgumentException ex) { + //expected + } + + setupMocks(reg, wsdlList); + + + wsdlList.add(definition); + bind = impl.createWebServiceBinding(reg); + bind.setURI("http://objectweb.org/hello_world_soap_http"); + bind.setPortURI("http://objectweb.org/hello_world_soap_http#SoapPort"); + bind.initialize(modelContext); + + setupMocks(reg, wsdlList); + + wsdlList.add(definition); + bind = impl.createWebServiceBinding(reg); + bind.setURI("http://objectweb.org/hello_world_soap_http"); + bind.setPortURI("http://objectweb.org/hello_world_soap_http#FooPort"); + + try { + bind.initialize(modelContext); + fail("Should have failed finding the port"); + } catch (IllegalArgumentException ex) { + //expected + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/test/java/org/apache/tuscany/binding/celtix/handler/io/NodeDataWriterTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/test/java/org/apache/tuscany/binding/celtix/handler/io/NodeDataWriterTestCase.java new file mode 100644 index 0000000000..be4d910069 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/test/java/org/apache/tuscany/binding/celtix/handler/io/NodeDataWriterTestCase.java @@ -0,0 +1,103 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.handler.io; + +import java.net.URL; + +import javax.wsdl.Definition; +import javax.wsdl.Port; +import javax.wsdl.factory.WSDLFactory; +import javax.wsdl.xml.WSDLReader; +import javax.xml.namespace.QName; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + + +import commonj.sdo.helper.TypeHelper; + +import junit.framework.TestCase; + +import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl; +import org.apache.tuscany.sdo.helper.XSDHelperImpl; +import org.apache.tuscany.sdo.util.DataObjectUtil; +import org.apache.tuscany.sdo.util.SDOUtil; +import org.objectweb.celtix.bindings.DataReader; +import org.objectweb.celtix.bindings.DataWriter; +import org.objectweb.celtix.bus.bindings.WSDLMetaDataCache; +import org.objectweb.celtix.context.ObjectMessageContext; +import org.objectweb.celtix.context.ObjectMessageContextImpl; + + + +public class NodeDataWriterTestCase extends TestCase { + + private TypeHelper typeHelper; + + protected void setUp() throws Exception { + super.setUp(); + DataObjectUtil.initRuntime(); + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); + typeHelper = SDOUtil.createTypeHelper(); + URL url = getClass().getResource("/wsdl/hello_world.wsdl"); + new XSDHelperImpl(typeHelper).define(url.openStream(), null); + } finally { + Thread.currentThread().setContextClassLoader(cl); + } + + + } + + public void testWriteWrapper() throws Exception { + WSDLReader wreader = WSDLFactory.newInstance().newWSDLReader(); + wreader.setFeature("javax.wsdl.verbose", false); + URL url = getClass().getResource("/wsdl/hello_world.wsdl"); + Definition definition = wreader.readWSDL(url.toString()); + Port port = definition.getService(new QName("http://objectweb.org/hello_world_soap_http", + "SOAPService")).getPort("SoapPort"); + + WSDLMetaDataCache wsdlCache = new WSDLMetaDataCache(definition, + port); + + + ResourceLoaderImpl loader = new ResourceLoaderImpl(getClass().getClassLoader()); + SCADataBindingCallback callback = new SCADataBindingCallback(wsdlCache.getOperationInfo("greetMe"), + typeHelper, + loader, + false); + + DataWriter<Node> writer = callback.createWriter(Node.class); + Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + Element element = doc.createElement("ROOT"); + + ObjectMessageContext objCtx = new ObjectMessageContextImpl(); + objCtx.setMessageObjects(new Object[] {"Hello"}); + writer.writeWrapper(objCtx , false, element); + + assertEquals("Value not written", "Hello", element.getFirstChild().getTextContent().trim()); + + DataReader<Node> reader = callback.createReader(Node.class); + reader.readWrapper(objCtx , true, element); + + assertEquals("Hello", objCtx.getReturn()); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/test/java/org/apache/tuscany/binding/celtix/loader/WebServiceBindingLoaderTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/test/java/org/apache/tuscany/binding/celtix/loader/WebServiceBindingLoaderTestCase.java new file mode 100644 index 0000000000..a27d866191 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/test/java/org/apache/tuscany/binding/celtix/loader/WebServiceBindingLoaderTestCase.java @@ -0,0 +1,54 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.celtix.loader; + +import javax.xml.stream.XMLStreamReader; + +import junit.framework.TestCase; + +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.core.loader.StAXLoaderRegistry; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.easymock.EasyMock; + +public class WebServiceBindingLoaderTestCase extends TestCase { + + @SuppressWarnings("deprecation") + public void testLoad() throws Exception { + + WebServiceBindingLoader loader = new WebServiceBindingLoader(); + StAXLoaderRegistry reg = EasyMock.createNiceMock(StAXLoaderRegistry.class); + reg.getContext(); + EasyMock.expectLastCall().andReturn(EasyMock.createNiceMock(AssemblyContext.class)); + EasyMock.replay(reg); + + loader.setRegistry(reg); + + XMLStreamReader reader = EasyMock.createNiceMock(XMLStreamReader.class); + reader.getAttributeValue(null, "uri"); + EasyMock.expectLastCall().andReturn("http://objectweb.org/hello_world_soap_http"); + reader.getAttributeValue(null, "port"); + EasyMock.expectLastCall().andReturn("SoapPort"); + EasyMock.replay(reader); + + LoaderContext loaderContext = new LoaderContext(null); + + assertNotNull("Did not load binding", loader.load(reader, loaderContext)); + + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/test/resources/wsdl/hello_world.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/test/resources/wsdl/hello_world.wsdl new file mode 100644 index 0000000000..a1d40daf26 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.celtix/src/test/resources/wsdl/hello_world.wsdl @@ -0,0 +1,178 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<wsdl:definitions name="HelloWorld" targetNamespace="http://objectweb.org/hello_world_soap_http" + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:tns="http://objectweb.org/hello_world_soap_http" + xmlns:x1="http://objectweb.org/hello_world_soap_http/types" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" + xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <wsdl:types> + <schema targetNamespace="http://objectweb.org/hello_world_soap_http/types" + xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:tns="http://objectweb.org/hello_world_soap_http/types" + elementFormDefault="qualified"> + <simpleType name="MyStringType"> + <restriction base="string"> + <maxLength value="30" /> + </restriction> + </simpleType> + + <element name="sayHi"> + <complexType/> + </element> + <element name="sayHiResponse"> + <complexType> + <sequence> + <element name="responseType" type="string"/> + </sequence> + </complexType> + </element> + <element name="greetMe"> + <complexType> + <sequence> + <element name="requestType" type="tns:MyStringType"/> + </sequence> + </complexType> + </element> + <element name="greetMeResponse"> + <complexType> + <sequence> + <element name="responseType" type="string"/> + </sequence> + </complexType> + </element> + <element name="greetMeOneWay"> + <complexType> + <sequence> + <element name="requestType" type="string"/> + </sequence> + </complexType> + </element> + <element name="pingMe"> + <complexType/> + </element> + <element name="pingMeResponse"> + <complexType/> + </element> + <element name="faultDetail"> + <complexType> + <sequence> + <element name="minor" type="short"/> + <element name="major" type="short"/> + </sequence> + </complexType> + </element> + </schema> + </wsdl:types> + <wsdl:message name="sayHiRequest"> + <wsdl:part element="x1:sayHi" name="in"/> + </wsdl:message> + <wsdl:message name="sayHiResponse"> + <wsdl:part element="x1:sayHiResponse" name="out"/> + </wsdl:message> + <wsdl:message name="greetMeRequest"> + <wsdl:part element="x1:greetMe" name="in"/> + </wsdl:message> + <wsdl:message name="greetMeResponse"> + <wsdl:part element="x1:greetMeResponse" name="out"/> + </wsdl:message> + <wsdl:message name="greetMeOneWayRequest"> + <wsdl:part element="x1:greetMeOneWay" name="in"/> + </wsdl:message> + <wsdl:message name="pingMeRequest"> + <wsdl:part name="in" element="x1:pingMe"/> + </wsdl:message> + <wsdl:message name="pingMeResponse"> + <wsdl:part name="out" element="x1:pingMeResponse"/> + </wsdl:message> + <wsdl:message name="pingMeFault"> + <wsdl:part name="faultDetail" element="x1:faultDetail"/> + </wsdl:message> + + <wsdl:portType name="Greeter"> + <wsdl:operation name="sayHi"> + <wsdl:input message="tns:sayHiRequest" name="sayHiRequest"/> + <wsdl:output message="tns:sayHiResponse" name="sayHiResponse"/> + </wsdl:operation> + + <wsdl:operation name="greetMe"> + <wsdl:input message="tns:greetMeRequest" name="greetMeRequest"/> + <wsdl:output message="tns:greetMeResponse" name="greetMeResponse"/> + </wsdl:operation> + + <wsdl:operation name="greetMeOneWay"> + <wsdl:input message="tns:greetMeOneWayRequest" name="greetMeOneWayRequest"/> + </wsdl:operation> + + <wsdl:operation name="pingMe"> + <wsdl:input name="pingMeRequest" message="tns:pingMeRequest"/> + <wsdl:output name="pingMeResponse" message="tns:pingMeResponse"/> + <wsdl:fault name="pingMeFault" message="tns:pingMeFault"/> + </wsdl:operation> + </wsdl:portType> + <wsdl:binding name="Greeter_SOAPBinding" type="tns:Greeter"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + + <wsdl:operation name="sayHi"> + <soap:operation soapAction="" style="document"/> + <wsdl:input name="sayHiRequest"> + <soap:body use="literal"/> + </wsdl:input> + <wsdl:output name="sayHiResponse"> + <soap:body use="literal"/> + </wsdl:output> + </wsdl:operation> + + <wsdl:operation name="greetMe"> + <soap:operation soapAction="" style="document"/> + <wsdl:input name="greetMeRequest"> + <soap:body use="literal"/> + </wsdl:input> + <wsdl:output name="greetMeResponse"> + <soap:body use="literal"/> + </wsdl:output> + </wsdl:operation> + + <wsdl:operation name="greetMeOneWay"> + <soap:operation soapAction="" style="document"/> + <wsdl:input name="greetMeOneWayRequest"> + <soap:body use="literal"/> + </wsdl:input> + </wsdl:operation> + + <wsdl:operation name="pingMe"> + <soap:operation style="document"/> + <wsdl:input> + <soap:body use="literal"/> + </wsdl:input> + <wsdl:output> + <soap:body use="literal"/> + </wsdl:output> + <wsdl:fault name="pingMeFault"> + <soap:fault name="pingMeFault" use="literal"/> + </wsdl:fault> + </wsdl:operation> + + </wsdl:binding> + <wsdl:service name="SOAPService"> + <wsdl:port binding="tns:Greeter_SOAPBinding" name="SoapPort"> + <soap:address location="http://localhost:9000/SoapContext/SoapPort"/> + </wsdl:port> + </wsdl:service> +</wsdl:definitions> + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/LICENSE.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/LICENSE.txt new file mode 100644 index 0000000000..75b52484ea --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/LICENSE.txt @@ -0,0 +1,202 @@ +
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed 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.
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/README.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/README.txt new file mode 100644 index 0000000000..9b26d1690a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/README.txt @@ -0,0 +1,35 @@ +Apache Tuscany M1 build (May, 2006) +=================================== + +http://incubator.apache.org/tuscany/ + +Tuscany is an effort undergoing incubation at the Apache Software Foundation +(ASF), sponsored by the Web Services PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness or +stability of the code, it does indicate that the project has yet to be fully +endorsed by the ASF. + + +Support +------- + +Any problem with this release can be reported to the Tuscany mailing list +or in the JIRA issue tracker. + +Mailing list subscription: + tuscany-dev-subscribe@ws.apache.org + +Jira: + http://issues.apache.org/jira/browse/Tuscany + + +Thank you for using Tuscany! + + +The Tuscany Team. + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/pom.xml new file mode 100644 index 0000000000..a97f09375a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/pom.xml @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.
+ -->
+<project>
+
+ <parent>
+ <groupId>org.apache.tuscany.sca.bindings</groupId>
+ <artifactId>tuscany-sca-bindings</artifactId>
+ <version>incubating-M1</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>tuscany-binding-jsonrpc</artifactId>
+ <name>Tuscany JSON-RPC Binding</name>
+ <description>Implementation of an SCA JSON-RPC binding</description>
+ <version>incubating-M1</version>
+
+ <repositories>
+ <repository>
+ <id>ant</id>
+ <url>http://people.apache.org/~antelder/maven2</url>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ </repository>
+ </repositories>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tuscany</groupId>
+ <artifactId>tuscany-core</artifactId>
+ <version>${pom.version}</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany</groupId>
+ <artifactId>tuscany-tomcat</artifactId>
+ <version>${pom.version}</version>
+ <scope>provided</scope> <!-- use provided so tuscany infrastructue is not inc. in the war-->
+ </dependency>
+
+ <dependency>
+ <groupId>metaparadigm</groupId>
+ <artifactId>jsonrpc</artifactId>
+ <version>1.0</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>tomcat</groupId>
+ <artifactId>servlet-api</artifactId>
+ <version>5.0.18</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+</project>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/assembly/JSONRPCBinding.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/assembly/JSONRPCBinding.java new file mode 100644 index 0000000000..3629bbe98c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/assembly/JSONRPCBinding.java @@ -0,0 +1,39 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.jsonrpc.assembly;
+
+import org.apache.tuscany.model.assembly.impl.BindingImpl;
+
+/**
+ * An Binding implementation for JSON-RPC.
+ */
+public class JSONRPCBinding extends BindingImpl {
+
+ private String webAppName;
+
+ public JSONRPCBinding() {
+ }
+
+ public void setWebAppName(String webAppName) {
+ this.webAppName = webAppName;
+ }
+
+ public String getWebAppName() {
+ return webAppName;
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/builder/JSONRPCEntryPointBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/builder/JSONRPCEntryPointBuilder.java new file mode 100644 index 0000000000..b0725c464b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/builder/JSONRPCEntryPointBuilder.java @@ -0,0 +1,41 @@ +/**
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.jsonrpc.builder;
+
+import org.apache.tuscany.binding.jsonrpc.assembly.JSONRPCBinding;
+import org.apache.tuscany.binding.jsonrpc.config.JSONEntryPointContextFactory;
+import org.apache.tuscany.core.extension.EntryPointBuilderSupport;
+import org.apache.tuscany.core.extension.EntryPointContextFactory;
+import org.apache.tuscany.core.message.MessageFactory;
+import org.apache.tuscany.core.system.annotation.Autowire;
+import org.apache.tuscany.core.webapp.ServletHost;
+import org.apache.tuscany.model.assembly.EntryPoint;
+import org.osoa.sca.annotations.Scope;
+
+@Scope("MODULE")
+public class JSONRPCEntryPointBuilder extends EntryPointBuilderSupport<JSONRPCBinding> {
+
+ private ServletHost tomcatHost;
+
+ @Autowire
+ public void setTomcatHost(ServletHost tomcatHost) {
+ this.tomcatHost = tomcatHost;
+ }
+
+ @Override
+ protected EntryPointContextFactory createEntryPointContextFactory(EntryPoint entryPoint, MessageFactory msgFactory) {
+ String webAppName = ((JSONRPCBinding) entryPoint.getBindings().get(0)).getWebAppName();
+ return new JSONEntryPointContextFactory(entryPoint.getName(), msgFactory, webAppName, tomcatHost);
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/config/JSONEntryPointContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/config/JSONEntryPointContextFactory.java new file mode 100644 index 0000000000..7c36f83e6b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/config/JSONEntryPointContextFactory.java @@ -0,0 +1,60 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.binding.jsonrpc.config; + +import org.apache.tuscany.binding.jsonrpc.handler.JSONRPCEntryPointServlet; +import org.apache.tuscany.binding.jsonrpc.handler.ScriptGetterServlet; +import org.apache.tuscany.core.builder.ContextCreationException; +import org.apache.tuscany.core.context.EntryPointContext; +import org.apache.tuscany.core.extension.EntryPointContextFactory; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.webapp.ServletHost; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class JSONEntryPointContextFactory extends EntryPointContextFactory { + + private ServletHost tomcatHost; + + private String webAppName; + + public JSONEntryPointContextFactory(String name, MessageFactory msgFactory, String webAppName, ServletHost tomcatHost) { + super(name, msgFactory); + this.webAppName = webAppName; + this.tomcatHost = tomcatHost; + } + + public EntryPointContext createContext() throws ContextCreationException { + EntryPointContext epc = super.createContext(); + JSONRPCEntryPointServlet jsonrpcServlet = getServlet(); + jsonrpcServlet.addEntryPoint(epc); + return epc; + } + + private JSONRPCEntryPointServlet getServlet() { + String jsonrpcServletMapping = webAppName + "/SCA/jsonrpc"; + JSONRPCEntryPointServlet servlet; + synchronized (tomcatHost) { + servlet = (JSONRPCEntryPointServlet) tomcatHost.getMapping(jsonrpcServletMapping); + if (servlet == null) { + servlet = new JSONRPCEntryPointServlet(); + tomcatHost.registerMapping(jsonrpcServletMapping, servlet); + tomcatHost.registerMapping(webAppName + "/SCA/scripts/*", new ScriptGetterServlet()); + } + } + return servlet; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/handler/JSONRPCEntryPointServlet.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/handler/JSONRPCEntryPointServlet.java new file mode 100644 index 0000000000..f59867b725 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/handler/JSONRPCEntryPointServlet.java @@ -0,0 +1,76 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.jsonrpc.handler;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.tuscany.core.context.EntryPointContext;
+
+import com.metaparadigm.jsonrpc.JSONRPCBridge;
+import com.metaparadigm.jsonrpc.JSONRPCServlet;
+
+/**
+ *
+ *
+ */
+public class JSONRPCEntryPointServlet extends JSONRPCServlet {
+ private static final long serialVersionUID = 1L;
+
+ private transient List<EntryPointContext> entryPoints;
+
+ public JSONRPCEntryPointServlet() {
+ entryPoints = new ArrayList<EntryPointContext>();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.metaparadigm.jsonrpc.JSONRPCServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ClassCastException {
+
+ /*
+ * Create a new bridge for every request to aviod all the problems with JSON-RPC-Java storing the bridge in the session
+ */
+ HttpSession session = request.getSession();
+ try {
+
+ JSONRPCBridge jsonrpcBridge = new JSONRPCBridge();
+ for (EntryPointContext epc : entryPoints) {
+ jsonrpcBridge.registerObject(epc.getName(), epc.getInstance(null));
+ }
+ session.setAttribute("JSONRPCBridge", jsonrpcBridge);
+
+ super.service(request, response);
+
+ } finally {
+ session.removeAttribute("JSONRPCBridge");
+ }
+ }
+
+ public void addEntryPoint(EntryPointContext epc) {
+ entryPoints.add(epc);
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/handler/ScriptGetterServlet.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/handler/ScriptGetterServlet.java new file mode 100644 index 0000000000..9177462de0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/handler/ScriptGetterServlet.java @@ -0,0 +1,51 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.jsonrpc.handler;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class ScriptGetterServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final String SCA_INIT_JS = "SCA = new JSONRpcClient(\"SCA/jsonrpc\");";
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
+ URL url = getClass().getResource("jsonrpc.js");
+ InputStream is = url.openStream();
+ writeToStream(response, is);
+
+ writeToStream(response, new ByteArrayInputStream(SCA_INIT_JS.getBytes()));
+ }
+
+ private void writeToStream(HttpServletResponse response, InputStream is) throws IOException {
+ ServletOutputStream os = response.getOutputStream();
+ int i;
+ while ((i = is.read()) != -1) {
+ os.write(i);
+ }
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/loader/JSONRPCBindingLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/loader/JSONRPCBindingLoader.java new file mode 100644 index 0000000000..64cefc9ea3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/java/org/apache/tuscany/binding/jsonrpc/loader/JSONRPCBindingLoader.java @@ -0,0 +1,65 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.binding.jsonrpc.loader; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.binding.jsonrpc.assembly.JSONRPCBinding; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.core.loader.StAXElementLoader; +import org.apache.tuscany.core.loader.StAXLoaderRegistry; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.osoa.sca.annotations.Destroy; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Scope; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class JSONRPCBindingLoader implements StAXElementLoader<JSONRPCBinding> { + + public static final QName BINDING_JSONRPC = new QName("http://org.apache.tuscany/xmlns/jsonrpc/0.9", "binding.jsonrpc"); + + protected StAXLoaderRegistry registry; + + @Autowire + public void setRegistry(StAXLoaderRegistry registry) { + this.registry = registry; + } + + @Init(eager = true) + public void start() { + registry.registerLoader(BINDING_JSONRPC, this); + } + + @Destroy + public void stop() { + registry.unregisterLoader(BINDING_JSONRPC, this); + } + + @SuppressWarnings("deprecation") + public JSONRPCBinding load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + JSONRPCBinding binding = new JSONRPCBinding(); + binding.setURI(reader.getAttributeValue(null, "uri")); + binding.setWebAppName(registry.getContext().getWebAppName()); + return binding; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/resources/org/apache/tuscany/binding/jsonrpc/handler/jsonrpc.js b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/resources/org/apache/tuscany/binding/jsonrpc/handler/jsonrpc.js new file mode 100644 index 0000000000..2b9efbb55c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/resources/org/apache/tuscany/binding/jsonrpc/handler/jsonrpc.js @@ -0,0 +1,484 @@ +/* + * JSON-RPC JavaScript client + * + * $Id: jsonrpc.js,v 1.36.2.3 2006/03/08 15:09:37 mclark Exp $ + * + * Copyright (c) 2003-2004 Jan-Klaas Kollhof + * Copyright (c) 2005 Michael Clark, Metaparadigm Pte Ltd + * + * This code is based on Jan-Klaas' JavaScript o lait library (jsolait). + * + * Licensed 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. + * + */ + + +/* escape a character */ + +escapeJSONChar = +function escapeJSONChar(c) +{ + if(c == "\"" || c == "\\") return "\\" + c; + else if (c == "\b") return "\\b"; + else if (c == "\f") return "\\f"; + else if (c == "\n") return "\\n"; + else if (c == "\r") return "\\r"; + else if (c == "\t") return "\\t"; + var hex = c.charCodeAt(0).toString(16); + if(hex.length == 1) return "\\u000" + hex; + else if(hex.length == 2) return "\\u00" + hex; + else if(hex.length == 3) return "\\u0" + hex; + else return "\\u" + hex; +}; + + +/* encode a string into JSON format */ + +escapeJSONString = +function escapeJSONString(s) +{ + /* The following should suffice but Safari's regex is b0rken + (doesn't support callback substitutions) + return "\"" + s.replace(/([^\u0020-\u007f]|[\\\"])/g, + escapeJSONChar) + "\""; + */ + + /* Rather inefficient way to do it */ + var parts = s.split(""); + for(var i=0; i < parts.length; i++) { + var c =parts[i]; + if(c == '"' || + c == '\\' || + c.charCodeAt(0) < 32 || + c.charCodeAt(0) >= 128) + parts[i] = escapeJSONChar(parts[i]); + } + return "\"" + parts.join("") + "\""; +}; + + +/* Marshall objects to JSON format */ + +toJSON = function toJSON(o) +{ + if(o == null) { + return "null"; + } else if(o.constructor == String) { + return escapeJSONString(o); + } else if(o.constructor == Number) { + return o.toString(); + } else if(o.constructor == Boolean) { + return o.toString(); + } else if(o.constructor == Date) { + return '{javaClass: "java.util.Date", time: ' + o.valueOf() +'}'; + } else if(o.constructor == Array) { + var v = []; + for(var i = 0; i < o.length; i++) v.push(toJSON(o[i])); + return "[" + v.join(", ") + "]"; + } else { + var v = []; + for(attr in o) { + if(o[attr] == null) v.push("\"" + attr + "\": null"); + else if(typeof o[attr] == "function"); /* skip */ + else v.push(escapeJSONString(attr) + ": " + toJSON(o[attr])); + } + return "{" + v.join(", ") + "}"; + } +}; + + +/* JSONRpcClient constructor */ + +JSONRpcClient = +function JSONRpcClient_ctor(serverURL, user, pass, objectID) +{ + this.serverURL = serverURL; + this.user = user; + this.pass = pass; + this.objectID = objectID; + + /* Add standard methods */ + if(this.objectID) { + this._addMethods(["listMethods"]); + var req = this._makeRequest("listMethods", []); + } else { + this._addMethods(["system.listMethods"]); + var req = this._makeRequest("system.listMethods", []); + } + var m = this._sendRequest(req); + this._addMethods(m); +}; + + +/* JSONRpcCLient.Exception */ + +JSONRpcClient.Exception = +function JSONRpcClient_Exception_ctor(code, message, javaStack) +{ + this.code = code; + var name; + if(javaStack) { + this.javaStack = javaStack; + var m = javaStack.match(/^([^:]*)/); + if(m) name = m[0]; + } + if(name) this.name = name; + else this.name = "JSONRpcClientException"; + this.message = message; +}; + +JSONRpcClient.Exception.CODE_REMOTE_EXCEPTION = 490; +JSONRpcClient.Exception.CODE_ERR_CLIENT = 550; +JSONRpcClient.Exception.CODE_ERR_PARSE = 590; +JSONRpcClient.Exception.CODE_ERR_NOMETHOD = 591; +JSONRpcClient.Exception.CODE_ERR_UNMARSHALL = 592; +JSONRpcClient.Exception.CODE_ERR_MARSHALL = 593; + +JSONRpcClient.Exception.prototype = new Error(); + +JSONRpcClient.Exception.prototype.toString = +function JSONRpcClient_Exception_toString(code, msg) +{ + return this.name + ": " + this.message; +}; + + +/* Default top level exception handler */ + +JSONRpcClient.default_ex_handler = +function JSONRpcClient_default_ex_handler(e) { alert(e); }; + + +/* Client settable variables */ + +JSONRpcClient.toplevel_ex_handler = JSONRpcClient.default_ex_handler; +JSONRpcClient.profile_async = false; +JSONRpcClient.max_req_active = 1; +JSONRpcClient.requestId = 1; + + +/* JSONRpcClient implementation */ + +JSONRpcClient.prototype._createMethod = +function JSONRpcClient_createMethod(methodName) +{ + var fn=function() + { + var args = []; + var callback = null; + for(var i=0;i<arguments.length;i++) args.push(arguments[i]); + if(typeof args[0] == "function") callback = args.shift(); + var req = fn.client._makeRequest.call(fn.client, fn.methodName, + args, callback); + if(callback == null) { + return fn.client._sendRequest.call(fn.client, req); + } else { + JSONRpcClient.async_requests.push(req); + JSONRpcClient.kick_async(); + return req.requestId; + } + }; + fn.client = this; + fn.methodName = methodName; + return fn; +}; + +JSONRpcClient.prototype._addMethods = +function JSONRpcClient_addMethods(methodNames) +{ + for(var i=0; i<methodNames.length; i++) { + var obj = this; + var names = methodNames[i].split("."); + for(var n=0; n<names.length-1; n++) { + var name = names[n]; + if(obj[name]) { + obj = obj[name]; + } else { + obj[name] = new Object(); + obj = obj[name]; + } + } + var name = names[names.length-1]; + if(!obj[name]) { + var method = this._createMethod(methodNames[i]); + obj[name] = method; + } + } +}; + +JSONRpcClient._getCharsetFromHeaders = +function JSONRpcClient_getCharsetFromHeaders(http) +{ + try { + var contentType = http.getResponseHeader("Content-type"); + var parts = contentType.split(/\s*;\s*/); + for(var i =0; i < parts.length; i++) { + if(parts[i].substring(0, 8) == "charset=") + return parts[i].substring(8, parts[i].length); + } + } catch (e) {} + return "UTF-8"; /* default */ +}; + +/* Async queue globals */ +JSONRpcClient.async_requests = []; +JSONRpcClient.async_inflight = {}; +JSONRpcClient.async_responses = []; +JSONRpcClient.async_timeout = null; +JSONRpcClient.num_req_active = 0; + +JSONRpcClient._async_handler = +function JSONRpcClient_async_handler() +{ + JSONRpcClient.async_timeout = null; + + while(JSONRpcClient.async_responses.length > 0) { + var res = JSONRpcClient.async_responses.shift(); + if(res.canceled) continue; + if(res.profile) res.profile.dispatch = new Date(); + try { + res.cb(res.result, res.ex, res.profile); + } catch(e) { + JSONRpcClient.toplevel_ex_handler(e); + } + } + + while(JSONRpcClient.async_requests.length > 0 && + JSONRpcClient.num_req_active < JSONRpcClient.max_req_active) { + var req = JSONRpcClient.async_requests.shift(); + if(req.canceled) continue; + req.client._sendRequest.call(req.client, req); + } +}; + +JSONRpcClient.kick_async = +function JSONRpcClient_kick_async() +{ + if(JSONRpcClient.async_timeout == null) + JSONRpcClient.async_timeout = + setTimeout(JSONRpcClient._async_handler, 0); +}; + +JSONRpcClient.cancelRequest = +function JSONRpcClient_cancelRequest(requestId) +{ + /* If it is in flight then mark it as canceled in the inflight map + and the XMLHttpRequest callback will discard the reply. */ + if(JSONRpcClient.async_inflight[requestId]) { + JSONRpcClient.async_inflight[requestId].canceled = true; + return true; + } + + /* If its not in flight yet then we can just mark it as canceled in + the the request queue and it will get discarded before being sent. */ + for(var i in JSONRpcClient.async_requests) { + if(JSONRpcClient.async_requests[i].requestId == requestId) { + JSONRpcClient.async_requests[i].canceled = true; + return true; + } + } + + /* It may have returned from the network and be waiting for its callback + to be dispatched, so mark it as canceled in the response queue + and the response will get discarded before calling the callback. */ + for(var i in JSONRpcClient.async_responses) { + if(JSONRpcClient.async_responses[i].requestId == requestId) { + JSONRpcClient.async_responses[i].canceled = true; + return true; + } + } + + return false; +}; + +JSONRpcClient.prototype._makeRequest = +function JSONRpcClient_makeRequest(methodName, args, cb) +{ + var req = {}; + req.client = this; + req.requestId = JSONRpcClient.requestId++; + + var obj = {}; + obj.id = req.requestId; + if (this.objectID) + obj.method = ".obj#" + this.objectID + "." + methodName; + else + obj.method = methodName; + obj.params = args; + + if (cb) req.cb = cb; + if (JSONRpcClient.profile_async) + req.profile = { "submit": new Date() }; + req.data = toJSON(obj); + + return req; +}; + +JSONRpcClient.prototype._sendRequest = +function JSONRpcClient_sendRequest(req) +{ + if(req.profile) req.profile.start = new Date(); + + /* Get free http object from the pool */ + var http = JSONRpcClient.poolGetHTTPRequest(); + JSONRpcClient.num_req_active++; + + /* Send the request */ + if (typeof(this.user) == "undefined") { + http.open("POST", this.serverURL, (req.cb != null)); + } else { + http.open("POST", this.serverURL, (req.cb != null), this.user, this.pass); + } + + /* setRequestHeader is missing in Opera 8 Beta */ + try { http.setRequestHeader("Content-type", "text/plain"); } catch(e) {} + + /* Construct call back if we have one */ + if(req.cb) { + var self = this; + http.onreadystatechange = function() { + if(http.readyState == 4) { + http.onreadystatechange = function () {}; + var res = { "cb": req.cb, "result": null, "ex": null}; + if (req.profile) { + res.profile = req.profile; + res.profile.end = new Date(); + } + try { res.result = self._handleResponse(http); } + catch(e) { res.ex = e; } + if(!JSONRpcClient.async_inflight[req.requestId].canceled) + JSONRpcClient.async_responses.push(res); + delete JSONRpcClient.async_inflight[req.requestId]; + JSONRpcClient.kick_async(); + } + }; + } else { + http.onreadystatechange = function() {}; + } + + JSONRpcClient.async_inflight[req.requestId] = req; + + try { + http.send(req.data); + } catch(e) { + JSONRpcClient.poolReturnHTTPRequest(http); + JSONRpcClient.num_req_active--; + throw new JSONRpcClient.Exception + (JSONRpcClient.Exception.CODE_ERR_CLIENT, "Connection failed"); + } + + if(!req.cb) return this._handleResponse(http); +}; + +JSONRpcClient.prototype._handleResponse = +function JSONRpcClient_handleResponse(http) +{ + /* Get the charset */ + if(!this.charset) { + this.charset = JSONRpcClient._getCharsetFromHeaders(http); + } + + /* Get request results */ + var status, statusText, data; + try { + status = http.status; + statusText = http.statusText; + data = http.responseText; + } catch(e) { + JSONRpcClient.poolReturnHTTPRequest(http); + JSONRpcClient.num_req_active--; + JSONRpcClient.kick_async(); + throw new JSONRpcClient.Exception + (JSONRpcClient.Exception.CODE_ERR_CLIENT, "Connection failed"); + } + + /* Return http object to the pool; */ + JSONRpcClient.poolReturnHTTPRequest(http); + JSONRpcClient.num_req_active--; + + /* Unmarshall the response */ + if(status != 200) { + throw new JSONRpcClient.Exception(status, statusText); + } + var obj; + try { + eval("obj = " + data); + } catch(e) { + throw new JSONRpcClient.Exception(550, "error parsing result"); + } + if(obj.error) + throw new JSONRpcClient.Exception(obj.error.code, obj.error.msg, + obj.error.trace); + var res = obj.result; + + /* Handle CallableProxy */ + if(res && res.objectID && res.JSONRPCType == "CallableReference") + return new JSONRpcClient(this.serverURL, this.user, + this.pass, res.objectID); + + return res; +}; + + +/* XMLHttpRequest wrapper code */ + +/* XMLHttpRequest pool globals */ +JSONRpcClient.http_spare = []; +JSONRpcClient.http_max_spare = 8; + +JSONRpcClient.poolGetHTTPRequest = +function JSONRpcClient_pool_getHTTPRequest() +{ + if(JSONRpcClient.http_spare.length > 0) { + return JSONRpcClient.http_spare.pop(); + } + return JSONRpcClient.getHTTPRequest(); +}; + +JSONRpcClient.poolReturnHTTPRequest = +function JSONRpcClient_poolReturnHTTPRequest(http) +{ + if(JSONRpcClient.http_spare.length >= JSONRpcClient.http_max_spare) + delete http; + else + JSONRpcClient.http_spare.push(http); +}; + +JSONRpcClient.msxmlNames = [ "MSXML2.XMLHTTP.5.0", + "MSXML2.XMLHTTP.4.0", + "MSXML2.XMLHTTP.3.0", + "MSXML2.XMLHTTP", + "Microsoft.XMLHTTP" ]; + +JSONRpcClient.getHTTPRequest = +function JSONRpcClient_getHTTPRequest() +{ + /* Mozilla XMLHttpRequest */ + try { + JSONRpcClient.httpObjectName = "XMLHttpRequest"; + return new XMLHttpRequest(); + } catch(e) {} + + /* Microsoft MSXML ActiveX */ + for (var i=0;i < JSONRpcClient.msxmlNames.length; i++) { + try { + JSONRpcClient.httpObjectName = JSONRpcClient.msxmlNames[i]; + return new ActiveXObject(JSONRpcClient.msxmlNames[i]); + } catch (e) {} + } + + /* None found */ + JSONRpcClient.httpObjectName = null; + throw new JSONRpcClient.Exception(0, "Can't create XMLHttpRequest object"); +}; + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/resources/system.fragment b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/resources/system.fragment new file mode 100644 index 0000000000..ee3078a39f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/main/resources/system.fragment @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="ASCII"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<moduleFragment xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9" + xmlns:tuscany="http://org.apache.tuscany/xmlns/system/0.9" + name="org.apache.tuscany.binding.jsonrpc"> + + <component name="org.apache.tuscany.binding.jsonrpc.builder.JSONRPCEntryPointBuilder"> + <tuscany:implementation.system class="org.apache.tuscany.binding.jsonrpc.builder.JSONRPCEntryPointBuilder"/> + </component> + + <component name="org.apache.tuscany.binding.jsonrpc.loader.JSONRPCBindingLoaderr"> + <tuscany:implementation.system class="org.apache.tuscany.binding.jsonrpc.loader.JSONRPCBindingLoader"/> + </component> +</moduleFragment> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/handler/JSONRPCEntryPointServletTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/handler/JSONRPCEntryPointServletTestCase.java new file mode 100644 index 0000000000..bbf2ff4397 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/handler/JSONRPCEntryPointServletTestCase.java @@ -0,0 +1,80 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.jsonrpc.handler;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.binding.jsonrpc.mocks.MockConfigUtils;
+import org.apache.tuscany.binding.jsonrpc.mocks.servlet.MockHttpServletRequest;
+import org.apache.tuscany.binding.jsonrpc.mocks.servlet.MockHttpServletResponse;
+
+public class JSONRPCEntryPointServletTestCase extends TestCase {
+
+ private static final String JSON_REQUEST = "{\"id\": 2, \"method\": \"MyEntryPoint.concat\", \"params\": [\" world\"]}";
+
+ private static final String JSON_RESPONSE = "{\"result\":\"hello world\",\"id\":2}";
+
+ public void testService() throws ServletException, ClassCastException, IOException {
+// JSONRPCEntryPointServlet servlet = new JSONRPCEntryPointServlet("MyEntryPoint", "hello");
+// ServletConfig servletConfig = MockConfigUtils.createMockServletConfig("MyEntryPoint", "hello");
+// servlet.init(servletConfig);
+//
+// HttpServletRequest request = new MockHttpServletRequest(JSON_REQUEST.getBytes());
+// ByteArrayOutputStream os = new ByteArrayOutputStream();
+// HttpServletResponse response = new MockHttpServletResponse(os);
+//
+// servlet.service(request, response);
+//
+// String responseString = new String(os.toByteArray());
+// assertEquals(JSON_RESPONSE, responseString);
+ }
+
+ public void testInit() throws ServletException {
+// JSONRPCEntryPointServlet servlet = new JSONRPCEntryPointServlet("MyEntryPoint", "hello");
+// ServletConfig servletConfig = MockConfigUtils.createMockServletConfig("MyEntryPoint", "hello");
+//
+// servlet.init(servletConfig);
+//
+// assertEquals("MyEntryPoint", servlet.getEntryPointName());
+// assertEquals("hello", servlet.getEntryPointProxy());
+ }
+
+// public void testHasJSONRPCBinding() {
+// JSONRPCEntryPointServlet servlet = new JSONRPCEntryPointServlet("MyEntryPoint", "hello");
+//
+// EntryPoint entryPoint = MockConfigUtils.createMockEntryPoint("MyEntryPoint");
+// assertFalse(servlet.hasJSONRPCBinding(entryPoint));
+//
+// MockConfigUtils.addNonJSONRPCBinding(entryPoint);
+// assertFalse(servlet.hasJSONRPCBinding(entryPoint));
+//
+// MockConfigUtils.addJSONRPCBinding(entryPoint);
+// assertTrue(servlet.hasJSONRPCBinding(entryPoint));
+//
+// assertEquals(2, entryPoint.getBindings().size());
+//
+// }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/MockConfigUtils.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/MockConfigUtils.java new file mode 100644 index 0000000000..b36330aa19 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/MockConfigUtils.java @@ -0,0 +1,88 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.jsonrpc.mocks;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+
+import org.apache.tuscany.binding.jsonrpc.assembly.JSONRPCBinding;
+import org.apache.tuscany.binding.jsonrpc.mocks.servlet.MockServletConfig;
+import org.apache.tuscany.binding.jsonrpc.mocks.tuscany.MockBinding;
+import org.apache.tuscany.binding.jsonrpc.mocks.tuscany.MockCompositeContextImpl;
+import org.apache.tuscany.binding.jsonrpc.mocks.tuscany.MockEntryPointContext;
+import org.apache.tuscany.binding.jsonrpc.mocks.tuscany.MockScopeContext;
+import org.apache.tuscany.core.context.CompositeContext;
+import org.apache.tuscany.core.context.Context;
+import org.apache.tuscany.core.context.ScopeContext;
+import org.apache.tuscany.core.webapp.TuscanyServletListener;
+import org.apache.tuscany.model.assembly.Binding;
+import org.apache.tuscany.model.assembly.EntryPoint;
+import org.apache.tuscany.model.assembly.Module;
+import org.apache.tuscany.model.assembly.impl.EntryPointImpl;
+
+public class MockConfigUtils {
+
+ public static ServletConfig createMockServletConfig(String entryPointName, Object instance) {
+ ServletConfig servletConfig = new MockServletConfig();
+ ServletContext context = servletConfig.getServletContext();
+ context.setAttribute(TuscanyServletListener.MODULE_COMPONENT_NAME, createModuleWithJSONRPCEntryPoint(entryPointName, instance));
+ return servletConfig;
+ }
+
+ public static CompositeContext createModuleWithJSONRPCEntryPoint(String entryPointName, Object instance) {
+ MockCompositeContextImpl cci = new MockCompositeContextImpl();
+ Module module = (Module) cci.getComposite();
+ List<EntryPoint> entryPoints = module.getEntryPoints();
+ EntryPoint ep = createMockEntryPoint(entryPointName);
+ addJSONRPCBinding(ep);
+ entryPoints.add(ep);
+ cci.start();
+
+ Map<String, Context> ics = new HashMap<String, Context>();
+ ics.put(entryPointName, new MockEntryPointContext(instance));
+
+ ScopeContext sc = new MockScopeContext(ics);
+ sc.start();
+
+ Map<String, ScopeContext> scopeIndex = cci.getScopeIndex();
+ scopeIndex.put(entryPointName, sc);
+
+ return cci;
+ }
+
+ public static EntryPoint createMockEntryPoint(String name) {
+ EntryPoint entryPoint = new EntryPointImpl() {
+ };
+ entryPoint.setName(name);
+ return entryPoint;
+ }
+
+ public static void addJSONRPCBinding(EntryPoint entryPoint) {
+ List<Binding> bindings = entryPoint.getBindings();
+ bindings.add(new JSONRPCBinding());
+ }
+
+ public static void addNonJSONRPCBinding(EntryPoint entryPoint) {
+ List<Binding> bindings = entryPoint.getBindings();
+ bindings.add(new MockBinding());
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/servlet/MockHttpServletRequest.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/servlet/MockHttpServletRequest.java new file mode 100644 index 0000000000..707268ec00 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/servlet/MockHttpServletRequest.java @@ -0,0 +1,263 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.jsonrpc.mocks.servlet;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.Principal;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+public class MockHttpServletRequest implements HttpServletRequest {
+
+ private byte[] inputBytes;
+
+ public MockHttpServletRequest(byte[] inputBytes) {
+ this.inputBytes = inputBytes;
+ }
+
+ public String getAuthType() {
+ return null;
+ }
+
+ public Cookie[] getCookies() {
+ return null;
+ }
+
+ public long getDateHeader(String arg0) {
+ return 0;
+ }
+
+ public String getHeader(String arg0) {
+ return null;
+ }
+
+ public Enumeration getHeaders(String arg0) {
+ return null;
+ }
+
+ public Enumeration getHeaderNames() {
+ return null;
+ }
+
+ public int getIntHeader(String arg0) {
+ return 0;
+ }
+
+ public String getMethod() {
+ return null;
+ }
+
+ public String getPathInfo() {
+ return null;
+ }
+
+ public String getPathTranslated() {
+ return null;
+ }
+
+ public String getContextPath() {
+ return null;
+ }
+
+ public String getQueryString() {
+ return null;
+ }
+
+ public String getRemoteUser() {
+ return null;
+ }
+
+ public boolean isUserInRole(String arg0) {
+ return false;
+ }
+
+ public Principal getUserPrincipal() {
+ return null;
+ }
+
+ public String getRequestedSessionId() {
+ return null;
+ }
+
+ public String getRequestURI() {
+ return null;
+ }
+
+ public StringBuffer getRequestURL() {
+ return null;
+ }
+
+ public String getServletPath() {
+ return null;
+ }
+
+ public HttpSession getSession(boolean arg0) {
+ return null;
+ }
+
+ HttpSession session = new MockHttpSession();
+
+ public HttpSession getSession() {
+ return session;
+ }
+
+ public boolean isRequestedSessionIdValid() {
+ return false;
+ }
+
+ public boolean isRequestedSessionIdFromCookie() {
+ return false;
+ }
+
+ public boolean isRequestedSessionIdFromURL() {
+ return false;
+ }
+
+ public boolean isRequestedSessionIdFromUrl() {
+ return false;
+ }
+
+ public Object getAttribute(String arg0) {
+ return null;
+ }
+
+ public Enumeration getAttributeNames() {
+ return null;
+ }
+
+ public String getCharacterEncoding() {
+ return null;
+ }
+
+ public void setCharacterEncoding(String arg0) throws UnsupportedEncodingException {
+ }
+
+ public int getContentLength() {
+ return 0;
+ }
+
+ public String getContentType() {
+ return null;
+ }
+
+ public ServletInputStream getInputStream() throws IOException {
+ final ByteArrayInputStream is = new ByteArrayInputStream(inputBytes);
+ ServletInputStream sis = new ServletInputStream() {
+ @Override
+ public int read() throws IOException {
+ return is.read();
+ }
+ };
+ return sis;
+ }
+
+ public String getParameter(String arg0) {
+ return null;
+ }
+
+ public Enumeration getParameterNames() {
+ return null;
+ }
+
+ public String[] getParameterValues(String arg0) {
+ return null;
+ }
+
+ public Map getParameterMap() {
+ return null;
+ }
+
+ public String getProtocol() {
+ return null;
+ }
+
+ public String getScheme() {
+ return null;
+ }
+
+ public String getServerName() {
+ return null;
+ }
+
+ public int getServerPort() {
+ return 0;
+ }
+
+ public BufferedReader getReader() throws IOException {
+ return null;
+ }
+
+ public String getRemoteAddr() {
+ return null;
+ }
+
+ public String getRemoteHost() {
+ return null;
+ }
+
+ public void setAttribute(String arg0, Object arg1) {
+ }
+
+ public void removeAttribute(String arg0) {
+ }
+
+ public Locale getLocale() {
+ return null;
+ }
+
+ public Enumeration getLocales() {
+ return null;
+ }
+
+ public boolean isSecure() {
+ return false;
+ }
+
+ public RequestDispatcher getRequestDispatcher(String arg0) {
+ return null;
+ }
+
+ public String getRealPath(String arg0) {
+ return null;
+ }
+
+ public int getRemotePort() {
+ return 0;
+ }
+
+ public String getLocalName() {
+ return null;
+ }
+
+ public String getLocalAddr() {
+ return null;
+ }
+
+ public int getLocalPort() {
+ return 0;
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/servlet/MockHttpServletResponse.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/servlet/MockHttpServletResponse.java new file mode 100644 index 0000000000..f8aaceff33 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/servlet/MockHttpServletResponse.java @@ -0,0 +1,180 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.jsonrpc.mocks.servlet;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Locale;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
+
+public class MockHttpServletResponse implements HttpServletResponse {
+
+ ByteArrayOutputStream outputStream;
+
+ public MockHttpServletResponse(ByteArrayOutputStream outputStream) {
+ this.outputStream = outputStream;
+ }
+
+ public void addCookie(Cookie arg0) {
+
+ }
+
+ public boolean containsHeader(String arg0) {
+
+ return false;
+ }
+
+ public String encodeURL(String arg0) {
+
+ return null;
+ }
+
+ public String encodeRedirectURL(String arg0) {
+
+ return null;
+ }
+
+ public String encodeUrl(String arg0) {
+
+ return null;
+ }
+
+ public String encodeRedirectUrl(String arg0) {
+
+ return null;
+ }
+
+ public void sendError(int arg0, String arg1) throws IOException {
+
+ }
+
+ public void sendError(int arg0) throws IOException {
+
+ }
+
+ public void sendRedirect(String arg0) throws IOException {
+
+ }
+
+ public void setDateHeader(String arg0, long arg1) {
+
+ }
+
+ public void addDateHeader(String arg0, long arg1) {
+
+ }
+
+ public void setHeader(String arg0, String arg1) {
+
+ }
+
+ public void addHeader(String arg0, String arg1) {
+
+ }
+
+ public void setIntHeader(String arg0, int arg1) {
+
+ }
+
+ public void addIntHeader(String arg0, int arg1) {
+
+ }
+
+ public void setStatus(int arg0) {
+
+ }
+
+ public void setStatus(int arg0, String arg1) {
+
+ }
+
+ public String getCharacterEncoding() {
+
+ return null;
+ }
+
+ public String getContentType() {
+
+ return null;
+ }
+
+ public ServletOutputStream getOutputStream() throws IOException {
+ ServletOutputStream sos = new ServletOutputStream() {
+ @Override
+ public void write(int arg0) throws IOException {
+ outputStream.write(arg0);
+ }
+ };
+ return sos;
+ }
+
+ public PrintWriter getWriter() throws IOException {
+
+ return null;
+ }
+
+ public void setCharacterEncoding(String arg0) {
+
+ }
+
+ public void setContentLength(int arg0) {
+
+ }
+
+ public void setContentType(String arg0) {
+
+ }
+
+ public void setBufferSize(int arg0) {
+
+ }
+
+ public int getBufferSize() {
+
+ return 0;
+ }
+
+ public void flushBuffer() throws IOException {
+
+ }
+
+ public void resetBuffer() {
+
+ }
+
+ public boolean isCommitted() {
+
+ return false;
+ }
+
+ public void reset() {
+
+ }
+
+ public void setLocale(Locale arg0) {
+
+ }
+
+ public Locale getLocale() {
+
+ return null;
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/servlet/MockHttpSession.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/servlet/MockHttpSession.java new file mode 100644 index 0000000000..542269c52f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/servlet/MockHttpSession.java @@ -0,0 +1,93 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.jsonrpc.mocks.servlet;
+
+import java.util.Enumeration;
+import java.util.HashMap;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpSession;
+
+public class MockHttpSession implements HttpSession {
+
+ public long getCreationTime() {
+ return 0;
+ }
+
+ public String getId() {
+ return null;
+ }
+
+ public long getLastAccessedTime() {
+ return 0;
+ }
+
+ public ServletContext getServletContext() {
+ return null;
+ }
+
+ public void setMaxInactiveInterval(int arg0) {
+ }
+
+ public int getMaxInactiveInterval() {
+ return 0;
+ }
+
+ @SuppressWarnings("deprecation")
+ public javax.servlet.http.HttpSessionContext getSessionContext() {
+ return null;
+ }
+
+ public Object getAttribute(String arg0) {
+ return attributes.get(arg0);
+ }
+
+ public Object getValue(String arg0) {
+ return null;
+ }
+
+ public Enumeration getAttributeNames() {
+ return null;
+ }
+
+ public String[] getValueNames() {
+ return null;
+ }
+
+ HashMap<String, Object> attributes = new HashMap<String, Object>();
+
+ public void setAttribute(String arg0, Object arg1) {
+ attributes.put(arg0, arg1);
+ }
+
+ public void putValue(String arg0, Object arg1) {
+ }
+
+ public void removeAttribute(String arg0) {
+ }
+
+ public void removeValue(String arg0) {
+ }
+
+ public void invalidate() {
+ }
+
+ public boolean isNew() {
+ return false;
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/servlet/MockServletConfig.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/servlet/MockServletConfig.java new file mode 100644 index 0000000000..0ece32ca4a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/servlet/MockServletConfig.java @@ -0,0 +1,44 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.jsonrpc.mocks.servlet;
+
+import java.util.Enumeration;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+
+public class MockServletConfig implements ServletConfig {
+
+ public String getServletName() {
+ return null;
+ }
+
+ ServletContext servletContext = new MockServletContext();
+
+ public ServletContext getServletContext() {
+ return servletContext;
+ }
+
+ public String getInitParameter(String arg0) {
+ return null;
+ }
+
+ public Enumeration getInitParameterNames() {
+ return null;
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/servlet/MockServletContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/servlet/MockServletContext.java new file mode 100644 index 0000000000..1d9189805d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/servlet/MockServletContext.java @@ -0,0 +1,148 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.jsonrpc.mocks.servlet;
+
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Set;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+
+public class MockServletContext implements ServletContext {
+
+ public ServletContext getContext(String arg0) {
+
+ return null;
+ }
+
+ public int getMajorVersion() {
+
+ return 0;
+ }
+
+ public int getMinorVersion() {
+
+ return 0;
+ }
+
+ public String getMimeType(String arg0) {
+
+ return null;
+ }
+
+ public Set getResourcePaths(String arg0) {
+
+ return null;
+ }
+
+ public URL getResource(String arg0) throws MalformedURLException {
+
+ return null;
+ }
+
+ public InputStream getResourceAsStream(String arg0) {
+
+ return null;
+ }
+
+ public RequestDispatcher getRequestDispatcher(String arg0) {
+
+ return null;
+ }
+
+ public RequestDispatcher getNamedDispatcher(String arg0) {
+
+ return null;
+ }
+
+ public Servlet getServlet(String arg0) throws ServletException {
+
+ return null;
+ }
+
+ public Enumeration getServlets() {
+
+ return null;
+ }
+
+ public Enumeration getServletNames() {
+
+ return null;
+ }
+
+ public void log(String arg0) {
+
+ }
+
+ public void log(Exception arg0, String arg1) {
+
+ }
+
+ public void log(String arg0, Throwable arg1) {
+
+ }
+
+ public String getRealPath(String arg0) {
+
+ return null;
+ }
+
+ public String getServerInfo() {
+
+ return null;
+ }
+
+ public String getInitParameter(String arg0) {
+
+ return null;
+ }
+
+ public Enumeration getInitParameterNames() {
+
+ return null;
+ }
+
+ HashMap<String, Object> attributes = new HashMap<String, Object>();
+
+ public Object getAttribute(String arg0) {
+ return attributes.get(arg0);
+ }
+
+ public Enumeration getAttributeNames() {
+ return null;
+ }
+
+ public void setAttribute(String arg0, Object arg1) {
+ attributes.put(arg0, arg1);
+ }
+
+ public void removeAttribute(String arg0) {
+
+ }
+
+ public String getServletContextName() {
+
+ return null;
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/tuscany/MockBinding.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/tuscany/MockBinding.java new file mode 100644 index 0000000000..8f9a556a00 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/tuscany/MockBinding.java @@ -0,0 +1,48 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.jsonrpc.mocks.tuscany;
+
+import org.apache.tuscany.model.assembly.AssemblyContext;
+import org.apache.tuscany.model.assembly.AssemblyInitializationException;
+import org.apache.tuscany.model.assembly.AssemblyVisitor;
+import org.apache.tuscany.model.assembly.Binding;
+
+public class MockBinding implements Binding {
+
+ public String getURI() {
+
+ return null;
+ }
+
+ public void setURI(String value) {
+
+ }
+
+ public void initialize(AssemblyContext modelContext) throws AssemblyInitializationException {
+
+ }
+
+ public void freeze() {
+
+ }
+
+ public boolean accept(AssemblyVisitor visitor) {
+
+ return false;
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/tuscany/MockCompositeContextImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/tuscany/MockCompositeContextImpl.java new file mode 100644 index 0000000000..bce958238b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/tuscany/MockCompositeContextImpl.java @@ -0,0 +1,28 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.jsonrpc.mocks.tuscany;
+
+import java.util.Map;
+
+import org.apache.tuscany.core.context.ScopeContext;
+import org.apache.tuscany.core.context.impl.CompositeContextImpl;
+
+public class MockCompositeContextImpl extends CompositeContextImpl {
+ public Map<String, ScopeContext> getScopeIndex() {
+ return scopeIndex;
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/tuscany/MockEntryPointContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/tuscany/MockEntryPointContext.java new file mode 100644 index 0000000000..48489eca01 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/tuscany/MockEntryPointContext.java @@ -0,0 +1,87 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.jsonrpc.mocks.tuscany;
+
+import org.apache.tuscany.core.context.CoreRuntimeException;
+import org.apache.tuscany.core.context.EntryPointContext;
+import org.apache.tuscany.core.context.EventFilter;
+import org.apache.tuscany.core.context.QualifiedName;
+import org.apache.tuscany.core.context.RuntimeEventListener;
+import org.apache.tuscany.core.context.TargetException;
+import org.apache.tuscany.core.context.event.Event;
+
+public class MockEntryPointContext implements EntryPointContext {
+
+ private Object instance;
+
+ public MockEntryPointContext(Object instance) {
+ this.instance = instance;
+ }
+
+ public Object getHandler() throws TargetException {
+
+ return null;
+ }
+
+ public Class getServiceInterface() {
+ return null;
+ }
+
+ public String getName() {
+
+ return null;
+ }
+
+ public void setName(String name) {
+
+ }
+
+ public int getLifecycleState() {
+
+ return 0;
+ }
+
+ public void start() throws CoreRuntimeException {
+
+ }
+
+ public void stop() throws CoreRuntimeException {
+
+ }
+
+ public Object getInstance(QualifiedName qName) throws TargetException {
+
+ return instance;
+ }
+
+ public void publish(Event object) {
+
+ }
+
+ public void addListener(RuntimeEventListener listener) {
+
+ }
+
+ public void addListener(EventFilter filter, RuntimeEventListener listener) {
+
+ }
+
+ public void removeListener(RuntimeEventListener listener) {
+
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/tuscany/MockScopeContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/tuscany/MockScopeContext.java new file mode 100644 index 0000000000..71f1a3615c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/java/org/apache/tuscany/binding/jsonrpc/mocks/tuscany/MockScopeContext.java @@ -0,0 +1,119 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.binding.jsonrpc.mocks.tuscany;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.tuscany.core.builder.ContextFactory;
+import org.apache.tuscany.core.context.Context;
+import org.apache.tuscany.core.context.CoreRuntimeException;
+import org.apache.tuscany.core.context.EventFilter;
+import org.apache.tuscany.core.context.QualifiedName;
+import org.apache.tuscany.core.context.RuntimeEventListener;
+import org.apache.tuscany.core.context.ScopeContext;
+import org.apache.tuscany.core.context.ScopeRuntimeException;
+import org.apache.tuscany.core.context.TargetException;
+import org.apache.tuscany.core.context.event.Event;
+
+public class MockScopeContext implements ScopeContext {
+
+ private Map<String, Context> instanceContexts;
+
+ public MockScopeContext(Map<String, Context> instanceContexts) {
+ this.instanceContexts = instanceContexts;
+ }
+
+ public boolean isCacheable() {
+
+ return false;
+ }
+
+ public void registerFactories(List<ContextFactory<Context>> configurations) {
+
+ }
+
+ public void registerFactory(ContextFactory<Context> configuration) {
+
+ }
+
+ public Context getContext(String name) {
+
+ return instanceContexts.get(name);
+ }
+
+ public Context getContextByKey(String name, Object key) {
+
+ return null;
+ }
+
+ public void removeContext(String name) throws ScopeRuntimeException {
+
+ }
+
+ public void removeContextByKey(String name, Object key) throws ScopeRuntimeException {
+
+ }
+
+ public String getName() {
+
+ return null;
+ }
+
+ public void setName(String name) {
+
+ }
+
+ public int getLifecycleState() {
+
+ return 0;
+ }
+
+ public void start() throws CoreRuntimeException {
+
+ }
+
+ public void stop() throws CoreRuntimeException {
+
+ }
+
+ public Object getInstance(QualifiedName qName) throws TargetException {
+
+ return null;
+ }
+
+ public void publish(Event object) {
+
+ }
+
+ public void addListener(RuntimeEventListener listener) {
+
+ }
+
+ public void addListener(EventFilter filter, RuntimeEventListener listener) {
+
+ }
+
+ public void removeListener(RuntimeEventListener listener) {
+
+ }
+
+ public void onEvent(Event event) {
+
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/resources/org/apache/tuscany/binding/jsonrpc/assembly/tests/sca.module b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/resources/org/apache/tuscany/binding/jsonrpc/assembly/tests/sca.module new file mode 100644 index 0000000000..e331f04c5a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/binding.jsonrpc/src/test/resources/org/apache/tuscany/binding/jsonrpc/assembly/tests/sca.module @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ * Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.
+ -->
+<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9" + xmlns:jsonrpc="http://org.apache.tuscany/xmlns/jsonrpc/0.9"
+
+ name="tuscany.binding.jsonrpc.assembly.tests.bigbank.account">
+
+ <entryPoint name="AccountService">
+ <jsonrpc:binding.jsonrpc/>
+ </entryPoint>
+
+</module>
+
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/pom.xml new file mode 100644 index 0000000000..d2aa27a50b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/pom.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.
+ -->
+<project>
+
+ <parent>
+ <groupId>org.apache.tuscany</groupId>
+ <artifactId>tuscany-sca</artifactId>
+ <version>incubating-M1</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.apache.tuscany.sca.bindings</groupId>
+ <artifactId>tuscany-sca-bindings</artifactId>
+ <packaging>pom</packaging>
+ <name>Tuscany SCA Bindings</name>
+ <version>incubating-M1</version>
+
+ <modules>
+ <!-- temporary project to download and install the celtix required sun jars. The jars
+ are all CDDL so will be available on ibiblio when Sun releases them. This is just temporary.
+ -->
+ <module>sunjars</module>
+
+ <module>binding.axis2</module>
+ <module>binding.jsonrpc</module>
+ <module>binding.celtix</module>
+ </modules>
+
+</project>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/sunjars/build.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/sunjars/build.xml new file mode 100644 index 0000000000..59b9553bc1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/sunjars/build.xml @@ -0,0 +1,53 @@ +<project name="CeltixSunJarsInstaller"> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> + + <target name="checkinstalled"> + <condition property="already.installed" > + <and> + <available file="${localRepository}/javax/annotation/jsr250-api/2.0-JAXWS-2.0-EA3/jsr250-api-2.0-JAXWS-2.0-EA3.jar"/> + <available file="${localRepository}/javax/jws/jsr181-api/2.0-JAXWS-2.0-EA3/jsr181-api-2.0-JAXWS-2.0-EA3.jar"/> + <available file="${localRepository}/javax/xml/jaxws-api/2.0-JAXWS-2.0-EA3/jaxws-api-2.0-JAXWS-2.0-EA3.jar"/> + <available file="${localRepository}/com/sun/xml/saaj-impl/1.3/saaj-impl-1.3.jar"/> + <available file="${localRepository}/javax/xml/saaj-api/1.3/saaj-api-1.3.jar"/> + </and> + </condition> + <condition property="maven.suffix" value=""> + <os family="unix"/> + </condition> + <condition property="maven.suffix" value=".bat"> + <os family="windows"/> + </condition> + </target> + + <target name="installJars" depends="checkinstalled" unless="already.installed"> + <exec executable="mvn${maven.suffix}" dir="${basedir}" failonerror="false"> + <arg line="install:install-file -DgroupId=javax.annotation -DartifactId=jsr250-api -Dversion=2.0-JAXWS-2.0-EA3 -Dpackaging=jar -DgeneratePom=true -Dfile=${basedir}/target/celtix-install/celtix/lib/jsr250-api-2.0-JAXWS-2.0-EA3.jar"/> + </exec> + <exec executable="mvn${maven.suffix}" dir="${basedir}" failonerror="false"> + <arg line="install:install-file -DgroupId=javax.jws -DartifactId=jsr181-api -Dversion=2.0-JAXWS-2.0-EA3 -Dpackaging=jar -DgeneratePom=true -Dfile=${basedir}/target/celtix-install/celtix/lib/jsr181-api-2.0-JAXWS-2.0-EA3.jar"/> + </exec> + <exec executable="mvn${maven.suffix}" dir="${basedir}" failonerror="false"> + <arg line="install:install-file -DgroupId=javax.xml -DartifactId=jaxws-api -Dversion=2.0-JAXWS-2.0-EA3 -Dpackaging=jar -DgeneratePom=true -Dfile=${basedir}/target/celtix-install/celtix/lib/jaxws-api-2.0-JAXWS-2.0-EA3.jar"/> + </exec> + <exec executable="mvn${maven.suffix}" dir="${basedir}" failonerror="false"> + <arg line="install:install-file -DgroupId=javax.xml -DartifactId=saaj-api -Dversion=1.3 -Dpackaging=jar -DgeneratePom=true -Dfile=${basedir}/target/celtix-install/celtix/lib/saaj-api-1.3.jar"/> + </exec> + <exec executable="mvn${maven.suffix}" dir="${basedir}" failonerror="false"> + <arg line="install:install-file -DgroupId=com.sun.xml -DartifactId=saaj-impl -Dversion=1.3 -Dpackaging=jar -DgeneratePom=true -Dfile=${basedir}/target/celtix-install/celtix/lib/saaj-impl-1.3.jar"/> + </exec> + </target> +</project> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/sunjars/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/sunjars/pom.xml new file mode 100644 index 0000000000..38fe58884f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/bindings/sunjars/pom.xml @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Copyright (c) 2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>org.apache.tuscany.sca.bindings</groupId> + <artifactId>tuscany-sunjars</artifactId> + <packaging>pom</packaging> + <version>incubating-M1</version> + <name>Project to install the Sun jars</name> + + <parent> + <groupId>org.apache.tuscany.sca.bindings</groupId> + <artifactId>tuscany-sca-bindings</artifactId> + <version>incubating-M1</version> + </parent> + + + <properties> + <celtix.version>1.0</celtix.version> + </properties> + <repositories> + <repository> + <id>objectweb</id> + <name>ObjectWeb repo</name> + <url>http://maven.objectweb.org/maven2</url> + <releases> + <enabled>true</enabled> + </releases> + <snapshots> + <enabled>false</enabled> + </snapshots> + </repository> + </repositories> + + + + <build> + <plugins> + <!-- This is a "hack" to overcome the Sun jar issue. Basically, we download a + complete celtix install kit (epl version) and then extract the Sun jars that we + need and install them. We use the dependency plugin to download it from the + objectweb snapshot mirror, then use antrun to fork a build.xml that will conditionally + call mvn to install the jars if they aren't already there. --> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>dependency-maven-plugin</artifactId> + <executions> + <execution> + <id>getdeps</id> + <phase>validate</phase> + <goals> + <goal>unpack</goal> + </goals> + <configuration> + <outputDirectory>${project.build.directory}/celtix-install</outputDirectory> + <artifactItems> + <artifactItem> + <groupId>org.objectweb.celtix</groupId> + <artifactId>celtix-distribution</artifactId> + <version>${celtix.version}</version> + <classifier>bin-epl</classifier> + </artifactItem> + </artifactItems> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-antrun-plugin</artifactId> + <executions> + <execution> + <id>install</id> + <phase>install</phase> + <goals> + <goal>run</goal> + </goals> + <configuration> + <tasks> + <ant target="installJars"> + <property name="localRepository" value="${settings.localRepository}"/> + </ant> + </tasks> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + +</project> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/LICENSE.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/README.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/README.txt new file mode 100644 index 0000000000..9b26d1690a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/README.txt @@ -0,0 +1,35 @@ +Apache Tuscany M1 build (May, 2006) +=================================== + +http://incubator.apache.org/tuscany/ + +Tuscany is an effort undergoing incubation at the Apache Software Foundation +(ASF), sponsored by the Web Services PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness or +stability of the code, it does indicate that the project has yet to be fully +endorsed by the ASF. + + +Support +------- + +Any problem with this release can be reported to the Tuscany mailing list +or in the JIRA issue tracker. + +Mailing list subscription: + tuscany-dev-subscribe@ws.apache.org + +Jira: + http://issues.apache.org/jira/browse/Tuscany + + +Thank you for using Tuscany! + + +The Tuscany Team. + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/pom.xml new file mode 100644 index 0000000000..861c33c7e1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/pom.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + --> +<project> + <parent> + <groupId>org.apache.tuscany</groupId> + <artifactId>tuscany-sca</artifactId> + <version>incubating-M1</version> + </parent> + <modelVersion>4.0.0</modelVersion> + <artifactId>tuscany-common</artifactId> + <name>Tuscany Common</name> + <description>Tuscany classes common to runtime and tools.</description> + <version>incubating-M1</version> + + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>3.8.1</version> + <scope>test</scope> + </dependency> + </dependencies> +</project> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/TuscanyException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/TuscanyException.java new file mode 100644 index 0000000000..2bf802520d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/TuscanyException.java @@ -0,0 +1,133 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.common; + +import java.util.ArrayList; +import java.util.List; + +/** + * The root checked exception for the Tuscany runtime. + * + * @version $Rev: 368822 $ $Date: 2006-01-13 10:54:38 -0800 (Fri, 13 Jan 2006) $ + */ +public abstract class TuscanyException extends Exception { + private static final long serialVersionUID = -7847121698339635268L; + private List<String> contextStack; + private String identifier; + + /** + * Override constructor from Exception. + * + * @see Exception + */ + public TuscanyException() { + super(); + } + + /** + * Override constructor from Exception. + * + * @param message passed to Exception + * @see Exception + */ + public TuscanyException(String message) { + super(message); + } + + /** + * Override constructor from Exception. + * + * @param message passed to Exception + * @param cause passed to Exception + * @see Exception + */ + public TuscanyException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Override constructor from Exception. + * + * @param cause passed to Exception + * @see Exception + */ + public TuscanyException(Throwable cause) { + super(cause); + } + + /** + * Returns a collection of names representing the context call stack where the error occured. + * The top of the stack is the first element in the collection. + * + * @return a collection of names representing the context call stack + */ + public List<String> returnContextNames() { + if (contextStack == null) { + contextStack = new ArrayList<String>(); + } + return contextStack; + } + + /** + * Pushes a context name where an error occured onto the call stack. + * + * @param name the name of a context to push on the stack + */ + public void addContextName(String name) { + if (contextStack == null) { + contextStack = new ArrayList<String>(); + } + contextStack.add(name); + } + + /** + * Returns a string representing additional error information referred to in the error message. + * + * @return additional error information + */ + public String getIdentifier() { + return identifier; + } + + /** + * Sets an additional error information referred to in the error message. + * + * @param identifier additional error information + */ + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + public String getMessage() { + if (identifier == null && contextStack == null) { + return super.getMessage(); + } + StringBuilder b = new StringBuilder(256); + b.append(super.getMessage()); + + if (identifier != null) { + b.append(" [").append(identifier).append(']'); + } + if (contextStack != null) { + b.append("\nContext stack trace: "); + for (int i = contextStack.size() - 1; i >= 0; i--) { + b.append('[').append(contextStack.get(i)).append(']'); + } + } + return b.toString(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/TuscanyRuntimeException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/TuscanyRuntimeException.java new file mode 100644 index 0000000000..60f2e2287a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/TuscanyRuntimeException.java @@ -0,0 +1,134 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.common; + +import java.util.ArrayList; +import java.util.List; + +/** + * The root unchecked exception for the Tuscany runtime. + * + * @version $Rev: 368822 $ $Date: 2006-01-13 10:54:38 -0800 (Fri, 13 Jan 2006) $ + */ + +public abstract class TuscanyRuntimeException extends RuntimeException { + private static final long serialVersionUID = -759677431966121786L; + private List<String> contextStack; + private String identifier; + + /** + * Override constructor from RuntimeException. + * + * @see RuntimeException + */ + public TuscanyRuntimeException() { + super(); + } + + /** + * Override constructor from RuntimeException. + * + * @param message passed to RuntimeException + * @see RuntimeException + */ + public TuscanyRuntimeException(String message) { + super(message); + } + + /** + * Override constructor from RuntimeException. + * + * @param message passed to RuntimeException + * @param cause passed to RuntimeException + * @see RuntimeException + */ + public TuscanyRuntimeException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Override constructor from RuntimeException. + * + * @param cause passed to RuntimeException + * @see RuntimeException + */ + public TuscanyRuntimeException(Throwable cause) { + super(cause); + } + + /** + * Returns a collection of names representing the context call stack where the error occured. + * The top of the stack is the first element in the collection. + * + * @return a collection of names representing the context call stack + */ + public List<String> returnContextNames() { + if (contextStack == null) { + contextStack = new ArrayList<String>(); + } + return contextStack; + } + + /** + * Pushes a context name where an error occured onto the call stack. + * + * @param name the name of a context to push on the stack + */ + public void addContextName(String name) { + if (contextStack == null) { + contextStack = new ArrayList<String>(); + } + contextStack.add(name); + } + + /** + * Returns a string representing additional error information referred to in the error message. + * + * @return additional error information + */ + public String getIdentifier() { + return identifier; + } + + /** + * Sets an additional error information referred to in the error message. + * + * @param identifier additional error information + */ + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + public String getMessage() { + if (identifier == null && contextStack == null) { + return super.getMessage(); + } + StringBuilder b = new StringBuilder(256); + b.append(super.getMessage()); + + if (identifier != null) { + b.append(" [").append(identifier).append(']'); + } + if (contextStack != null) { + b.append("\nContext stack trace: "); + for (int i = contextStack.size() - 1; i >= 0; i--) { + b.append('[').append(contextStack.get(i)).append(']'); + } + } + return b.toString(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/monitor/LogLevel.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/monitor/LogLevel.java new file mode 100644 index 0000000000..45134c7556 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/monitor/LogLevel.java @@ -0,0 +1,38 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.common.monitor; + +import static java.lang.annotation.ElementType.METHOD; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; + +/** + * Annotation that can be applied to methods in a monitoring interface + * to indicate to logging frameworks the severity of the event. + * + * @version $Rev$ $Date$ + */ +@Target({METHOD}) +@Retention(RUNTIME) +public @interface LogLevel { + + /** + * The log level as specified by {@link java.util.logging.Level}. + */ + @SuppressWarnings({"JavaDoc"}) String value(); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/monitor/MonitorFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/monitor/MonitorFactory.java new file mode 100644 index 0000000000..aa92092005 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/monitor/MonitorFactory.java @@ -0,0 +1,35 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.common.monitor; + +/** + * A MonitorFactory creates implementations of components' monitor interfaces + * that interface with a its monitoring scheme. For example, a implementation + * may create versions that emit appropriate logging events or which send + * notifications to a management API. + * + * @version $Rev$ $Date$ + */ +public interface MonitorFactory { + /** + * Return a monitor for a component's monitor interface. + * + * @param monitorInterface the component's monitoring interface + * @return an implementation of the monitoring interface; will not be null + */ + <T> T getMonitor(Class<T> monitorInterface); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/monitor/impl/InvalidLevelException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/monitor/impl/InvalidLevelException.java new file mode 100644 index 0000000000..baf4e8b7cc --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/monitor/impl/InvalidLevelException.java @@ -0,0 +1,60 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.common.monitor.impl; + +/** + * Exception indicating an invalid log level has been passed. + * + * @version $Rev$ $Date$ + */ +public class InvalidLevelException extends IllegalArgumentException { + private static final long serialVersionUID = 7767234706427841915L; + private final String method; + private final String level; + + /** + * Constructor specifying the method name and the level affected. + * + * @param method the name of the method being monitored + * @param level the invalid log level value + */ + public InvalidLevelException(String method, String level) { + super(); + this.method = method; + this.level = level; + } + + /** + * Returns the name of the method being monitored. + * @return the name of the method being monitored + */ + public String getMethod() { + return method; + } + + /** + * Returns the invalid log level specified. + * @return the invalid log level that was specified + */ + public String getLevel() { + return level; + } + + public String getMessage() { + return "Invalid level for method " + method + " : " + level; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/monitor/impl/JavaLoggingMonitorFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/monitor/impl/JavaLoggingMonitorFactory.java new file mode 100644 index 0000000000..daef77d4ae --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/monitor/impl/JavaLoggingMonitorFactory.java @@ -0,0 +1,186 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.common.monitor.impl; + +import java.lang.ref.WeakReference; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.WeakHashMap; +import java.util.ResourceBundle; +import java.util.Locale; +import java.util.MissingResourceException; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.logging.LogRecord; + +import org.apache.tuscany.common.monitor.LogLevel; +import org.apache.tuscany.common.monitor.MonitorFactory; + +/** + * A factory for monitors that forwards events to a {@link java.util.logging.Logger Java Logging (JSR47) Logger}. + * + * @version $Rev$ $Date$ + * @see java.util.logging + */ +public class JavaLoggingMonitorFactory implements MonitorFactory { + private final String bundleName; + private final Level defaultLevel; + private final Map<String, Level> levels; + + private final Map<Class<?>, WeakReference<?>> proxies = new WeakHashMap<Class<?>, WeakReference<?>>(); + + /** + * Construct a MonitorFactory that will monitor the specified methods at the specified levels + * and generate messages using java.util.logging. + * <p/> + * The supplied Properties can be used to specify custom log levels for specific monitor + * methods. The key should be the method name in form returned by + * <code>Class.getName() + '#' + Method.getName()</code> and the value the log level to use + * as defined by {@link java.util.logging.Level}. + * + * @param levels definition of custom levels for specific monitored methods + * @param defaultLevel the default log level to use + * @param bundleName the name of a resource bundle that will be passed to the logger + * @see java.util.logging.Logger + */ + public JavaLoggingMonitorFactory(Properties levels, Level defaultLevel, String bundleName) { + this.defaultLevel = defaultLevel; + this.bundleName = bundleName; + this.levels = new HashMap<String, Level>(levels.size()); + for (Map.Entry<Object, Object> entry : levels.entrySet()) { + String method = (String) entry.getKey(); + String level = (String) entry.getValue(); + try { + this.levels.put(method, Level.parse(level)); + } catch (IllegalArgumentException e) { + throw new InvalidLevelException(method, level); + } + } + } + + public synchronized <T> T getMonitor(Class<T> monitorInterface) { + T proxy = getCachedMonitor(monitorInterface); + if (proxy == null) { + proxy = createMonitor(monitorInterface, bundleName); + proxies.put(monitorInterface, new WeakReference<T>(proxy)); + } + return proxy; + } + + private <T>T getCachedMonitor(Class<T> monitorInterface) { + WeakReference<?> ref = proxies.get(monitorInterface); + return (ref != null) ? monitorInterface.cast(ref.get()) : null; + } + + private <T>T createMonitor(Class<T> monitorInterface, String bundleName) { + String className = monitorInterface.getName(); + Logger logger = Logger.getLogger(className); + Method[] methods = monitorInterface.getMethods(); + Map<String, Level> levels = new HashMap<String, Level>(methods.length); + for (Method method : methods) { + String key = className + '#' + method.getName(); + Level level = this.levels.get(key); + + // if not specified the in config properties, look for an annotation on the method + if (level == null) { + LogLevel annotation = method.getAnnotation(LogLevel.class); + if (annotation != null && annotation.value() != null) { + try { + level = Level.parse(annotation.value()); + } catch (IllegalArgumentException e) { + // bad value, just use the default + level = defaultLevel; + } + } + } + if (level == null) { + level = defaultLevel; + } + levels.put(method.getName(), level); + } + + ResourceBundle bundle = locateBundle(monitorInterface, bundleName); + + InvocationHandler handler = new LoggingHandler(logger, levels, bundle); + return monitorInterface.cast(Proxy.newProxyInstance(monitorInterface.getClassLoader(), new Class<?>[]{monitorInterface}, handler)); + } + + private static <T>ResourceBundle locateBundle(Class<T> monitorInterface, String bundleName) { + Locale locale = Locale.getDefault(); + ClassLoader cl = monitorInterface.getClassLoader(); + String packageName = monitorInterface.getPackage().getName(); + while (true) { + try { + return ResourceBundle.getBundle(packageName + '.' + bundleName, locale, cl); + } catch (MissingResourceException e) { + } + int index = packageName.lastIndexOf('.'); + if (index == -1) { + break; + } + packageName = packageName.substring(0, index); + } + try { + return ResourceBundle.getBundle(bundleName, locale, cl); + } catch (Exception e) { + return null; + } + } + + private static final class LoggingHandler implements InvocationHandler { + private final Logger logger; + private final Map<String, Level> methodLevels; + private final ResourceBundle bundle; + + public LoggingHandler(Logger logger, Map<String, Level> methodLevels, ResourceBundle bundle) { + this.logger = logger; + this.methodLevels = methodLevels; + this.bundle = bundle; + } + + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + String sourceMethod = method.getName(); + Level level = methodLevels.get(sourceMethod); + if (level != null && logger.isLoggable(level)) { + // construct the key for the resource bundle + String className = logger.getName(); + String key = className + '#' + sourceMethod; + + LogRecord logRecord = new LogRecord(level, key); + logRecord.setLoggerName(className); + logRecord.setSourceClassName(className); + logRecord.setSourceMethodName(sourceMethod); + logRecord.setParameters(args); + if (args != null) { + for (Object o : args) { + if (o instanceof Throwable) { + logRecord.setThrown((Throwable) o); + break; + } + } + } + logRecord.setResourceBundle(bundle); + logger.log(logRecord); + } + return null; + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/monitor/impl/NullMonitorFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/monitor/impl/NullMonitorFactory.java new file mode 100644 index 0000000000..827aeec84c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/monitor/impl/NullMonitorFactory.java @@ -0,0 +1,48 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.common.monitor.impl; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +import org.apache.tuscany.common.monitor.MonitorFactory; + +/** + * Implementation of a {@link MonitorFactory} that produces implementations that simply return. + * + * @version $Rev$ $Date$ + */ +public class NullMonitorFactory implements MonitorFactory { + public <T> T getMonitor(Class<T> monitorInterface) { + /* + * This uses a reflection proxy to implement the monitor interface which + * is a simple but perhaps not very performant solution. Performance + * might be improved by code generating an implementation with empty methods. + */ + return monitorInterface.cast(Proxy.newProxyInstance(monitorInterface.getClassLoader(), new Class<?>[]{monitorInterface}, NULL_MONITOR)); + } + + /** + * Singleton wire hander that does nothing. + */ + private static final InvocationHandler NULL_MONITOR = new InvocationHandler() { + public Object invoke(Object proxy, Method method, Object[] args) { + return null; + } + }; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/resource/ResourceLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/resource/ResourceLoader.java new file mode 100644 index 0000000000..897c5e06c0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/resource/ResourceLoader.java @@ -0,0 +1,90 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.common.resource; + +import java.io.IOException; +import java.net.URL; +import java.util.Iterator; +import java.util.List; + +/** + * Interface which abstracts the implementation of something that is able to + * load resources (such as a ClassLoader). All Tuscany code should use this + * API rather than a ClassLoader directly in order to reduce the risk of + * memory leaks due to ClassLoader references. + * + * @version $Rev: 379878 $ $Date: 2006-02-22 12:45:50 -0800 (Wed, 22 Feb 2006) $ + */ +public interface ResourceLoader { + + /** + * Returns the parent resource loaders. + * + * @return resource loaders that are parents to this one + */ + List<ResourceLoader> getParents(); + + /** + * Loads the class with the specified binary name. + * + * @param name the binary name of the class + * @return the resulting Class object + * @throws ClassNotFoundException if the class was not found + * @see ClassLoader#loadClass(String) + */ + Class<?> loadClass(String name) throws ClassNotFoundException; + + /** + * Converts an array of bytes into a Class. + * + * @param bytes the bytecode for the class; must match the class file format + * @return a Class defined from the supplied bytecode + */ + Class<?> addClass(byte[] bytes); + + /** + * Finds the first resource with the given name. + * <p/> + * Each parent is searched first (in the order returned by {@link #getParents()}) + * and the first resource located is found. If no parent returns a resource then + * the first resource defined by this ResourceLoader is returned. + * + * @param name the resource name + * @return a {@link URL} that can be used to read the resource, or null if no resource could be found + */ + URL getResource(String name); + + /** + * Find resources with the given name that are available from this + * ResourceLoader or any of its parents. + * + * @param name the resource name + * @return an Iterator of {@link URL} objects for the resource + * @throws IOException if there was a problem locating the resources + */ + Iterator<URL> getResources(String name) throws IOException; + + //FIXME this is temporary to work around classloader problems with SDO when running in Tomcat + + /** + * Returns the underlying classloader this loader is wrapping. + * + * @return the underlying classloader this loader is wrapping + */ + ClassLoader getClassLoader(); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/resource/impl/GeneratedClassLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/resource/impl/GeneratedClassLoader.java new file mode 100644 index 0000000000..953908b9f2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/resource/impl/GeneratedClassLoader.java @@ -0,0 +1,45 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.common.resource.impl; + +/** + * A class loader that allows new classes to be defined from an array of bytes. + * + * @version $Rev: 369102 $ $Date: 2006-01-14 13:48:56 -0800 (Sat, 14 Jan 2006) $ + */ +@SuppressWarnings({"CustomClassloader"}) +class GeneratedClassLoader extends ClassLoader { + + /** + * Constructs a new GeneratedClassLoader. + * @param classLoader the parent classloader + */ + GeneratedClassLoader(ClassLoader classLoader) { + super(classLoader); + } + + /** + * Converts an array of bytes into a Class. + * + * @param bytes the bytecode for the class; must match the class file format + * @return a Class defined from the supplied bytecode + */ + Class<?> addClass(byte[] bytes) { + return defineClass(null, bytes, 0, bytes.length); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/resource/impl/ResourceLoaderImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/resource/impl/ResourceLoaderImpl.java new file mode 100644 index 0000000000..d306edf3b4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/java/org/apache/tuscany/common/resource/impl/ResourceLoaderImpl.java @@ -0,0 +1,137 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.common.resource.impl; + +import java.io.IOException; +import java.lang.ref.WeakReference; +import java.net.URL; +import java.util.Collections; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; + +import org.apache.tuscany.common.resource.ResourceLoader; + +/** + * Default implementation of the ResourceLoader interface + * + * @version $Rev: 369102 $ $Date: 2006-01-14 13:48:56 -0800 (Sat, 14 Jan 2006) $ + */ +@SuppressWarnings({"ClassLoader2Instantiation"}) +public class ResourceLoaderImpl implements ResourceLoader { + private final WeakReference<ClassLoader> classLoaderReference; + private WeakReference<GeneratedClassLoader> generatedClassLoaderReference; + private final List<ResourceLoader> parents; + + /** + * Constructs a new ResourceLoaderImpl to wrap a ClassLoader. + * + * @param classLoader the classloader to wrap + */ + public ResourceLoaderImpl(ClassLoader classLoader) { + classLoaderReference = new WeakReference<ClassLoader>(classLoader); + generatedClassLoaderReference = new WeakReference<GeneratedClassLoader>(new GeneratedClassLoader(classLoader)); + ClassLoader parentCL = classLoader.getParent(); + if (null == parentCL) { + parents = Collections.emptyList(); + } else { + parents = Collections.singletonList((ResourceLoader) new ResourceLoaderImpl(parentCL)); + } + } + + + public ClassLoader getClassLoader() throws IllegalStateException { + ClassLoader cl = classLoaderReference.get(); + if (cl == null) { + throw new IllegalStateException("Referenced ClassLoader has been garbage collected"); + } + return cl; + } + + public List<ResourceLoader> getParents() { + return parents; + } + + public Class<?> loadClass(String name) throws ClassNotFoundException { + GeneratedClassLoader cl = generatedClassLoaderReference.get(); + if (cl != null) { + return Class.forName(name, true, cl); + } else { + return Class.forName(name, true, getClassLoader()); + } + } + + public Class<?> addClass(byte[] bytes) { + GeneratedClassLoader cl = generatedClassLoaderReference.get(); + if (cl == null) { + cl = new GeneratedClassLoader(getClassLoader()); + generatedClassLoaderReference = new WeakReference<GeneratedClassLoader>(cl); + } + return cl.addClass(bytes); + } + + public Iterator<URL> getResources(String name) throws IOException { + return new EnumerationIterator<URL>(getClassLoader().getResources(name)); + } + + public URL getResource(String name) { + return getClassLoader().getResource(name); + } + + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof ResourceLoaderImpl)) { + return false; + } + final ResourceLoaderImpl other = (ResourceLoaderImpl) obj; + return getClassLoader() == other.getClassLoader(); + } + + public int hashCode() { + return getClassLoader().hashCode(); + } + + private static class EnumerationIterator<E> implements Iterator<E> { + private final Enumeration<E> e; + + public EnumerationIterator(Enumeration<E> e) { + this.e = e; + } + + public boolean hasNext() { + return e.hasMoreElements(); + } + + public E next() { + // the try/catch is needed here to get IDEA to shut up + // there should be no performance overhead here except when the Exception is thrown + // so I am going to leave it in - feel free to remove if there is any issue + try { + return e.nextElement(); + } catch (NoSuchElementException e1) { + throw e1; + } + } + + public void remove() { + throw new UnsupportedOperationException(); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/resources/META-INF/services/org.apache.tuscany.common.logging.LogProvider b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/resources/META-INF/services/org.apache.tuscany.common.logging.LogProvider new file mode 100644 index 0000000000..6cf181502c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/resources/META-INF/services/org.apache.tuscany.common.logging.LogProvider @@ -0,0 +1 @@ +org.apache.tuscany.common.logging.impl.JSR47LogProviderImpl
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/resources/META-INF/services/org.apache.tuscany.common.resource.loader.ResourceLoaderProvider b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/resources/META-INF/services/org.apache.tuscany.common.resource.loader.ResourceLoaderProvider new file mode 100644 index 0000000000..70456ec1d0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/main/resources/META-INF/services/org.apache.tuscany.common.resource.loader.ResourceLoaderProvider @@ -0,0 +1 @@ +org.apache.tuscany.common.resource.loader.impl.ResourceLoaderProviderImpl
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/test/java/org/apache/tuscany/common/monitor/impl/JavaLoggingTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/test/java/org/apache/tuscany/common/monitor/impl/JavaLoggingTestCase.java new file mode 100644 index 0000000000..985f7ef9b6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/test/java/org/apache/tuscany/common/monitor/impl/JavaLoggingTestCase.java @@ -0,0 +1,163 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.common.monitor.impl; + +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; + +import junit.framework.TestCase; + +import org.apache.tuscany.common.monitor.MonitorFactory; +import org.apache.tuscany.common.monitor.LogLevel; + +/** + * Test case for the JavaLoggingMonitorFactory. + * + * @version $Rev$ $Date$ + */ +public class JavaLoggingTestCase extends TestCase { + private static final Logger logger = Logger.getLogger(Monitor.class.getName()); + private static final MockHandler handler = new MockHandler(); + + private MonitorFactory factory; + + /** + * Smoke test to ensure the logger is working. + */ + public void testLogger() { + logger.info("test"); + assertEquals(1, handler.logs.size()); + } + + /** + * Test that no record is logged. + */ + public void testUnloggedEvent() { + Monitor mon = factory.getMonitor(Monitor.class); + mon.eventNotToLog(); + assertEquals(0, handler.logs.size()); + } + + /** + * Test the correct record is written for an event with no arguments. + */ + public void testEventWithNoArgs() { + Monitor mon = factory.getMonitor(Monitor.class); + mon.eventWithNoArgs(); + assertEquals(1, handler.logs.size()); + LogRecord record = handler.logs.get(0); + assertEquals(Level.INFO, record.getLevel()); + assertEquals(logger.getName(), record.getLoggerName()); + assertEquals(Monitor.class.getName() + "#eventWithNoArgs", record.getMessage()); + } + + /** + * Test the correct record is written for an event defined by annotation. + */ + public void testEventWithAnnotation() { + Monitor mon = factory.getMonitor(Monitor.class); + mon.eventWithAnnotation(); + assertEquals(1, handler.logs.size()); + LogRecord record = handler.logs.get(0); + assertEquals(Level.INFO, record.getLevel()); + assertEquals(logger.getName(), record.getLoggerName()); + assertEquals(Monitor.class.getName() + "#eventWithAnnotation", record.getMessage()); + } + + /** + * Test a Throwable is logged when passed to an event. + */ + public void testEventWithThrowable() { + Exception e = new Exception(); + Monitor mon = factory.getMonitor(Monitor.class); + mon.eventWithThrowable(e); + assertEquals(1, handler.logs.size()); + LogRecord record = handler.logs.get(0); + assertEquals(Level.WARNING, record.getLevel()); + assertEquals(logger.getName(), record.getLoggerName()); + assertEquals(Monitor.class.getName() + "#eventWithThrowable", record.getMessage()); + assertSame(e, record.getThrown()); + } + + /** + * Test the argument is logged. + */ + public void testEventWithOneArg() { + Monitor mon = factory.getMonitor(Monitor.class); + mon.eventWithOneArg("ARG"); + assertEquals(1, handler.logs.size()); + LogRecord record = handler.logs.get(0); + assertEquals(Monitor.class.getName() + "#eventWithOneArg", record.getMessage()); + } + + protected void setUp() throws Exception { + super.setUp(); + logger.setUseParentHandlers(false); + logger.addHandler(handler); + handler.flush(); + + String sourceClass = Monitor.class.getName(); + Properties levels = new Properties(); + levels.setProperty(sourceClass + "#eventWithNoArgs", "INFO"); + levels.setProperty(sourceClass + "#eventWithOneArg", "INFO"); + levels.setProperty(sourceClass + "#eventWithThrowable", "WARNING"); + factory = new JavaLoggingMonitorFactory(levels, Level.FINE, "TestMessages"); + } + + protected void tearDown() throws Exception { + logger.removeHandler(handler); + handler.flush(); + super.tearDown(); + } + + /** + * Mock log handler to capture records. + */ + public static class MockHandler extends Handler { + List<LogRecord> logs = new ArrayList<LogRecord>(); + + public void publish(LogRecord record) { + logs.add(record); + } + + public void flush() { + logs.clear(); + } + + public void close() throws SecurityException { + } + } + + @SuppressWarnings({"JavaDoc"}) + public static interface Monitor { + void eventNotToLog(); + + void eventWithNoArgs(); + + void eventWithOneArg(String msg); + + void eventWithThrowable(Exception e); + + @LogLevel("INFO") + void eventWithAnnotation(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/test/resources/org/apache/tuscany/common/TestMessages.properties b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/test/resources/org/apache/tuscany/common/TestMessages.properties new file mode 100644 index 0000000000..e765ad2e0f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/test/resources/org/apache/tuscany/common/TestMessages.properties @@ -0,0 +1,16 @@ +# Copyright (c) 2006 The Apache Software Foundation or its licensors, as applicable. +# +# Licensed 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. +# +# $Rev$ $Date$ +# diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/test/resources/org/apache/tuscany/common/monitor/impl/JavaLoggingTestCase$Monitor.properties b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/test/resources/org/apache/tuscany/common/monitor/impl/JavaLoggingTestCase$Monitor.properties new file mode 100644 index 0000000000..e16fa437fa --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/common/src/test/resources/org/apache/tuscany/common/monitor/impl/JavaLoggingTestCase$Monitor.properties @@ -0,0 +1 @@ +org.apache.tuscany.common.monitor.impl.JavaLoggingTestCase$Monitor#eventWithOneArg=Log message with arg={0}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/LICENSE.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/README.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/README.txt new file mode 100644 index 0000000000..9b26d1690a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/README.txt @@ -0,0 +1,35 @@ +Apache Tuscany M1 build (May, 2006) +=================================== + +http://incubator.apache.org/tuscany/ + +Tuscany is an effort undergoing incubation at the Apache Software Foundation +(ASF), sponsored by the Web Services PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness or +stability of the code, it does indicate that the project has yet to be fully +endorsed by the ASF. + + +Support +------- + +Any problem with this release can be reported to the Tuscany mailing list +or in the JIRA issue tracker. + +Mailing list subscription: + tuscany-dev-subscribe@ws.apache.org + +Jira: + http://issues.apache.org/jira/browse/Tuscany + + +Thank you for using Tuscany! + + +The Tuscany Team. + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/pom.xml new file mode 100644 index 0000000000..cb33cc90cf --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/pom.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + --> +<project> + + <parent> + <groupId>org.apache.tuscany.sca.containers</groupId> + <artifactId>tuscany-sca-containers</artifactId> + <version>incubating-M1</version> + </parent> + + <modelVersion>4.0.0</modelVersion> + <artifactId>tuscany-container-java</artifactId> + <name>Tuscany Java IoC Container</name> + <description>Container for managing components as defined by the SCA implementation specification.</description> + <version>incubating-M1</version> + + <dependencies> + <dependency> + <groupId>org.apache.tuscany</groupId> + <artifactId>tuscany-core</artifactId> + <version>${pom.version}</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.apache.tuscany.databinding</groupId> + <artifactId>tuscany-databinding-sdo</artifactId> + <version>${pom.version}</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>3.8.1</version> + <scope>test</scope> + </dependency> + </dependencies> +</project> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/JavaAssemblyFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/JavaAssemblyFactory.java new file mode 100644 index 0000000000..90271179d1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/JavaAssemblyFactory.java @@ -0,0 +1,30 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly; + +import org.apache.tuscany.model.assembly.AssemblyFactory; + + +/** + * The Factory for the model. + */ +public interface JavaAssemblyFactory extends AssemblyFactory { + /** + * Returns a new JavaImplementation. + */ + JavaImplementation createJavaImplementation(); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/JavaImplementation.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/JavaImplementation.java new file mode 100644 index 0000000000..a87b8ea1bb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/JavaImplementation.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly; + +import org.apache.tuscany.model.assembly.AtomicImplementation; + + +/** + * Represents a java implementation. + * + * @version $Rev$ $Date$ + */ +public interface JavaImplementation extends AtomicImplementation { + + /** + * Returns the implementation class. + */ + Class<?> getImplementationClass(); + + /** + * Sets the implementation class. + */ + void setImplementationClass(Class<?> value); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaAssemblyFactoryImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaAssemblyFactoryImpl.java new file mode 100644 index 0000000000..3337c287ac --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaAssemblyFactoryImpl.java @@ -0,0 +1,45 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.impl; + +import org.osoa.sca.annotations.Service; + +import org.apache.tuscany.container.java.assembly.JavaAssemblyFactory; +import org.apache.tuscany.container.java.assembly.JavaImplementation; +import org.apache.tuscany.model.assembly.impl.AssemblyFactoryImpl; + +/** + * A factory for the model. + */ +@Service(interfaces = {JavaAssemblyFactory.class}) +public class JavaAssemblyFactoryImpl extends AssemblyFactoryImpl implements JavaAssemblyFactory { + + /** + * Constructor + */ + public JavaAssemblyFactoryImpl() { + super(); + } + + /** + * @see org.apache.tuscany.container.java.assembly.JavaAssemblyFactory#createJavaImplementation() + */ + public JavaImplementation createJavaImplementation() { + return new JavaImplementationImpl(); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java new file mode 100644 index 0000000000..57a98f4ad6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java @@ -0,0 +1,44 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.impl; + +import org.apache.tuscany.container.java.assembly.JavaImplementation; +import org.apache.tuscany.model.assembly.impl.AtomicImplementationImpl; + +/** + * An implementation of JavaImplementation. + * + * @version $Rev$ $Date$ + */ +public class JavaImplementationImpl extends AtomicImplementationImpl implements JavaImplementation { + private Class<?> implementationClass; + + /** + * Default constructor. + */ + protected JavaImplementationImpl() { + } + + public Class<?> getImplementationClass() { + return implementationClass; + } + + public void setImplementationClass(Class<?> value) { + checkNotFrozen(); + implementationClass = value; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/builder/JavaContextFactoryBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/builder/JavaContextFactoryBuilder.java new file mode 100644 index 0000000000..de915738f9 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/builder/JavaContextFactoryBuilder.java @@ -0,0 +1,113 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.builder; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.tuscany.container.java.assembly.JavaImplementation; +import org.apache.tuscany.container.java.config.JavaContextFactory; +import org.apache.tuscany.core.extension.config.extensibility.ComponentNameExtensibilityElement; +import org.apache.tuscany.core.extension.config.extensibility.ContextExtensibilityElement; +import org.apache.tuscany.core.extension.config.extensibility.DestroyInvokerExtensibilityElement; +import org.apache.tuscany.core.extension.config.extensibility.InitInvokerExtensibilityElement; +import org.apache.tuscany.core.extension.config.InjectorExtensibilityElement; +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.config.JavaIntrospectionHelper; +import org.apache.tuscany.core.extension.ContextFactoryBuilderSupport; +import org.apache.tuscany.core.injection.EventInvoker; +import org.apache.tuscany.core.injection.Injector; +import org.apache.tuscany.core.wire.service.WireFactoryService; +import org.apache.tuscany.model.assembly.Scope; + +/** + * Builds context factories for component implementations that map to {@link + * org.apache.tuscany.container.java.assembly.JavaImplementation}. The logical model is then decorated with + * the runtime configuration. + * + * @version $Rev: 368822 $ $Date: 2006-01-13 10:54:38 -0800 (Fri, 13 Jan 2006) $ + * @see org.apache.tuscany.core.builder.ContextFactory + */ +@org.osoa.sca.annotations.Scope("MODULE") +public class JavaContextFactoryBuilder extends ContextFactoryBuilderSupport<JavaImplementation> { + + /** + * Default constructor + */ + public JavaContextFactoryBuilder() { + super(); + } + + /** + * Constructs a new instance + * + * @param wireFactoryService the system service responsible for creating wire factories + */ + public JavaContextFactoryBuilder(WireFactoryService wireFactoryService) { + super(wireFactoryService); + } + + @SuppressWarnings("unchecked") + protected ContextFactory createContextFactory(String name, JavaImplementation javaImpl, Scope scope) { + Class implClass = null; + JavaContextFactory contextFactory; + try { + implClass = javaImpl.getImplementationClass(); + + contextFactory = new JavaContextFactory(name, JavaIntrospectionHelper + .getDefaultConstructor(implClass), scope); + + List<Injector> injectors = new ArrayList<Injector>(); + List<Object> elements = javaImpl.getComponentType().getExtensibilityElements(); + for (Object element : elements) { + if (element instanceof InitInvokerExtensibilityElement) { + InitInvokerExtensibilityElement invokerElement = (InitInvokerExtensibilityElement) element; + EventInvoker<Object> initInvoker = invokerElement.getEventInvoker(); + boolean eagerInit = invokerElement.isEager(); + contextFactory.setEagerInit(eagerInit); + contextFactory.setInitInvoker(initInvoker); + } else if (element instanceof DestroyInvokerExtensibilityElement) { + DestroyInvokerExtensibilityElement invokerElement = (DestroyInvokerExtensibilityElement) element; + EventInvoker<Object> destroyInvoker = invokerElement.getEventInvoker(); + contextFactory.setDestroyInvoker(destroyInvoker); + } else if (element instanceof ComponentNameExtensibilityElement) { + ComponentNameExtensibilityElement nameElement = (ComponentNameExtensibilityElement) element; + injectors.add(nameElement.getEventInvoker(name)); + } else if (element instanceof ContextExtensibilityElement) { + ContextExtensibilityElement contextElement = (ContextExtensibilityElement) element; + injectors.add(contextElement.getInjector(contextFactory)); + }else if (element instanceof InjectorExtensibilityElement){ + InjectorExtensibilityElement injectorElement = (InjectorExtensibilityElement)element; + injectors.add(injectorElement.getInjector(contextFactory)); + } + } + contextFactory.setSetters(injectors); + return contextFactory; + } catch (BuilderException e) { + e.addContextName(name); + throw e; + } catch (NoSuchMethodException e) { + BuilderConfigException ce = new BuilderConfigException("Class does not have a no-arg constructor", e); + ce.setIdentifier(implClass.getName()); + ce.addContextName(name); + throw ce; + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/builder/JavaTargetWireBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/builder/JavaTargetWireBuilder.java new file mode 100644 index 0000000000..cc66fa54f6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/builder/JavaTargetWireBuilder.java @@ -0,0 +1,38 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.builder; + +import org.apache.tuscany.container.java.config.JavaContextFactory; +import org.apache.tuscany.container.java.invocation.ScopedJavaComponentInvoker; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.extension.WireBuilderSupport; +import org.apache.tuscany.core.wire.TargetInvoker; +import org.osoa.sca.annotations.Scope; + +import java.lang.reflect.Method; + +/** + * Completes a wire to a Java-based target component by adding a scoped java invoker to the source chain + * + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class JavaTargetWireBuilder extends WireBuilderSupport<JavaContextFactory> { + + protected TargetInvoker createInvoker(QualifiedName targetName, Method operation, ScopeContext context, boolean downScope) { + boolean cacheable = !downScope; + return new ScopedJavaComponentInvoker(targetName, operation, context,cacheable); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/config/JavaContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/config/JavaContextFactory.java new file mode 100644 index 0000000000..ff498d851a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/config/JavaContextFactory.java @@ -0,0 +1,341 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.config; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import commonj.sdo.DataObject; +import org.apache.tuscany.container.java.context.JavaAtomicContext; +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.builder.ContextCreationException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.builder.NoAccessorException; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.builder.impl.ArrayMultiplicityObjectFactory; +import org.apache.tuscany.core.builder.impl.ListMultiplicityObjectFactory; +import org.apache.tuscany.core.builder.impl.ProxyObjectFactory; +import org.apache.tuscany.core.config.JavaIntrospectionHelper; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.injection.EventInvoker; +import org.apache.tuscany.core.injection.FieldInjector; +import org.apache.tuscany.core.injection.Injector; +import org.apache.tuscany.core.injection.MethodInjector; +import org.apache.tuscany.core.injection.PojoObjectFactory; +import org.apache.tuscany.core.injection.SingletonObjectFactory; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.databinding.sdo.SDOObjectFactory; +import org.apache.tuscany.model.assembly.Scope; +import org.osoa.sca.annotations.Property; +import org.osoa.sca.annotations.Reference; + +/** + * A ContextFactory that handles POJO component implementation types + * + * @version $Rev$ $Date$ + */ +public class JavaContextFactory implements ContextFactory<AtomicContext>, ContextResolver { + + // the component name as configured in the hosting module + private String name; + + // the parent context of the component + private CompositeContext parentContext; + + private Map<String, TargetWireFactory> targetProxyFactories = new HashMap<String, TargetWireFactory>(); + + private List<SourceWireFactory> sourceProxyFactories = new ArrayList<SourceWireFactory>(); + + // the implementation type constructor + private Constructor<Object> ctr; + + private Set<Field> fields; + + private Set<Method> methods; + + // injectors for properties, references and other metadata values such as + private List<Injector> setters; + + // an invoker for a method decorated with @Init + private EventInvoker<Object> init; + + // whether the component should be eagerly initialized when its scope starts + private boolean eagerInit; + + // an invoker for a method decorated with @Destroy + private EventInvoker<Object> destroy; + + // the scope of the implementation instance + private Scope scope; + + // whether the component is stateless + private boolean stateless; + + /** + * Creates a new context factory + * + * @param name the SCDL name of the component the context refers to + * @param ctr the implementation type constructor + * @param scope the scope of the component implementation type + */ + public JavaContextFactory(String name, Constructor<Object> ctr, Scope scope) { + assert (name != null) : "Name was null"; + assert (ctr != null) : "Constructor was null"; + this.name = name; + this.ctr = ctr; + this.scope = scope; + stateless = (scope == Scope.INSTANCE); + fields = JavaIntrospectionHelper.getAllFields(ctr.getDeclaringClass()); + methods = JavaIntrospectionHelper.getAllUniqueMethods(ctr.getDeclaringClass()); + } + + public String getName() { + return name; + } + + public Scope getScope() { + return scope; + } + + public AtomicContext createContext() throws ContextCreationException { + PojoObjectFactory<?> objectFactory = new PojoObjectFactory<Object>(ctr, null, setters); + return new JavaAtomicContext(name, objectFactory, eagerInit, init, destroy, stateless); + } + + public void addTargetWireFactory(String serviceName, TargetWireFactory factory) { + targetProxyFactories.put(serviceName, factory); + } + + public TargetWireFactory getTargetWireFactory(String serviceName) { + return targetProxyFactories.get(serviceName); + } + + public Map<String, TargetWireFactory> getTargetWireFactories() { + return targetProxyFactories; + } + + public void addProperty(String propertyName, Object value) { + setters.add(createPropertyInjector(propertyName, value)); + } + + public void addSourceWireFactory(String referenceName, SourceWireFactory factory) { + sourceProxyFactories.add(factory); + setters.add(createReferenceInjector(referenceName, factory, false)); + } + + public void addSourceWireFactories(String referenceName, Class referenceInterface, List<SourceWireFactory> factories, boolean multiplicity) { + sourceProxyFactories.addAll(factories); + setters.add(createReferenceInjector(referenceName, factories, multiplicity)); + } + + public List<SourceWireFactory> getSourceWireFactories() { + return sourceProxyFactories; + } + + public void setSetters(List<Injector> setters) { + this.setters = setters; + } + + public void setEagerInit(boolean val) { + eagerInit = val; + } + + public void setInitInvoker(EventInvoker<Object> invoker) { + init = invoker; + } + + public void setDestroyInvoker(EventInvoker<Object> invoker) { + destroy = invoker; + } + + public void prepare(CompositeContext parent) { + parentContext = parent; + } + + public CompositeContext getCurrentContext() { + return parentContext; + } + + /** + * Creates an <code>Injector</code> for component properties + */ + private Injector createPropertyInjector(String propertyName, Object value) + throws NoAccessorException { + Class type = value.getClass(); + + // There is no efficient way to do this + Method method = null; + Field field = JavaIntrospectionHelper.findClosestMatchingField(propertyName, type, fields); + if (field == null) { + // hack for TUSCANY-322 + for (Field current : fields) { + Property annot = current.getAnnotation(Property.class); + if (annot != null) { + if (propertyName.equals(annot.name())) { + field = current; + break; + } + } + } + method = JavaIntrospectionHelper.findClosestMatchingMethod(propertyName, new Class[]{type}, methods); + if (method == null) { + // hack for TUSCANY-322 + for (Method current : methods) { + Property annot = current.getAnnotation(Property.class); + if (annot != null) { + if (propertyName.equals(annot.name())) { + method = current; + break; + } + } + } + if (method == null) { + throw new NoAccessorException(propertyName); + } + } + } + Injector injector = null; + if (value instanceof DataObject) { + if (field != null) { + injector = new FieldInjector(field, new SDOObjectFactory((DataObject) value)); + } else { + injector = new MethodInjector(method, new SDOObjectFactory((DataObject) value)); + } + } else if (JavaIntrospectionHelper.isImmutable(type)) { + if (field != null) { + injector = new FieldInjector(field, new SingletonObjectFactory<Object>(value)); + } else { + injector = new MethodInjector(method, new SingletonObjectFactory<Object>(value)); + } + } + return injector; + + } + + /** + * Creates proxy factories that represent target(s) of a reference and an <code>Injector</code> + * responsible for injecting them into the reference + */ + private Injector createReferenceInjector(String refName, List<SourceWireFactory> wireFactories, boolean multiplicity) { + Class refClass = wireFactories.get(0).getBusinessInterface(); //reference.getPort().getServiceContract().getInterface(); + // iterate through the targets + List<ObjectFactory> objectFactories = new ArrayList<ObjectFactory>(); + for (SourceWireFactory wireFactory : wireFactories) { + objectFactories.add(new ProxyObjectFactory(wireFactory)); + } + return createInjector(refName, refClass, multiplicity, objectFactories, fields, methods); + + } + + private Injector createReferenceInjector(String refName, SourceWireFactory wireFactory, boolean multiplicity) { + Class refClass = wireFactory.getBusinessInterface();//reference.getPort().getServiceContract().getInterface(); + List<ObjectFactory> objectFactories = new ArrayList<ObjectFactory>(); + objectFactories.add(new ProxyObjectFactory(wireFactory)); + return createInjector(refName, refClass, multiplicity, objectFactories, fields, methods); + + } + + /** + * Creates an <code>Injector</code> for a set of object factories associated with a reference. + */ + private Injector createInjector(String refName, Class refClass, boolean multiplicity, List<ObjectFactory> objectFactories, + Set<Field> fields, Set<Method> methods) throws NoAccessorException, BuilderConfigException { + Field field; + Method method = null; + if (multiplicity) { + // since this is a multiplicity, we cannot match on business interface type, so scan through the fields, + // matching on name and List or Array + field = JavaIntrospectionHelper.findMultiplicityFieldByName(refName, fields); + if (field == null) { + // No fields found. Again, since this is a multiplicity, we cannot match on business interface type, so + // scan through the fields, matching on name and List or Array + method = JavaIntrospectionHelper.findMultiplicityMethodByName(refName, methods); + if (method == null) { + throw new NoAccessorException(refName); + } + } + Injector injector; + // for multiplicities, we need to inject the reference proxy or proxies using an object factory + // which first delegates to create the proxies and then returns them in the appropriate List or array type + if (field != null) { + if (field.getType().isArray()) { + injector = new FieldInjector(field, new ArrayMultiplicityObjectFactory(refClass, objectFactories)); + } else { + injector = new FieldInjector(field, new ListMultiplicityObjectFactory(objectFactories)); + } + } else { + if (method.getParameterTypes()[0].isArray()) { + injector = new MethodInjector(method, new ArrayMultiplicityObjectFactory(refClass, objectFactories)); + } else { + injector = new MethodInjector(method, new ListMultiplicityObjectFactory(objectFactories)); + } + } + return injector; + } else { + field = JavaIntrospectionHelper.findClosestMatchingField(refName, refClass, fields); + if (field == null) { + // hack for TUSCANY-300 + for (Field current : fields) { + Reference annot = current.getAnnotation(Reference.class); + if (annot != null) { + if (refName.equals(annot.name())) { + field = current; + break; + } + } + } + if (field == null) { + method = JavaIntrospectionHelper.findClosestMatchingMethod(refName, new Class[]{refClass}, methods); + if(method == null){ + // Fix for Tuscany-325 + method = JavaIntrospectionHelper.findClosestMatchingMethod("set"+refName.substring(0,1).toUpperCase()+ refName.substring(1), new Class[]{refClass}, methods); + } + if (method == null) { + // hack for TUSCANY-300 + for (Method current : methods) { + Reference annot = current.getAnnotation(Reference.class); + if (annot != null) { + if (refName.equals(annot.name())) { + method = current; + break; + } + } + } + if (method == null) { + throw new NoAccessorException(refName); + } + } + } + } + Injector injector; + if (field != null) { + injector = new FieldInjector(field, objectFactories.get(0)); + } else { + injector = new MethodInjector(method, objectFactories.get(0)); + } + return injector; + } + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/context/JavaAtomicContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/context/JavaAtomicContext.java new file mode 100644 index 0000000000..27581198aa --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/context/JavaAtomicContext.java @@ -0,0 +1,165 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.context; + +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.ContextInitException; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.context.event.InstanceCreated; +import org.apache.tuscany.core.context.impl.AbstractContext; +import org.apache.tuscany.core.injection.EventInvoker; +import org.apache.tuscany.core.injection.ObjectCallbackException; +import org.apache.tuscany.core.injection.ObjectCreationException; + +/** + * Manages Java component implementation instances + * + * @version $Rev$ $Date$ + */ +public class JavaAtomicContext extends AbstractContext implements AtomicContext { + + private boolean eagerInit; + + private EventInvoker<Object> initInvoker; + + private EventInvoker<Object> destroyInvoker; + + private boolean stateless; + + // the cached target instance + private Object cachedTargetInstance; + + // creates a new implementation instance with injected references and properties + private ObjectFactory objectFactory; + + public JavaAtomicContext(String name, ObjectFactory objectFactory, boolean eagerInit, EventInvoker<Object> initInvoker, + EventInvoker<Object> destroyInvoker, boolean stateless) { + super(name); + assert (objectFactory != null) : "Object factory was null"; + if (eagerInit && initInvoker == null) { + ContextInitException e = new ContextInitException("No intialization method found for implementation"); + e.setIdentifier(getName()); + throw e; + } + this.objectFactory = objectFactory; + + this.eagerInit = eagerInit; + this.initInvoker = initInvoker; + this.destroyInvoker = destroyInvoker; + this.stateless = stateless; + } + + public void setName(String name) { + super.setName(name); + } + + protected int type; + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public void init() throws TargetException { + getInstance(null); + } + + public void destroy() throws TargetException { + if (cachedTargetInstance != null) { + if (destroyInvoker != null) { + try { + destroyInvoker.invokeEvent(cachedTargetInstance); + } catch (ObjectCallbackException e) { + TargetException te = new TargetException(e.getCause()); + te.setIdentifier(getName()); + throw te; + } + } + } + lifecycleState = STARTED; + } + + public synchronized Object getInstance(QualifiedName qName) throws TargetException { + //TODO implement returning of proxy and wire chain for service + if (cachedTargetInstance != null) { + return cachedTargetInstance; // already cached, just return + } + + if (getLifecycleState() == ERROR || getLifecycleState() == CONFIG_ERROR) { + return null; + } + synchronized (this) { + try { + Object instance = objectFactory.getInstance(); + // handle @Init + if (initInvoker != null) { + initInvoker.invokeEvent(instance); + } + publish(new InstanceCreated(this)); + lifecycleState = RUNNING; + if (stateless) { + return instance; + } else { + cachedTargetInstance = instance; // cache the instance + return cachedTargetInstance; + } + } catch (ObjectCreationException e) { + lifecycleState = ERROR; + TargetException te = new TargetException("Error creating component instance", e); + te.setIdentifier(getName()); + throw te; + } + } + + } + + public Object getTargetInstance() throws TargetException { + //TODO refactor when getInstance() returns a proxy + return getInstance(null); + } + + public boolean isEagerInit() { + return eagerInit; + } + + public boolean isDestroyable() { + return (destroyInvoker != null); + } + + public void start() throws ContextInitException { + if (getLifecycleState() != UNINITIALIZED && getLifecycleState() != STOPPED) { + throw new IllegalStateException("Context must be in UNINITIALIZED state [" + getLifecycleState() + "]"); + } + if (objectFactory == null) { + lifecycleState = ERROR; + ContextInitException e = new ContextInitException("Object factory not found"); + e.setIdentifier(getName()); + throw e; + } + lifecycleState = INITIALIZED; + } + + public void stop() { + lifecycleState = STOPPED; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/invocation/AbstractJavaComponentInvoker.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/invocation/AbstractJavaComponentInvoker.java new file mode 100644 index 0000000000..33fa9238b6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/invocation/AbstractJavaComponentInvoker.java @@ -0,0 +1,93 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.invocation; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Set; + +import org.apache.tuscany.core.config.JavaIntrospectionHelper; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.wire.Interceptor; +import org.apache.tuscany.core.wire.InvocationRuntimeException; +import org.apache.tuscany.core.wire.TargetInvoker; +import org.apache.tuscany.core.message.Message; + +/** + * Base class for dispatching to a Java based component implementation. Subclasses implement a strategy for resolving + * implementation instances. + * + * @version $Rev$ $Date$ + */ +public abstract class AbstractJavaComponentInvoker implements TargetInvoker { + + protected Method operation; + + public AbstractJavaComponentInvoker(Method operation) { + assert (operation != null) : "Operation method cannot be null"; + this.operation = operation; + } + + public Object invokeTarget(Object payload) throws InvocationTargetException { + try { + Object instance = getInstance(); + if (!operation.getDeclaringClass().isInstance(instance)) { + Set<Method> methods = JavaIntrospectionHelper.getAllUniqueMethods(instance.getClass()); + Method newOperation = JavaIntrospectionHelper.findClosestMatchingMethod(operation.getName(), operation + .getParameterTypes(), methods); + if (newOperation != null) + operation = newOperation; + } + if (payload != null && !payload.getClass().isArray()) { + return operation.invoke(instance, payload); + } else { + return operation.invoke(instance, (Object[]) payload); + } + } catch (IllegalAccessException e) { + throw new InvocationRuntimeException(e); + } + } + + public Message invoke(Message msg) { + try { + Object resp = invokeTarget(msg.getBody()); + msg.setBody(resp); + } catch (InvocationTargetException e) { + msg.setBody(e.getCause()); + } catch (Throwable e) { + msg.setBody(e); + } + return msg; + } + + protected abstract Object getInstance() throws TargetException; + + public void setNext(Interceptor next) { + throw new IllegalStateException("This interceptor must be the last interceptor in an interceptor chain"); + } + + @Override + public Object clone() throws CloneNotSupportedException { + try { + AbstractJavaComponentInvoker clone = (AbstractJavaComponentInvoker) super.clone(); + clone.operation = this.operation; + return clone; + } catch (CloneNotSupportedException e) { + return null; // will not happen + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/invocation/ScopedJavaComponentInvoker.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/invocation/ScopedJavaComponentInvoker.java new file mode 100644 index 0000000000..85d72b4b0d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/invocation/ScopedJavaComponentInvoker.java @@ -0,0 +1,89 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.invocation; + +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.context.TargetException; + +import java.lang.reflect.Method; + +/** + * Uses a scope container to resolve an implementation instance based on the current thread context + * + * @version $Rev$ $Date$ + */ +public class ScopedJavaComponentInvoker extends AbstractJavaComponentInvoker { + + private ScopeContext container; + + private QualifiedName name; + + private Object target; + + public boolean cacheable; + + + /** + * Creates a new invoker + * + * @param serviceName the name of the component/service pair to invoke + * @param operation the operation the invoker is associated with + * @param scopeContext the scope context the component is resolved in + * @param cacheable Sets whether the target service instance may be cached by the invoker. This is a possible optimization + * when a wire is configured for a "down-scope" reference, i.e. a reference from a source of a shorter + * lifetime to a source of greater lifetime. + */ + public ScopedJavaComponentInvoker(QualifiedName serviceName, Method operation, ScopeContext scopeContext, boolean cacheable) { + super(operation); + assert (serviceName != null) : "No service name specified"; + assert (scopeContext != null) : "No scope scopeContext specified"; + name = serviceName; + this.container = scopeContext; + this.cacheable = cacheable; + } + + /** + * Returns whether the target is cacheable. + */ + public boolean isCacheable() { + return cacheable; + } + + /** + * Resolves the target service instance or returns a cached one + */ + protected Object getInstance() throws TargetException { + if (!cacheable) { + return container.getInstance(name); + } else { + if (target == null) { + target = container.getInstance(name); + } + return target; + } + } + + public Object clone() throws CloneNotSupportedException { + ScopedJavaComponentInvoker invoker = (ScopedJavaComponentInvoker) super.clone(); + invoker.target = null; + invoker.cacheable = this.cacheable; + invoker.container = this.container; + invoker.name = this.name; + return invoker; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/invocation/StaticJavaComponentTargetInvoker.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/invocation/StaticJavaComponentTargetInvoker.java new file mode 100644 index 0000000000..dd757137cf --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/invocation/StaticJavaComponentTargetInvoker.java @@ -0,0 +1,50 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.invocation; + +import java.lang.reflect.Method; + +/** + * Caches component instances that do not need to be resolved for every wire, e.g. an wire originating from + * a lesser scope intended for a target with a wider scope + * + * @version $Rev$ $Date$ + */ +public class StaticJavaComponentTargetInvoker extends AbstractJavaComponentInvoker { + + private Object instance; + + public StaticJavaComponentTargetInvoker(Method operation, Object instance) { + super(operation); + assert (instance != null) : "Instance cannot be null"; + this.instance = instance; + } + + protected Object getInstance() { + return instance; + } + + public boolean isCacheable() { + return true; + } + + public Object clone() throws CloneNotSupportedException { + StaticJavaComponentTargetInvoker invoker = (StaticJavaComponentTargetInvoker) super.clone(); + invoker.instance = null; + return invoker; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/loader/JavaImplementationLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/loader/JavaImplementationLoader.java new file mode 100644 index 0000000000..db3dd07c98 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/java/org/apache/tuscany/container/java/loader/JavaImplementationLoader.java @@ -0,0 +1,165 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.container.java.loader; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import javax.xml.namespace.QName; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.container.java.assembly.JavaAssemblyFactory; +import org.apache.tuscany.container.java.assembly.JavaImplementation; +import org.apache.tuscany.core.config.ComponentTypeIntrospector; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.InvalidRootElementException; +import org.apache.tuscany.core.config.JavaIntrospectionHelper; +import org.apache.tuscany.core.config.SidefileLoadException; +import org.apache.tuscany.core.config.processor.ProcessorUtils; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.core.loader.StAXElementLoader; +import org.apache.tuscany.core.loader.StAXLoaderRegistry; +import org.apache.tuscany.core.loader.assembly.AssemblyConstants; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.model.assembly.ComponentType; +import org.osoa.sca.annotations.Destroy; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Scope; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class JavaImplementationLoader implements StAXElementLoader<JavaImplementation> { + public static final QName IMPLEMENTATION_JAVA = new QName("http://www.osoa.org/xmlns/sca/0.9", "implementation.java"); + + private StAXLoaderRegistry registry; + private XMLInputFactory xmlFactory; + + private JavaAssemblyFactory factory; + private ComponentTypeIntrospector introspector; + + public JavaImplementationLoader() { + // todo make this a reference to a system service + xmlFactory = XMLInputFactory.newInstance(); + } + + @Autowire + public void setRegistry(StAXLoaderRegistry registry) { + this.registry = registry; + } + + @Autowire + public void setFactory(JavaAssemblyFactory factory) { + this.factory = factory; + //FIXME JFM HACK + introspector = ProcessorUtils.createCoreIntrospector(factory); + } + + @Init(eager = true) + public void start() { + registry.registerLoader(IMPLEMENTATION_JAVA, this); + } + + @Destroy + public void stop() { + registry.unregisterLoader(IMPLEMENTATION_JAVA, this); + } + + public JavaImplementation load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + JavaImplementation javaImpl = factory.createJavaImplementation(); + String typeName = reader.getAttributeValue(null, "class"); + Class<?> implementationClass = getImplementationClass(loaderContext.getResourceLoader(), typeName); + javaImpl.setImplementationClass(implementationClass); + javaImpl.setComponentType(loadComponentType(loaderContext, implementationClass)); + return javaImpl; + } + + protected Class<?> getImplementationClass(ResourceLoader resourceLoader, String typeName) throws ConfigurationLoadException { + ClassLoader oldCL = Thread.currentThread().getContextClassLoader(); + try { + // set TCCL in case the application code needs it + Thread.currentThread().setContextClassLoader(resourceLoader.getClassLoader()); + return resourceLoader.loadClass(typeName); + } catch (ClassNotFoundException e) { + throw new ConfigurationLoadException(e.getMessage(), e); + } finally { + Thread.currentThread().setContextClassLoader(oldCL); + } + } + + protected ComponentType loadComponentType(LoaderContext loaderContext, Class<?> implClass) throws ConfigurationLoadException, XMLStreamException { + String baseName = JavaIntrospectionHelper.getBaseName(implClass); + URL sidefile = implClass.getResource(baseName + ".componentType"); + if (sidefile == null) { + return loadComponentTypeByIntrospection(implClass); + } else { + return loadComponentTypeFromSidefile(sidefile, loaderContext); + } + } + + protected ComponentType loadComponentTypeByIntrospection(Class<?> implClass) throws ConfigurationLoadException { + return introspector.introspect(implClass); + } + + protected ComponentType loadComponentTypeFromSidefile(URL sidefile, LoaderContext loaderContext) throws SidefileLoadException { + try { + XMLStreamReader reader; + InputStream is; + is = sidefile.openStream(); + try { + reader = xmlFactory.createXMLStreamReader(is); + try { + reader.nextTag(); + if (!AssemblyConstants.COMPONENT_TYPE.equals(reader.getName())) { + InvalidRootElementException e = new InvalidRootElementException(AssemblyConstants.COMPONENT_TYPE, reader.getName()); + e.setResourceURI(sidefile.toString()); + throw e; + } + return (ComponentType) registry.load(reader, loaderContext); + } finally { + try { + reader.close(); + } catch (XMLStreamException e) { + // ignore + } + } + } finally { + try { + is.close(); + } catch (IOException e) { + // ignore + } + } + } catch (IOException e) { + SidefileLoadException sfe = new SidefileLoadException(e.getMessage()); + sfe.setResourceURI(sidefile.toString()); + throw sfe; + } catch (XMLStreamException e) { + SidefileLoadException sfe = new SidefileLoadException(e.getMessage()); + sfe.setResourceURI(sidefile.toString()); + throw sfe; + } catch (ConfigurationLoadException e) { + SidefileLoadException sfe = new SidefileLoadException(e.getMessage()); + sfe.setResourceURI(sidefile.toString()); + throw sfe; + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/resources/org/apache/tuscany/container/java/Messages.properties b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/resources/org/apache/tuscany/container/java/Messages.properties new file mode 100644 index 0000000000..4581e44bff --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/resources/org/apache/tuscany/container/java/Messages.properties @@ -0,0 +1,25 @@ +# Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. +# +# Licensed 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. +# ==================================================================== +# To code developer: +# Do NOT change the properties between this line and the +# "%%% END OF TRANSLATED PROPERTIES %%%" line. +# Make a new property name, append to the end of the file and change +# the code to use the new property. +# ==================================================================== + +# ===================================================================== +# %%% END OF TRANSLATED PROPERTIES %%% +# ===================================================================== +# NLS_MESSAGEFORMAT_ALL diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/resources/system.fragment b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/resources/system.fragment new file mode 100644 index 0000000000..6aab9b8510 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/resources/system.fragment @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<moduleFragment xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:tuscany="http://org.apache.tuscany/xmlns/system/0.9"
+ name="org.apache.tuscany.container.java">
+
+ <component name="org.apache.tuscany.container.java.builder.JavaContextFactoryBuilder">
+ <tuscany:implementation.system class="org.apache.tuscany.container.java.builder.JavaContextFactoryBuilder"/>
+ </component>
+ <component name="org.apache.tuscany.core.config.ComponentTypeIntrospector">
+ <tuscany:implementation.system class="org.apache.tuscany.core.config.impl.Java5ComponentTypeIntrospector"/>
+ </component>
+
+
+ <component name="org.apache.tuscany.container.java.builder.JavaTargetWireBuilder">
+ <tuscany:implementation.system class="org.apache.tuscany.container.java.builder.JavaTargetWireBuilder"/>
+ </component>
+
+ <component name="org.apache.tuscany.container.java.assembly.JavaAssemblyFactory">
+ <tuscany:implementation.system class="org.apache.tuscany.container.java.assembly.impl.JavaAssemblyFactoryImpl"/>
+ </component>
+
+ <component name="org.apache.tuscany.container.java.loader.JavaImplementationLoader">
+ <tuscany:implementation.system class="org.apache.tuscany.container.java.loader.JavaImplementationLoader"/>
+ </component>
+
+</moduleFragment>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/test/sca.module b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/test/sca.module new file mode 100644 index 0000000000..1c1ddafb53 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/main/test/sca.module @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+
+ name="sample.myvaluemodule">
+ <!--
+ <entryPoint name="MyValueService">
+ <interface.java interface="services.myvalue.MyValueService"/>
+ <binding.ws port="http://webservice.myvalue#wsdl.endpoint(MyValueService/MyValueWebService)"/>
+ <reference>MyValueServiceComponent</reference>
+ </entryPoint>
+
+ <component name="MyValueServiceComponent">
+ <implementation.java class="services.myvalue.MyValueServiceImpl"/>
+ <properties>
+ <v:currency>EURO</v:currency>
+ </properties>
+ <references>
+ <v:customerService>CustomerServiceComponent</v:customerService>
+ <v:stockQuoteService>StockQuoteMediatorComponent</v:stockQuoteService>
+ </references>
+ </component>
+
+ <component name="StockQuoteMediatorComponent">
+ <implementation.java class="services.mediator.StockQuoteMediatorImpl"/>
+ <references>
+ <v:stockQuoteService>StockQuoteService</v:stockQuoteService>
+ </references>
+ </component>
+
+ <component name="CustomerServiceComponent">
+ <implementation.java class="services.customer.CustomerServiceImpl"/>
+ </component>
+
+ <component name="StockQuoteService">
+ <implementation.java class="services.stockquote.StockQuoteServiceImpl"/>
+ </component>
+ -->
+ <component name="TestService">
+ <implementation.java class="test.org.apache.tuscany.container.java.components.ModuleScopeComponentImpl"/>
+ <properties>
+ <v:foo>MyFoo</v:foo>
+ <v:mInt>1</v:mInt>
+ </properties>
+ <references>
+ <v:mGenericComponent>TestService2</v:mGenericComponent>
+ </references>
+ </component>
+ <component name="TestService2">
+ <implementation.java class="test.org.apache.tuscany.container.java.components.ModuleScopeComponentImpl"/>
+ </component>
+
+ <!--
+ <externalService name="StockQuoteService">
+ <interface.java interface="services.stockquote.StockQuoteService"/>
+ <binding.ws port="http://webservice.stockquote#wsdl.endpoint(StockQuoteService/StockQuoteWebService)"/>
+ </externalService>
+ -->
+
+</module>
+
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/HelloWorldImpl.componentType b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/HelloWorldImpl.componentType new file mode 100644 index 0000000000..784d8bf728 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/HelloWorldImpl.componentType @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9" + xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <service name="HelloWorldService">
+ <interface.java interface="org.apache.tuscany.container.java.assembly.mock.HelloWorldService" remoteable="true"/>
+ </service>
+ <property name="text" type="xsd:string"/>
+</componentType>
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/HelloWorldImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/HelloWorldImpl.java new file mode 100644 index 0000000000..74f4c658ce --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/HelloWorldImpl.java @@ -0,0 +1,36 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.mock; + +/** + * @version $Rev$ $Date$ + */ +public class HelloWorldImpl implements HelloWorldService { + + private String text; + + private int count; + + public String hello(String name) { + ++count; + return "Hello " + name; + } + + public int count() { + return count; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/HelloWorldService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/HelloWorldService.java new file mode 100644 index 0000000000..a7d0fe7788 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/HelloWorldService.java @@ -0,0 +1,27 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.mock; + +/** + * @version $Rev$ $Date$ + */ +public interface HelloWorldService { + String hello(String name); + + public int count(); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/HelloWorldWithFieldProperties.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/HelloWorldWithFieldProperties.java new file mode 100644 index 0000000000..0801c56f44 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/HelloWorldWithFieldProperties.java @@ -0,0 +1,40 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.mock; + +import org.osoa.sca.annotations.Property; + +/** + * @version $Rev$ $Date$ + */ +public class HelloWorldWithFieldProperties { + @Property + protected String text; + + @Property(required = true) + public Integer text2; + + @Property(name = "foo") + public int text3; + + @Property(name = "not exposed") + protected int field4; + + public String hello(String name) { + return "Hello " + name; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/NakedHelloWorld.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/NakedHelloWorld.java new file mode 100644 index 0000000000..2f1ae5d17b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/NakedHelloWorld.java @@ -0,0 +1,26 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.mock; + +/** + * @version $Rev$ $Date$ + */ +public class NakedHelloWorld { + public String hello(String name) { + return "Hello " + name; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/NakedHelloWorldWithInterface.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/NakedHelloWorldWithInterface.java new file mode 100644 index 0000000000..9d5fe5e969 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/mock/NakedHelloWorldWithInterface.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.mock; + +import java.io.Serializable; + +/** + * @version $Rev$ $Date$ + */ +public class NakedHelloWorldWithInterface implements Serializable { + public String hello(String name) { + return "Hello " + name; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/account/AccountReport.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/account/AccountReport.java new file mode 100644 index 0000000000..1770c2b011 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/account/AccountReport.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.tests.bigbank.account.services.account; + +import java.util.List; + +/** + * @model + */ + +public interface AccountReport { + + /** + * @model type="services.account.AccountSummary" + */ + + List getAccountSummaries(); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/account/AccountService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/account/AccountService.java new file mode 100644 index 0000000000..1bb938655f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/account/AccountService.java @@ -0,0 +1,25 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.tests.bigbank.account.services.account; + +import org.osoa.sca.annotations.Remotable; + +@Remotable +public interface AccountService { + + public AccountReport getAccountReport(String customerID); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/account/AccountService.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/account/AccountService.wsdl new file mode 100644 index 0000000000..022258f2c5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/account/AccountService.wsdl @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:tns="http://www.bigbank.com/AccountService/"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://www.bigbank.com/AccountService/"
+
+ name="AccountService">
+
+ <wsdl:types>
+ <xsd:schema targetNamespace="http://www.bigbank.com/AccountService/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <xsd:element name="customerID" type="xsd:string"/>
+ <xsd:element name="getAccountReportResponse" type="tns:AccountReport"/>
+
+ <xsd:complexType name="AccountReport">
+ <xsd:sequence>
+ <xsd:element name="accountSummary" type="tns:AccountSummary" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ <xsd:complexType name="AccountSummary">
+ <xsd:sequence>
+ <xsd:element name="accountNumber" type="xsd:string"/>
+ <xsd:element name="accountType" type="xsd:string"/>
+ <xsd:element name="balance" type="xsd:float"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ </xsd:schema>
+ </wsdl:types>
+ <wsdl:message name="getAccountReportRequest">
+ <wsdl:part element="tns:customerID" name="getAccountReportRequest"/>
+ </wsdl:message>
+ <wsdl:message name="getAccountReportResponse">
+ <wsdl:part element="tns:getAccountReportResponse" name="getAccountReportResponse"/>
+ </wsdl:message>
+ <wsdl:portType name="AccountService">
+ <wsdl:operation name="getAccountReport">
+ <wsdl:input message="tns:getAccountReportRequest"/>
+ <wsdl:output message="tns:getAccountReportResponse"/>
+ </wsdl:operation>
+ </wsdl:portType>
+ <wsdl:binding name="AccountServiceSOAP" type="tns:AccountService">
+ <soap:binding style="document"
+ transport="http://schemas.xmlsoap.org/soap/http"/>
+ <wsdl:operation name="getAccountReport">
+ <soap:operation
+ soapAction="http://www.bigbank.com/AccountService/getAccountReport"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:service name="AccountService">
+ <wsdl:port binding="tns:AccountServiceSOAP"
+ name="AccountServiceSOAP">
+ <soap:address location="http://localhost:8080/tuscany-container-java/services/AccountService"/>
+ </wsdl:port>
+ </wsdl:service>
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/account/AccountServiceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/account/AccountServiceImpl.java new file mode 100644 index 0000000000..9a5ddb0005 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/account/AccountServiceImpl.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.tests.bigbank.account.services.account; + +import org.osoa.sca.annotations.Property; +import org.osoa.sca.annotations.Reference; + +import org.apache.tuscany.container.java.assembly.tests.bigbank.account.services.accountdata.AccountDataService; +import org.apache.tuscany.container.java.assembly.tests.bigbank.account.services.stockquote.StockQuoteService; + +public class AccountServiceImpl implements AccountService { + + @Property + public String currency = "USD"; + + @Reference + public AccountDataService accountDataService; + @Reference + public StockQuoteService stockQuoteService; + + public AccountServiceImpl() { + } + + public AccountReport getAccountReport(String customerID) { + return null; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/account/AccountSummary.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/account/AccountSummary.java new file mode 100644 index 0000000000..2b11e23425 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/account/AccountSummary.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.tests.bigbank.account.services.account; + +/** + * @model + */ + +public interface AccountSummary { + + /** + * @model + */ + String getAccountNumber(); + + void setAccountNumber(String accountNumber); + + /** + * @model + */ + String getAccountType(); + + void setAccountType(String accountType); + + /** + * @model + */ + float getBalance(); + + void setBalance(float balance); +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/accountdata/AccountDataService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/accountdata/AccountDataService.java new file mode 100644 index 0000000000..56f24ea4ac --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/accountdata/AccountDataService.java @@ -0,0 +1,26 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.tests.bigbank.account.services.accountdata; + +public interface AccountDataService { + + CheckingAccount getCheckingAccount(String customerID); + + SavingsAccount getSavingsAccount(String customerID); + + StockAccount getStockAccount(String customerID); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/accountdata/AccountDataServiceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/accountdata/AccountDataServiceImpl.java new file mode 100644 index 0000000000..a7a40f954d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/accountdata/AccountDataServiceImpl.java @@ -0,0 +1,48 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.tests.bigbank.account.services.accountdata; + +public class AccountDataServiceImpl implements AccountDataService { + + public CheckingAccount getCheckingAccount(String customerID) { + + CheckingAccount checkingAccount = new CheckingAccount(); + checkingAccount.setAccountNumber(customerID + "_" + "CHA12345"); + checkingAccount.setBalance(1500.0f); + + return checkingAccount; + } + + public SavingsAccount getSavingsAccount(String customerID) { + + SavingsAccount savingsAccount = new SavingsAccount(); + savingsAccount.setAccountNumber(customerID + "_" + "SAA12345"); + savingsAccount.setBalance(1500.0f); + + return savingsAccount; + } + + public StockAccount getStockAccount(String customerID) { + + StockAccount stockAccount = new StockAccount(); + stockAccount.setAccountNumber(customerID + "_" + "STA12345"); + stockAccount.setSymbol("IBM"); + stockAccount.setQuantity(100); + + return stockAccount; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/accountdata/CheckingAccount.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/accountdata/CheckingAccount.java new file mode 100644 index 0000000000..ff84e9968a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/accountdata/CheckingAccount.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.tests.bigbank.account.services.accountdata; + +public class CheckingAccount { + + private String accountNumber; + private float balance; + + public String getAccountNumber() { + return accountNumber; + } + + public void setAccountNumber(String accountNumber) { + this.accountNumber = accountNumber; + } + + public float getBalance() { + return balance; + } + + public void setBalance(float balance) { + this.balance = balance; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/accountdata/SavingsAccount.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/accountdata/SavingsAccount.java new file mode 100644 index 0000000000..b39d9051de --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/accountdata/SavingsAccount.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.tests.bigbank.account.services.accountdata; + +public class SavingsAccount { + + private String accountNumber; + private float balance; + + public String getAccountNumber() { + return accountNumber; + } + + public void setAccountNumber(String accountNumber) { + this.accountNumber = accountNumber; + } + + public float getBalance() { + return balance; + } + + public void setBalance(float balance) { + this.balance = balance; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/accountdata/StockAccount.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/accountdata/StockAccount.java new file mode 100644 index 0000000000..bce0821b25 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/accountdata/StockAccount.java @@ -0,0 +1,48 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.tests.bigbank.account.services.accountdata; + +public class StockAccount { + + private String accountNumber; + private String symbol; + private int quantity; + + public String getAccountNumber() { + return accountNumber; + } + + public void setAccountNumber(String accountNumber) { + this.accountNumber = accountNumber; + } + + public int getQuantity() { + return quantity; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/stockquote/StockQuoteService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/stockquote/StockQuoteService.java new file mode 100644 index 0000000000..78ece12b41 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/stockquote/StockQuoteService.java @@ -0,0 +1,24 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.tests.bigbank.account.services.stockquote; + +public interface StockQuoteService { + + public float getQuote(String symbol); +} + +
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/stockquote/StockQuoteServiceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/stockquote/StockQuoteServiceImpl.java new file mode 100644 index 0000000000..fa180d0ceb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/stockquote/StockQuoteServiceImpl.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.assembly.tests.bigbank.account.services.stockquote; + +/* Dummy'd up StockQuoteService, override webservice for now */ + +public class StockQuoteServiceImpl implements StockQuoteService { + + public float getQuote(String symbol) { + // Just hardcode for now + return 83.00f; + } + +}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/stockquote/StockQuoteWebService.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/stockquote/StockQuoteWebService.wsdl new file mode 100644 index 0000000000..6af61ef80e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/bigbank/account/services/stockquote/StockQuoteWebService.wsdl @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<wsdl:definitions targetNamespace="http://webservice.stockquote" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://webservice.stockquote" xmlns:intf="http://webservice.stockquote" xmlns:tns1="http://stockquote" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="stockquote">
+ <!--WSDL created by Apache Axis version: 1.2.1
+Built on Jun 14, 2005 (09:15:57 EDT)-->
+ <wsdl:types>
+ <schema elementFormDefault="qualified" targetNamespace="http://stockquote" xmlns="http://www.w3.org/2001/XMLSchema">
+ <complexType name="GetQuoteRequest">
+ <sequence>
+ <element name="symbol" nillable="true" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ <complexType name="GetQuoteResponse">
+ <sequence>
+ <element name="price" type="xsd:float"/>
+ </sequence>
+ </complexType>
+ </schema>
+ <schema elementFormDefault="qualified" targetNamespace="http://webservice.stockquote" xmlns="http://www.w3.org/2001/XMLSchema">
+ <import namespace="http://stockquote"/>
+ <element name="request" type="tns1:GetQuoteRequest"/>
+ <element name="getQuoteReturn" type="tns1:GetQuoteResponse"/>
+ </schema>
+ </wsdl:types>
+
+ <wsdl:message name="getQuoteResponse">
+
+ <wsdl:part element="impl:getQuoteReturn" name="getQuoteReturn"/>
+
+ </wsdl:message>
+
+ <wsdl:message name="getQuoteRequest">
+
+ <wsdl:part element="impl:request" name="request"/>
+
+ </wsdl:message>
+
+ <wsdl:portType name="StockQuoteWebService">
+
+ <wsdl:operation name="getQuote" parameterOrder="request">
+
+ <wsdl:input message="impl:getQuoteRequest" name="getQuoteRequest"/>
+
+ <wsdl:output message="impl:getQuoteResponse" name="getQuoteResponse"/>
+
+ </wsdl:operation>
+
+ </wsdl:portType>
+
+ <wsdl:binding name="StockQuoteWebServiceSoapBinding" type="impl:StockQuoteWebService">
+
+ <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+
+ <wsdl:operation name="getQuote">
+
+ <wsdlsoap:operation soapAction=""/>
+
+ <wsdl:input name="getQuoteRequest">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:input>
+
+ <wsdl:output name="getQuoteResponse">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:output>
+
+ </wsdl:operation>
+
+ </wsdl:binding>
+
+ <wsdl:service name="StockQuoteWebServiceService">
+
+ <wsdl:port binding="impl:StockQuoteWebServiceSoapBinding" name="StockQuoteWebService">
+
+ <wsdlsoap:address location="http://localhost:8123/StockQuoteWebService/services/StockQuoteWebService"/>
+
+ </wsdl:port>
+
+ </wsdl:service>
+
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/builder/JavaContextFactoryBuilderTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/builder/JavaContextFactoryBuilderTestCase.java new file mode 100644 index 0000000000..fcfd320e0e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/builder/JavaContextFactoryBuilderTestCase.java @@ -0,0 +1,112 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.builder; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.container.java.invocation.mock.MockSyncInterceptor; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.GenericComponent; +import org.apache.tuscany.container.java.mock.components.ModuleScopeComponent; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.system.PolicyBuilderRegistry; +import org.apache.tuscany.core.builder.system.DefaultPolicyBuilderRegistry; +import org.apache.tuscany.core.builder.impl.DefaultWireBuilder; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.DefaultScopeStrategy; +import org.apache.tuscany.core.context.scope.ModuleScopeContext; +import org.apache.tuscany.core.context.ScopeStrategy; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.wire.WireConfiguration; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.service.WireFactoryService; +import org.apache.tuscany.core.wire.service.DefaultWireFactoryService; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.Module; + +public class JavaContextFactoryBuilderTestCase extends TestCase { + + public JavaContextFactoryBuilderTestCase() { + } + + public void testBuilder() throws Exception { + MockSyncInterceptor mockInterceptor = new MockSyncInterceptor(); + MockInterceptorBuilder interceptorBuilder = new MockInterceptorBuilder(mockInterceptor, true); + PolicyBuilderRegistry policyRegistry = new DefaultPolicyBuilderRegistry(); + policyRegistry.registerSourceBuilder(interceptorBuilder); + WireFactoryService wireService = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), policyRegistry); + JavaContextFactoryBuilder builder = new JavaContextFactoryBuilder(wireService); + + JavaTargetWireBuilder javaWireBuilder = new JavaTargetWireBuilder(); + ScopeStrategy strategy = new DefaultScopeStrategy(); + DefaultWireBuilder wireBuilder = new DefaultWireBuilder(); + wireBuilder.addWireBuilder(javaWireBuilder); + Module module = MockFactory.createModule(); + EventContext eCtx = new EventContextImpl(); + ScopeContext scopeContext = new ModuleScopeContext(eCtx); + scopeContext.start(); + scopeContext.onEvent(new ModuleStart(this)); + List<Component> components = module.getComponents(); + Map<String, Component> compMap = new HashMap<String, Component>(components.size()); + + for (Component component : components) { + compMap.put(component.getName(), component); + builder.build(component); + ContextFactory contextFactory = (ContextFactory) component.getContextFactory(); + Assert.assertNotNull(contextFactory); + } + for (Component component : components) { + ContextFactory<Context> source = (ContextFactory<Context>) component.getContextFactory(); + Assert.assertNotNull(source); + for (SourceWireFactory pFactory : source.getSourceWireFactories()) { + WireConfiguration pConfig = pFactory.getConfiguration(); + Component target = compMap.get(pConfig.getTargetName().getPartName()); + + if (target != null) { + ContextFactory targetConfig = (ContextFactory) target.getContextFactory(); + boolean downScope = strategy.downScopeReference(source.getScope(), targetConfig.getScope()); + wireBuilder.connect(pFactory, targetConfig.getTargetWireFactory(pFactory.getConfiguration().getTargetName() + .getPortName()), targetConfig.getClass(), downScope, scopeContext); + } + pFactory.initialize(); + } + scopeContext.registerFactory(source); + } + for (Component component : components) { + ContextFactory config = (ContextFactory) component.getContextFactory(); + Context context = config.createContext(); + if ("source".equals(component.getName())) { + ModuleScopeComponent source = (ModuleScopeComponent) context.getInstance(null); + Assert.assertNotNull(source); + GenericComponent gComp = source.getGenericComponent(); + gComp.getString(); + } + } + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/builder/JavaTargetWireBuilderTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/builder/JavaTargetWireBuilderTestCase.java new file mode 100644 index 0000000000..5a0ee8e14c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/builder/JavaTargetWireBuilderTestCase.java @@ -0,0 +1,132 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.builder; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.container.java.config.JavaContextFactory; +import org.apache.tuscany.container.java.invocation.mock.MockHandler; +import org.apache.tuscany.container.java.invocation.mock.MockSyncInterceptor; +import org.apache.tuscany.container.java.invocation.mock.SimpleTarget; +import org.apache.tuscany.container.java.invocation.mock.SimpleTargetImpl; +import org.apache.tuscany.container.java.mock.MockScopeContext; +import org.apache.tuscany.core.builder.impl.DefaultWireBuilder; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.wire.MethodHashMap; +import org.apache.tuscany.core.wire.impl.InvokerInterceptor; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; +import org.apache.tuscany.core.wire.WireSourceConfiguration; +import org.apache.tuscany.core.wire.WireTargetConfiguration; +import org.apache.tuscany.core.wire.SourceInvocationConfiguration; +import org.apache.tuscany.core.wire.TargetInvocationConfiguration; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.message.Message; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; + +public class JavaTargetWireBuilderTestCase extends TestCase { + + private Method hello; + + public JavaTargetWireBuilderTestCase() { + } + + public JavaTargetWireBuilderTestCase(String arg0) { + super(arg0); + } + + public void setUp() throws Exception { + hello = SimpleTarget.class.getMethod("hello", String.class); + } + + + /** + * Tests basic wiring of a source to a target, including handlers and interceptors + */ + public void testInvocation() throws Exception { + MessageFactory msgFactory = new MessageFactoryImpl(); + + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + MockHandler sourceRequestHandler = new MockHandler(); + MockHandler sourceResponseHandler = new MockHandler(); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addRequestHandler(sourceRequestHandler); + source.addResponseHandler(sourceResponseHandler); + source.addInterceptor(sourceInterceptor); + + SourceWireFactory sourceFactory = new JDKWireFactoryFactory().createSourceWireFactory(); + Map<Method, SourceInvocationConfiguration> sourceInvocationConfigs = new MethodHashMap<SourceInvocationConfiguration>(); + sourceInvocationConfigs.put(hello, source); + WireSourceConfiguration sourceConfig = new WireSourceConfiguration("foo",new QualifiedName("target/SimpleTarget"), + sourceInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + sourceFactory.setConfiguration(sourceConfig); + sourceFactory.setBusinessInterface(SimpleTarget.class); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockHandler targetRequestHandler = new MockHandler(); + MockHandler targetResponseHandler = new MockHandler(); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addRequestHandler(targetRequestHandler); + target.addResponseHandler(targetResponseHandler); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + TargetWireFactory targetFactory = new JDKWireFactoryFactory().createTargetWireFactory(); + Map<Method, TargetInvocationConfiguration> targetInvocationConfigs = new MethodHashMap<TargetInvocationConfiguration>(); + targetInvocationConfigs.put(hello, target); + WireTargetConfiguration targetConfig = new WireTargetConfiguration(new QualifiedName("target/SimpleTarget"), + targetInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + targetFactory.setConfiguration(targetConfig); + targetFactory.setBusinessInterface(SimpleTarget.class); + + // bootstrap a scope container with the target in it + Map<String,Object> instances = new HashMap<String,Object>(); + SimpleTarget simpleTarget = new SimpleTargetImpl(); + instances.put("target",simpleTarget); + MockScopeContext scopeCtx = new MockScopeContext(instances); + + // connect the source to the target + DefaultWireBuilder builder = new DefaultWireBuilder(); + builder.addWireBuilder(new JavaTargetWireBuilder()); + + builder.connect(sourceFactory, targetFactory, JavaContextFactory.class, true, scopeCtx); + source.build(); + target.build(); + Assert.assertNotNull(source.getTargetInvoker()); + + Message msg = msgFactory.createMessage(); + msg.setBody("foo"); + msg.setTargetInvoker(source.getTargetInvoker()); + Message response = source.getHeadInterceptor().invoke(msg); + Assert.assertEquals("foo", response.getBody()); + Assert.assertEquals(1, sourceRequestHandler.getCount()); + Assert.assertEquals(1, sourceResponseHandler.getCount()); + Assert.assertEquals(1, sourceInterceptor.getCount()); + Assert.assertEquals(1, targetRequestHandler.getCount()); + Assert.assertEquals(1, targetResponseHandler.getCount()); + Assert.assertEquals(1, targetInterceptor.getCount()); + } + + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/builder/MockHandlerBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/builder/MockHandlerBuilder.java new file mode 100644 index 0000000000..bd1c13c4ac --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/builder/MockHandlerBuilder.java @@ -0,0 +1,120 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.builder; + +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.SourcePolicyBuilder; +import org.apache.tuscany.core.builder.TargetPolicyBuilder; +import org.apache.tuscany.core.wire.InvocationConfiguration; +import org.apache.tuscany.core.wire.MessageHandler; +import org.apache.tuscany.core.wire.SourceInvocationConfiguration; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetInvocationConfiguration; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.WireSourceConfiguration; +import org.apache.tuscany.core.wire.WireTargetConfiguration; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; + +import java.util.List; + +/** + * Adds a handler to a source or target proxy configuration + * + * @version $Rev$ $Date$ + */ +public class MockHandlerBuilder implements SourcePolicyBuilder, TargetPolicyBuilder { + + + private MessageHandler handler; + + private boolean source; + + private boolean request; + + /** + * Creates the builder. + * + * @param handler the handler to add to the source or target proxy configuration + * @param source true if the handler should be added on the source side; false if the handler should be added to the target + * side + * @param request true if the handler is a request handler; false if the handler is a response handler + */ + public MockHandlerBuilder(MessageHandler handler, boolean source, boolean request) { + this.handler = handler; + this.source = source; + this.request = request; + } + + public void build(AssemblyObject modelObject) throws BuilderException { + if (source) { + if (!(modelObject instanceof ConfiguredReference)) { + return; + } else { + ConfiguredReference cref = (ConfiguredReference) modelObject; + // /xcv WireFactory pFactory = (WireFactory) cref.getProxyFactory(); + for (ConfiguredService configuredService : cref.getTargetConfiguredServices()) { + SourceWireFactory pFactory = (SourceWireFactory) configuredService.getProxyFactory(); + for (InvocationConfiguration config : pFactory.getConfiguration().getInvocationConfigurations().values()) { + if (request) { + config.addRequestHandler(handler); + } else { + config.addResponseHandler(handler); + } + } + } + } + } else { + if (!(modelObject instanceof ConfiguredService)) { + return; + } else { + ConfiguredService cservice = (ConfiguredService) modelObject; + TargetWireFactory pFactory = (TargetWireFactory) cservice.getProxyFactory(); + for (InvocationConfiguration config : pFactory.getConfiguration().getInvocationConfigurations().values()) { + if (request) { + config.addRequestHandler(handler); + } else { + config.addResponseHandler(handler); + } + } + } + + } + } + + public void build(ConfiguredReference reference, List<WireSourceConfiguration> configurations) throws BuilderException { + for (WireSourceConfiguration wireSourceConfiguration : configurations) { + for (SourceInvocationConfiguration configuration : wireSourceConfiguration.getInvocationConfigurations().values()) { + if (request) { + configuration.addRequestHandler(handler); + } else { + configuration.addResponseHandler(handler); + } + + } + + } + } + + public void build(ConfiguredService service, WireTargetConfiguration configuration) throws BuilderException { + for (TargetInvocationConfiguration config : configuration.getInvocationConfigurations().values()) { + if (request) { + config.addRequestHandler(handler); + } else { + config.addResponseHandler(handler); + } + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/builder/MockInterceptorBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/builder/MockInterceptorBuilder.java new file mode 100644 index 0000000000..d3ad8a53b5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/builder/MockInterceptorBuilder.java @@ -0,0 +1,66 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.builder; + +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.SourcePolicyBuilder; +import org.apache.tuscany.core.builder.TargetPolicyBuilder; +import org.apache.tuscany.core.wire.Interceptor; +import org.apache.tuscany.core.wire.SourceInvocationConfiguration; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetInvocationConfiguration; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.WireFactory; +import org.apache.tuscany.core.wire.WireSourceConfiguration; +import org.apache.tuscany.core.wire.WireTargetConfiguration; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; + +import java.util.List; + +/** + * Adds an interceptor to a source or target proxy configuration + * + * @version $Rev$ $Date$ + */ +public class MockInterceptorBuilder implements SourcePolicyBuilder, TargetPolicyBuilder { + + private Interceptor interceptor; + + /** + * Creates the builder + * + * @param interceptor the interceptor ot add + * @param source true if the interceptor should be added to the source side; false if the interceptor should be added to + * the target side + */ + public MockInterceptorBuilder(Interceptor interceptor, boolean source) { + this.interceptor = interceptor; + } + + public void build(ConfiguredReference reference, List<WireSourceConfiguration> configurations) throws BuilderException { + for (WireSourceConfiguration wireSourceConfiguration : configurations) { + for (SourceInvocationConfiguration configuration : wireSourceConfiguration.getInvocationConfigurations().values()) { + configuration.addInterceptor(interceptor); + } + } + } + + public void build(ConfiguredService service, WireTargetConfiguration configuration) throws BuilderException { + for (TargetInvocationConfiguration config : configuration.getInvocationConfigurations().values()) { + config.addInterceptor(interceptor); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/DifferentInterfaceWireTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/DifferentInterfaceWireTestCase.java new file mode 100644 index 0000000000..ed91b9cb9b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/DifferentInterfaceWireTestCase.java @@ -0,0 +1,81 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.context; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.container.java.builder.JavaContextFactoryBuilder; +import org.apache.tuscany.container.java.builder.JavaTargetWireBuilder; +import org.apache.tuscany.container.java.mock.MockConfigContext; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.OtherTarget; +import org.apache.tuscany.container.java.mock.components.Source; +import org.apache.tuscany.container.java.mock.components.Target; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.builder.WireBuilder; +import org.apache.tuscany.core.builder.system.DefaultPolicyBuilderRegistry; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; +import org.apache.tuscany.core.wire.service.WireFactoryService; +import org.apache.tuscany.core.wire.service.DefaultWireFactoryService; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; +import org.apache.tuscany.model.assembly.Scope; + +/** + * Tests wires that have different interfaces on the source and target side + * + * @version $Rev$ $Date$ + */ +public class DifferentInterfaceWireTestCase extends TestCase { + + public void testMultiplicity() throws Exception { + + CompositeContext context = createContext(); + context.start(); + context.registerModelObject(MockFactory.createModuleWithWiredComponentsOfDifferentInterface(Scope.MODULE, Scope.MODULE)); + context.publish(new ModuleStart(this)); + Source source = (Source) ((AtomicContext) context.getContext("source")).getTargetInstance(); + Assert.assertNotNull(source); + OtherTarget target = (OtherTarget) ((AtomicContext)context.getContext("target")).getTargetInstance(); + Assert.assertNotNull(target); + // test setter injection + List<Target> targets = source.getTargets(); + Assert.assertEquals(1, targets.size()); + + // test field injection + targets = source.getTargetsThroughField(); + Assert.assertEquals(1, targets.size()); + targets.get(0).setString("foo"); + Assert.assertEquals("foo",target.getString()); + } + + private CompositeContext createContext() { + CompositeContextImpl context = new CompositeContextImpl(); + context.setName("system.context"); + List<ContextFactoryBuilder>builders = MockFactory.createSystemBuilders(); + WireFactoryService wireService = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), new DefaultPolicyBuilderRegistry()); + builders.add(new JavaContextFactoryBuilder(wireService)); + List<WireBuilder> wireBuilders = new ArrayList<WireBuilder>(); + wireBuilders.add(new JavaTargetWireBuilder()); + context.setConfigurationContext(new MockConfigContext(builders,wireBuilders)); + return context; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/JavaAtomicContextLifecycleTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/JavaAtomicContextLifecycleTestCase.java new file mode 100644 index 0000000000..c257a1f892 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/JavaAtomicContextLifecycleTestCase.java @@ -0,0 +1,59 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.context; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.ModuleScopeInitOnlyComponent; +import org.apache.tuscany.container.java.mock.components.ModuleScopeInitDestroyComponent; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.model.assembly.Scope; + +/** + * Tests init and destroy lifecycle callbacks are handled properly + * + * @version $Rev$ $Date$ + */ +public class JavaAtomicContextLifecycleTestCase extends TestCase { + + public void testComponentNameSet() throws Exception { + CompositeContext mc = new CompositeContextImpl(); + mc.setName("mc"); + JavaAtomicContext context = MockFactory.createPojoContext("TestServiceInit", + ModuleScopeInitOnlyComponent.class, Scope.MODULE, mc); + context.start(); + ModuleScopeInitOnlyComponent instance = (ModuleScopeInitOnlyComponent) context.getInstance(null); + Assert.assertNotNull(instance); + Assert.assertEquals("TestServiceInit", instance.getName()); + context.stop(); + } + + public void testModuleContextSet() throws Exception { + CompositeContext mc = new CompositeContextImpl(); + mc.setName("mc"); + JavaAtomicContext context = MockFactory.createPojoContext("TestServiceInit", + ModuleScopeInitOnlyComponent.class, Scope.MODULE, mc); + context.start(); + ModuleScopeInitOnlyComponent instance = (ModuleScopeInitOnlyComponent) context.getInstance(null); + Assert.assertNotNull(instance); + Assert.assertEquals(mc, instance.getModuleContext()); + context.stop(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/JavaAtomicContextMetadataInjectionTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/JavaAtomicContextMetadataInjectionTestCase.java new file mode 100644 index 0000000000..a79a04f5ab --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/JavaAtomicContextMetadataInjectionTestCase.java @@ -0,0 +1,58 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.context; + +import junit.framework.TestCase; +import junit.framework.Assert; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.ModuleScopeInitOnlyComponent; +import org.apache.tuscany.container.java.mock.components.ModuleScopeInitDestroyComponent; +import org.apache.tuscany.model.assembly.Scope; + +/** + * Tests SCA metadata such as <code>@ComponentName</code> and <code>@Context</code> are handled properly + * + * @version $Rev: 394173 $ $Date: 2006-04-14 11:54:59 -0700 (Fri, 14 Apr 2006) $ + */ +public class JavaAtomicContextMetadataInjectionTestCase extends TestCase { + + public void testComponentNameSet() throws Exception { + CompositeContext mc = new CompositeContextImpl(); + mc.setName("mc"); + JavaAtomicContext context = MockFactory.createPojoContext("TestServiceInit", + ModuleScopeInitOnlyComponent.class, Scope.MODULE, mc); + context.start(); + ModuleScopeInitOnlyComponent instance = (ModuleScopeInitOnlyComponent) context.getInstance(null); + Assert.assertNotNull(instance); + Assert.assertEquals("TestServiceInit", instance.getName()); + context.stop(); + } + + public void testModuleContextSet() throws Exception { + CompositeContext mc = new CompositeContextImpl(); + mc.setName("mc"); + JavaAtomicContext context = MockFactory.createPojoContext("TestServiceInit", + ModuleScopeInitOnlyComponent.class, Scope.MODULE, mc); + context.start(); + ModuleScopeInitOnlyComponent instance = (ModuleScopeInitOnlyComponent) context.getInstance(null); + Assert.assertNotNull(instance); + Assert.assertEquals(mc, instance.getModuleContext()); + context.stop(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/JavaAtomicContextNegativeMetadataTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/JavaAtomicContextNegativeMetadataTestCase.java new file mode 100644 index 0000000000..0a4527f405 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/JavaAtomicContextNegativeMetadataTestCase.java @@ -0,0 +1,73 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.context; + +import junit.framework.TestCase; + +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.BadContextPojo; +import org.apache.tuscany.container.java.mock.components.BadNamePojo; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.model.assembly.Scope; + +/** + * Performs rudimentary negative testing by using malformed metadata on a POJO + * + * @version $Rev $Date + */ +public class JavaAtomicContextNegativeMetadataTestCase extends TestCase { + + /** + * Tests that a pojo with <code>@ComponentName</code> specified on a non-String type generates an error. + * <p/> + * <strong>NB:</strong> the test assumes an error with a message containing + * "@ComponentName" is generated + */ + public void testBadNameType() throws Exception { + CompositeContext mc = new CompositeContextImpl(); + mc.setName("mc"); + try { + MockFactory.createPojoContext("BadNamePojo", BadNamePojo.class, Scope.MODULE, mc); + } catch (NoSuchMethodException e) { + if (e.getMessage().indexOf("@ComponentName") < 0) { + throw e; + } + } + + } + + /** + * Tests that a pojo with <code>@Context</code> specified on a non-ModuleContext type generates an error. + * <p/> + * <strong>NB:</strong> the test assumes an error with a message containing + * "@Context" is generated + */ + public void testContextType() throws Exception { + CompositeContext mc = new CompositeContextImpl(); + mc.setName("mc"); + try { + MockFactory.createPojoContext("BadContextPojo", BadContextPojo.class, Scope.MODULE, mc); + } catch (NoSuchMethodException e) { + if (e.getMessage().indexOf("@Context") < 0) { + throw e; + } + } + + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/JavaAtomicContextScopeTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/JavaAtomicContextScopeTestCase.java new file mode 100644 index 0000000000..96bff0cf2e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/JavaAtomicContextScopeTestCase.java @@ -0,0 +1,95 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.context; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.container.java.assembly.JavaAssemblyFactory; +import org.apache.tuscany.container.java.assembly.impl.JavaAssemblyFactoryImpl; +import org.apache.tuscany.container.java.mock.components.GenericComponent; +import org.apache.tuscany.container.java.mock.components.ModuleScopeComponentImpl; +import org.apache.tuscany.container.java.mock.components.RequestScopeComponentImpl; +import org.apache.tuscany.container.java.mock.components.SessionScopeComponentImpl; +import org.apache.tuscany.container.java.mock.components.StatelessComponentImpl; +import org.apache.tuscany.core.config.JavaIntrospectionHelper; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.injection.PojoObjectFactory; + +/** + * Tests {@link JavaAtomicContext} to ensure it handles component scopes properly + * + * @version $Rev$ $Date$ + */ +public class JavaAtomicContextScopeTestCase extends TestCase { + + JavaAssemblyFactory factory = new JavaAssemblyFactoryImpl(); + + public void testGetModuleInstance() throws Exception { + CompositeContext mc = new CompositeContextImpl(); + mc.setName("mc"); + JavaAtomicContext c = new JavaAtomicContext("foo", new PojoObjectFactory<ModuleScopeComponentImpl>(JavaIntrospectionHelper + .getDefaultConstructor(ModuleScopeComponentImpl.class), null, null), false, null, null, false); + GenericComponent service = (GenericComponent) c.getInstance(null); + Assert.assertNotNull(service); + service.setString("foo"); + GenericComponent service2 = (GenericComponent) c.getInstance(null); + Assert.assertNotNull(service2); + Assert.assertSame(service, service2); + } + + public void testGetSessionInstance() throws Exception { + CompositeContext mc = new CompositeContextImpl(); + mc.setName("mc"); + JavaAtomicContext c = new JavaAtomicContext("foo", new PojoObjectFactory<SessionScopeComponentImpl>(JavaIntrospectionHelper + .getDefaultConstructor(SessionScopeComponentImpl.class), null, null), false, null, null, false); + GenericComponent service = (GenericComponent) c.getInstance(null); + Assert.assertNotNull(service); + service.setString("foo"); + GenericComponent service2 = (GenericComponent) c.getInstance(null); + Assert.assertNotNull(service2); + Assert.assertSame(service, service2); + } + + public void testGetRequestInstance() throws Exception { + CompositeContext mc = new CompositeContextImpl(); + mc.setName("mc"); + JavaAtomicContext c = new JavaAtomicContext("foo", new PojoObjectFactory<RequestScopeComponentImpl>(JavaIntrospectionHelper + .getDefaultConstructor(RequestScopeComponentImpl.class), null, null), false, null, null, false); + GenericComponent service = (GenericComponent) c.getInstance(null); + Assert.assertNotNull(service); + service.setString("foo"); + GenericComponent service2 = (GenericComponent) c.getInstance(null); + Assert.assertNotNull(service2); + Assert.assertSame(service, service2); + } + + public void testGetStatelessInstance() throws Exception { + CompositeContext mc = new CompositeContextImpl(); + mc.setName("fooContext"); + JavaAtomicContext c = new JavaAtomicContext("foo", new PojoObjectFactory<StatelessComponentImpl>(JavaIntrospectionHelper + .getDefaultConstructor(StatelessComponentImpl.class), null, null), false, null, null, true); + GenericComponent service = (GenericComponent) c.getInstance(null); + Assert.assertNotNull(service); + service.setString("foo"); + GenericComponent service2 = (GenericComponent) c.getInstance(null); + Assert.assertNotNull(service2); + Assert.assertTrue(!"foo".equals(service2.getString())); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/MultiplicityTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/MultiplicityTestCase.java new file mode 100644 index 0000000000..a22a8dfce2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/context/MultiplicityTestCase.java @@ -0,0 +1,77 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.context; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.container.java.builder.JavaContextFactoryBuilder; +import org.apache.tuscany.container.java.builder.JavaTargetWireBuilder; +import org.apache.tuscany.container.java.mock.MockConfigContext; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.Source; +import org.apache.tuscany.container.java.mock.components.Target; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.builder.WireBuilder; +import org.apache.tuscany.core.builder.system.DefaultPolicyBuilderRegistry; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; +import org.apache.tuscany.core.wire.service.WireFactoryService; +import org.apache.tuscany.core.wire.service.DefaultWireFactoryService; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; +import org.apache.tuscany.model.assembly.Scope; + +/** + * Tests wires that are configured with a multiplicity + * + * @version $Rev$ $Date$ + */ +public class MultiplicityTestCase extends TestCase { + + public void testMultiplicity() throws Exception { + CompositeContext context = createContext(); + context.start(); + context.registerModelObject(MockFactory.createModuleWithWiredComponents(Scope.MODULE, Scope.MODULE)); + context.publish(new ModuleStart(this)); + Source source = (Source) ((AtomicContext) context.getContext("source")).getTargetInstance(); + Assert.assertNotNull(source); + Target target = (Target) ((AtomicContext)context.getContext("target")).getTargetInstance(); + Assert.assertNotNull(target); + // test setter injection + List<Target> targets = source.getTargets(); + Assert.assertEquals(1, targets.size()); + + // test field injection + targets = source.getTargetsThroughField(); + Assert.assertEquals(1, targets.size()); + } + + private CompositeContext createContext() { + CompositeContextImpl context = new CompositeContextImpl(); + context.setName("system.context"); + List<ContextFactoryBuilder>builders = MockFactory.createSystemBuilders(); + WireFactoryService wireService = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), new DefaultPolicyBuilderRegistry()); + builders.add(new JavaContextFactoryBuilder(wireService)); + List<WireBuilder> wireBuilders = new ArrayList<WireBuilder>(); + wireBuilders.add(new JavaTargetWireBuilder()); + context.setConfigurationContext(new MockConfigContext(builders,wireBuilders)); + return context; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/GreetingProvider.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/GreetingProvider.java new file mode 100644 index 0000000000..58180674b3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/GreetingProvider.java @@ -0,0 +1,24 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.container.java.integration; + +/** + * @version $Rev$ $Date$ + */ +public interface GreetingProvider { + String getGreeting(String name, String locale); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/GreetingProviderImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/GreetingProviderImpl.java new file mode 100644 index 0000000000..fef068c22e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/GreetingProviderImpl.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.container.java.integration; + +import org.osoa.sca.annotations.Property; +import org.osoa.sca.annotations.Service; + +/** + * @version $Rev$ $Date$ + */ +@Service(GreetingProvider.class) +public class GreetingProviderImpl implements GreetingProvider { + + public String greeting; + + @Property + public void setGreeting(String greeting) { + this.greeting = greeting; + } + + public String getGreeting(String name, String locale) { + if ("fr".equals(locale)) { + return "Bonjour " + name; + } else { + return greeting + name; + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/HelloWorldImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/HelloWorldImpl.java new file mode 100644 index 0000000000..9ff58f2d8d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/HelloWorldImpl.java @@ -0,0 +1,29 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.container.java.integration; + +import org.osoa.sca.annotations.Service; + +/** + * @version $Rev$ $Date$ + */ +@Service(HelloWorldService.class) +public class HelloWorldImpl implements HelloWorldService { + public String getGreetings(String name) { + return "Hello " + name; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/HelloWorldMCImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/HelloWorldMCImpl.java new file mode 100644 index 0000000000..aa5069c232 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/HelloWorldMCImpl.java @@ -0,0 +1,61 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.container.java.integration; + +import org.osoa.sca.annotations.Property; +import org.osoa.sca.annotations.Reference; +import org.osoa.sca.annotations.Service; +import org.apache.tuscany.core.sdo.helper.SDOHelper; +import commonj.sdo.helper.TypeHelper; +import commonj.sdo.helper.DataFactory; + +/** + * @version $Rev$ $Date$ + */ +@Service(HelloWorldService.class) +public class HelloWorldMCImpl implements HelloWorldService { + + @Property + public String locale; + + public String getBar() { + return bar; + } + + @Property(name= "bar", required=true) + public void setXBar(String bar) { + this.bar = bar; + } + + public String bar; + + @Reference(name="greetingProvider") + public void setGreetingProvider(GreetingProvider greetingProvider) { + this.greetingProvider2 = greetingProvider; + } + + public GreetingProvider greetingProvider2; + + @Reference(required=false) + public GreetingProvider foo; + + public String getGreetings(String name) { + return greetingProvider2.getGreeting(name, locale); + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/HelloWorldMCTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/HelloWorldMCTestCase.java new file mode 100644 index 0000000000..5a73abd45a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/HelloWorldMCTestCase.java @@ -0,0 +1,59 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.container.java.integration; + +import java.net.URL; +import java.net.URLClassLoader; + +import junit.framework.TestCase; +import org.apache.tuscany.core.client.TuscanyRuntime; +import org.osoa.sca.CurrentModuleContext; +import org.osoa.sca.ModuleContext; + +/** + * @version $Rev$ $Date$ + */ +public class HelloWorldMCTestCase extends TestCase { + private ClassLoader oldCL; + + public void testHelloWorld() throws Exception { + TuscanyRuntime tuscany = new TuscanyRuntime("test", "foo"); + tuscany.start(); + ModuleContext moduleContext = CurrentModuleContext.getContext(); + assertNotNull(moduleContext); + assertEquals("foo", moduleContext.getURI()); + HelloWorldService helloworldService = (HelloWorldService) moduleContext.locateService("HelloWorld"); + assertNotNull(helloworldService); + + String value = helloworldService .getGreetings("World"); + assertEquals("Hello World", value); + tuscany.stop(); + } + + protected void setUp() throws Exception { + super.setUp(); + URL url = getClass().getResource("/helloworldmc/"); + ClassLoader cl = new URLClassLoader(new URL[]{url}, getClass().getClassLoader()); + oldCL = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(cl); + } + + protected void tearDown() throws Exception { + Thread.currentThread().setContextClassLoader(oldCL); + super.tearDown(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/HelloWorldService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/HelloWorldService.java new file mode 100644 index 0000000000..3abb99d7e0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/HelloWorldService.java @@ -0,0 +1,24 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.container.java.integration; + +/** + * @version $Rev$ $Date$ + */ +public interface HelloWorldService { + public String getGreetings(String name); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/HelloWorldTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/HelloWorldTestCase.java new file mode 100644 index 0000000000..c714b416e4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/HelloWorldTestCase.java @@ -0,0 +1,61 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.container.java.integration; + +import java.net.URL; +import java.net.URLClassLoader; + +import junit.framework.TestCase; +import org.osoa.sca.CurrentModuleContext; +import org.osoa.sca.ModuleContext; + +import org.apache.tuscany.core.client.TuscanyRuntime; + +/** + * @version $Rev$ $Date$ + */ +public class HelloWorldTestCase extends TestCase { + private ClassLoader oldCL; + + public void testHelloWorld() throws Exception { + TuscanyRuntime tuscany = new TuscanyRuntime("test", null); + tuscany.start(); + ModuleContext moduleContext = CurrentModuleContext.getContext(); + assertNotNull(moduleContext); + + HelloWorldService helloworldService = (HelloWorldService) moduleContext.locateService("HelloWorld"); + assertNotNull(helloworldService); + + String value = helloworldService .getGreetings("World"); + assertEquals("Hello World", value); + + tuscany.stop(); + } + + protected void setUp() throws Exception { + super.setUp(); + URL url = getClass().getResource("/helloworld/"); + ClassLoader cl = new URLClassLoader(new URL[]{url}, getClass().getClassLoader()); + oldCL = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(cl); + } + + protected void tearDown() throws Exception { + Thread.currentThread().setContextClassLoader(oldCL); + super.tearDown(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/JavaBuilderContextIntegrationTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/JavaBuilderContextIntegrationTestCase.java new file mode 100644 index 0000000000..f7cc2ed149 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/JavaBuilderContextIntegrationTestCase.java @@ -0,0 +1,189 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.integration; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.common.monitor.impl.NullMonitorFactory; +import org.apache.tuscany.container.java.builder.JavaContextFactoryBuilder; +import org.apache.tuscany.container.java.builder.JavaTargetWireBuilder; +import org.apache.tuscany.container.java.builder.MockHandlerBuilder; +import org.apache.tuscany.container.java.builder.MockInterceptorBuilder; +import org.apache.tuscany.container.java.invocation.mock.MockHandler; +import org.apache.tuscany.container.java.invocation.mock.MockSyncInterceptor; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.GenericComponent; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.builder.impl.DefaultWireBuilder; +import org.apache.tuscany.core.builder.system.DefaultPolicyBuilderRegistry; +import org.apache.tuscany.core.builder.system.PolicyBuilderRegistry; +import org.apache.tuscany.core.client.BootstrapHelper; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.core.runtime.RuntimeContextImpl; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; +import org.apache.tuscany.core.wire.service.DefaultWireFactoryService; +import org.apache.tuscany.core.wire.service.WireFactoryService; + +/** + * Verifies that the composite context implementation and java component builders construct references properly + * + * @version $Rev$ $Date$ + */ +public class JavaBuilderContextIntegrationTestCase extends TestCase { + private ContextFactoryBuilderRegistry builderRegistry; + private DefaultWireBuilder defaultWireBuilder; + private NullMonitorFactory monitorFactory; + + public JavaBuilderContextIntegrationTestCase(String arg0) { + super(arg0); + } + + protected void setUp() throws Exception { + super.setUp(); + monitorFactory = new NullMonitorFactory(); + builderRegistry = BootstrapHelper.bootstrapContextFactoryBuilders(monitorFactory); + defaultWireBuilder = new DefaultWireBuilder(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + } + + public void testRefWithSourceInterceptor() throws Exception { + MockSyncInterceptor mockInterceptor = new MockSyncInterceptor(); + MockInterceptorBuilder interceptorBuilder = new MockInterceptorBuilder(mockInterceptor, true); + PolicyBuilderRegistry policyRegistry = new DefaultPolicyBuilderRegistry(); + policyRegistry.registerSourceBuilder(interceptorBuilder); + WireFactoryService wireFactory = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), policyRegistry); + JavaContextFactoryBuilder javaBuilder = new JavaContextFactoryBuilder(wireFactory); + + builderRegistry.register(javaBuilder); + + RuntimeContext runtime = new RuntimeContextImpl(monitorFactory, builderRegistry, defaultWireBuilder); + runtime.addBuilder(new JavaTargetWireBuilder()); + runtime.start(); + runtime.getRootContext().registerModelObject( + MockFactory.createCompositeComponent("test.module")); + CompositeContext child = (CompositeContext) runtime.getRootContext().getContext("test.module"); + child.registerModelObject(MockFactory.createModule()); + child.publish(new ModuleStart(this)); + GenericComponent source = (GenericComponent) child.getContext("source").getInstance(null); + Assert.assertNotNull(source); + source.getGenericComponent().getString(); + Assert.assertEquals(1, mockInterceptor.getCount()); + source.getGenericComponent().getString(); + Assert.assertEquals(2, mockInterceptor.getCount()); + child.publish(new ModuleStop(this)); + runtime.stop(); + } + + public void testRefWithSourceInterceptorHandler() throws Exception { + MockSyncInterceptor mockInterceptor = new MockSyncInterceptor(); + MockInterceptorBuilder interceptorBuilder = new MockInterceptorBuilder(mockInterceptor, true); + MockHandler mockHandler = new MockHandler(); + MockHandlerBuilder handlerBuilder = new MockHandlerBuilder(mockHandler, true, true); + PolicyBuilderRegistry policyRegistry = new DefaultPolicyBuilderRegistry(); + policyRegistry.registerSourceBuilder(interceptorBuilder); + policyRegistry.registerSourceBuilder(handlerBuilder); + WireFactoryService wireFactory = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), policyRegistry); + JavaContextFactoryBuilder javaBuilder = new JavaContextFactoryBuilder(wireFactory); + + builderRegistry.register(javaBuilder); + RuntimeContext runtime = new RuntimeContextImpl(monitorFactory, builderRegistry, defaultWireBuilder); + runtime.addBuilder(new JavaTargetWireBuilder()); + runtime.start(); + runtime.getRootContext().registerModelObject( + MockFactory.createCompositeComponent("test.module")); + CompositeContext child = (CompositeContext) runtime.getRootContext().getContext("test.module"); + child.registerModelObject(MockFactory.createModule()); + child.publish(new ModuleStart(this)); + GenericComponent source = (GenericComponent) child.getContext("source").getInstance(null); + Assert.assertNotNull(source); + source.getGenericComponent().getString(); + Assert.assertEquals(1, mockInterceptor.getCount()); + Assert.assertEquals(1, mockHandler.getCount()); + source.getGenericComponent().getString(); + Assert.assertEquals(2, mockInterceptor.getCount()); + Assert.assertEquals(2, mockHandler.getCount()); + child.publish(new ModuleStop(this)); + runtime.stop(); + } + + public void testRefWithTargetInterceptorHandler() throws Exception { + MockSyncInterceptor mockInterceptor = new MockSyncInterceptor(); + MockInterceptorBuilder interceptorBuilder = new MockInterceptorBuilder(mockInterceptor, false); + MockHandler mockHandler = new MockHandler(); + MockHandlerBuilder handlerBuilder = new MockHandlerBuilder(mockHandler, false, true); + PolicyBuilderRegistry policyRegistry = new DefaultPolicyBuilderRegistry(); + policyRegistry.registerSourceBuilder(interceptorBuilder); + policyRegistry.registerSourceBuilder(handlerBuilder); + WireFactoryService wireFactory = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), policyRegistry); + JavaContextFactoryBuilder javaBuilder = new JavaContextFactoryBuilder(wireFactory); + + builderRegistry.register(javaBuilder); + + RuntimeContext runtime = new RuntimeContextImpl(monitorFactory, builderRegistry, defaultWireBuilder); + runtime.addBuilder(new JavaTargetWireBuilder()); + runtime.start(); + runtime.getRootContext().registerModelObject( + MockFactory.createCompositeComponent("test.module")); + CompositeContext child = (CompositeContext) runtime.getRootContext().getContext("test.module"); + child.registerModelObject(MockFactory.createModule()); + child.publish(new ModuleStart(this)); + GenericComponent source = (GenericComponent) child.getContext("source").getInstance(null); + Assert.assertNotNull(source); + source.getGenericComponent().getString(); + Assert.assertEquals(1, mockInterceptor.getCount()); + Assert.assertEquals(1, mockHandler.getCount()); + source.getGenericComponent().getString(); + Assert.assertEquals(2, mockInterceptor.getCount()); + Assert.assertEquals(2, mockHandler.getCount()); + child.publish(new ModuleStop(this)); + runtime.stop(); + } + + public void testRefWithTargetInterceptor() throws Exception { + MockSyncInterceptor mockInterceptor = new MockSyncInterceptor(); + MockInterceptorBuilder interceptorBuilder = new MockInterceptorBuilder(mockInterceptor, false); + PolicyBuilderRegistry policyRegistry = new DefaultPolicyBuilderRegistry(); + policyRegistry.registerSourceBuilder(interceptorBuilder); + WireFactoryService wireFactory = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), policyRegistry); + JavaContextFactoryBuilder javaBuilder = new JavaContextFactoryBuilder(wireFactory); + + builderRegistry.register(javaBuilder); + + RuntimeContext runtime = new RuntimeContextImpl(monitorFactory, builderRegistry, defaultWireBuilder); + runtime.addBuilder(new JavaTargetWireBuilder()); + + runtime.start(); + runtime.getRootContext().registerModelObject( + MockFactory.createCompositeComponent("test.module")); + CompositeContext child = (CompositeContext) runtime.getRootContext().getContext("test.module"); + child.registerModelObject(MockFactory.createModule()); + child.publish(new ModuleStart(this)); + GenericComponent source = (GenericComponent) child.getContext("source").getInstance(null); + Assert.assertNotNull(source); + source.getGenericComponent().getString(); + Assert.assertEquals(1, mockInterceptor.getCount()); + source.getGenericComponent().getString(); + Assert.assertEquals(2, mockInterceptor.getCount()); + child.publish(new ModuleStop(this)); + runtime.stop(); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/JavaIntegrationTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/JavaIntegrationTestCase.java new file mode 100644 index 0000000000..a5ec39480f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/JavaIntegrationTestCase.java @@ -0,0 +1,68 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.integration; + +import junit.framework.TestCase; + +import org.apache.tuscany.common.monitor.MonitorFactory; +import org.apache.tuscany.common.monitor.impl.NullMonitorFactory; +import org.apache.tuscany.container.java.assembly.JavaAssemblyFactory; +import org.apache.tuscany.container.java.assembly.impl.JavaAssemblyFactoryImpl; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.builder.impl.DefaultWireBuilder; +import org.apache.tuscany.core.client.BootstrapHelper; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.core.runtime.RuntimeContextImpl; +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.ModuleComponent; + +/** + * Integration test that verifies container.java can be used to host components. + * + * @version $Rev$ $Date$ + */ +public class JavaIntegrationTestCase extends TestCase { + private JavaAssemblyFactory factory; + private RuntimeContext runtime; + + public void testModuleWithOneComponent() throws Exception { + Module module = factory.createModule(); + ModuleComponent moduleComponent = factory.createModuleComponent(); + moduleComponent.setImplementation(module); + +// runtime.registerModelObject(moduleComponent); + } + + protected void setUp() throws Exception { + super.setUp(); + + // Create a factory for model objects + factory = new JavaAssemblyFactoryImpl(); + + // Create and bootstrap an empty Tuscany runtime + MonitorFactory monitorFactory = new NullMonitorFactory(); + ContextFactoryBuilderRegistry builderRegistry = BootstrapHelper.bootstrapContextFactoryBuilders(monitorFactory); + DefaultWireBuilder wireBuilder = new DefaultWireBuilder(); + runtime = new RuntimeContextImpl(monitorFactory, builderRegistry, wireBuilder); + runtime.start(); + } + + protected void tearDown() throws Exception { + runtime.stop(); + super.tearDown(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/JavaRuntimeBootstrapTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/JavaRuntimeBootstrapTestCase.java new file mode 100644 index 0000000000..6a9fca90c9 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/JavaRuntimeBootstrapTestCase.java @@ -0,0 +1,53 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.integration; + +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.GenericComponent; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.runtime.RuntimeContext; + +import junit.framework.Assert; +import junit.framework.TestCase; + +/** + * Ensures basic runtime with Java support boots properly + * + * @version $Rev$ $Date$ + */ +public class JavaRuntimeBootstrapTestCase extends TestCase { + + /** + * Tests the runtime can be bootstrapped with Java builders and two module-scoped Java-based components can be wired + */ + public void testRuntimeBoot() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext(MockFactory.SYSTEM_CHILD); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule()); + testCtx.publish(new ModuleStart(this)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().getString(); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/StartStopTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/StartStopTestCase.java new file mode 100644 index 0000000000..8b7ed342c4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/StartStopTestCase.java @@ -0,0 +1,68 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.integration; + +import java.net.URL; +import java.net.URLClassLoader; + +import junit.framework.TestCase; +import org.apache.tuscany.core.client.TuscanyRuntime; +import org.osoa.sca.ModuleContext; +import org.osoa.sca.CurrentModuleContext; + +/** + * @version $Rev$ $Date$ + */ +public class StartStopTestCase extends TestCase { + private ClassLoader oldCL; + + public void testHelloWorld() throws Exception { + TuscanyRuntime tuscany = new TuscanyRuntime("test", null); + tuscany.start(); + ModuleContext moduleContext = CurrentModuleContext.getContext(); + assertNotNull(moduleContext); + + HelloWorldService helloworldService = (HelloWorldService) moduleContext.locateService("HelloWorld"); + assertNotNull(helloworldService); + + String value = helloworldService .getGreetings("World"); + assertEquals("Hello World", value); + tuscany.stop(); + tuscany = new TuscanyRuntime("test", null); + tuscany.start(); + moduleContext = CurrentModuleContext.getContext(); + assertNotNull(moduleContext); + helloworldService = (HelloWorldService) moduleContext.locateService("HelloWorld"); + assertNotNull(helloworldService); + value = helloworldService .getGreetings("World"); + assertEquals("Hello World", value); + tuscany.stop(); + } + + protected void setUp() throws Exception { + super.setUp(); + URL url = getClass().getResource("/helloworldmc/"); + ClassLoader cl = new URLClassLoader(new URL[]{url}, getClass().getClassLoader()); + oldCL = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(cl); + } + + protected void tearDown() throws Exception { + Thread.currentThread().setContextClassLoader(oldCL); + super.tearDown(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/binding/EPtoExternalServiceTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/binding/EPtoExternalServiceTestCase.java new file mode 100644 index 0000000000..17424669bc --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/binding/EPtoExternalServiceTestCase.java @@ -0,0 +1,99 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.integration.binding; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.container.java.assembly.mock.HelloWorldService; +import org.apache.tuscany.container.java.builder.MockInterceptorBuilder; +import org.apache.tuscany.container.java.invocation.mock.MockSyncInterceptor; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.core.builder.system.PolicyBuilderRegistry; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.EntryPointContext; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.event.RequestEnd; +import org.apache.tuscany.core.context.event.RequestStart; +import org.apache.tuscany.core.runtime.RuntimeContext; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class EPtoExternalServiceTestCase extends TestCase { + private Method hello; + + /** + * Tests wiring of an entry point directly to an external service + */ + public void testEPtoESInvocation() throws Throwable { + RuntimeContext runtime = MockFactory.registerFooBinding(MockFactory.createJavaRuntime()); + PolicyBuilderRegistry registry = (PolicyBuilderRegistry) ((CompositeContext) runtime.getSystemContext().getContext(MockFactory.SYSTEM_CHILD)) + .getContext(MockFactory.POLICY_BUILDER_REGISTRY).getInstance(null); + MockSyncInterceptor mockInterceptor = new MockSyncInterceptor(); + MockInterceptorBuilder interceptorBuilder = new MockInterceptorBuilder(mockInterceptor, false); + registry.registerTargetBuilder(interceptorBuilder); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test.module")); + CompositeContext child = (CompositeContext) runtime.getRootContext().getContext("test.module"); + child.registerModelObject(MockFactory.createModuleWithEntryPointToExternalService()); + child.publish(new ModuleStart(this)); + Object id = new Object(); + child.publish(new RequestStart(this, id)); + EntryPointContext ctx = (EntryPointContext) child.getContext("source"); + Assert.assertNotNull(ctx); + InvocationHandler handler = (InvocationHandler) ctx.getHandler(); + Assert.assertEquals(0, mockInterceptor.getCount()); + Object response = handler.invoke(null, hello, new Object[]{"foo"}); + Assert.assertEquals("foo", response); + Assert.assertEquals(1, mockInterceptor.getCount()); + + ctx = (EntryPointContext) child.getContext("source"); + Assert.assertNotNull(ctx); + handler = (InvocationHandler) ctx.getHandler(); + response = handler.invoke(null, hello, new Object[]{"foo"}); + Assert.assertEquals("foo", response); + child.publish(new RequestEnd(this, id)); + + // second request + Object id2 = new Object(); + child.publish(new RequestStart(this, id2)); + ctx = (EntryPointContext) child.getContext("source"); + Assert.assertNotNull(ctx); + handler = (InvocationHandler) ctx.getHandler(); + Assert.assertEquals(2, mockInterceptor.getCount()); + response = handler.invoke(null, hello, new Object[]{"foo"}); + Assert.assertEquals("foo", response); + Assert.assertEquals(3, mockInterceptor.getCount()); + child.publish(new RequestEnd(this, id2)); + + child.publish(new ModuleStop(this)); + runtime.stop(); + + } + + protected void setUp() throws Exception { + super.setUp(); + hello = HelloWorldService.class.getMethod("hello", String.class); + } + + protected void tearDown() throws Exception { + super.tearDown(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/binding/EntryPointToJavaTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/binding/EntryPointToJavaTestCase.java new file mode 100644 index 0000000000..f8ba1e2192 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/binding/EntryPointToJavaTestCase.java @@ -0,0 +1,261 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.integration.binding; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.container.java.assembly.mock.HelloWorldService; +import org.apache.tuscany.container.java.builder.MockInterceptorBuilder; +import org.apache.tuscany.container.java.invocation.mock.MockSyncInterceptor; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.core.builder.system.PolicyBuilderRegistry; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.EntryPointContext; +import org.apache.tuscany.core.context.event.HttpSessionBound; +import org.apache.tuscany.core.context.event.HttpSessionEnd; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.event.RequestEnd; +import org.apache.tuscany.core.context.event.RequestStart; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.model.assembly.Scope; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +/** + * Tests basic entry point functionality with Java components + * + * @version $Rev$ $Date$ + */ +public class EntryPointToJavaTestCase extends TestCase { + + private Method hello; + + public void setUp() throws Exception { + hello = HelloWorldService.class.getMethod("hello", String.class); + } + + /** + * Tests creation and wire of an entry point wired to a module-scoped service offered by a Java component + */ + public void testEPtoJavaModuleScopeInvoke() throws Throwable { + RuntimeContext runtime = MockFactory.registerFooBinding(MockFactory.createJavaRuntime()); + PolicyBuilderRegistry registry = (PolicyBuilderRegistry) ((CompositeContext) runtime.getSystemContext().getContext(MockFactory.SYSTEM_CHILD)) + .getContext(MockFactory.POLICY_BUILDER_REGISTRY).getInstance(null); + + MockSyncInterceptor mockInterceptor = new MockSyncInterceptor(); + MockInterceptorBuilder interceptorBuilder = new MockInterceptorBuilder(mockInterceptor, false); + registry.registerTargetBuilder(interceptorBuilder); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test.module")); + CompositeContext child = (CompositeContext) runtime.getRootContext().getContext("test.module"); + child.registerModelObject(MockFactory.createModuleWithEntryPoint(Scope.MODULE)); + child.publish(new ModuleStart(this)); + Object id = new Object(); + child.publish(new RequestStart(this, id)); + EntryPointContext ctx = (EntryPointContext) child.getContext("source"); + Assert.assertNotNull(ctx); + InvocationHandler handler = (InvocationHandler) ctx.getHandler(); + Assert.assertEquals(0, mockInterceptor.getCount()); + Object response = handler.invoke(null, hello, new Object[]{"foo"}); + Assert.assertEquals("Hello foo", response); + Assert.assertEquals(1, mockInterceptor.getCount()); + Object id2 = new Object(); + child.publish(new RequestStart(this, id2)); + + // second request + Object id3 = new Object(); + child.publish(new RequestStart(this, id3)); + ctx = (EntryPointContext) child.getContext("source"); + Assert.assertNotNull(ctx); + handler = (InvocationHandler) ctx.getHandler(); + Assert.assertEquals(1, mockInterceptor.getCount()); + response = handler.invoke(null, hello, new Object[]{"foo"}); + Assert.assertEquals("Hello foo", response); + Assert.assertEquals(2, mockInterceptor.getCount()); + HelloWorldService service1 = (HelloWorldService) child.getContext("target").getInstance(null); + Assert.assertEquals(2, service1.count()); + child.publish(new RequestEnd(this, id3)); + + child.publish(new ModuleStop(this)); + runtime.stop(); + } + + /** + * Tests creation and wire of an entry point wired to a session-scoped service offered by a Java component + */ + public void testEPtoJavaSessionScopeInvoke() throws Throwable { + RuntimeContext runtime = MockFactory.registerFooBinding(MockFactory.createJavaRuntime()); + PolicyBuilderRegistry registry = (PolicyBuilderRegistry) ((CompositeContext) runtime.getSystemContext().getContext(MockFactory.SYSTEM_CHILD)) + .getContext(MockFactory.POLICY_BUILDER_REGISTRY).getInstance(null); + MockSyncInterceptor mockInterceptor = new MockSyncInterceptor(); + MockInterceptorBuilder interceptorBuilder = new MockInterceptorBuilder(mockInterceptor, false); + registry.registerTargetBuilder(interceptorBuilder); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test.module")); + CompositeContext child = (CompositeContext) runtime.getRootContext().getContext("test.module"); + child.registerModelObject(MockFactory.createModuleWithEntryPoint(Scope.SESSION)); + child.publish(new ModuleStart(this)); + + // first session + Object session = new Object(); + Object id = new Object(); + child.publish(new RequestStart(this, id)); + child.publish(new HttpSessionBound(this, session)); + + EntryPointContext ctx = (EntryPointContext) child.getContext("source"); + Assert.assertNotNull(ctx); + InvocationHandler handler = (InvocationHandler) ctx.getHandler(); + Assert.assertEquals(0, mockInterceptor.getCount()); + Object response = handler.invoke(null, hello, new Object[]{"foo"}); + Assert.assertEquals("Hello foo", response); + Assert.assertEquals(1, mockInterceptor.getCount()); + child.publish(new RequestEnd(this, id)); + + Object id2 = new Object(); + child.publish(new RequestStart(this, id2)); + child.publish(new HttpSessionBound(this, session)); + EntryPointContext ctx2 = (EntryPointContext) child.getContext("source"); + Assert.assertNotNull(ctx2); + response = handler.invoke(null, hello, new Object[]{"foo"}); + Assert.assertEquals("Hello foo", response); + Assert.assertEquals(2, mockInterceptor.getCount()); + HelloWorldService service1 = (HelloWorldService) child.getContext("target").getInstance(null); + Assert.assertEquals(2, service1.count()); + child.publish(new RequestEnd(this, id2)); + child.publish(new HttpSessionEnd(this, session)); + + // second session + Object session2 = new Object(); + child.publish(new RequestStart(this, new Object())); + child.publish(new HttpSessionBound(this, session2)); + + ctx = (EntryPointContext) child.getContext("source"); + Assert.assertNotNull(ctx); + Assert.assertEquals(2, mockInterceptor.getCount()); + response = handler.invoke(null, hello, new Object[]{"foo"}); + Assert.assertEquals("Hello foo", response); + Assert.assertEquals(3, mockInterceptor.getCount()); + child.publish(new HttpSessionBound(this, session2)); + + Object id3 = new Object(); + child.publish(new RequestStart(this, id3)); + child.publish(new HttpSessionBound(this, session2)); + ctx2 = (EntryPointContext) child.getContext("source"); + Assert.assertNotNull(ctx2); + response = handler.invoke(null, hello, new Object[]{"foo"}); + Assert.assertEquals("Hello foo", response); + Assert.assertEquals(4, mockInterceptor.getCount()); + HelloWorldService service2 = (HelloWorldService) child.getContext("target").getInstance(null); + Assert.assertEquals(2, service2.count()); + Assert.assertEquals(2, service1.count()); //ensure sessions not crossed + child.publish(new RequestEnd(this, session2)); + child.publish(new HttpSessionBound(this, session2)); + + child.publish(new ModuleStop(this)); + runtime.stop(); + } + + + /** + * Tests creation and wire of an entry point wired to a module-scoped service offered by a Java component + */ + public void testEPtoJavaStatelessInvoke() throws Throwable { + RuntimeContext runtime = MockFactory.registerFooBinding(MockFactory.createJavaRuntime()); + PolicyBuilderRegistry registry = (PolicyBuilderRegistry) ((CompositeContext) runtime.getSystemContext().getContext(MockFactory.SYSTEM_CHILD)) + .getContext(MockFactory.POLICY_BUILDER_REGISTRY).getInstance(null); + MockSyncInterceptor mockInterceptor = new MockSyncInterceptor(); + MockInterceptorBuilder interceptorBuilder = new MockInterceptorBuilder(mockInterceptor, false); + registry.registerTargetBuilder(interceptorBuilder); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test.module")); + CompositeContext child = (CompositeContext) runtime.getRootContext().getContext("test.module"); + child.registerModelObject(MockFactory.createModuleWithEntryPoint(Scope.INSTANCE)); + child.publish(new ModuleStart(this)); + Object id = new Object(); + child.publish(new RequestStart(this, id)); + EntryPointContext ctx = (EntryPointContext) child.getContext("source"); + Assert.assertNotNull(ctx); + InvocationHandler handler = (InvocationHandler) ctx.getHandler(); + Assert.assertEquals(0, mockInterceptor.getCount()); + Object response = handler.invoke(null, hello, new Object[]{"foo"}); + Assert.assertEquals("Hello foo", response); + Assert.assertEquals(1, mockInterceptor.getCount()); + child.publish(new RequestEnd(this, id)); + + // second request + Object id2 = new Object(); + child.publish(new RequestStart(this, id2)); + ctx = (EntryPointContext) child.getContext("source"); + Assert.assertNotNull(ctx); + handler = (InvocationHandler) ctx.getHandler(); + Assert.assertEquals(1, mockInterceptor.getCount()); + response = handler.invoke(null, hello, new Object[]{"foo"}); + Assert.assertEquals("Hello foo", response); + Assert.assertEquals(2, mockInterceptor.getCount()); + HelloWorldService service1 = (HelloWorldService) child.getContext("target").getInstance(null); + Assert.assertEquals(0, service1.count()); + child.publish(new RequestEnd(this, id)); + + child.publish(new ModuleStop(this)); + runtime.stop(); + } + + public void testEPtoJavaRequestInvoke() throws Throwable { + RuntimeContext runtime = MockFactory.registerFooBinding(MockFactory.createJavaRuntime()); + PolicyBuilderRegistry registry = (PolicyBuilderRegistry) ((CompositeContext) runtime.getSystemContext().getContext(MockFactory.SYSTEM_CHILD)) + .getContext(MockFactory.POLICY_BUILDER_REGISTRY).getInstance(null); + MockSyncInterceptor mockInterceptor = new MockSyncInterceptor(); + MockInterceptorBuilder interceptorBuilder = new MockInterceptorBuilder(mockInterceptor, false); + registry.registerTargetBuilder(interceptorBuilder); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test.module")); + CompositeContext child = (CompositeContext) runtime.getRootContext().getContext("test.module"); + child.registerModelObject(MockFactory.createModuleWithEntryPoint(Scope.REQUEST)); + child.publish(new ModuleStart(this)); + Object id = new Object(); + child.publish(new RequestStart(this, id)); + EntryPointContext ctx = (EntryPointContext) child.getContext("source"); + Assert.assertNotNull(ctx); + InvocationHandler handler = (InvocationHandler) ctx.getHandler(); + Assert.assertEquals(0, mockInterceptor.getCount()); + Object response = handler.invoke(null, hello, new Object[]{"foo"}); + Assert.assertEquals("Hello foo", response); + Assert.assertEquals(1, mockInterceptor.getCount()); + + ctx = (EntryPointContext) child.getContext("source"); + Assert.assertNotNull(ctx); + handler = (InvocationHandler) ctx.getHandler(); + response = handler.invoke(null, hello, new Object[]{"foo"}); + HelloWorldService service1 = (HelloWorldService) child.getContext("target").getInstance(null); + Assert.assertEquals(2, service1.count()); + + child.publish(new RequestEnd(this, id)); + + // second request + Object id2 = new Object(); + child.publish(new RequestStart(this, id2)); + ctx = (EntryPointContext) child.getContext("source"); + Assert.assertNotNull(ctx); + handler = (InvocationHandler) ctx.getHandler(); + Assert.assertEquals(2, mockInterceptor.getCount()); + response = handler.invoke(null, hello, new Object[]{"foo"}); + Assert.assertEquals("Hello foo", response); + Assert.assertEquals(3, mockInterceptor.getCount()); + HelloWorldService service2 = (HelloWorldService) child.getContext("target").getInstance(null); + Assert.assertEquals(1, service2.count()); + child.publish(new RequestEnd(this, id2)); + + child.publish(new ModuleStop(this)); + runtime.stop(); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/binding/ExternalServiceProxyInvokeTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/binding/ExternalServiceProxyInvokeTestCase.java new file mode 100644 index 0000000000..7357f973f7 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/binding/ExternalServiceProxyInvokeTestCase.java @@ -0,0 +1,73 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.integration.binding; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.container.java.assembly.mock.HelloWorldService; +import org.apache.tuscany.container.java.builder.MockInterceptorBuilder; +import org.apache.tuscany.container.java.invocation.mock.MockSyncInterceptor; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.core.builder.system.PolicyBuilderRegistry; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.event.RequestEnd; +import org.apache.tuscany.core.context.event.RequestStart; +import org.apache.tuscany.core.runtime.RuntimeContext; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class ExternalServiceProxyInvokeTestCase extends TestCase { + + /** + * Tests that an external service can be invoked by locating a proxy to it as opposed to invoking it over a wire from another + * source such as an entry point or external service. + * + * @throws Throwable + */ + public void testProxyInvocation() throws Throwable { + RuntimeContext runtime = MockFactory.registerFooBinding(MockFactory.createJavaRuntime()); + PolicyBuilderRegistry registry = (PolicyBuilderRegistry) ((CompositeContext) runtime.getSystemContext().getContext(MockFactory.SYSTEM_CHILD)) + .getContext(MockFactory.POLICY_BUILDER_REGISTRY).getInstance(null); + MockSyncInterceptor mockInterceptor = new MockSyncInterceptor(); + MockInterceptorBuilder interceptorBuilder = new MockInterceptorBuilder(mockInterceptor, false); + registry.registerTargetBuilder(interceptorBuilder); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test.module")); + CompositeContext child = (CompositeContext) runtime.getRootContext().getContext("test.module"); + child.registerModelObject(MockFactory.createModuleWithEntryPointToExternalService()); + child.publish(new ModuleStart(this)); + Object id = new Object(); + child.publish(new RequestStart(this, id)); + HelloWorldService service1 = (HelloWorldService) child.getContext("target").getInstance(null); + Assert.assertEquals("foo", service1.hello("foo")); + + child.publish(new RequestEnd(this, id)); + child.publish(new ModuleStop(this)); + runtime.stop(); + + } + + protected void setUp() throws Exception { + super.setUp(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/binding/JavaToExternalServiceTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/binding/JavaToExternalServiceTestCase.java new file mode 100644 index 0000000000..90acb1c591 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/binding/JavaToExternalServiceTestCase.java @@ -0,0 +1,61 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.integration.binding; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.container.java.assembly.mock.HelloWorldService; +import org.apache.tuscany.container.java.builder.MockInterceptorBuilder; +import org.apache.tuscany.container.java.invocation.mock.MockSyncInterceptor; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.core.builder.system.PolicyBuilderRegistry; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.runtime.RuntimeContext; + +/** + * Tests basic Java to external service interaction + * + * @version $Rev$ $Date$ + */ +public class JavaToExternalServiceTestCase extends TestCase { + + /** + * Tests an wire of an external service configured with the {@link org.apache.tuscany.container.java.mock.binding.foo.FooBinding} + * from a Java component + * + * @throws Exception + */ + public void testJavaToESInvoke() throws Exception { + RuntimeContext runtime = MockFactory.registerFooBinding(MockFactory.createJavaRuntime()); + PolicyBuilderRegistry registry = (PolicyBuilderRegistry) ((CompositeContext) runtime.getSystemContext().getContext( + MockFactory.SYSTEM_CHILD)).getContext(MockFactory.POLICY_BUILDER_REGISTRY).getInstance(null); + MockSyncInterceptor mockInterceptor = new MockSyncInterceptor(); + MockInterceptorBuilder interceptorBuilder = new MockInterceptorBuilder(mockInterceptor, false); + registry.registerTargetBuilder(interceptorBuilder); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test.module")); + CompositeContext child = (CompositeContext) runtime.getRootContext().getContext("test.module"); + child.registerModelObject(MockFactory.createModuleWithExternalService()); + child.publish(new ModuleStart(this)); + HelloWorldService source = (HelloWorldService) child.getContext("source").getInstance(null); + Assert.assertNotNull(source); + Assert.assertEquals(0, mockInterceptor.getCount()); + Assert.assertEquals("foo", source.hello("foo")); + Assert.assertEquals(1, mockInterceptor.getCount()); + child.publish(new ModuleStop(this)); + runtime.stop(); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/context/ScopeReferenceTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/context/ScopeReferenceTestCase.java new file mode 100644 index 0000000000..89320f60e5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/integration/context/ScopeReferenceTestCase.java @@ -0,0 +1,741 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.integration.context; + +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.GenericComponent; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.RequestStart; +import org.apache.tuscany.core.context.event.HttpSessionBound; +import org.apache.tuscany.core.context.event.RequestEnd; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.model.assembly.Scope; + +import junit.framework.Assert; +import junit.framework.TestCase; + +/** + * Tests scoping is properly handled for service references + * + * @version $Rev$ $Date$ + */ +public class ScopeReferenceTestCase extends TestCase { + + /** + * Tests a module-to-module scoped wire is setup properly by the runtime + */ + public void testModuleToModule() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext("tuscany.system.child"); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule()); + testCtx.publish(new ModuleStart(this)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().getString(); + } + + /** + * Tests a module-to-session scoped wire is setup properly by the runtime + */ + public void testModuleToSession() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext("tuscany.system.child"); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule(Scope.MODULE,Scope.SESSION)); + testCtx.publish(new ModuleStart(this)); + + // first session + Object session = new Object(); + Object id = new Object(); + testCtx.publish(new RequestStart(this,id)); + testCtx.publish(new HttpSessionBound(this,session)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().setString("foo"); + Assert.assertEquals("foo",target.getString()); + testCtx.publish(new RequestEnd(this,id)); + + //second session + Object session2 = new Object(); + Object id2 = new Object(); + testCtx.publish(new RequestStart(this,id2)); + testCtx.publish(new HttpSessionBound(this,session2)); + GenericComponent target2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target2); + Assert.assertTrue(!"foo".equals(target2.getString())); + + Assert.assertTrue(!"foo".equals(source.getGenericComponent().getString())); + source.getGenericComponent().setString("bar"); + Assert.assertEquals("bar",target2.getString()); + Assert.assertEquals("bar",source.getGenericComponent().getString()); + //testCtx.fireEvent(EventContext.SESSION_NOTIFY,session); + + } + + /** + * Tests a module-to-request scoped wire is setup properly by the runtime + */ + public void testModuleToRequest() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext("tuscany.system.child"); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule(Scope.MODULE,Scope.REQUEST)); + testCtx.publish(new ModuleStart(this)); + + // first request + Object id = new Object(); + testCtx.publish(new RequestStart(this,id)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().setString("foo"); + Assert.assertEquals("foo",target.getString()); + testCtx.publish(new RequestEnd(this,id)); + + //second request + Object id2 = new Object(); + testCtx.publish(new RequestStart(this,id2)); + GenericComponent target2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target2); + Assert.assertTrue(!"foo".equals(target2.getString())); + + Assert.assertTrue(!"foo".equals(source.getGenericComponent().getString())); + source.getGenericComponent().setString("bar"); + Assert.assertEquals("bar",target2.getString()); + Assert.assertEquals("bar",source.getGenericComponent().getString()); + + } + + /** + * Tests a module-to-stateless scoped wire is setup properly by the runtime + */ + public void testModuleToStateless() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext("tuscany.system.child"); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule(Scope.MODULE,Scope.INSTANCE)); + testCtx.publish(new ModuleStart(this)); + + // first request + Object id = new Object(); + testCtx.publish(new RequestStart(this,id)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().setString("foo"); + Assert.assertTrue(!"foo".equals(target.getString())); + testCtx.publish(new RequestEnd(this,id)); + + //second request + Object id2 = new Object(); + testCtx.publish(new RequestStart(this,id2)); + GenericComponent target2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target2); + Assert.assertTrue(!"foo".equals(target2.getString())); + + Assert.assertTrue(!"foo".equals(source.getGenericComponent().getString())); + source.getGenericComponent().setString("bar"); + Assert.assertTrue(!"bar".equals(target2.getString())); + } + + /** + * Tests a session-to-session scoped wire is setup properly by the runtime + */ + public void testSessionToSession() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext("tuscany.system.child"); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule(Scope.SESSION,Scope.SESSION)); + testCtx.publish(new ModuleStart(this)); + + // first session + Object session = new Object(); + Object id = new Object(); + testCtx.publish(new RequestStart(this,id)); + testCtx.publish(new HttpSessionBound(this,session)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().setString("foo"); + source.getGenericComponent().setString("foo"); + Assert.assertEquals("foo",target.getString()); + testCtx.publish(new RequestEnd(this,id)); + + //second session + Object session2 = new Object(); + Object id2 = new Object(); + testCtx.publish(new RequestStart(this,id2)); + testCtx.publish(new HttpSessionBound(this,session2)); + GenericComponent source2 = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source2); + GenericComponent target2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + + Assert.assertNotNull(target2); + Assert.assertEquals(null,target2.getString()); + Assert.assertEquals(null,source2.getGenericComponent().getString()); + source2.getGenericComponent().setString("baz"); + Assert.assertEquals("baz",source2.getGenericComponent().getString()); + Assert.assertEquals("baz",target2.getString()); + + testCtx.publish(new RequestEnd(this,id2)); + + } + + + /** + * Tests a session-to-module scoped wire is setup properly by the runtime + */ + public void testSessionToModule() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext("tuscany.system.child"); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule(Scope.SESSION,Scope.MODULE)); + testCtx.publish(new ModuleStart(this)); + + // first session + Object session = new Object(); + Object id = new Object(); + testCtx.publish(new RequestStart(this,id)); + testCtx.publish(new HttpSessionBound(this,session)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().setString("foo"); + source.getGenericComponent().setString("foo"); + Assert.assertEquals("foo",target.getString()); + testCtx.publish(new RequestEnd(this,id)); + + //second session + Object session2 = new Object(); + Object id2 = new Object(); + testCtx.publish(new RequestStart(this,id2)); + testCtx.publish(new HttpSessionBound(this,session2)); + GenericComponent source2 = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source2); + GenericComponent target2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + + Assert.assertNotNull(target2); + Assert.assertEquals("foo",target2.getString()); + Assert.assertEquals("foo",source2.getGenericComponent().getString()); + source2.getGenericComponent().setString("baz"); + Assert.assertEquals("baz",source2.getGenericComponent().getString()); + Assert.assertEquals("baz",target2.getString()); + Assert.assertEquals("baz",target.getString()); + + testCtx.publish(new RequestEnd(this,session2)); + + } + + /** + * Tests a session-to-request scoped wire is setup properly by the runtime + */ + public void testSessionToRequest() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext("tuscany.system.child"); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule(Scope.SESSION,Scope.REQUEST)); + testCtx.publish(new ModuleStart(this)); + + // first session + Object session = new Object(); + Object id = new Object(); + testCtx.publish(new RequestStart(this,id)); + testCtx.publish(new HttpSessionBound(this,session)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().setString("foo"); + Assert.assertEquals("foo",target.getString()); + testCtx.publish(new RequestEnd(this,session)); + + //second session + Object session2 = new Object(); + Object id2 = new Object(); + testCtx.publish(new RequestStart(this,id2)); + testCtx.publish(new HttpSessionBound(this,session2)); + GenericComponent source2 = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + + Assert.assertNotNull(target2); + Assert.assertEquals(null,target2.getString()); + source2.getGenericComponent().setString("baz"); + Assert.assertEquals("baz",target2.getString()); + Assert.assertEquals("baz",source2.getGenericComponent().getString()); + + Assert.assertEquals("foo",target.getString()); + testCtx.publish(new RequestEnd(this,session)); + + } + + + /** + * Tests a session-to-stateless scoped wire is setup properly by the runtime + */ + public void testSessionToStateless() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext("tuscany.system.child"); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule(Scope.SESSION,Scope.INSTANCE)); + testCtx.publish(new ModuleStart(this)); + + // first session + Object session = new Object(); + Object id = new Object(); + testCtx.publish(new RequestStart(this,id)); + testCtx.publish(new HttpSessionBound(this,session)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().setString("foo"); + Assert.assertEquals(null,target.getString()); + testCtx.publish(new RequestEnd(this,session)); + + //second session + Object session2 = new Object(); + Object id2 = new Object(); + testCtx.publish(new RequestStart(this,id2)); + testCtx.publish(new HttpSessionBound(this,session2)); + GenericComponent source2 = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + + Assert.assertNotNull(target2); + Assert.assertEquals(null,target2.getString()); + source2.getGenericComponent().setString("baz"); + Assert.assertEquals(null,target2.getString()); //Note assumes no pooling + Assert.assertEquals(null,source2.getGenericComponent().getString()); + + Assert.assertEquals(null,target.getString()); //Note assumes no pooling + testCtx.publish(new RequestEnd(this,session)); + + } + + /** + * Tests a request-to-request scoped wire is setup properly by the runtime + */ + public void testRequestToRequest() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext("tuscany.system.child"); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule(Scope.REQUEST,Scope.REQUEST)); + testCtx.publish(new ModuleStart(this)); + + // first request + Object id = new Object(); + testCtx.publish(new RequestStart(this,id)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().setString("foo"); + Assert.assertEquals("foo",target.getString()); + testCtx.publish(new RequestEnd(this,new Object())); + + //second request + Object id2 = new Object(); + testCtx.publish(new RequestStart(this,id2)); + GenericComponent source2 = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source2); + GenericComponent target2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + + Assert.assertNotNull(target2); + Assert.assertEquals(null,target2.getString()); + Assert.assertEquals(null,source2.getGenericComponent().getString()); + source2.getGenericComponent().setString("baz"); + Assert.assertEquals("baz",source2.getGenericComponent().getString()); + Assert.assertEquals("baz",target2.getString()); + + testCtx.publish(new RequestEnd(this,new Object())); + } + + /** + * Tests a request-to-module scoped wire is setup properly by the runtime + */ + public void testRequestToModule() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext("tuscany.system.child"); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule(Scope.REQUEST,Scope.MODULE)); + testCtx.publish(new ModuleStart(this)); + + // first request + Object id = new Object(); + testCtx.publish(new RequestStart(this,id)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().setString("foo"); + Assert.assertEquals("foo",target.getString()); + testCtx.publish(new RequestEnd(this,new Object())); + + //second request + Object id2 = new Object(); + testCtx.publish(new RequestStart(this,id2)); + GenericComponent source2 = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source2); + GenericComponent target2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + + Assert.assertNotNull(target2); + Assert.assertEquals("foo",target2.getString()); + Assert.assertEquals("foo",source2.getGenericComponent().getString()); + source2.getGenericComponent().setString("baz"); + Assert.assertEquals("baz",source2.getGenericComponent().getString()); + Assert.assertEquals("baz",target2.getString()); + Assert.assertEquals("baz",target.getString()); + + testCtx.publish(new RequestEnd(this,new Object())); + } + + /** + * Tests a request-to-session scoped wire is setup properly by the runtime + */ + public void testRequestToSession() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext("tuscany.system.child"); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule(Scope.REQUEST,Scope.SESSION)); + testCtx.publish(new ModuleStart(this)); + + // first session + Object session = new Object(); + Object id = new Object(); + testCtx.publish(new RequestStart(this,id)); + testCtx.publish(new HttpSessionBound(this,session)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().setString("foo"); + Assert.assertEquals("foo",target.getString()); + testCtx.publish(new RequestEnd(this,new Object())); + + //second request for session + Object id2 = new Object(); + testCtx.publish(new RequestStart(this,id2)); + testCtx.publish(new HttpSessionBound(this,session)); + GenericComponent targetR2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertEquals("foo",targetR2.getString()); + GenericComponent sourceR2 = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(sourceR2); + Assert.assertEquals("foo",sourceR2.getGenericComponent().getString()); + + testCtx.publish(new RequestEnd(this,new Object())); + + //second session + Object session2 = new Object(); + Object id3 = new Object(); + testCtx.publish(new RequestStart(this,id3)); + testCtx.publish(new HttpSessionBound(this,session2)); + GenericComponent source2 = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source2); + GenericComponent target2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + + Assert.assertNotNull(target2); + Assert.assertEquals(null,target2.getString()); + Assert.assertEquals(null,source2.getGenericComponent().getString()); + source2.getGenericComponent().setString("baz"); + Assert.assertEquals("baz",source2.getGenericComponent().getString()); + Assert.assertEquals("baz",target2.getString()); + + testCtx.publish(new RequestEnd(this,session2)); + Object id4 = new Object(); + testCtx.publish(new RequestStart(this,id4)); + testCtx.publish(new HttpSessionBound(this,session)); + testCtx.publish(new RequestEnd(this,session)); + + } + + + /** + * Tests a request-to-stateless scoped wire is setup properly by the runtime + */ + public void testRequestToStateless() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext("tuscany.system.child"); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule(Scope.REQUEST,Scope.INSTANCE)); + testCtx.publish(new ModuleStart(this)); + + // first request + Object id = new Object(); + testCtx.publish(new RequestStart(this,id)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().setString("foo"); + Assert.assertEquals(null,target.getString()); + testCtx.publish(new RequestEnd(this,new Object())); + + //second request + Object id2 = new Object(); + testCtx.publish(new RequestStart(this,id2)); + GenericComponent source2 = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source2); + GenericComponent target2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + + Assert.assertNotNull(target2); + Assert.assertEquals(null,target2.getString()); + Assert.assertEquals(null,source2.getGenericComponent().getString()); + source2.getGenericComponent().setString("baz"); + Assert.assertEquals(null,source2.getGenericComponent().getString()); + Assert.assertEquals(null,target2.getString()); + + testCtx.publish(new RequestEnd(this,new Object())); + } + + + /** + * Tests a stateless-to-stateless scoped wire is setup properly by the runtime + */ + public void testStatelessToStateless() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext("tuscany.system.child"); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule(Scope.INSTANCE,Scope.INSTANCE)); + testCtx.publish(new ModuleStart(this)); + + // first request + Object id = new Object(); + testCtx.publish(new RequestStart(this,id)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().setString("foo"); + Assert.assertEquals(null,target.getString()); + testCtx.publish(new RequestEnd(this,new Object())); + + //second request + Object id2 = new Object(); + testCtx.publish(new RequestStart(this,id2)); + GenericComponent source2 = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source2); + GenericComponent target2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + + Assert.assertNotNull(target2); + Assert.assertEquals(null,target2.getString()); + Assert.assertEquals(null,source2.getGenericComponent().getString()); + source2.getGenericComponent().setString("baz"); + Assert.assertEquals(null,source2.getGenericComponent().getString()); + Assert.assertEquals(null,target2.getString()); + + testCtx.publish(new RequestEnd(this,new Object())); + } + + /** + * Tests a stateless-to-request scoped wire is setup properly by the runtime + */ + public void testStatelessToRequest() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext("tuscany.system.child"); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule(Scope.INSTANCE,Scope.REQUEST)); + testCtx.publish(new ModuleStart(this)); + + // first request + Object id = new Object(); + testCtx.publish(new RequestStart(this,id)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().setString("foo"); + Assert.assertEquals("foo",target.getString()); + testCtx.publish(new RequestEnd(this,new Object())); + + GenericComponent targetR1 = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(targetR1); + Assert.assertEquals("foo",target.getString()); + + //second request + Object id2 = new Object(); + testCtx.publish(new RequestStart(this,id2)); + GenericComponent source2 = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source2); + GenericComponent target2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + + Assert.assertNotNull(target2); + Assert.assertEquals(null,target2.getString()); + Assert.assertEquals(null,source2.getGenericComponent().getString()); + source2.getGenericComponent().setString("baz"); + Assert.assertEquals("baz",source2.getGenericComponent().getString()); + Assert.assertEquals("baz",target2.getString()); + + testCtx.publish(new RequestEnd(this,new Object())); + } + + /** + * Tests a stateless-to-session scoped wire is setup properly by the runtime + */ + public void testStatelessToSession() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext("tuscany.system.child"); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule(Scope.INSTANCE,Scope.SESSION)); + testCtx.publish(new ModuleStart(this)); + + // first session + Object session = new Object(); + Object id = new Object(); + testCtx.publish(new RequestStart(this,id)); + testCtx.publish(new HttpSessionBound(this,session)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().setString("foo"); + Assert.assertEquals("foo",target.getString()); + testCtx.publish(new RequestEnd(this,new Object())); + + //second request for session + Object id2 = new Object(); + testCtx.publish(new RequestStart(this,id2)); + testCtx.publish(new HttpSessionBound(this,session)); + GenericComponent targetR2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertEquals("foo",targetR2.getString()); + GenericComponent sourceR2 = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(sourceR2); + Assert.assertEquals("foo",sourceR2.getGenericComponent().getString()); + + testCtx.publish(new RequestEnd(this,new Object())); + + //second session + Object session2 = new Object(); + Object id3 = new Object(); + testCtx.publish(new RequestStart(this,id3)); + testCtx.publish(new HttpSessionBound(this,session2)); + GenericComponent source2 = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source2); + GenericComponent target2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + + Assert.assertNotNull(target2); + Assert.assertEquals(null,target2.getString()); + Assert.assertEquals(null,source2.getGenericComponent().getString()); + source2.getGenericComponent().setString("baz"); + Assert.assertEquals("baz",source2.getGenericComponent().getString()); + Assert.assertEquals("baz",target2.getString()); + + testCtx.publish(new RequestEnd(this,session2)); + Object id4 = new Object(); + testCtx.publish(new RequestStart(this,id4)); + testCtx.publish(new HttpSessionBound(this,session)); + testCtx.publish(new RequestEnd(this,session)); + + } + + + /** + * Tests a stateless-to-module scoped wire is setup properly by the runtime + */ + public void testStatelessToModule() throws Exception{ + RuntimeContext runtime = MockFactory.createJavaRuntime(); + Context ctx = runtime.getSystemContext().getContext("tuscany.system.child"); + Assert.assertNotNull(ctx); + runtime.getRootContext().registerModelObject(MockFactory.createCompositeComponent("test")); + CompositeContext testCtx = (CompositeContext) runtime.getRootContext().getContext("test"); + Assert.assertNotNull(testCtx); + testCtx.registerModelObject(MockFactory.createModule(Scope.INSTANCE,Scope.MODULE)); + testCtx.publish(new ModuleStart(this)); + + Object id = new Object(); + testCtx.publish(new RequestStart(this,id)); + GenericComponent source = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + GenericComponent target = (GenericComponent)testCtx.getContext("target").getInstance(null); + Assert.assertNotNull(target); + source.getGenericComponent().setString("foo"); + Assert.assertEquals("foo",target.getString()); + testCtx.publish(new RequestEnd(this,new Object())); + + //second session + Object id2 = new Object(); + testCtx.publish(new RequestStart(this,id2)); + GenericComponent source2 = (GenericComponent)testCtx.getContext("source").getInstance(null); + Assert.assertNotNull(source2); + GenericComponent target2 = (GenericComponent)testCtx.getContext("target").getInstance(null); + + Assert.assertNotNull(target2); + Assert.assertEquals("foo",target2.getString()); + Assert.assertEquals("foo",source2.getGenericComponent().getString()); + source2.getGenericComponent().setString("baz"); + Assert.assertEquals("baz",source2.getGenericComponent().getString()); + Assert.assertEquals("baz",target2.getString()); + + testCtx.publish(new RequestEnd(this,new Object())); + + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/MediationTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/MediationTestCase.java new file mode 100644 index 0000000000..e560af6fd3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/MediationTestCase.java @@ -0,0 +1,53 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.invocation; + +import java.lang.reflect.Method; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.container.java.invocation.mock.SimpleTargetImpl; +import org.apache.tuscany.core.message.Message; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; + +/** + * Tests invoking on a different interface from the one actually implemented by the target + * + * @version $Rev$ $Date$ + */ +public class MediationTestCase extends TestCase { + + private Method hello; + + private MessageFactory msgFactory = new MessageFactoryImpl(); + + public void setUp() throws Exception { + hello = Hello.class.getMethod("hello", String.class); + } + + public void testMediation() throws Exception { + StaticJavaComponentTargetInvoker invoker = new StaticJavaComponentTargetInvoker(hello, new SimpleTargetImpl()); + Message msg = msgFactory.createMessage(); + msg.setBody("foo"); + Assert.assertEquals("foo", invoker.invoke(msg).getBody()); + } + + public interface Hello { + + public String hello(String message) throws Exception; + + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/ScopedPojoInvokerTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/ScopedPojoInvokerTestCase.java new file mode 100644 index 0000000000..f4337fe3cb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/ScopedPojoInvokerTestCase.java @@ -0,0 +1,53 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.invocation; + +import java.lang.reflect.Method; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.container.java.invocation.mock.SimpleTarget; +import org.apache.tuscany.container.java.mock.MockScopeContext; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ScopeContext; + +public class ScopedPojoInvokerTestCase extends TestCase { + + private Method echoMethod; + + public ScopedPojoInvokerTestCase() { + super(); + } + + public ScopedPojoInvokerTestCase(String arg0) { + super(arg0); + } + + public void setUp() throws Exception { + echoMethod = SimpleTarget.class.getDeclaredMethod("echo", String.class); + Assert.assertNotNull(echoMethod); + } + + public void testScopedInvoke() throws Exception { + ScopeContext container = new MockScopeContext(); + ScopedJavaComponentInvoker invoker = new ScopedJavaComponentInvoker(new QualifiedName("foo"), echoMethod, container,false); + Object ret = invoker.invokeTarget("foo"); + Assert.assertEquals("foo", ret); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/StaticPojoInvokerTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/StaticPojoInvokerTestCase.java new file mode 100644 index 0000000000..31e7e3c64e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/StaticPojoInvokerTestCase.java @@ -0,0 +1,154 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.invocation; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import static java.lang.Integer.*; + +import junit.framework.Assert; +import junit.framework.TestCase; + +public class StaticPojoInvokerTestCase extends TestCase { + + private Method echoMethod; + private Method arrayMethod; + private Method nullParamMethod; + private Method primitiveMethod; + private Method checkedMethod; + private Method runtimeMethod; + + public StaticPojoInvokerTestCase() { + + } + + public StaticPojoInvokerTestCase(String arg0) { + super(arg0); + } + + public void setUp() throws Exception { + echoMethod = TestBean.class.getDeclaredMethod("echo", String.class); + arrayMethod = TestBean.class.getDeclaredMethod("arrayEcho", String[].class); + nullParamMethod = TestBean.class.getDeclaredMethod("nullParam", (Class[]) null); + primitiveMethod = TestBean.class.getDeclaredMethod("primitiveEcho", TYPE); + checkedMethod = TestBean.class.getDeclaredMethod("checkedException", (Class[]) null); + runtimeMethod = TestBean.class.getDeclaredMethod("runtimeException", (Class[]) null); + Assert.assertNotNull(echoMethod); + Assert.assertNotNull(checkedMethod); + Assert.assertNotNull(runtimeMethod); + } + + public void testObjectInvoke() throws Throwable { + TestBean bean = new TestBean(); + StaticJavaComponentTargetInvoker invoker = new StaticJavaComponentTargetInvoker(echoMethod, bean); + Object ret = invoker.invokeTarget("foo"); + Assert.assertEquals("foo", ret); + } + + public void testArrayInvoke() throws Throwable { + TestBean bean = new TestBean(); + StaticJavaComponentTargetInvoker invoker = new StaticJavaComponentTargetInvoker(arrayMethod, bean); + String[] args = new String[]{"foo", "bar"}; + Object ret = invoker.invokeTarget(new Object[]{args}); + String[] retA = (String[]) ret; + Assert.assertNotNull(retA); + Assert.assertEquals(2, retA.length); + Assert.assertEquals("foo", retA[0]); + Assert.assertEquals("bar", retA[1]); + } + + public void testNullInvoke() throws Throwable { + TestBean bean = new TestBean(); + StaticJavaComponentTargetInvoker invoker = new StaticJavaComponentTargetInvoker(nullParamMethod, bean); + Object ret = invoker.invokeTarget(null); + String retS = (String) ret; + Assert.assertEquals("foo", retS); + } + + public void testPrimitiveInvoke() throws Throwable { + TestBean bean = new TestBean(); + StaticJavaComponentTargetInvoker invoker = new StaticJavaComponentTargetInvoker(primitiveMethod, bean); + Object ret = invoker.invokeTarget(new Integer[]{1}); + Integer retI = (Integer) ret; + Assert.assertEquals(1, retI.intValue()); + } + + public void testInvokeCheckedException() throws Throwable { + TestBean bean = new TestBean(); + StaticJavaComponentTargetInvoker invoker = new StaticJavaComponentTargetInvoker(checkedMethod, bean); + try { + invoker.invokeTarget(null); + } catch (InvocationTargetException e) { + if (e.getCause() != null && TestException.class.equals(e.getCause().getClass())) { + return; + } + } catch (Throwable e) { + } + fail(TestException.class.getName() + " should have been thrown"); + } + + public void testInvokeRuntimeException() throws Throwable { + TestBean bean = new TestBean(); + StaticJavaComponentTargetInvoker invoker = new StaticJavaComponentTargetInvoker(runtimeMethod, bean); + try { + invoker.invokeTarget(null); + } catch (InvocationTargetException e) { + if (e.getCause() != null && e.getCause() instanceof TestRuntimeException) { + return; + } + } + fail(TestException.class.getName() + " should have been thrown"); + } + + private class TestBean { + + public String echo(String msg) throws Exception { + Assert.assertEquals("foo", msg); + return msg; + } + + public String[] arrayEcho(String[] msg) throws Exception { + Assert.assertNotNull(msg); + Assert.assertEquals(2, msg.length); + Assert.assertEquals("foo", msg[0]); + Assert.assertEquals("bar", msg[1]); + return msg; + } + + public String nullParam() throws Exception { + return "foo"; + } + + public int primitiveEcho(int i) throws Exception { + return i; + } + + public void checkedException() throws TestException { + throw new TestException(); + } + + public void runtimeException() throws TestRuntimeException { + throw new TestRuntimeException(); + } + } + + public class TestException extends Exception { + } + + public class TestRuntimeException extends RuntimeException { + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/MockHandler.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/MockHandler.java new file mode 100644 index 0000000000..cda09e8540 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/MockHandler.java @@ -0,0 +1,38 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.invocation.mock; + +import org.apache.tuscany.core.wire.MessageHandler; +import org.apache.tuscany.core.message.Message; + +/** + * + */ +public class MockHandler implements MessageHandler { + + private int count =0; + + public boolean processMessage(Message message) { + //System.out.println("Invoking handler"); + count++; + return true; + } + + public int getCount(){ + return count; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/MockSyncInterceptor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/MockSyncInterceptor.java new file mode 100644 index 0000000000..24b22a641a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/MockSyncInterceptor.java @@ -0,0 +1,45 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.invocation.mock; + +import org.apache.tuscany.core.wire.Interceptor; +import org.apache.tuscany.core.message.Message; + +public class MockSyncInterceptor implements Interceptor { + + private int count; + + private Interceptor next; + + public MockSyncInterceptor() { + } + + public Message invoke(Message msg) { + ++count; + //System.out.println("Invoking interceptor"); + return next.invoke(msg); + } + + public int getCount() { + return count; + } + + public void setNext(Interceptor next) { + this.next=next; + } +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/SimpleSource.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/SimpleSource.java new file mode 100644 index 0000000000..213caab7e9 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/SimpleSource.java @@ -0,0 +1,25 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.invocation.mock; + +public interface SimpleSource { + + public void invokeHello() throws Exception; + + public void invokeGoodbye() throws Exception; +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/SimpleSourceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/SimpleSourceImpl.java new file mode 100644 index 0000000000..2e7bd75f11 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/SimpleSourceImpl.java @@ -0,0 +1,36 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.invocation.mock; + +public class SimpleSourceImpl implements SimpleSource { + + private SimpleTarget proxy; + + public SimpleSourceImpl(SimpleTarget proxy) { + this.proxy = proxy; + } + + public void invokeHello() throws Exception { + proxy.hello("hello"); + } + + public void invokeGoodbye() throws Exception { + proxy.goodbye("hello"); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/SimpleTarget.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/SimpleTarget.java new file mode 100644 index 0000000000..cbd3037529 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/SimpleTarget.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.invocation.mock; + +public interface SimpleTarget { + + public String hello(String message) throws Exception; + + public String goodbye(String message) throws Exception; + + public String echo(String message) throws Exception; + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/SimpleTargetImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/SimpleTargetImpl.java new file mode 100644 index 0000000000..18abf6108a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/invocation/mock/SimpleTargetImpl.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.invocation.mock; + +public class SimpleTargetImpl implements SimpleTarget { + + public SimpleTargetImpl() { + super(); + } + + public String hello(String message) throws Exception { + return message; + } + + public String goodbye(String message) throws Exception { + return message; + } + + public String echo(String message) throws Exception { + return message; + } + + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/loader/JavaImplementationLoaderTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/loader/JavaImplementationLoaderTestCase.java new file mode 100644 index 0000000000..85e79d8780 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/loader/JavaImplementationLoaderTestCase.java @@ -0,0 +1,134 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.container.java.loader; + +import java.net.URL; +import java.util.List; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.namespace.QName; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.container.java.assembly.JavaAssemblyFactory; +import org.apache.tuscany.container.java.assembly.impl.JavaAssemblyFactoryImpl; +import org.apache.tuscany.container.java.assembly.mock.HelloWorldImpl; +import org.apache.tuscany.container.java.assembly.mock.HelloWorldWithFieldProperties; +import org.apache.tuscany.container.java.assembly.mock.NakedHelloWorld; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.StAXElementLoader; +import org.apache.tuscany.core.loader.StAXLoaderRegistry; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.core.loader.assembly.AssemblyConstants; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Property; +import org.apache.tuscany.model.assembly.Service; + +/** + * @version $Rev$ $Date$ + */ +public class JavaImplementationLoaderTestCase extends TestCase { + private JavaImplementationLoader loader; + private ComponentType mockType; + + public void testNakedHelloWorld() throws ConfigurationLoadException { + ComponentType type = loader.loadComponentTypeByIntrospection(NakedHelloWorld.class); + Assert.assertNotNull(type); + Assert.assertEquals(1,type.getProperties().size()); + Assert.assertTrue(type.getReferences().isEmpty()); + List<Service> services = type.getServices(); + Assert.assertEquals(1, services.size()); + Assert.assertEquals("NakedHelloWorld", services.get(0).getName()); + } + + public void testHelloWorldWithSidefile() throws XMLStreamException, ConfigurationLoadException { + StAXLoaderRegistry mockRegistry = new MockRegistry(mockType); + loader.setRegistry(mockRegistry); + URL sidefile = HelloWorldImpl.class.getResource("HelloWorldImpl.componentType"); + ComponentType type = loader.loadComponentTypeFromSidefile(sidefile, null); + assertSame(mockType, type); + } + + public void testHelloWorldWithFieldProperties() throws ConfigurationLoadException { + ComponentType type = loader.loadComponentTypeByIntrospection(HelloWorldWithFieldProperties.class); + type.initialize(null); + Assert.assertNotNull(type); + List<Property> props = type.getProperties(); + Assert.assertEquals(5, props.size()); + + Property prop = type.getProperty("text"); + Assert.assertNotNull(prop); + Assert.assertEquals("text", prop.getName()); + Assert.assertEquals(false, prop.isRequired()); + Assert.assertEquals(String.class, prop.getType()); + + prop = type.getProperty("text2"); + Assert.assertNotNull(prop); + Assert.assertEquals("text2", prop.getName()); + Assert.assertEquals(true, prop.isRequired()); + Assert.assertEquals(Integer.class, prop.getType()); + + prop = type.getProperty("foo"); + Assert.assertNotNull(prop); + Assert.assertEquals("foo", prop.getName()); + Assert.assertEquals(false, prop.isRequired()); + Assert.assertEquals(Integer.TYPE, prop.getType()); + } + + protected void setUp() throws Exception { + super.setUp(); + JavaAssemblyFactory factory = new JavaAssemblyFactoryImpl(); + mockType = factory.createComponentType(); + + loader = new JavaImplementationLoader(); + loader.setFactory(factory); + } + + private static class MockRegistry implements StAXLoaderRegistry { + private final ComponentType mockType; + + public MockRegistry(ComponentType mockType) { + this.mockType = mockType; + } + + public AssemblyObject load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + assertEquals(AssemblyConstants.COMPONENT_TYPE, reader.getName()); + return mockType; + } + + public <T extends AssemblyObject> void registerLoader(QName element, StAXElementLoader<T> loader) { + throw new UnsupportedOperationException(); + } + + public <T extends AssemblyObject> void unregisterLoader(QName element, StAXElementLoader<T> loader) { + throw new UnsupportedOperationException(); + } + + @Deprecated + public AssemblyContext getContext() { + throw new UnsupportedOperationException(); + } + + @Deprecated + public void setContext(AssemblyContext context) { + throw new UnsupportedOperationException(); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/MockConfigContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/MockConfigContext.java new file mode 100644 index 0000000000..9cb1998d68 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/MockConfigContext.java @@ -0,0 +1,64 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.builder.WireBuilder; +import org.apache.tuscany.core.builder.impl.AssemblyVisitorImpl; +import org.apache.tuscany.core.builder.impl.DefaultWireBuilder; +import org.apache.tuscany.core.context.ConfigurationContext; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.model.assembly.AssemblyObject; + +/** + * A mock configuration context + * + * @version $Rev: 368822 $ $Date: 2006-01-13 10:54:38 -0800 (Fri, 13 Jan 2006) $ + */ +public class MockConfigContext implements ConfigurationContext { + + private List<ContextFactoryBuilder> builders; + + private DefaultWireBuilder wireBuilder = new DefaultWireBuilder(); + + public MockConfigContext(List<ContextFactoryBuilder> builders, List<WireBuilder> wireBuilders) { + this.builders = (builders == null) ? new ArrayList(1) : builders; + if (wireBuilders != null){ + for (WireBuilder builder : wireBuilders) { + wireBuilder.addWireBuilder(builder); + } + } + } + + public void build(AssemblyObject model) throws BuilderConfigException { + AssemblyVisitorImpl visitor = new AssemblyVisitorImpl(builders); + visitor.start(model); + } + + public void connect(SourceWireFactory sourceFactory, TargetWireFactory targetFactory, Class targetType, boolean downScope, + ScopeContext targetScopeContext) throws BuilderConfigException { + wireBuilder.connect(sourceFactory, targetFactory, targetType, downScope, targetScopeContext); + } + + public void completeTargetChain(TargetWireFactory targetFactory, Class targetType, ScopeContext targetScopeContext) throws BuilderConfigException { + wireBuilder.completeTargetChain(targetFactory, targetType, targetScopeContext); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/MockContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/MockContextFactory.java new file mode 100644 index 0000000000..4e00e4c236 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/MockContextFactory.java @@ -0,0 +1,92 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock; + +import org.apache.tuscany.container.java.assembly.JavaAssemblyFactory; +import org.apache.tuscany.container.java.assembly.impl.JavaAssemblyFactoryImpl; +import org.apache.tuscany.container.java.config.JavaContextFactory; +import org.apache.tuscany.container.java.scopes.OrderedDependentPojo; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.config.JavaIntrospectionHelper; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.injection.Injector; +import org.apache.tuscany.core.injection.MethodInjector; +import org.apache.tuscany.core.injection.ObjectCreationException; +import org.apache.tuscany.core.injection.EventInvoker; +import org.apache.tuscany.core.injection.MethodEventInvoker; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.impl.AssemblyContextImpl; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class MockContextFactory { + + private MockContextFactory(){} + + /** + * Wires together a source and target + * @throws NoSuchMethodException + */ + public static List<ContextFactory<Context>> createWiredContexts(Scope scope, ScopeContext context) throws NoSuchMethodException{ + + Constructor constructor = JavaIntrospectionHelper.getDefaultConstructor(OrderedDependentPojo.class); + Method getPojo = OrderedDependentPojo.class.getMethod("setPojo",OrderedDependentPojo.class); + Method init = OrderedDependentPojo.class.getMethod("init",(Class[])null); + EventInvoker<Object> initInvoker = new MethodEventInvoker<Object>(init); + Method destroy = OrderedDependentPojo.class.getMethod("destroy",(Class[])null); + EventInvoker<Object> destroyInvoker = new MethodEventInvoker<Object>(destroy); + + JavaContextFactory source = new JavaContextFactory("source",constructor,scope); + source.setInitInvoker(initInvoker); + source.setDestroyInvoker(destroyInvoker); + JavaContextFactory target = new JavaContextFactory("target",constructor,scope); + target.setInitInvoker(initInvoker); + target.setDestroyInvoker(destroyInvoker); + List<Injector> injectors = new ArrayList<Injector>(); + injectors.add(new MethodInjector(getPojo, new MockTargetFactory("target",context))); + source.setSetters(injectors); + List<ContextFactory<Context>> list = new ArrayList<ContextFactory<Context>>(); + list.add((ContextFactory)source); + list.add((ContextFactory)target); + return list; + } + + private static class MockTargetFactory implements ObjectFactory{ + + private String name; + private ScopeContext context; + + public MockTargetFactory (String name, ScopeContext context){ + this.name = name; + this.context = context; + } + + public Object getInstance() throws ObjectCreationException { + return context.getContext(name).getInstance(null); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/MockFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/MockFactory.java new file mode 100644 index 0000000000..3b45352865 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/MockFactory.java @@ -0,0 +1,819 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import junit.framework.Assert; +import org.apache.tuscany.common.monitor.MonitorFactory; +import org.apache.tuscany.common.monitor.impl.NullMonitorFactory; +import org.apache.tuscany.container.java.assembly.JavaAssemblyFactory; +import org.apache.tuscany.container.java.assembly.JavaImplementation; +import org.apache.tuscany.container.java.assembly.impl.JavaAssemblyFactoryImpl; +import org.apache.tuscany.container.java.assembly.mock.HelloWorldImpl; +import org.apache.tuscany.container.java.assembly.mock.HelloWorldService; +import org.apache.tuscany.container.java.builder.JavaContextFactoryBuilder; +import org.apache.tuscany.container.java.builder.JavaTargetWireBuilder; +import org.apache.tuscany.container.java.context.JavaAtomicContext; +import org.apache.tuscany.container.java.mock.binding.foo.FooBinding; +import org.apache.tuscany.container.java.mock.binding.foo.FooBindingBuilder; +import org.apache.tuscany.container.java.mock.binding.foo.FooBindingWireBuilder; +import org.apache.tuscany.container.java.mock.components.GenericComponent; +import org.apache.tuscany.container.java.mock.components.HelloWorldClient; +import org.apache.tuscany.container.java.mock.components.ModuleScopeComponent; +import org.apache.tuscany.container.java.mock.components.ModuleScopeComponentImpl; +import org.apache.tuscany.container.java.mock.components.OtherTarget; +import org.apache.tuscany.container.java.mock.components.OtherTargetImpl; +import org.apache.tuscany.container.java.mock.components.Source; +import org.apache.tuscany.container.java.mock.components.SourceImpl; +import org.apache.tuscany.container.java.mock.components.Target; +import org.apache.tuscany.container.java.mock.components.TargetImpl; +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.builder.WireBuilder; +import org.apache.tuscany.core.builder.impl.DefaultWireBuilder; +import org.apache.tuscany.core.builder.system.DefaultPolicyBuilderRegistry; +import org.apache.tuscany.core.builder.system.PolicyBuilderRegistry; +import org.apache.tuscany.core.client.BootstrapHelper; +import org.apache.tuscany.core.config.ComponentTypeIntrospector; +import org.apache.tuscany.core.config.ConfigurationException; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.JavaIntrospectionHelper; +import org.apache.tuscany.core.config.processor.ProcessorUtils; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.SystemCompositeContext; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.injection.EventInvoker; +import org.apache.tuscany.core.injection.FieldInjector; +import org.apache.tuscany.core.injection.Injector; +import org.apache.tuscany.core.injection.MethodEventInvoker; +import org.apache.tuscany.core.injection.MethodInjector; +import org.apache.tuscany.core.injection.PojoObjectFactory; +import org.apache.tuscany.core.injection.SingletonObjectFactory; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.core.runtime.RuntimeContextImpl; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.core.system.assembly.SystemBinding; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.core.system.builder.SystemContextFactoryBuilder; +import org.apache.tuscany.core.system.builder.SystemEntryPointBuilder; +import org.apache.tuscany.core.system.builder.SystemExternalServiceBuilder; +import org.apache.tuscany.core.system.context.SystemCompositeContextImpl; +import org.apache.tuscany.core.wire.WireFactoryFactory; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; +import org.apache.tuscany.core.wire.service.DefaultWireFactoryService; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AtomicComponent; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.ExternalService; +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.Multiplicity; +import org.apache.tuscany.model.assembly.Reference; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.impl.AssemblyContextImpl; +import org.apache.tuscany.model.types.java.JavaServiceContract; +import org.osoa.sca.annotations.ComponentName; +import org.osoa.sca.annotations.Destroy; +import org.osoa.sca.annotations.Init; + +/** + * Generates test components, modules, and runtime artifacts + * + * @version $Rev$ $Date$ + */ +public class MockFactory { + + public static final String JAVA_BUILDER = "java.runtime.builder"; + public static final String MESSAGE_FACTORY = "java.runtime.messageFactory"; + public static final String PROXY_FACTORY_FACTORY = "java.runtime.wireFactoryFactory"; + public static final String WIRE_FACTORY_SERVICE = "java.runtime.wireFactoryservice"; + public static final String JAVA_WIRE_BUILDER = "java.wire.builder"; + public static final String FOO_BUILDER = "foo.binding.builder"; + public static final String FOO_WIRE_BUILDER = "foo.binding.wire.builder"; + public static final String POLICY_BUILDER_REGISTRY = "foo.binding.policy.registry"; + public static final String SYSTEM_CHILD = "tuscany.system.child"; + + private static JavaAssemblyFactory factory = new JavaAssemblyFactoryImpl(); + private static SystemAssemblyFactory systemFactory = new SystemAssemblyFactoryImpl(); + private static AssemblyContext assemblyContext = new AssemblyContextImpl(null, null); + private static ComponentTypeIntrospector introspector; + private static ComponentType systemComponentType; + private static ComponentType compositeComponentType; + + public static ComponentType getComponentType() throws ConfigurationLoadException { + if (systemComponentType == null) { + systemComponentType = getIntrospector().introspect(SystemCompositeContextImpl.class); + } + return systemComponentType; + } + + public static ComponentType getCompositeComponentType() throws ConfigurationLoadException { + if (compositeComponentType == null) { + compositeComponentType = getIntrospector().introspect(CompositeContextImpl.class); + } + return compositeComponentType; + } + + public static ComponentTypeIntrospector getIntrospector() { + if (introspector == null) { + introspector = ProcessorUtils.createCoreIntrospector(systemFactory); + } + return introspector; + } + + /** + * Creates an initialized simple component + * + * @param name the component name + * @param type the implementation type + * @param scope the component scope + */ + public static AtomicComponent createComponent(String name, Class type, Scope scope) throws ConfigurationLoadException { + AtomicComponent sc = factory.createSimpleComponent(); + JavaImplementation impl = factory.createJavaImplementation(); + impl.setComponentType(getIntrospector().introspect(type)); + impl.setImplementationClass(type); + sc.setImplementation(impl); + Service s = factory.createService(); + JavaServiceContract ji = factory.createJavaServiceContract(); + ji.setInterface(type); + s.setServiceContract(ji); + ji.setScope(scope); + impl.getComponentType().getServices().add(s); + sc.setName(name); + sc.setImplementation(impl); + return sc; + } + + public static AtomicComponent createNonIntrospectedComponent(String name, Class service, Class type, Scope scope) throws ConfigurationLoadException { + AtomicComponent sc = factory.createSimpleComponent(); + JavaImplementation impl = factory.createJavaImplementation(); + impl.setComponentType(factory.createComponentType()); + impl.setImplementationClass(type); + sc.setImplementation(impl); + Service s = factory.createService(); + JavaServiceContract ji = factory.createJavaServiceContract(); + ji.setInterface(service); + s.setServiceContract(ji); + ji.setScope(scope); + impl.getComponentType().getServices().add(s); + sc.setName(name); + sc.setImplementation(impl); + return sc; + } + + + /** + * Creates an composite component with the given name + */ + public static Component createCompositeComponent(String name) throws ConfigurationLoadException { + Component sc = systemFactory.createModuleComponent(); + Module impl = systemFactory.createModule(); + impl.setName(name); + //impl.setImplementationClass(CompositeContextImpl.class); + sc.setImplementation(impl); + Service s = systemFactory.createService(); + JavaServiceContract ji = systemFactory.createJavaServiceContract(); + s.setServiceContract(ji); + ji.setScope(Scope.AGGREGATE); + //impl.setComponentType(systemFactory.createComponentType()); + impl.setImplementationClass(CompositeContextImpl.class); + impl.setComponentType(getCompositeComponentType()); + impl.getComponentType().getServices().add(s); + sc.setName(name); + sc.setImplementation(impl); + + return sc; + } + + /** + * Creates a system composite component with the given name + */ + public static Component createSystemCompositeComponent(String name) throws ConfigurationLoadException { + Component sc = systemFactory.createModuleComponent(); + Module impl = systemFactory.createSystemModule(); + impl.setName(name); + //impl.setImplementationClass(SystemCompositeContextImpl.class); + sc.setImplementation(impl); + Service s = systemFactory.createService(); + JavaServiceContract ji = systemFactory.createJavaServiceContract(); + s.setServiceContract(ji); + ji.setScope(Scope.AGGREGATE); + impl.setComponentType(getComponentType()); + //impl.setComponentType(systemFactory.createComponentType()); + impl.getComponentType().getServices().add(s); + sc.setName(name); + sc.setImplementation(impl); + return sc; + } + + /** + * Creates an external service configured with the 'Foo' test binding + */ + public static ExternalService createFooBindingExternalService(String name, Class interfaz) { + ExternalService es = factory.createExternalService(); + es.setName(name); + Service s = factory.createService(); + JavaServiceContract ji = factory.createJavaServiceContract(); + ji.setScope(Scope.MODULE); + ji.setInterface(interfaz); + s.setServiceContract(ji); + ConfiguredService configuredService = factory.createConfiguredService(); + es.setConfiguredService(configuredService); + + FooBinding binding = new FooBinding(); + es.getBindings().add(binding); + return es; + } + + /** + * Creates an entry point with the given name configured with the given interface and the {@link + * FooBinding} + */ + public static EntryPoint createFooBindingEntryPoint(String name, Class interfaz) { + EntryPoint ep = factory.createEntryPoint(); + ep.setName(name); + Service s = factory.createService(); + JavaServiceContract ji = factory.createJavaServiceContract(); + ji.setScope(Scope.MODULE); + ji.setInterface(interfaz); + s.setServiceContract(ji); + ConfiguredService configuredService = factory.createConfiguredService(); + configuredService.setPort(s); + ep.setConfiguredService(configuredService); + FooBinding binding = new FooBinding(); + ep.getBindings().add(binding); + return ep; + } + + /** + * Creates an external service configured with a {@link SystemBinding} + */ + public static ExternalService createESSystemBinding(String name, String refName) { + ExternalService es = systemFactory.createExternalService(); + es.setName(name); + ConfiguredService configuredService = systemFactory.createConfiguredService(); + es.setConfiguredService(configuredService); + SystemBinding binding = systemFactory.createSystemBinding(); + binding.setTargetName(refName); + es.getBindings().add(binding); + es.initialize(null); + return es; + } + + /** + * Creates a module with a Java-based "target" module-scoped component wired to a module-scoped "source" + */ + public static Module createModule() throws ConfigurationLoadException { + return createModule(Scope.MODULE, Scope.MODULE); + } + + /** + * Creates a module with a Java-based "target" component wired to a "source" + */ + public static Module createModule(Scope sourceScope, Scope targetScope) throws ConfigurationLoadException { + Component sourceComponent = createNonIntrospectedComponent("source", ModuleScopeComponent.class, ModuleScopeComponentImpl.class, sourceScope); + Component targetComponent = createNonIntrospectedComponent("target", ModuleScopeComponent.class, ModuleScopeComponentImpl.class, targetScope); + + Service targetService = factory.createService(); + JavaServiceContract targetContract = factory.createJavaServiceContract(); + targetContract.setInterface(GenericComponent.class); + targetService.setServiceContract(targetContract); + targetService.setName("GenericComponent"); + targetContract.setScope(targetScope); + ConfiguredService cTargetService = factory.createConfiguredService(); + cTargetService.setPort(targetService); + cTargetService.initialize(assemblyContext); + targetComponent.getConfiguredServices().add(cTargetService); + targetComponent.initialize(assemblyContext); + + Reference ref = factory.createReference(); + ref.setName("setGenericComponent"); + JavaServiceContract inter = factory.createJavaServiceContract(); + inter.setInterface(GenericComponent.class); + ref.setServiceContract(inter); + sourceComponent.getImplementation().getComponentType().getReferences().add(ref); + + ConfiguredReference cref = factory.createConfiguredReference("setGenericComponent", "target"); + cref.initialize(assemblyContext); + sourceComponent.getConfiguredReferences().add(cref); + sourceComponent.initialize(assemblyContext); + + Module module = factory.createModule(); + module.setName("test.module"); + module.getComponents().add(sourceComponent); + module.getComponents().add(targetComponent); + module.initialize(assemblyContext); + return module; + } + + /** + * Creates a module with a Java-based source component wired to a "target" external service configured + * with the {@link FooBinding} + */ + public static Module createModuleWithExternalService() throws ConfigurationLoadException { + Component sourceComponent = createComponent("source", HelloWorldClient.class, Scope.MODULE); + ExternalService targetES = createFooBindingExternalService("target", HelloWorldService.class); + + Service targetService = factory.createService(); + JavaServiceContract targetContract = factory.createJavaServiceContract(); + targetContract.setInterface(HelloWorldService.class); + targetService.setServiceContract(targetContract); + targetService.setName("HelloWorld"); + ConfiguredService cTargetService = factory.createConfiguredService(); + cTargetService.setPort(targetService); + targetES.setConfiguredService(cTargetService); + targetES.initialize(assemblyContext); + + Reference ref = factory.createReference(); + ref.setName("setHelloWorldService"); + JavaServiceContract inter = factory.createJavaServiceContract(); + inter.setInterface(HelloWorldService.class); + ref.setServiceContract(inter); + sourceComponent.getImplementation().getComponentType().getReferences().add(ref); + + ConfiguredReference cref = factory.createConfiguredReference(ref.getName(), "target"); + cref.initialize(assemblyContext); + sourceComponent.getConfiguredReferences().add(cref); + sourceComponent.initialize(assemblyContext); + + Module module = factory.createModule(); + module.setName("test.module"); + module.getComponents().add(sourceComponent); + module.getExternalServices().add(targetES); + module.initialize(assemblyContext); + return module; + } + + /** + * Creates a module with an entry point named "source" configured with the {@link FooBinding} wired to a + * service offered by a Java-based component named "target" + * + * @param scope the scope of the target service + */ + public static Module createModuleWithEntryPoint(Scope scope) throws ConfigurationLoadException { + Component targetComponent = createComponent("target", HelloWorldImpl.class, scope); + + Service targetService = factory.createService(); + JavaServiceContract targetContract = factory.createJavaServiceContract(); + targetContract.setInterface(HelloWorldService.class); + targetService.setServiceContract(targetContract); + targetService.setName("HelloWorldService"); + ConfiguredService cTargetService = factory.createConfiguredService(); + cTargetService.setPort(targetService); + targetComponent.getConfiguredServices().add(cTargetService); + targetComponent.initialize(assemblyContext); + + Reference ref = factory.createReference(); + ConfiguredReference cref = factory.createConfiguredReference(); + ref.setName("setHelloWorldService"); + JavaServiceContract inter = factory.createJavaServiceContract(); + inter.setInterface(HelloWorldService.class); + ref.setServiceContract(inter); + cref.setPort(ref); + cref.getTargetConfiguredServices().add(cTargetService); + cref.initialize(assemblyContext); + + EntryPoint sourceEP = createFooBindingEntryPoint("source", HelloWorldService.class); + sourceEP.setConfiguredReference(cref); + sourceEP.getConfiguredService().getPort().setName("HelloWorldService"); + sourceEP.initialize(assemblyContext); + + Module module = factory.createModule(); + module.setName("test.module"); + module.getEntryPoints().add(sourceEP); + module.getComponents().add(targetComponent); + module.setImplementationClass(CompositeContextImpl.class); + module.setComponentType(getCompositeComponentType()); + module.initialize(assemblyContext); + return module; + } + + /** + * Creates a module with an entry point wired to a "target" external service configured with the {@link + * FooBinding} + */ + public static Module createModuleWithEntryPointToExternalService() { + //Component sourceComponent = createComponent("source", HelloWorldClient.class, Scope.MODULE); + + EntryPoint sourceEP = createFooBindingEntryPoint("source", HelloWorldService.class); + sourceEP.getConfiguredService().getPort().setName("HelloWorldService"); + sourceEP.initialize(assemblyContext); + + + ExternalService targetES = createFooBindingExternalService("target", HelloWorldService.class); + + Service targetService = factory.createService(); + JavaServiceContract targetContract = factory.createJavaServiceContract(); + targetContract.setInterface(HelloWorldService.class); + targetService.setServiceContract(targetContract); + targetService.setName("HelloWorld"); + ConfiguredService cTargetService = factory.createConfiguredService(); + cTargetService.setPort(targetService); + targetES.setConfiguredService(cTargetService); + targetES.initialize(assemblyContext); + + Reference ref = factory.createReference(); + ref.setName("setHelloWorldService"); + JavaServiceContract inter = factory.createJavaServiceContract(); + inter.setInterface(HelloWorldService.class); + ref.setServiceContract(inter); + + + ConfiguredReference cref = factory.createConfiguredReference(ref.getName(), "target"); + cref.setPort(ref); + cref.initialize(assemblyContext); + sourceEP.setConfiguredReference(cref); + sourceEP.initialize(assemblyContext); + + Module module = factory.createModule(); + module.setName("test.module"); + module.getEntryPoints().add(sourceEP); + module.getExternalServices().add(targetES); + module.initialize(assemblyContext); + return module; + } + + + /** + * Creates a test system module with source and target components wired together. + * + * @see org.apache.tuscany.core.mock.component.Source + * @see org.apache.tuscany.core.mock.component.Target + */ + + public static Module createModuleWithWiredComponents(Scope sourceScope, Scope targetScope) { + + // create the target component + AtomicComponent target = factory.createSimpleComponent(); + target.setName("target"); + JavaImplementation targetImpl = factory.createJavaImplementation(); + targetImpl.setComponentType(factory.createComponentType()); + targetImpl.setImplementationClass(TargetImpl.class); + target.setImplementation(targetImpl); + Service targetService = factory.createService(); + JavaServiceContract targetContract = factory.createJavaServiceContract(); + targetContract.setInterface(Target.class); + targetService.setServiceContract(targetContract); + targetService.setName("Target"); + targetImpl.getComponentType().getServices().add(targetService); + targetContract.setScope(targetScope); + ConfiguredService cTargetService = factory.createConfiguredService(); + cTargetService.setPort(targetService); + cTargetService.initialize(assemblyContext); + target.getConfiguredServices().add(cTargetService); + target.initialize(assemblyContext); + + // create the source component + AtomicComponent source = factory.createSimpleComponent(); + ComponentType componentType = factory.createComponentType(); + source.setName("source"); + JavaImplementation impl = factory.createJavaImplementation(); + impl.setComponentType(componentType); + impl.setImplementationClass(SourceImpl.class); + source.setImplementation(impl); + Service s = systemFactory.createService(); + JavaServiceContract contract = systemFactory.createJavaServiceContract(); + contract.setInterface(Source.class); + s.setServiceContract(contract); + contract.setScope(sourceScope); + impl.getComponentType().getServices().add(s); + source.setImplementation(impl); + + // wire source to target + JavaServiceContract refContract = systemFactory.createJavaServiceContract(); + refContract.setInterface(Target.class); + Reference reference = systemFactory.createReference(); + reference.setName("setTarget"); + reference.setServiceContract(refContract); + componentType.getReferences().add(reference); + ConfiguredReference cReference = systemFactory.createConfiguredReference(reference.getName(), "target"); + cReference.initialize(assemblyContext); + source.getConfiguredReferences().add(cReference); + + // wire multiplicity using a setter + JavaServiceContract refContract2 = systemFactory.createJavaServiceContract(); + refContract2.setInterface(Target.class); + Reference reference2 = systemFactory.createReference(); + reference2.setName("setTargets"); + reference2.setServiceContract(refContract2); + reference2.setMultiplicity(Multiplicity.ONE_N); + componentType.getReferences().add(reference2); + ConfiguredReference cReference2 = systemFactory.createConfiguredReference(reference2.getName(), "target"); + cReference2.initialize(assemblyContext); + source.getConfiguredReferences().add(cReference2); + + // wire multiplicity using a field + JavaServiceContract refContract3 = systemFactory.createJavaServiceContract(); + refContract3.setInterface(Target.class); + Reference reference3 = systemFactory.createReference(); + reference3.setName("targetsThroughField"); + reference3.setServiceContract(refContract3); + reference3.setMultiplicity(Multiplicity.ONE_N); + componentType.getReferences().add(reference3); + ConfiguredReference cReference3 = systemFactory.createConfiguredReference(reference3.getName(), "target"); + cReference3.initialize(assemblyContext); + source.getConfiguredReferences().add(cReference3); + + // wire multiplicity using a array + JavaServiceContract refContract4 = systemFactory.createJavaServiceContract(); + refContract4.setInterface(Target.class); + Reference reference4 = systemFactory.createReference(); + reference4.setName("setArrayOfTargets"); + reference4.setServiceContract(refContract4); + reference4.setMultiplicity(Multiplicity.ONE_N); + componentType.getReferences().add(reference4); + ConfiguredReference cReference4 = systemFactory.createConfiguredReference(reference4.getName(), "target"); + cReference4.initialize(assemblyContext); + source.getConfiguredReferences().add(cReference4); + + source.initialize(assemblyContext); + + Module module = systemFactory.createModule(); + module.setName("system.module"); + + module.getComponents().add(source); + module.getComponents().add(target); + module.initialize(assemblyContext); + return module; + } + + + /** + * Creates a test system module with source and target components wired together. + * + * @see org.apache.tuscany.core.mock.component.Source + * @see org.apache.tuscany.core.mock.component.Target + */ + + public static Module createModuleWithWiredComponentsOfDifferentInterface(Scope sourceScope, Scope targetScope) { + + // create the target component + AtomicComponent target = factory.createSimpleComponent(); + target.setName("target"); + JavaImplementation targetImpl = factory.createJavaImplementation(); + targetImpl.setComponentType(factory.createComponentType()); + targetImpl.setImplementationClass(OtherTargetImpl.class); + target.setImplementation(targetImpl); + Service targetService = factory.createService(); + JavaServiceContract targetContract = factory.createJavaServiceContract(); + targetContract.setInterface(OtherTarget.class); + targetService.setServiceContract(targetContract); + targetService.setName("Target"); + targetImpl.getComponentType().getServices().add(targetService); + targetContract.setScope(targetScope); + ConfiguredService cTargetService = factory.createConfiguredService(); + cTargetService.setPort(targetService); + cTargetService.initialize(assemblyContext); + target.getConfiguredServices().add(cTargetService); + target.initialize(assemblyContext); + + // create the source component + AtomicComponent source = factory.createSimpleComponent(); + ComponentType componentType = factory.createComponentType(); + source.setName("source"); + JavaImplementation impl = factory.createJavaImplementation(); + impl.setComponentType(componentType); + impl.setImplementationClass(SourceImpl.class); + source.setImplementation(impl); + Service s = systemFactory.createService(); + JavaServiceContract contract = systemFactory.createJavaServiceContract(); + contract.setInterface(Source.class); + s.setServiceContract(contract); + contract.setScope(sourceScope); + impl.getComponentType().getServices().add(s); + source.setImplementation(impl); + + // wire source to target + JavaServiceContract refContract = systemFactory.createJavaServiceContract(); + refContract.setInterface(Target.class); + Reference reference = systemFactory.createReference(); + reference.setName("setTarget"); + reference.setServiceContract(refContract); + componentType.getReferences().add(reference); + ConfiguredReference cReference = systemFactory.createConfiguredReference(reference.getName(), "target"); + cReference.initialize(assemblyContext); + source.getConfiguredReferences().add(cReference); + + // wire multiplicity using a setter + JavaServiceContract refContract2 = systemFactory.createJavaServiceContract(); + refContract2.setInterface(Target.class); + Reference reference2 = systemFactory.createReference(); + reference2.setName("setTargets"); + reference2.setServiceContract(refContract2); + reference2.setMultiplicity(Multiplicity.ONE_N); + componentType.getReferences().add(reference2); + ConfiguredReference cReference2 = systemFactory.createConfiguredReference(reference2.getName(), "target"); + cReference2.initialize(assemblyContext); + source.getConfiguredReferences().add(cReference2); + + // wire multiplicity using a field + JavaServiceContract refContract3 = systemFactory.createJavaServiceContract(); + refContract3.setInterface(Target.class); + Reference reference3 = systemFactory.createReference(); + reference3.setName("targetsThroughField"); + reference3.setServiceContract(refContract3); + reference3.setMultiplicity(Multiplicity.ONE_N); + componentType.getReferences().add(reference3); + ConfiguredReference cReference3 = systemFactory.createConfiguredReference(reference3.getName(), "target"); + cReference3.initialize(assemblyContext); + source.getConfiguredReferences().add(cReference3); + + // wire multiplicity using a array + JavaServiceContract refContract4 = systemFactory.createJavaServiceContract(); + refContract4.setInterface(Target.class); + Reference reference4 = systemFactory.createReference(); + reference4.setName("setArrayOfTargets"); + reference4.setServiceContract(refContract4); + reference4.setMultiplicity(Multiplicity.ONE_N); + componentType.getReferences().add(reference4); + ConfiguredReference cReference4 = systemFactory.createConfiguredReference(reference4.getName(), "target"); + cReference4.initialize(assemblyContext); + source.getConfiguredReferences().add(cReference4); + + source.initialize(assemblyContext); + + Module module = systemFactory.createModule(); + module.setName("system.module"); + + module.getComponents().add(source); + module.getComponents().add(target); + module.initialize(assemblyContext); + return module; + } + + + /** + * Returns a collection of bootstrap configuration builders + */ + public static List<ContextFactoryBuilder> createSystemBuilders() { + List<ContextFactoryBuilder> builders = new ArrayList<ContextFactoryBuilder>(); + builders.add((new SystemContextFactoryBuilder(null))); + builders.add(new SystemEntryPointBuilder()); + builders.add(new SystemExternalServiceBuilder()); + return builders; + } + + /** + * Creates an composite context faxtory + * + * @param name the name of the component + * @throws BuilderException + * @see ContextFactory + */ + public static ContextFactory<Context> createCompositeConfiguration(String name + ) throws BuilderException, ConfigurationLoadException { + + Component sc = createCompositeComponent(name); + SystemContextFactoryBuilder builder = new SystemContextFactoryBuilder(null); + builder.build(sc); + return (ContextFactory<Context>) sc.getContextFactory(); + } + + /** + * Creates a Java POJO component context + * + * @param name the name of the context + * @param implType the POJO class + * @param scope the component scope + * @param moduleComponentContext the containing composite context + * @throws NoSuchMethodException if the POJO does not have a default noi-args constructor + */ + public static JavaAtomicContext createPojoContext(String name, Class implType, Scope scope, + CompositeContext moduleComponentContext) throws NoSuchMethodException, ConfigurationLoadException { + AtomicComponent component = createComponent(name, implType, scope); + + Set<Field> fields = JavaIntrospectionHelper.getAllFields(implType); + Set<Method> methods = JavaIntrospectionHelper.getAllUniqueMethods(implType); + List<Injector> injectors = new ArrayList<Injector>(); + + EventInvoker initInvoker = null; + boolean eagerInit = false; + EventInvoker destroyInvoker = null; + for (Field field : fields) { + ComponentName compName = field.getAnnotation(ComponentName.class); + if (compName != null) { + Injector injector = new FieldInjector(field, new SingletonObjectFactory(name)); + injectors.add(injector); + } + org.osoa.sca.annotations.Context context = field.getAnnotation(org.osoa.sca.annotations.Context.class); + if (context != null) { + Injector injector = new FieldInjector(field, new SingletonObjectFactory(moduleComponentContext)); + injectors.add(injector); + } + } + for (Method method : methods) { + // FIXME Java5 + Init init = method.getAnnotation(Init.class); + if (init != null && initInvoker == null) { + initInvoker = new MethodEventInvoker(method); + eagerInit = init.eager(); + continue; + } + Destroy destroy = method.getAnnotation(Destroy.class); + if (destroy != null && destroyInvoker == null) { + destroyInvoker = new MethodEventInvoker(method); + continue; + } + ComponentName compName = method.getAnnotation(ComponentName.class); + if (compName != null) { + Injector injector = new MethodInjector(method, new SingletonObjectFactory(name)); + injectors.add(injector); + } + org.osoa.sca.annotations.Context context = method.getAnnotation(org.osoa.sca.annotations.Context.class); + if (context != null) { + Injector injector = new MethodInjector(method, new SingletonObjectFactory(moduleComponentContext)); + injectors.add(injector); + } + } + boolean stateless = (scope == Scope.INSTANCE); + return new JavaAtomicContext("foo", new PojoObjectFactory(JavaIntrospectionHelper + .getDefaultConstructor(implType), null, injectors), eagerInit, initInvoker, destroyInvoker, stateless); + } + + /** + * Creates a default {@link RuntimeContext} configured with support for Java component implementations + * + * @throws ConfigurationException + */ + public static RuntimeContext createJavaRuntime() throws ConfigurationException { + MonitorFactory monitorFactory = new NullMonitorFactory(); + ContextFactoryBuilderRegistry builderRegistry = BootstrapHelper.bootstrapContextFactoryBuilders(monitorFactory); + DefaultWireBuilder wireBuilder = new DefaultWireBuilder(); + RuntimeContext runtime = new RuntimeContextImpl(monitorFactory, builderRegistry, wireBuilder); + runtime.start(); + runtime.getSystemContext().registerModelObject(createSystemCompositeComponent(SYSTEM_CHILD)); + SystemCompositeContext ctx = (SystemCompositeContext) runtime.getSystemContext().getContext(SYSTEM_CHILD); + Component comp = systemFactory.createSystemComponent(POLICY_BUILDER_REGISTRY, PolicyBuilderRegistry.class, DefaultPolicyBuilderRegistry.class, Scope.MODULE); + comp.getImplementation().setComponentType(getIntrospector().introspect(DefaultPolicyBuilderRegistry.class)); + ctx.registerModelObject(comp); + comp = systemFactory.createSystemComponent(MESSAGE_FACTORY, MessageFactory.class, MessageFactoryImpl.class, Scope.MODULE); + comp.getImplementation().setComponentType(getIntrospector().introspect(MessageFactoryImpl.class)); + ctx.registerModelObject(comp); + comp = systemFactory.createSystemComponent(PROXY_FACTORY_FACTORY, WireFactoryFactory.class, JDKWireFactoryFactory.class, Scope.MODULE); + comp.getImplementation().setComponentType(getIntrospector().introspect(JDKWireFactoryFactory.class)); + ctx.registerModelObject(comp); + comp = systemFactory.createSystemComponent(WIRE_FACTORY_SERVICE, org.apache.tuscany.core.wire.service.WireFactoryService.class, DefaultWireFactoryService.class, Scope.MODULE); + comp.getImplementation().setComponentType(getIntrospector().introspect(DefaultWireFactoryService.class)); + ctx.registerModelObject(comp); + comp = systemFactory.createSystemComponent(JAVA_BUILDER, ContextFactoryBuilder.class, JavaContextFactoryBuilder.class, Scope.MODULE); + comp.getImplementation().setComponentType(getIntrospector().introspect(JavaContextFactoryBuilder.class)); + ctx.registerModelObject(comp); + comp = systemFactory.createSystemComponent(JAVA_WIRE_BUILDER, WireBuilder.class, JavaTargetWireBuilder.class, Scope.MODULE); + comp.getImplementation().setComponentType(getIntrospector().introspect(JavaTargetWireBuilder.class)); + ctx.registerModelObject(comp); + ctx.publish(new ModuleStart(new Object())); + return runtime; + } + + /** + * Registers the {@link FooBinding} builders with a given runtime + * + * @throws ConfigurationException + */ + public static RuntimeContext registerFooBinding(RuntimeContext runtime) throws ConfigurationException { + CompositeContext child = (CompositeContext) runtime.getSystemContext().getContext(MockFactory.SYSTEM_CHILD); + child.getContext(MockFactory.JAVA_BUILDER).getInstance(null); + Component comp = systemFactory.createSystemComponent(FOO_BUILDER, ContextFactoryBuilder.class, FooBindingBuilder.class, Scope.MODULE); + comp.getImplementation().setComponentType(getIntrospector().introspect(FooBindingBuilder.class)); + child.registerModelObject(comp); + comp = systemFactory.createSystemComponent(FOO_WIRE_BUILDER, WireBuilder.class, FooBindingWireBuilder.class, Scope.MODULE); + comp.getImplementation().setComponentType(getIntrospector().introspect(FooBindingWireBuilder.class)); + child.registerModelObject(comp); + // since the child context is already started, we need to manually retrieve the components to init them + Assert.assertNotNull(child.getContext(FOO_BUILDER).getInstance(null)); + Assert.assertNotNull(child.getContext(FOO_WIRE_BUILDER).getInstance(null)); + return runtime; + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/MockScopeContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/MockScopeContext.java new file mode 100644 index 0000000000..fe128f19a7 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/MockScopeContext.java @@ -0,0 +1,131 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.tuscany.container.java.invocation.mock.SimpleTargetImpl; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.ContextRuntimeException; +import org.apache.tuscany.core.context.EventFilter; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.RuntimeEventListener; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.context.ScopeRuntimeException; +import org.apache.tuscany.core.context.event.Event; +import org.apache.tuscany.model.assembly.AtomicComponent; + +public class MockScopeContext implements ScopeContext { + + Map<String, Object> components; + + public MockScopeContext() { + components = new HashMap<String, Object>(); + components.put("foo", new SimpleTargetImpl()); + components.put("bar", new SimpleTargetImpl()); + } + + public MockScopeContext(Map<String,Object> instances) { + components = instances; + } + + + public void start() { + } + + public void stop() { + } + + public void publish(Event object) { + //To change body of implemented methods use File | Settings | File Templates. + } + + public void addListener(RuntimeEventListener listener) throws ContextRuntimeException { + } + + public void addListener(EventFilter filter, RuntimeEventListener listener) { + //To change body of implemented methods use File | Settings | File Templates. + } + + public void removeListener(RuntimeEventListener listener) throws ContextRuntimeException { + } + + public String getName() { + return "Mock Scope Container"; + } + + public boolean isCacheable() { + return false; + } + + public int[] getEventTypes() { + return null; + } + + public AtomicContext getContext(String name) { + return null; + } + + public Object getInstance(QualifiedName name) throws ScopeRuntimeException { + return components.get(name.getPartName()); + } + + public AtomicContext getContextByKey(String name, Object key) { + return null; + } + + public void setComponent(AtomicComponent component) throws ScopeRuntimeException { + } + + public void removeContext(String name) throws ScopeRuntimeException { + } + + public void removeContextByKey(String name, Object key) throws ScopeRuntimeException { + } + + public AtomicComponent[] getComponents() { + return null; + } + + public void registerFactories(List<ContextFactory<Context>> configurations) { + } + + public void registerFactory(ContextFactory<Context> configuration) { + } + + public int getLifecycleState(){ + return RUNNING; + } + + + public void setLifecycleState(int state) { + } + + + public void setName(String name) { + } + + + public void onEvent(Event event) { + //To change body of implemented methods use File | Settings | File Templates. + } +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooBinding.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooBinding.java new file mode 100644 index 0000000000..49c59bc718 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooBinding.java @@ -0,0 +1,58 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.binding.foo; + +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyVisitor; +import org.apache.tuscany.model.assembly.Binding; + +/** + * Represents a mock binding that echoes back a single parameter + * + * @version $Rev$ $Date$ + */ +public class FooBinding implements Binding { + + public FooBinding() { + } + + public String getURI() { + return null; + } + + public void setURI(String value) { + } + + public void initialize(AssemblyContext modelContext) { + } + + public void freeze() { + } + + public boolean accept(AssemblyVisitor visitor) { + return true; + } + + private Object contextFactory; + + public void setContextFactory(Object factory) { + contextFactory = factory; + } + + public Object getContextFactory() { + System.out.println("retting"); + return contextFactory; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooBindingBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooBindingBuilder.java new file mode 100644 index 0000000000..558a8ce2cf --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooBindingBuilder.java @@ -0,0 +1,114 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.binding.foo; + +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.extension.EntryPointContextFactory; +import org.apache.tuscany.core.injection.ObjectCreationException; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.service.WireFactoryService; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.ExternalService; +import org.apache.tuscany.model.assembly.Service; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Scope; + +/** + * Creates a <code>ContextFactoryBuilder</code> for an entry point or external service configured with the {@link FooBinding} + * + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class FooBindingBuilder implements ContextFactoryBuilder { + private ContextFactoryBuilderRegistry builderRegistry; + + private MessageFactory messageFactory; + + private WireFactoryService wireFactoryService; + + public FooBindingBuilder(WireFactoryService wireFactoryService) { + this.wireFactoryService = wireFactoryService; + } + + public FooBindingBuilder() { + } + + @Init(eager = true) + public void init() { + builderRegistry.register(this); + } + + @Autowire + public void setBuilderRegistry(ContextFactoryBuilderRegistry builderRegistry) { + this.builderRegistry = builderRegistry; + } + + @Autowire + public void setWireFactoryService(WireFactoryService wireFactoryService) { + this.wireFactoryService = wireFactoryService; + } + + + /** + * Sets the factory used to construct wire messages + * + * @param msgFactory + */ + @Autowire + public void setMessageFactory(MessageFactory msgFactory) { + this.messageFactory = msgFactory; + } + + public void build(AssemblyObject object) throws BuilderException { + if (object instanceof EntryPoint) { + EntryPoint ep = (EntryPoint) object; + if (ep.getBindings().size() < 1 || !(ep.getBindings().get(0) instanceof FooBinding)) { + return; + } + EntryPointContextFactory contextFactory = new FooEntryPointContextFactory(ep.getName(), messageFactory); + ConfiguredService configuredService = ep.getConfiguredService(); + Service service = configuredService.getPort(); + SourceWireFactory wireFactory = wireFactoryService.createSourceFactory(ep.getConfiguredReference()).get(0); + contextFactory.addSourceWireFactory(service.getName(), wireFactory); + ep.setContextFactory(contextFactory); + } else if (object instanceof ExternalService) { + ExternalService es = (ExternalService) object; + if (es.getBindings().size() < 1 || !(es.getBindings().get(0) instanceof FooBinding)) { + return; + } + FooExternalServiceContextFactory contextFactory = new FooExternalServiceContextFactory(es.getName(), + new FooClientFactory()); + ConfiguredService configuredService = es.getConfiguredService(); + Service service = configuredService.getPort(); + TargetWireFactory wireFactory = wireFactoryService.createTargetFactory(configuredService); + contextFactory.addTargetWireFactory(service.getName(), wireFactory); + es.setContextFactory(contextFactory); + } + } + + private static class FooClientFactory implements ObjectFactory { + + public Object getInstance() throws ObjectCreationException { + return new FooClient(); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooBindingWireBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooBindingWireBuilder.java new file mode 100644 index 0000000000..e2592024f8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooBindingWireBuilder.java @@ -0,0 +1,76 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.binding.foo; + +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.builder.WireBuilder; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.wire.SourceInvocationConfiguration; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetInvocationConfiguration; +import org.apache.tuscany.core.wire.TargetInvoker; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.osoa.sca.annotations.Init; + +public class FooBindingWireBuilder implements WireBuilder { + + public FooBindingWireBuilder() { + super(); + } + + private RuntimeContext runtimeContext; + + @Autowire + public void setRuntimeContext(RuntimeContext context) { + runtimeContext = context; + } + + @Init(eager = true) + public void init() { + runtimeContext.addBuilder(this); + } + + + public void connect(SourceWireFactory sourceFactory, TargetWireFactory targetFactory, Class targetType, boolean downScope, + ScopeContext targetScopeContext) throws BuilderConfigException { + if (!FooExternalServiceContextFactory.class.isAssignableFrom(targetType)) { + return; + } + for (SourceInvocationConfiguration sourceInvocationConfig : sourceFactory.getConfiguration().getInvocationConfigurations() + .values()) { + FooExternalServiceTargetInvoker invoker = new FooExternalServiceTargetInvoker(sourceFactory.getConfiguration().getTargetName() + .getPartName()); + sourceInvocationConfig.setTargetInvoker(invoker); + } + + } + + public void completeTargetChain(TargetWireFactory targetFactory, Class targetType, ScopeContext targetScopeContext) + throws BuilderConfigException { + if (FooExternalServiceContextFactory.class.isAssignableFrom(targetType)) { + for (TargetInvocationConfiguration targetInvocationConfig : targetFactory.getConfiguration().getInvocationConfigurations() + .values()) { + TargetInvoker invoker = new FooExternalServiceTargetInvoker(targetFactory.getConfiguration().getTargetName().getQualifiedName()); + targetInvocationConfig.setTargetInvoker(invoker); + } + + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooClient.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooClient.java new file mode 100644 index 0000000000..9f67eb7786 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooClient.java @@ -0,0 +1,37 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.binding.foo; + +import java.lang.reflect.Array; + +import org.apache.tuscany.core.context.TargetException; + +/** + * A mock client for a transport binding + * + * @version $Rev$ $Date$ + */ +public class FooClient { + + public FooClient() { + } + + public Object invoke(Object msg) { + if (msg!=null && msg.getClass().isArray() && Array.getLength(msg) == 1){ + return Array.get(msg,0); + }else{ + throw new TargetException("This binding only understands operations with a single parameter"); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooEntryPointContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooEntryPointContextFactory.java new file mode 100644 index 0000000000..69d81f66be --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooEntryPointContextFactory.java @@ -0,0 +1,31 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.binding.foo; + +import org.apache.tuscany.core.extension.EntryPointContextFactory; +import org.apache.tuscany.core.message.MessageFactory; + +/** + * + * + * @version $Rev$ $Date$ + */ +public class FooEntryPointContextFactory extends EntryPointContextFactory { + + public FooEntryPointContextFactory(String name, MessageFactory msgFactory) { + super(name, msgFactory); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooExternalServiceContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooExternalServiceContextFactory.java new file mode 100644 index 0000000000..c7f67e2ff2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooExternalServiceContextFactory.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.binding.foo; + +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.extension.ExternalServiceContextFactory; + +/** + * Creates instances of {@link org.apache.tuscany.core.context.ExternalServiceContext} configured with the appropriate + * wire chains and bindings. This implementation serves as a marker for + * {@link org.apache.tuscany.container.java.mock.binding.foo.FooBindingWireBuilder} + * + * @version $Rev$ $Date$ + */ +public class FooExternalServiceContextFactory extends ExternalServiceContextFactory { + + public FooExternalServiceContextFactory(String name, ObjectFactory objectFactory) { + super(name, objectFactory); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooExternalServiceTargetInvoker.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooExternalServiceTargetInvoker.java new file mode 100644 index 0000000000..ecc9655a10 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/binding/foo/FooExternalServiceTargetInvoker.java @@ -0,0 +1,78 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.binding.foo; + +import org.apache.tuscany.core.context.ExternalServiceContext; +import org.apache.tuscany.core.message.Message; +import org.apache.tuscany.core.wire.Interceptor; +import org.apache.tuscany.core.wire.TargetInvoker; + +import java.lang.reflect.InvocationTargetException; + +/** + * Responsible for invoking a mock transport binding client configured for an external service over a wire + * + * @version $Rev$ $Date$ + */ +public class FooExternalServiceTargetInvoker implements TargetInvoker { + + private String name; + private ExternalServiceContext context; + + public FooExternalServiceTargetInvoker(String esName) { + assert (esName != null) : "No external service name specified"; + name = esName; // name is not used; it is included for illustration + } + + public Object invokeTarget(Object payload) throws InvocationTargetException { + FooClient client = new FooClient(); + if (payload != null) { + return client.invoke(payload); + } else { + return client.invoke(null); + } + } + + public boolean isCacheable() { + return false; + } + + public Message invoke(Message msg) { + try { + Object resp = invokeTarget(msg.getBody()); + msg.setBody(resp); + } catch (InvocationTargetException e) { + msg.setBody(e.getCause()); + } catch (Throwable e) { + msg.setBody(e); + } + return msg; + } + + public void setNext(Interceptor next) { + throw new UnsupportedOperationException(); + } + + public Object clone() throws CloneNotSupportedException { + try { + FooExternalServiceTargetInvoker invoker = (FooExternalServiceTargetInvoker) super.clone(); + invoker.context = this.context; + invoker.name = this.name; + return invoker; + } catch (CloneNotSupportedException e) { + return null; // will not happen + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/AbstractGenericComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/AbstractGenericComponent.java new file mode 100644 index 0000000000..0c9d8172f8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/AbstractGenericComponent.java @@ -0,0 +1,296 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import java.util.List; +import java.util.Map; + +import org.osoa.sca.ModuleContext; +import org.osoa.sca.annotations.ComponentName; +import org.osoa.sca.annotations.Context; +import org.osoa.sca.annotations.Property; + +/** + * Base test component implementation + * + * @version $Rev$ $Date$ + */ +public class AbstractGenericComponent implements GenericComponent { + + @ComponentName + private String name; + + public String getName() { + return name; + } + + @Context + private ModuleContext context; + + public ModuleContext getModuleContext() { + return context; + } + + //---------------------------------- + // Collections + //---------------------------------- + + Map testMap; + + public Map getTestMap() { + return testMap; + } + + public void setTestMap(Map testMap) { + this.testMap = testMap; + } + + List testList; + + public List getTestList() { + return testList; + } + + public void setTestList(List testList) { + this.testList = testList; + } + + //---------------------------------- + // Arrays + //---------------------------------- + + private int[] arrayInt; + + public int[] getArrayInt() { + return arrayInt; + } + + public void setArrayInt(int[] arrayInt) { + this.arrayInt = arrayInt; + } + + private float[] arrayFloat; + + public float[] getArrayFloat() { + return arrayFloat; + } + + public void setArrayFloat(float[] pArrayFloat) { + arrayFloat = pArrayFloat; + } + + private double[] arrayDouble; + + public double[] getArrayDouble() { + return arrayDouble; + } + + public void setArrayDouble(double[] pArrayDouble) { + arrayDouble = pArrayDouble; + } + + private long[] arrayLong; + + public long[] getArrayLong() { + return arrayLong; + } + + public void setArrayLong(long[] arrayLong) { + this.arrayLong = arrayLong; + } + + private short[] arrayShort; + + public short[] getArrayShort() { + return arrayShort; + } + + public void setArrayShort(short[] arrayShort) { + this.arrayShort = arrayShort; + } + + private boolean[] arrayBoolean; + + public boolean[] getArrayBoolean() { + return arrayBoolean; + } + + public void setArrayBoolean(boolean[] arrayBoolean) { + this.arrayBoolean = arrayBoolean; + } + + private String[] arrayString; + + public String[] getArrayString() { + return arrayString; + } + + public void setArrayString(String[] arrayString) { + this.arrayString = arrayString; + } + + //---------------------------------- + // Primitives + //---------------------------------- + + private boolean mBoolean; + + public boolean getBoolean() { + return mBoolean; + } + + public void setBoolean(boolean pBoolean) { + mBoolean = pBoolean; + } + + private short mShort; + + public short getShort() { + return mShort; + } + + public void setShort(short pShort) { + mShort = pShort; + } + + private int mInt; + + public int getInt() { + return mInt; + } + + public void setInt(int pInt) { + mInt = pInt; + } + + private long mLong; + + public long getLong() { + return mLong; + } + + public void setLong(long pLong) { + mLong = pLong; + } + + private double mDouble; + + public double getDouble() { + return mDouble; + } + + public void setDouble(double pDouble) { + mDouble = pDouble; + } + + private float mFloat; + + public float getFloat() { + return mFloat; + } + + public void setFloat(float pFloat) { + mFloat = pFloat; + } + + private char mChar; + + public char getChar() { + return mChar; + } + + public void setChar(char pChar) { + mChar = pChar; + } + + //---------------------------------- + // Object types + //---------------------------------- + + private String mString; + + public String getString() { + return mString; + } + + public void setString(String pString) { + mString = pString; + } + + private Short mOShort; + + public Short getOShort() { + return mOShort; + } + + public void setOShort(Short pOShort) { + mOShort = pOShort; + } + + private Integer mOInteger; + + public Integer getOInteger() { + return mOInteger; + } + + public void setOInteger(Integer pOInteger) { + mOInteger = pOInteger; + } + + private Long mOLong; + + public Long getOLong() { + return mOLong; + } + + public void setOLong(Long pOLong) { + mOLong = pOLong; + } + + private Float mOFloat; + + public Float getOFloat() { + return mOFloat; + } + + public void setOFloat(Float pOFloat) { + mOFloat = pOFloat; + } + + private Double mODouble; + + public Double getODouble() { + return mODouble; + } + + public void setODouble(Double pODouble) { + mODouble = pODouble; + } + + @Property(name = "genericComponent") + private GenericComponent mGenericComponent; + + public GenericComponent getGenericComponent() { + return mGenericComponent; + } + + public void setGenericComponent(GenericComponent pGenericComponent) { + mGenericComponent = pGenericComponent; + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/BadContextPojo.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/BadContextPojo.java new file mode 100644 index 0000000000..7840b57dea --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/BadContextPojo.java @@ -0,0 +1,26 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Context; + +public class BadContextPojo { + + @Context + String moduleContext; + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/BadNamePojo.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/BadNamePojo.java new file mode 100644 index 0000000000..d9753fa9f0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/BadNamePojo.java @@ -0,0 +1,24 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.ComponentName; + +public class BadNamePojo { + @ComponentName + private int name; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/DataObject.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/DataObject.java new file mode 100644 index 0000000000..695cc2a5a1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/DataObject.java @@ -0,0 +1,38 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import java.io.Serializable; + +/** + * A complex type for testing + * + * @version $Rev$ $Date$ + */ +public class DataObject implements Serializable { + + private String stringValue; + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(String stringValue) { + this.stringValue = stringValue; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/GenericComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/GenericComponent.java new file mode 100644 index 0000000000..44f1c02bfd --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/GenericComponent.java @@ -0,0 +1,142 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import java.util.List; +import java.util.Map; + +import org.osoa.sca.ModuleContext; + +/** + * Generic test component + * + * @version $Rev$ $Date$ + */ +public interface GenericComponent { + + public String getName(); + + public ModuleContext getModuleContext(); + + // ---------------------------------- + // Collections + // ---------------------------------- + + public Map getTestMap(); + + public void setTestMap(Map pTestMap); + + public List getTestList(); + + public void setTestList(List pTestList); + + // ---------------------------------- + // Arrays + // ---------------------------------- + + public int[] getArrayInt(); + + public void setArrayInt(int[] pArrayInt); + + public float[] getArrayFloat(); + + public void setArrayFloat(float[] pArrayFloat); + + public double[] getArrayDouble(); + + public void setArrayDouble(double[] pArrayDouble); + + public long[] getArrayLong(); + + public void setArrayLong(long[] pArrayLong); + + public short[] getArrayShort(); + + public void setArrayShort(short[] pArrayShort); + + public boolean[] getArrayBoolean(); + + public void setArrayBoolean(boolean[] pArrayBoolean); + + public String[] getArrayString(); + + public void setArrayString(String[] pArrayString); + + // ---------------------------------- + // Primitives + // ---------------------------------- + + public boolean getBoolean(); + + public void setBoolean(boolean pBoolean); + + public short getShort(); + + public void setShort(short pShort); + + public int getInt(); + + public void setInt(int pInt); + + public long getLong(); + + public void setLong(long pLong); + + public double getDouble(); + + public void setDouble(double pDouble); + + public float getFloat(); + + public void setFloat(float pFloat); + + public char getChar(); + + public void setChar(char pChar); + + // ---------------------------------- + // Object types + // ---------------------------------- + + public String getString(); + + public void setString(String pString); + + public Short getOShort(); + + public void setOShort(Short pOShort); + + public Integer getOInteger(); + + public void setOInteger(Integer pOInteger); + + public Long getOLong(); + + public void setOLong(Long pOLong); + + public Float getOFloat(); + + public void setOFloat(Float pOFloat); + + public Double getODouble(); + + public void setODouble(Double pODouble); + + public GenericComponent getGenericComponent(); + + public void setGenericComponent(GenericComponent pGenericComponent); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/HelloWorldClient.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/HelloWorldClient.java new file mode 100644 index 0000000000..1e7ca9f36b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/HelloWorldClient.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.apache.tuscany.container.java.assembly.mock.HelloWorldService; + +/** + * + * + * @version $Rev$ $Date$ + */ +public class HelloWorldClient implements HelloWorldService{ + + private int count; + + public HelloWorldClient() { + } + + private HelloWorldService service; + + public void setHelloWorldService(HelloWorldService service){ + this.service = service; + } + + public String hello(String name) { + ++count; + return service.hello(name); + } + + public int count() { + return count; + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/LocalComponentImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/LocalComponentImpl.java new file mode 100644 index 0000000000..4b57c7f301 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/LocalComponentImpl.java @@ -0,0 +1,97 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.ModuleContext; +import org.osoa.sca.annotations.ComponentName; +import org.osoa.sca.annotations.Context; +import org.osoa.sca.annotations.Property; +import org.osoa.sca.annotations.Reference; + +/** + * A test local service + * + * @version $Rev$ $Date$ + */ + +public class LocalComponentImpl { + + @ComponentName + protected String name; + + public String getName() { + return name; + } + + @Context + protected ModuleContext moduleCtx; + + public ModuleContext getModuleContext() { + return moduleCtx; + } + + @Property(name = "fieldSetter", required = true) + private String mfieldSetter; + + public String getfieldSetter() { + return mfieldSetter; + } + + public void setfieldSetter(String pfieldSetter) throws Exception { + throw new Exception("Set method instead of field"); + } + + private String mMethodSetter; + boolean mSetByMethod; + + public String getMethodSetter() throws Exception { + if (mSetByMethod) { + return mMethodSetter; + } + throw new Exception("Property method setter failed"); + + } + + @Property(required = true) + public void setMethodSetter(String pMethodSetter) { + mSetByMethod = true; + mMethodSetter = pMethodSetter; + } + + @Reference(name = "requiredDataObject", required = true) + private DataObject mRequiredDataObject; + + public DataObject getRequiredDataObject() { + return mRequiredDataObject; + } + + public void setRequiredDataObject(DataObject pRequiredDataObject) { + mRequiredDataObject = pRequiredDataObject; + } + + @Reference(name = "optionalDataObject") + private DataObject mOptionalDataObject; + + public DataObject getOptionalDataObject() { + return mOptionalDataObject; + } + + public void setOptionalDataObject(DataObject pOptionalDataObject) { + mOptionalDataObject = pOptionalDataObject; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeComponent.java new file mode 100644 index 0000000000..04cbb01de6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeComponent.java @@ -0,0 +1,31 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Scope; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public interface ModuleScopeComponent extends GenericComponent { + public GenericComponent getGenericComponent(); + + public String getString(); + //public boolean isInit(); +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeComponentImpl.componentType b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeComponentImpl.componentType new file mode 100644 index 0000000000..ca4c633e59 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeComponentImpl.componentType @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<!-- remove this once ImplementationImpl is fixed not to requrie this -->
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9">
+
+ <service name="ModuleScopeComponent" scope="module">
+ <interface.java interface="janus.test.component.ModuleScopeComponent"/>
+ </service> + <!-- Not supported, not in the spec
+ <property.java name="mInt" class="java.lang.Integer" default="default"/>
+ <property.java name="foo" class="java.lang.String" default="default"/> + -->
+ <reference name="mGenericComponent" multiplicity="0..1">
+ <interface.java interface="test.org.apache.tuscany.container.java.components.AbstractGenericComponent"/>
+ </reference>
+
+</componentType>
+
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeComponentImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeComponentImpl.java new file mode 100644 index 0000000000..7981208b9e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeComponentImpl.java @@ -0,0 +1,38 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Scope; + + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class ModuleScopeComponentImpl extends AbstractGenericComponent implements + ModuleScopeComponent { + + private String foo; + + public void setFoo(String foo) { + this.foo = foo; + } + + public String getFoo() { + return foo; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeDestroyOnlyComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeDestroyOnlyComponent.java new file mode 100644 index 0000000000..76218c2d6c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeDestroyOnlyComponent.java @@ -0,0 +1,34 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Destroy; + +public class ModuleScopeDestroyOnlyComponent extends ModuleScopeComponentImpl { + + boolean destroyed = false; + + public boolean isDestroyed() { + return destroyed; + } + + @Destroy + public void destroy() { + destroyed = true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeEagerInitComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeEagerInitComponent.java new file mode 100644 index 0000000000..56a0421f24 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeEagerInitComponent.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Init; + +public class ModuleScopeEagerInitComponent extends ModuleScopeComponentImpl { + + boolean initialized = false; + + public boolean isInitialized() { + return initialized; + } + + // this value tests to ensure introspection can find the init() method even + // if a field is named the same. Ultimately, this should be in the + // introspection tests + private boolean init; + + @Init(eager = true) + public void init() { + initialized = true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeEagerInitDestroyComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeEagerInitDestroyComponent.java new file mode 100644 index 0000000000..dae156737a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeEagerInitDestroyComponent.java @@ -0,0 +1,33 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Destroy; + +public class ModuleScopeEagerInitDestroyComponent extends ModuleScopeEagerInitComponent { + + boolean destroyed = false; + + public boolean isDestroyed() { + return destroyed; + } + + @Destroy + public void destroy() { + destroyed = true; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeInitDestroyComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeInitDestroyComponent.java new file mode 100644 index 0000000000..695157612b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeInitDestroyComponent.java @@ -0,0 +1,37 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Destroy; + +public class ModuleScopeInitDestroyComponent extends ModuleScopeInitOnlyComponent { + + boolean destroyed = false; + + public boolean isDestroyed() { + return destroyed; + } + + @Destroy + public void destroy() { + if (destroyed){ + throw new AssertionError("Destroy called more than once"); + } + destroyed = true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeInitOnlyComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeInitOnlyComponent.java new file mode 100644 index 0000000000..4945309852 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/ModuleScopeInitOnlyComponent.java @@ -0,0 +1,41 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Init; + +public class ModuleScopeInitOnlyComponent extends ModuleScopeComponentImpl { + + boolean initialized = false; + + public boolean isInitialized() { + return initialized; + } + + // this value tests to ensure introspection can find the init() method even + // if a field is named the same. Ultimately, this should be in the introspection tests + private boolean init; + + @Init + public void init() { + if (initialized){ + throw new AssertionError("Init called more than once"); + } + initialized = true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/OtherTarget.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/OtherTarget.java new file mode 100644 index 0000000000..2edc8246db --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/OtherTarget.java @@ -0,0 +1,27 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +/** + * Implementations are used in wiring tests + * + * @version $Rev$ $Date$ + */ +public interface OtherTarget { + + public String getString(); + + public void setString(String val); +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/OtherTargetImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/OtherTargetImpl.java new file mode 100644 index 0000000000..08d4d9f720 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/OtherTargetImpl.java @@ -0,0 +1,35 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +/** + * A target used for testing wires with a different source and target interface + * + * @version $Rev$ $Date$ + */ +public class OtherTargetImpl implements OtherTarget{ + + private String theString; + + public String getString() { + return theString; + } + + public void setString(String val) { + theString = val; + } + + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RemotableService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RemotableService.java new file mode 100644 index 0000000000..645fd7f47c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RemotableService.java @@ -0,0 +1,40 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Remotable; + +/** + * Used for testing basic remoting operations + * + * @version $Rev$ $Date$ + */ + +@Remotable +public interface RemotableService { + + public void syncOneWay(String msg); + + public String syncTwoWay(String msg); + + public DataObject syncTwoWayCustomType(DataObject val); + + public String getString(); + + public void setString(String string); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RemotableServiceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RemotableServiceImpl.java new file mode 100644 index 0000000000..34a4273323 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RemotableServiceImpl.java @@ -0,0 +1,61 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import junit.framework.Assert; +import org.osoa.sca.annotations.Property; + + +/** + * @version $Rev$ $Date$ + */ +public class RemotableServiceImpl implements RemotableService { + + // ---------------------------------- + // Properties + // ---------------------------------- + + @Property(name = "string", required = true) + private String mString; + + public String getString() { + return mString; + } + + public void setString(String string) { + mString = string; + } + + // ---------------------------------- + // Methods + // ---------------------------------- + + public void syncOneWay(String msg) { + Assert.assertEquals("hello", msg); + } + + public String syncTwoWay(String msg) { + return "response"; + } + + public DataObject syncTwoWayCustomType(DataObject val) { + Assert.assertEquals("hello", val.getStringValue()); + DataObject dto = new DataObject(); + dto.setStringValue("return"); + return dto; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RequestScopeComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RequestScopeComponent.java new file mode 100644 index 0000000000..ac7931bd2c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RequestScopeComponent.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Scope; + +/** + * @version $Rev$ $Date$ + */ +@Scope("REQUEST") +public interface RequestScopeComponent extends GenericComponent { + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RequestScopeComponentImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RequestScopeComponentImpl.java new file mode 100644 index 0000000000..5b20519d90 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RequestScopeComponentImpl.java @@ -0,0 +1,25 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +/** + * @version $Rev$ $Date$ + */ +public class RequestScopeComponentImpl extends AbstractGenericComponent implements + RequestScopeComponent { + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RequestScopeDestroyOnlyComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RequestScopeDestroyOnlyComponent.java new file mode 100644 index 0000000000..ae63f761c3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RequestScopeDestroyOnlyComponent.java @@ -0,0 +1,36 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Destroy; +import org.osoa.sca.annotations.Scope; + +@Scope("REQUEST") +public class RequestScopeDestroyOnlyComponent extends SessionScopeComponentImpl { + + boolean destroyed = false; + + public boolean isDestroyed() { + return destroyed; + } + + @Destroy + public void destroy() { + destroyed = true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RequestScopeInitDestroyComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RequestScopeInitDestroyComponent.java new file mode 100644 index 0000000000..67f61df36d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RequestScopeInitDestroyComponent.java @@ -0,0 +1,36 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Destroy; +import org.osoa.sca.annotations.Scope; + +@Scope("REQUEST") +public class RequestScopeInitDestroyComponent extends SessionScopeInitOnlyComponent { + + boolean destroyed = false; + + public boolean isDestroyed() { + return destroyed; + } + + @Destroy + public void destroy() { + destroyed = true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RequestScopeInitOnlyComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RequestScopeInitOnlyComponent.java new file mode 100644 index 0000000000..c6c621f518 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/RequestScopeInitOnlyComponent.java @@ -0,0 +1,37 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Scope; + +@Scope("REQUEST") +public class RequestScopeInitOnlyComponent extends SessionScopeComponentImpl { + + boolean initialized = false; + + public boolean isInitialized() { + return initialized; + } + + @Init + public void init() { + initialized = true; + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SessionScopeComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SessionScopeComponent.java new file mode 100644 index 0000000000..236e083a2b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SessionScopeComponent.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Scope; + +/** + * @version $Rev$ $Date$ + */ +@Scope("SESSION") +public interface SessionScopeComponent extends GenericComponent { + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SessionScopeComponentImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SessionScopeComponentImpl.java new file mode 100644 index 0000000000..265969a450 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SessionScopeComponentImpl.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Scope; + +/** + * @version $Rev$ $Date$ + */ +@Scope("SESSION") +public class SessionScopeComponentImpl extends AbstractGenericComponent implements + SessionScopeComponent { + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SessionScopeDestroyOnlyComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SessionScopeDestroyOnlyComponent.java new file mode 100644 index 0000000000..be20a23d29 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SessionScopeDestroyOnlyComponent.java @@ -0,0 +1,34 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Destroy; + +public class SessionScopeDestroyOnlyComponent extends SessionScopeComponentImpl { + + boolean destroyed = false; + + public boolean isDestroyed() { + return destroyed; + } + + @Destroy + public void destroy() { + destroyed = true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SessionScopeInitDestroyComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SessionScopeInitDestroyComponent.java new file mode 100644 index 0000000000..32aa0142a4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SessionScopeInitDestroyComponent.java @@ -0,0 +1,34 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Destroy; + +public class SessionScopeInitDestroyComponent extends SessionScopeInitOnlyComponent { + + boolean destroyed = false; + + public boolean isDestroyed() { + return destroyed; + } + + @Destroy + public void destroy() { + destroyed = true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SessionScopeInitOnlyComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SessionScopeInitOnlyComponent.java new file mode 100644 index 0000000000..a518a9b244 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SessionScopeInitOnlyComponent.java @@ -0,0 +1,35 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Init; + +public class SessionScopeInitOnlyComponent extends SessionScopeComponentImpl { + + boolean initialized = false; + + public boolean isInitialized() { + return initialized; + } + + @Init + public void init() { + initialized = true; + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/Source.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/Source.java new file mode 100644 index 0000000000..1f918590f2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/Source.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import java.util.List; + +/** + * Implementations are used in wiring tests + * + * @version $Rev$ $Date$ + */ +public interface Source { + + public Target getTarget(); + + public List<Target> getTargets(); + + public List<Target> getTargetsThroughField(); + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SourceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SourceImpl.java new file mode 100644 index 0000000000..a2588bae5e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/SourceImpl.java @@ -0,0 +1,63 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import java.util.List; + +/** + * Mock system component implementation used in wiring tests + * + * @version $Rev$ $Date$ + */ +public class SourceImpl implements Source { + + private Target target; + + private List<Target> targets; + + private List<Target> targetsThroughField; + + public void setTarget(Target target) { + this.target = target; + } + + public Target getTarget() { + return target; + } + + public List<Target> getTargets() { + return targets; + } + + public void setTargets(List<Target> targets) { + this.targets = targets; + } + + public List<Target> getTargetsThroughField() { + return targetsThroughField; + } + + + private Target[] targetsArray; + + public Target[] getArrayOfTargets() { + return targetsArray; + } + + public void setArrayOfTargets(Target[] targets) { + targetsArray = targets; + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/StatelessComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/StatelessComponent.java new file mode 100644 index 0000000000..3fe84dd785 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/StatelessComponent.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +import org.osoa.sca.annotations.Scope; + +/** + * @version $Rev$ $Date$ + */ +@Scope("STATELESS") +public interface StatelessComponent extends GenericComponent { + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/StatelessComponentImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/StatelessComponentImpl.java new file mode 100644 index 0000000000..8b806d6a2e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/StatelessComponentImpl.java @@ -0,0 +1,25 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +/** + * @version $Rev$ $Date$ + */ +public class StatelessComponentImpl extends AbstractGenericComponent implements + StatelessComponent { + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/Target.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/Target.java new file mode 100644 index 0000000000..a56e52c898 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/Target.java @@ -0,0 +1,27 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +/** + * Implementations are used in wiring tests + * + * @version $Rev$ $Date$ + */ +public interface Target { + + public String getString(); + + public void setString(String val); +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/TargetImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/TargetImpl.java new file mode 100644 index 0000000000..5a10bfdbc1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/mock/components/TargetImpl.java @@ -0,0 +1,33 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.mock.components; + +/** + * Mock system component implementation used in wiring tests + * + * @version $Rev$ $Date$ + */ +public class TargetImpl implements Target { + + private String theString; + + public String getString() { + return theString; + } + + public void setString(String val) { + theString = val; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/BasicModuleScopeTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/BasicModuleScopeTestCase.java new file mode 100644 index 0000000000..557f306ad2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/BasicModuleScopeTestCase.java @@ -0,0 +1,139 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.scopes; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.container.java.builder.JavaContextFactoryBuilder; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.ModuleScopeComponentImpl; +import org.apache.tuscany.container.java.mock.components.ModuleScopeInitDestroyComponent; +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.system.DefaultPolicyBuilderRegistry; +import org.apache.tuscany.core.builder.system.PolicyBuilderRegistry; +import org.apache.tuscany.core.config.ComponentTypeIntrospector; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.ModuleScopeContext; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; +import org.apache.tuscany.core.wire.service.DefaultWireFactoryService; +import org.apache.tuscany.core.wire.service.WireFactoryService; +import org.apache.tuscany.model.assembly.AtomicComponent; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Scope; + +/** + * Unit tests for the module scope container + * + * @version $Rev$ $Date$ + */ +public class BasicModuleScopeTestCase extends TestCase { + + /** + * Tests instance identity is properly maintained + */ + public void testInstanceManagement() throws Exception { + EventContext ctx = new EventContextImpl(); + ModuleScopeContext scope = new ModuleScopeContext(ctx); + scope.registerFactories(createConfigurations()); + scope.start(); + // first request + scope.onEvent(new ModuleStart(this)); + ModuleScopeComponentImpl comp1 = (ModuleScopeComponentImpl) scope.getContext("TestService1").getInstance(null); + Assert.assertNotNull(comp1); + // second request + ModuleScopeComponentImpl comp2 = (ModuleScopeComponentImpl) scope.getContext("TestService1").getInstance(null); + Assert.assertNotNull(comp2); + Assert.assertSame(comp1, comp2); + scope.onEvent(new ModuleStop(this)); + scope.stop(); + } + + public void testSetNullComponents() throws Exception { + EventContext ctx = new EventContextImpl(); + ModuleScopeContext scope = new ModuleScopeContext(ctx); + scope.registerFactories(createConfigurations()); + scope.start(); + scope.onEvent(new ModuleStart(this)); + scope.onEvent(new ModuleStop(this)); + scope.stop(); + } + + public void testRegisterContextBeforeStart() throws Exception { + EventContext ctx = new EventContextImpl(); + ModuleScopeContext scope = new ModuleScopeContext(ctx); + scope.registerFactories(createConfigurations()); + scope.start(); + scope.registerFactory(createConfiguration("NewTestService")); + scope.onEvent(new ModuleStart(this)); + ModuleScopeInitDestroyComponent comp2 = (ModuleScopeInitDestroyComponent) scope.getContext("NewTestService").getInstance(null); + Assert.assertNotNull(comp2); + Assert.assertTrue(comp2.isInitialized()); + scope.onEvent(new ModuleStop(this)); + Assert.assertTrue(comp2.isDestroyed()); + scope.stop(); + } + + public void testRegisterContextAfterStart() throws Exception { + EventContext ctx = new EventContextImpl(); + ModuleScopeContext scope = new ModuleScopeContext(ctx); + scope.start(); + scope.registerFactory(createConfiguration("NewTestService")); + scope.onEvent(new ModuleStart(this)); + scope.registerFactories(createConfigurations()); + ModuleScopeInitDestroyComponent comp2 = (ModuleScopeInitDestroyComponent) scope.getContext("NewTestService").getInstance(null); + Assert.assertNotNull(comp2); + Assert.assertTrue(comp2.isInitialized()); + scope.onEvent(new ModuleStop(this)); + Assert.assertTrue(comp2.isDestroyed()); + scope.stop(); + } + + + private List<ContextFactory<Context>> createConfigurations() throws BuilderException, ConfigurationLoadException { + PolicyBuilderRegistry policyRegistry = new DefaultPolicyBuilderRegistry(); + WireFactoryService wireService = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), policyRegistry); + JavaContextFactoryBuilder builder = new JavaContextFactoryBuilder(wireService); + AtomicComponent component = MockFactory.createComponent("TestService1", ModuleScopeComponentImpl.class, Scope.MODULE); + builder.build(component); + List<ContextFactory<Context>> configs = new ArrayList<ContextFactory<Context>>(); + configs.add((ContextFactory<Context>) component.getContextFactory()); + return configs; + } + + private ContextFactory<Context> createConfiguration(String name) throws BuilderException, ConfigurationLoadException { + PolicyBuilderRegistry policyRegistry = new DefaultPolicyBuilderRegistry(); + WireFactoryService wireService = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), policyRegistry); + JavaContextFactoryBuilder builder = new JavaContextFactoryBuilder(wireService); + AtomicComponent component = MockFactory.createComponent(name, ModuleScopeInitDestroyComponent.class, + Scope.MODULE); + ComponentTypeIntrospector introspector = MockFactory.getIntrospector(); + ComponentType type = introspector.introspect(ModuleScopeInitDestroyComponent.class); + component.getImplementation().setComponentType(type); + builder.build(component); + return (ContextFactory<Context>) component.getContextFactory(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/BasicRequestScopeTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/BasicRequestScopeTestCase.java new file mode 100644 index 0000000000..e53b9fc9ac --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/BasicRequestScopeTestCase.java @@ -0,0 +1,158 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.scopes; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.container.java.builder.JavaContextFactoryBuilder; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.RequestScopeComponent; +import org.apache.tuscany.container.java.mock.components.RequestScopeComponentImpl; +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.system.DefaultPolicyBuilderRegistry; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.event.RequestEnd; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.RequestScopeContext; +import org.apache.tuscany.core.wire.service.WireFactoryService; +import org.apache.tuscany.core.wire.service.DefaultWireFactoryService; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.AtomicComponent; + +/** + * Unit tests for the request scope container + * + * @version $Rev$ $Date$ + */ +public class BasicRequestScopeTestCase extends TestCase { + + /** + * Tests instance identity is properly maintained + */ + public void testInstanceManagement() throws Exception { + EventContext ctx = new EventContextImpl(); + RequestScopeContext scope = new RequestScopeContext(ctx); + scope.registerFactories(createConfigurations()); + scope.start(); + + // first request + RequestScopeComponentImpl comp1 = (RequestScopeComponentImpl) scope.getContext("TestService1").getInstance(null); + Assert.assertNotNull(comp1); + Object id = new Object(); + scope.onEvent(new RequestEnd(this,id)); + + // second request + RequestScopeComponentImpl comp2 = (RequestScopeComponentImpl) scope.getContext("TestService1").getInstance(null); + Assert.assertNotNull(comp2); + Assert.assertNotSame(comp1, comp2); + Object id2 = new Object(); + scope.onEvent(new RequestEnd(this,id2)); + + scope.stop(); + } + + public void testRegisterContextBeforeRequest() throws Exception { + EventContext ctx = new EventContextImpl(); + RequestScopeContext scope = new RequestScopeContext(ctx); + scope.registerFactories(createConfigurations()); + scope.registerFactory(createConfiguration("NewTestService")); + scope.start(); + RequestScopeComponent comp1 = (RequestScopeComponent) scope.getContext("TestService1").getInstance(null); + Assert.assertNotNull(comp1); + RequestScopeComponent comp2 = (RequestScopeComponent) scope.getContext("NewTestService").getInstance(null); + Assert.assertNotNull(comp2); + Object id = new Object(); + scope.onEvent(new RequestEnd(this,id)); + scope.stop(); + } + + public void testRegisterContextAfterRequest() throws Exception { + EventContext ctx = new EventContextImpl(); + RequestScopeContext scope = new RequestScopeContext(ctx); + scope.registerFactories(createConfigurations()); + scope.start(); + RequestScopeComponent comp1 = (RequestScopeComponent) scope.getContext("TestService1").getInstance(null); + Assert.assertNotNull(comp1); + scope.registerFactory(createConfiguration("NewTestService")); + RequestScopeComponent comp2 = (RequestScopeComponent) scope.getContext("NewTestService").getInstance(null); + Assert.assertNotNull(comp2); + Object id = new Object(); + scope.onEvent(new RequestEnd(this,id)); + scope.stop(); + } + + /** + * Tests setting no components in the scope + */ + public void testSetNullComponents() throws Exception { + EventContext ctx = new EventContextImpl(); + RequestScopeContext scope = new RequestScopeContext(ctx); + scope.registerFactories(createConfigurations()); + scope.start(); + scope.stop(); + } + + public void testGetComponentByKey() throws Exception { + EventContext ctx = new EventContextImpl(); + RequestScopeContext scope = new RequestScopeContext(ctx); + scope.registerFactories(createConfigurations()); + scope.start(); + + RequestScopeComponentImpl comp1 = (RequestScopeComponentImpl) scope.getContext("TestService1").getInstance(null); + Assert.assertNotNull(comp1); + Object id = new Object(); + scope.onEvent(new RequestEnd(this,id)); + + // second request + // should be null since the other context (thread) expired w/ onEvent(..) + Assert.assertNull(scope.getContextByKey("TestService1", Thread.currentThread())); + // Note should test better using concurrent threads to pull the instance + + scope.stop(); + } + + + private List<ContextFactory<Context>> createConfigurations() throws BuilderException, ConfigurationLoadException { + AtomicComponent component = MockFactory.createComponent("TestService1", RequestScopeComponentImpl.class, + Scope.REQUEST); + WireFactoryService wireService = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), new DefaultPolicyBuilderRegistry()); + JavaContextFactoryBuilder builder = new JavaContextFactoryBuilder(wireService); + builder.build(component); + List<ContextFactory<Context>> configs = new ArrayList<ContextFactory<Context>>(); + configs.add((ContextFactory<Context>) component.getContextFactory()); + return configs; + } + + private ContextFactory<Context> createConfiguration(String name) throws BuilderException, ConfigurationLoadException { + AtomicComponent component = MockFactory.createComponent(name, RequestScopeComponentImpl.class, + Scope.REQUEST); + WireFactoryService wireService = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), new DefaultPolicyBuilderRegistry()); + JavaContextFactoryBuilder builder = new JavaContextFactoryBuilder(wireService); + builder.build(component); + return (ContextFactory<Context>) component.getContextFactory(); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/BasicSessionScopeTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/BasicSessionScopeTestCase.java new file mode 100644 index 0000000000..8bee9a9741 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/BasicSessionScopeTestCase.java @@ -0,0 +1,238 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.scopes; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.container.java.builder.JavaContextFactoryBuilder; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.SessionScopeComponent; +import org.apache.tuscany.container.java.mock.components.SessionScopeComponentImpl; +import org.apache.tuscany.container.java.mock.components.SessionScopeInitDestroyComponent; +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.system.DefaultPolicyBuilderRegistry; +import org.apache.tuscany.core.config.ComponentTypeIntrospector; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.event.HttpSessionEnd; +import org.apache.tuscany.core.context.event.HttpSessionEvent; +import org.apache.tuscany.core.context.event.RequestEnd; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.SessionScopeContext; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; +import org.apache.tuscany.core.wire.service.DefaultWireFactoryService; +import org.apache.tuscany.core.wire.service.WireFactoryService; +import org.apache.tuscany.model.assembly.AtomicComponent; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Scope; + +/** + * Unit tests for the Http session scope container + * + * @version $Rev$ $Date$ + */ +public class BasicSessionScopeTestCase extends TestCase { + + /** + * Tests instance identity is properly maintained + */ + public void testInstanceManagement() throws Exception { + EventContext ctx = new EventContextImpl(); + SessionScopeContext scope = new SessionScopeContext(ctx); + scope.registerFactories(createConfigurations()); + scope.start(); + Object session = new Object(); + Object session2 = new Object(); + // first request + ctx.setIdentifier(HttpSessionEvent.HTTP_IDENTIFIER, session); + SessionScopeComponent comp1 = (SessionScopeComponent) scope.getContext("TestService1").getInstance(null); + Assert.assertNotNull(comp1); + ctx.clearIdentifier(HttpSessionEvent.HTTP_IDENTIFIER); + + // second request + ctx.setIdentifier(HttpSessionEvent.HTTP_IDENTIFIER, session); + SessionScopeComponent comp2 = (SessionScopeComponent) scope.getContext("TestService1").getInstance(null); + Assert.assertNotNull(comp2); + Assert.assertSame(comp1, comp2); + ctx.clearIdentifier(HttpSessionEvent.HTTP_IDENTIFIER); + + // third request, different session + ctx.setIdentifier(HttpSessionEvent.HTTP_IDENTIFIER, session2); + SessionScopeComponent comp3 = (SessionScopeComponent) scope.getContext("TestService1").getInstance(null); + Assert.assertNotNull(comp3); + Assert.assertNotSame(comp1, comp3); // should be different instances + ctx.clearIdentifier(HttpSessionEvent.HTTP_IDENTIFIER); + + scope.onEvent(new HttpSessionEnd(this, session)); + scope.onEvent(new HttpSessionEnd(this, session2)); + scope.stop(); + } + + /** + * Tests setting no components in the scope + */ + public void testSetNullComponents() throws Exception { + EventContext ctx = new EventContextImpl(); + SessionScopeContext scope = new SessionScopeContext(ctx); + scope.registerFactories(new ArrayList<ContextFactory<Context>>()); + scope.start(); + scope.stop(); + } + + public void testGetContextByKey() throws Exception { + EventContext ctx = new EventContextImpl(); + SessionScopeContext scope = new SessionScopeContext(ctx); + scope.registerFactories(createConfigurations()); + scope.start(); + Object session = new Object(); + Object session2 = new Object(); + + // first request + ctx.setIdentifier(HttpSessionEvent.HTTP_IDENTIFIER, session); + SessionScopeComponent comp1 = (SessionScopeComponent) scope.getContext("TestService1").getInstance(null); + Assert.assertNotNull(comp1); + ctx.clearIdentifier(HttpSessionEvent.HTTP_IDENTIFIER); + + // second request, different session + ctx.setIdentifier(HttpSessionEvent.HTTP_IDENTIFIER, session2); + SessionScopeComponent comp2 = (SessionScopeComponent) scope.getContextByKey("TestService1", session) + .getInstance(null); + SessionScopeComponent comp3 = (SessionScopeComponent) scope.getContextByKey("TestService1", session) + .getInstance(null); + Assert.assertNotNull(comp2); + Object id = new Object(); + scope.onEvent(new RequestEnd(this, id)); + Assert.assertSame(comp1, comp2); // should be same instances + Assert.assertSame(comp2, comp3); // should not be same instances + ctx.clearIdentifier(HttpSessionEvent.HTTP_IDENTIFIER); + + // shutdown sessions + scope.onEvent(new HttpSessionEnd(this, session)); + scope.onEvent(new HttpSessionEnd(this, session2)); + + scope.stop(); + } + + public void testRegisterContextBeforeSession() throws Exception { + EventContext ctx = new EventContextImpl(); + SessionScopeContext scope = new SessionScopeContext(ctx); + scope.registerFactories(createConfigurations()); + scope.start(); + Object session = new Object(); + scope.registerFactory(createConfiguration("NewTestService")); + + // first request + ctx.setIdentifier(HttpSessionEvent.HTTP_IDENTIFIER, session); + + SessionScopeInitDestroyComponent comp2 = (SessionScopeInitDestroyComponent) scope.getContext("NewTestService") + .getInstance(null); + Assert.assertNotNull(comp2); + Assert.assertTrue(comp2.isInitialized()); + ctx.clearIdentifier(HttpSessionEvent.HTTP_IDENTIFIER); + + // second request different session + Object session2 = new Object(); + ctx.setIdentifier(HttpSessionEvent.HTTP_IDENTIFIER, session2); + SessionScopeInitDestroyComponent comp3 = (SessionScopeInitDestroyComponent) scope.getContext("NewTestService") + .getInstance(null); + Assert.assertNotNull(comp3); + Assert.assertNotSame(comp2, comp3); + Assert.assertTrue(comp3.isInitialized()); + ctx.clearIdentifier(HttpSessionEvent.HTTP_IDENTIFIER); + + scope.onEvent(new HttpSessionEnd(this, session)); + Assert.assertTrue(comp2.isDestroyed()); + + scope.onEvent(new HttpSessionEnd(this, session2)); + Assert.assertTrue(comp3.isDestroyed()); + scope.stop(); + } + + /** + * Tests runtime context registration + */ + public void testRegisterContextAfterSession() throws Exception { + EventContext ctx = new EventContextImpl(); + SessionScopeContext scope = new SessionScopeContext(ctx); + scope.registerFactories(createConfigurations()); + scope.start(); + Object session = new Object(); + + // first request + ctx.setIdentifier(HttpSessionEvent.HTTP_IDENTIFIER, session); + SessionScopeComponent comp1 = (SessionScopeComponent) scope.getContext("TestService1").getInstance(null); + Assert.assertNotNull(comp1); + ctx.clearIdentifier(HttpSessionEvent.HTTP_IDENTIFIER); + + scope.registerFactory(createConfiguration("NewTestService")); + + // second request + ctx.setIdentifier(HttpSessionEvent.HTTP_IDENTIFIER, session); + SessionScopeInitDestroyComponent comp2 = (SessionScopeInitDestroyComponent) scope.getContext("NewTestService") + .getInstance(null); + Assert.assertNotNull(comp2); + Assert.assertTrue(comp2.isInitialized()); + ctx.clearIdentifier(HttpSessionEvent.HTTP_IDENTIFIER); + + // third request different session + Object session2 = new Object(); + ctx.setIdentifier(HttpSessionEvent.HTTP_IDENTIFIER, session2); + SessionScopeInitDestroyComponent comp3 = (SessionScopeInitDestroyComponent) scope.getContext("NewTestService") + .getInstance(null); + Assert.assertNotNull(comp3); + Assert.assertNotSame(comp2, comp3); + Assert.assertTrue(comp3.isInitialized()); + ctx.clearIdentifier(HttpSessionEvent.HTTP_IDENTIFIER); + + scope.onEvent(new HttpSessionEnd(this, session)); + Assert.assertTrue(comp2.isDestroyed()); + + scope.onEvent(new HttpSessionEnd(this, session2)); + Assert.assertTrue(comp3.isDestroyed()); + scope.stop(); + } + + private List<ContextFactory<Context>> createConfigurations() throws BuilderException, ConfigurationLoadException { + WireFactoryService wireService = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), new DefaultPolicyBuilderRegistry()); + JavaContextFactoryBuilder builder = new JavaContextFactoryBuilder(wireService); + AtomicComponent component = MockFactory.createComponent("TestService1", SessionScopeComponentImpl.class, Scope.SESSION); + ComponentTypeIntrospector introspector = MockFactory.getIntrospector(); + ComponentType type = introspector.introspect(SessionScopeComponentImpl.class); + component.getImplementation().setComponentType(type); + builder.build(component); + List<ContextFactory<Context>> configs = new ArrayList<ContextFactory<Context>>(); + configs.add((ContextFactory<Context>) component.getContextFactory()); + return configs; + } + + private ContextFactory<Context> createConfiguration(String name) throws BuilderException, ConfigurationLoadException { + WireFactoryService wireService = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), new DefaultPolicyBuilderRegistry()); + JavaContextFactoryBuilder builder = new JavaContextFactoryBuilder(wireService); + AtomicComponent component = MockFactory.createComponent(name, SessionScopeInitDestroyComponent.class, Scope.SESSION); + ComponentTypeIntrospector introspector = MockFactory.getIntrospector(); + ComponentType type = introspector.introspect(SessionScopeInitDestroyComponent.class); + component.getImplementation().setComponentType(type); + builder.build(component); + return (ContextFactory<Context>) component.getContextFactory(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/BasicStatelessScopeTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/BasicStatelessScopeTestCase.java new file mode 100644 index 0000000000..3765c8bf27 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/BasicStatelessScopeTestCase.java @@ -0,0 +1,129 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.scopes; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.container.java.builder.JavaContextFactoryBuilder; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.StatelessComponent; +import org.apache.tuscany.container.java.mock.components.StatelessComponentImpl; +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.system.DefaultPolicyBuilderRegistry; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.StatelessScopeContext; +import org.apache.tuscany.core.wire.service.WireFactoryService; +import org.apache.tuscany.core.wire.service.DefaultWireFactoryService; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.AtomicComponent; + +/** + * Unit tests for the module scope container + * + * @version $Rev$ $Date$ + */ +public class BasicStatelessScopeTestCase extends TestCase { + + /** + * Tests instance identity is properly maintained + */ + public void testInstanceManagement() throws Exception { + EventContext ctx = new EventContextImpl(); + StatelessScopeContext scope = new StatelessScopeContext(ctx); + scope.registerFactories(createConfigurations()); + scope.start(); + // first request + StatelessComponentImpl comp1 = (StatelessComponentImpl) scope.getContext("TestService1").getInstance(null); + Assert.assertNotNull(comp1); + // second request + StatelessComponentImpl comp2 = (StatelessComponentImpl) scope.getContext("TestService1").getInstance(null); + Assert.assertNotNull(comp2); + Assert.assertNotSame(comp1, comp2); + scope.stop(); + } + + public void testRegisterContextBeforeRequest() throws Exception { + EventContext ctx = new EventContextImpl(); + StatelessScopeContext scope = new StatelessScopeContext(ctx); + scope.registerFactories(createConfigurations()); + scope.registerFactory(createConfiguration("NewTestService")); + scope.start(); + StatelessComponent comp1 = (StatelessComponent) scope.getContext("TestService1").getInstance(null); + Assert.assertNotNull(comp1); + StatelessComponent comp2 = (StatelessComponent) scope.getContext("NewTestService").getInstance(null); + Assert.assertNotNull(comp2); + scope.stop(); + } + + public void testRegisterContextAfterRequest() throws Exception { + EventContext ctx = new EventContextImpl(); + StatelessScopeContext scope = new StatelessScopeContext(ctx); + scope.registerFactories(createConfigurations()); + scope.start(); + StatelessComponent comp1 = (StatelessComponent) scope.getContext("TestService1").getInstance(null); + Assert.assertNotNull(comp1); + scope.registerFactory(createConfiguration("NewTestService")); + StatelessComponent comp2 = (StatelessComponent) scope.getContext("NewTestService").getInstance(null); + Assert.assertNotNull(comp2); + scope.stop(); + } + + + /** + * Tests setting no components in the scope + */ + public void testSetNullComponents() throws Exception { + EventContext ctx = new EventContextImpl(); + StatelessScopeContext scope = new StatelessScopeContext(ctx); + scope.registerFactories(createConfigurations()); + scope.start(); + scope.stop(); + } + + private List<ContextFactory<Context>> createConfigurations() + throws NoSuchMethodException, BuilderException, ConfigurationLoadException { + AtomicComponent component = MockFactory.createComponent("TestService1", StatelessComponentImpl.class, + Scope.INSTANCE); + WireFactoryService wireService = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), new DefaultPolicyBuilderRegistry()); + JavaContextFactoryBuilder builder = new JavaContextFactoryBuilder(wireService); + builder.build(component); + List<ContextFactory<Context>> configs = new ArrayList(); + configs.add((ContextFactory<Context>) component.getContextFactory()); + return configs; + } + + private ContextFactory<Context> createConfiguration(String name) + throws NoSuchMethodException, BuilderException, ConfigurationLoadException { + AtomicComponent component = MockFactory.createComponent(name, StatelessComponentImpl.class, + Scope.INSTANCE); + WireFactoryService wireService = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(),new DefaultPolicyBuilderRegistry()); + JavaContextFactoryBuilder builder = new JavaContextFactoryBuilder(wireService); + builder.build(component); + return (ContextFactory<Context>) component.getContextFactory(); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/CompositeScopeTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/CompositeScopeTestCase.java new file mode 100644 index 0000000000..d5b5a29e9c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/CompositeScopeTestCase.java @@ -0,0 +1,188 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.scopes; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.container.java.builder.JavaContextFactoryBuilder; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.GenericComponent; +import org.apache.tuscany.container.java.mock.components.ModuleScopeComponentImpl; +import org.apache.tuscany.container.java.mock.components.SessionScopeComponentImpl; +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.system.DefaultPolicyBuilderRegistry; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.RequestStart; +import org.apache.tuscany.core.context.event.HttpSessionBound; +import org.apache.tuscany.core.context.event.RequestEnd; +import org.apache.tuscany.core.context.event.HttpSessionEnd; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.CompositeScopeContext; +import org.apache.tuscany.core.wire.service.WireFactoryService; +import org.apache.tuscany.core.wire.service.DefaultWireFactoryService; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.model.assembly.Extensible; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.AtomicComponent; + +/** + * Tests component nesting. This test needs to be in the container.java progject since it relies on Java POJOs for scope + * testing. + * + * @version $Rev$ $Date$ + */ +public class CompositeScopeTestCase extends TestCase { + + /** + * Ensures scope events are propagated in an composite scope + */ + public void testCompositeScopePropagation() throws Exception { + EventContext ctx = new EventContextImpl(); + CompositeContext moduleComponentCtx = new CompositeContextImpl(); + moduleComponentCtx.setName("testMC"); + moduleComponentCtx.start(); + CompositeScopeContext scopeContainer = new CompositeScopeContext(ctx); + scopeContainer.registerFactory(MockFactory.createCompositeConfiguration("CompositeComponent")); + scopeContainer.start(); + CompositeContext child = (CompositeContext) scopeContainer.getContext("CompositeComponent"); + List<Extensible> models = createAssembly(); + for (Extensible model : models) { + child.registerModelObject(model); + } + + scopeContainer.onEvent(new ModuleStart(this)); + Object session = new Object(); + Object id = new Object(); + //ctx.setIdentifier(EventContext.SESSION,session); + scopeContainer.onEvent(new RequestStart(this,id)); + scopeContainer.onEvent(new HttpSessionBound(this,session)); + CompositeContext componentCtx = (CompositeContext) scopeContainer.getContext("CompositeComponent"); + GenericComponent testService1 = (GenericComponent) componentCtx.getContext("TestService1").getInstance(null); + GenericComponent testService2 = (GenericComponent) componentCtx.getContext("TestService2").getInstance(null); + GenericComponent testService3 = (GenericComponent) componentCtx.getContext("TestService3").getInstance(null); + Assert.assertNotNull(testService1); + Assert.assertNotNull(testService2); + Assert.assertNotNull(testService3); + scopeContainer.onEvent(new RequestEnd(this,id)); + scopeContainer.onEvent(new RequestStart(this,id)); + scopeContainer.onEvent(new HttpSessionBound(this,session)); + + GenericComponent testService2a = (GenericComponent) componentCtx.getContext("TestService2").getInstance(null); + Assert.assertNotNull(testService2a); + GenericComponent testService3a = (GenericComponent) componentCtx.getContext("TestService3").getInstance(null); + Assert.assertNotNull(testService3a); + Assert.assertEquals(testService2, testService2a); + Assert.assertNotSame(testService3, testService3a); + scopeContainer.onEvent(new RequestEnd(this,id)); + scopeContainer.onEvent(new HttpSessionEnd(this,session)); + + Object session2 = new Object(); + Object id2 = new Object(); + scopeContainer.onEvent(new RequestStart(this,id2)); + scopeContainer.onEvent(new HttpSessionBound(this,session2)); + GenericComponent testService2b = (GenericComponent) componentCtx.getContext("TestService2").getInstance(null); + Assert.assertNotNull(testService2b); + Assert.assertNotSame(testService2, testService2b); + + scopeContainer.onEvent(new RequestEnd(this,id2)); + scopeContainer.onEvent(new HttpSessionEnd(this,session2)); + + } + + /** + * Ensures only child entry points (and not components) are accessible from parents + */ + public void testCompositeNoEntryPoint() throws Exception { + EventContext ctx = new EventContextImpl(); + CompositeContext moduleComponentCtx = new CompositeContextImpl(); + moduleComponentCtx.setName("testMC"); + CompositeScopeContext scopeContainer = new CompositeScopeContext(ctx); + scopeContainer.registerFactory(MockFactory.createCompositeConfiguration("CompositeComponent")); + scopeContainer.start(); + CompositeContext child = (CompositeContext) scopeContainer.getContext("CompositeComponent"); + List<Extensible> parts = createAssembly(); + for (Extensible part : parts) { + child.registerModelObject(part); + } + scopeContainer.onEvent(new ModuleStart(this)); + scopeContainer.getContext("CompositeComponent"); + } + + /** + * Tests adding a context before its parent has been started + */ + public void testRegisterContextBeforeStart() throws Exception { + EventContext ctx = new EventContextImpl(); + CompositeContext moduleComponentCtx = new CompositeContextImpl(); + moduleComponentCtx.setName("testMC"); + CompositeScopeContext scopeContainer = new CompositeScopeContext(ctx); + scopeContainer.registerFactory(MockFactory.createCompositeConfiguration("CompositeComponent")); + scopeContainer.start(); + scopeContainer.onEvent(new ModuleStart(this)); + scopeContainer.getContext("CompositeComponent"); + scopeContainer.onEvent(new ModuleStop(this)); + scopeContainer.stop(); + } + + /** + * Tests adding a context after its parent has been started + */ + public void testRegisterContextAfterStart() throws Exception { + EventContext ctx = new EventContextImpl(); + CompositeContext moduleComponentCtx = new CompositeContextImpl(); + moduleComponentCtx.setName("testMC"); + CompositeScopeContext scopeContainer = new CompositeScopeContext(ctx); + scopeContainer.start(); + + scopeContainer.onEvent(new ModuleStart(this)); + scopeContainer.registerFactory(MockFactory.createCompositeConfiguration("CompositeComponent")); + scopeContainer.getContext("CompositeComponent"); + scopeContainer.onEvent(new ModuleStop(this)); + scopeContainer.stop(); + } + + /** + * Creats an assembly containing a module-scoped component definition, a session-scoped component definition, and a + * request-scoped component definition + * + */ + private List<Extensible> createAssembly() throws BuilderException, ConfigurationLoadException { + WireFactoryService wireService = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), new DefaultPolicyBuilderRegistry()); + JavaContextFactoryBuilder builder = new JavaContextFactoryBuilder(wireService); + AtomicComponent component = MockFactory.createComponent("TestService1", ModuleScopeComponentImpl.class, Scope.MODULE); + AtomicComponent sessionComponent = MockFactory.createComponent("TestService2", SessionScopeComponentImpl.class, + Scope.SESSION); + AtomicComponent requestComponent = MockFactory.createComponent("TestService3", SessionScopeComponentImpl.class, + Scope.REQUEST); + builder.build(component); + builder.build(sessionComponent); + builder.build(requestComponent); + List<Extensible> configs = new ArrayList<Extensible>(); + configs.add(component); + configs.add(sessionComponent); + configs.add(requestComponent); + return configs; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/DependencyLifecycleTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/DependencyLifecycleTestCase.java new file mode 100644 index 0000000000..dc3fe3efcb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/DependencyLifecycleTestCase.java @@ -0,0 +1,93 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.scopes; + +import junit.framework.TestCase; +import org.apache.tuscany.container.java.mock.MockContextFactory; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.event.HttpSessionBound; +import org.apache.tuscany.core.context.event.HttpSessionEvent; +import org.apache.tuscany.core.context.event.HttpSessionEnd; +import org.apache.tuscany.core.context.event.RequestStart; +import org.apache.tuscany.core.context.event.RequestEnd; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.ModuleScopeContext; +import org.apache.tuscany.core.context.scope.SessionScopeContext; +import org.apache.tuscany.core.context.scope.RequestScopeContext; +import org.apache.tuscany.model.assembly.Scope; + +/** + * Tests that dependencies are initalized and destroyed in the proper order (i.e. LIFO) + * + * @version $Rev: 393992 $ $Date: 2006-04-13 18:01:05 -0700 (Thu, 13 Apr 2006) $ + */ +public class DependencyLifecycleTestCase extends TestCase { + + + + public void testInitDestroyOrderModuleScope() throws Exception { + EventContext ctx = new EventContextImpl(); + ModuleScopeContext scope = new ModuleScopeContext(ctx); + scope.registerFactories(MockContextFactory.createWiredContexts(Scope.MODULE,scope)); + scope.start(); + scope.onEvent(new ModuleStart(this)); + OrderedDependentPojo source = (OrderedDependentPojo) scope.getContext("source").getInstance(null); + assertNotNull(source.getPojo()); + // expire module + assertEquals(2,source.getNumberInstantiated()); + scope.onEvent(new ModuleStop(this)); + assertEquals(0,source.getNumberInstantiated()); + scope.stop(); + } + + public void testInitDestroyOrderSessionScope() throws Exception { + EventContext ctx = new EventContextImpl(); + SessionScopeContext scope = new SessionScopeContext(ctx); + scope.registerFactories(MockContextFactory.createWiredContexts(Scope.SESSION,scope)); + scope.start(); + Object session = new Object(); + ctx.setIdentifier(HttpSessionEvent.HTTP_IDENTIFIER,session); + scope.onEvent(new HttpSessionBound(this,session)); + OrderedDependentPojo source = (OrderedDependentPojo) scope.getContext("source").getInstance(null); + assertNotNull(source.getPojo()); + // expire module + assertEquals(2,source.getNumberInstantiated()); + scope.onEvent(new HttpSessionEnd(this,session)); + assertEquals(0,source.getNumberInstantiated()); + scope.stop(); + } + + + public void testInitDestroyOrderRequestScope() throws Exception { + EventContext ctx = new EventContextImpl(); + RequestScopeContext scope = new RequestScopeContext(ctx); + scope.registerFactories(MockContextFactory.createWiredContexts(Scope.REQUEST,scope)); + scope.start(); + Object request = new Object(); + scope.onEvent(new RequestStart(this,request)); + OrderedDependentPojo source = (OrderedDependentPojo) scope.getContext("source").getInstance(null); + assertNotNull(source.getPojo()); + // expire module + assertEquals(2,source.getNumberInstantiated()); + scope.onEvent(new RequestEnd(this,request)); + assertEquals(0,source.getNumberInstantiated()); + scope.stop(); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/ModuleScopeLifecycleTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/ModuleScopeLifecycleTestCase.java new file mode 100644 index 0000000000..904e218c08 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/ModuleScopeLifecycleTestCase.java @@ -0,0 +1,248 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.scopes; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.container.java.builder.JavaContextFactoryBuilder; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.ModuleScopeDestroyOnlyComponent; +import org.apache.tuscany.container.java.mock.components.ModuleScopeEagerInitComponent; +import org.apache.tuscany.container.java.mock.components.ModuleScopeEagerInitDestroyComponent; +import org.apache.tuscany.container.java.mock.components.ModuleScopeInitDestroyComponent; +import org.apache.tuscany.container.java.mock.components.ModuleScopeInitOnlyComponent; +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.system.DefaultPolicyBuilderRegistry; +import org.apache.tuscany.core.config.ComponentTypeIntrospector; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.ModuleScopeContext; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; +import org.apache.tuscany.core.wire.service.DefaultWireFactoryService; +import org.apache.tuscany.core.wire.service.WireFactoryService; +import org.apache.tuscany.model.assembly.AtomicComponent; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Scope; + +/** + * Lifecycle unit tests for the module scope container + * + * @version $Rev$ $Date$ + */ +public class ModuleScopeLifecycleTestCase extends TestCase { + + JavaContextFactoryBuilder builder; + + public void testInitDestroy() throws Exception { + EventContext ctx = new EventContextImpl(); + ModuleScopeContext scope = new ModuleScopeContext(ctx); + scope.registerFactories(createComponents()); + scope.start(); + scope.onEvent(new ModuleStart(this)); + ModuleScopeInitDestroyComponent initDestroy = (ModuleScopeInitDestroyComponent) scope.getContext( + "TestServiceInitDestroy").getInstance(null); + Assert.assertNotNull(initDestroy); + ModuleScopeInitOnlyComponent initOnly = (ModuleScopeInitOnlyComponent) scope.getContext("TestServiceInitOnly") + .getInstance(null); + Assert.assertNotNull(initOnly); + ModuleScopeDestroyOnlyComponent destroyOnly = (ModuleScopeDestroyOnlyComponent) scope.getContext( + "TestServiceDestroyOnly").getInstance(null); + Assert.assertNotNull(destroyOnly); + + Assert.assertTrue(initDestroy.isInitialized()); + Assert.assertTrue(initOnly.isInitialized()); + Assert.assertFalse(initDestroy.isDestroyed()); + Assert.assertFalse(destroyOnly.isDestroyed()); + + // expire module + scope.onEvent(new ModuleStop(this)); + + Assert.assertTrue(initDestroy.isDestroyed()); + Assert.assertTrue(destroyOnly.isDestroyed()); + + scope.stop(); + } + + public void testEagerInit() throws Exception { + EventContext ctx = new EventContextImpl(); + ModuleScopeContext scope = new ModuleScopeContext(ctx); + scope.registerFactories(createEagerInitComponents()); + scope.start(); + scope.onEvent(new ModuleStart(this)); + ModuleScopeEagerInitDestroyComponent initDestroy = (ModuleScopeEagerInitDestroyComponent) scope.getContext( + "TestServiceEagerInitDestroy").getInstance(null); + Assert.assertNotNull(initDestroy); + ModuleScopeEagerInitComponent initOnly = (ModuleScopeEagerInitComponent) scope + .getContext("TestServiceEagerInit").getInstance(null); + Assert.assertNotNull(initOnly); + + Assert.assertTrue(initDestroy.isInitialized()); + Assert.assertTrue(initOnly.isInitialized()); + Assert.assertFalse(initDestroy.isDestroyed()); + + // expire module + scope.onEvent(new ModuleStop(this)); + + Assert.assertTrue(initDestroy.isDestroyed()); + + scope.stop(); + + } + + public void testDestroyOrder() throws Exception { + EventContext ctx = new EventContextImpl(); + ModuleScopeContext scope = new ModuleScopeContext(ctx); + scope.registerFactories(createOrderedInitComponents()); + scope.start(); + scope.onEvent(new ModuleStart(this)); + OrderedInitPojo one = (OrderedInitPojo) scope.getContext("one").getInstance(null); + Assert.assertNotNull(one); + Assert.assertEquals(1, one.getNumberInstantiated()); + Assert.assertEquals(1, one.getInitOrder()); + + OrderedInitPojo two = (OrderedInitPojo) scope.getContext("two").getInstance(null); + Assert.assertNotNull(two); + Assert.assertEquals(2, two.getNumberInstantiated()); + Assert.assertEquals(2, two.getInitOrder()); + + OrderedInitPojo three = (OrderedInitPojo) scope.getContext("three").getInstance(null); + Assert.assertNotNull(three); + Assert.assertEquals(3, three.getNumberInstantiated()); + Assert.assertEquals(3, three.getInitOrder()); + + // expire module + scope.onEvent(new ModuleStop(this)); + Assert.assertEquals(0, one.getNumberInstantiated()); + scope.stop(); + } + + public void testEagerInitDestroyOrder() throws Exception { + EventContext ctx = new EventContextImpl(); + ModuleScopeContext scope = new ModuleScopeContext(ctx); + scope.registerFactories(createOrderedEagerInitComponents()); + scope.start(); + scope.onEvent(new ModuleStart(this)); + OrderedEagerInitPojo one = (OrderedEagerInitPojo) scope.getContext("one").getInstance(null); + Assert.assertNotNull(one); + + OrderedEagerInitPojo two = (OrderedEagerInitPojo) scope.getContext("two").getInstance(null); + Assert.assertNotNull(two); + + OrderedEagerInitPojo three = (OrderedEagerInitPojo) scope.getContext("three").getInstance(null); + Assert.assertNotNull(three); + + // expire module + scope.onEvent(new ModuleStop(this)); + Assert.assertEquals(0, one.getNumberInstantiated()); + scope.stop(); + } + + + private List<ContextFactory<Context>> createComponents() throws BuilderException, ConfigurationLoadException { + AtomicComponent[] ca = new AtomicComponent[3]; + ca[0] = MockFactory.createComponent("TestServiceInitDestroy", ModuleScopeInitDestroyComponent.class, + Scope.MODULE); + ca[1] = MockFactory.createComponent("TestServiceInitOnly", ModuleScopeInitOnlyComponent.class, + Scope.MODULE); + ca[2] = MockFactory.createComponent("TestServiceDestroyOnly", ModuleScopeDestroyOnlyComponent.class, + Scope.MODULE); + List<ContextFactory<Context>> configs = new ArrayList<ContextFactory<Context>>(); + ComponentTypeIntrospector introspector = MockFactory.getIntrospector(); + ca[0].getImplementation().setComponentType(introspector.introspect(ModuleScopeInitDestroyComponent.class)); + ca[1].getImplementation().setComponentType(introspector.introspect(ModuleScopeInitOnlyComponent.class)); + ca[2].getImplementation().setComponentType(introspector.introspect(ModuleScopeDestroyOnlyComponent.class)); + for (AtomicComponent aCa : ca) { + builder.build(aCa); + configs.add((ContextFactory<Context>) aCa.getContextFactory()); + + } + return configs; + } + + private List<ContextFactory<Context>> createEagerInitComponents() throws + BuilderException, ConfigurationLoadException { + AtomicComponent[] ca = new AtomicComponent[2]; + ca[0] = MockFactory.createComponent("TestServiceEagerInitDestroy", ModuleScopeEagerInitDestroyComponent.class, + Scope.MODULE); + ca[1] = MockFactory.createComponent("TestServiceEagerInit", ModuleScopeEagerInitComponent.class, + Scope.MODULE); + List<ContextFactory<Context>> configs = new ArrayList<ContextFactory<Context>>(); + ComponentTypeIntrospector introspector = MockFactory.getIntrospector(); + ComponentType type = introspector.introspect(OrderedInitPojo.class); + ca[0].getImplementation().setComponentType(introspector.introspect(ModuleScopeEagerInitDestroyComponent.class)); + ca[1].getImplementation().setComponentType(introspector.introspect(ModuleScopeEagerInitComponent.class)); + for (AtomicComponent aCa : ca) { + builder.build(aCa); + configs.add((ContextFactory<Context>) aCa.getContextFactory()); + } + return configs; + } + + private List<ContextFactory<Context>> createOrderedInitComponents() throws + BuilderException, ConfigurationLoadException { + AtomicComponent[] ca = new AtomicComponent[3]; + ca[0] = MockFactory.createComponent("one", OrderedInitPojo.class, Scope.MODULE); + ca[1] = MockFactory.createComponent("two", OrderedInitPojo.class, Scope.MODULE); + ca[2] = MockFactory.createComponent("three", OrderedInitPojo.class, Scope.MODULE); + List<ContextFactory<Context>> configs = new ArrayList<ContextFactory<Context>>(); + ComponentTypeIntrospector introspector = MockFactory.getIntrospector(); + ComponentType type = introspector.introspect(OrderedInitPojo.class); + ca[0].getImplementation().setComponentType(type); + ca[1].getImplementation().setComponentType(type); + ca[2].getImplementation().setComponentType(type); + for (AtomicComponent aCa : ca) { + builder.build(aCa); + configs.add((ContextFactory<Context>) aCa.getContextFactory()); + } + return configs; + } + + private List<ContextFactory<Context>> createOrderedEagerInitComponents() throws + BuilderException, ConfigurationLoadException { + AtomicComponent[] ca = new AtomicComponent[3]; + ca[0] = MockFactory.createComponent("one", OrderedEagerInitPojo.class, Scope.MODULE); + ca[1] = MockFactory.createComponent("two", OrderedEagerInitPojo.class, Scope.MODULE); + ca[2] = MockFactory.createComponent("three", OrderedEagerInitPojo.class, Scope.MODULE); + ComponentTypeIntrospector introspector = MockFactory.getIntrospector(); + ComponentType type = introspector.introspect(OrderedEagerInitPojo.class); + ca[0].getImplementation().setComponentType(type); + ca[1].getImplementation().setComponentType(type); + ca[2].getImplementation().setComponentType(type); + List<ContextFactory<Context>> configs = new ArrayList<ContextFactory<Context>>(); + for (AtomicComponent aCa : ca) { + builder.build(aCa); + configs.add((ContextFactory<Context>) aCa.getContextFactory()); + + } + return configs; + } + + protected void setUp() throws Exception { + super.setUp(); + WireFactoryService wireService = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), new DefaultPolicyBuilderRegistry()); + builder = new JavaContextFactoryBuilder(wireService); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/OrderException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/OrderException.java new file mode 100644 index 0000000000..fc5f7c8c58 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/OrderException.java @@ -0,0 +1,38 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.scopes; + +public class OrderException extends Exception { + + public OrderException() { + super(); + } + + public OrderException(String message) { + super(message); + } + + public OrderException(String message, Throwable cause) { + super(message, cause); + } + + public OrderException(Throwable cause) { + super(cause); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/OrderedDependentPojo.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/OrderedDependentPojo.java new file mode 100644 index 0000000000..f8fe2af7be --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/OrderedDependentPojo.java @@ -0,0 +1,34 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.scopes; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class OrderedDependentPojo extends OrderedInitPojo { + + private OrderedDependentPojo pojo; + + public OrderedDependentPojo getPojo() { + return pojo; + } + + public void setPojo(OrderedDependentPojo pojo) { + this.pojo = pojo; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/OrderedEagerInitPojo.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/OrderedEagerInitPojo.java new file mode 100644 index 0000000000..f9aeefccbe --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/OrderedEagerInitPojo.java @@ -0,0 +1,56 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.scopes; + +import org.osoa.sca.annotations.Destroy; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Scope; + +@Scope("MODULE") +public class OrderedEagerInitPojo { + + private static Object lock = new Object(); + private static int numberInstantied; + private int initOrder; + + @Init(eager = true) + public void init() { + synchronized (lock) { + ++numberInstantied; + initOrder = numberInstantied; + } + } + + @Destroy + public void destroy() throws OrderException { + synchronized (lock) { + if (initOrder != numberInstantied) { + throw new OrderException("Instance shutdown done out of order"); + } + --numberInstantied; + } + } + + public int getNumberInstantiated() { + return numberInstantied; + } + + public int getInitOrder() { + return initOrder; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/OrderedInitPojo.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/OrderedInitPojo.java new file mode 100644 index 0000000000..b4d4eb03ba --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/OrderedInitPojo.java @@ -0,0 +1,56 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.scopes; + +import org.osoa.sca.annotations.Destroy; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Scope; + +@Scope("MODULE") +public class OrderedInitPojo { + + private static Object lock = new Object(); + private static int numberInstantied; + private int initOrder; + + @Init + public void init() { + synchronized (lock) { + ++numberInstantied; + initOrder = numberInstantied; + } + } + + @Destroy + public void destroy() throws OrderException { + synchronized (lock) { + if (initOrder != numberInstantied) { + throw new OrderException("Instance shutdown done out of order"); + } + --numberInstantied; + } + } + + public int getNumberInstantiated() { + return numberInstantied; + } + + public int getInitOrder() { + return initOrder; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/RequestScopeLifecycleTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/RequestScopeLifecycleTestCase.java new file mode 100644 index 0000000000..bca1e57cbc --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/RequestScopeLifecycleTestCase.java @@ -0,0 +1,166 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.scopes; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.container.java.builder.JavaContextFactoryBuilder; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.RequestScopeDestroyOnlyComponent; +import org.apache.tuscany.container.java.mock.components.RequestScopeInitDestroyComponent; +import org.apache.tuscany.container.java.mock.components.RequestScopeInitOnlyComponent; +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.system.DefaultPolicyBuilderRegistry; +import org.apache.tuscany.core.config.ComponentTypeIntrospector; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.event.RequestEnd; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.RequestScopeContext; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; +import org.apache.tuscany.core.wire.service.DefaultWireFactoryService; +import org.apache.tuscany.core.wire.service.WireFactoryService; +import org.apache.tuscany.model.assembly.AtomicComponent; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Scope; + +/** + * Lifecycle unit tests for the Http session scope container + * + * @version $Rev$ $Date$ + */ +public class RequestScopeLifecycleTestCase extends TestCase { + + /** + * Tests instance identity is properly maintained + */ + public void testInitDestroy() throws Exception { + EventContext ctx = new EventContextImpl(); + RequestScopeContext scope = new RequestScopeContext(ctx); + scope.registerFactories(createComponents()); + scope.start(); + RequestScopeInitDestroyComponent initDestroy = (RequestScopeInitDestroyComponent) scope.getContext( + "TestServiceInitDestroy").getInstance(null); + Assert.assertNotNull(initDestroy); + RequestScopeInitOnlyComponent initOnly = (RequestScopeInitOnlyComponent) scope.getContext("TestServiceInitOnly") + .getInstance(null); + Assert.assertNotNull(initOnly); + RequestScopeDestroyOnlyComponent destroyOnly = (RequestScopeDestroyOnlyComponent) scope.getContext( + "TestServiceDestroyOnly").getInstance(null); + Assert.assertNotNull(destroyOnly); + + Assert.assertTrue(initDestroy.isInitialized()); + Assert.assertTrue(initOnly.isInitialized()); + Assert.assertFalse(initDestroy.isDestroyed()); + Assert.assertFalse(destroyOnly.isDestroyed()); + + // end request + scope.onEvent(new RequestEnd(this, new Object())); + Assert.assertTrue(initDestroy.isDestroyed()); + Assert.assertTrue(destroyOnly.isDestroyed()); + + scope.stop(); + } + + /** + * Test instances destroyed in proper (i.e. reverse) order + */ + public void testDestroyOrder() throws Exception { + EventContext ctx = new EventContextImpl(); + RequestScopeContext scope = new RequestScopeContext(ctx); + scope.registerFactories(createOrderedInitComponents()); + scope.start(); + // request start + RequestScopedOrderedInitPojo one = (RequestScopedOrderedInitPojo) scope.getContext("one").getInstance(null); + Assert.assertNotNull(one); + Assert.assertEquals(1, one.getNumberInstantiated()); + Assert.assertEquals(1, one.getInitOrder()); + + RequestScopedOrderedInitPojo two = (RequestScopedOrderedInitPojo) scope.getContext("two").getInstance(null); + Assert.assertNotNull(two); + Assert.assertEquals(2, two.getNumberInstantiated()); + Assert.assertEquals(2, two.getInitOrder()); + + RequestScopedOrderedInitPojo three = (RequestScopedOrderedInitPojo) scope.getContext("three").getInstance(null); + Assert.assertNotNull(three); + Assert.assertEquals(3, three.getNumberInstantiated()); + Assert.assertEquals(3, three.getInitOrder()); + + // end request + scope.onEvent(new RequestEnd(this, new Object())); + + Assert.assertEquals(0, one.getNumberInstantiated()); + scope.stop(); + } + + + JavaContextFactoryBuilder builder; + + private List<ContextFactory<Context>> createComponents() throws BuilderException, ConfigurationLoadException { + AtomicComponent[] ca = new AtomicComponent[3]; + ca[0] = MockFactory.createComponent("TestServiceInitDestroy", RequestScopeInitDestroyComponent.class, + Scope.REQUEST); + ca[1] = MockFactory.createComponent("TestServiceInitOnly", RequestScopeInitOnlyComponent.class, + Scope.REQUEST); + ca[2] = MockFactory.createComponent("TestServiceDestroyOnly", RequestScopeDestroyOnlyComponent.class, + Scope.REQUEST); + ComponentTypeIntrospector introspector = MockFactory.getIntrospector(); + ca[0].getImplementation().setComponentType(introspector.introspect(RequestScopeInitDestroyComponent.class)); + ca[1].getImplementation().setComponentType(introspector.introspect(RequestScopeInitOnlyComponent.class)); + ca[2].getImplementation().setComponentType(introspector.introspect(RequestScopeDestroyOnlyComponent.class)); + List<ContextFactory<Context>> configs = new ArrayList<ContextFactory<Context>>(); + for (AtomicComponent aCa : ca) { + builder.build(aCa); + configs.add((ContextFactory<Context>) aCa.getContextFactory()); + + } + return configs; + } + + private List<ContextFactory<Context>> createOrderedInitComponents() throws + BuilderException, ConfigurationLoadException { + AtomicComponent[] ca = new AtomicComponent[3]; + ca[0] = MockFactory.createComponent("one", RequestScopedOrderedInitPojo.class, Scope.REQUEST); + ca[1] = MockFactory.createComponent("two", RequestScopedOrderedInitPojo.class, Scope.REQUEST); + ca[2] = MockFactory.createComponent("three", RequestScopedOrderedInitPojo.class, Scope.REQUEST); + ComponentTypeIntrospector introspector = MockFactory.getIntrospector(); + ComponentType type = introspector.introspect(RequestScopedOrderedInitPojo.class); + ca[0].getImplementation().setComponentType(type); + ca[1].getImplementation().setComponentType(type); + ca[2].getImplementation().setComponentType(type); + List<ContextFactory<Context>> configs = new ArrayList<ContextFactory<Context>>(); + for (AtomicComponent aCa : ca) { + builder.build(aCa); + configs.add((ContextFactory<Context>) aCa.getContextFactory()); + + } + return configs; + } + + protected void setUp() throws Exception { + super.setUp(); + WireFactoryService wireService = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(), new DefaultPolicyBuilderRegistry()); + builder = new JavaContextFactoryBuilder(wireService); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/RequestScopedOrderedInitPojo.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/RequestScopedOrderedInitPojo.java new file mode 100644 index 0000000000..717c7008c9 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/RequestScopedOrderedInitPojo.java @@ -0,0 +1,56 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.scopes; + +import org.osoa.sca.annotations.Scope; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Destroy; + +@Scope("REQUEST") +public class RequestScopedOrderedInitPojo { + + private static Object lock = new Object(); + private static int numberInstantied; + private int initOrder; + + @Init + public void init() { + synchronized (RequestScopedOrderedInitPojo.lock) { + ++RequestScopedOrderedInitPojo.numberInstantied; + initOrder = RequestScopedOrderedInitPojo.numberInstantied; + } + } + + @Destroy + public void destroy() throws OrderException { + synchronized (RequestScopedOrderedInitPojo.lock) { + if (initOrder != RequestScopedOrderedInitPojo.numberInstantied) { + throw new OrderException("Instance shutdown done out of order"); + } + --RequestScopedOrderedInitPojo.numberInstantied; + } + } + + public int getNumberInstantiated() { + return RequestScopedOrderedInitPojo.numberInstantied; + } + + public int getInitOrder() { + return initOrder; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/SessionScopeLifecycleTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/SessionScopeLifecycleTestCase.java new file mode 100644 index 0000000000..80d8cb71cb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/SessionScopeLifecycleTestCase.java @@ -0,0 +1,176 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.scopes; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.container.java.builder.JavaContextFactoryBuilder; +import org.apache.tuscany.container.java.mock.MockFactory; +import org.apache.tuscany.container.java.mock.components.SessionScopeDestroyOnlyComponent; +import org.apache.tuscany.container.java.mock.components.SessionScopeInitDestroyComponent; +import org.apache.tuscany.container.java.mock.components.SessionScopeInitOnlyComponent; +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.system.DefaultPolicyBuilderRegistry; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.event.HttpSessionEnd; +import org.apache.tuscany.core.context.event.HttpSessionEvent; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.SessionScopeContext; +import org.apache.tuscany.core.wire.service.WireFactoryService; +import org.apache.tuscany.core.wire.service.DefaultWireFactoryService; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; +import org.apache.tuscany.core.config.ComponentTypeIntrospector; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.AtomicComponent; +import org.apache.tuscany.model.assembly.ComponentType; + +/** + * Lifecycle unit tests for the Http session scope container + * + * @version $Rev$ $Date$ + */ +public class SessionScopeLifecycleTestCase extends TestCase { + + /** + * Tests instance identity is properly maintained + */ + public void testInitDestroy() throws Exception { + EventContext ctx = new EventContextImpl(); + SessionScopeContext scope = new SessionScopeContext(ctx); + scope.registerFactories(createComponents()); + scope.start(); + Object session = new Object(); + // first request, no need to notify scope container since sessions are + // evaluated lazily + ctx.setIdentifier(HttpSessionEvent.HTTP_IDENTIFIER,session); + SessionScopeInitDestroyComponent initDestroy = (SessionScopeInitDestroyComponent) scope.getContext( + "TestServiceInitDestroy").getInstance(null); + Assert.assertNotNull(initDestroy); + SessionScopeInitOnlyComponent initOnly = (SessionScopeInitOnlyComponent) scope.getContext("TestServiceInitOnly") + .getInstance(null); + Assert.assertNotNull(initOnly); + SessionScopeDestroyOnlyComponent destroyOnly = (SessionScopeDestroyOnlyComponent) scope.getContext( + "TestServiceDestroyOnly").getInstance(null); + Assert.assertNotNull(destroyOnly); + + Assert.assertTrue(initDestroy.isInitialized()); + Assert.assertTrue(initOnly.isInitialized()); + Assert.assertFalse(initDestroy.isDestroyed()); + Assert.assertFalse(destroyOnly.isDestroyed()); + // end request + ctx.clearIdentifier(HttpSessionEvent.HTTP_IDENTIFIER); + // expire session + scope.onEvent(new HttpSessionEnd(this,session)); + Assert.assertTrue(initDestroy.isDestroyed()); + Assert.assertTrue(destroyOnly.isDestroyed()); + + scope.stop(); + } + + /** + * Test instances destroyed in proper (i.e. reverse) order + */ + public void testDestroyOrder() throws Exception { + EventContext ctx = new EventContextImpl(); + SessionScopeContext scope = new SessionScopeContext(ctx); + scope.registerFactories(createOrderedInitComponents()); + scope.start(); + Object session = new Object(); + // request start + ctx.setIdentifier(HttpSessionEvent.HTTP_IDENTIFIER,session); + + SessionScopedOrderedInitPojo one = (SessionScopedOrderedInitPojo) scope.getContext("one").getInstance(null); + Assert.assertNotNull(one); + Assert.assertEquals(1, one.getNumberInstantiated()); + Assert.assertEquals(1, one.getInitOrder()); + + SessionScopedOrderedInitPojo two = (SessionScopedOrderedInitPojo) scope.getContext("two").getInstance(null); + Assert.assertNotNull(two); + Assert.assertEquals(2, two.getNumberInstantiated()); + Assert.assertEquals(2, two.getInitOrder()); + + SessionScopedOrderedInitPojo three = (SessionScopedOrderedInitPojo) scope.getContext("three").getInstance(null); + Assert.assertNotNull(three); + Assert.assertEquals(3, three.getNumberInstantiated()); + Assert.assertEquals(3, three.getInitOrder()); + + // end request + ctx.clearIdentifier(HttpSessionEvent.HTTP_IDENTIFIER); + + // expire session + scope.onEvent(new HttpSessionEnd(this, session)); + Assert.assertEquals(0, one.getNumberInstantiated()); + scope.stop(); + } + + JavaContextFactoryBuilder builder; + + private List<ContextFactory<Context>> createComponents() throws BuilderException, ConfigurationLoadException { + AtomicComponent[] ca = new AtomicComponent[3]; + ca[0] = MockFactory.createComponent("TestServiceInitDestroy", SessionScopeInitDestroyComponent.class, + Scope.SESSION); + ca[1] = MockFactory.createComponent("TestServiceInitOnly", SessionScopeInitOnlyComponent.class, Scope.SESSION); + ca[2] = MockFactory.createComponent("TestServiceDestroyOnly", SessionScopeDestroyOnlyComponent.class, + Scope.SESSION); + ComponentTypeIntrospector introspector = MockFactory.getIntrospector(); + ca[0].getImplementation().setComponentType(introspector.introspect(SessionScopeInitDestroyComponent.class)); + ca[1].getImplementation().setComponentType(introspector.introspect(SessionScopeInitOnlyComponent.class)); + ca[2].getImplementation().setComponentType(introspector.introspect(SessionScopeDestroyOnlyComponent.class)); + List<ContextFactory<Context>> configs = new ArrayList<ContextFactory<Context>>(); + for (AtomicComponent aCa : ca) { + builder.build(aCa); + configs.add((ContextFactory<Context>) aCa.getContextFactory()); + + } + return configs; + } + + private List<ContextFactory<Context>> createOrderedInitComponents() throws + BuilderException, ConfigurationLoadException { + AtomicComponent[] ca = new AtomicComponent[3]; + ca[0] = MockFactory.createComponent("one", SessionScopedOrderedInitPojo.class, Scope.SESSION); + ca[1] = MockFactory.createComponent("two", SessionScopedOrderedInitPojo.class, Scope.SESSION); + ca[2] = MockFactory.createComponent("three", SessionScopedOrderedInitPojo.class, Scope.SESSION); + ComponentTypeIntrospector introspector = MockFactory.getIntrospector(); + ComponentType type = introspector.introspect(SessionScopedOrderedInitPojo.class); + ca[0].getImplementation().setComponentType(type); + ca[1].getImplementation().setComponentType(type); + ca[2].getImplementation().setComponentType(type); + List<ContextFactory<Context>> configs = new ArrayList<ContextFactory<Context>>(); + for (AtomicComponent aCa : ca) { + builder.build(aCa); + configs.add((ContextFactory<Context>) aCa.getContextFactory()); + + } + return configs; + } + + protected void setUp() throws Exception { + super.setUp(); + WireFactoryService wireService = new DefaultWireFactoryService(new MessageFactoryImpl(), new JDKWireFactoryFactory(),new DefaultPolicyBuilderRegistry()); + builder = new JavaContextFactoryBuilder(wireService); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/SessionScopedOrderedInitPojo.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/SessionScopedOrderedInitPojo.java new file mode 100644 index 0000000000..683247a5c8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/java/org/apache/tuscany/container/java/scopes/SessionScopedOrderedInitPojo.java @@ -0,0 +1,56 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.java.scopes; + +import org.osoa.sca.annotations.Scope; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Destroy; + +@Scope("SESSION") +public class SessionScopedOrderedInitPojo { + + private static Object lock = new Object(); + private static int numberInstantied; + private int initOrder; + + @Init + public void init() { + synchronized (SessionScopedOrderedInitPojo.lock) { + ++SessionScopedOrderedInitPojo.numberInstantied; + initOrder = SessionScopedOrderedInitPojo.numberInstantied; + } + } + + @Destroy + public void destroy() throws OrderException { + synchronized (SessionScopedOrderedInitPojo.lock) { + if (initOrder != SessionScopedOrderedInitPojo.numberInstantied) { + throw new OrderException("Instance shutdown done out of order"); + } + --SessionScopedOrderedInitPojo.numberInstantied; + } + } + + public int getNumberInstantiated() { + return SessionScopedOrderedInitPojo.numberInstantied; + } + + public int getInitOrder() { + return initOrder; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/resources/helloworld/example.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/resources/helloworld/example.wsdl new file mode 100644 index 0000000000..3a23e7b717 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/resources/helloworld/example.wsdl @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<wsdl:definitions targetNamespace="http://www.example.org" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" + name="example"> + + <wsdl:portType name="HelloWorld"> + </wsdl:portType> +</wsdl:definitions> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/resources/helloworld/sca.module b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/resources/helloworld/sca.module new file mode 100644 index 0000000000..d5bc2cd5f9 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/resources/helloworld/sca.module @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9" + name="Helloworld"> + + <component name="HelloWorld"> + <implementation.java class="org.apache.tuscany.container.java.integration.HelloWorldImpl"/> + </component> + +<!-- + <import.wsdl wsdlLocation="example.wsdl"/> + + <externalService name="external"> + <interface.wsdl interface="http://www.example.org#wsdl.interface(HelloWorld)"/> + </externalService> +--> + +</module> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/resources/helloworldmc/sca.module b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/resources/helloworldmc/sca.module new file mode 100644 index 0000000000..8c590976de --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/resources/helloworldmc/sca.module @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9" + name="HelloworldMC"> + + <component name="HelloWorld"> + <implementation.java class="org.apache.tuscany.container.java.integration.HelloWorldMCImpl"/> + <references> + <!-- <v:greetingProvider>GreetingProvider</v:greetingProvider>--> + </references> + <properties> + <v:bar>bar</v:bar> + <v:locale>en</v:locale> + </properties> + </component> + <wire> + <source.uri>HelloWorld/greetingProvider</source.uri> + <target.uri>GreetingProvider</target.uri> + </wire> + <component name="GreetingProvider"> + <implementation.java class="org.apache.tuscany.container.java.integration.GreetingProviderImpl"/> + <properties> + <v:greeting>Hello </v:greeting> + </properties> + </component> +</module> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/resources/org/apache/tuscany/container/java/assembly/tests/sca.module b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/resources/org/apache/tuscany/container/java/assembly/tests/sca.module new file mode 100644 index 0000000000..d0f0856225 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/resources/org/apache/tuscany/container/java/assembly/tests/sca.module @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+
+ name="tuscany.container.java.assembly.tests.bigbank.account">
+
+ <entryPoint name="AccountService">
+ <interface.java interface="org.apache.tuscany.container.java.assembly.tests.bigbank.account.services.account.AccountService"/>
+ <binding.ws port="http://www.bigbank.com/AccountService#wsdl.endpoint(AccountService/AccountServiceSOAP)"/>
+ <reference>AccountServiceComponent</reference>
+ </entryPoint>
+
+ <component name="AccountServiceComponent">
+ <implementation.java class="org.apache.tuscany.container.java.assembly.tests.bigbank.account.services.account.AccountServiceImpl"/>
+ <properties>
+ <v:currency overridable="may">EURO</v:currency>
+ </properties>
+ <references>
+ <v:accountDataService>AccountDataServiceComponent</v:accountDataService>
+ <v:stockQuoteService>StockQuoteService</v:stockQuoteService>
+ </references>
+ </component>
+
+ <component name="AccountDataServiceComponent">
+ <implementation.java class="org.apache.tuscany.container.java.assembly.tests.bigbank.account.services.accountdata.AccountDataServiceImpl"/>
+ </component>
+
+ <component name="StockQuoteService">
+ <implementation.java class="org.apache.tuscany.container.java.assembly.tests.bigbank.account.services.stockquote.StockQuoteServiceImpl"/>
+ </component>
+
+ <!--
+ <externalService name="StockQuoteService">
+ <interface.java interface="org.apache.tuscany.container.java.assembly.tests.bigbank.account.services.stockquote"/>
+ <binding.ws port="http://www.quickstockquote.com/StockQuoteService#wsdl.endpoint(StockQuote/StockQuoteServiceSOAP)"/>
+ </externalService>
+ -->
+
+</module>
+
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/resources/org/apache/tuscany/container/java/config/ModuleComponentLoaderTest1.module b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/resources/org/apache/tuscany/container/java/config/ModuleComponentLoaderTest1.module new file mode 100644 index 0000000000..46169aa304 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.java/src/test/resources/org/apache/tuscany/container/java/config/ModuleComponentLoaderTest1.module @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<module xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ name="ModuleComponentLoaderTest1">
+
+ <component name="HelloWorldServiceComponent">
+ <implementation.java class="org.apache.tuscany.container.java.assembly.mock.HelloWorldImpl"/>
+ </component>
+</module>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/LICENSE.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/README.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/README.txt new file mode 100644 index 0000000000..9b26d1690a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/README.txt @@ -0,0 +1,35 @@ +Apache Tuscany M1 build (May, 2006) +=================================== + +http://incubator.apache.org/tuscany/ + +Tuscany is an effort undergoing incubation at the Apache Software Foundation +(ASF), sponsored by the Web Services PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness or +stability of the code, it does indicate that the project has yet to be fully +endorsed by the ASF. + + +Support +------- + +Any problem with this release can be reported to the Tuscany mailing list +or in the JIRA issue tracker. + +Mailing list subscription: + tuscany-dev-subscribe@ws.apache.org + +Jira: + http://issues.apache.org/jira/browse/Tuscany + + +Thank you for using Tuscany! + + +The Tuscany Team. + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/pom.xml new file mode 100644 index 0000000000..3f8d8fe9cd --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/pom.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + --> +<project> + + <parent> + <groupId>org.apache.tuscany.sca.containers</groupId> + <artifactId>tuscany-sca-containers</artifactId> + <version>incubating-M1</version> + </parent> + + <modelVersion>4.0.0</modelVersion> + <artifactId>tuscany-container-rhino</artifactId> + <name>Tuscany Rhino JavaScript Container</name> + <description>Tuscany Rhino JavaScript Container</description> + <version>incubating-M1</version> + + <dependencies> + <dependency> + <groupId>org.apache.tuscany</groupId> + <artifactId>tuscany-core</artifactId> + <version>${pom.version}</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>rhino</groupId> + <artifactId>js</artifactId> + <version>1.6R2</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>org.apache.tuscany.databinding</groupId> + <artifactId>tuscany-databinding-sdo</artifactId> <!-- Reqd for E4X --> + <version>${pom.version}</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>xmlbeans</groupId> + <artifactId>xbean</artifactId> <!-- Reqd for E4X --> + <version>2.1.0</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>3.8.1</version> + <scope>test</scope> + </dependency> + </dependencies> + +</project> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/assembly/JavaScriptImplementation.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/assembly/JavaScriptImplementation.java new file mode 100644 index 0000000000..c68bf239a3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/assembly/JavaScriptImplementation.java @@ -0,0 +1,74 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.rhino.assembly; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.model.assembly.impl.AtomicImplementationImpl; + +import commonj.sdo.helper.TypeHelper; + +/** + * Default implementation of a JavScript component implementation type + * + * @version $Rev$ $Date$ + */ +public class JavaScriptImplementation extends AtomicImplementationImpl { + + private String scriptFile; + + private String script; + + private ResourceLoader resourceLoader; + + private TypeHelper typeHelper; + + public JavaScriptImplementation() { + super(); + } + + public void setResourceLoader(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } + + public ResourceLoader getResourceLoader() { + return resourceLoader; + } + + public TypeHelper getTypeHelper() { + return typeHelper; + } + + public void setTypeHelper(TypeHelper typeHelper) { + this.typeHelper = typeHelper; + } + + public String getScriptFile() { + return scriptFile; + } + + public void setScriptFile(String fn) { + scriptFile = fn; + } + + public String getScript() { + return script; + } + + public void setScript(String script) { + this.script = script; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/builder/JavaScriptContextFactoryBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/builder/JavaScriptContextFactoryBuilder.java new file mode 100644 index 0000000000..2012971014 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/builder/JavaScriptContextFactoryBuilder.java @@ -0,0 +1,132 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.rhino.builder; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.wsdl.Input; +import javax.wsdl.Message; +import javax.wsdl.Operation; +import javax.wsdl.Part; +import javax.wsdl.PortType; + +import org.apache.tuscany.container.rhino.assembly.JavaScriptImplementation; +import org.apache.tuscany.container.rhino.config.JavaScriptContextFactory; +import org.apache.tuscany.container.rhino.rhino.E4XDataBinding; +import org.apache.tuscany.container.rhino.rhino.RhinoE4XScript; +import org.apache.tuscany.container.rhino.rhino.RhinoScript; +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.extension.ContextFactoryBuilderSupport; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.ServiceContract; +import org.apache.tuscany.model.types.wsdl.WSDLServiceContract; + +import commonj.sdo.helper.TypeHelper; + +/** + * Builds {@link org.apache.tuscany.container.rhino.config.JavaScriptContextFactory}s from a JavaScript component type + * + * @version $Rev$ $Date$ + */ +@org.osoa.sca.annotations.Scope("MODULE") +public class JavaScriptContextFactoryBuilder extends ContextFactoryBuilderSupport<JavaScriptImplementation> { + + @Override + protected ContextFactory createContextFactory(String componentName, JavaScriptImplementation jsImplementation, Scope scope) { + + Map<String, Class> services = new HashMap<String, Class>(); + for (Service service : jsImplementation.getComponentType().getServices()) { + services.put(service.getName(), service.getServiceContract().getInterface()); + } + + Map<String, Object> defaultProperties = new HashMap<String, Object>(); + for (org.apache.tuscany.model.assembly.Property property : jsImplementation.getComponentType().getProperties()) { + defaultProperties.put(property.getName(), property.getDefaultValue()); + } + + String script = jsImplementation.getScript(); + ClassLoader cl = jsImplementation.getResourceLoader().getClassLoader(); + + RhinoScript invoker; + if (isE4XStyle(componentName, jsImplementation.getComponentType().getServices())) { + E4XDataBinding dataBinding = createDataBinding(jsImplementation); + invoker = new RhinoE4XScript(componentName, script, defaultProperties, cl, dataBinding); + } else { + invoker = new RhinoScript(componentName, script, defaultProperties, cl); + } + + Map<String, Object> properties = new HashMap<String, Object>(); + JavaScriptContextFactory contextFactory = new JavaScriptContextFactory(componentName, scope, services, properties, invoker); + + return contextFactory; + } + + /** + * Tests if this should be an E4X style service + * Its E4X if the JavaScript component uses WSDL to define its interface + */ + protected boolean isE4XStyle(String componentName, List<Service> services) { + Boolean isE4XStyle = null; + for (Service service : services) { + ServiceContract sc = service.getServiceContract(); + if (sc instanceof WSDLServiceContract) { + if (isE4XStyle != null && !isE4XStyle.booleanValue()) { + throw new BuilderConfigException("mixed service interface types not supportted"); + } + isE4XStyle = Boolean.TRUE; + } else { + isE4XStyle = Boolean.FALSE; + } + } + return isE4XStyle.booleanValue(); + } + + /** + * Create the data binding for the component initialized for each operation in the service + */ + protected E4XDataBinding createDataBinding(JavaScriptImplementation jsImplementation) { + ClassLoader classLoader = jsImplementation.getResourceLoader().getClassLoader(); + TypeHelper typeHelper = jsImplementation.getTypeHelper(); + E4XDataBinding dataBinding = new E4XDataBinding(classLoader, typeHelper); + for (Service service : jsImplementation.getComponentType().getServices()) { + ServiceContract sc = service.getServiceContract(); + if (sc instanceof WSDLServiceContract) { + PortType pt = ((WSDLServiceContract) sc).getPortType(); + for (Object o : pt.getOperations()) { + Operation operation = (Operation) o; + Input input = operation.getInput(); + if (input != null) { + Message message = input.getMessage(); + if (message != null) { + List parts = message.getOrderedParts(null); + if (parts != null && parts.size() > 0) { + Part part = (Part) parts.get(0); + dataBinding.addElementQName(operation.getName(), part.getElementName()); + } + } + } + } + } + } + return dataBinding; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/builder/JavaScriptTargetWireBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/builder/JavaScriptTargetWireBuilder.java new file mode 100644 index 0000000000..0c45aee35e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/builder/JavaScriptTargetWireBuilder.java @@ -0,0 +1,40 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.rhino.builder; + +import java.lang.reflect.Method; + +import org.apache.tuscany.container.rhino.config.JavaScriptContextFactory; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.extension.ComponentTargetInvoker; +import org.apache.tuscany.core.extension.WireBuilderSupport; +import org.apache.tuscany.core.wire.TargetInvoker; +import org.osoa.sca.annotations.Scope; + +/** + * Responsible for bridging source- and target-side invocations chains when the target type is a JavaScript implementation + * + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class JavaScriptTargetWireBuilder extends WireBuilderSupport<JavaScriptContextFactory> { + + protected TargetInvoker createInvoker(QualifiedName targetName, Method operation, ScopeContext context, boolean downScope) { + return new ComponentTargetInvoker(targetName, operation, context); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/config/JavaScriptContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/config/JavaScriptContextFactory.java new file mode 100644 index 0000000000..28a0302a4f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/config/JavaScriptContextFactory.java @@ -0,0 +1,114 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.rhino.config; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.tuscany.container.rhino.context.JavaScriptComponentContext; +import org.apache.tuscany.container.rhino.rhino.RhinoScript; +import org.apache.tuscany.core.builder.ContextCreationException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.model.assembly.Scope; + +/** + * Creates instance contexts for JavaScript component types + * + * @version $Rev$ $Date$ + */ +public class JavaScriptContextFactory implements ContextFactory<AtomicContext>, ContextResolver { + + private Scope scope; + + private String name; + + private Map<String, TargetWireFactory> targetProxyFactories = new HashMap<String, TargetWireFactory>(); + + private List<SourceWireFactory> sourceProxyFactories = new ArrayList<SourceWireFactory>(); + + private Map<String, Class> services; + + private Map<String, Object> properties; + + private RhinoScript invoker; + + private CompositeContext parentContext; + + public JavaScriptContextFactory(String name, Scope scope, Map<String, Class> services, Map<String, Object> properties, RhinoScript invoker) { + this.name = name; + this.scope = scope; + this.services = services; + this.properties = properties; + this.invoker = invoker; + } + + public AtomicContext createContext() throws ContextCreationException { + return new JavaScriptComponentContext(name, services, properties, sourceProxyFactories, targetProxyFactories, invoker.copy()); + } + + public Scope getScope() { + return scope; + } + + public String getName() { + return name; + } + + public void addProperty(String propertyName, Object value) { + properties.put(propertyName, value); + } + + public void addTargetWireFactory(String serviceName, TargetWireFactory factory) { + targetProxyFactories.put(serviceName, factory); + } + + public TargetWireFactory getTargetWireFactory(String serviceName) { + return targetProxyFactories.get(serviceName); + } + + public Map<String, TargetWireFactory> getTargetWireFactories() { + return targetProxyFactories; + } + + public void addSourceWireFactory(String referenceName, SourceWireFactory factory) { + sourceProxyFactories.add(factory); + } + + public void addSourceWireFactories(String referenceName, Class referenceInterface, List<SourceWireFactory> factories, boolean multiplicity) { + sourceProxyFactories.addAll(factories); + } + + public List<SourceWireFactory> getSourceWireFactories() { + return sourceProxyFactories; + } + + public void prepare(CompositeContext parent) { + parentContext = parent; + } + + public CompositeContext getCurrentContext() { + return parentContext; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/context/JavaScriptComponentContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/context/JavaScriptComponentContext.java new file mode 100644 index 0000000000..bfa4eeaffb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/context/JavaScriptComponentContext.java @@ -0,0 +1,140 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.rhino.context; + +import org.apache.tuscany.container.rhino.rhino.RhinoScript; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.CoreRuntimeException; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.context.event.InstanceCreated; +import org.apache.tuscany.core.context.impl.AbstractContext; +import org.apache.tuscany.core.wire.ProxyCreationException; +import org.apache.tuscany.core.wire.WireFactory; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.osoa.sca.ServiceRuntimeException; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class JavaScriptComponentContext extends AbstractContext implements AtomicContext { + + private Map<String, Class> services; + + private RhinoScript rhinoInvoker; + + private Map<String, Object> properties; + + private List<SourceWireFactory> sourceProxyFactories; + + private Map<String, TargetWireFactory> targetProxyFactories; + + private Object instance; + + public JavaScriptComponentContext(String name, Map<String, Class> services, Map<String, Object> properties, + List<SourceWireFactory> sourceProxyFactories, Map<String, TargetWireFactory> targetProxyFactories, RhinoScript invoker) { + super(name); + assert (services != null) : "No service interface mapping specified"; + assert (properties != null) : "No properties specified"; + this.services = services; + this.properties = properties; + this.rhinoInvoker = invoker; + this.sourceProxyFactories = sourceProxyFactories; + this.targetProxyFactories = targetProxyFactories; + } + + public Object getInstance(QualifiedName qName) throws TargetException { + return getInstance(qName, true); + } + + public void init() throws TargetException { + getInstance(null, false); + } + + public void destroy() throws TargetException { + + } + + private synchronized Object getInstance(QualifiedName qName, boolean notify) throws TargetException { + String portName = qName.getPortName(); + WireFactory targetFactory; + if (portName != null) { + targetFactory = targetProxyFactories.get(portName); + } else { + //FIXME The port name is null here, either locateService needs more information (the expected interface) to + // select the correct port, or we need to return a factory that matches the whole set of services exposed by + // the component. + targetFactory = targetProxyFactories.values().iterator().next(); + } + if (targetFactory == null) { + TargetException e = new TargetException("Target service not found"); + e.setIdentifier(qName.getPortName()); + e.addContextName(getName()); + throw e; + } + try { + Object proxy = targetFactory.createProxy(); //createProxy(new Class[] { iface }); + if (notify) { + publish(new InstanceCreated(this)); + } + return proxy; + } catch (ProxyCreationException e) { + TargetException te = new TargetException("Error returning target", e); + e.setIdentifier(qName.getPortName()); + e.addContextName(getName()); + throw te; + } + } + + public Object getTargetInstance() throws TargetException { + rhinoInvoker.updateScriptScope(createServiceReferences()); // create references + rhinoInvoker.updateScriptScope(properties); // create prop values + return rhinoInvoker; + } + + /** + * Creates a map containing any ServiceReferences + */ + private Map createServiceReferences() { + try { + Map<String, Object> context = new HashMap<String, Object>(); + for (SourceWireFactory proxyFactory : sourceProxyFactories) { + context.put(proxyFactory.getConfiguration().getReferenceName(), proxyFactory.createProxy()); + } + return context; + } catch (ProxyCreationException e) { + throw new ServiceRuntimeException(e); + } + } + + public boolean isEagerInit() { + return false; + } + + public boolean isDestroyable() { + return false; + } + + public void start() throws CoreRuntimeException { + } + + public void stop() throws CoreRuntimeException { + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/loader/JavaScriptImplementationLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/loader/JavaScriptImplementationLoader.java new file mode 100644 index 0000000000..e28776049c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/loader/JavaScriptImplementationLoader.java @@ -0,0 +1,168 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.container.rhino.loader; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.container.rhino.assembly.JavaScriptImplementation; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.InvalidRootElementException; +import org.apache.tuscany.core.config.MissingResourceException; +import org.apache.tuscany.core.config.SidefileLoadException; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.core.loader.StAXElementLoader; +import org.apache.tuscany.core.loader.StAXLoaderRegistry; +import org.apache.tuscany.core.loader.assembly.AssemblyConstants; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.model.assembly.ComponentType; +import org.osoa.sca.annotations.Destroy; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Scope; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class JavaScriptImplementationLoader implements StAXElementLoader<JavaScriptImplementation> { + + public static final QName IMPLEMENTATION_JS = new QName("http://org.apache.tuscany/xmlns/js/0.9", "implementation.js"); + + protected StAXLoaderRegistry registry; + + private XMLInputFactory xmlFactory; + + public JavaScriptImplementationLoader() { + // todo make this a reference to a system service + xmlFactory = XMLInputFactory.newInstance(); + } + + @Autowire + public void setRegistry(StAXLoaderRegistry registry) { + this.registry = registry; + } + + @Init(eager = true) + public void start() { + registry.registerLoader(IMPLEMENTATION_JS, this); + } + + @Destroy + public void stop() { + registry.unregisterLoader(IMPLEMENTATION_JS, this); + } + + public JavaScriptImplementation load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + String scriptFile = reader.getAttributeValue(null, "scriptFile"); + String script = loadScript(scriptFile, loaderContext.getResourceLoader()); + ComponentType componentType = loadComponentType(scriptFile, loaderContext); + + JavaScriptImplementation jsImpl = new JavaScriptImplementation(); + jsImpl.setComponentType(componentType); + jsImpl.setScriptFile(scriptFile); + jsImpl.setScript(script); + jsImpl.setResourceLoader(loaderContext.getResourceLoader()); + jsImpl.setTypeHelper(registry.getContext().getTypeHelper()); + return jsImpl; + } + + protected String loadScript(String scriptFile, ResourceLoader resourceLoader) throws ConfigurationLoadException { + URL url = resourceLoader.getResource(scriptFile); + if (url == null) { + throw new ConfigurationLoadException(scriptFile); + } + InputStream inputStream; + try { + inputStream = url.openStream(); + } catch (IOException e) { + throw new ConfigurationLoadException(scriptFile, e); + } + try { + StringBuilder sb = new StringBuilder(1024); + int n; + while ((n = inputStream.read()) != -1) { + sb.append((char) n); + } + return sb.toString(); + } catch (IOException e) { + throw new ConfigurationLoadException(scriptFile, e); + } finally { + try { + inputStream.close(); + } catch (IOException e) { + // ignore + } + } + } + + protected ComponentType loadComponentType(String scriptFile, LoaderContext loaderContext) throws SidefileLoadException, MissingResourceException{ + String sidefile = scriptFile.substring(0, scriptFile.lastIndexOf('.')) + ".componentType"; + URL componentTypeFile = loaderContext.getResourceLoader().getResource(sidefile); + if (componentTypeFile == null) { + throw new MissingResourceException(sidefile); + } + + try { + XMLStreamReader reader; + InputStream is; + is = componentTypeFile.openStream(); + try { + reader = xmlFactory.createXMLStreamReader(is); + try { + reader.nextTag(); + if (!AssemblyConstants.COMPONENT_TYPE.equals(reader.getName())) { + InvalidRootElementException e = new InvalidRootElementException(AssemblyConstants.COMPONENT_TYPE, reader.getName()); + e.setResourceURI(componentTypeFile.toString()); + throw e; + } + return (ComponentType) registry.load(reader, loaderContext); + } finally { + try { + reader.close(); + } catch (XMLStreamException e) { + // ignore + } + } + } finally { + try { + is.close(); + } catch (IOException e) { + // ignore + } + } + } catch (IOException e) { + SidefileLoadException sfe = new SidefileLoadException(e.getMessage()); + sfe.setResourceURI(componentTypeFile.toString()); + throw sfe; + } catch (XMLStreamException e) { + SidefileLoadException sfe = new SidefileLoadException(e.getMessage()); + sfe.setResourceURI(componentTypeFile.toString()); + throw sfe; + } catch (ConfigurationLoadException e) { + SidefileLoadException sfe = new SidefileLoadException(e.getMessage()); + sfe.setResourceURI(componentTypeFile.toString()); + throw sfe; + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/E4XDataBinding.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/E4XDataBinding.java new file mode 100644 index 0000000000..3969735b23 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/E4XDataBinding.java @@ -0,0 +1,108 @@ +/**
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.container.rhino.rhino;
+
+import java.io.ByteArrayInputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.core.wire.InvocationRuntimeException;
+import org.apache.tuscany.databinding.sdo.SDOXMLHelper;
+import org.apache.xmlbeans.XmlObject;
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Scriptable;
+
+import commonj.sdo.helper.TypeHelper;
+
+/**
+ * DataBinding to convert between Java objects and JavaScript E4X XML objects. This uses SDO to do the conversion between XML and Java so WSDL/XSDs
+ * need to have be registered with the SDO runtime.
+ *
+ * TODO: suport non-wrapped WSDL
+ */
+public class E4XDataBinding {
+
+ private ClassLoader classLoader;
+
+ private TypeHelper typeHelper;
+
+ private Map<String, QName> function2ElementMap;
+
+ private static final boolean IS_WRAPPED = true;
+
+ public E4XDataBinding(ClassLoader classLoader, TypeHelper typeHelper) {
+ this.classLoader = classLoader;
+ this.typeHelper = typeHelper;
+ this.function2ElementMap = new HashMap<String, QName>();
+ }
+
+ /**
+ * Convert E4X XML to Java objects
+ *
+ * @param e4xXML
+ * @return the array of Objects
+ */
+ public Object[] toObjects(Scriptable e4xXML) {
+ byte[] xmlBytes = e4xXML.toString().getBytes();
+ Object[] os = SDOXMLHelper.toObjects(classLoader, typeHelper, xmlBytes, IS_WRAPPED);
+ return os;
+ }
+
+ /**
+ * Convert request Java objects to XML
+ *
+ * @param functionName
+ * @param os
+ * @param scope
+ * @return a JavaScript E4X XML object
+ */
+ public Scriptable toE4X(String functionName, Object[] os, Scriptable scope) {
+ QName elementQN = function2ElementMap.get(functionName);
+ byte[] xmlBytes = SDOXMLHelper.toXMLBytes(classLoader, typeHelper, os, elementQN, IS_WRAPPED);
+
+ XmlObject xmlObject;
+ try {
+ xmlObject = XmlObject.Factory.parse(new ByteArrayInputStream(xmlBytes));
+ } catch (Exception e) {
+ throw new InvocationRuntimeException(e);
+ }
+
+ Context cx = Context.enter();
+ try {
+
+ Object xml = cx.getWrapFactory().wrap(cx, scope, xmlObject, XmlObject.class);
+ Scriptable jsXML = cx.newObject(scope, "XML", new Object[] { xml });
+
+ return jsXML;
+
+ } finally {
+ Context.exit();
+ }
+ }
+
+ /**
+ * Add the XML element name to use for an operation when converting from
+ * Java objects to XML.
+ *
+ * @param functionName
+ * @param elementQN
+ */
+ public void addElementQName(String functionName, QName elementQN) {
+ function2ElementMap.put(functionName, elementQN);
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoE4XScript.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoE4XScript.java new file mode 100644 index 0000000000..5f42f6d164 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoE4XScript.java @@ -0,0 +1,76 @@ +/**
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.container.rhino.rhino;
+
+import java.util.Map;
+
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.xml.XMLObject;
+
+/**
+ * Invokes a JavaScript/E4X function with argument and return values that may be E4X XML objects.
+ */
+public class RhinoE4XScript extends RhinoScript {
+
+ private E4XDataBinding dataBinding;
+
+ public RhinoE4XScript(String scriptName, String script, Map context, ClassLoader cl, E4XDataBinding dataBinding) {
+ super(scriptName, script, context, cl);
+ this.dataBinding = dataBinding;
+ }
+
+ protected RhinoE4XScript(String scriptName, String script, Scriptable scriptScope, E4XDataBinding dataBinding) {
+ super(scriptName, script, scriptScope);
+ this.dataBinding = dataBinding;
+ }
+
+ /**
+ * Turn args to JS objects and convert any OMElement to E4X XML
+ */
+ @Override
+ protected Object[] processArgs(String functionName, Object[] args, Scriptable scope) {
+ return new Object[] { dataBinding.toE4X(functionName, args, scope) };
+ }
+
+ /**
+ * Unwrap and convert response converting any E4X XML into Java objects
+ */
+ @Override
+ protected Object processResponse(String functionName, Object response, Class responseClass) {
+ if (response instanceof XMLObject) {
+ Object[] os = dataBinding.toObjects((XMLObject) response);
+ if (os == null || os.length < 1) {
+ return null;
+ } else {
+ return os[0];
+ }
+ } else {
+ return super.processResponse(functionName, response, responseClass);
+ }
+ }
+
+ @Override
+ protected Function getFunction(Scriptable scope, String functionName) {
+ return super.getFunction(scope, "process");
+ }
+
+ @Override
+ public RhinoE4XScript copy() {
+ return new RhinoE4XScript(scriptName, script, scriptScope, dataBinding);
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoScript.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoScript.java new file mode 100644 index 0000000000..5518159f69 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/java/org/apache/tuscany/container/rhino/rhino/RhinoScript.java @@ -0,0 +1,290 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.rhino.rhino; + +import java.util.Iterator; +import java.util.Map; + +import org.apache.tuscany.core.extension.ExternalServiceInvoker; +import org.mozilla.javascript.Context; +import org.mozilla.javascript.ContextFactory; +import org.mozilla.javascript.Function; +import org.mozilla.javascript.ImporterTopLevel; +import org.mozilla.javascript.Script; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.Wrapper; + +/** + * Represents, and is responsible for dispatching to, a JavaScript artifact in Rhino + */ +public class RhinoScript implements ExternalServiceInvoker { + + protected String scriptName; + + protected String script; + + protected Scriptable scriptScope; + + private Scriptable sharedScope; + + /* + * Enable dynamic scopes so a script can be used concurrently with a global shared scope and individual execution + * scopes. See http://www.mozilla.org/rhino/scopes.html TODO: need to review how ths fits in with Tuscany scopes + */ + private static class MyFactory extends ContextFactory { + protected boolean hasFeature(Context cx, int featureIndex) { + if (featureIndex == Context.FEATURE_DYNAMIC_SCOPE) { + return true; + } + return super.hasFeature(cx, featureIndex); + } + } + + static { + ContextFactory.initGlobal(new MyFactory()); + } + + /** + * Create a new RhinoInvoker. + * + * @param scriptName the name of the script. Can be anything, only used in messages to identify the script + * @param script the complete script + */ + public RhinoScript(String scriptName, String script) { + this(scriptName, script, (Map) null, null); + } + + /** + * Create a new RhinoInvoker. + * + * @param scriptName the name of the script. Can be anything, only used in messages to identify the script + * @param script the complete script + * @param context name-value pairs that are added in to the scope where the script is compiled. May be null. The + * value objects are made available to the script by using a variable with the name. + */ + public RhinoScript(String scriptName, String script, Map context, ClassLoader cl) { + this.scriptName = scriptName; + this.script = script; + initScriptScope(scriptName, script, context, cl); + initSharedScope(); + } + + /** + * Construct a RhinoInvoker from another RhinoInvoker object. This uses the original script scope so the script + * doesn't need to be recompiled. + */ + protected RhinoScript(String scriptName, String script, Scriptable scriptScope) { + this.scriptName = scriptName; + this.script = script; + this.scriptScope = scriptScope; + initSharedScope(); + } + + /** + * Invoke a script function + * + * @param functionName the name of the function to invoke. + * @param arg arguments to the function, may be a single object or an array of objects. + * @return the function return value. + */ + public Object invoke(String functionName, Object[] args) { + return invoke(functionName, args, null, null); + } + + /** + * Invoke a script function + * + * @param functionName the name of the function to invoke. + * @param arg arguments to the function, may be a single object or an array of objects. + * @param contexts a Map of name-value pairs which are added to the wire Scope to enable the script to access + * the values by using the variable in name. + * @return the function return value. + */ + public Object invoke(String functionName, Object[] args, Map contexts) { + return invoke(functionName, args, null, contexts); + } + + /** + * Invoke a script function + * + * @param functionName the name of the function to invoke. + * @param arg arguments to the function, may be a single object or an array of objects. + * @param responseClass the desired class of the response object. + * @param contexts a Map of name-value pairs which are added to the wire Scope to enable the script to access + * the values by using the variable in name. + * @return the function return value. + */ + public Object invoke(String functionName, Object[] args, Class responseClass, Map contexts) { + Context cx = Context.enter(); + try { + Function function = getFunction(scriptScope, functionName); + Scriptable invocationScope = getInvocationScope(cx, contexts); + Object[] jsArgs = processArgs(functionName, args, invocationScope); + Object jsResponse = function.call(cx, invocationScope, invocationScope, jsArgs); + Object response = processResponse(functionName, jsResponse, responseClass); + return response; + } finally { + Context.exit(); + } + } + + /** + * Turn args to JS objects and convert any OMElement to E4X XML + */ + protected Object[] processArgs(String functionName, Object[] arg, Scriptable scope) { + Object[] args; + if (arg == null) { + args = new Object[] { null }; + } else if (arg.getClass().isArray()) { + args = (Object[]) arg; + for (int i = 0; i < args.length; i++) { + args[i] = Context.toObject(args[i], scope); + } + } else { + args = new Object[] { Context.toObject(arg, scope) }; + } + return args; + } + + /** + * Unwrap and convert response + */ + protected Object processResponse(String functionName, Object response, Class responseClass) { + if (Context.getUndefinedValue().equals(response)) { + response = null; + } else if (response instanceof Wrapper) { + response = ((Wrapper) response).unwrap(); + } else { + if (responseClass != null) { + response = Context.jsToJava(response, responseClass); + } else { + response = Context.jsToJava(response, String.class); + } + } + return response; + } + + /** + * Create a Rhino scope and compile the script into it + */ + protected void initScriptScope(String fileName, String scriptCode, Map context, ClassLoader cl) { + Context cx = Context.enter(); + try { + + if (cl != null) { + cx.setApplicationClassLoader(cl); + } + this.scriptScope = new ImporterTopLevel( cx, true ); + Script compiledScript = cx.compileString(scriptCode, fileName, 1, null); + compiledScript.exec(cx, scriptScope); + addContexts(scriptScope, context); + + } finally { + Context.exit(); + } + } + + /** + * Initializes the shared scope + */ + protected void initSharedScope() { + Context cx = Context.enter(); + try { + + this.sharedScope = cx.newObject(scriptScope); + sharedScope.setPrototype(scriptScope); + sharedScope.setParentScope(null); + + } finally { + Context.exit(); + } + } + + /** + * Get a Rhino scope for the function wire. If the wire has no context objects then this will use the + * shared scope otherwise a new scope is created to hold the context objects. Any new variables the executing script + * might define will go in the sharedScope. This new scope is just to hold the wire specific context objects. + */ + protected Scriptable getInvocationScope(Context cx, Map contexts) { + + Scriptable scope; + if (contexts == null || contexts.size() == 0) { + scope = sharedScope; + } else { + scope = cx.newObject(sharedScope); + scope.setPrototype(sharedScope); + scope.setParentScope(null); + addContexts(scope, contexts); + } + + return scope; + } + + /** + * Add the context to the scope. This will make the objects available to a script by using the name it was added + * with. + */ + protected void addContexts(Scriptable scope, Map contexts) { + if (contexts != null) { + for (Iterator i = contexts.keySet().iterator(); i.hasNext();) { + String name = (String) i.next(); + Object value = contexts.get(name); + if (value != null) { + scope.put(name, scope, Context.toObject(value, scope)); + } + } + } + } + + /** + * Get the Rhino Function object for the named script function + */ + protected Function getFunction(Scriptable scope, String functionName) { + + Object handleObj = scope.get(functionName, scope); + + if (!(handleObj instanceof Function)) { + throw new RuntimeException("script function '" + functionName + "' is undefined or not a function in script " + + scriptName); + } + + return (Function) handleObj; + } + + /** + * Make a copy of this RhinoScript object. This shares the script scope to avoid the overhead of recompiling the + * script, and to allow any initialization done by the script to be shared. + */ + public RhinoScript copy() { + return new RhinoScript(scriptName, script, scriptScope); + } + + /** + * Update the scope where the script is complied with new context values + * + * @param properties + */ + public void updateScriptScope(Map context) { + Context.enter(); + try { + addContexts(scriptScope, context); + } finally { + Context.exit(); + } + } + +}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/resources/system.fragment b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/resources/system.fragment new file mode 100644 index 0000000000..840efd10bc --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/main/resources/system.fragment @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<moduleFragment xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:tuscany="http://org.apache.tuscany/xmlns/system/0.9"
+ name="org.apache.tuscany.container.rhino">
+
+ <component name="org.apache.tuscany.container.rhino.builder.JavaScriptContextFactoryBuilder">
+ <tuscany:implementation.system class="org.apache.tuscany.container.rhino.builder.JavaScriptContextFactoryBuilder"/>
+ </component>
+
+ <component name="org.apache.tuscany.container.rhino.builder.JavaScriptTargetWireBuilder">
+ <tuscany:implementation.system class="org.apache.tuscany.container.rhino.builder.JavaScriptTargetWireBuilder"/>
+ </component>
+
+ <component name="org.apache.tuscany.container.rhino.loader.JavaScriptImplementationLoader">
+ <tuscany:implementation.system class="org.apache.tuscany.container.rhino.loader.JavaScriptImplementationLoader"/>
+ </component>
+</moduleFragment>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/AbstractJavaScriptTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/AbstractJavaScriptTestCase.java new file mode 100644 index 0000000000..ee6b533ddf --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/AbstractJavaScriptTestCase.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.rhino.integration; + +import junit.framework.TestCase; + +import org.apache.tuscany.core.client.TuscanyRuntime; +import org.osoa.sca.CurrentModuleContext; +import org.osoa.sca.ModuleContext; + +/** + * Integration tests for JavaScript components + */ +public abstract class AbstractJavaScriptTestCase extends TestCase { + + protected TuscanyRuntime tuscany; + + protected ModuleContext moduleContext; + + @Override + protected void setUp() throws Exception { + super.setUp(); + + tuscany = new TuscanyRuntime("tests", null); + tuscany.start(); + moduleContext = CurrentModuleContext.getContext(); + + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + tuscany.stop(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/BasicTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/BasicTestCase.java new file mode 100644 index 0000000000..f66f2e1079 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/BasicTestCase.java @@ -0,0 +1,27 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.rhino.integration; + +/** + * Integration tests for JavaScript components + */ +public class BasicTestCase extends AbstractJavaScriptTestCase { + + public void testBasicInvocation() throws Exception { + HelloWorld helloworldService = (HelloWorld) moduleContext.locateService("HelloWorldComponent1"); + String response = helloworldService.getGreetings("petra"); + assertEquals("jsHello petra", response); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/E4XTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/E4XTestCase.java new file mode 100644 index 0000000000..d6060aea90 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/E4XTestCase.java @@ -0,0 +1,29 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.rhino.integration; + +/** + * Integration tests for JavaScript components and composite contexts + * + * @version $Rev$ $Date$ + */ +public class E4XTestCase extends AbstractJavaScriptTestCase { + + public void testE4X() throws Exception { + HelloWorld helloworldService = (HelloWorld) moduleContext.locateService("HelloWorldComponentE4X"); + String response = helloworldService.getGreetings("petra"); + assertEquals("e4xHello petra", response); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/HelloWorld.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/HelloWorld.java new file mode 100644 index 0000000000..3a90be0102 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/HelloWorld.java @@ -0,0 +1,26 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.container.rhino.integration;
+
+/**
+ * This is the business interface of the HelloWorld service component.
+ */
+public interface HelloWorld {
+
+ public String getGreetings(String name);
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/InitializationTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/InitializationTestCase.java new file mode 100644 index 0000000000..138d9a8452 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/InitializationTestCase.java @@ -0,0 +1,33 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.rhino.integration; + +/** + * Integration tests for JavaScript components + */ +public class InitializationTestCase extends AbstractJavaScriptTestCase { + + public void testInitialization() throws Exception { + HelloWorld helloworldService = (HelloWorld) moduleContext.locateService("HelloWorldComponent4"); + String response = helloworldService.getGreetings("petra"); + assertEquals("Bonjour petra", response); + } + + public void testImports1() throws Exception { + HelloWorld helloworldService = (HelloWorld) moduleContext.locateService("HelloWorldComponent5"); + String response = helloworldService.getGreetings("petra"); + assertEquals("Kia ora petra", response); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/PropertiesTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/PropertiesTestCase.java new file mode 100644 index 0000000000..7b14376dbe --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/PropertiesTestCase.java @@ -0,0 +1,33 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.rhino.integration; + +/** + * Integration tests for JavaScript components + */ +public class PropertiesTestCase extends AbstractJavaScriptTestCase { + + public void testDefaultProperty() throws Exception { + HelloWorld helloworldService = (HelloWorld) moduleContext.locateService("HelloWorldComponent2a"); + String response = helloworldService.getGreetings("petra"); + assertEquals("Hi petra", response); + } + + public void testOverrideProperty() throws Exception { + HelloWorld helloworldService = (HelloWorld) moduleContext.locateService("HelloWorldComponent2b"); + String response = helloworldService.getGreetings("petra"); + assertEquals("Guten Tag petra", response); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/Salutation.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/Salutation.java new file mode 100644 index 0000000000..42d46c16d1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/Salutation.java @@ -0,0 +1,25 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.container.rhino.integration;
+
+/**
+ */
+public interface Salutation {
+
+ public String getSalutation();
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/ServiceRefsTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/ServiceRefsTestCase.java new file mode 100644 index 0000000000..27993c2b99 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/ServiceRefsTestCase.java @@ -0,0 +1,27 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.container.rhino.integration; + +/** + * Integration tests for JavaScript components + */ +public class ServiceRefsTestCase extends AbstractJavaScriptTestCase { + + public void testServiceReference() throws Exception { + HelloWorld helloworldService = (HelloWorld) moduleContext.locateService("HelloWorldComponent3a"); + String response = helloworldService.getGreetings("petra"); + assertEquals("Guten Tag petra", response); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/TestMethods.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/TestMethods.java new file mode 100644 index 0000000000..327edd1cbb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/integration/TestMethods.java @@ -0,0 +1,30 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.container.rhino.integration;
+
+public class TestMethods {
+
+ private String salutation = "Kia ora";
+
+ public String getSalutation() {
+ return salutation;
+ }
+
+ public void getSalutation(String s) {
+ salutation = s;
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoE4XScriptTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoE4XScriptTestCase.java new file mode 100644 index 0000000000..714814f2cf --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoE4XScriptTestCase.java @@ -0,0 +1,89 @@ +/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed 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.container.rhino.rhino;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.sdo.helper.XSDHelperImpl;
+import org.apache.tuscany.sdo.util.SDOUtil;
+
+import commonj.sdo.helper.TypeHelper;
+import commonj.sdo.helper.XSDHelper;
+
+/**
+ * Tests for the RhinoE4XScript
+ */
+public class RhinoE4XScriptTestCase extends TestCase {
+
+ private static final String scriptName = "RhinoE4XScriptTestCase.js";
+
+ private String script;
+
+ private E4XDataBinding dataBinding;
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ this.script = readResource(scriptName);
+ TypeHelper th = SDOUtil.createTypeHelper();
+ XSDHelper xsdHelper = new XSDHelperImpl(th);
+ URL url = getClass().getResource("helloworld.wsdl");
+ xsdHelper.define(url.openStream(), null);
+
+ dataBinding = new E4XDataBinding(getClass().getClassLoader(),th);
+ dataBinding.addElementQName("getGreetings", new QName("http://helloworld.samples.tuscany.apache.org", "getGreetings"));
+ }
+
+ public void testSimpleInvocation() throws IOException {
+ RhinoE4XScript ri = new RhinoE4XScript(scriptName, script, null, null, dataBinding);
+ Object x = ri.invoke("getGreetings", new Object[] { "petra" }, null);
+ assertEquals(x, "hello petra");
+ }
+
+ /**
+ * Read a resource into a String
+ */
+ private String readResource(String name) {
+ try {
+ URL url = getClass().getResource(name);
+ if (url == null) {
+ throw new RuntimeException("resource not found: " + name);
+ }
+ InputStream inputStream = url.openStream();
+
+ StringBuffer resource = new StringBuffer();
+ int n = 0;
+
+ while ((n = inputStream.read()) != -1) {
+ resource.append((char) n);
+ }
+
+ inputStream.close();
+
+ String s = resource.toString();
+ return s;
+
+ } catch (IOException e) {
+ throw new RuntimeException("IOException reading resource " + name, e);
+ }
+ }
+
+}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoScriptTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoScriptTestCase.java new file mode 100644 index 0000000000..19c0d9bcf6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/java/org/apache/tuscany/container/rhino/rhino/RhinoScriptTestCase.java @@ -0,0 +1,186 @@ +/* + * Copyright 2004,2005 The Apache Software Foundation. + * + * Licensed 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.container.rhino.rhino; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import junit.framework.TestCase; + +import org.apache.tuscany.container.rhino.rhino.RhinoScript; +import org.mozilla.javascript.EcmaError; + +/** + * Tests for the RhinoScript + */ +public class RhinoScriptTestCase extends TestCase { + + private static final String scriptName = "RhinoScriptTestCase.js"; + + private String script; + + protected void setUp() throws Exception { + super.setUp(); + this.script = readResource(scriptName); + } + + public void testSimpleInvocation() { + RhinoScript ri = new RhinoScript(scriptName, script); + Object x = ri.invoke("echo", new Object[] { "petra" }, null); + assertEquals("petra", x); + } + + public void testCopy() { + RhinoScript ri = new RhinoScript(scriptName, script); + Object x = ri.invoke("echo", new Object[] { "petra" }, null); + assertEquals("petra", x); + + ri = ri.copy(); + x = ri.invoke("echo", new Object[] { "sue" }, null); + assertEquals("sue", x); + + } + + public void testContexts1() { + RhinoScript ri = new RhinoScript(scriptName, script); + Map<String, Object> contexts = new HashMap<String, Object>(); + contexts.put("a", "petra"); + Object x = ri.invoke("getA", null, contexts); + assertEquals("petra", x); + } + + /** + * Tests context not accessable across invocations + */ + public void testContexts2() { + RhinoScript ri = new RhinoScript(scriptName, script); + Map<String, Object> contexts = new HashMap<String, Object>(); + contexts.put("a", "petra"); + Object x = ri.invoke("getA", null, contexts); + assertEquals("petra", x); + + try { + x = ri.invoke("getA", null, null); + assertTrue("expected ReferenceError", false); + } catch (EcmaError e) { + assertEquals("ReferenceError", e.getName()); + } + } + + /** + * Tests shared scope is accessable across invocations + */ + public void testScopes1() { + RhinoScript ri = new RhinoScript(scriptName, script); + ri.invoke("setGlobalVarY", new Object[] { "petra" }, null); + + Object x = ri.invoke("getGlobalVarY", null, null); + assertEquals("petra", x); + } + + /** + * Tests local vars are NOT accessable across invocations + */ + public void testScopes2() { + RhinoScript ri = new RhinoScript(scriptName, script); + ri.invoke("setLocalVarY", new Object[] { "petra" }, null); + + try { + ri.invoke("getGlobalVarY", null, null); + assertTrue("expected ReferenceError", false); + } catch (EcmaError e) { + assertEquals("ReferenceError", e.getName()); + } + } + + /** + * Tests shared scope is accessable when using contexts (ie an wire scope) + */ + public void testScopes3() { + RhinoScript ri = new RhinoScript(scriptName, script); + ri.invoke("setGlobalVarY", new Object[] { "petra" }, null); + + Map<String, Object> contexts = new HashMap<String, Object>(); + contexts.put("a", "sue"); + Object x = ri.invoke("getGlobalVarY", null, contexts); + assertEquals("petra", x); + + x = ri.invoke("getA", null, contexts); + assertEquals("sue", x); + + } + + /** + * Tests a copy only retains the script scope not the shared scope + */ + public void testScopes4() { + RhinoScript ri = new RhinoScript(scriptName, script); + ri.invoke("setGlobalVarY", new Object[] { "petra" }, null); + + ri = ri.copy(); + try { + ri.invoke("getGlobalVarY", null, null); + assertTrue("expected ReferenceError", false); + } catch (EcmaError e) { + assertEquals("ReferenceError", e.getName()); + } + try { + ri.invoke("getA", null, null); + assertTrue("expected ReferenceError", false); + } catch (EcmaError e) { + assertEquals("ReferenceError", e.getName()); + } + + } + + public void testGetInt() { + RhinoScript ri = new RhinoScript(scriptName, script); + Object x = ri.invoke("getInt", null, Integer.TYPE, null); + assertEquals(Integer.class, x.getClass()); + } + + /** + * Read a resource into a String + */ + private String readResource(String name) { + try { + URL url = getClass().getResource(name); + if (url == null) { + throw new RuntimeException("resource not found: " + name); + } + InputStream inputStream = url.openStream(); + + StringBuffer resource = new StringBuffer(); + int n = 0; + + while ((n = inputStream.read()) != -1) { + resource.append((char) n); + } + + inputStream.close(); + + String s = resource.toString(); + return s; + + } catch (IOException e) { + throw new RuntimeException("IOException reading resource " + name, e); + } + } + +}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/RhinoE4XScriptTestCase.js b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/RhinoE4XScriptTestCase.js new file mode 100644 index 0000000000..20dc2245f9 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/RhinoE4XScriptTestCase.js @@ -0,0 +1,11 @@ + +function process(inXML) { + + var greeting = "hello " + inXML..*::in0; + var outXML = + <helloworldaxis:getGreetingsResponse xmlns:helloworldaxis="http://helloworld.samples.tuscany.apache.org"> + <helloworldaxis:getGreetingsReturn>{ greeting }</helloworldaxis:getGreetingsReturn> + </helloworldaxis:getGreetingsResponse>; + + return outXML; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/RhinoScriptTestCase.js b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/RhinoScriptTestCase.js new file mode 100644 index 0000000000..2de740d5f8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/RhinoScriptTestCase.js @@ -0,0 +1,22 @@ + +function echo(x) { + return x; +} + +function getA(x) { + return a; +} + +function setGlobalVarY(x) { + y = x; +} +function setLocalVarY(x) { + var y = x; +} +function getGlobalVarY(x) { + return y; +} + +function getInt(x) { + return 42; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/helloworld.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/helloworld.wsdl new file mode 100644 index 0000000000..a402cc4d7c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/org/apache/tuscany/container/rhino/rhino/helloworld.wsdl @@ -0,0 +1,97 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<wsdl:definitions targetNamespace="http://helloworld.samples.tuscany.apache.org" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://helloworld.samples.tuscany.apache.org" xmlns:intf="http://helloworld.samples.tuscany.apache.org" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="helloworld">
+ <!--WSDL created by Apache Axis version: 1.2.1
+Built on Jun 14, 2005 (09:15:57 EDT)-->
+ <wsdl:types>
+ <schema elementFormDefault="qualified" targetNamespace="http://helloworld.samples.tuscany.apache.org" xmlns="http://www.w3.org/2001/XMLSchema">
+ <element name="getGreetings">
+ <complexType>
+ <sequence>
+ <element name="in0" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="getGreetingsResponse">
+ <complexType>
+ <sequence>
+ <element name="getGreetingsReturn" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ </element>
+ </schema>
+ </wsdl:types>
+
+ <wsdl:message name="getGreetingsRequest">
+
+ <wsdl:part element="impl:getGreetings" name="parameters"/>
+
+ </wsdl:message>
+
+ <wsdl:message name="getGreetingsResponse">
+
+ <wsdl:part element="impl:getGreetingsResponse" name="parameters"/>
+
+ </wsdl:message>
+
+ <wsdl:portType name="HelloWorldServiceImpl">
+
+ <wsdl:operation name="getGreetings">
+
+ <wsdl:input message="impl:getGreetingsRequest" name="getGreetingsRequest"/>
+
+ <wsdl:output message="impl:getGreetingsResponse" name="getGreetingsResponse"/>
+
+ </wsdl:operation>
+
+ </wsdl:portType>
+
+ <wsdl:binding name="helloworldSoapBinding" type="impl:HelloWorldServiceImpl">
+
+ <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+
+ <wsdl:operation name="getGreetings">
+
+ <wsdlsoap:operation soapAction=""/>
+
+ <wsdl:input name="getGreetingsRequest">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:input>
+
+ <wsdl:output name="getGreetingsResponse">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:output>
+
+ </wsdl:operation>
+
+ </wsdl:binding>
+
+ <wsdl:service name="HelloWorldServiceImplService">
+
+ <wsdl:port binding="impl:helloworldSoapBinding" name="helloworld">
+
+ <wsdlsoap:address location="http://localhost:8080/sample-helloworldws/services/HelloWorldService"/>
+
+ </wsdl:port>
+
+ </wsdl:service>
+
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/sca.module b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/sca.module new file mode 100644 index 0000000000..f78a41381a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/sca.module @@ -0,0 +1,66 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9" + xmlns:js="http://org.apache.tuscany/xmlns/js/0.9" + + name="JavaScriptTests"> + + <component name="HelloWorldComponent1"> + <js:implementation.js scriptFile="tests/HelloWorldImpl1.js"/> + </component> + + <component name="HelloWorldComponent2a"> + <js:implementation.js scriptFile="tests/HelloWorldImpl2.js"/> + </component> + + <component name="HelloWorldComponent2b"> + <js:implementation.js scriptFile="tests/HelloWorldImpl2.js"/> + <properties> + <v:salutation>Guten Tag</v:salutation> + </properties> + </component> + + <component name="HelloWorldComponent3a"> + <js:implementation.js scriptFile="tests/HelloWorldImpl3a.js"/> + <references> + <v:SalutationService>SalutationComponent3b</v:SalutationService> + </references> + </component> + + <component name="SalutationComponent3b"> + <js:implementation.js scriptFile="tests/SalutationImpl.js"/> + <properties> + <v:GREETING>Guten Tag</v:GREETING> + </properties> + </component> + + <component name="HelloWorldComponent4"> + <js:implementation.js scriptFile="tests/HelloWorldImpl4.js"/> + </component> + + <component name="HelloWorldComponent5"> + <js:implementation.js scriptFile="tests/HelloWorldImpl5.js"/> + </component> + + <import.sdo wsdlLocation="wsdl/helloworld.wsdl"/> + <import.wsdl wsdlLocation="wsdl/helloworld.wsdl"/> + + <component name="HelloWorldComponentE4X"> + <js:implementation.js scriptFile="tests/e4x.js"/> + </component> + +</module> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl1.componentType b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl1.componentType new file mode 100644 index 0000000000..90b6c09015 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl1.componentType @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="ASCII"?> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <service name="HelloWorldService"> + <interface.java interface="org.apache.tuscany.container.rhino.integration.HelloWorld"/> + </service> + +</componentType>
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl1.js b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl1.js new file mode 100644 index 0000000000..b3104f78a5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl1.js @@ -0,0 +1,20 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + +function getGreetings(name) { + return "jsHello " + name; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl2.componentType b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl2.componentType new file mode 100644 index 0000000000..33208811bf --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl2.componentType @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="ASCII"?> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <service name="HelloWorldService"> + <interface.java interface="org.apache.tuscany.container.rhino.integration.HelloWorld"/> + </service> + + <property name="salutation" type="xsd:string" default="Hi"/> + +</componentType>
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl2.js b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl2.js new file mode 100644 index 0000000000..4f91dba40e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl2.js @@ -0,0 +1,20 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + +function getGreetings(name) { + return salutation + " " + name; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl3a.componentType b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl3a.componentType new file mode 100644 index 0000000000..1bc6922e6d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl3a.componentType @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="ASCII"?> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <service name="HelloWorldService"> + <interface.java interface="org.apache.tuscany.container.rhino.integration.HelloWorld"/> + </service> + + <reference name="SalutationService"> + <interface.java interface="org.apache.tuscany.container.rhino.integration.Salutation"/> + </reference> + +</componentType>
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl3a.js b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl3a.js new file mode 100644 index 0000000000..f3160f6f65 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl3a.js @@ -0,0 +1,20 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + +function getGreetings(name) { + return SalutationService.getSalutation() + " " + name; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl4.componentType b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl4.componentType new file mode 100644 index 0000000000..90b6c09015 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl4.componentType @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="ASCII"?> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <service name="HelloWorldService"> + <interface.java interface="org.apache.tuscany.container.rhino.integration.HelloWorld"/> + </service> + +</componentType>
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl4.js b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl4.js new file mode 100644 index 0000000000..338c3ac3cd --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl4.js @@ -0,0 +1,26 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + +initSalutation(); + +function getGreetings(name) { + return SALUTATION + name; +} + +function initSalutation() { + SALUTATION = "Bonjour "; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl5.componentType b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl5.componentType new file mode 100644 index 0000000000..90b6c09015 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl5.componentType @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="ASCII"?> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <service name="HelloWorldService"> + <interface.java interface="org.apache.tuscany.container.rhino.integration.HelloWorld"/> + </service> + +</componentType>
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl5.js b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl5.js new file mode 100644 index 0000000000..f01cd1727f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/HelloWorldImpl5.js @@ -0,0 +1,29 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + +//importPackage(Packages.sample.utils); +importClass(Packages.org.apache.tuscany.container.rhino.integration.TestMethods); + +initSalutation(); + +function getGreetings(name) { + return SALUTATION.getSalutation() + " " + name; +} + +function initSalutation() { + SALUTATION = new TestMethods(); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/SalutationImpl.componentType b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/SalutationImpl.componentType new file mode 100644 index 0000000000..1c819bff32 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/SalutationImpl.componentType @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="ASCII"?> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <service name="SalutationService"> + <interface.java interface="org.apache.tuscany.container.rhino.integration.Salutation"/> + </service> + + <property name="GREETING" type="xsd:string" default="Hi"/> + +</componentType>
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/SalutationImpl.js b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/SalutationImpl.js new file mode 100644 index 0000000000..2116e40ae3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/SalutationImpl.js @@ -0,0 +1,20 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + +function getSalutation() { + return GREETING; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/e4x.componentType b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/e4x.componentType new file mode 100644 index 0000000000..6bf89d2ef8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/e4x.componentType @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="ASCII"?> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <service name="HelloWorldService"> + <interface.wsdl interface="http://integration.rhino.container.tuscany.apache.org#HelloWorld"/> + </service> + +</componentType>
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/e4x.js b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/e4x.js new file mode 100644 index 0000000000..7fe882df55 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/tests/e4x.js @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + +function process(xmlIn) { + + var greeting = "e4xHello " + xmlIn..*::in0; + + var xmlOut = + <helloworld:getGreetingsResponse xmlns:helloworld="http://integration.rhino.container.tuscany.apache.org"> + <helloworld:getGreetingsReturn> { greeting } </helloworld:getGreetingsReturn> + </helloworld:getGreetingsResponse>; + + return xmlOut; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/wsdl/helloworld.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/wsdl/helloworld.wsdl new file mode 100644 index 0000000000..7bcb48dcf2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/container.rhino/src/test/resources/wsdl/helloworld.wsdl @@ -0,0 +1,97 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<wsdl:definitions targetNamespace="http://integration.rhino.container.tuscany.apache.org" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://integration.rhino.container.tuscany.apache.org" xmlns:intf="http://helloworld.samples.tuscany.apache.org" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="helloworld">
+ <!--WSDL created by Apache Axis version: 1.2.1
+Built on Jun 14, 2005 (09:15:57 EDT)-->
+ <wsdl:types>
+ <schema elementFormDefault="qualified" targetNamespace="http://integration.rhino.container.tuscany.apache.org" xmlns="http://www.w3.org/2001/XMLSchema">
+ <element name="getGreetings">
+ <complexType>
+ <sequence>
+ <element name="in0" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="getGreetingsResponse">
+ <complexType>
+ <sequence>
+ <element name="getGreetingsReturn" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ </element>
+ </schema>
+ </wsdl:types>
+
+ <wsdl:message name="getGreetingsRequest">
+
+ <wsdl:part element="impl:getGreetings" name="parameters"/>
+
+ </wsdl:message>
+
+ <wsdl:message name="getGreetingsResponse">
+
+ <wsdl:part element="impl:getGreetingsResponse" name="parameters"/>
+
+ </wsdl:message>
+
+ <wsdl:portType name="HelloWorld">
+
+ <wsdl:operation name="getGreetings">
+
+ <wsdl:input message="impl:getGreetingsRequest" name="getGreetingsRequest"/>
+
+ <wsdl:output message="impl:getGreetingsResponse" name="getGreetingsResponse"/>
+
+ </wsdl:operation>
+
+ </wsdl:portType>
+
+ <wsdl:binding name="helloworldSoapBinding" type="impl:HelloWorld">
+
+ <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+
+ <wsdl:operation name="getGreetings">
+
+ <wsdlsoap:operation soapAction=""/>
+
+ <wsdl:input name="getGreetingsRequest">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:input>
+
+ <wsdl:output name="getGreetingsResponse">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:output>
+
+ </wsdl:operation>
+
+ </wsdl:binding>
+
+ <wsdl:service name="HelloWorldServiceImplService">
+
+ <wsdl:port binding="impl:helloworldSoapBinding" name="helloworld">
+
+ <wsdlsoap:address location="http://localhost:8080/helloworldws/services/HelloWorldService"/>
+
+ </wsdl:port>
+
+ </wsdl:service>
+
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/pom.xml new file mode 100644 index 0000000000..e3a992c3a3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/containers/pom.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.
+ -->
+<project>
+
+ <parent>
+ <groupId>org.apache.tuscany</groupId>
+ <artifactId>tuscany-sca</artifactId>
+ <version>incubating-M1</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.apache.tuscany.sca.containers</groupId>
+ <artifactId>tuscany-sca-containers</artifactId>
+ <packaging>pom</packaging>
+ <name>Tuscany SCA Containers</name>
+ <version>incubating-M1</version>
+
+ <modules>
+ <module>container.java</module>
+ <module>container.rhino</module>
+ </modules>
+
+</project>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/LICENSE.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/README.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/README.txt new file mode 100644 index 0000000000..9b26d1690a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/README.txt @@ -0,0 +1,35 @@ +Apache Tuscany M1 build (May, 2006) +=================================== + +http://incubator.apache.org/tuscany/ + +Tuscany is an effort undergoing incubation at the Apache Software Foundation +(ASF), sponsored by the Web Services PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness or +stability of the code, it does indicate that the project has yet to be fully +endorsed by the ASF. + + +Support +------- + +Any problem with this release can be reported to the Tuscany mailing list +or in the JIRA issue tracker. + +Mailing list subscription: + tuscany-dev-subscribe@ws.apache.org + +Jira: + http://issues.apache.org/jira/browse/Tuscany + + +Thank you for using Tuscany! + + +The Tuscany Team. + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/pom.xml new file mode 100644 index 0000000000..b5e934d45e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/pom.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + --> +<project> + <parent> + <groupId>org.apache.tuscany</groupId> + <artifactId>tuscany-sca</artifactId> + <version>incubating-M1</version> + </parent> + <modelVersion>4.0.0</modelVersion> + <artifactId>tuscany-core</artifactId> + <name>Tuscany Core</name> + <description>Core Tuscany runtime.</description> + <version>incubating-M1</version> + + <dependencies> + <dependency> + <groupId>org.apache.tuscany</groupId> + <artifactId>tuscany-model</artifactId> + <version>${pom.version}</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>stax</groupId> + <artifactId>stax-api</artifactId> + <version>1.0</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>woodstox</groupId> + <artifactId>wstx-asl</artifactId> + <version>2.9.3</version> + <scope>runtime</scope> + </dependency> + + <dependency> + <groupId>tomcat</groupId> + <artifactId>servlet-api</artifactId> + <version>5.0.18</version> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>org.apache.geronimo.specs</groupId> + <artifactId>geronimo-j2ee-connector_1.5_spec</artifactId> + <version>1.0</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>org.apache.geronimo</groupId> + <artifactId>geronimo-connector</artifactId> + <version>1.0</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.apache.geronimo</groupId> + <artifactId>geronimo-transaction</artifactId> + <version>1.0</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>org.apache.geronimo.specs</groupId> + <artifactId>geronimo-jta_1.0.1B_spec</artifactId> + <version>1.0</version> + <scope>runtime</scope> + </dependency> + + <dependency> + <groupId>concurrent</groupId> + <artifactId>concurrent</artifactId> + <version>1.3.4</version> + <scope>runtime</scope> + </dependency> + + <dependency> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + <version>1.0.4</version> + <scope>runtime</scope> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>3.8.1</version> + <scope>test</scope> + </dependency> + </dependencies> + +</project> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/async/builder/AsyncPolicyBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/async/builder/AsyncPolicyBuilder.java new file mode 100644 index 0000000000..6acebdaa8e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/async/builder/AsyncPolicyBuilder.java @@ -0,0 +1,86 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.async.builder; + +import java.util.List; + +import javax.resource.spi.work.WorkManager; + +import org.apache.tuscany.core.async.invocation.AsyncInterceptor; +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.SourcePolicyBuilder; +import org.apache.tuscany.core.builder.TargetPolicyBuilder; +import org.apache.tuscany.core.builder.system.PolicyBuilderRegistry; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.wire.TargetInvocationConfiguration; +import org.apache.tuscany.core.wire.WireSourceConfiguration; +import org.apache.tuscany.core.wire.WireTargetConfiguration; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.OneWay; + +/** + * Builds context factories for component implementations that map to {@link org.apache.tuscany.container.java.assembly.JavaImplementation}. + * The logical model is then decorated with the runtime configuration. + * + * @version $Rev: 368822 $ $Date: 2006-01-13 10:54:38 -0800 (Fri, 13 Jan 2006) $ + * @see org.apache.tuscany.core.builder.ContextFactory + */ +@org.osoa.sca.annotations.Scope("MODULE") +public class AsyncPolicyBuilder implements SourcePolicyBuilder, TargetPolicyBuilder { + + private PolicyBuilderRegistry builderRegistry; + private WorkManager workManager; + private MessageFactory messageFactory; + + public AsyncPolicyBuilder() { + } + + @Init(eager = true) + public void init() { + builderRegistry.registerSourceBuilder(this); + builderRegistry.registerTargetBuilder(this); + } + + @Autowire + public void setBuilderRegistry(PolicyBuilderRegistry builderRegistry) { + this.builderRegistry = builderRegistry; + } + + @Autowire + public void setWorkManager(WorkManager workManager) { + this.workManager = workManager; + } + + @Autowire + public void setMessageFactory(MessageFactory messageFactory) { + this.messageFactory = messageFactory; + } + + public void build(ConfiguredReference arg0, List<WireSourceConfiguration> arg1) throws BuilderException { + } + + public void build(ConfiguredService service, WireTargetConfiguration wireTargetConfiguration) throws BuilderException { + for (TargetInvocationConfiguration configuration : wireTargetConfiguration.getInvocationConfigurations().values()) { + if (configuration.getMethod().getAnnotation(OneWay.class)!=null) { + configuration.addInterceptor(new AsyncInterceptor(workManager, messageFactory)); + } + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/async/invocation/AsyncInterceptor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/async/invocation/AsyncInterceptor.java new file mode 100644 index 0000000000..08a718bd73 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/async/invocation/AsyncInterceptor.java @@ -0,0 +1,108 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.async.invocation; + +import javax.resource.spi.work.Work; +import javax.resource.spi.work.WorkException; +import javax.resource.spi.work.WorkManager; + +import org.apache.tuscany.core.message.Message; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.wire.Interceptor; +import org.osoa.sca.CurrentModuleContext; +import org.osoa.sca.ModuleContext; +import org.osoa.sca.SCA; +import org.osoa.sca.ServiceRuntimeException; + +/** + * A wire interceptor that uses a WorkManager to schedule asynchronous execution of invocations in Work instances. + */ +public class AsyncInterceptor implements Interceptor { + + private static final ContextBinder BINDER = new ContextBinder(); + + private WorkManager workManager; + private MessageFactory messageFactory; + private Interceptor next; + + /** + * Constructs a new instance + * @param workManager + */ + public AsyncInterceptor(WorkManager workManager, MessageFactory messageFactory) { + this.workManager=workManager; + this.messageFactory=messageFactory; + } + + public Message invoke(final Message message) { + + final ModuleContext currentModuleContext=CurrentModuleContext.getContext(); + + // Schedule the invocation of the next interceptor in a new Work instance + try { + workManager.scheduleWork(new Work() { + + public void run() { + ModuleContext oldModuleContext=CurrentModuleContext.getContext(); + try { + BINDER.setContext(currentModuleContext); + + // Invoke the next interceptor + next.invoke(message); + + } catch (Exception e) { + //FIXME How do we report exceptions? + e.printStackTrace(); + + } finally { + + BINDER.setContext(oldModuleContext); + } + } + + public void release() { + } + + }); + } catch (WorkException e) { + //FIXME Which exception should we throw here? + throw new ServiceRuntimeException(e); + } + + // No return on a OneWay invocation. + return messageFactory.createMessage(); + } + + public void setNext(Interceptor next) { + this.next=next; + } + + private static class ContextBinder extends SCA { + public void setContext(ModuleContext context) { + setModuleContext(context); + } + + public void start() { + throw new AssertionError(); + } + + public void stop() { + throw new AssertionError(); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/async/work/DefaultWorkManager.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/async/work/DefaultWorkManager.java new file mode 100644 index 0000000000..866e101b0e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/async/work/DefaultWorkManager.java @@ -0,0 +1,68 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.async.work; + +import javax.resource.spi.work.WorkManager; + +import org.apache.geronimo.connector.work.GeronimoWorkManager; +import org.apache.geronimo.transaction.context.TransactionContextManager; +import org.osoa.sca.annotations.Destroy; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Property; +import org.osoa.sca.annotations.Scope; +import org.osoa.sca.annotations.Service; + +/** + * A Work Manager service component implementation which just reuses the Geronimo WorkManager. + * + * @version $Rev$ $Date$ + */ +@Service(WorkManager.class) +@Scope("MODULE") +public class DefaultWorkManager extends GeronimoWorkManager implements WorkManager { + + private final static int DEFAULT_POOL_SIZE = 10; + + @Property + public int scheduledMaximumPoolSize; + + /** + * Constructs a new instance. + */ + public DefaultWorkManager() { + super(DEFAULT_POOL_SIZE, new TransactionContextManager()); + } + + @Init(eager=true) + public void init() throws Exception { + doStart(); + } + + @Destroy + public void destroy() throws Exception { + doStop(); + } + + public void setScheduledMaximumPoolSize(int maxSize) { + super.setScheduledMaximumPoolSize(maxSize); + } + + public int getScheduledMaximumPoolSize() { + return super.getScheduledMaximumPoolSize(); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/BuilderConfigException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/BuilderConfigException.java new file mode 100644 index 0000000000..c2402d9141 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/BuilderConfigException.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +/** + * Represents an error processing an assembly model + * + * @version $Rev$ $Date$ + */ +public class BuilderConfigException extends BuilderException { + + public BuilderConfigException() { + super(); + } + + public BuilderConfigException(String message) { + super(message); + } + + public BuilderConfigException(String message, Throwable cause) { + super(message, cause); + } + + public BuilderConfigException(Throwable cause) { + super(cause); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/BuilderException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/BuilderException.java new file mode 100644 index 0000000000..246f188988 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/BuilderException.java @@ -0,0 +1,41 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +import org.apache.tuscany.core.context.CoreRuntimeException; + +/** + * The root exception for the builder package. Builder exceptions denote a non-recoverable failure. + * + * @version $Rev$ $Date$ + */ +public abstract class BuilderException extends CoreRuntimeException { + + public BuilderException() { + super(); + } + + public BuilderException(String message) { + super(message); + } + + public BuilderException(String message, Throwable cause) { + super(message, cause); + } + + public BuilderException(Throwable cause) { + super(cause); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/BuilderInitException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/BuilderInitException.java new file mode 100644 index 0000000000..cd57eaf7ab --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/BuilderInitException.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +/** + * Denotes an exception initializing a builder + * + * @version $Rev$ $Date$ + */ +public class BuilderInitException extends BuilderException { + + public BuilderInitException() { + super(); + } + + public BuilderInitException(String message, Throwable cause) { + super(message, cause); + } + + public BuilderInitException(String message) { + super(message); + } + + public BuilderInitException(Throwable cause) { + super(cause); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ContextCreationException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ContextCreationException.java new file mode 100644 index 0000000000..24b526371d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ContextCreationException.java @@ -0,0 +1,41 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + + +/** + * Denotes an exception creating an instance context + * + * @version $Rev$ $Date$ + */ +public class ContextCreationException extends BuilderException { + + public ContextCreationException() { + super(); + } + + public ContextCreationException(String message) { + super(message); + } + + public ContextCreationException(String message, Throwable cause) { + super(message, cause); + } + + public ContextCreationException(Throwable cause) { + super(cause); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ContextFactory.java new file mode 100644 index 0000000000..ccef8024e8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ContextFactory.java @@ -0,0 +1,123 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.model.assembly.Scope; + +import java.util.List; +import java.util.Map; + +/** + * Implementations create {@link org.apache.tuscany.core.context.Context}s based on an assembly configuration. + * <p/> + * Context factories are "built" in two phases. {@link ContextFactoryBuilder}s analyze an assembly, producing + * <code>ContextFactory</code>s for {@link org.apache.tuscany.model.assembly.Component}s, {@link + * org.apache.tuscany.model.assembly.EntryPoint}s, and {@link org.apache.tuscany.model.assembly.ExternalService}s. During this + * phase, {@link org.apache.tuscany.core.wire.WireFactory}s for source- and target-side wires are produced for the + * <code>ContextFactory</code>s. Ê + * <p/> + * The second build phase connects the source- and target-side <code>WireFactories</code>, thereby completing wire configuration. + * <p/> + * At runtime, <code>ContextFactory</code>s are called to create new <code>Context</code>s when a new implementation instance is + * required for a component, entry point, or external service. The <code>Context</code> is then responsible for instantiating and + * managing the actual implementation instance. When a <code>Context</code> creates a new instance, the previously configured + * <code>WireFactory</code>s are used to create wires to and from the instance. A wire is a collection of stateless invocation + * chains that are managed by the <code>Context</code>'s <code>ContextFactory</code>. + * + * @version $Rev: 385747 $ $Date: 2006-03-13 22:12:53 -0800 (Mon, 13 Mar 2006) $ + */ +public interface ContextFactory<T extends Context> { + + /** + * Creates a <code>Context</code> based on configuration supplied by a logical model assembly + * + * @return a new instance context + * @throws ContextCreationException if an error occurs creating the context + */ + public T createContext() throws ContextCreationException; + + /** + * Returns the scope identifier associated with the type of contexts produced by the current factory + */ + public Scope getScope(); + + /** + * Returns the name of the <code>Context</code> produced by the current factory + */ + public String getName(); + + /** + * Adds a property to the context + */ + public void addProperty(String propertyName, Object value); + + /** + * Adds a target-side wire factory for the given service name. Target-side wire factories contain the invocation chains + * associated with the destination service of a wire and are responsible for generating proxies + */ + public void addTargetWireFactory(String serviceName, TargetWireFactory factory); + + /** + * Returns the target-side wire factory associated with the given service name + */ + public TargetWireFactory getTargetWireFactory(String serviceName); + + /** + * Returns a collection of target-side wire factories keyed by service name + */ + public Map<String, TargetWireFactory> getTargetWireFactories(); + + /** + * Adds a source-side wire factory for the given reference. Source-side wire factories contain the invocation chains for a + * reference in the implementation associated with the instance context created by this configuration. Source-side wire + * factories also produce proxies that are injected on a reference in a component implementation. + * + * @param referenceName + * @param factory + */ + public void addSourceWireFactory(String referenceName, SourceWireFactory factory); + + /** + * Adds a set of source-side wire factories for the given reference. Source-side wire factories contain the invocation chains + * for a reference in the implementation associated with the instance context created by this configuration. Source-side wire + * factories also produce proxies that are injected on a reference in a component implementation. + * + * @param referenceName + * @param referenceInterface + * @param factory + * @param multiplicity + */ + public void addSourceWireFactories(String referenceName, Class referenceInterface, List<SourceWireFactory> factory, boolean multiplicity); + + /** + * Returns a collection of source-side wire factories for references. There may 1..n wire factories per reference. + */ + public List<SourceWireFactory> getSourceWireFactories(); + + /** + * Called to signal to the configuration that its parent context has been activated and that it shoud perform any required + * initialization steps + * + * @param parent the parent context + */ + public void prepare(CompositeContext parent); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ContextFactoryBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ContextFactoryBuilder.java new file mode 100644 index 0000000000..786298809e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ContextFactoryBuilder.java @@ -0,0 +1,50 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +import org.apache.tuscany.model.assembly.AssemblyObject; + +/** + * The extension point for component types in the runtime. Implementations perform the first phase of converting an assembly model + * into a series of runtime artifacts. Specifically, <code>ContextFactoryBuilder</code>s are responsible for analyzing the + * assembly model and producing {@link ContextFactory}s that are used to generate executable artifacts such as an {@link + * org.apache.tuscany.core.context.Context}. In the case of components, the <code>ContextFactory</code> will typically contain + * configuration for instantiating implementation instances with injected properties and references. + * <p/> + * As the assembly model is analyzed, <code>ContextFactoryBuilder</code>s are guaranteed to be called first and are expected to + * decorate the assembly model with <code>ContextFactory</code>s. + * <p/> + * The second phase uses {@link WireBuilder}s to connect the source and target wire chains held in these + * <code>ContextFactory</code>s to form a completed wire. <code>WireBuilder<code>s may use a similar delegation strategy and + * perform various optimizations. + * + * @version $Rev$ $Date$ + * @see ContextFactory + * @see WireBuilder + */ +public interface ContextFactoryBuilder { + + /** + * Creates or updates a context factory based on configuration contained in the given model object. The model object is + * decorated with the factory. + * + * @param object the logical configuration model node + * @throws BuilderException + */ + public void build(AssemblyObject object) throws BuilderException; + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ContextFactoryBuilderRegistry.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ContextFactoryBuilderRegistry.java new file mode 100644 index 0000000000..a002627c2e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ContextFactoryBuilderRegistry.java @@ -0,0 +1,31 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.builder; + +/** + * System wide registry for ContextFactoryBuilder implementations. + * + * @version $Rev$ $Date$ + */ +public interface ContextFactoryBuilderRegistry { + /** + * Register a builder. Called by extensions to register their builders. + * + * @param builder the builder to register + */ + void register(ContextFactoryBuilder builder); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ContextResolver.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ContextResolver.java new file mode 100644 index 0000000000..5c99d6dd43 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ContextResolver.java @@ -0,0 +1,29 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +import org.apache.tuscany.core.context.CompositeContext; + +/** + * Implementations are responsible for resolving the current composite context + * + * @version $Rev$ $Date$ + */ +public interface ContextResolver { + + /** + * Returns the current composite context + */ + CompositeContext getCurrentContext(); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/HierarchicalWireBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/HierarchicalWireBuilder.java new file mode 100644 index 0000000000..ace34a1ad5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/HierarchicalWireBuilder.java @@ -0,0 +1,29 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +/** + * A wire builder that delegates to child wire builders + * + * @version $Rev$ $Date$ + */ +public interface HierarchicalWireBuilder extends WireBuilder{ + + /** + * Registers a child wire builder + */ + public void addWireBuilder(WireBuilder builder); + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/NoAccessorException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/NoAccessorException.java new file mode 100644 index 0000000000..34b6294638 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/NoAccessorException.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +/** + * Denotes an attempt to access a non-existent field or method + * + * @version $Rev$ $Date$ + */ +public class NoAccessorException extends BuilderException { + + public NoAccessorException() { + super(); + } + + public NoAccessorException(String message) { + super(message); + } + + public NoAccessorException(String message, Throwable cause) { + super(message, cause); + } + + public NoAccessorException(Throwable cause) { + super(cause); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ObjectFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ObjectFactory.java new file mode 100644 index 0000000000..ab2cfd9bac --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/ObjectFactory.java @@ -0,0 +1,35 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +import org.apache.tuscany.core.injection.ObjectCreationException; + +/** + * Implementations create new instances of a particular type + * + * @version $Rev$ $Date$ + */ +public interface ObjectFactory<T> { + + /** + * Return a instance of the type that this factory creates. + * + * @return a instance from this factory + */ + T getInstance() throws ObjectCreationException; + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/PolicyBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/PolicyBuilder.java new file mode 100644 index 0000000000..489541a213 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/PolicyBuilder.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +/** + * A marker for policy extensions in the runtime. Implementations evaluate wire-related policy metadata on a {@link + * org.apache.tuscany.model.assembly.ConfiguredReference} or {@link org.apache.tuscany.model.assembly.ConfiguredService} and + * contribute {@link org.apache.tuscany.core.wire.Interceptor}s or {@link org.apache.tuscany.core.wire.MessageHandler}s + * implementing a policy to {@link org.apache.tuscany.core.wire.InvocationConfiguration}s that are part of a {@link + * org.apache.tuscany.core.wire.WireConfiguration}. The contributed <code>Interceptor</code>s or <code>Handler</code>s will be + * called as part of an invocation over a wire. + * + * @version $$Rev$$ $$Date$$ + */ +public interface PolicyBuilder { + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/PolicyOrderer.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/PolicyOrderer.java new file mode 100644 index 0000000000..1038b6e878 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/PolicyOrderer.java @@ -0,0 +1,26 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +/** + * A marker for implementations that order source- or target-side policy {@link org.apache.tuscany.core.wire.Interceptor}s or + * {@link org.apache.tuscany.core.wire.MessageHandler}s in a {@link org.apache.tuscany.core.wire.WireConfiguration}. + * + * @see SourcePolicyOrderer + * @see TargetPolicyOrderer + * @version $$Rev$$ $$Date$$ + */ +public interface PolicyOrderer { + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/SourcePolicyBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/SourcePolicyBuilder.java new file mode 100644 index 0000000000..76a376e3d5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/SourcePolicyBuilder.java @@ -0,0 +1,31 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +import org.apache.tuscany.core.wire.WireSourceConfiguration; +import org.apache.tuscany.model.assembly.ConfiguredReference; + +import java.util.List; + +/** + * Implementations contribute {@link org.apache.tuscany.core.wire.Interceptor}s or {@link + * org.apache.tuscany.core.wire.MessageHandler}s that handle source-side policy on a wire. + * + * @version $$Rev$$ $$Date$$ + */ +public interface SourcePolicyBuilder extends PolicyBuilder { + + public void build(ConfiguredReference reference, List<WireSourceConfiguration> configurations) throws BuilderException; + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/SourcePolicyOrderer.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/SourcePolicyOrderer.java new file mode 100644 index 0000000000..6bc3bcda6e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/SourcePolicyOrderer.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +import org.apache.tuscany.core.wire.WireSourceConfiguration; + +/** + * Implementations order source-side policy {@link org.apache.tuscany.core.wire.Interceptor}s or + * {@link org.apache.tuscany.core.wire.MessageHandler}s in a {@link org.apache.tuscany.core.wire.WireConfiguration}. + * + * @version $$Rev$$ $$Date$$ + */ +public interface SourcePolicyOrderer extends PolicyOrderer{ + + public void order(WireSourceConfiguration configuration); + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/TargetPolicyBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/TargetPolicyBuilder.java new file mode 100644 index 0000000000..10c34751e2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/TargetPolicyBuilder.java @@ -0,0 +1,29 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.core.wire.WireTargetConfiguration; + +/** + * Implementations contribute {@link org.apache.tuscany.core.wire.Interceptor}s or {@link + * org.apache.tuscany.core.wire.MessageHandler}s that handle target-side policy on a wire. + * + * @version $$Rev$$ $$Date$$ + */ +public interface TargetPolicyBuilder extends PolicyBuilder{ + + public void build(ConfiguredService service, WireTargetConfiguration configuration) throws BuilderException; + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/TargetPolicyOrderer.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/TargetPolicyOrderer.java new file mode 100644 index 0000000000..4b596bfdc1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/TargetPolicyOrderer.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +import org.apache.tuscany.core.wire.WireTargetConfiguration; + +/** + * Implementation order target-side policy {@link org.apache.tuscany.core.wire.Interceptor}s or + * {@link org.apache.tuscany.core.wire.MessageHandler}s in a {@link org.apache.tuscany.core.wire.WireConfiguration}. + + * @version $$Rev$$ $$Date$$ + */ +public interface TargetPolicyOrderer { + + public void order(WireTargetConfiguration configuration); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/UnknownTypeException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/UnknownTypeException.java new file mode 100644 index 0000000000..24c1fa24ff --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/UnknownTypeException.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +/** + * Denotes an unknown configuration parameter type + * + * @version $Rev$ $Date$ + */ +public class UnknownTypeException extends BuilderException { + + public UnknownTypeException() { + super(); + } + + public UnknownTypeException(String message) { + super(message); + } + + public UnknownTypeException(String message, Throwable cause) { + super(message, cause); + } + + public UnknownTypeException(Throwable cause) { + super(cause); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/WireBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/WireBuilder.java new file mode 100644 index 0000000000..54f2ff4b4e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/WireBuilder.java @@ -0,0 +1,71 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder; + +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; + +/** + * Implementations perform the second phase of converting a logical model representing an assembly into a series of + * runtime or executable artifacts. Specifically, they are responsible for finalizing target-side proxy factories and + * bridging {@link org.apache.tuscany.core.wire.InvocationConfiguration}s held by source- and target-side proxy + * factories. <code>WireBuilder</code>s generally operate by target implementation type. In other words, for a wire + * from a Java source to a JavaScript target, the Javascript <code>WireBuilder</code> will complete the wire. This is + * necessary as a <code>WireBuilder</code> must set a {@link org.apache.tuscany.core.wire.TargetInvoker} that is + * responsible for dispatching to an implementation on the source side of the wire. + * <p> + * Runtimes are generally configured with a {@link org.apache.tuscany.core.builder.impl.DefaultWireBuilder} as a + * top-most wire builder, which delegates to other builders wired to it as part of a system configuration. + * <p> + * Wire builders may optimize the wire chains based on certain characteristics of th wire, such as source and + * target scopes. + * + * @see org.apache.tuscany.core.builder.ContextFactoryBuilder + * @see org.apache.tuscany.core.builder.impl.DefaultWireBuilder + * @version $Rev$ $Date$ + */ +public interface WireBuilder { + + /** + * Connects wire configurations of the source proxy factory to corresponding ones in the target proxy to + * factory + * + * @param sourceFactory the proxy factory used in constructing the source side of the wire chain + * @param targetFactory the proxy factory used in constructing the target side of the wire chain + * @param targetType the context type of the target. Used to determine if a paricular wire builder should construct + * the wire + * @param downScope true if the component containing the reference (source side) is of a lesser scope than the + * target service + * @param targetScopeContext the scope context responsible for managing intance contexts of the target component + * type + * @throws BuilderConfigException if an error occurs during the wire buildSource process + */ + public void connect(SourceWireFactory<?> sourceFactory, TargetWireFactory<?> targetFactory, Class targetType, boolean downScope, + ScopeContext targetScopeContext) throws BuilderConfigException; + + /** + * Finishes processing the target side wire chain. For example, a + * {@link org.apache.tuscany.core.wire.TargetInvoker} used by target-side proxies is usually set during this + * phase. + * + * @param targetFactory the target-side proxy factory + * @param targetType the target context type + * @param targetScopeContext the target scope + * @throws BuilderConfigException if an error occurs during the wire buildSource process + */ + public void completeTargetChain(TargetWireFactory<?> targetFactory, Class targetType, ScopeContext targetScopeContext) + throws BuilderConfigException; + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/ArrayMultiplicityObjectFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/ArrayMultiplicityObjectFactory.java new file mode 100644 index 0000000000..8f0cbbf91b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/ArrayMultiplicityObjectFactory.java @@ -0,0 +1,49 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder.impl; + +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.injection.ObjectCreationException; + +import java.lang.reflect.Array; +import java.util.List; + +/** + * Resolves targets configured in a multiplicity by delegating to object factories and returning an + * <code>Array</code> containing object instances + * + * @version $Rev$ $Date$ + */ +public class ArrayMultiplicityObjectFactory implements ObjectFactory<Object> { + + private ObjectFactory[] factories; + + private Class interfaceType; + + public ArrayMultiplicityObjectFactory(Class interfaceType, List<ObjectFactory> factories) { + assert (interfaceType != null) : "Interface type was null"; + assert (factories != null) : "Object factories were null"; + this.interfaceType = interfaceType; + this.factories = factories.toArray(new ObjectFactory[factories.size()]); + } + + public Object getInstance() throws ObjectCreationException { + Object array = Array.newInstance(interfaceType, factories.length); + for (int i = 0; i < factories.length; i++) { + Array.set(array, i, factories[i].getInstance()); + } + return array; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/AssemblyVisitorImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/AssemblyVisitorImpl.java new file mode 100644 index 0000000000..178d3d4de6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/AssemblyVisitorImpl.java @@ -0,0 +1,63 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder.impl; + +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.AssemblyVisitor; +import org.apache.tuscany.model.assembly.ContextFactoryHolder; + +import java.util.List; + +/** + * Decorates an assembly object graph with runtime configurations using a set of builders + * + * @version $Rev: 392146 $ $Date: 2006-04-06 18:11:28 -0700 (Thu, 06 Apr 2006) $ + */ +public class AssemblyVisitorImpl implements AssemblyVisitor { + + private List<ContextFactoryBuilder> builders; + + /** + * Constructs a visitor + * + * @param builders the collection of builders for creating context factories + */ + public AssemblyVisitorImpl(List<ContextFactoryBuilder> builders) { + this.builders = builders; + } + + /** + * Initiate walking the object graph + */ + public boolean start(AssemblyObject modelObject) { + return modelObject.accept(this); + } + + /** + * Callback when walking the graph + */ + public boolean visit(AssemblyObject modelObject) { + if (modelObject instanceof ContextFactoryHolder){ + if (((ContextFactoryHolder)modelObject).getContextFactory() != null){ + return true; // HACK FIX for TUSCANY 249 + } + } + for (ContextFactoryBuilder builder : builders) { + builder.build(modelObject); + } + return true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/ContextFactoryBuilderRegistryImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/ContextFactoryBuilderRegistryImpl.java new file mode 100644 index 0000000000..d500b2e503 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/ContextFactoryBuilderRegistryImpl.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.builder.impl; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; + +/** + * @version $Rev$ $Date$ + */ +public class ContextFactoryBuilderRegistryImpl implements ContextFactoryBuilderRegistry { + + private final List<ContextFactoryBuilder> builders = new ArrayList<ContextFactoryBuilder>(); + + public void register(ContextFactoryBuilder builder) { + builders.add(builder); + } + + public List<ContextFactoryBuilder> getBuilders() { + return builders; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/DefaultWireBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/DefaultWireBuilder.java new file mode 100644 index 0000000000..5243c2a8cd --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/DefaultWireBuilder.java @@ -0,0 +1,111 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder.impl; + +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.builder.HierarchicalWireBuilder; +import org.apache.tuscany.core.builder.WireBuilder; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.wire.TargetInvocationConfiguration; +import org.apache.tuscany.core.wire.SourceInvocationConfiguration; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.impl.InvokerInterceptor; +import org.apache.tuscany.core.wire.impl.MessageChannelImpl; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * The top-most <code>WireBuilder</code> configured in a runtime. Responsible for constructing wires from source and target chains, + * this implementation first bridges the chains and then delegates to any other wire builders. + * + * @version $Rev$ $Date$ + */ +public class DefaultWireBuilder implements HierarchicalWireBuilder { + + // collection configured wire builders + private List<WireBuilder> builders = new ArrayList<WireBuilder>(); + + public DefaultWireBuilder() { + } + + /** + * Adds a wire builder to delegate to + */ + public void addWireBuilder(WireBuilder builder) { + builders.add(builder); + } + + public void connect(SourceWireFactory<?> sourceFactory, TargetWireFactory<?> targetFactory, Class targetType, boolean downScope, + ScopeContext targetScopeContext) { + // get the proxy chain for the target + if (targetFactory != null) { + // if null, the target side has no interceptors or handlers + Map<Method, TargetInvocationConfiguration> targetInvocationConfigs = targetFactory.getConfiguration().getInvocationConfigurations(); + for (SourceInvocationConfiguration sourceInvocationConfig : sourceFactory.getConfiguration() + .getInvocationConfigurations().values()) { + // match wire chains + TargetInvocationConfiguration targetInvocationConfig = targetInvocationConfigs.get(sourceInvocationConfig.getMethod()); + if (targetInvocationConfig == null){ + BuilderConfigException e= new BuilderConfigException("Incompatible source and target interface types for reference"); + //FIXME xcv + e.setIdentifier(sourceFactory.getConfiguration().getReferenceName()); + throw e; + } + // if handler is configured, add that + if (targetInvocationConfig.getRequestHandlers() != null) { + sourceInvocationConfig.setTargetRequestChannel(new MessageChannelImpl(targetInvocationConfig + .getRequestHandlers())); + sourceInvocationConfig.setTargetResponseChannel(new MessageChannelImpl(targetInvocationConfig + .getResponseHandlers())); + } else { + // no handlers, just connect interceptors + if (targetInvocationConfig.getHeadInterceptor() == null) { + BuilderConfigException e = new BuilderConfigException("No target handler or interceptor for operation"); + e.setIdentifier(targetInvocationConfig.getMethod().getName()); + throw e; + } + //xcv if (!(sourceInvocationConfig.getLastTargetInterceptor() instanceof InvokerInterceptor && targetInvocationConfig + if (!(sourceInvocationConfig.getTailInterceptor() instanceof InvokerInterceptor && targetInvocationConfig + .getHeadInterceptor() instanceof InvokerInterceptor)) { + // check that we do not have the case where the only interceptors are invokers since we just need one + sourceInvocationConfig.setTargetInterceptor(targetInvocationConfig.getHeadInterceptor()); + } + } + } + } + // delegate to other wire builders + for (WireBuilder builder : builders) { + builder.connect(sourceFactory, targetFactory, targetType, downScope, targetScopeContext); + } + // signal that wire buildSource process is complete + for (SourceInvocationConfiguration sourceInvocationConfig : sourceFactory.getConfiguration().getInvocationConfigurations() + .values()) { + sourceInvocationConfig.build(); + // TODO optimize if no proxy needed using NullWireFactory + } + } + + public void completeTargetChain(TargetWireFactory targetFactory, Class targetType, ScopeContext targetScopeContext) + throws BuilderConfigException { + // delegate to other wire builders + for (WireBuilder builder : builders) { + builder.completeTargetChain(targetFactory, targetType, targetScopeContext); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/HierarchicalBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/HierarchicalBuilder.java new file mode 100644 index 0000000000..ffab32bd37 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/HierarchicalBuilder.java @@ -0,0 +1,57 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder.impl; + +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.model.assembly.AssemblyObject; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * A builder that contains nested builders. Used for synchronizing parts of the buildSource process, such as references. + * + * @version $Rev$ $Date$ + */ +public class HierarchicalBuilder implements ContextFactoryBuilder { + private List<ContextFactoryBuilder> builders = new CopyOnWriteArrayList<ContextFactoryBuilder>(); + + private List<ContextFactoryBuilder> readOnlyBuilders = Collections.unmodifiableList(builders); + + public HierarchicalBuilder() { + } + + public void addBuilder(ContextFactoryBuilder builder) { + builders.add(builder); + } + + public void removeBuilder(ContextFactoryBuilder builder){ + builders.remove(builder); + } + + public List getBuilders(){ + return readOnlyBuilders; + } + + public void build(AssemblyObject object) throws BuilderException { + for (ContextFactoryBuilder builder : builders) { + builder.build(object); + } + + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/ListMultiplicityObjectFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/ListMultiplicityObjectFactory.java new file mode 100644 index 0000000000..5d37eb8e89 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/ListMultiplicityObjectFactory.java @@ -0,0 +1,45 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder.impl; + +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.injection.ObjectCreationException; + +import java.util.ArrayList; +import java.util.List; + +/** + * Resolves targets configured in a multiplicity by delegating to object factories and returning an + * <code>List</code> containing object instances + * + * @version $Rev$ $Date$ + */ +public class ListMultiplicityObjectFactory implements ObjectFactory<List> { + + private ObjectFactory[] factories; + + public ListMultiplicityObjectFactory(List<ObjectFactory> factories) { + assert (factories != null) : "Object factories were null"; + this.factories = factories.toArray(new ObjectFactory[factories.size()]); + } + + public List getInstance() throws ObjectCreationException { + List<Object> list = new ArrayList<Object>(); + for (ObjectFactory factory : factories) { + list.add(factory.getInstance()); + } + return list; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/ProxyObjectFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/ProxyObjectFactory.java new file mode 100644 index 0000000000..1dc6627306 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/impl/ProxyObjectFactory.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder.impl; + +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.injection.ObjectCreationException; +import org.apache.tuscany.core.wire.ProxyCreationException; +import org.apache.tuscany.core.wire.WireFactory; + +/** + * Uses a proxy factory to return an object instance + * + * @version $Rev$ $Date$ + */ +public class ProxyObjectFactory implements ObjectFactory { + + private WireFactory factory; + + public ProxyObjectFactory(WireFactory factory) { + this.factory = factory; + } + + public Object getInstance() throws ObjectCreationException { + try { + return factory.createProxy(); + } catch (ProxyCreationException e) { + throw new ObjectCreationException(e); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/system/DefaultPolicyBuilderRegistry.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/system/DefaultPolicyBuilderRegistry.java new file mode 100644 index 0000000000..4c53a2c830 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/system/DefaultPolicyBuilderRegistry.java @@ -0,0 +1,102 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder.system; + +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.SourcePolicyBuilder; +import org.apache.tuscany.core.builder.SourcePolicyOrderer; +import org.apache.tuscany.core.builder.TargetPolicyBuilder; +import org.apache.tuscany.core.builder.TargetPolicyOrderer; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.wire.WireSourceConfiguration; +import org.apache.tuscany.core.wire.WireTargetConfiguration; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.osoa.sca.annotations.Scope; +import org.osoa.sca.annotations.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * A system service that serves as the default implementation of a policy builder registry + * + * @version $$Rev$$ $$Date$$ + */ + +@Scope("MODULE") +@Service(interfaces = {PolicyBuilderRegistry.class}) +public class DefaultPolicyBuilderRegistry implements PolicyBuilderRegistry { + + private final List<SourcePolicyBuilder> sourceBuilders = new ArrayList<SourcePolicyBuilder>(); + private final List<TargetPolicyBuilder> targetBuilders = new ArrayList<TargetPolicyBuilder>(); + + private TargetPolicyOrderer targetOrderer; + + private SourcePolicyOrderer sourceOrderer; + + @Autowire + public void setTargetOrderer(TargetPolicyOrderer orderer) { + this.targetOrderer = orderer; + } + + @Autowire + public void setSourceOrderer(SourcePolicyOrderer orderer) { + this.sourceOrderer = orderer; + } + + public void registerTargetBuilder(TargetPolicyBuilder builder) { + targetBuilders.add(builder); + } + + public void unregisterTargetBuilder(TargetPolicyBuilder builder) { + targetBuilders.remove(builder); + } + + public void registerSourceBuilder(SourcePolicyBuilder builder) { + sourceBuilders.add(builder); + } + + public void unregisterSourceBuilder(SourcePolicyBuilder builder) { + sourceBuilders.remove(builder); + } + + public List<TargetPolicyBuilder> getTargetBuilders() { + return targetBuilders; + } + + public List<SourcePolicyBuilder> getSourceBuilders() { + return sourceBuilders; + } + + public void buildSource(ConfiguredReference reference, List<WireSourceConfiguration> configurations) throws BuilderException { + for (SourcePolicyBuilder builder : sourceBuilders) { + builder.build(reference, configurations); + } + if (sourceOrderer != null) { + for (WireSourceConfiguration configuration : configurations) { + sourceOrderer.order(configuration); + } + } + } + + public void buildTarget(ConfiguredService service, WireTargetConfiguration configuration) throws BuilderException { + for (TargetPolicyBuilder builder : targetBuilders) { + builder.build(service, configuration); + } + if (targetOrderer != null) { + targetOrderer.order(configuration); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/system/PolicyBuilderRegistry.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/system/PolicyBuilderRegistry.java new file mode 100644 index 0000000000..fb9b0b25db --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/builder/system/PolicyBuilderRegistry.java @@ -0,0 +1,92 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.builder.system; + +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.SourcePolicyBuilder; +import org.apache.tuscany.core.builder.TargetPolicyBuilder; +import org.apache.tuscany.core.wire.WireSourceConfiguration; +import org.apache.tuscany.core.wire.WireTargetConfiguration; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; + +import java.util.List; + +/** + * A System registry for {@link org.apache.tuscany.core.builder.PolicyBuilder}s. <code>PolicyBuilder</code>s will be invoked when + * a {@link org.apache.tuscany.core.wire.WireFactory} is constructed by the {@link org.apache.tuscany.core.wire.WireFactory} + * service. + * <p/> + * <code>PolicyBuilder</code>s operate on either a source- or target-side wire and typically are registered by runtime extensions + * through {@link #registerTargetBuilder} or {@link #registerSourceBuilder} + * + * @version $Rev$ $Date$ + */ +public interface PolicyBuilderRegistry { + + /** + * Registers a target-side policy builder. Called by extensions to register their builders. + * + * @param builder the builder to register + */ + public void registerTargetBuilder(TargetPolicyBuilder builder); + + /** + * De-registers a target-side builder. Called by extensions to register their builders. + * + * @param builder the builder to register + */ + public void unregisterTargetBuilder(TargetPolicyBuilder builder); + + /** + * Registers a source-side policy builder. Called by extensions to register their builders. + * + * @param builder the builder to register + */ + public void registerSourceBuilder(SourcePolicyBuilder builder); + + /** + * De-registers a source-side builder. Called by extensions to register their builders. + * + * @param builder the builder to register + */ + public void unregisterSourceBuilder(SourcePolicyBuilder builder); + + /** + * Returns the list of registered target-side builders + */ + public List<TargetPolicyBuilder> getTargetBuilders(); + + /** + * Returns the list of registered source-side builders + */ + public List<SourcePolicyBuilder> getSourceBuilders(); + + /** + * Evaluates source-side policy metadata for configured reference and updates the curresponding collection of wire configurations + * + * @throws BuilderException + */ + public void buildSource(ConfiguredReference reference, List<WireSourceConfiguration> configurations) throws BuilderException; + + /** + * Evaluates target-side policy metadata for configured reference and updates the curresponding collection of wire configurations + * + * @throws BuilderException + */ + public void buildTarget(ConfiguredService service, WireTargetConfiguration configuration) throws BuilderException; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/client/BootstrapHelper.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/client/BootstrapHelper.java new file mode 100644 index 0000000000..556b0991f7 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/client/BootstrapHelper.java @@ -0,0 +1,138 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.client; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.stream.XMLInputFactory; + +import org.apache.tuscany.common.monitor.MonitorFactory; +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.builder.impl.ContextFactoryBuilderRegistryImpl; +import org.apache.tuscany.core.config.ConfigurationException; +import org.apache.tuscany.core.config.ModuleComponentConfigurationLoader; +import org.apache.tuscany.core.config.impl.StAXModuleComponentConfigurationLoaderImpl; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.SystemCompositeContext; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.loader.StAXLoaderRegistry; +import org.apache.tuscany.core.loader.StAXUtil; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.core.system.builder.SystemContextFactoryBuilder; +import org.apache.tuscany.core.system.builder.SystemEntryPointBuilder; +import org.apache.tuscany.core.system.builder.SystemExternalServiceBuilder; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.ModuleComponent; +import org.apache.tuscany.model.assembly.impl.AssemblyContextImpl; +import org.apache.tuscany.model.assembly.loader.AssemblyModelLoader; +import org.apache.tuscany.model.scdl.loader.impl.SCDLAssemblyModelLoaderImpl; + +/** + * @version $Rev$ $Date$ + */ +public final class BootstrapHelper { + private BootstrapHelper() { + } + + /** + * Returns a default AssemblyModelContext. + * + * @param classLoader the classloader to use for application artifacts + * @return a default AssemblyModelContext + */ + public static AssemblyContext getModelContext(ClassLoader classLoader) { + // Create an assembly model factory + AssemblyFactory modelFactory = new SystemAssemblyFactoryImpl(); + + // Create a default assembly model loader + AssemblyModelLoader modelLoader = new SCDLAssemblyModelLoaderImpl(); + + // Create a resource loader from the supplied classloader + ResourceLoader resourceLoader = new ResourceLoaderImpl(classLoader); + + // Create an assembly model context + return new AssemblyContextImpl(modelFactory, modelLoader, resourceLoader); + } + + /** + * Returns a default list of configuration builders. + * + * @param monitorFactory + * @return a default list of configuration builders + */ + public static List<ContextFactoryBuilder> getBuilders(MonitorFactory monitorFactory) { + List<ContextFactoryBuilder> configBuilders = new ArrayList<ContextFactoryBuilder>(); + configBuilders.add((new SystemContextFactoryBuilder(monitorFactory))); + configBuilders.add(new SystemEntryPointBuilder()); + configBuilders.add(new SystemExternalServiceBuilder()); + return configBuilders; + } + + /** + * Returns a ContextFactoryBuilderRegistry with default builders registered for system contexts. + * + * @param monitorFactory a monitorFactory that will be used to obtain monitors for system components + * @return a default ContextFactoryBuilderRegistry + */ + public static ContextFactoryBuilderRegistry bootstrapContextFactoryBuilders(MonitorFactory monitorFactory) { + ContextFactoryBuilderRegistryImpl registry = new ContextFactoryBuilderRegistryImpl(); + registry.register(new SystemContextFactoryBuilder(monitorFactory)); + registry.register(new SystemEntryPointBuilder()); + registry.register(new SystemExternalServiceBuilder()); + return registry; + } + + public static final String SYSTEM_LOADER_COMPONENT = "tuscany.loader"; + + /** + * Returns the default module configuration loader. + * + * @param systemContext the runtime's system context + * @param modelContext the model context the loader will use + * @return the default module configuration loader + */ + public static ModuleComponentConfigurationLoader getConfigurationLoader(SystemCompositeContext systemContext, AssemblyContext modelContext) { + return new StAXModuleComponentConfigurationLoaderImpl(modelContext, XMLInputFactory.newInstance(), systemContext.resolveInstance(StAXLoaderRegistry.class)); + } + + /** + * Bootstrap the StAX-based loader. + * + * @param parentContext the parent system context + * @param modelContext + * @return the system context for the loader + * @throws ConfigurationException + */ + public static CompositeContext bootstrapStaxLoader(SystemCompositeContext parentContext, AssemblyContext modelContext) throws ConfigurationException { + ModuleComponent loaderComponent = StAXUtil.bootstrapLoader(SYSTEM_LOADER_COMPONENT, modelContext); + CompositeContext loaderContext = registerModule(parentContext, loaderComponent); + loaderContext.publish(new ModuleStart(loaderComponent)); + return loaderContext; + } + + public static CompositeContext registerModule(CompositeContext parent, ModuleComponent component) throws ConfigurationException { + // register the component + parent.registerModelObject(component); + + // Get the composite context representing the component + return (CompositeContext) parent.getContext(component.getName()); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/client/TuscanyRuntime.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/client/TuscanyRuntime.java new file mode 100644 index 0000000000..fe78cd712a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/client/TuscanyRuntime.java @@ -0,0 +1,182 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.client; + +import org.osoa.sca.ModuleContext; +import org.osoa.sca.SCA; +import org.osoa.sca.ServiceRuntimeException; + +import org.apache.tuscany.common.monitor.LogLevel; +import org.apache.tuscany.common.monitor.MonitorFactory; +import org.apache.tuscany.common.monitor.impl.NullMonitorFactory; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.builder.impl.DefaultWireBuilder; +import org.apache.tuscany.core.config.ConfigurationException; +import org.apache.tuscany.core.config.ModuleComponentConfigurationLoader; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.CoreRuntimeException; +import org.apache.tuscany.core.context.SystemCompositeContext; +import org.apache.tuscany.core.context.event.HttpSessionBound; +import org.apache.tuscany.core.context.event.HttpSessionEnd; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.event.RequestEnd; +import org.apache.tuscany.core.context.event.RequestStart; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.core.runtime.RuntimeContextImpl; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.ModuleComponent; + +/** + * Create and initialize a Tuscany SCA runtime environment. + * + * @version $Rev$ $Date$ + */ +public class TuscanyRuntime extends SCA { + private final Monitor monitor; + private final Object sessionKey = new Object(); + + private final RuntimeContext runtime; + private final CompositeContext moduleContext; + + private static final String SYSTEM_MODULE_COMPONENT = "org.apache.tuscany.core.system"; + + /** + * Construct a runtime using a null MonitorFactory. + * + * @param name the name of the module component + * @param uri the URI to assign to the module component + * @throws ConfigurationException if there was a problem loading the SCA configuration + * @see TuscanyRuntime#TuscanyRuntime(String, String, org.apache.tuscany.common.monitor.MonitorFactory) + */ + public TuscanyRuntime(String name, String uri) throws ConfigurationException { + this(name, uri, new NullMonitorFactory()); + } + + /** + * Construct a runtime containing a single module component with the + * specified name. The module definition is loaded from a "/sca.module" + * resource found on the classpath of the current Thread context classloader. + * + * @param name the name of the module component + * @param uri the URI to assign to the module component + * @param monitorFactory the MonitorFactory for this runtime + * @throws ConfigurationException if there was a problem loading the SCA configuration + */ + public TuscanyRuntime(String name, String uri, MonitorFactory monitorFactory) throws ConfigurationException { + assert(monitorFactory != null): "monitor factory was null"; + this.monitor = monitorFactory.getMonitor(Monitor.class); + + // Create an assembly model context + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + AssemblyContext modelContext = BootstrapHelper.getModelContext(classLoader); + + // Create a runtime context and start it + ContextFactoryBuilderRegistry builderRegistry = BootstrapHelper.bootstrapContextFactoryBuilders(monitorFactory); + runtime = new RuntimeContextImpl(monitorFactory, builderRegistry, new DefaultWireBuilder()); + runtime.start(); + + // Load and start the system configuration + SystemCompositeContext systemContext = runtime.getSystemContext(); + BootstrapHelper.bootstrapStaxLoader(systemContext, modelContext); + ModuleComponentConfigurationLoader loader = BootstrapHelper.getConfigurationLoader(systemContext, modelContext); + ModuleComponent systemModuleComponent = loader.loadSystemModuleComponent(SYSTEM_MODULE_COMPONENT, SYSTEM_MODULE_COMPONENT); + CompositeContext context = BootstrapHelper.registerModule(systemContext, systemModuleComponent); + context.publish(new ModuleStart(this)); + + // Load the SCDL configuration of the application module + CompositeContext rootContext = runtime.getRootContext(); + ModuleComponent moduleComponent = loader.loadModuleComponent(name, uri); + moduleContext = BootstrapHelper.registerModule(rootContext, moduleComponent); + if (moduleContext.getURI() == null){ + moduleContext.setURI(uri); + } + //TODO remove hack + moduleContext.setAssemblyContext(modelContext); + } + + /** + * Start the runtime and associate the module context with the calling thread. + */ + @Override + public void start() { + setModuleContext((ModuleContext) moduleContext); + try { + //moduleContext.start(); + moduleContext.publish(new ModuleStart(this)); + moduleContext.publish(new RequestStart(this, new Object())); + moduleContext.publish(new HttpSessionBound(this, sessionKey)); + monitor.moduleStarted(moduleContext.getName()); + } catch (CoreRuntimeException e) { + setModuleContext(null); + monitor.moduleStartFailed(moduleContext.getName(), e); + //FIXME throw a better exception + throw new ServiceRuntimeException(e); + } + } + + /** + * Disassociate the module context from the current thread and shut down the runtime. + */ + @Override + public void stop() { + setModuleContext(null); + moduleContext.publish(new RequestEnd(this, new Object())); + moduleContext.publish(new HttpSessionEnd(this, sessionKey)); + moduleContext.publish(new ModuleStop(this)); + moduleContext.stop(); + monitor.moduleStopped(moduleContext.getName()); + } + + /** + * Shut down the Tuscany runtime. + */ + public void shutdown() { + runtime.getSystemContext().publish(new ModuleStop(this)); + runtime.stop(); + } + + /** + * Monitor interface for a TuscanyRuntime. + */ + public static interface Monitor { + /** + * Event emitted after an application module has been started. + * + * @param name the name of the application module + */ + @LogLevel("INFO") + void moduleStarted(String name); + + /** + * Event emitted when an attempt to start an application module failed. + * + * @param name the name of the application module + * @param e the exception that caused the failure + */ + @LogLevel("SEVERE") + void moduleStartFailed(String name, CoreRuntimeException e); + + /** + * Event emitted after an application module has been stopped. + * + * @param name the name of the application module + */ + @LogLevel("INFO") + void moduleStopped(String name); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/ComponentTypeIntrospector.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/ComponentTypeIntrospector.java new file mode 100644 index 0000000000..9f9c125a5e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/ComponentTypeIntrospector.java @@ -0,0 +1,57 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config; + +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.core.extension.config.ImplementationProcessor; + +/** + * Interface for implementations that are able create SCA definitions by inspecting Java classes. + * + * @version $Rev$ $Date$ + */ +public interface ComponentTypeIntrospector { + + /** + * Create a componentType definition by introspecting a Java Class. + * + * @param implClass the class to inspect + * @return a componentType definition + * @throws ConfigurationLoadException if the Class does not define a valid component type + */ + ComponentType introspect(Class<?> implClass) throws ConfigurationLoadException; + + /** + * Completes the given componentType definition by introspecting a Java Class. + * + * @param implClass the class to inspect + * @return a componentType definition + * @throws ConfigurationLoadException if the Class does not define a valid component type + */ + ComponentType introspect(Class<?> implClass, ComponentType compType) throws ConfigurationLoadException; + + /** + * Registers an annotation processor + */ + void registerProcessor(ImplementationProcessor processor); + + /** + * De-registers an annotation processor + */ + void unregisterProcessor(ImplementationProcessor processor); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/ConfigurationException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/ConfigurationException.java new file mode 100644 index 0000000000..de0e4a3733 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/ConfigurationException.java @@ -0,0 +1,44 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config; + +import org.apache.tuscany.common.TuscanyException; + + +/** + * Base class for exceptions that pertain to configuration. + * + * @version $Rev$ $Date$ + */ +public abstract class ConfigurationException extends TuscanyException { + private static final long serialVersionUID = 7441469809266868036L; + + public ConfigurationException() { + } + + public ConfigurationException(String message) { + super(message); + } + + public ConfigurationException(String message, Throwable cause) { + super(message, cause); + } + + public ConfigurationException(Throwable cause) { + super(cause); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/ConfigurationLoadException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/ConfigurationLoadException.java new file mode 100644 index 0000000000..2a9e325b0b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/ConfigurationLoadException.java @@ -0,0 +1,59 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config; + +/** + * Exception indicating that there was a problem loading a configuration resource. + * + * @version $Rev$ $Date$ + */ +public class ConfigurationLoadException extends ConfigurationException { + private static final long serialVersionUID = -2310798146091959144L; + + private String resourceURI; + + public ConfigurationLoadException() { + } + + public ConfigurationLoadException(String message) { + super(message); + } + + public ConfigurationLoadException(String message, Throwable cause) { + super(message, cause); + } + + public ConfigurationLoadException(Throwable cause) { + super(cause); + } + + /** + * Returns the location of the resource that was being loaded. + * @return the location of the resource that was being loaded + */ + public String getResourceURI() { + return resourceURI; + } + + /** + * Sets the location of the resource that was being loaded. + * @param resourceURI the location of the resource that was being loaded + */ + public void setResourceURI(String resourceURI) { + this.resourceURI = resourceURI; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/ImplementationCache.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/ImplementationCache.java new file mode 100644 index 0000000000..cc5f2999fe --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/ImplementationCache.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config; + +import org.apache.tuscany.model.assembly.Implementation; + +import javax.xml.namespace.QName; + +/** + * Cache of introspected implementations. + * + * @version $Rev$ $Date$ + */ +public interface ImplementationCache { + /** + * Return an implementation from a given namespace. + * + * @param type the namespace that defines the type of implementation + * @param name the name of an implementation in that namespace + * @return the implementation or null if it is not present in the cache + */ + Implementation get(QName type, String name); + + /** + * Add an implementation to the cache + * + * @param type the namespace that defines the type of implementation + * @param name the name of an implementation in that namespace + * @param implementation the introspected implementation + */ + void put(QName type, String name, Implementation implementation); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/InvalidMetaDataException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/InvalidMetaDataException.java new file mode 100644 index 0000000000..71b2329044 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/InvalidMetaDataException.java @@ -0,0 +1,35 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config; + +/** + * Denotes an validation error processing component metadata + * @version $$Rev$$ $$Date$$ + */ +public class InvalidMetaDataException extends MetaDataException { + public InvalidMetaDataException() { + } + + public InvalidMetaDataException(String message) { + super(message); + } + + public InvalidMetaDataException(String message, Throwable cause) { + super(message, cause); + } + + public InvalidMetaDataException(Throwable cause) { + super(cause); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/InvalidRootElementException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/InvalidRootElementException.java new file mode 100644 index 0000000000..a355d884a5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/InvalidRootElementException.java @@ -0,0 +1,45 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config; + +import javax.xml.namespace.QName; + +/** + * Configuration exception that indicates the actual root element in an XML file was not the one expected. + * + * @version $Rev$ $Date$ + */ +public class InvalidRootElementException extends ConfigurationLoadException { + private static final long serialVersionUID = 2376629433948140418L; + + private final QName expected; + private final QName actual; + + public InvalidRootElementException(QName expected, QName actual) { + super("Invalid root element, expected [" + expected + "], was [" + actual + ']'); + this.expected = expected; + this.actual = actual; + } + + public QName getExpected() { + return expected; + } + + public QName getActual() { + return actual; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/InvalidSetterException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/InvalidSetterException.java new file mode 100644 index 0000000000..ed4e53645f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/InvalidSetterException.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.config; + +/** + * @version $Rev$ $Date$ + */ +public class InvalidSetterException extends ConfigurationLoadException { + private static final long serialVersionUID = -3298236203808038211L; + + public InvalidSetterException() { + } + + public InvalidSetterException(String message) { + super(message); + } + + public InvalidSetterException(String message, Throwable cause) { + super(message, cause); + } + + public InvalidSetterException(Throwable cause) { + super(cause); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/JavaIntrospectionHelper.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/JavaIntrospectionHelper.java new file mode 100644 index 0000000000..9d74633519 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/JavaIntrospectionHelper.java @@ -0,0 +1,446 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config; + +import java.lang.reflect.AccessibleObject; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Implements various reflection-related operations + * + * @version $Rev$ $Date$ + */ +public class JavaIntrospectionHelper { + + private static final Class[] EMPTY_CLASS_ARRY = new Class[0]; + + /** + * Hide the constructor + */ + private JavaIntrospectionHelper() { + } + + /** + * Returns a collection of public, private, protected, or default fields declared by a class or one of its + * supertypes + */ + public static Set<Field> getAllFields(Class pClass) { + return getAllFields(pClass, new HashSet<Field>()); + } + + /** + * Recursively evaluates the type hierachy to return all fields on a given type + */ + private static Set<Field> getAllFields(Class pClass, Set<Field> fields) { + if (pClass == null || pClass.isArray() || Object.class.equals(pClass)) { + return fields; + } + fields = getAllFields(pClass.getSuperclass(), fields); + Field[] declaredFields = pClass.getDeclaredFields(); + for (Field field : declaredFields) { + field.setAccessible(true); // ignore Java accessibility + fields.add(field); + } + return fields; + } + + /** + * Returns a collection of public, and protected fields declared by a class or one of its + * supertypes + */ + public static Set<Field> getAllPublicAndProtectedFields(Class clazz) { + return getAllPublicAndProtectedFields(clazz, new HashSet<Field>()); + } + + /** + * Recursively evaluates the type hierachy to return all fields that are public or protected + */ + private static Set<Field> getAllPublicAndProtectedFields(Class clazz, Set<Field> fields) { + if (clazz == null || clazz.isArray() || Object.class.equals(clazz)) { + return fields; + } + fields = getAllPublicAndProtectedFields(clazz.getSuperclass(), fields); + Field[] declaredFields = clazz.getDeclaredFields(); +// fields = new HashSet<Field>(); +// Field[] declaredFields = clazz.getFields(); + for (Field field : declaredFields) { + int modifiers = field.getModifiers(); + if ((Modifier.isPublic(modifiers) || Modifier.isProtected(modifiers)) && !Modifier.isStatic(modifiers)){ + field.setAccessible(true); // ignore Java accessibility + fields.add(field); + } + } + return fields; + } + + /** + * Returns a collection of public, private, protected, or default methods declared by a class or one of + * its supertypes. Note that overriden methods will not be returned in the collection (i.e. only the + * method override will be). <p/> This method can potentially be expensive as reflection information is + * not cached. It is assumed that this method will be used during a configuration phase. + */ + public static Set<Method> getAllUniqueMethods(Class clazz) { + return getAllUniqueMethods(clazz, new HashSet<Method>()); + } + + /** + * Recursively evaluates the type hierarchy to return all unique methods + */ + private static Set<Method> getAllUniqueMethods(Class pClass, Set<Method> methods) { + if (pClass == null || pClass.isArray() || Object.class.equals(pClass)) { + return methods; + } + // we first evaluate methods of the subclass and then move to the parent + Method[] declaredMethods = pClass.getDeclaredMethods(); + for (Method declaredMethod : declaredMethods) { + if (methods.size() == 0) { + methods.add(declaredMethod); + } else { + List<Method> temp = new ArrayList<Method>(); + boolean matched = false; + for (Method method : methods) { + // only add if not already in the set from a supclass (i.e. the + // method is not overrided) + if (exactMethodMatch(declaredMethod, method)) { + matched = true; + break; + } + } + if (!matched) { + // TODO ignore Java accessibility + declaredMethod.setAccessible(true); + temp.add(declaredMethod); + + } + methods.addAll(temp); + temp.clear(); + } + } + // evaluate class hierarchy - this is done last to track inherited methods + methods = getAllUniqueMethods(pClass.getSuperclass(), methods); + return methods; + } + + /** + * Finds the closest matching field with the given name, that is, a field of the exact specified type or, + * alternately, of a supertype. + * + * @param name the name of the field + * @param type the field type + * @param fields the collection of fields to search + * @return the matching field or null if not found + */ + public static Field findClosestMatchingField(String name, Class type, Set<Field> fields) { + Field candidate = null; + for (Field field : fields) { + if (field.getName().equals(name)) { + if (field.getType().equals(type)) { + return field; // exact match + } else if (field.getType().isAssignableFrom(type) + || (field.getType().isPrimitive() && primitiveAssignable(field.getType(), type))) { + // We could have the situation where a field parameter is a primitive and the demarshalled value is + // an object counterpart (e.g. Integer and int) + // @spec issue + // either an interface or super class, so keep a reference until + // we know there are no closer types + candidate = field; + } + } + } + if (candidate != null) { + return candidate; + } else { + return null; + } + } + + /** + * Finds the closest matching method with the given name, that is, a method taking the exact parameter + * types or, alternately, parameter supertypes. + * + * @param name the name of the method + * @param types the method parameter types + * @param methods the collection of methods to search + * @return the matching method or null if not found + */ + public static Method findClosestMatchingMethod(String name, Class[] types, Set<Method> methods) { + if (types == null) { + types = EMPTY_CLASS_ARRY; + } + Method candidate = null; + for (Method method : methods) { + if (method.getName().equals(name) && method.getParameterTypes().length == types.length) { + Class[] params = method.getParameterTypes(); + boolean disqualify = false; + boolean exactMatch = true; + for (int i = 0; i < params.length; i++) { + if (!params[i].equals(types[i]) && !params[i].isAssignableFrom(types[i])) { + // no match + disqualify = true; + exactMatch = false; + break; + } else if (!params[i].equals(types[i]) && params[i].isAssignableFrom(types[i])) { + // not exact match + exactMatch = false; + } + } + if (disqualify) { + continue; + } else if (exactMatch) { + return method; + } else { + candidate = method; + } + } + } + if (candidate != null) { + return candidate; + } else { + return null; + } + } + + /** + * Searches a collection of fields for one that matches by name and has a multiplicity type. i.e. a List + * or Array of interfaces + * + * @return a matching field or null + */ + public static Field findMultiplicityFieldByName(String name, Set<Field> fields) { + for (Field candidate : fields) { + if (candidate.getName().equals(name) + && (List.class.isAssignableFrom(candidate.getType()) || (candidate.getType().isArray() + && candidate.getType().getComponentType() != null && candidate.getType().getComponentType() + .isInterface()))) { + return candidate; + } + } + return null; + } + + /** + * Searches a collection of method for one that matches by name and has single parameter of a multiplicity + * type. i.e. a List or Array of interfaces + * + * @return a matching method or null + */ + public static Method findMultiplicityMethodByName(String name, Set<Method> methods) { + for (Method candidate : methods) { + if (candidate.getName().equals(name) + && candidate.getParameterTypes().length == 1 + && (List.class.isAssignableFrom(candidate.getParameterTypes()[0]) || (candidate.getParameterTypes()[0] + .isArray() + && candidate.getParameterTypes()[0].getComponentType() != null && candidate.getParameterTypes()[0] + .getComponentType().isInterface()))) { + return candidate; + } + } + return null; + } + + /** + * Returns a field or method defined in the given class or its superclasses matching a literal name and + * parameter types <p/> This method can potentially be expensive as reflection information is not cached. + * It is assumed that this method will be used during a configuration phase. + * + * @param clazz the class to introspect + * @param propertName the literal name of the property (i.e. JavaBean conventions are not applied) + * @param paramTypes the parameter types for a method or null for fields or methods with no parameters + * @return the field, method or null + */ + public static AccessibleObject getBeanProperty(Class clazz, String propertName, Class[] paramTypes) { + + Set<Method> methods = getAllUniqueMethods(clazz); + for (Method method : methods) { + if (method.getName().equals(propertName)) { + Class[] types = method.getParameterTypes(); + if (types.length == 0 && paramTypes == null) { + return method; + } else if (types.length != 0 && paramTypes == null) { + break; + } else if (types.length == paramTypes.length) { + for (int n = 0; n < types.length - 1; n++) { + if (!types[n].equals(paramTypes[n]) || !types[n].isAssignableFrom(paramTypes[n])) { + break; + } + } + return method; + } + } + } + + Set<Field> fields = getAllFields(clazz); + for (Field field : fields) { + if (field.getName().equals(propertName)) { + return field; + } + } + return null; + } + + /** + * Determines if two methods "match" - that is, they have the same method names and exact parameter types + * (one is not a supertype of the other) + */ + public static boolean exactMethodMatch(Method method1, Method method2) { + if (!method1.getName().equals(method2.getName())) { + return false; + } + Class[] types1 = method1.getParameterTypes(); + Class[] types2 = method2.getParameterTypes(); + if (types1.length == 0 && types2.length == 0) { + return true; + } else if (types1.length == types2.length) { + for (int n = 0; n < types1.length; n++) { + if (!types1[n].equals(types2[n])) { + return false; + } + } + return true; + } + return false; + } + + public static <T> Constructor<T> getDefaultConstructor(Class<T> clazz) throws NoSuchMethodException { + return clazz.getConstructor((Class[]) null); + } + + /** + * Loads a class corresponding to the class name using the current context class loader. + * + * @throws ClassNotFoundException if the class was not found on the classpath + */ + public static Class loadClass(String pName) throws ClassNotFoundException { + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + return Class.forName(pName, true, loader); + } + + /** + * Returns the simple name of a class - i.e. the class name devoid of its package qualifier + * + * @param implClass + */ + public static String getBaseName(Class<?> implClass) { + String baseName = implClass.getName(); + int lastDot = baseName.lastIndexOf('.'); + if (lastDot != -1) { + baseName = baseName.substring(lastDot + 1); + } + return baseName; + } + + public static boolean isImmutable(Class clazz) { + return (String.class == clazz || clazz.isPrimitive() || Number.class.isAssignableFrom(clazz) + || Boolean.class.isAssignableFrom(clazz) || Character.class.isAssignableFrom(clazz) || Byte.class + .isAssignableFrom(clazz)); + } + + /** + * Takes a property name and converts it to a getter method name according to JavaBean conventions. For + * example, property <code>foo<code> is returned as <code>getFoo</code> + */ + public static String toGetter(String name) { + return "get" + name.toUpperCase().substring(0, 1) + name.substring(1); + } + + /** + * Takes a setter or getter method name and converts it to a property name according to JavaBean + * conventions. For example, <code>setFoo(var)</code> is returned as property <code>foo<code> + */ + public static String toPropertyName(String name) { + return Character.toLowerCase(name.charAt(3)) + name.substring(4); + } + + /** + * Takes a property name and converts it to a setter method name according to JavaBean conventions. For + * example, the property <code>foo<code> is returned as <code>setFoo(var)</code> + */ + public static String toSetter(String name) { + return "set" + name.toUpperCase().substring(0, 1) + name.substring(1); + } + + /** + * Compares a two types, assuming one is a primitive, to determine if the other is its object counterpart + */ + private static boolean primitiveAssignable(Class memberType, Class param) { + if (memberType == Integer.class) { + return (param == Integer.TYPE); + } else if (memberType == Double.class) { + return (param == Double.TYPE); + } else if (memberType == Float.class) { + return (param == Float.TYPE); + } else if (memberType == Short.class) { + return (param == Short.TYPE); + } else if (memberType == Character.class) { + return (param == Character.TYPE); + } else if (memberType == Boolean.class) { + return (param == Boolean.TYPE); + } else if (memberType == Byte.class) { + return (param == Byte.TYPE); + } else if (param == Integer.class) { + return (memberType == Integer.TYPE); + } else if (param == Double.class) { + return (memberType == Double.TYPE); + } else if (param == Float.class) { + return (memberType == Float.TYPE); + } else if (param == Short.class) { + return (memberType == Short.TYPE); + } else if (param == Character.class) { + return (memberType == Character.TYPE); + } else if (param == Boolean.class) { + return (memberType == Boolean.TYPE); + } else if (param == Byte.class) { + return (memberType == Byte.TYPE); + } else { + return false; + } + } + + /** + * Returns the generic types represented in the given type. Usage as follows: + * <p/> + * <code> // to return the generic type of a field: JavaIntrospectionHelper.getGenerics(field.getGenericType()); + * <p/> + * // to return the generic types for the first parameter of a method: JavaIntrospectionHelper.getGenerics(m.getGenericParameterTypes()[0];); + * <p/> + * </code> + * + * @return the generic types in order of declaration or an empty array if the type is not genericized + */ + public static List<? extends Type> getGenerics(Type genericType) { + List<Type> classes = new ArrayList<Type>(); + if (genericType instanceof ParameterizedType) { + ParameterizedType ptype = (ParameterizedType) genericType; + // get the type arguments + Type[] targs = ptype.getActualTypeArguments(); + for (Type targ : targs) { + classes.add(targ); + } + } + return classes; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/MetaDataException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/MetaDataException.java new file mode 100644 index 0000000000..30840a6e15 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/MetaDataException.java @@ -0,0 +1,37 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config; + +/** + * Denotes an error processing component metadata + * + * @version $$Rev$$ $$Date$$ + */ +public class MetaDataException extends ConfigurationLoadException{ + + public MetaDataException() { + } + + public MetaDataException(String message) { + super(message); + } + + public MetaDataException(String message, Throwable cause) { + super(message, cause); + } + + public MetaDataException(Throwable cause) { + super(cause); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/MissingInterfaceException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/MissingInterfaceException.java new file mode 100644 index 0000000000..6164b6a011 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/MissingInterfaceException.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.config; + +/** + * Exception indicating that the interface referenced in an assembly file could not be found. + * + * @version $Rev$ $Date$ + */ +public class MissingInterfaceException extends ConfigurationLoadException { + public MissingInterfaceException() { + } + + public MissingInterfaceException(String message) { + super(message); + } + + public MissingInterfaceException(String message, Throwable cause) { + super(message, cause); + } + + public MissingInterfaceException(Throwable cause) { + super(cause); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/MissingResourceException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/MissingResourceException.java new file mode 100644 index 0000000000..8260dbc8ae --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/MissingResourceException.java @@ -0,0 +1,35 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config; + +/** + * Exception that indicates an expected resource could not be found. + * + * @version $Rev$ $Date$ + */ +public class MissingResourceException extends ConfigurationLoadException { + /** + * Constructor that indicates which resource could not be found. + * The supplied parameter is also returned as the message. + * + * @param resource the resource that could not be found + */ + public MissingResourceException(String resource) { + super(resource); + setResourceURI(resource); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/ModuleComponentConfigurationLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/ModuleComponentConfigurationLoader.java new file mode 100644 index 0000000000..15857441b1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/ModuleComponentConfigurationLoader.java @@ -0,0 +1,75 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config; + +import org.apache.tuscany.model.assembly.ModuleComponent; + +import java.net.URL; +import java.util.Collection; + +/** + * Interface for loading configuration information from some external + * form into a Tuscany logical model. + * + * @version $Rev: 368822 $ $Date: 2006-01-13 10:54:38 -0800 (Fri, 13 Jan 2006) $ + */ +public interface ModuleComponentConfigurationLoader { + + /** + * Load a SCDL module component. + * + * @param name the name of the module component + * @param uri + * @return a new module component definition + * @throws ConfigurationLoadException if there was a problem loading the module component. + */ + ModuleComponent loadModuleComponent(String name, String uri) throws ConfigurationLoadException; + + /** + * Load a System SCDL module component. + * + * @param name the name of the module component + * @param uri + * @return a new module component definition + * @throws ConfigurationLoadException if there was a problem loading the module component. + */ + ModuleComponent loadSystemModuleComponent(String name, String uri) throws ConfigurationLoadException; + + /** + * Load a SCDL module component. + * + * @param name the name of the module component + * @param uri + * @param url + * @return a new module component definition + * @throws ConfigurationLoadException if there was a problem loading the module component. + */ + ModuleComponent loadModuleComponent(String name, String uri, URL url) throws ConfigurationLoadException; + + /** + * Load a SCDL module component. + * + * @param name the name of the module component + * @param uri + * @param url + * @param urls + * @return a new module component definition + * @throws ConfigurationLoadException if there was a problem loading the module component. + */ + ModuleComponent loadModuleComponent(String name, String uri, URL url, Collection<URL> urls) throws ConfigurationLoadException; + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/SidefileLoadException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/SidefileLoadException.java new file mode 100644 index 0000000000..b432d4ea68 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/SidefileLoadException.java @@ -0,0 +1,50 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.config; + +/** + * Exception indicating that there was a problem loading a sidefile. + * + * @version $Rev$ $Date$ + */ +public class SidefileLoadException extends ConfigurationLoadException { + private static final long serialVersionUID = -3530306758412789392L; + private String sidefileURI; + + public SidefileLoadException() { + } + + public SidefileLoadException(String message) { + super(message); + } + + public SidefileLoadException(String message, Throwable cause) { + super(message, cause); + } + + public SidefileLoadException(Throwable cause) { + super(cause); + } + + public String getSidefileURI() { + return sidefileURI; + } + + public void setSidefileURI(String sidefileURI) { + this.sidefileURI = sidefileURI; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/AbstractModuleComponentConfigurationLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/AbstractModuleComponentConfigurationLoader.java new file mode 100644 index 0000000000..a77031b8c5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/AbstractModuleComponentConfigurationLoader.java @@ -0,0 +1,164 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.config.impl; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.ModuleComponentConfigurationLoader; +import org.apache.tuscany.core.config.ComponentTypeIntrospector; +import org.apache.tuscany.core.config.processor.ProcessorUtils; +import org.apache.tuscany.core.system.context.SystemCompositeContextImpl; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.ModuleComponent; +import org.apache.tuscany.model.assembly.ModuleFragment; +import org.apache.tuscany.model.assembly.ComponentType; + +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * @version $Rev$ $Date$ + */ +public abstract class AbstractModuleComponentConfigurationLoader implements ModuleComponentConfigurationLoader { + private static final String SCA_MODULE_FILE_NAME = "sca.module"; + //FIXME can fragments have a variable prefix name? + private static final String SCA_FRAGMENT_FILE_NAME = "sca.fragment"; + private static final String SYSTEM_MODULE_FILE_NAME = "system.module"; + //FIXME can fragments have a variable prefix name? + private static final String SYSTEM_FRAGMENT_FILE_NAME = "system.fragment"; + + protected final AssemblyContext modelContext; + protected final ResourceLoader resourceLoader; + protected final AssemblyFactory assemblyFactory; + + // JFM HACK + private ComponentTypeIntrospector introspector; + + private ComponentType systemType; + + private ComponentType compositeType; + + protected ComponentTypeIntrospector getIntrospector(){ + if (introspector == null){ + introspector = ProcessorUtils.createCoreIntrospector(assemblyFactory); + } + return introspector; + } + + protected ComponentType getSystemCompositeComponentType() throws ConfigurationLoadException { + if (systemType == null){ + systemType = getIntrospector().introspect(SystemCompositeContextImpl.class); + } + return systemType; + } + + protected ComponentType getCompositeComponentType() throws ConfigurationLoadException { + if (compositeType == null){ + compositeType = getIntrospector().introspect(CompositeContextImpl.class); + } + return compositeType; + } + /// JFM HACK + + protected AbstractModuleComponentConfigurationLoader(AssemblyContext modelContext) { + this.modelContext = modelContext; + resourceLoader = modelContext.getApplicationResourceLoader(); + assemblyFactory = modelContext.getAssemblyFactory(); + } + + public ModuleComponent loadSystemModuleComponent(String name, String uri) throws ConfigurationLoadException { + ModuleComponent mc = loadModuleComponent(SYSTEM_MODULE_FILE_NAME, SYSTEM_FRAGMENT_FILE_NAME, name, uri); + //JFM HACK - this is completely gross since it overwrites existing component type + mc.getImplementation().setImplementationClass(SystemCompositeContextImpl.class); + mc.getImplementation().setComponentType(getSystemCompositeComponentType()); + //END HACK + return mc; + } + + public ModuleComponent loadModuleComponent(String name, String uri) throws ConfigurationLoadException { + ModuleComponent mc = loadModuleComponent(SCA_MODULE_FILE_NAME, SCA_FRAGMENT_FILE_NAME, name, uri); + //JFM HACK + mc.getImplementation().setImplementationClass(CompositeContextImpl.class); + mc.getImplementation().setComponentType(getCompositeComponentType()); + //END HACK + return mc; + } + + protected ModuleComponent loadModuleComponent(String moduleFileName, String fragmentFileName, String name, String uri) throws ConfigurationLoadException { + + // Load the sca.module file + URL moduleUrl; + moduleUrl = resourceLoader.getResource(moduleFileName); + + + if (moduleUrl == null) { + throw new ConfigurationLoadException(moduleFileName); + } + + // Load the sca.fragment files + Iterator<URL> i; + try { + i = resourceLoader.getResources(fragmentFileName); + } catch (IOException e) { + throw new ConfigurationLoadException(fragmentFileName, e); + } + List<URL> moduleFragmentUris=new ArrayList<URL>(); + while (i.hasNext()) { + URL url=i.next(); + moduleFragmentUris.add(url); + } + + return loadModuleComponent(name, uri, moduleUrl, moduleFragmentUris); + } + + public ModuleComponent loadModuleComponent(String name, String uri, URL url) throws ConfigurationLoadException { + return loadModuleComponent( name, uri, url, null); + } + + public ModuleComponent loadModuleComponent(String name, String uri, URL moduleUri, Collection<URL> moduleFragmentUris) throws ConfigurationLoadException { + + // Load the module file + Module module=loadModule(moduleUri); + // Load the sca.fragment files + if (moduleFragmentUris!=null) { + for (URL moduleFragmentUri : moduleFragmentUris) { + ModuleFragment moduleFragment=loadModuleFragment(moduleFragmentUri); + module.getModuleFragments().add(moduleFragment); + } + } + + // Create the module component + ModuleComponent moduleComponent=assemblyFactory.createModuleComponent(); + moduleComponent.setName(name); + moduleComponent.setURI(uri); + moduleComponent.setImplementation(module); + moduleComponent.initialize(modelContext); + + return moduleComponent; + } + + public abstract Module loadModule(URL url) throws ConfigurationLoadException; + + public abstract ModuleFragment loadModuleFragment(URL url) throws ConfigurationLoadException; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/Java5ComponentTypeIntrospector.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/Java5ComponentTypeIntrospector.java new file mode 100644 index 0000000000..fdbb6e0942 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/Java5ComponentTypeIntrospector.java @@ -0,0 +1,139 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.impl; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import org.apache.tuscany.core.config.ComponentTypeIntrospector; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.JavaIntrospectionHelper; +import org.apache.tuscany.core.config.processor.ProcessorUtils; +import org.apache.tuscany.core.extension.config.ImplementationProcessor; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.ComponentType; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.ComponentName; + +/** + * Introspects Java annotation-based metata data + * + * @version $Rev$ $Date$ + */ +@org.osoa.sca.annotations.Service(ComponentTypeIntrospector.class) +public class Java5ComponentTypeIntrospector implements ComponentTypeIntrospector { + + private AssemblyFactory factory; + + private List<ImplementationProcessor> processors = new ArrayList<ImplementationProcessor>(); + + public Java5ComponentTypeIntrospector() { + } + + public Java5ComponentTypeIntrospector(AssemblyFactory factory) { + this.factory = factory; + } + + @Autowire + public void setFactory(SystemAssemblyFactory factory) { + this.factory = factory; + //FIXME JFM HACK + List<ImplementationProcessor> processors = ProcessorUtils.createCoreProcessors(factory); + for (ImplementationProcessor processor : processors) { + this.registerProcessor(processor); + } + // END hack + } + + @ComponentName + protected String name; + + @Init(eager = true) + public void init(){ + } + + public void registerProcessor(ImplementationProcessor processor) { + processors.add(processor); + } + + public void unregisterProcessor(ImplementationProcessor processor) { + processors.remove(processor); + } + + /** + * Visits the given implementation type and calls back to {@link org.apache.tuscany.core.extension.config.ImplementationProcessor}s + * registered with this introspector to build up a {@link ComponentType} + * + * @return ComponentType representing the implementation type metadata + * @throws ConfigurationLoadException if there is an error introspecting the implementation type + */ + public ComponentType introspect(Class<?> implClass) throws ConfigurationLoadException { + ComponentType compType = factory.createComponentType(); + return introspect(implClass, compType); + } + + public ComponentType introspect(Class<?> implClass, ComponentType compType) throws ConfigurationLoadException { + for (ImplementationProcessor processor : processors) { + processor.visitClass(implClass, compType); + } + Constructor[] constructors = implClass.getConstructors(); + for (Constructor constructor : constructors) { + for (ImplementationProcessor processor : processors) { + processor.visitConstructor(constructor, compType); + } + } + Method[] methods = implClass.getMethods(); + for (Method method : methods) { + for (ImplementationProcessor processor : processors) { + processor.visitMethod(method, compType); + } + } + Set<Field> fields = JavaIntrospectionHelper.getAllPublicAndProtectedFields(implClass); + for (Field field : fields) { + for (ImplementationProcessor processor : processors) { + processor.visitField(field, compType); + } + } + Class superClass = implClass.getSuperclass(); + if (superClass != null) { + visitSuperClass(superClass, compType); + } + for (ImplementationProcessor processor : processors) { + processor.visitEnd(implClass, compType); + } + return compType; + } + + private void visitSuperClass(Class<?> superClass, ComponentType compType) throws ConfigurationLoadException { + if (!Object.class.equals(superClass)) { + for (ImplementationProcessor processor : processors) { + processor.visitSuperClass(superClass, compType); + } + superClass = superClass.getSuperclass(); + if (superClass != null) { + visitSuperClass(superClass, compType); + } + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/StAXModuleComponentConfigurationLoaderImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/StAXModuleComponentConfigurationLoaderImpl.java new file mode 100644 index 0000000000..3bd6e6361d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/StAXModuleComponentConfigurationLoaderImpl.java @@ -0,0 +1,91 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.impl; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.StAXLoaderRegistry; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.ModuleFragment; + +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import java.io.IOException; +import java.net.URL; + +/** + * @version $Rev$ $Date$ + */ +public class StAXModuleComponentConfigurationLoaderImpl extends AbstractModuleComponentConfigurationLoader { + private final XMLInputFactory xmlFactory; + private final StAXLoaderRegistry registry; + + public StAXModuleComponentConfigurationLoaderImpl(AssemblyContext modelContext, XMLInputFactory xmlFactory, StAXLoaderRegistry registry) { + super(modelContext); + this.xmlFactory = xmlFactory; + this.registry = registry; + } + + public Module loadModule(URL url) throws ConfigurationLoadException { + registry.setContext(modelContext); + try { + XMLStreamReader reader = xmlFactory.createXMLStreamReader(url.openStream()); + getDocumentRoot(reader); + return (Module) registry.load(reader, new LoaderContext(resourceLoader)); + } catch (XMLStreamException e) { + ConfigurationLoadException ce = new ConfigurationLoadException(e); + ce.setResourceURI(url.toString()); + throw ce; + } catch (IOException e) { + ConfigurationLoadException ce = new ConfigurationLoadException(e); + ce.setResourceURI(url.toString()); + throw ce; + } finally { + registry.setContext(null); + } + } + + public ModuleFragment loadModuleFragment(URL url) throws ConfigurationLoadException { + registry.setContext(modelContext); + try { + XMLStreamReader reader = xmlFactory.createXMLStreamReader(url.openStream()); + getDocumentRoot(reader); + return (ModuleFragment) registry.load(reader, new LoaderContext(resourceLoader)); + } catch (XMLStreamException e) { + ConfigurationLoadException ce = new ConfigurationLoadException(e); + ce.setResourceURI(url.toString()); + throw ce; + } catch (IOException e) { + ConfigurationLoadException ce = new ConfigurationLoadException(e); + ce.setResourceURI(url.toString()); + throw ce; + } finally { + registry.setContext(null); + } + } + + private static void getDocumentRoot(XMLStreamReader reader) throws XMLStreamException { + while (true) { + if (reader.next() == XMLStreamConstants.START_ELEMENT) { + return; + } + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ComponentNameProcessor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ComponentNameProcessor.java new file mode 100644 index 0000000000..0314bcc9bf --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ComponentNameProcessor.java @@ -0,0 +1,51 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.processor; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.apache.tuscany.core.extension.config.extensibility.ComponentNameExtensibilityElement; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.ComponentType; +import org.osoa.sca.annotations.ComponentName; + +/** + * Processes the {@link ComponentName} annotation + * + * @version $$Rev$$ $$Date$$ + */ +public class ComponentNameProcessor extends ImplementationProcessorSupport { + + public ComponentNameProcessor(AssemblyFactory factory) { + super(factory); + } + + public void visitMethod(Method method, ComponentType type) throws ConfigurationLoadException { + ComponentName name = method.getAnnotation(ComponentName.class); + if (name == null) { + return; + } + type.getExtensibilityElements().add(new ComponentNameExtensibilityElement(method)); + } + + public void visitField(Field field, ComponentType type) throws ConfigurationLoadException { + ComponentName name = field.getAnnotation(ComponentName.class); + if (name == null) { + return; + } + type.getExtensibilityElements().add(new ComponentNameExtensibilityElement(field)); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ContextProcessor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ContextProcessor.java new file mode 100644 index 0000000000..ff5c3736b7 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ContextProcessor.java @@ -0,0 +1,50 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.processor; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.extension.config.extensibility.ContextExtensibilityElement; +import org.apache.tuscany.model.assembly.ComponentType; +import org.osoa.sca.annotations.Context; + +/** + * Processes the {@link org.osoa.sca.annotations.Context} annotation + * + * @version $$Rev$$ $$Date$$ + */ +public class ContextProcessor extends ImplementationProcessorSupport { + + public ContextProcessor() { + } + + public void visitMethod(Method method, ComponentType type) throws ConfigurationLoadException { + Context context = method.getAnnotation(Context.class); + if (context == null) { + return; + } + type.getExtensibilityElements().add(new ContextExtensibilityElement(method)); + } + + public void visitField(Field field, ComponentType type) throws ConfigurationLoadException { + Context context = field.getAnnotation(Context.class); + if (context == null) { + return; + } + type.getExtensibilityElements().add(new ContextExtensibilityElement(field)); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/DefaultProcessor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/DefaultProcessor.java new file mode 100644 index 0000000000..8445526dc8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/DefaultProcessor.java @@ -0,0 +1,112 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.processor; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.List; +import java.util.Set; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.JavaIntrospectionHelper; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Property; +import org.apache.tuscany.model.assembly.Reference; + +/** + * Adds public methods and public/protected fields as properties that are not declared explicitly with an + * {@link org.osoa.sca.annotations.Property} or {@link org.osoa.sca.annotations.Reference} annotation + * + * @version $$Rev$$ $$Date$$ + */ +public class DefaultProcessor extends ImplementationProcessorSupport { + + public DefaultProcessor(AssemblyFactory factory) { + super(factory); + } + + public DefaultProcessor() { + } + + public void visitEnd(Class<?> clazz, ComponentType type) throws ConfigurationLoadException { + // add any public/protected fields and public setter methods as properties + Set<Field> fields = JavaIntrospectionHelper.getAllPublicAndProtectedFields(clazz); + List<Property> properties = type.getProperties(); + List<Reference> references = type.getReferences(); + boolean contains; + Method[] methods = clazz.getMethods(); + String name; + for (Method method : methods) { + if (Object.class.equals(method.getDeclaringClass()) || method.getParameterTypes().length != 1 + || method.isAnnotationPresent(org.osoa.sca.annotations.Property.class) + || method.isAnnotationPresent(org.osoa.sca.annotations.Reference.class)) { + continue; + } + contains = containsProperty(properties, method.getName()); + if (contains) { + continue; + } + name = method.getName(); + if (name.length() > 3 && name.startsWith("set")) { + // follow JavaBeans conventions + name = JavaIntrospectionHelper.toPropertyName(name); + } + contains = containsReference(references, name); + if (!contains) { + addProperty(name, method.getParameterTypes()[0], type); + } + } + for (Field field : fields) { + if (field.isAnnotationPresent(org.osoa.sca.annotations.Property.class) + || field.isAnnotationPresent(org.osoa.sca.annotations.Reference.class)) { + continue; + } + contains = containsProperty(properties, field.getName()); + if (contains) { + continue; + } + contains = containsReference(references, field.getName()); + if (!contains) { + addProperty(field.getName(), field.getType(), type); + } + } + } + + private boolean containsProperty(List<Property> properties, String name) { + for (Property prop : properties) { + if (prop.getName().equals(name)) { + return true; + } + } + return false; + } + + private boolean containsReference(List<Reference> references, String name) { + for (Reference ref : references) { + if (ref.getName().equals(name)) { + return true; + } + } + return false; + } + + private void addProperty(String name, Class<?> propType, ComponentType type) { + Property property = factory.createProperty(); + property.setName(name); + property.setRequired(false); + property.setType(propType); + type.getProperties().add(property); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/DestroyProcessor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/DestroyProcessor.java new file mode 100644 index 0000000000..a16845bbf8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/DestroyProcessor.java @@ -0,0 +1,47 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.processor; + +import java.lang.reflect.Method; + +import org.apache.tuscany.core.extension.config.extensibility.DestroyInvokerExtensibilityElement; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.ComponentType; +import org.osoa.sca.annotations.Destroy; + +/** + * Processes a {@link Destroy} + * + * @version $$Rev$$ $$Date$$ + */ +public class DestroyProcessor extends ImplementationProcessorSupport { + + public DestroyProcessor() { + } + + public void visitMethod(Method method, ComponentType type) throws ConfigurationLoadException { + Destroy destroy = method.getAnnotation(Destroy.class); + if (destroy == null) { + return; + } + if (method.getParameterTypes().length != 0) { + throw new ConfigurationLoadException("Destroy methods cannot take parameters"); + } + type.getExtensibilityElements().add(new DestroyInvokerExtensibilityElement(method)); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ImplementationProcessorSupport.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ImplementationProcessorSupport.java new file mode 100644 index 0000000000..175de28a92 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ImplementationProcessorSupport.java @@ -0,0 +1,107 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.processor; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.apache.tuscany.core.config.ComponentTypeIntrospector; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.extension.config.ImplementationProcessor; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.ComponentType; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Scope; + +/** + * A base implementation of an <code>ImplementationProcessor</code> + * + * @version $$Rev$$ $$Date$$ + */ +@Scope("MODULE") +public abstract class ImplementationProcessorSupport implements ImplementationProcessor { + + protected ComponentTypeIntrospector introspector; + protected AssemblyFactory factory; + + protected ImplementationProcessorSupport(AssemblyFactory factory) { + this.factory = factory; + } + + protected ImplementationProcessorSupport() { + } + + @Init(eager = true) + public void init() throws Exception { + introspector.registerProcessor(this); + } + + @Autowire + public void setIntrospector(ComponentTypeIntrospector introspector) { + this.introspector = introspector; + } + + @Autowire + public void setFactory(AssemblyFactory factory) { + this.factory = factory; + + } + + public void visitClass(Class<?> clazz, ComponentType type) throws ConfigurationLoadException { + + } + + public void visitSuperClass(Class<?> clazz, ComponentType type) throws ConfigurationLoadException { + + } + + public void visitMethod(Method method, ComponentType type) throws ConfigurationLoadException { + + } + + public void visitConstructor(Constructor<?> constructor, ComponentType type) throws ConfigurationLoadException { + + } + + public void visitField(Field field, ComponentType type) throws ConfigurationLoadException { + + } + + public void visitInterface(Class clazz, Annotation[] annotations, ComponentType type) throws ConfigurationLoadException { + + } + + public void visitInterfaceMethod(Method method, Annotation[] annotations, ComponentType type) throws ConfigurationLoadException { + + } + + public void visitEnd(Class<?> clazz, ComponentType type) throws ConfigurationLoadException { + + } + +// /** +// * Creates a {@link JavaExtensibilityElement} subclasses may update while processing annotations +// */ +// protected JavaExtensibilityElement getExtensibilityElement(ComponentType type) { +// JavaExtensibilityElement element = (JavaExtensibilityElement) type.getExtensibilityElements().get(JAVA_ELEMENT); +// if (element == null) { +// element = new JavaExtensibilityElementImpl(); +// type.getExtensibilityElements().put(JAVA_ELEMENT, element); +// } +// return element; +// } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/InitProcessor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/InitProcessor.java new file mode 100644 index 0000000000..9f4a53a651 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/InitProcessor.java @@ -0,0 +1,43 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.processor; + +import java.lang.reflect.Method; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.extension.config.extensibility.InitInvokerExtensibilityElement; +import org.apache.tuscany.model.assembly.ComponentType; +import org.osoa.sca.annotations.Init; + +/** + * Processes the {@link org.osoa.sca.annotations.Init} annotation + * + * @version $$Rev$$ $$Date$$ + */ +public class InitProcessor extends ImplementationProcessorSupport { + + public InitProcessor() { + } + + public void visitMethod(Method method, ComponentType type) throws ConfigurationLoadException { + Init init = method.getAnnotation(Init.class); + if (init == null) { + return; + } + if (method.getParameterTypes().length != 0) { + throw new ConfigurationLoadException("Initialize methods cannot take parameters"); + } + type.getExtensibilityElements().add(new InitInvokerExtensibilityElement(method, init.eager())); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ProcessorHelper.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ProcessorHelper.java new file mode 100644 index 0000000000..d4c6c4a40e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ProcessorHelper.java @@ -0,0 +1,59 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.processor; + +import java.util.List; + +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.Service; + +/** + * Provides utility functions for {@link org.apache.tuscany.core.extension.config.ImplementationProcessor}s + * + * @version $$Rev$$ $$Date$$ + */ +public class ProcessorHelper { + + private ProcessorHelper() { + } + + /** + * Returns the first <code>Service</code> from a collection matching the interface type + */ + public static Service getService(Class<?> interfaceType, List<Service> services) { + for (Service service : services) { + Class serviceInterface = service.getServiceContract().getInterface(); + if (serviceInterface.equals(interfaceType)) { + return service; + } + } + return null; + } + + /** + * Returns the scope enum specified by the annotation + */ + public static Scope getScope(org.osoa.sca.annotations.Scope annotation) { + if ("MODULE".equalsIgnoreCase(annotation.value())) { + return Scope.MODULE; + } else if ("SESSION".equalsIgnoreCase(annotation.value())) { + return Scope.SESSION; + } else if ("REQUEST".equalsIgnoreCase(annotation.value())) { + return Scope.REQUEST; + } else { + return Scope.INSTANCE; + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ProcessorUtils.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ProcessorUtils.java new file mode 100644 index 0000000000..b0400c183f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ProcessorUtils.java @@ -0,0 +1,65 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.processor; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.tuscany.core.extension.config.ImplementationProcessor; +import org.apache.tuscany.core.system.config.processor.AutowireProcessor; +import org.apache.tuscany.core.system.config.processor.MonitorProcessor; +import org.apache.tuscany.core.system.config.processor.ParentContextProcessor; +import org.apache.tuscany.core.config.ComponentTypeIntrospector; +import org.apache.tuscany.core.config.impl.Java5ComponentTypeIntrospector; +import org.apache.tuscany.core.sdo.helper.SDOHelperProcessor; +import org.apache.tuscany.model.assembly.AssemblyFactory; + +/** + * Temporary class to create bootstrap {@link ImplementationProcessor}s + * + * @version $$Rev$$ $$Date$$ + */ +public class ProcessorUtils { + + private ProcessorUtils() { + } + + public static List<ImplementationProcessor> createCoreProcessors(AssemblyFactory factory) { + List<ImplementationProcessor> processors = new ArrayList<ImplementationProcessor>(); + processors.add(new PropertyProcessor(factory)); + processors.add(new ReferenceProcessor(factory)); + processors.add(new ScopeProcessor()); + processors.add(new ServiceProcessor(factory)); + processors.add(new InitProcessor()); + processors.add(new DestroyProcessor()); + processors.add(new ContextProcessor()); + processors.add(new ComponentNameProcessor(factory)); + processors.add(new DefaultProcessor(factory)); + processors.add(new AutowireProcessor()); + processors.add(new MonitorProcessor()); + processors.add(new ParentContextProcessor()); + processors.add(new SDOHelperProcessor()); + return processors; + } + + public static ComponentTypeIntrospector createCoreIntrospector(AssemblyFactory factory){ + ComponentTypeIntrospector introspector = new Java5ComponentTypeIntrospector(factory); + List<ImplementationProcessor> processors = createCoreProcessors(factory); + for (ImplementationProcessor processor : processors) { + introspector.registerProcessor(processor); + } + return introspector; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/PropertyProcessor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/PropertyProcessor.java new file mode 100644 index 0000000000..9191b75793 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/PropertyProcessor.java @@ -0,0 +1,104 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.processor; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.InvalidSetterException; +import org.apache.tuscany.core.config.JavaIntrospectionHelper; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Property; +import org.osoa.sca.annotations.Scope; + +/** + * Processes the {@link org.osoa.sca.annotations.Property} annotation + * + * @version $$Rev$$ $$Date$$ + */ +@Scope("MODULE") +public class PropertyProcessor extends ImplementationProcessorSupport { + + public PropertyProcessor(AssemblyFactory factory) { + super(factory); + } + + public PropertyProcessor() { + } + + @Override + public void visitMethod(Method method, ComponentType type) throws ConfigurationLoadException { + if (method.getDeclaringClass().equals(Object.class)) { + return; + } + org.osoa.sca.annotations.Property annotation = method.getAnnotation(org.osoa.sca.annotations.Property.class); + if (annotation != null) { + if (!Modifier.isPublic(method.getModifiers())) { + InvalidSetterException e = new InvalidSetterException("Property setter method is not public"); + e.setIdentifier(method.toString()); + throw e; + } + Class<?>[] params = method.getParameterTypes(); + if (params.length != 1) { + InvalidSetterException e = new InvalidSetterException("Property setter method must have one parameter"); + e.setIdentifier(method.toString()); + throw e; + } + String name = annotation.name(); + if (name.length() == 0) { + name = method.getName(); + if (name.length() > 3 && name.startsWith("set")) { + // follow JavaBeans conventions + name = JavaIntrospectionHelper.toPropertyName(name); + } + } + addProperty(name, method.getParameterTypes()[0], annotation.required(), type); + } + + + } + + @Override + public void visitField(Field field, ComponentType type) throws ConfigurationLoadException { + if (field.getDeclaringClass().equals(Object.class)) { + return; + } + int modifiers = field.getModifiers(); + org.osoa.sca.annotations.Property annotation = field.getAnnotation(org.osoa.sca.annotations.Property.class); + if (annotation != null) { + if (!Modifier.isPublic(modifiers) && !Modifier.isProtected(modifiers)) { + InvalidSetterException e = new InvalidSetterException("Property field is not public or protected"); + e.setIdentifier(field.getName()); + throw e; + } + String name = annotation.name(); + if (name.length() == 0) { + name = field.getName(); + } + addProperty(name, field.getType(), annotation.required(), type); + } + } + + private void addProperty(String name, Class<?> propType, boolean required, ComponentType type) { + Property property = factory.createProperty(); + property.setName(name); + property.setRequired(required); + property.setType(propType); + type.getProperties().add(property); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/PropertyReferenceValidator.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/PropertyReferenceValidator.java new file mode 100644 index 0000000000..bc8ef02777 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/PropertyReferenceValidator.java @@ -0,0 +1,80 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.processor; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.lang.reflect.Field; +import java.util.Set; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.MetaDataException; +import org.apache.tuscany.core.config.JavaIntrospectionHelper; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.ComponentType; +import org.osoa.sca.annotations.Property; +import org.osoa.sca.annotations.Reference; + +/** + * Validates the use of {@link org.osoa.sca.annotations.Property} and {@link + * org.osoa.sca.annotations.Reference} annotations beyond native Java syntactic capabilities + * + * @version $$Rev$$ $$Date$$ + */ +public class PropertyReferenceValidator extends ImplementationProcessorSupport { + + public PropertyReferenceValidator(AssemblyFactory factory) { + super(factory); + } + + public void visitEnd(Class<?> clazz, ComponentType type) throws ConfigurationLoadException { + // validate methods do not contain both @Reference and @Property annotations + Method[] methods = clazz.getMethods(); + boolean found; + for (Method method : methods) { + found = false; + Annotation[] anotations = method.getAnnotations(); + for (Annotation annotation : anotations) { + if (Property.class.equals(annotation.annotationType()) + || Reference.class.equals(annotation.annotationType())) { + if (found) { + MetaDataException e = new MetaDataException("Method cannot specify both property and reference"); + e.setIdentifier(method.getName()); + throw e; + } + found = true; + } + } + } + // validate fields do not contain both @Reference and @Property annotations + Set<Field> fields = JavaIntrospectionHelper.getAllPublicAndProtectedFields(clazz); + for (Field field : fields) { + found = false; + Annotation[] anotations = field.getAnnotations(); + for (Annotation annotation : anotations) { + if (Property.class.equals(annotation.annotationType()) + || Reference.class.equals(annotation.annotationType())) { + if (found) { + MetaDataException e = new MetaDataException("Field cannot specify both property and reference"); + e.setIdentifier(field.getName()); + throw e; + } + found = true; + } + } + } + + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ReferenceProcessor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ReferenceProcessor.java new file mode 100644 index 0000000000..007410b500 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ReferenceProcessor.java @@ -0,0 +1,119 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.processor; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Collection; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.InvalidSetterException; +import org.apache.tuscany.core.config.JavaIntrospectionHelper; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Multiplicity; +import org.apache.tuscany.model.assembly.Reference; +import org.apache.tuscany.model.assembly.ServiceContract; +import org.osoa.sca.annotations.Scope; + +/** + * Processes the {@link org.osoa.sca.annotations.Reference} annotation + * + * @version $$Rev$$ $$Date$$ + */ +@Scope("MODULE") +public class ReferenceProcessor extends ImplementationProcessorSupport { + + public ReferenceProcessor() { + } + + public ReferenceProcessor(AssemblyFactory factory) { + super(factory); + } + + @Override + public void visitMethod(Method method, ComponentType type) throws ConfigurationLoadException { + if(method.getDeclaringClass().equals(Object.class)){ + return; + } + int modifiers = method.getModifiers(); + org.osoa.sca.annotations.Reference annotation = method.getAnnotation(org.osoa.sca.annotations.Reference.class); + if (annotation != null) { + if (!Modifier.isPublic(modifiers)) { + InvalidSetterException e = new InvalidSetterException("Reference setter method is not public"); + e.setIdentifier(method.getName()); + throw e; + } + if (!Void.TYPE.equals(method.getReturnType())) { + InvalidSetterException e = new InvalidSetterException("Refence setter method must return void"); + e.setIdentifier(method.toString()); + throw e; + } + Class<?>[] params = method.getParameterTypes(); + if (params.length != 1) { + InvalidSetterException e = new InvalidSetterException("Reference setter method must have one parameter"); + e.setIdentifier(method.toString()); + throw e; + } + String name = annotation.name(); + if (name.length() == 0) { + name = method.getName(); + if (name.length() > 3 && name.startsWith("set")) { + // follow JavaBeans conventions + name = JavaIntrospectionHelper.toPropertyName(name); + } + } + addReference(name, params[0], annotation.required(), type); + } + } + + @Override + public void visitField(Field field, ComponentType type) throws ConfigurationLoadException { + if(field.getDeclaringClass().equals(Object.class)){ + return; + } + int modifiers = field.getModifiers(); + org.osoa.sca.annotations.Reference annotation = field.getAnnotation(org.osoa.sca.annotations.Reference.class); + if (annotation != null) { + if (!Modifier.isPublic(modifiers) && !Modifier.isProtected(modifiers)) { + InvalidSetterException e = new InvalidSetterException("Reference field is not public or protected"); + e.setIdentifier(field.getName()); + throw e; + } + String name = annotation.name(); + if (name.length() == 0) { + name = field.getName(); + } + addReference(name, field.getType(), annotation.required(), type); + } + } + + private void addReference(String name, Class<?> paramType, boolean required, ComponentType type) { + Reference reference = factory.createReference(); + reference.setName(name); + ServiceContract contract = factory.createJavaServiceContract(); + contract.setInterface(paramType); + reference.setServiceContract(contract); + boolean many = paramType.isArray() || Collection.class.isAssignableFrom(paramType); + Multiplicity multiplicity; + if (required) + multiplicity = many ? Multiplicity.ONE_N : Multiplicity.ONE_ONE; + else + multiplicity = many ? Multiplicity.ZERO_N : Multiplicity.ZERO_ONE; + reference.setMultiplicity(multiplicity); + type.getReferences().add(reference); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ScopeProcessor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ScopeProcessor.java new file mode 100644 index 0000000000..e81430115a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ScopeProcessor.java @@ -0,0 +1,74 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.processor; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.Service; + +/** + * Processes the {@link org.osoa.sca.annotations.Scope} annotation + * + * @version $$Rev$$ $$Date$$ + */ +public class ScopeProcessor extends ImplementationProcessorSupport { + + public ScopeProcessor() { + } + + @Override + public void visitEnd(Class<?> clazz, ComponentType type) throws ConfigurationLoadException { + Scope scope = null; + org.osoa.sca.annotations.Scope annotation = clazz.getAnnotation(org.osoa.sca.annotations.Scope.class); + if (annotation != null) { + scope = ProcessorHelper.getScope(annotation); + } else { + Class<?> superClass = clazz.getSuperclass(); + if (superClass != null) { + scope = recurseScope(superClass); + } + } + if (scope == null) { + scope = Scope.INSTANCE; + } + //FIXME hack for now - set scope to implementation scope + //This will be clean up with spec change + for (Service service : type.getServices()) { + Scope serviceScope = service.getServiceContract().getScope(); + if (serviceScope == Scope.INSTANCE || serviceScope == null) { + service.getServiceContract().setScope(scope); + } + } + + } + + /** + * Walks the class hierarchy until a scope annotation is found + */ + private Scope recurseScope(Class<?> superClass) { + if (Object.class.equals(superClass)) { + return null; + } + org.osoa.sca.annotations.Scope scope = superClass.getAnnotation(org.osoa.sca.annotations.Scope.class); + if (scope == null) { + superClass = superClass.getSuperclass(); + if (superClass != null) { + return recurseScope(superClass); + } + } + return ProcessorHelper.getScope(scope); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ServiceProcessor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ServiceProcessor.java new file mode 100644 index 0000000000..2c7ba823f2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/config/processor/ServiceProcessor.java @@ -0,0 +1,129 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.processor; + +import java.util.List; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.InvalidMetaDataException; +import org.apache.tuscany.core.config.JavaIntrospectionHelper; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.types.java.JavaServiceContract; +import org.osoa.sca.annotations.Callback; + +/** + * Processes the {@link org.osoa.sca.annotations.Service} annotation + * + * @version $$Rev$$ $$Date$$ + */ +public class ServiceProcessor extends ImplementationProcessorSupport { + + public ServiceProcessor() { + } + + public ServiceProcessor(AssemblyFactory factory) { + super(factory); + } + + @Override + public void visitClass(Class<?> clazz, ComponentType type) throws ConfigurationLoadException { + if (!clazz.isInterface()) { + processImplementation(clazz,type); + } else { + processInterface(clazz, type); + } + } + + private void processImplementation(Class<?> clazz, ComponentType type) throws ConfigurationLoadException { + // visiting the base implementation class + List<org.apache.tuscany.model.assembly.Service> services = type.getServices(); + Class[] interfaces = clazz.getInterfaces(); + org.osoa.sca.annotations.Service serviceAnnotation = clazz.getAnnotation(org.osoa.sca.annotations.Service.class); + if (interfaces.length == 0) { + // no interfaces so the class is the service + addService(services, clazz); + } else if (serviceAnnotation == null && interfaces.length == 1) { + // the impl has one interface, assign it to be the service + addService(services, interfaces[0]); + } else { + // visiting the implementation class + if (serviceAnnotation == null) { + return; + } + Class<?>[] serviceInterfaces = serviceAnnotation.interfaces(); + Class<?> value = serviceAnnotation.value(); + if (serviceInterfaces.length > 0) { + if (!Void.class.equals(value)) { + InvalidMetaDataException e = new InvalidMetaDataException("Both interfaces and value specified in @Service on "); + e.setIdentifier(clazz.getName()); + throw e; + } + for (Class<?> intf : interfaces) { + addService(services, intf); + } + } else if (!Void.class.equals(value)) { + addService(services, value); + } + } + } + + + @Override + public void visitEnd(Class<?> clazz, ComponentType type) throws ConfigurationLoadException { + List<Service> services = type.getServices(); + if (services.size() == 0) { + // no services processed so the class is the service + addService(services, clazz); + } + } + + private void processInterface(Class<?> clazz, ComponentType type) { + List<org.apache.tuscany.model.assembly.Service> services = type.getServices(); + // the interface is a remotable service, add it + org.osoa.sca.annotations.Remotable remotableAnnotation = clazz.getAnnotation(org.osoa.sca.annotations.Remotable.class); + if (remotableAnnotation != null) { + // check to see if service added previously b/c it was specified on @Service + if (ProcessorHelper.getService(clazz, services) == null) { + addService(services, clazz); + } + } + } + + + private void addService(List<Service> services, Class<?> serviceClass) { + //FIXME how do we support specifying remotable? + JavaServiceContract javaInterface = factory.createJavaServiceContract(); + javaInterface.setInterface(serviceClass); + org.osoa.sca.annotations.Scope scopeAnnotation = serviceClass.getAnnotation(org.osoa.sca.annotations.Scope.class); + Scope scope; + if (scopeAnnotation == null) { + scope = Scope.INSTANCE; + } else { + scope = ProcessorHelper.getScope(scopeAnnotation); + } + javaInterface.setScope(scope); + Callback callback = serviceClass.getAnnotation(Callback.class); + if (callback != null && !Void.class.equals(callback.value())) { + javaInterface.setCallbackInterface(callback.value()); + } + String name = JavaIntrospectionHelper.getBaseName(serviceClass); + Service service = factory.createService(); + service.setName(name); + service.setServiceContract(javaInterface); + services.add(service); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/AtomicContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/AtomicContext.java new file mode 100644 index 0000000000..7d4b990ab5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/AtomicContext.java @@ -0,0 +1,55 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +/** + * A runtime entity that manages an atomic (i.e. leaf-type) artifact. + * + * @version $Rev$ $Date$ + */ +public interface AtomicContext extends Context { + + /** + * Returns whether the context should be eagerly initialized + */ + public boolean isEagerInit(); + + /** + * Notifies the context of an initialization event + * @throws TargetException + */ + public void init() throws TargetException; + + /** + * Notifies the context of a destroy event + * @throws TargetException + */ + public void destroy() throws TargetException; + + /** + * Returns whether the context should be called back when its scope ends + */ + public boolean isDestroyable(); + + /** + * Returns the target instance associated with the context. A target instance is the actual + * object a request is dispatched to sans proxy wire chain. + * @throws TargetException + */ + public Object getTargetInstance() throws TargetException; + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/AutowireContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/AutowireContext.java new file mode 100644 index 0000000000..7fa459e76d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/AutowireContext.java @@ -0,0 +1,47 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +/** + * A specialization of a CompositeContext that is able to automatically resolve references + * for its children using EntryPoint or Service interfaces exposed by it or, recursively, any + * of it parents. + * + * @version $Rev$ $Date$ + */ +public interface AutowireContext extends CompositeContext { + + /** + * Invoked by child contexts to return an an autowire target. Resolved targets may be entry points or + * components in the parent or its ancestors, or entry points in a sibling context + * + * @param instanceInterface the type of service being requested + * @return a reference to the requested service or null if none can be found + * @throws AutowireResolutionException if an error occurs attempting to resolve an autowire + */ + <T> T resolveInstance(Class<T> instanceInterface) throws AutowireResolutionException; + + /** + * Invoked by a parent context to return an autowire target in a child. Resolved targets must be entry points. + * For example, given a parent P and two siblings, A and B, A would request an autowire by invoking + * {@link #resolveInstance(Class<T>)} on P, which in turn could invoke the present method on B in order to resolve + * a target. + * + * @param instanceInterface the type of service being requested + * @return a reference to the requested service or null if none can be found + * @throws AutowireResolutionException if an error occurs attempting to resolve an autowire + */ + <T> T resolveExternalInstance(Class<T> instanceInterface) throws AutowireResolutionException; + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/AutowireResolutionException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/AutowireResolutionException.java new file mode 100644 index 0000000000..4da4206a94 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/AutowireResolutionException.java @@ -0,0 +1,40 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +/** + * Denotes an exception while resolving an automatic wire + * + * @version $Rev$ $Date$ + */ +public class AutowireResolutionException extends TargetException { + + public AutowireResolutionException() { + super(); + } + + public AutowireResolutionException(String message) { + super(message); + } + + public AutowireResolutionException(String message, Throwable cause) { + super(message, cause); + } + + public AutowireResolutionException(Throwable cause) { + super(cause); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/CompositeContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/CompositeContext.java new file mode 100644 index 0000000000..abd23feb38 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/CompositeContext.java @@ -0,0 +1,91 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +import org.apache.tuscany.core.config.ConfigurationException; +import org.apache.tuscany.model.assembly.Composite; +import org.apache.tuscany.model.assembly.Part; +import org.apache.tuscany.model.assembly.Extensible; +import org.apache.tuscany.model.assembly.AssemblyContext; + +import java.util.List; + +/** + * A context which contains child component contexts. + * + * @version $Rev$ $Date$ + */ +public interface CompositeContext extends Context { + + public String getURI(); + + public void setURI(String uri); + + /** + * TODO remove this method + * @deprecated + */ + public void setAssemblyContext(AssemblyContext context); + + /** + * Returns the parent context, or null if the context does not have one + */ + public CompositeContext getParent(); + + /** + * Sets the parent context + */ + public void setParent(CompositeContext parent); + + /** + * Adds runtime artifacts represented by the set of model objects to the composite context by merging them with + * existing artifacts. Implementing classes may support only a subset of {@link Part} types. + * + * @see org.apache.tuscany.model.assembly.Component + * @see org.apache.tuscany.model.assembly.ModuleComponent + * @see org.apache.tuscany.model.assembly.AtomicComponent + * @see org.apache.tuscany.model.assembly.EntryPoint + * @see org.apache.tuscany.model.assembly.ExternalService + */ + public void registerModelObjects(List<? extends Extensible> models) throws ConfigurationException; + + /** + * Adds a runtime artifact represented by the model object to the composite context by merging it with existing + * artifacts. Implementing classes may support only a subset of {@link Part} types. + * + * @see org.apache.tuscany.model.assembly.Component + * @see org.apache.tuscany.model.assembly.ModuleComponent + * @see org.apache.tuscany.model.assembly.AtomicComponent + * @see org.apache.tuscany.model.assembly.EntryPoint + * @see org.apache.tuscany.model.assembly.ExternalService + */ + public void registerModelObject(Extensible model) throws ConfigurationException; + + /** + * Returns the child context associated with a given name + */ + public Context getContext(String name); + + /** + * Returns the composite managed by this composite context + */ + @Deprecated + public Composite getComposite(); + + public void removeContext(String name); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ConfigurationContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ConfigurationContext.java new file mode 100644 index 0000000000..558de7609f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ConfigurationContext.java @@ -0,0 +1,30 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.builder.WireBuilder; + +/** + * Offers configuration services in the runtime. A ConfigurationContext is able to configure a model and then buildSource the + * runtime representation corresponding to that model in the live system. + * <p> + * Configuration contexts will typically be hierarchical, delegating to their parent <b>after</b> performing an + * operation. The parent ConfigurationContext will typically be injected into an implementation of this interface during + * registration. + * + * @version $Rev$ $Date$ + */ +public interface ConfigurationContext extends ContextFactoryBuilder, WireBuilder { +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/Context.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/Context.java new file mode 100644 index 0000000000..df313d8000 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/Context.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +/** + * An entity that provides an execution context for a runtime artifact or artifacts. A <code>Context</code> may + * be a composite, managing child contexts or it may be an atomic, i.e. leaf, context. + * + * @version $Rev$ $Date$ + */ +public interface Context extends EventPublisher, Lifecycle { + /** + * Returns the instance associated with the requested name, which may be in a atomic or composite form. Atomic (i.e. + * leaf) contexts will return an instance associated with the service name part of the compound name, which may be + * null. + * <p/> + * Composite contexts will return an instance (likely a proxy) of a contained entry point context. In this case, the + * port name on the qualified name will correspond to the composite context name and the part name will be used to + * retrieve the contained entry point context. The latter may be null. If the contained context is not an entry + * point context, an exception will be thrown. + * + * @param qName a qualified name of the requested instance + * @return the implementation instance or a proxy to it + * @throws TargetException + * if an error occurs retrieving the instance or the requested component is not an entry + * point. + * @see CompositeContext + * @see org.apache.tuscany.model.assembly.EntryPoint + */ + public Object getInstance(QualifiedName qName) throws TargetException; + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ContextInitException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ContextInitException.java new file mode 100644 index 0000000000..e024a98b0e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ContextInitException.java @@ -0,0 +1,43 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +/** + * Denotes an error encountered while initializing an instance context + * + * @version $Rev$ $Date$ + */ +public class ContextInitException extends ContextRuntimeException { + + public ContextInitException() { + super(); + } + + public ContextInitException(String message) { + super(message); + } + + public ContextInitException(String message, Throwable cause) { + super(message, cause); + } + + public ContextInitException(Throwable cause) { + super(cause); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ContextRuntimeException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ContextRuntimeException.java new file mode 100644 index 0000000000..0d35f145dc --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ContextRuntimeException.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +/** + * An unchecked exception encountered by an {@link org.apache.tuscany.core.context.Context} + * + * @version $Rev$ $Date$ + */ +public class ContextRuntimeException extends CoreRuntimeException { + + public ContextRuntimeException() { + super(); + } + + public ContextRuntimeException(String message) { + super(message); + } + + public ContextRuntimeException(String message, Throwable cause) { + super(message, cause); + } + + public ContextRuntimeException(Throwable cause) { + super(cause); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/CoreRuntimeException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/CoreRuntimeException.java new file mode 100644 index 0000000000..63e6f18e99 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/CoreRuntimeException.java @@ -0,0 +1,43 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +import org.apache.tuscany.common.TuscanyRuntimeException; + +/** + * The root exception for the runtime package. Exceptions occurring in the runtime are generally non-recoverable + * + * @version $Rev$ $Date$ + */ +public abstract class CoreRuntimeException extends TuscanyRuntimeException { + + public CoreRuntimeException() { + super(); + } + + public CoreRuntimeException(String message) { + super(message); + } + + public CoreRuntimeException(String message, Throwable cause) { + super(message, cause); + } + + public CoreRuntimeException(Throwable cause) { + super(cause); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/DuplicateNameException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/DuplicateNameException.java new file mode 100644 index 0000000000..81a334d3c8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/DuplicateNameException.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +/** + * Denotes an attempt to add a context with a name equal to an existing context + * + * @version $Rev$ $Date$ + */ +public class DuplicateNameException extends ContextRuntimeException { + + public DuplicateNameException() { + super(); + } + + public DuplicateNameException(String message) { + super(message); + } + + public DuplicateNameException(String message, Throwable cause) { + super(message, cause); + } + + public DuplicateNameException(Throwable cause) { + super(cause); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/EntryPointContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/EntryPointContext.java new file mode 100644 index 0000000000..63feabc43c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/EntryPointContext.java @@ -0,0 +1,69 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +import org.apache.tuscany.core.wire.SourceWireFactory; + +/** + * The runtime artifact representing an entry point, <code>EntryPointContext</code> manages wire handler + * instances that expose service operations offered by a component in the parent composite. The wire handler + * instance is responsible for dispatching the request down an wire chain to the target instance. The wire + * chain may contain {@link org.apache.tuscany.core.wire.Interceptor}s and + * {@link org.apache.tuscany.core.wire.MessageHandler}s that implement policies or perform mediations on the + * wire. + * <p> + * Entry point contexts are used by transport binding artifacts to invoke an operation on a service. The transport + * binding uses an {@link java.lang.reflect.InvocationHandler} instance obtained from the <code>EntryPointContext</code> + * to perform the wire as in: + * + * <pre> + * CompositeContext compositeContext = ... + * EntryPointContext ctx = (EntryPointContext) compositeContext.getContext("source"); + * Assert.assertNotNull(ctx); + * InvocationHandler handler = (InvocationHandler) ctx.getHandler(); + * Object response = handler.invoke(null, operation, new Object[] { param }); + * </pre> + * + * The <code>Proxy</code> instance passed to <code>InvocationHandler</code> may be null as the client is invoking + * directly on the handler. + * <p> + * Alternatively, the following will return a proxy implementing the service interface exposed by the entry point: + * + * <pre> + * CompositeContext compositeContext = ... + * EntryPointContext ctx = (EntryPointContext) compositeContext.getContext("source"); + * Assert.assertNotNull(ctx); + * HelloWorld proxy = (Helloworld) ctx.getInstance(null); // service name not necessary + * </pre> + * + * The proxy returned will be backed by the entry point wire chain. + * + * @version $Rev$ $Date$ + */ +public interface EntryPointContext extends Context { + + /** + * Returns the handler responsible for flowing a request through the entry point + * @throws TargetException + */ + public Object getHandler() throws TargetException; + + /** + * Returns the service interface configured for the entry poitn + */ + public Class getServiceInterface(); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/EventContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/EventContext.java new file mode 100644 index 0000000000..36b0f98928 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/EventContext.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +/** + * Implementations are responsible for tracking scope keys associated with the current request. + * + * @version $Rev$ $Date$ + */ +public interface EventContext { + + /** + * Returns the unique key for the given identifier associated with the current request + */ + public Object getIdentifier(Object type); + + /** + * Sets the unique key for the given identifier associated with the current request + */ + public void setIdentifier(Object type, Object identifier); + + /** + * Clears the unique key for the given identifier associated with the current request + */ + public void clearIdentifier(Object type); + + /** + * Clears all identifiers associated with the current request + */ + public void clearIdentifiers(); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/EventException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/EventException.java new file mode 100644 index 0000000000..aaf26aee69 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/EventException.java @@ -0,0 +1,43 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +/** + * Denotes an error encountered while firing a module event + * + * @version $Rev$ $Date$ + */ +public class EventException extends CoreRuntimeException { + + public EventException(String message, Throwable cause) { + super(message, cause); + } + + public EventException(String message) { + super(message); + } + + public EventException(Throwable cause) { + super(cause); + } + + public EventException() { + super(); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/EventFilter.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/EventFilter.java new file mode 100644 index 0000000000..ee1334bef2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/EventFilter.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +import org.apache.tuscany.core.context.event.Event; + +import java.util.EventObject; + +/** + * Evaluates whether a {@link RuntimeEventListener} is applicable to a given runtime event + * + * @version $$Rev$$ $$Date$$ + */ +public interface EventFilter { + + /** + * Performs the actual evaluation on an event + */ + public boolean match(Event event); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/EventPublisher.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/EventPublisher.java new file mode 100644 index 0000000000..c7ccf88e25 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/EventPublisher.java @@ -0,0 +1,44 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +import org.apache.tuscany.core.context.event.Event; + +/** + * Publishes events in the runtime + * + * @version $$Rev$$ $$Date$$ + */ +public interface EventPublisher { + + public void publish(Event object); + + /** + * Registers a listener to receive notifications for the context + */ + public void addListener(RuntimeEventListener listener); + + /** + * Registers a listener to receive notifications for the context + */ + public void addListener(EventFilter filter, RuntimeEventListener listener); + + + /** + * Removes a previously registered listener + */ + public void removeListener(RuntimeEventListener listener); + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ExternalServiceContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ExternalServiceContext.java new file mode 100644 index 0000000000..f7b4a6c572 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ExternalServiceContext.java @@ -0,0 +1,30 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +/** + * Manages an external service + * + * @version $Rev$ $Date$ + */ +public interface ExternalServiceContext extends Context { + + /** + * Returns the handler responsible for flowing a request through the external service + * @throws TargetException + */ + public Object getHandler() throws TargetException; + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/InvalidNameException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/InvalidNameException.java new file mode 100644 index 0000000000..65c709e569 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/InvalidNameException.java @@ -0,0 +1,43 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +/** + * Denotes an invalid name + * + * @version $Rev$ $Date$ + */ +public class InvalidNameException extends ContextRuntimeException { + + public InvalidNameException() { + super(); + } + + public InvalidNameException(String message) { + super(message); + } + + public InvalidNameException(String message, Throwable cause) { + super(message, cause); + } + + public InvalidNameException(Throwable cause) { + super(cause); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/Lifecycle.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/Lifecycle.java new file mode 100644 index 0000000000..6572841cf0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/Lifecycle.java @@ -0,0 +1,79 @@ +/** + * + * Copyright 2006 The Apache Software Foundation or its licensors as applicable + * + * Licensed 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.core.context; + +/** + * @version $Rev$ $Date$ + */ +public interface Lifecycle { + /* A configuration error state */ + int CONFIG_ERROR = -1; + /* Has not been initialized */ + int UNINITIALIZED = 0; + /* In the process of being configured and initialized */ + int INITIALIZING = 1; + /* Instantiated and configured */ + int INITIALIZED = 2; + /* Started */ + int STARTED = 4; + /* Configured and initialized */ + int RUNNING = 4; + /* In the process of being shutdown */ + int STOPPING = 5; + /* Has been shutdown and removed from the module */ + int STOPPED = 6; + /* In an error state */ + int ERROR = 7; + + /** + * Returns the lifecycle state + * + * @see #UNINITIALIZED + * @see #INITIALIZING + * @see #INITIALIZED + * @see #RUNNING + * @see #STOPPING + * @see #STOPPED + */ + int getLifecycleState(); + + /** + * Starts the Lifecycle. + * + * @throws CoreRuntimeException + */ + void start() throws CoreRuntimeException; + + /** + * Stops the Lifecycle. + * + * @throws CoreRuntimeException + */ + void stop() throws CoreRuntimeException; + + /** + * Returns the name of the Lifecycle. + * @return the name of the Lifecycle + */ + String getName(); + + /** + * Sets the name of the Lifecycle. + * @param name the name of the Lifecycle + */ + void setName(String name); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/MissingContextFactoryException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/MissingContextFactoryException.java new file mode 100644 index 0000000000..fd4d613e34 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/MissingContextFactoryException.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.context; + +import org.apache.tuscany.core.config.ConfigurationException; + +/** + * + * @version $Rev$ $Date$ + */ +public class MissingContextFactoryException extends ConfigurationException { + private static final long serialVersionUID = 5140433835245354247L; + + public MissingContextFactoryException() { + } + + public MissingContextFactoryException(String message) { + super(message); + } + + public MissingContextFactoryException(String message, Throwable cause) { + super(message, cause); + } + + public MissingContextFactoryException(Throwable cause) { + super(cause); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/MissingImplementationException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/MissingImplementationException.java new file mode 100644 index 0000000000..787e9cae20 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/MissingImplementationException.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.context; + +import org.apache.tuscany.core.config.ConfigurationException; + +/** + * + * @version $Rev$ $Date$ + */ +public class MissingImplementationException extends ConfigurationException { + private static final long serialVersionUID = 7274481740916067128L; + + public MissingImplementationException() { + } + + public MissingImplementationException(String message) { + super(message); + } + + public MissingImplementationException(String message, Throwable cause) { + super(message, cause); + } + + public MissingImplementationException(Throwable cause) { + super(cause); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/MissingScopeException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/MissingScopeException.java new file mode 100644 index 0000000000..53108e6e6b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/MissingScopeException.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.context; + +import org.apache.tuscany.core.config.ConfigurationException; + +/** + * + * @version $Rev$ $Date$ + */ +public class MissingScopeException extends ConfigurationException { + private static final long serialVersionUID = -6999184494724096056L; + + public MissingScopeException() { + } + + public MissingScopeException(String message) { + super(message); + } + + public MissingScopeException(String message, Throwable cause) { + super(message, cause); + } + + public MissingScopeException(Throwable cause) { + super(cause); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ProxyConfigurationException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ProxyConfigurationException.java new file mode 100644 index 0000000000..2d15118c1c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ProxyConfigurationException.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.context; + +import org.apache.tuscany.core.config.ConfigurationException; + +/** + * + * @version $Rev$ $Date$ + */ +public class ProxyConfigurationException extends ConfigurationException { + private static final long serialVersionUID = -5860342620108741058L; + + public ProxyConfigurationException() { + } + + public ProxyConfigurationException(String message) { + super(message); + } + + public ProxyConfigurationException(String message, Throwable cause) { + super(message, cause); + } + + public ProxyConfigurationException(Throwable cause) { + super(cause); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/QualifiedName.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/QualifiedName.java new file mode 100644 index 0000000000..a9a0baeff9 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/QualifiedName.java @@ -0,0 +1,84 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +/** + * An evaluated name consisting of a part/port pair. In the runtime, a part generally 'contains' or 'provides' ports + * such as a module component/entry point or a component/service pair. + * + * @version $Rev$ $Date$ + */ +public class QualifiedName { + + private String qName; + + private String partName; + + private String portName; + + public static final String NAME_SEPARATOR = "/"; + + /** + * Constructs a new qualified name in the form of part/port where part is the parent context and port represents a + * child, which is either a service in the case of an atomic context or a contained context in the case of a composite. + * + * @throws InvalidNameException if the name is in an invalid format + */ + public QualifiedName(String qualifiedName) throws InvalidNameException { + if (qualifiedName == null){ + return; + } + int pos = qualifiedName.indexOf(QualifiedName.NAME_SEPARATOR); + switch (pos) { + case -1: + partName = qualifiedName; + break; + case 0: + throw new InvalidNameException(qualifiedName); + default: + partName = qualifiedName.substring(0, pos); + portName = qualifiedName.substring(pos + 1); + break; + } + qName = qualifiedName; + } + + /** + * Returns the parsed part name + */ + public String getPartName() { + return partName; + } + + /** + * Returns the parsed port name if the original is of the compound for part/port + */ + public String getPortName() { + return portName; + } + + /** + * Returns the full part/port name pair + */ + public String getQualifiedName() { + return qName; + } + + public String toString() { + return qName; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/RuntimeEventListener.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/RuntimeEventListener.java new file mode 100644 index 0000000000..89cc51f3fc --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/RuntimeEventListener.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +import org.apache.tuscany.core.context.event.Event; + +import java.util.EventListener; +import java.util.EventObject; + +/** + * Listeners observe events fired in the SCA runtime. + * + * @version $Rev$ $Date$ + */ +public interface RuntimeEventListener extends EventListener { + + public void onEvent(Event event); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeAwareContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeAwareContext.java new file mode 100644 index 0000000000..d57d59cb58 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeAwareContext.java @@ -0,0 +1,31 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +import org.apache.tuscany.model.assembly.Scope; + +import java.util.Map; + +/** + * Denotes a composite context that supports scopes + * + * @version $Rev$ $Date$ + */ +public interface ScopeAwareContext extends CompositeContext { + + /** + * Returns an immutable collection of scopes keyed by type for the composite context + */ + public Map<Scope, ScopeContext> getScopeContexts(); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeContext.java new file mode 100644 index 0000000000..c582bde2b4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeContext.java @@ -0,0 +1,74 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +import org.apache.tuscany.core.builder.ContextFactory; + +import java.util.List; + +/** + * Manages the lifecycle and visibility of <code>Context</code>s. + * + * @see org.apache.tuscany.core.context.Context + * + * @version $Rev$ $Date$ + */ +public interface ScopeContext extends Lifecycle, RuntimeEventListener { + + public Object getInstance(QualifiedName qName) throws TargetException; + + /** + * Returns whether implementation instances may be held for the duration of an wire + */ + public boolean isCacheable(); + + /** + * Registers the context factory used to construct instance contexts for the scope + */ + public void registerFactories(List<ContextFactory<Context>> configurations); + + /** + * Adds a context factory to the scope + */ + public void registerFactory(ContextFactory<Context> configuration); + + /** + * Returns a context bound to the given name or null if the component does not exist. The returned context is bound + * to a key determined from the thread context. + */ + public Context getContext(String name); + + /** + * Returns a context bound to the given name and scoped to the given key or null if the context does not exist + */ + public Context getContextByKey(String name, Object key); + + /** + * Removes a context with the given name, determining the scope key from the thread context + * + * @throws ScopeRuntimeException + */ + public void removeContext(String name) throws ScopeRuntimeException; + + /** + * Removes a context bound to the given name and scope key + * + * @throws ScopeRuntimeException + */ + public void removeContextByKey(String name, Object key) throws ScopeRuntimeException; + +}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeIdentifier.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeIdentifier.java new file mode 100644 index 0000000000..d25477f71c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeIdentifier.java @@ -0,0 +1,33 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +/** + * Implementations enable lazy retrieval of a scope id associated with a request, i.e. an id (and presumably a context) do not + * have to be generated if the scope is never accessed. Identifiers are associated with the current request thread and keyed on + * scope type. + * + * @version $Rev$ $Date$ + * @see org.apache.tuscany.core.context.EventContext + */ +public interface ScopeIdentifier { + + /** + * Returns the scope id for the request. + */ + public Object getIdentifier(); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeInitializationException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeInitializationException.java new file mode 100644 index 0000000000..6ef5bfe9dd --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeInitializationException.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +/** + * Denotes an initialization exception thrown by a scope container + * + * @version $Rev$ $Date$ + */ +public class ScopeInitializationException extends ScopeRuntimeException { + + public ScopeInitializationException() { + super(); + } + + public ScopeInitializationException(String message) { + super(message); + } + + public ScopeInitializationException(String message, Throwable cause) { + super(message, cause); + } + + public ScopeInitializationException(Throwable cause) { + super(cause); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeRuntimeException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeRuntimeException.java new file mode 100644 index 0000000000..5022f7589d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeRuntimeException.java @@ -0,0 +1,43 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +/** + * Denotes a general runtime exception encountered by a scope container + * + * @version $Rev$ $Date$ + */ +public class ScopeRuntimeException extends CoreRuntimeException { + + public ScopeRuntimeException() { + super(); + } + + public ScopeRuntimeException(String message) { + super(message); + } + + public ScopeRuntimeException(String message, Throwable cause) { + super(message, cause); + } + + public ScopeRuntimeException(Throwable cause) { + super(cause); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeStrategy.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeStrategy.java new file mode 100644 index 0000000000..c01df8ff9e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ScopeStrategy.java @@ -0,0 +1,43 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +import org.apache.tuscany.model.assembly.Scope; + +import java.util.Map; + +/** + * Implementations provide scope container creation facilities and scope semantics to the runtime + * + * @version $Rev$ $Date$ + */ +public interface ScopeStrategy { + + /* Denotes an undefined scope */ + public static final int SCOPE_NOT_FOUND = -3; + + /** + * Creates and returns new instances of configured scope containers + */ + public Map<Scope, ScopeContext> getScopeContexts(EventContext eventContext); + + /** + * Determines whether a wire proceeds from a source of higher scope to a target of lesser scope + */ + public boolean downScopeReference(Scope sourceScope, Scope targetScope); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ServiceNotFoundException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ServiceNotFoundException.java new file mode 100644 index 0000000000..ee8c9f91b8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/ServiceNotFoundException.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +import org.osoa.sca.ServiceRuntimeException; + +/** + * Denotes the specific case where a service was not found at runtime + * + * @version $Rev$ $Date$ + */ +public class ServiceNotFoundException extends ServiceRuntimeException { + + public ServiceNotFoundException() { + super(); + } + + public ServiceNotFoundException(String message) { + super(message); + } + + public ServiceNotFoundException(Throwable cause) { + super(cause); + } + + public ServiceNotFoundException(String message, Throwable cause) { + super(message, cause); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/SystemCompositeContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/SystemCompositeContext.java new file mode 100644 index 0000000000..7e3b4b8045 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/SystemCompositeContext.java @@ -0,0 +1,37 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +import org.apache.tuscany.core.config.ConfigurationException; + +/** + * Marker type for system composite contexts + * + * @version $Rev$ $Date$ + */ +public interface SystemCompositeContext extends AutowireContext, ScopeAwareContext, ConfigurationContext { + + /** + * Register a simple Java Object as a system component. + * This is primarily intended for use by bootstrap code to create the initial + * configuration components. + * + * @param name the name of the resulting component + * @param service + * @param instance the Object that will become the component's implementation + * @throws ConfigurationException + */ + void registerJavaObject(String name, Class<?> service, Object instance) throws ConfigurationException; +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/TargetException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/TargetException.java new file mode 100644 index 0000000000..dd39d06aa1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/TargetException.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +/** + * Denotes an error while performing an operation on a target component implementation instance or proxy + * + * @version $Rev$ $Date$ + */ +public class TargetException extends CoreRuntimeException { + + public TargetException() { + super(); + } + + public TargetException(String message) { + super(message); + } + + public TargetException(String message, Throwable cause) { + super(message, cause); + } + + public TargetException(Throwable cause) { + super(cause); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/AbstractEvent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/AbstractEvent.java new file mode 100644 index 0000000000..cef0c25a63 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/AbstractEvent.java @@ -0,0 +1,33 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + +/** + * A basic implementation of a runtime event + * + * @version $$Rev$$ $$Date$$ + */ +public abstract class AbstractEvent implements Event{ + + protected transient Object source; + + public AbstractEvent(Object source) { + assert (source !=null): "Source id was null"; + this.source = source; + } + + public Object getSource() { + return source; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/AbstractRequestEvent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/AbstractRequestEvent.java new file mode 100644 index 0000000000..c038f141b5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/AbstractRequestEvent.java @@ -0,0 +1,43 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + +/** + * Base implementation of a request event + * + * @version $$Rev$$ $$Date$$ + */ +public abstract class AbstractRequestEvent extends AbstractEvent implements RequestEvent { + + private Object id; + + /** + * Creates a new event + * @param source the source of the event + * @param id the id of the request associated with the event + */ + public AbstractRequestEvent(Object source, Object id) { + super(source); + assert (id !=null): "Request id was null"; + this.id = id; + } + + public Object getId(){ + return id; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/Event.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/Event.java new file mode 100644 index 0000000000..5b370b8c73 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/Event.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + +/** + * Represents an event that is propagated in the runtime + * + * @version $$Rev$$ $$Date$$ + */ +public interface Event { + + /** + * Returns the source of the event + */ + public Object getSource(); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionBound.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionBound.java new file mode 100644 index 0000000000..8af7042ad3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionBound.java @@ -0,0 +1,33 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + + +/** + * An event propagated when an HTTP session is bound to the current request + * + * @version $$Rev$$ $$Date$$ + */ +public class HttpSessionBound extends HttpSessionEvent implements SessionBound { + + /** + * Creates a new event + * @param source the source of the event + * @param id the id of the HTTP session associated with the event or possibly a lazy wrapper + */ + public HttpSessionBound(Object source, Object id) { + super(source,id); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEnd.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEnd.java new file mode 100644 index 0000000000..3b2aff1353 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEnd.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + +/** + * Propagated when an HTTP-based session is expired + * + * @version $$Rev$$ $$Date$$ + */ +public class HttpSessionEnd extends HttpSessionEvent implements SessionEnd { + + /** + * Creates a new event + * @param source the source of the event + * @param id the id of the HTTP session being ended + */ + public HttpSessionEnd(Object source, Object id) { + super(source,id); + } + + } diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEvent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEvent.java new file mode 100644 index 0000000000..ecfbefa808 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/HttpSessionEvent.java @@ -0,0 +1,47 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + +/** + * A base implementation of HTTP-based session events in the runtime + * + * @version $$Rev$$ $$Date$$ + */ +public abstract class HttpSessionEvent implements SessionEvent { + + // FIXME this needs to be made private and not directly referenced in the runtime + public static final Object HTTP_IDENTIFIER = new Object(); + + private Object id; + protected transient Object source; + + public HttpSessionEvent(Object source, Object id) { + assert (source !=null): "Source id was null"; + assert (id !=null): "Session id was null"; + this.source = source; + this.id = id; + } + + public Object getSource() { + return source; + } + + public Object getId(){ + return id; + } + + public Object getSessionTypeIdentifier(){ + return HTTP_IDENTIFIER; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/InstanceCreated.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/InstanceCreated.java new file mode 100644 index 0000000000..d157b4b1e1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/InstanceCreated.java @@ -0,0 +1,27 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + +/** + * An event propagated upon the creation of an instance belonging to a {@link org.apache.tuscany.core.context.Context} + * + * @version $$Rev$$ $$Date$$ + */ +public class InstanceCreated extends AbstractEvent { + + public InstanceCreated(Object source) { + super(source); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/ModuleEvent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/ModuleEvent.java new file mode 100644 index 0000000000..48de538048 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/ModuleEvent.java @@ -0,0 +1,23 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + +/** + * Implemented by runtime events associated with a module, e.g. lifecycle events + * + * @version $$Rev$$ $$Date$$ + */ +public interface ModuleEvent extends Event{ + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/ModuleStart.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/ModuleStart.java new file mode 100644 index 0000000000..d953ddd65f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/ModuleStart.java @@ -0,0 +1,26 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + +/** + * Propagated when a module starts + * + * @version $$Rev$$ $$Date$$ + */ +public class ModuleStart extends AbstractEvent implements ModuleEvent { + + public ModuleStart(Object source) { + super(source); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/ModuleStop.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/ModuleStop.java new file mode 100644 index 0000000000..fb3c31bdff --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/ModuleStop.java @@ -0,0 +1,29 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + +/** + * Propagated when a module stops + * + * @version $$Rev$$ $$Date$$ + */ +public class ModuleStop extends AbstractEvent implements ModuleEvent{ + + public ModuleStop(Object source) { + super(source); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/RequestEnd.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/RequestEnd.java new file mode 100644 index 0000000000..1cbe024be3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/RequestEnd.java @@ -0,0 +1,33 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + +/** + * Propagated when a request completes or is ended + * + * @version $$Rev$$ $$Date$$ + */ +public class RequestEnd extends AbstractRequestEvent{ + + /** + * Creates a new event + * @param source the source of the event + * @param id the id of the completed/ended request + */ + public RequestEnd(Object source, Object id) { + super(source,id); + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/RequestEvent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/RequestEvent.java new file mode 100644 index 0000000000..0b7e1b8005 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/RequestEvent.java @@ -0,0 +1,26 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + +/** + * Implemented by runtime events associated request + * @version $$Rev$$ $$Date$$ + */ +public interface RequestEvent { + + /** + * Returns the id of the request the event is associated with + */ + public Object getId(); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/RequestStart.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/RequestStart.java new file mode 100644 index 0000000000..8c07a3d607 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/RequestStart.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + +/** + * Propagated when a request is started in the runtime + * + * @version $$Rev$$ $$Date$$ + */ +public class RequestStart extends AbstractRequestEvent { + + /** + * Creates a new event + * @param source the source of the event + * @param id the id of the request being started + */ + public RequestStart(Object source, Object id) { + super(source,id); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionBound.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionBound.java new file mode 100644 index 0000000000..5d977911be --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionBound.java @@ -0,0 +1,23 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + +/** + * Propagated when a generic session is associated with the current request. + * + * @version $$Rev$$ $$Date$$ + */ +public interface SessionBound extends SessionEvent { + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionEnd.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionEnd.java new file mode 100644 index 0000000000..809d63bd0f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionEnd.java @@ -0,0 +1,23 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + +/** + * Propagated when a session ended or expired + * + * @version $$Rev$$ $$Date$$ + */ +public interface SessionEnd extends SessionEvent{ + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionEvent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionEvent.java new file mode 100644 index 0000000000..7eaff1de24 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionEvent.java @@ -0,0 +1,34 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + +/** + * Implemented by runtime events associated with a session. There may be multiple session types in the runtime such as + * HTTP-based or conversational. + * + * @version $$Rev$$ $$Date$$ + */ +public interface SessionEvent extends Event { + + /** + * Returns the unique key identifying the session type the event is associated with, e.g. an HTTP-based or conversational + * session + */ + public Object getSessionTypeIdentifier(); + + /** + * Returns the session id associated with the event + */ + public Object getId(); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionStart.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionStart.java new file mode 100644 index 0000000000..cfe490e2ff --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/event/SessionStart.java @@ -0,0 +1,26 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.event; + +/** + * Propagated when a session starts + * + * @version $$Rev$$ $$Date$$ + */ +public interface SessionStart extends SessionEvent{ + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/filter/TrueFilter.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/filter/TrueFilter.java new file mode 100644 index 0000000000..35601646f2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/filter/TrueFilter.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.filter; + +import org.apache.tuscany.core.context.EventFilter; +import org.apache.tuscany.core.context.event.Event; + +/** + * An event filter that always returns a true condition + * + * @version $$Rev$$ $$Date$$ + */ +public class TrueFilter implements EventFilter { + + public boolean match(Event event) { + return true; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/AbstractCompositeContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/AbstractCompositeContext.java new file mode 100644 index 0000000000..c9e563302c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/AbstractCompositeContext.java @@ -0,0 +1,852 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.impl; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import org.apache.tuscany.common.TuscanyRuntimeException; +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.config.ConfigurationException; +import org.apache.tuscany.core.context.AutowireContext; +import org.apache.tuscany.core.context.AutowireResolutionException; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.ConfigurationContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.ContextInitException; +import org.apache.tuscany.core.context.CoreRuntimeException; +import org.apache.tuscany.core.context.DuplicateNameException; +import org.apache.tuscany.core.context.EntryPointContext; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.EventException; +import org.apache.tuscany.core.context.Lifecycle; +import org.apache.tuscany.core.context.MissingContextFactoryException; +import org.apache.tuscany.core.context.MissingImplementationException; +import org.apache.tuscany.core.context.MissingScopeException; +import org.apache.tuscany.core.context.ProxyConfigurationException; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ScopeAwareContext; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.context.ScopeStrategy; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.context.event.Event; +import org.apache.tuscany.core.context.event.RequestEnd; +import org.apache.tuscany.core.context.event.SessionBound; +import org.apache.tuscany.core.context.event.SessionEvent; +import org.apache.tuscany.core.context.scope.DefaultScopeStrategy; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.system.annotation.ParentContext; +import org.apache.tuscany.core.system.assembly.SystemBinding; +import org.apache.tuscany.core.wire.InvocationConfiguration; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.WireConfiguration; +import org.apache.tuscany.core.wire.WireFactory; +import org.apache.tuscany.core.wire.WireFactoryInitException; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.Binding; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.Composite; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.Extensible; +import org.apache.tuscany.model.assembly.ExternalService; +import org.apache.tuscany.model.assembly.Implementation; +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.ModuleComponent; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.impl.AssemblyFactoryImpl; + +/** + * The base implementation of a composite context + * + * @version $Rev$ $Date$ + */ +@SuppressWarnings({"FieldAccessedSynchronizedAndUnsynchronized", "RawUseOfParameterizedType", "NonPrivateFieldAccessedInSynchronizedContext"}) +public abstract class AbstractCompositeContext extends AbstractContext implements AutowireContext, ScopeAwareContext, ConfigurationContext { + + public static final int DEFAULT_WAIT = 1000 * 60; + + protected AssemblyContext assemblyContext; + + protected CompositeContext parentContext; + + // The parent configuration context, if one exists + @Autowire + protected ConfigurationContext configurationContext; + + // The logical model representing the module assembly + // protected ModuleComponent moduleComponent; + protected Module module; + + protected Map<String, ContextFactory<Context>> configurations = new HashMap<String, ContextFactory<Context>>(); + + // Factory for scope contexts + protected ScopeStrategy scopeStrategy; + + // The event context for associating context events to threads + protected EventContext eventContext; + + // The scopes for this context + protected Map<Scope, ScopeContext> scopeContexts; + + protected Map<Scope, ScopeContext> immutableScopeContexts; + + // A component context name to scope context index + protected Map<String, ScopeContext> scopeIndex; + + // Blocking latch to ensure the module is initialized exactly once prior to servicing requests + protected CountDownLatch initializeLatch = new CountDownLatch(1); + + protected final Object lock = new Object(); + + // Indicates whether the module context has been initialized + protected boolean initialized; + + // a mapping of service type to component name + private final Map<Class, NameToScope> autowireInternal = new ConcurrentHashMap<Class, NameToScope>(); + private final Map<Class, NameToScope> autowireExternal = new ConcurrentHashMap<Class, NameToScope>(); + + private AutowireContext autowireContext; + + public AbstractCompositeContext() { + scopeIndex = new ConcurrentHashMap<String, ScopeContext>(); + // FIXME the factory should be injected + module = new AssemblyFactoryImpl().createModule(); + scopeStrategy = new DefaultScopeStrategy(); + } + + public AbstractCompositeContext(String name, CompositeContext parent, ScopeStrategy strategy, EventContext ctx, ConfigurationContext configCtx) { + super(name); + if (strategy == null) { + strategy = new DefaultScopeStrategy(); + } + this.scopeStrategy = strategy; + this.eventContext = ctx; + this.configurationContext = configCtx; + scopeIndex = new ConcurrentHashMap<String, ScopeContext>(); + parentContext = parent; + // FIXME the factory should be injected + module = new AssemblyFactoryImpl().createModule(); + } + + public void setAssemblyContext(AssemblyContext assemblyContext) { + this.assemblyContext = assemblyContext; + } + + private String uri; + + public String getURI() { + return uri; + } + + public void setURI(String uri) { + this.uri = uri; + } + + + public void start() { + synchronized (lock) { + try { + if (lifecycleState == STOPPED) { + throw new IllegalStateException("Context cannot be restarted - create a new one"); + } else if (lifecycleState != UNINITIALIZED) { + throw new IllegalStateException("Context not in UNINITIALIZED state"); + } + + lifecycleState = INITIALIZING; + initializeScopes(); + + Map<Scope, List<ContextFactory<Context>>> configurationsByScope = new EnumMap<Scope, List<ContextFactory<Context>>>(Scope.class); + if (configurations != null) { + for (ContextFactory<Context> contextFactory : configurations.values()) { + // FIXME scopes are defined at the interface level + Scope sourceScope = contextFactory.getScope(); + wireSource(contextFactory); + buildTarget(contextFactory); + scopeIndex.put(contextFactory.getName(), scopeContexts.get(sourceScope)); + List<ContextFactory<Context>> list = configurationsByScope.get(sourceScope); + if (list == null) { + list = new ArrayList<ContextFactory<Context>>(); + configurationsByScope.put(sourceScope, list); + } + list.add(contextFactory); + } + } + for (EntryPoint ep : module.getEntryPoints()) { + registerAutowire(ep); + } + for (Component component : module.getComponents()) { + if (component instanceof ModuleComponent) { + registerAutowire((ModuleComponent) component); + } else { + registerAutowire(component); + } + } + for (ExternalService es : module.getExternalServices()) { + registerAutowire(es); + } + for (Map.Entry<Scope, List<ContextFactory<Context>>> entries : configurationsByScope.entrySet()) + { + // register configurations with scope contexts + ScopeContext scope = scopeContexts.get(entries.getKey()); + scope.registerFactories(entries.getValue()); + } + initializeWireFactories(); + for (ScopeContext scope : scopeContexts.values()) { + // register scope contexts as a listeners for events in the composite context + addListener(scope); + scope.start(); + } + lifecycleState = RUNNING; + } catch (WireFactoryInitException e) { + lifecycleState = ERROR; + ContextInitException cie = new ContextInitException(e); + cie.addContextName(getName()); + throw cie; + } catch (CoreRuntimeException e) { + lifecycleState = ERROR; + e.addContextName(getName()); + throw e; + } finally { + initialized = true; + // release the latch and allow requests to be processed + initializeLatch.countDown(); + } + } + } + + public void stop() { + if (lifecycleState == STOPPED) { + return; + } + // need to block a start until reset is complete + initializeLatch = new CountDownLatch(1); //xcv + lifecycleState = STOPPING; + initialized = false; + if (scopeContexts != null) { + for (ScopeContext scopeContext : scopeContexts.values()) { + if (scopeContext.getLifecycleState() == Lifecycle.RUNNING) { + scopeContext.stop(); + } + } + } + scopeContexts = null; + scopeIndex.clear(); + // allow initialized to be called + initializeLatch.countDown(); + lifecycleState = STOPPED; + + } + + public void setModule(Module module) { + assert (module != null) : "Module cannot be null"; + name = module.getName(); + this.module = module; + } + + public void setEventContext(EventContext eventContext) { + this.eventContext = eventContext; + } + + public void setConfigurationContext(ConfigurationContext context) { + this.configurationContext = context; + } + + public CompositeContext getParent() { + return parentContext; + } + + @ParentContext + public void setParent(CompositeContext parent) { + parentContext = parent; + } + + public void registerModelObjects(List<? extends Extensible> models) throws ConfigurationException { + assert (models != null) : "Model object collection was null"; + for (Extensible model : models) { + registerModelObject(model); + } + } + + public void registerModelObject(Extensible model) throws ConfigurationException { + assert (model != null) : "Model object was null"; + initializeScopes(); + if (configurationContext != null) { + try { + configurationContext.build(model); + } catch (BuilderConfigException e) { + e.addContextName(getName()); + throw e; + } + } + ContextFactory<Context> configuration; + if (model instanceof Module) { + // merge new module definition with the existing one + Module oldModule = module; + Module newModule = (Module) model; + module = newModule; + for (Component component : newModule.getComponents()) { + Implementation componentImplementation = component.getImplementation(); + if (componentImplementation == null) { + ConfigurationException e = new MissingImplementationException("Component implementation not set"); + e.addContextName(component.getName()); + e.addContextName(getName()); + throw e; + } + configuration = (ContextFactory<Context>) component.getContextFactory(); + if (configuration == null) { + ConfigurationException e = new MissingContextFactoryException("Context factory not set"); + e.addContextName(component.getName()); + e.addContextName(getName()); + throw e; + } + registerConfiguration(configuration); + if (component instanceof ModuleComponent) { + registerAutowire((ModuleComponent) component); + } else { + registerAutowire(component); + } + } + for (EntryPoint ep : newModule.getEntryPoints()) { + configuration = (ContextFactory<Context>) ep.getContextFactory(); + if (configuration == null) { + ConfigurationException e = new MissingContextFactoryException("Context factory not set"); + e.setIdentifier(ep.getName()); + e.addContextName(getName()); + throw e; + } + registerConfiguration(configuration); + registerAutowire(ep); + } + for (ExternalService service : newModule.getExternalServices()) { + configuration = (ContextFactory<Context>) service.getContextFactory(); + if (configuration == null) { + ConfigurationException e = new MissingContextFactoryException("Context factory not set"); + e.setIdentifier(service.getName()); + e.addContextName(getName()); + throw e; + } + registerConfiguration(configuration); + registerAutowire(service); + } + if (lifecycleState == RUNNING) { + for (Component component : newModule.getComponents()) { + ContextFactory<Context> contextFactory = (ContextFactory<Context>) component.getContextFactory(); + wireSource(contextFactory); + buildTarget(contextFactory); + contextFactory.prepare(this); + try { + if (contextFactory.getSourceWireFactories() != null) { + for (SourceWireFactory sourceWireFactory : contextFactory.getSourceWireFactories()) + { + sourceWireFactory.initialize(); + } + } + if (contextFactory.getTargetWireFactories() != null) { + for (TargetWireFactory targetWireFactory : contextFactory.getTargetWireFactories() + .values()) { + targetWireFactory.initialize(); + } + } + } catch (WireFactoryInitException e) { + ProxyConfigurationException ce = new ProxyConfigurationException(e); + ce.addContextName(getName()); + throw ce; + } + + } + for (EntryPoint ep : newModule.getEntryPoints()) { + ContextFactory<Context> contextFactory = (ContextFactory<Context>) ep.getContextFactory(); + wireSource(contextFactory); + buildTarget(contextFactory); + contextFactory.prepare(this); + try { + if (contextFactory.getSourceWireFactories() != null) { + for (SourceWireFactory sourceWireFactory : contextFactory.getSourceWireFactories()) + { + sourceWireFactory.initialize(); + } + } + if (contextFactory.getTargetWireFactories() != null) { + for (TargetWireFactory targetWireFactory : contextFactory.getTargetWireFactories() + .values()) { + targetWireFactory.initialize(); + } + } + } catch (WireFactoryInitException e) { + ProxyConfigurationException ce = new ProxyConfigurationException(e); + ce.addContextName(getName()); + throw ce; + } + + } + for (ExternalService es : newModule.getExternalServices()) { + ContextFactory<Context> contextFactory = (ContextFactory<Context>) es.getContextFactory(); + wireSource(contextFactory); + buildTarget(contextFactory); + contextFactory.prepare(this); + try { + if (contextFactory.getSourceWireFactories() != null) { + for (SourceWireFactory sourceWireFactory : contextFactory.getSourceWireFactories()) + { + sourceWireFactory.initialize(); + } + } + if (contextFactory.getTargetWireFactories() != null) { + for (WireFactory targetWireFactory : contextFactory.getTargetWireFactories() + .values()) { + targetWireFactory.initialize(); + } + } + } catch (WireFactoryInitException e) { + ProxyConfigurationException ce = new ProxyConfigurationException(e); + ce.addContextName(getName()); + throw ce; + } + + } + + } + // merge existing module component assets + module.getComponents().addAll(oldModule.getComponents()); + module.getEntryPoints().addAll(oldModule.getEntryPoints()); + module.getExternalServices().addAll(oldModule.getExternalServices()); + } else { + if (model instanceof Component) { + Component component = (Component) model; + module.getComponents().add(component); + configuration = (ContextFactory<Context>) component.getContextFactory(); + if (configuration == null) { + ConfigurationException e = new MissingContextFactoryException("Context factory not set"); + e.setIdentifier(component.getName()); + e.addContextName(getName()); + throw e; + } + registerConfiguration(configuration); + if (component instanceof ModuleComponent) { + registerAutowire((ModuleComponent) component); + } else { + registerAutowire(component); + } + } else if (model instanceof EntryPoint) { + EntryPoint ep = (EntryPoint) model; + module.getEntryPoints().add(ep); + configuration = (ContextFactory<Context>) ep.getContextFactory(); + if (configuration == null) { + ConfigurationException e = new MissingContextFactoryException("Context factory not set"); + e.setIdentifier(ep.getName()); + e.addContextName(getName()); + throw e; + } + registerConfiguration(configuration); + registerAutowire(ep); + } else if (model instanceof ExternalService) { + ExternalService service = (ExternalService) model; + module.getExternalServices().add(service); + configuration = (ContextFactory<Context>) service.getContextFactory(); + if (configuration == null) { + ConfigurationException e = new MissingContextFactoryException("Context factory not set"); + e.setIdentifier(service.getName()); + e.addContextName(getName()); + throw e; + } + registerConfiguration(configuration); + registerAutowire(service); + } else { + BuilderConfigException e = new BuilderConfigException("Unknown model type"); + e.setIdentifier(model.getClass().getName()); + e.addContextName(getName()); + throw e; + } + } + } + + protected void registerConfiguration(ContextFactory<Context> factory) throws ConfigurationException { + factory.prepare(this); + if (lifecycleState == RUNNING) { + if (scopeIndex.get(factory.getName()) != null) { + throw new DuplicateNameException(factory.getName()); + } + try { + ScopeContext scope = scopeContexts.get(factory.getScope()); + if (scope == null) { + ConfigurationException e = new MissingScopeException("Component has an unknown scope"); + e.addContextName(factory.getName()); + e.addContextName(getName()); + throw e; + } + scope.registerFactory(factory); + scopeIndex.put(factory.getName(), scope); + } catch (TuscanyRuntimeException e) { + e.addContextName(getName()); + throw e; + } + configurations.put(factory.getName(), factory); // xcv + } else { + if (configurations.get(factory.getName()) != null) { + throw new DuplicateNameException(factory.getName()); + } + configurations.put(factory.getName(), factory); + } + + } + + public void fireEvent(int eventType, Object message) throws EventException { + throw new UnsupportedOperationException(); + } + + public void publish(Event event) { + checkInit(); + if (event instanceof SessionBound) { + SessionEvent sessionEvent = ((SessionBound) event); + // update context + eventContext.setIdentifier(sessionEvent.getSessionTypeIdentifier(), sessionEvent.getId()); + } else if (event instanceof RequestEnd) { + // be very careful with pooled threads, ensuring threadlocals are cleaned up + eventContext.clearIdentifiers(); + } + super.publish(event); + } + + public Context getContext(String componentName) { + checkInit(); + assert (componentName != null) : "Name was null"; + ScopeContext scope = scopeIndex.get(componentName); + if (scope == null) { + return null; + } + return scope.getContext(componentName); + + } + + public Object getInstance(QualifiedName qName) throws TargetException { + assert (qName != null) : "Name was null "; + // use the port name to get the context since entry points ports + ScopeContext scope = scopeIndex.get(qName.getPortName()); + if (scope == null) { + return null; + } + Context ctx = scope.getContext(qName.getPortName()); + if (!(ctx instanceof EntryPointContext)) { + TargetException e = new TargetException("Target not an entry point"); + e.setIdentifier(qName.getQualifiedName()); + e.addContextName(name); + throw e; + } + return ctx.getInstance(null); + } + + public Map<Scope, ScopeContext> getScopeContexts() { + initializeScopes(); + return immutableScopeContexts; + } + + /** + * Blocks until the module context has been initialized + */ + protected void checkInit() { + if (lifecycleState == STOPPED) { + throw new IllegalStateException("Context cannot be restarted - create a new one"); + } + if (!initialized) { + try { + /* block until the module has initialized */ + boolean success = initializeLatch.await(DEFAULT_WAIT, TimeUnit.MILLISECONDS); + if (!success) { + throw new ContextInitException("Timeout waiting for module context to initialize"); + } + } catch (InterruptedException e) { // should not happen + } + } + + } + + protected void initializeScopes() { + if (scopeContexts == null) { + scopeContexts = scopeStrategy.getScopeContexts(eventContext); + immutableScopeContexts = Collections.unmodifiableMap(scopeContexts); + } + } + + /** + * Iterates through references and delegates to the configuration context to wire them to their targets + */ + protected void wireSource(ContextFactory<Context> source) { + Scope sourceScope = source.getScope(); + if (source.getSourceWireFactories() != null) { + for (SourceWireFactory<?> sourceFactory : source.getSourceWireFactories()) { + WireConfiguration wireConfiguration = sourceFactory.getConfiguration(); + QualifiedName targetName = wireConfiguration.getTargetName(); + ContextFactory<?> target = configurations.get(targetName.getPartName()); + if (target == null) { + ContextInitException e = new ContextInitException("Target not found"); + e.setIdentifier(targetName.getPartName()); + e.addContextName(source.getName()); + e.addContextName(name); + throw e; + } + // get the proxy chain for the target + TargetWireFactory targetFactory = target.getTargetWireFactory(targetName.getPortName()); + if (targetFactory == null) { + ContextInitException e = new ContextInitException("No proxy factory found for service"); + e.setIdentifier(wireConfiguration.getTargetName().getPortName()); + e.addContextName(target.getName()); + e.addContextName(source.getName()); + e.addContextName(name); + throw e; + } + try { + boolean downScope = scopeStrategy.downScopeReference(sourceScope, target.getScope()); + configurationContext.connect(sourceFactory, targetFactory, target.getClass(), downScope, scopeContexts + .get(target.getScope())); + } catch (BuilderConfigException e) { + e.addContextName(target.getName()); + e.addContextName(source.getName()); + e.addContextName(name); + throw e; + } + + } + } + // wire invokers when the proxy only contains the target chain + if (source.getTargetWireFactories() != null) { + for (TargetWireFactory targetFactory : source.getTargetWireFactories().values()) { + try { + configurationContext.completeTargetChain(targetFactory, source.getClass(), scopeContexts.get(sourceScope)); + } catch (BuilderConfigException e) { + e.addContextName(source.getName()); + e.addContextName(name); + throw e; + } + } + } + } + + /** + * Signals to target side of reference configurations to initialize + */ + protected void buildTarget(ContextFactory<?> target) { + Map<String, TargetWireFactory> targetProxyFactories = target.getTargetWireFactories(); + if (targetProxyFactories != null) { + for (TargetWireFactory<?> targetFactory : targetProxyFactories.values()) { + for (InvocationConfiguration iConfig : targetFactory + .getConfiguration().getInvocationConfigurations().values()) { + iConfig.build(); + } + } + } + } + + protected void initializeWireFactories() throws WireFactoryInitException { + for (ContextFactory<?> config : configurations.values()) { + List<SourceWireFactory> sourceProxyFactories = config.getSourceWireFactories(); + if (sourceProxyFactories != null) { + for (WireFactory<?> sourceWireFactory : sourceProxyFactories) { + sourceWireFactory.initialize(); + } + } + if (sourceProxyFactories != null) { + Map<String, TargetWireFactory> targetWireFactories = config.getTargetWireFactories(); + for (TargetWireFactory<?> targetWireFactory : targetWireFactories.values()) { + targetWireFactory.initialize(); + } + } + } + } + + public Composite getComposite() { + return module; + } + + @Autowire + public void setAutowireContext(AutowireContext context) { + autowireContext = context; + } + + public <T> T resolveInstance(Class<T> instanceInterface) throws AutowireResolutionException { + if (ConfigurationContext.class.equals(instanceInterface)) { + return instanceInterface.cast(this); + } else if (AutowireContext.class.equals(instanceInterface)) { + return instanceInterface.cast(this); + } else if (AssemblyContext.class.equals(instanceInterface)) { + return instanceInterface.cast(assemblyContext); + } + + NameToScope nts = autowireInternal.get(instanceInterface); + if (nts != null) { + try { + return instanceInterface.cast(nts.getScopeContext().getInstance(nts.getName())); + } catch (TargetException e) { + AutowireResolutionException ae = new AutowireResolutionException("Autowire instance not found", e); + ae.addContextName(getName()); + throw ae; + } + } else if (autowireContext != null) { + try { + // resolve to parent + return autowireContext.resolveInstance(instanceInterface); + } catch (AutowireResolutionException e) { + e.addContextName(getName()); + throw e; + } + } else { + return null; + } + } + + public <T> T resolveExternalInstance(Class<T> instanceInterface) throws AutowireResolutionException { + NameToScope nts = autowireExternal.get(instanceInterface); + if (nts != null) { + try { + return instanceInterface.cast(nts.getScopeContext().getInstance(nts.getName())); + } catch (TargetException e) { + AutowireResolutionException ae = new AutowireResolutionException("Autowire instance not found", e); + ae.addContextName(getName()); + throw ae; + } + } else { + return null; + } + } + + private void registerAutowire(ExternalService service) { + } + + private void registerAutowire(ModuleComponent component) { + for (EntryPoint ep : component.getImplementation().getEntryPoints()) { + for (Binding binding : ep.getBindings()) { + if (binding instanceof SystemBinding) { + Class interfaze = ep.getConfiguredService().getPort().getServiceContract().getInterface(); + ScopeContext scope = scopeContexts.get(Scope.AGGREGATE); + String qname = component.getName() + QualifiedName.NAME_SEPARATOR + ep.getName(); + registerAutowireInternal(interfaze, qname, scope); + } + } + } + } + + private void registerAutowire(Component component) { + for (Service service : component.getImplementation().getComponentType().getServices()) { + Class interfaze = service.getServiceContract().getInterface(); + ScopeContext scopeCtx = scopeContexts.get(service.getServiceContract().getScope()); + registerAutowireInternal(interfaze, component.getName(), scopeCtx); + } + } + + protected void registerAutowireInternal(Class<?> interfaze, String name, ScopeContext scopeContext) { + assert interfaze != null; + if (autowireInternal.containsKey(interfaze)) { + return; + } + QualifiedName qname = new QualifiedName(name); + NameToScope nts = new NameToScope(qname, scopeContext); + autowireInternal.put(interfaze, nts); + } + + private void registerAutowire(EntryPoint ep) { + for (Binding binding : ep.getBindings()) { + if (binding instanceof SystemBinding) { + Class interfaze = ep.getConfiguredService().getPort().getServiceContract().getInterface(); + ScopeContext scope = scopeContexts.get(((ContextFactory) ep.getContextFactory()).getScope()); + registerAutowireExternal(interfaze, ep.getName(), scope); + } + } + } + + protected void registerAutowireExternal(Class<?> interfaze, String name, ScopeContext scopeContext) { + assert interfaze != null; + if (autowireExternal.containsKey(interfaze)) { + return; + } + QualifiedName qname = new QualifiedName(name); + NameToScope nts = new NameToScope(qname, scopeContext); + autowireExternal.put(interfaze, nts); + } + + protected static class NameToScope { + + private final QualifiedName qName; + + private final ScopeContext scope; + + public NameToScope(QualifiedName name, ScopeContext scope) { + this.qName = name; + this.scope = scope; + } + + public QualifiedName getName() { + return qName; + } + + public ScopeContext getScopeContext() { + return scope; + } + } + + + public void build(AssemblyObject model) throws BuilderConfigException { + if (configurationContext != null) { + try { + configurationContext.build(model); + } catch (BuilderConfigException e) { + e.addContextName(getName()); + throw e; + } + } + } + + public void connect(SourceWireFactory sourceFactory, TargetWireFactory targetFactory, Class targetType, boolean downScope, + ScopeContext targetScopeContext) throws BuilderConfigException { + if (configurationContext != null) { + try { + configurationContext.connect(sourceFactory, targetFactory, targetType, downScope, targetScopeContext); + } catch (BuilderConfigException e) { + e.addContextName(getName()); + throw e; + } + } + } + + public void completeTargetChain(TargetWireFactory targetFactory, Class targetType, ScopeContext targetScopeContext) + throws BuilderConfigException { + if (configurationContext != null) { + try { + configurationContext.completeTargetChain(targetFactory, targetType, targetScopeContext); + } catch (BuilderConfigException e) { + e.addContextName(getName()); + throw e; + } + } + } + + + public void removeContext(String name){ + configurations.remove(name); + ScopeContext ctx = scopeIndex.remove(name); + if (ctx != null){ + ctx.removeContext(name); + } + + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/AbstractContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/AbstractContext.java new file mode 100644 index 0000000000..680267d53e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/AbstractContext.java @@ -0,0 +1,45 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.impl; + +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.RuntimeEventListener; +import org.apache.tuscany.core.context.EventFilter; +import org.apache.tuscany.core.context.event.Event; +import org.apache.tuscany.core.context.filter.TrueFilter; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Functionality common to all <code>Context<code> implementations + * + * @version $Rev$ $Date$ + */ +public abstract class AbstractContext extends AbstractLifecycle implements Context { + + public AbstractContext() { + } + + public AbstractContext(String name) { + super(name); + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/AbstractLifecycle.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/AbstractLifecycle.java new file mode 100644 index 0000000000..ddeebe361f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/AbstractLifecycle.java @@ -0,0 +1,129 @@ +/** + * + * Copyright 2006 The Apache Software Foundation or its licensors as applicable + * + * Licensed 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.core.context.impl; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.tuscany.core.context.RuntimeEventListener; +import org.apache.tuscany.core.context.EventFilter; +import org.apache.tuscany.core.context.Lifecycle; +import org.apache.tuscany.core.context.filter.TrueFilter; +import org.apache.tuscany.core.context.event.Event; + +/** + * @version $Rev$ $Date$ + */ +public class AbstractLifecycle { + private static final EventFilter TRUE_FILTER = new TrueFilter(); + protected String name; + protected int lifecycleState = Lifecycle.UNINITIALIZED; + // Listeners for context events + private Map<EventFilter, List<RuntimeEventListener>> listeners; + + public AbstractLifecycle(String name) { + this.name = name; + } + + public AbstractLifecycle() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getLifecycleState() { + return lifecycleState; + } + + public void addListener(RuntimeEventListener listener) { + addListener(TRUE_FILTER, listener); + } + + public void removeListener(RuntimeEventListener listener) { + assert (listener != null) : "Listener cannot be null"; + synchronized(getListeners()){ + for (List<RuntimeEventListener> currentList :getListeners().values() ) { + for(RuntimeEventListener current : currentList){ + if (current == listener){ + currentList.remove(current); + return; + } + } + } + } + } + + public void addListener(EventFilter filter, RuntimeEventListener listener){ + assert (listener != null) : "Listener cannot be null"; + synchronized (getListeners()){ + List<RuntimeEventListener> list = getListeners().get(filter); + if (list == null){ + list = new CopyOnWriteArrayList<RuntimeEventListener>(); + listeners.put(filter,list); + } + list.add(listener); + } + } + + public void publish(Event event){ + assert(event != null): "Event object was null"; + for(Map.Entry<EventFilter,List<RuntimeEventListener>> entry :getListeners().entrySet()){ + if(entry.getKey().match(event)){ + for(RuntimeEventListener listener : entry.getValue()){ + listener.onEvent(event); + } + } + } + } + + protected Map<EventFilter, List<RuntimeEventListener>> getListeners(){ + if (listeners == null) { + listeners = new ConcurrentHashMap<EventFilter, List<RuntimeEventListener>>(); + } + return listeners; + } + + public String toString() { + switch (lifecycleState) { + case (Lifecycle.CONFIG_ERROR): + return "Context [" + name + "] in state [CONFIG_ERROR]"; + case (Lifecycle.ERROR): + return "Context [" + name + "] in state [ERROR]"; + case (Lifecycle.INITIALIZING): + return "Context [" + name + "] in state [INITIALIZING]"; + case (Lifecycle.INITIALIZED): + return "Context [" + name + "] in state [INITIALIZED]"; + case (Lifecycle.RUNNING): + return "Context [" + name + "] in state [RUNNING]"; + case (Lifecycle.STOPPING): + return "Context [" + name + "] in state [STOPPING]"; + case (Lifecycle.STOPPED): + return "Context [" + name + "] in state [STOPPED]"; + case (Lifecycle.UNINITIALIZED): + return "Context [" + name + "] in state [UNINITIALIZED]"; + default: + return "Context [" + name + "] in state [UNKNOWN]"; + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/CompositeContextImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/CompositeContextImpl.java new file mode 100644 index 0000000000..ec3d1bc9c0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/CompositeContextImpl.java @@ -0,0 +1,113 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.impl; + +import org.osoa.sca.ModuleContext; +import org.osoa.sca.RequestContext; +import org.osoa.sca.ServiceReference; +import org.osoa.sca.ServiceUnavailableException; + +import org.apache.tuscany.core.context.AutowireContext; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.ConfigurationContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.context.ScopeStrategy; +import org.apache.tuscany.core.context.ServiceNotFoundException; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.system.annotation.Autowire; + +/** + * The standard implementation of an composite context. Autowiring is performed by delegating to the parent context. + * + * @version $Rev$ $Date$ + */ +public class CompositeContextImpl extends AbstractCompositeContext implements ModuleContext { + + @Autowire + public void setScopeStrategy(ScopeStrategy scopeStrategy) { + if (scopeStrategy != null) { + this.scopeStrategy = scopeStrategy; + } + } + + public CompositeContextImpl() { + super(); + eventContext = new EventContextImpl(); + } + + public CompositeContextImpl(String name, CompositeContext parent, ScopeStrategy strategy, EventContext ctx, + ConfigurationContext configCtx) { + super(name, parent, strategy, ctx, configCtx); + } + + public CompositeContextImpl(String name, CompositeContext parent, AutowireContext autowireContext, ScopeStrategy strategy, + EventContext ctx, ConfigurationContext configCtx) { + super(name, parent, strategy, ctx, configCtx); + setAutowireContext(autowireContext); + } + + // ---------------------------------- + // ModuleContext methods + // ---------------------------------- + + public Object locateService(String qualifiedName) throws ServiceUnavailableException { + checkInit(); + QualifiedName qName = new QualifiedName(qualifiedName); + ScopeContext scope = scopeIndex.get(qName.getPartName()); + if (scope == null) { + throw new ServiceNotFoundException(qualifiedName); + } + Context ctx = scope.getContext(qName.getPartName()); + try { + Object o = ctx.getInstance(qName); + if (o == null) { + throw new ServiceNotFoundException(qualifiedName); + } + return o; + } catch (TargetException e) { + e.addContextName(getName()); + throw new ServiceNotFoundException(e); + } + } + + public ServiceReference createServiceReference(String serviceName) { + throw new UnsupportedOperationException(); + } + + public RequestContext getRequestContext() { + throw new UnsupportedOperationException(); + } + + public ServiceReference createServiceReferenceForSession(Object self) { + throw new UnsupportedOperationException(); + } + + public ServiceReference createServiceReferenceForSession(Object self, String serviceName) { + throw new UnsupportedOperationException(); + } + + public ServiceReference newSession(String serviceName) { + throw new UnsupportedOperationException(); + } + + public ServiceReference newSession(String serviceName, Object sessionId) { + throw new UnsupportedOperationException(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/EntryPointContextImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/EntryPointContextImpl.java new file mode 100644 index 0000000000..d1ad7a5548 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/EntryPointContextImpl.java @@ -0,0 +1,90 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.impl; + +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.context.EntryPointContext; +import org.apache.tuscany.core.context.ContextInitException; +import org.apache.tuscany.core.context.CoreRuntimeException; +import org.apache.tuscany.core.wire.jdk.JDKInvocationHandler; +import org.apache.tuscany.core.wire.ProxyCreationException; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.message.MessageFactory; + +import java.lang.reflect.InvocationHandler; + +/** + * The default implementation of an entry point context + * + * @version $Rev$ $Date$ + */ +public class EntryPointContextImpl extends AbstractContext implements EntryPointContext { + + private SourceWireFactory<?> sourceWireFactory; + + + private InvocationHandler invocationHandler; + + // a proxy implementing the service exposed by the entry point backed by the invocation handler + private Object proxy; + + /** + * Creates a new entry point + * + * @param name the entry point name + * @param sourceWireFactory the proxy factory containing the invocation chains for the entry point + * @param messageFactory a factory for generating invocation messages + * @throws ContextInitException if an error occurs creating the entry point + */ + public EntryPointContextImpl(String name, SourceWireFactory sourceWireFactory, MessageFactory messageFactory) + throws ContextInitException { + super(name); + assert (sourceWireFactory != null) : "Proxy factory was null"; + assert (messageFactory != null) : "Message factory was null"; + this.sourceWireFactory = sourceWireFactory; + invocationHandler = new JDKInvocationHandler(messageFactory, sourceWireFactory.getConfiguration() + .getInvocationConfigurations()); + } + + public Object getInstance(QualifiedName qName) throws TargetException { + if (proxy == null) { + try { + proxy = sourceWireFactory.createProxy(); + } catch (ProxyCreationException e) { + TargetException te = new TargetException(e); + te.addContextName(getName()); + throw te; + } + } + return proxy; + } + + public void start() throws ContextInitException { + lifecycleState = RUNNING; + } + + public void stop() throws CoreRuntimeException { + lifecycleState = STOPPED; + } + + public Object getHandler() throws TargetException { + return invocationHandler; + } + + public Class getServiceInterface() { + return sourceWireFactory.getBusinessInterface(); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/EventContextImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/EventContextImpl.java new file mode 100644 index 0000000000..6888e66f20 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/EventContextImpl.java @@ -0,0 +1,81 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.impl; + +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.ScopeIdentifier; + +import java.util.HashMap; +import java.util.Map; + +/** + * An implementation of an {@link org.apache.tuscany.core.context.EventContext} that handles event-to-thread associations using an + * <code>InheritableThreadLocal</code> + * + * @version $Rev$ $Date$ + */ +public class EventContextImpl implements EventContext { + + // @TODO design a proper propagation strategy for creating new threads + /* + * a map ( associated with the current thread) of scope identifiers keyed on the event context id type. the scope identifier + * may be a {@link ScopeIdentifier} or an opaque id + */ + private ThreadLocal<Map> eventContext = new InheritableThreadLocal<Map>(); + + public Object getIdentifier(Object type) { + Map map = eventContext.get(); + if (map == null) { + return null; + } + Object currentId = map.get(type); + if (currentId instanceof ScopeIdentifier) { + currentId = ((ScopeIdentifier) currentId).getIdentifier(); + // once we have accessed the id, replace the lazy wrapper + map.put(type, currentId); + } + return currentId; + } + + public void setIdentifier(Object type, Object identifier) { + Map map = eventContext.get(); + if (map == null) { + map = new HashMap(); + eventContext.set(map); + } + map.put(type, identifier); + } + + public void clearIdentifier(Object type) { + if (type == null) { + return; + } + Map map = eventContext.get(); + if (map != null) { + map.remove(type); + } + } + + public void clearIdentifiers() { + eventContext.remove(); + } + + public EventContextImpl() { + super(); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/ExternalServiceContextImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/ExternalServiceContextImpl.java new file mode 100644 index 0000000000..0ab44fa8fc --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/impl/ExternalServiceContextImpl.java @@ -0,0 +1,75 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.impl; + +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.context.CoreRuntimeException; +import org.apache.tuscany.core.context.ExternalServiceContext; +import org.apache.tuscany.core.wire.ProxyCreationException; +import org.apache.tuscany.core.wire.TargetWireFactory; + +/** + * The default implementation of an external service context + * + * @version $Rev$ $Date$ + */ +public class ExternalServiceContextImpl extends AbstractContext implements ExternalServiceContext { + + private TargetWireFactory<?> targetWireFactory; + + private ObjectFactory targetInstanceFactory; + + /** + * Creates an external service context + * + * @param name the name of the external service + * @param targetWireFactory the factory which creates proxies implementing the configured service interface for the + * external service. There is always only one proxy factory as an external service is configured with one + * service + * @param targetInstanceFactory the object factory that creates an artifact capabile of communicating over the + * binding transport configured on the external service. The object factory may implement a caching strategy. + */ + public ExternalServiceContextImpl(String name, TargetWireFactory targetWireFactory, ObjectFactory targetInstanceFactory) { + super(name); + assert (targetInstanceFactory != null) : "Target instance factory was null"; + this.targetWireFactory = targetWireFactory; + this.targetInstanceFactory = targetInstanceFactory; + } + + public void start() throws CoreRuntimeException { + lifecycleState = RUNNING; + } + + public void stop() throws CoreRuntimeException { + lifecycleState = STOPPED; + } + + + public Object getInstance(QualifiedName qName) throws TargetException { + try { + return targetWireFactory.createProxy(); + // TODO do we cache the proxy, (assumes stateful capabilities will be provided in an interceptor) + } catch (ProxyCreationException e) { + TargetException te = new TargetException(e); + te.addContextName(getName()); + throw te; + } + } + + public Object getHandler() throws TargetException { + return targetInstanceFactory.getInstance(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/AbstractScopeContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/AbstractScopeContext.java new file mode 100644 index 0000000000..7eed472101 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/AbstractScopeContext.java @@ -0,0 +1,74 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.scope; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.context.impl.AbstractLifecycle; + +/** + * Implements functionality common to scope contexts. + * + * @version $Rev$ $Date$ + */ +public abstract class AbstractScopeContext extends AbstractLifecycle implements ScopeContext { + + // The collection of runtime configurations for the scope + protected Map<String, ContextFactory<Context>> contextFactories = new ConcurrentHashMap<String, ContextFactory<Context>>(); + + // The event context the scope container is associated with + protected EventContext eventContext; + + public AbstractScopeContext(EventContext eventContext) { + assert (eventContext != null) : "Event context was null"; + this.eventContext = eventContext; + } + + public void registerFactories(List<ContextFactory<Context>> configurations) { + for (ContextFactory<Context> configuration : configurations) { + contextFactories.put(configuration.getName(), configuration); + } + } + + public Object getInstance(QualifiedName qName) throws TargetException { + Context context = getContext(qName.getPartName()); + if (context == null) { + TargetException e = new TargetException("Target not found"); + e.setIdentifier(qName.getQualifiedName()); + throw e; + } + return context.getInstance(qName); + } + + protected void checkInit() { + if (getLifecycleState() != RUNNING) { + throw new IllegalStateException("Scope not running [" + getLifecycleState() + "]"); + } + } + + protected EventContext getEventContext() { + return eventContext; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/AbstractScopeStrategy.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/AbstractScopeStrategy.java new file mode 100644 index 0000000000..f89d09196d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/AbstractScopeStrategy.java @@ -0,0 +1,67 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.scope; + +import org.apache.tuscany.core.context.ScopeStrategy; +import org.apache.tuscany.model.assembly.Scope; + +/** + * Implements basic scope strategy functionality + * + * @version $Rev$ $Date$ + */ +public abstract class AbstractScopeStrategy implements ScopeStrategy { + + public AbstractScopeStrategy() { + } + + /** + * Determines legal scope references according to standard SCA scope rules + * + * @param pReferrer the scope of the component making the reference + * @param pReferee the scope of the component being referred to + */ + public boolean downScopeReference(Scope pReferrer, Scope pReferee) { + if (pReferrer == Scope.UNDEFINED || pReferee == Scope.UNDEFINED) { + return false; + } + if (pReferee == pReferrer){ + return false; + }else if(pReferrer == Scope.INSTANCE){ + return false; + }else if(pReferee == Scope.INSTANCE){ + return true; + }else if (pReferrer == Scope.REQUEST && pReferee == Scope.SESSION){ + return false; + }else if (pReferrer == Scope.REQUEST && pReferee == Scope.MODULE){ + return false; +// }else if (pReferrer == Scope.SESSION && pReferee == Scope.REQUEST){ +// return true; + }else if (pReferrer == Scope.SESSION && pReferee == Scope.MODULE){ + return false; +// }else if (pReferrer == Scope.MODULE){ +// return true; + }else{ + return true; + } + //FIXME Jim this does not work with enumerations, what does it mean to have a scope <0? +// } else if ((pReferrer < 0) || (pReferee < 0)) { +// return false; +// } +// +// return (pReferrer > pReferee); +// return pReferrer != pReferee; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/CompositeScopeContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/CompositeScopeContext.java new file mode 100644 index 0000000000..7468ff9dd6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/CompositeScopeContext.java @@ -0,0 +1,156 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.scope; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.context.ScopeInitializationException; +import org.apache.tuscany.core.context.ScopeRuntimeException; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.context.event.Event; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.impl.AbstractLifecycle; + +/** + * Manages the lifecycle of composite component contexts, i.e. contexts which contain child contexts + * + * @see org.apache.tuscany.core.context.CompositeContext + * @version $Rev$ $Date$ + */ +public class CompositeScopeContext extends AbstractLifecycle implements ScopeContext { + + private List<ContextFactory<Context>> configs = new ArrayList<ContextFactory<Context>>(); + + // Composite component contexts in this scope keyed by name + private Map<String, CompositeContext> contexts = new ConcurrentHashMap<String, CompositeContext>(); + + // indicates if a module start event has been previously propagated so child contexts added after can be notified + private boolean moduleScopeStarted; + + public CompositeScopeContext(EventContext eventContext) { + assert (eventContext != null) : "Event context was null"; + setName("Composite Scope"); + } + + public void start() throws ScopeInitializationException { + for (ContextFactory<Context> configuration : configs) { + Context context = configuration.createContext(); + if (!(context instanceof CompositeContext)) { + ScopeInitializationException e = new ScopeInitializationException("Context not an composite type"); + e.addContextName(context.getName()); + throw e; + } + CompositeContext compositeCtx = (CompositeContext) context; + compositeCtx.start(); + contexts.put(compositeCtx.getName(), compositeCtx); + } + lifecycleState = RUNNING; + } + + public void stop() throws ScopeRuntimeException { + for (CompositeContext context : contexts.values()) { + context.stop(); + } + } + + public void registerFactories(List<ContextFactory<Context>> configurations) { + this.configs = configurations; + } + + public void registerFactory(ContextFactory<Context> configuration) { + assert (configuration != null) : "Configuration was null"; + configs.add(configuration); + if (getLifecycleState() == RUNNING) { + Context context = configuration.createContext(); + if (!(context instanceof CompositeContext)) { + ScopeInitializationException e = new ScopeInitializationException("Context not an composite type"); + e.setIdentifier(context.getName()); + throw e; + } + CompositeContext compositeCtx = (CompositeContext) context; + compositeCtx.start(); + if (moduleScopeStarted) { + compositeCtx.publish(new ModuleStart(this)); + } + contexts.put(compositeCtx.getName(), compositeCtx); + } + } + + public boolean isCacheable() { + return false; + } + + public Object getInstance(QualifiedName qName) throws TargetException { + Context context = getContext(qName.getPartName()); + if (context == null) { + TargetException e = new TargetException("Component not found"); + e.setIdentifier(qName.getQualifiedName()); + throw e; + } + return context.getInstance(qName); + } + + public Context getContext(String ctxName) { + checkInit(); + return contexts.get(ctxName); + } + + public Context getContextByKey(String ctxName, Object key) { + return getContext(ctxName); + } + + public void removeContext(String ctxName) throws ScopeRuntimeException { + Context context = contexts.remove(ctxName); + if (context != null) { + context.stop(); + } + } + + public void removeContextByKey(String ctxName, Object key) throws ScopeRuntimeException { + throw new UnsupportedOperationException(); + } + + public void onEvent(Event event){ + if (event instanceof ModuleStart) { + // track module starting so that composite contexts registered after the event are notified properly + moduleScopeStarted = true; + } else if (event instanceof ModuleStop) { + moduleScopeStarted = false; + publish(event); + } + // propagate events to child contexts + for (CompositeContext context : contexts.values()) { + context.publish(event); + } + } + + private void checkInit() { + if (getLifecycleState()!= RUNNING) { + throw new IllegalStateException("Scope not running [" + getLifecycleState() + "]"); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/DefaultScopeStrategy.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/DefaultScopeStrategy.java new file mode 100644 index 0000000000..1f386fd35f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/DefaultScopeStrategy.java @@ -0,0 +1,52 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.scope; + +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.model.assembly.Scope; + +import java.util.HashMap; +import java.util.Map; + +/** + * Implements a {@link org.apache.tuscany.core.context.ScopeStrategy} for the default module scopes: stateless, request, session, + * and module. + * + * @version $Rev$ $Date$ + */ +public class DefaultScopeStrategy extends AbstractScopeStrategy { + + public DefaultScopeStrategy() { + } + + public Map<Scope,ScopeContext> getScopeContexts(EventContext eventContext) { + ScopeContext moduleScope = new ModuleScopeContext(eventContext); + ScopeContext sessionScope = new SessionScopeContext(eventContext); + ScopeContext requestScope = new RequestScopeContext(eventContext); + ScopeContext statelessScope = new StatelessScopeContext(eventContext); + ScopeContext aggregrateScope = new CompositeScopeContext(eventContext); + Map<Scope,ScopeContext> scopes = new HashMap<Scope,ScopeContext>(); + scopes.put(Scope.MODULE,moduleScope); + scopes.put(Scope.SESSION,sessionScope); + scopes.put(Scope.REQUEST,requestScope); + scopes.put(Scope.INSTANCE,statelessScope); + scopes.put(Scope.AGGREGATE,aggregrateScope); + return scopes; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/ModuleScopeContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/ModuleScopeContext.java new file mode 100644 index 0000000000..dbb342bb5a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/ModuleScopeContext.java @@ -0,0 +1,194 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.scope; + +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.CoreRuntimeException; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.context.Lifecycle; +import org.apache.tuscany.core.context.event.InstanceCreated; +import org.apache.tuscany.core.context.event.Event; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; + +import java.util.Map; +import java.util.List; +import java.util.ArrayList; +import java.util.ListIterator; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Manages contexts whose implementations are module scoped. This scope contexts eagerly starts contexts when + * a {@link ModuleStart} event is received. If a contained context has an implementation marked to eagerly initialized, + * the an instance will be created at that time as well. Contained contexts are shutdown when a {@link ModuleStop} + * event is received in reverse order to which their implementation instances were created. + * + * @version $Rev$ $Date$ + */ +public class ModuleScopeContext extends AbstractScopeContext { + + // Component contexts in this scope keyed by name + private Map<String, Context> contexts; + + // the queue of contexts to destroy, in the order that their instances were created + private List<Context> destroyQueue; + + public ModuleScopeContext(EventContext eventContext) { + super(eventContext); + setName("Module Scope"); + } + + public void onEvent(Event event) { + if (event instanceof ModuleStart) { + lifecycleState = RUNNING; + initComponentContexts(); + } else if (event instanceof ModuleStop) { + shutdownContexts(); + } else if (event instanceof InstanceCreated) { + checkInit(); + if (event.getSource() instanceof Context) { + Context context = (Context) event.getSource(); + // Queue the context to have its implementation instance released if destroyable + destroyQueue.add(context); + } + } + } + + public synchronized void start() { + if (lifecycleState != UNINITIALIZED) { + throw new IllegalStateException("Scope must be in UNINITIALIZED state [" + lifecycleState + "]"); + } + } + + public synchronized void stop() { + if (lifecycleState != RUNNING) { + throw new IllegalStateException("Scope in wrong state [" + lifecycleState + "]"); + } + contexts = null; + destroyQueue = null; + lifecycleState = STOPPED; + } + + public boolean isCacheable() { + return true; + } + + public void registerFactory(ContextFactory<Context> configuration) { + contextFactories.put(configuration.getName(), configuration); + if (lifecycleState == RUNNING) { + contexts.put(configuration.getName(), configuration.createContext()); + } + } + + public Context getContext(String ctxName) { + checkInit(); + initComponentContexts(); + return contexts.get(ctxName); + } + + public Context getContextByKey(String ctxName, Object key) { + checkInit(); + initComponentContexts(); + return contexts.get(ctxName); + } + + public void removeContext(String ctxName) { + checkInit(); + if (contexts == null){ + return; + } + Context context = contexts.remove(ctxName); + if (context != null) { + destroyQueue.remove(context); + } + } + + public void removeContextByKey(String ctxName, Object key){ + removeContext(ctxName); + } + + /** + * Notifies contexts of a shutdown in reverse order to which they were started + */ + private synchronized void shutdownContexts() { + if (destroyQueue == null || destroyQueue.size() == 0) { + return; + } + // shutdown destroyable instances in reverse instantiation order + ListIterator<Context> iter = destroyQueue.listIterator(destroyQueue.size()); + while(iter.hasPrevious()){ + Lifecycle context = iter.previous(); + if (context.getLifecycleState() == RUNNING) { + try { + if (context instanceof AtomicContext){ + ((AtomicContext)context).destroy(); + } + } catch (TargetException e) { + // TODO send a monitoring event + } + } + } + if (contexts == null){ + return; + } + for(Lifecycle context: contexts.values()) { + try { + if (context.getLifecycleState() == RUNNING) { + context.stop(); + } + } catch (CoreRuntimeException e){ + // TODO send monitoring event + } + } + contexts = null; + destroyQueue = null; + } + + /** + * Creates and starts components contexts in the module scope. Implementations marked to eagerly initialize will + * also be notified to do so. + * + * @throws CoreRuntimeException + */ + private synchronized void initComponentContexts() throws CoreRuntimeException { + if (contexts == null) { + contexts = new ConcurrentHashMap<String, Context>(); + destroyQueue = new ArrayList<Context>(); + for (ContextFactory<Context> config : contextFactories.values()) { + Context context = config.createContext(); + context.start(); + contexts.put(context.getName(), context); + } + // Initialize eager contexts. Note this cannot be done when we initially create each context since a component may + // contain a forward reference to a component which has not been instantiated + for (Context context : contexts.values()) { + if (context instanceof AtomicContext) { + AtomicContext atomic = (AtomicContext) context; + if (atomic.isEagerInit()) { + // perform silent creation and manual shutdown registration + atomic.init(); + destroyQueue.add(context); + } + } + context.addListener(this); + } + } + } +}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/RequestScopeContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/RequestScopeContext.java new file mode 100644 index 0000000000..67ce176af5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/RequestScopeContext.java @@ -0,0 +1,228 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.scope; + +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.CoreRuntimeException; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.context.Lifecycle; +import org.apache.tuscany.core.context.event.InstanceCreated; +import org.apache.tuscany.core.context.event.Event; +import org.apache.tuscany.core.context.event.RequestEnd; +import org.apache.tuscany.core.context.event.RequestStart; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.ListIterator; +import java.util.concurrent.ConcurrentHashMap; + +/** + * An implementation of a request-scoped component container. This scope contexts eagerly starts contexts when + * a {@link org.apache.tuscany.core.context.event.RequestStart} event is received. If a contained context has an implementation marked to eagerly initialized, + * the an instance will be created at that time as well. Contained contexts are shutdown when a {@link org.apache.tuscany.core.context.event.RequestEnd} + * event is received in reverse order to which their implementation instances were created. + * + * @version $Rev$ $Date$ + */ +public class RequestScopeContext extends AbstractScopeContext { + + // A collection of service component contexts keyed by thread. Note this could have been implemented with a ThreadLocal but + // using a Map allows finer-grained concurrency. + private Map<Object, Map<String, Context>> contexts; + + // stores ordered lists of contexts to shutdown for each thread. + private Map<Object, List<Context>> destroyQueues; + + public RequestScopeContext(EventContext eventContext) { + super(eventContext); + setName("Request Scope"); + } + + public void onEvent(Event event){ + if (event instanceof RequestStart){ + getContexts(); // eager load + }else if (event instanceof RequestEnd){ + checkInit(); + getEventContext().clearIdentifiers(); // clean up current context for pooled threads + shutdownContexts(); + cleanupRequestContexts(); + }else if (event instanceof InstanceCreated){ + checkInit(); + assert(event.getSource() instanceof Context): "Context must be passed on created event"; + Context context = (Context)event.getSource(); + List<Context> collection = destroyQueues.get(Thread.currentThread()); + collection.add(context); + } + } + + public synchronized void start() { + if (lifecycleState != UNINITIALIZED) { + throw new IllegalStateException("Scope must be in UNINITIALIZED state [" + lifecycleState + "]"); + } + contexts = new ConcurrentHashMap<Object, Map<String, Context>>(); + destroyQueues = new ConcurrentHashMap<Object, List<Context>>(); + lifecycleState = RUNNING; + } + + public synchronized void stop() { + if (lifecycleState != RUNNING) { + throw new IllegalStateException("Scope in wrong state [" + lifecycleState + "]"); + } + contexts = null; + destroyQueues = null; + lifecycleState = STOPPED; + } + + public boolean isCacheable() { + return true; + } + + public void registerFactory(ContextFactory<Context> configuration) { + contextFactories.put(configuration.getName(), configuration); + } + + public Context getContext(String ctxName) { + checkInit(); + Map<String, Context> contexts = getContexts(); + Context ctx = contexts.get(ctxName); + if (ctx == null){ + // check to see if the configuration was added after the request was started + ContextFactory<Context> configuration = contextFactories.get(ctxName); + if (configuration != null) { + ctx = configuration.createContext(); + //ctx.addListener(this); + ctx.start(); + contexts.put(ctx.getName(), ctx); + } + } + return ctx; + } + + public Context getContextByKey(String ctxName, Object key) { + checkInit(); + if (key == null) { + return null; + } + Map<String, Context> components = contexts.get(key); + if (components == null) { + return null; + } + return components.get(ctxName); + } + + public void removeContext(String ctxName) { + removeContextByKey(ctxName, Thread.currentThread()); + } + + public void removeContextByKey(String ctxName, Object key) { + checkInit(); + if (key == null || ctxName == null) { + return; + } + Map components = contexts.get(key); + if (components == null) { + return; + } + components.remove(ctxName); + } + + + + private void cleanupRequestContexts() { + // TODO uninitialize all request-scoped components + contexts.remove(Thread.currentThread()); + destroyQueues.remove(Thread.currentThread()); + } + + /** + * Initializes ServiceComponentContexts for the current request. + * <p> + * TODO This eagerly creates all component contexts, even if the component is never accessed during the request. This method + * should be profiled to determine if lazy initialization is more performant + * <p> + * TODO Eager initialization is not performed for request-scoped components + */ + + private Map<String, Context> getContexts() throws CoreRuntimeException { + Map<String, Context> requestContexts = this.contexts.get(Thread.currentThread()); + if (requestContexts == null) { + requestContexts = new ConcurrentHashMap<String, Context>(); + List<Context> shutdownQueue = new ArrayList<Context>(); + for (ContextFactory<Context> config : contextFactories.values()) { + Context context = config.createContext(); + context.start(); + requestContexts.put(context.getName(), context); + } + // initialize eager components. Note this cannot be done when we initially create each context since a component may + // contain a forward reference to a component which has not been instantiated + for (Context context : requestContexts.values()) { + if (context instanceof AtomicContext) { + AtomicContext atomic = (AtomicContext) context; + if (atomic.isEagerInit()) { + atomic.init(); // Notify the instance + synchronized(shutdownQueue){ + shutdownQueue.add(context); + } + } + } + context.addListener(this); + } + contexts.put(Thread.currentThread(), requestContexts); + destroyQueues.put(Thread.currentThread(), shutdownQueue); + } + return requestContexts; + } + + private void shutdownContexts() { + List<Context> destroyQueue = destroyQueues.remove(Thread.currentThread()); + if (destroyQueue == null || destroyQueue.size() == 0) { + return; + } + synchronized(destroyQueue){ + // shutdown destroyable instances in reverse instantiation order + ListIterator<Context> iter = destroyQueue.listIterator(destroyQueue.size()); + while(iter.hasPrevious()){ + Lifecycle context = iter.previous(); + if (context.getLifecycleState() == RUNNING) { + try { + if (context instanceof AtomicContext){ + ((AtomicContext)context).destroy(); + } + } catch (TargetException e) { + // TODO send a monitoring event + } + } + } + } + // shutdown contexts + Map<String,Context> currentContexts = contexts.remove(Thread.currentThread()); + if (currentContexts == null){ + return; + } + for (Lifecycle context: currentContexts.values()){ + if (context.getLifecycleState() == RUNNING) { + context.stop(); + } + } + + } + +}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/SessionScopeContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/SessionScopeContext.java new file mode 100644 index 0000000000..c5785d25f7 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/SessionScopeContext.java @@ -0,0 +1,258 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.scope; + +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.CoreRuntimeException; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.ScopeRuntimeException; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.context.Lifecycle; +import org.apache.tuscany.core.context.event.Event; +import org.apache.tuscany.core.context.event.HttpSessionEvent; +import org.apache.tuscany.core.context.event.InstanceCreated; +import org.apache.tuscany.core.context.event.SessionEnd; +import org.apache.tuscany.core.context.event.SessionStart; + +import java.util.ArrayList; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * An implementation of an session-scoped component container. This scope contexts eagerly starts contexts when a + * {@link org.apache.tuscany.core.context.event.SessionStart} event is received. If a contained context has an implementation + * marked to eagerly initialized, the an instance will be created at that time as well. Contained contexts are shutdown when a + * {@link org.apache.tuscany.core.context.event.SessionEnd} event is received in reverse order to which their implementation + * instances were created. + * TODO this implementation needs to be made generic so that it supports a range of session types, i.e. not tied to HTTP + * session scope + * + * @version $Rev$ $Date$ + */ +public class SessionScopeContext extends AbstractScopeContext { + + // The collection of service component contexts keyed by session + private Map<Object, Map<String, Context>> contexts; + + // Stores ordered lists of contexts to shutdown keyed by session + private Map<Object, List<Context>> destroyQueues; + + public SessionScopeContext(EventContext eventContext) { + super(eventContext); + setName("Session Scope"); + } + + public synchronized void start() { + if (lifecycleState != UNINITIALIZED) { + throw new IllegalStateException("Scope container must be in UNINITIALIZED state"); + } + contexts = new ConcurrentHashMap<Object, Map<String, Context>>(); + destroyQueues = new ConcurrentHashMap<Object, List<Context>>(); + lifecycleState = RUNNING; + } + + public synchronized void stop() { + if (lifecycleState != RUNNING) { + throw new IllegalStateException("Scope container in wrong state"); + } + contexts = null; + contexts = null; + destroyQueues = null; + lifecycleState = STOPPED; + } + + public void onEvent(Event event) { + if (event instanceof SessionStart) { + checkInit(); + Object key = ((SessionEnd) event).getId(); + getSessionContexts(key); + }else if (event instanceof SessionEnd) { + checkInit(); + Object key = ((SessionEnd) event).getId(); + shutdownContexts(key); + destroyComponentContext(key); + } else if (event instanceof InstanceCreated) { + checkInit(); + Object sessionKey = getEventContext().getIdentifier(HttpSessionEvent.HTTP_IDENTIFIER); + List<Context> shutdownQueue = destroyQueues.get(sessionKey); + Context context = (Context) event.getSource(); + assert(shutdownQueue != null): "Shutdown queue not found for key"; + shutdownQueue.add(context); + } + } + + public boolean isCacheable() { + return true; + } + + public void registerFactory(ContextFactory<Context> configuration) { + contextFactories.put(configuration.getName(), configuration); + } + + public Context getContext(String ctxName) { + assert(ctxName != null): "No context name specified"; + checkInit(); + Map<String, Context> ctxs = getSessionContexts(); + Context context = ctxs.get(ctxName); + if (context == null) { + // the configuration was added after the session had started, so create a context now and start it + ContextFactory<Context> configuration = contextFactories.get(ctxName); + if (configuration != null) { + context = configuration.createContext(); + context.start(); + if (context instanceof AtomicContext) { + ((AtomicContext) context).init(); + } + + ctxs.put(context.getName(), context); + List<Context> shutdownQueue = destroyQueues.get(getEventContext().getIdentifier(HttpSessionEvent.HTTP_IDENTIFIER)); + synchronized (shutdownQueue) { + shutdownQueue.add(context); + } + context.addListener(this); + } + } + return context; + } + + public Context getContextByKey(String ctxName, Object key) { + checkInit(); + assert(ctxName != null): "No context name specified"; + assert(key != null): "No key specified"; + Map ctxs = contexts.get(key); + if (ctxs == null) { + return null; + } + return (Context) ctxs.get(ctxName); + } + + public void removeContext(String ctxName) { + checkInit(); + Object key = getEventContext().getIdentifier(HttpSessionEvent.HTTP_IDENTIFIER); + removeContextByKey(ctxName, key); + } + + public void removeContextByKey(String ctxName, Object key) { + checkInit(); + assert(ctxName != null): "No context name specified"; + assert(key != null): "No key specified"; + Map components = contexts.get(key); + if (components == null) { + return; + } + components.remove(ctxName); + Map<String, Context> definitions = contexts.get(key); + Context ctx = definitions.get(ctxName); + if (ctx != null) { + destroyQueues.get(key).remove(ctx); + } + definitions.remove(ctxName); + } + + /** + * Returns and, if necessary, creates a context for the current sesion + */ + private Map<String, Context> getSessionContexts() throws CoreRuntimeException { + Object key = getEventContext().getIdentifier(HttpSessionEvent.HTTP_IDENTIFIER); + return getSessionContexts(key); + } + + /** + * Returns and, if necessary, creates a context for the given session key + */ + private Map<String, Context> getSessionContexts(Object key) throws CoreRuntimeException { + if (key == null) { + throw new ScopeRuntimeException("Session key not set in request context"); + } + Map<String, Context> m = contexts.get(key); + if (m != null) { + return m; // already created, return + } + Map<String, Context> sessionContext = new ConcurrentHashMap<String, Context>(contextFactories.size()); + for (ContextFactory<Context> config : contextFactories.values()) { + Context context = config.createContext(); + context.start(); + sessionContext.put(context.getName(), context); + } + + List<Context> shutdownQueue = new ArrayList<Context>(); + contexts.put(key, sessionContext); + destroyQueues.put(key, shutdownQueue); + // initialize eager components. Note this cannot be done when we initially create each context since a component may + // contain a forward reference to a component which has not been instantiated + for (Context context : sessionContext.values()) { + if (context instanceof AtomicContext) { + AtomicContext atomic = (AtomicContext) context; + if (atomic.isEagerInit()) { + atomic.init(); // Notify the instance + synchronized (shutdownQueue) { + shutdownQueue.add(context); + } + } + } + context.addListener(this); + } + return sessionContext; + } + + /** + * Removes the components associated with an expiring context + */ + private void destroyComponentContext(Object key) { + contexts.remove(key); + destroyQueues.remove(key); + } + + + private synchronized void shutdownContexts(Object key) { + List<Context> destroyQueue = destroyQueues.remove(key); + if (destroyQueue == null || destroyQueue.size() == 0) { + return; + } + // shutdown destroyable instances in reverse instantiation order + ListIterator<Context> iter = destroyQueue.listIterator(destroyQueue.size()); + synchronized (destroyQueue) { + while (iter.hasPrevious()) { + Lifecycle context = iter.previous(); + if (context.getLifecycleState() == RUNNING) { + try { + if (context instanceof AtomicContext) { + ((AtomicContext) context).destroy(); + } + } catch (TargetException e) { + // TODO send a monitoring event + } + } + } + } + // shutdown contexts + Map<String, Context> currentContexts = contexts.remove(Thread.currentThread()); + if (currentContexts == null) { + return; + } + for (Lifecycle context : currentContexts.values()) { + if (context.getLifecycleState() == RUNNING) { + context.stop(); + } + } + } + +}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/StatelessScopeContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/StatelessScopeContext.java new file mode 100644 index 0000000000..46bf58b548 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/StatelessScopeContext.java @@ -0,0 +1,132 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.scope; + +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.CoreRuntimeException; +import org.apache.tuscany.core.context.Lifecycle; +import org.apache.tuscany.core.context.event.Event; +import org.apache.tuscany.core.context.event.ModuleStop; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * A container that manages stateless components. + * + * @version $Rev$ $Date$ + */ +public class StatelessScopeContext extends AbstractScopeContext { + + // Component contexts keyed by name + private Map<String, Context> contexts; + + public StatelessScopeContext(EventContext eventContext) { + super(eventContext); + setName("Stateless Scope"); + } + + public synchronized void start() { + if (lifecycleState != UNINITIALIZED) { + throw new IllegalStateException("Scope must be in UNINITIALIZED state [" + lifecycleState + "]"); + } + lifecycleState = RUNNING; + } + + public synchronized void stop() { + if (lifecycleState != RUNNING) { + throw new IllegalStateException("Scope in wrong state [" + lifecycleState + "]"); + } + contexts = null; + lifecycleState = STOPPED; + } + + public void registerFactory(ContextFactory<Context> configuration) { + contextFactories.put(configuration.getName(), configuration); + if (contexts != null) { + contexts.put(configuration.getName(), configuration.createContext()); + } + } + + public void onEvent(Event event){ + if (event instanceof ModuleStop) { + shutdownContexts(); + } + } + + public boolean isCacheable() { + return true; + } + + public Context getContext(String ctxName) { + prepare(); + return contexts.get(ctxName); + } + + public Context getContextByKey(String ctxName, Object key) { + return getContext(ctxName); + } + + public void removeContext(String ctxName) { + if (contexts == null){ + return; + } + contexts.remove(ctxName); + } + + public void removeContextByKey(String ctxName, Object key) { + removeContext(ctxName); + } + + private void prepare() throws CoreRuntimeException { + if (lifecycleState != RUNNING) { + throw new IllegalStateException("Scope not in INITIALIZED state [" + lifecycleState + "]"); + } + if (contexts == null) { + contexts = new ConcurrentHashMap<String, Context> (); + for (ContextFactory<Context> config : contextFactories.values()) { + for (int i = 0; i < contextFactories.size(); i++) { + Context context = config.createContext(); + context.start(); + contexts.put(context.getName(), context); + } + + } + } + } + + private void shutdownContexts(){ + if (contexts == null){ + return; + } + for(Lifecycle context: contexts.values()) { + try { + if (context.getLifecycleState() == RUNNING) { + context.stop(); + } + } catch (CoreRuntimeException e){ + // TODO send monitoring event + } + + } + contexts = null; + } + + +}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ComponentTargetInvoker.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ComponentTargetInvoker.java new file mode 100644 index 0000000000..57fcffc2b2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ComponentTargetInvoker.java @@ -0,0 +1,122 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.core.extension;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import org.apache.tuscany.core.context.AtomicContext;
+import org.apache.tuscany.core.context.Context;
+import org.apache.tuscany.core.context.QualifiedName;
+import org.apache.tuscany.core.context.ScopeContext;
+import org.apache.tuscany.core.context.TargetException;
+import org.apache.tuscany.core.message.Message;
+import org.apache.tuscany.core.wire.Interceptor;
+import org.apache.tuscany.core.wire.TargetInvoker;
+
+/**
+ * Responsible for invoking an external service
+ * TODO: virtualy identical to ExternalServiceTargetInvoker
+ * @version $Rev$ $Date$
+ */
+public class ComponentTargetInvoker implements TargetInvoker {
+
+ private QualifiedName serviceName;
+
+ private String esName;
+
+ private Method method;
+
+ private ScopeContext container;
+
+ private AtomicContext context;
+
+ /**
+ * Constructs a new ExternalWebServiceTargetInvoker.
+ *
+ * @param container
+ */
+ public ComponentTargetInvoker(QualifiedName serviceName, Method method, ScopeContext container) {
+ assert serviceName != null : "No service name specified";
+ assert method != null : "No method specified";
+ assert container != null : "No scope container specified";
+ this.serviceName = serviceName;
+ this.esName = serviceName.getPartName();
+ this.method = method;
+ this.container = container;
+ }
+
+ public Object invokeTarget(Object payload) throws InvocationTargetException {
+ if (context == null) {
+ Context iContext = container.getContext(esName);
+ if (!(iContext instanceof AtomicContext)) {
+ TargetException te = new TargetException("Unexpected target context type");
+ te.setIdentifier(iContext.getClass().getName());
+ te.addContextName(iContext.getName());
+ throw te;
+ }
+ context = (AtomicContext) iContext;
+ }
+
+ ExternalServiceInvoker invoker = (ExternalServiceInvoker) context.getTargetInstance();
+ if (payload != null) {
+ return doInvoke(invoker, (Object[]) payload);
+ } else {
+ return doInvoke(invoker, null);
+ }
+ }
+
+ protected Object doInvoke(ExternalServiceInvoker invoker, Object[] args) {
+ return invoker.invoke(method.getName(), args);
+ }
+
+ public boolean isCacheable() {
+ return false;
+ }
+
+ public Message invoke(Message msg) {
+ try {
+ Object resp = invokeTarget(msg.getBody());
+ msg.setBody(resp);
+ } catch (InvocationTargetException e) {
+ msg.setBody(e.getCause());
+ } catch (Throwable e) {
+ msg.setBody(e);
+ }
+ return msg;
+ }
+
+ public void setNext(Interceptor next) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Object clone() throws CloneNotSupportedException {
+ try {
+ ComponentTargetInvoker invoker = (ComponentTargetInvoker) super.clone();
+ invoker.container = container;
+ invoker.context = this.context;
+ invoker.esName = this.esName;
+ invoker.method = this.method;
+ invoker.serviceName = this.serviceName;
+ return invoker;
+ } catch (CloneNotSupportedException e) {
+ // will not happen
+ return null;
+ }
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ContextFactoryBuilderSupport.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ContextFactoryBuilderSupport.java new file mode 100644 index 0000000000..81770d49b8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ContextFactoryBuilderSupport.java @@ -0,0 +1,174 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.extension; + +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.service.WireFactoryService; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.ConfiguredProperty; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.Implementation; +import org.apache.tuscany.model.assembly.Multiplicity; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.Service; +import org.osoa.sca.annotations.Init; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.List; + +/** + * A runtime extension point for component types. Subclasses must be genericized according to the model implementation type they + * handle, i.e. a subclass of {@link Implementation}, and implement {@link #createContextFactory}. + * + * @version $Rev: 368822 $ $Date: 2006-01-13 10:54:38 -0800 (Fri, 13 Jan 2006) $ + * @see org.apache.tuscany.core.builder.ContextFactory + */ +@org.osoa.sca.annotations.Scope("MODULE") +public abstract class ContextFactoryBuilderSupport<T extends Implementation> implements ContextFactoryBuilder { + + protected ContextFactoryBuilderRegistry builderRegistry; + + protected WireFactoryService wireFactoryService; + + protected Class implementationClass; + + /** + * Default constructor + */ + public ContextFactoryBuilderSupport() { + // reflect the generic type of the subclass + Type type = this.getClass().getGenericSuperclass(); + if (type instanceof ParameterizedType) { + implementationClass = (Class) ((ParameterizedType) type).getActualTypeArguments()[0]; + } else { + throw new AssertionError("Subclasses of " + ContextFactoryBuilderSupport.class.getName() + " must be genericized"); + } + } + + /** + * Constructs a new instance + * + * @param wireFactoryService the system service responsible for creating wire factories + */ + public ContextFactoryBuilderSupport(WireFactoryService wireFactoryService) { + this(); + this.wireFactoryService = wireFactoryService; + } + + @Init(eager = true) + public void init() { + builderRegistry.register(this); + } + + @Autowire + public void setBuilderRegistry(ContextFactoryBuilderRegistry builderRegistry) { + this.builderRegistry = builderRegistry; + } + + /** + * Sets the system service used to construct wire factories + */ + @Autowire + public void setWireFactoryService(WireFactoryService wireFactoryService) { + this.wireFactoryService = wireFactoryService; + } + + public void build(AssemblyObject modelObject) throws BuilderException { + if (!(modelObject instanceof Component)) { + return; + } + Component nonGenricComponent = (Component) modelObject; + if (!implementationClass.isAssignableFrom(nonGenricComponent.getImplementation().getClass())) { + return; + } + Component<T> component = (Component<T>) modelObject; + List<Service> services = component.getImplementation().getComponentType().getServices(); + Scope previous = null; + Scope scope = Scope.INSTANCE; + for (Service service : services) { + // calculate and validate the scope of the component; ensure that all service scopes are the same unless stateless + Scope current = service.getServiceContract().getScope(); + if (previous != null && current != null && current != previous + && (current != Scope.INSTANCE && previous != Scope.INSTANCE)) { + BuilderException e = new BuilderConfigException("Incompatible scopes specified for services on component"); + e.setIdentifier(component.getName()); + throw e; + } + if (scope != null && current != Scope.INSTANCE) { + scope = current; + } + } + ContextFactory contextFactory; + try { + contextFactory = createContextFactory(component.getName(), component.getImplementation(), scope); + // create target-side wire invocation chains for each service offered by the implementation + for (ConfiguredService configuredService : component.getConfiguredServices()) { + Service service = configuredService.getPort(); + TargetWireFactory wireFactory = wireFactoryService.createTargetFactory(configuredService); + contextFactory.addTargetWireFactory(service.getName(), wireFactory); + } + // handle properties + List<ConfiguredProperty> configuredProperties = component.getConfiguredProperties(); + if (configuredProperties != null) { + for (ConfiguredProperty property : configuredProperties) { + contextFactory.addProperty(property.getName(), property.getValue()); + } + } + // handle references and source side reference chains + List<ConfiguredReference> configuredReferences = component.getConfiguredReferences(); + if (configuredReferences != null) { + for (ConfiguredReference reference : configuredReferences) { + if (reference.getPort().getMultiplicity() == Multiplicity.ZERO_N || reference.getPort().getMultiplicity() == Multiplicity.ZERO_ONE){ + if (reference.getTargetConfiguredServices().size() < 1 && reference.getTargets().size() <1 ){ + continue; // not required, not configured fix TUSCANY-299 + } + } + List<SourceWireFactory> wireFactories = wireFactoryService.createSourceFactory(reference); + String refName = reference.getPort().getName(); + Class refClass = reference.getPort().getServiceContract().getInterface(); + boolean multiplicity = reference.getPort().getMultiplicity() == Multiplicity.ONE_N + || reference.getPort().getMultiplicity() == Multiplicity.ZERO_N; + contextFactory.addSourceWireFactories(refName, refClass, wireFactories, multiplicity); + } + } + component.setContextFactory(contextFactory); + } catch (BuilderException e) { + e.addContextName(component.getName()); + throw e; + } + } + + /** + * Subclasses must implement, returning a context factory appropriate to the component implementation + * + * @param componentName the name of the component + * @param implementation the component implementation + * @param scope the component implementation scope + */ + protected abstract ContextFactory createContextFactory(String componentName, T implementation, Scope scope); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/EntryPointBuilderSupport.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/EntryPointBuilderSupport.java new file mode 100644 index 0000000000..58d7a626a6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/EntryPointBuilderSupport.java @@ -0,0 +1,111 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.extension; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.service.WireFactoryService; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.Binding; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.Service; +import org.osoa.sca.annotations.Init; + +/** + * A base class for a {@link ContextFactoryBuilder} that creates {@link org.apache.tuscany.core.context.EntryPointContext}s + * + * @version $$Rev$$ $$Date$$ + */ +public abstract class EntryPointBuilderSupport<T extends Binding> implements ContextFactoryBuilder { + + protected ContextFactoryBuilderRegistry builderRegistry; + protected WireFactoryService wireService; + protected MessageFactory messageFactory; + protected Class bindingClass; + + public EntryPointBuilderSupport() { + // reflect the generic type of the subclass + Type type = this.getClass().getGenericSuperclass(); + if (type instanceof ParameterizedType) { + bindingClass = (Class) ((ParameterizedType) type).getActualTypeArguments()[0]; + } else { + throw new AssertionError("Subclasses of " + ContextFactoryBuilderSupport.class.getName() + " must be genericized"); + } + } + + @Init(eager = true) + public void init() throws Exception { + builderRegistry.register(this); + } + + @Autowire + public void setBuilderRegistry(ContextFactoryBuilderRegistry registry) { + builderRegistry = registry; + } + + @Autowire + public void setWireService(WireFactoryService wireService) { + this.wireService = wireService; + } + + /** + * Sets the factory used to construct wire messages + * + * @param msgFactory + */ + @Autowire + public void setMessageFactory(MessageFactory msgFactory) { + this.messageFactory = msgFactory; + } + + public void build(AssemblyObject object) throws BuilderException { + if (!(object instanceof EntryPoint)) { + return; + } + EntryPoint entryPoint = (EntryPoint) object; + if (entryPoint.getBindings().size() < 1) { + return; + } + if (!bindingClass.isAssignableFrom(entryPoint.getBindings().get(0).getClass())) { + return; + } + + EntryPointContextFactory contextFactory = createEntryPointContextFactory(entryPoint, messageFactory); + ConfiguredService configuredService = entryPoint.getConfiguredService(); + Service service = configuredService.getPort(); + SourceWireFactory wireFactory = wireService.createSourceFactory(entryPoint.getConfiguredReference()).get(0); + contextFactory.addSourceWireFactory(service.getName(), wireFactory); + entryPoint.setContextFactory(contextFactory); + } + + /** + * Callback to create the specific <code>ContextFactory</code> type associated with the extending + * implementation + * + * @param entryPoint the entry point being processed + * @param msgFactory the message factory to be used by <code>EntryPointContext</code> when flowing + * invocations + */ + protected abstract EntryPointContextFactory createEntryPointContextFactory(EntryPoint entryPoint, MessageFactory msgFactory); + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/EntryPointContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/EntryPointContextFactory.java new file mode 100644 index 0000000000..bb4d1207d4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/EntryPointContextFactory.java @@ -0,0 +1,111 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.extension; + +import org.apache.tuscany.core.builder.ContextCreationException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.EntryPointContext; +import org.apache.tuscany.core.context.impl.EntryPointContextImpl; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.model.assembly.Scope; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * Default factory for contexts that represent entry points. + * + * @version $Rev$ $Date$ + */ +public abstract class EntryPointContextFactory implements ContextFactory<EntryPointContext> { + + private String name; + + private SourceWireFactory sourceWireFactory; + + private MessageFactory msgFactory; + + private List<SourceWireFactory> sourceProxyFactories; + + public EntryPointContextFactory(String name, MessageFactory msgFactory) { + assert (name != null) : "Entry point name was null"; + assert (msgFactory != null) : "Message factory was null"; + this.name = name; + this.msgFactory = msgFactory; + } + + public EntryPointContext createContext() throws ContextCreationException { + return new EntryPointContextImpl(name, sourceWireFactory, msgFactory); + } + + public Scope getScope() { + return Scope.MODULE; + } + + public String getName() { + return name; + } + + public void prepare() { + } + + public void addTargetWireFactory(String serviceName, TargetWireFactory factory) { + // no wires to an entry point from within a composite + } + + public TargetWireFactory getTargetWireFactory(String serviceName) { + // no wires to an entry point from within a composite + return null; + } + + public Map<String, TargetWireFactory> getTargetWireFactories() { + // no wires to an entry point from within a composite + return Collections.emptyMap(); + } + + public void addSourceWireFactory(String refName, SourceWireFactory factory) { + assert (refName != null) : "No reference name specified"; + assert (factory != null) : "Proxy factory was null"; + this.sourceWireFactory = factory; + } + + public List<SourceWireFactory> getSourceWireFactories() { + if (sourceProxyFactories == null) { + sourceProxyFactories = new ArrayList<SourceWireFactory>(1); + sourceProxyFactories.add(sourceWireFactory); + } + return sourceProxyFactories; + } + + public void addProperty(String propertyName, Object value) { + throw new UnsupportedOperationException(); + } + + public void addSourceWireFactories(String referenceName, Class referenceInterface, List<SourceWireFactory> factories, boolean multiplicity) { + if (factories.size() >1){ + throw new UnsupportedOperationException("Multiple wires for an entry point not allowed"); + }else if(factories.size() <1){ + throw new AssertionError("Empty wire factory list"); + } + this.sourceWireFactory = factories.get(0); + } + + public void prepare(CompositeContext parent) { + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ExternalServiceBuilderSupport.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ExternalServiceBuilderSupport.java new file mode 100644 index 0000000000..7c030324f1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ExternalServiceBuilderSupport.java @@ -0,0 +1,112 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.extension; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.service.WireFactoryService; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.Binding; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.ExternalService; +import org.apache.tuscany.model.assembly.Service; +import org.osoa.sca.annotations.Init; + +/** + * A base class for a {@link ContextFactoryBuilder} that creates {@link org.apache.tuscany.core.context.ExternalServiceContext}s + * + * @version $$Rev$$ $$Date$$ + */ +public abstract class ExternalServiceBuilderSupport<T extends Binding> implements ContextFactoryBuilder { + + private ContextFactoryBuilderRegistry builderRegistry; + private WireFactoryService wireService; + protected Class bindingClass; + + public ExternalServiceBuilderSupport() { + // reflect the generic type of the subclass + Type type = this.getClass().getGenericSuperclass(); + if (type instanceof ParameterizedType) { + bindingClass = (Class) ((ParameterizedType) type).getActualTypeArguments()[0]; + } else { + throw new AssertionError("Subclasses of " + ContextFactoryBuilderSupport.class.getName() + " must be genericized"); + } + } + + public ExternalServiceBuilderSupport(WireFactoryService wireService) { + this(); + this.wireService = wireService; + } + + @Init(eager = true) + public void init() throws Exception { + builderRegistry.register(this); + } + + @Autowire + public void setBuilderRegistry(ContextFactoryBuilderRegistry registry) { + builderRegistry = registry; + } + + @Autowire + public void setWireService(WireFactoryService wireService) { + this.wireService = wireService; + } + + public void build(AssemblyObject object) throws BuilderException { + if (!(object instanceof ExternalService)) { + return; + } + ExternalService externalService = (ExternalService) object; + if (externalService.getBindings().size() < 1) { + // || !(handlesBindingType(externalService.getBindings().get(0)))) { + return; + } + if (!bindingClass.isAssignableFrom(externalService.getBindings().get(0).getClass())) { + return; + } + + ExternalServiceContextFactory contextFactory + = createExternalServiceContextFactory(externalService); + + ConfiguredService configuredService = externalService.getConfiguredService(); + Service service = configuredService.getPort(); + TargetWireFactory wireFactory = wireService.createTargetFactory(configuredService); + contextFactory.addTargetWireFactory(service.getName(), wireFactory); + externalService.setContextFactory(contextFactory); + } + + /** + * Returns true if an extending implementation can process the given binding element + */ + //protected abstract boolean handlesBindingType(Binding binding); + + /** + * Callback to create the specific <code>ContextFactory</code> type associated with the extending + * implementation + * + * @param externalService the external service being processed + */ + protected abstract ExternalServiceContextFactory createExternalServiceContextFactory(ExternalService externalService); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ExternalServiceContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ExternalServiceContextFactory.java new file mode 100644 index 0000000000..396da3d39e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ExternalServiceContextFactory.java @@ -0,0 +1,121 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.extension; + +import org.apache.tuscany.core.builder.ContextCreationException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.ExternalServiceContext; +import org.apache.tuscany.core.context.impl.ExternalServiceContextImpl; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.model.assembly.Scope; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * A template implementation that creates instances of {@link org.apache.tuscany.core.context.ExternalServiceContext} + * configured with the appropriate wire chains and bindings. This class is intended to be subclassed when + * contributing new bindings to the runtime. The subclass serves as a marker so the binding {@link org.apache.tuscany.core.builder.WireBuilder + * + * + * + * } + * responsible for setting the proper {@link org.apache.tuscany.core.wire.TargetInvoker} on the wire chains + * can be notified. + * + * @version $Rev$ $Date$ + */ +public abstract class ExternalServiceContextFactory implements ContextFactory<ExternalServiceContext> { + + private String name; + + private TargetWireFactory targetWireFactory; + + private ObjectFactory objectFactory; + + private String targetServiceName; + + private Map<String, TargetWireFactory> targetProxyFactories; + + public ExternalServiceContextFactory(String name, ObjectFactory objectFactory) { + assert (name != null) : "Name was null"; + assert (objectFactory != null) : "Object factory was null"; + this.name = name; + this.objectFactory = objectFactory; + } + + public ExternalServiceContext createContext() throws ContextCreationException { + return new ExternalServiceContextImpl(name, targetWireFactory, objectFactory); + } + + public Scope getScope() { + return Scope.MODULE; + } + + public String getName() { + return name; + } + + public void prepare() { + } + + public void addTargetWireFactory(String serviceName, TargetWireFactory factory) { + assert (serviceName != null) : "No service name specified"; + assert (factory != null) : "Proxy factory was null"; + this.targetServiceName = serviceName; // external services are configured with only one service + this.targetWireFactory = factory; + } + + public TargetWireFactory getTargetWireFactory(String serviceName) { + if (this.targetServiceName.equals(serviceName)) { + return targetWireFactory; + } else { + return null; + } + } + + public Map<String,TargetWireFactory> getTargetWireFactories() { + if (targetProxyFactories == null) { + targetProxyFactories = new HashMap<String, TargetWireFactory> (1); + targetProxyFactories.put(targetServiceName, targetWireFactory); + } + return targetProxyFactories; + } + + public void addSourceWireFactory(String referenceName, SourceWireFactory factory) { + throw new UnsupportedOperationException(); + } + + public void addSourceWireFactories(String referenceName, Class referenceInterface, List<SourceWireFactory> factory, boolean multiplicity) { + + } + + public List<SourceWireFactory> getSourceWireFactories() { + return Collections.emptyList(); + } + + public void addProperty(String propertyName, Object value) { + throw new UnsupportedOperationException(); + } + + public void prepare(CompositeContext parent) { + //parentContext = parent; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ExternalServiceInvoker.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ExternalServiceInvoker.java new file mode 100644 index 0000000000..0424bf5de6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ExternalServiceInvoker.java @@ -0,0 +1,23 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.core.extension;
+
+public interface ExternalServiceInvoker {
+
+ public Object invoke(String methodName, Object[] args);
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ExternalServiceTargetInvoker.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ExternalServiceTargetInvoker.java new file mode 100644 index 0000000000..0d664e0207 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/ExternalServiceTargetInvoker.java @@ -0,0 +1,122 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.core.extension;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import org.apache.tuscany.core.context.Context;
+import org.apache.tuscany.core.context.ExternalServiceContext;
+import org.apache.tuscany.core.context.QualifiedName;
+import org.apache.tuscany.core.context.ScopeContext;
+import org.apache.tuscany.core.context.TargetException;
+import org.apache.tuscany.core.message.Message;
+import org.apache.tuscany.core.wire.Interceptor;
+import org.apache.tuscany.core.wire.TargetInvoker;
+
+/**
+ * Responsible for invoking an external service
+ *
+ * @version $Rev$ $Date$
+ */
+public class ExternalServiceTargetInvoker implements TargetInvoker {
+
+ private QualifiedName serviceName;
+
+ private String esName;
+
+ private Method method;
+
+ private ScopeContext container;
+
+ private ExternalServiceContext context;
+
+ /**
+ * Constructs a new ExternalWebServiceTargetInvoker.
+ *
+ * @param container
+ */
+ public ExternalServiceTargetInvoker(QualifiedName serviceName, Method method, ScopeContext container) {
+ assert serviceName != null : "No service name specified";
+ assert method != null : "No method specified";
+ assert container != null : "No scope container specified";
+ this.serviceName = serviceName;
+ this.esName = serviceName.getPartName();
+ this.method = method;
+ this.container = container;
+ }
+
+ public Object invokeTarget(Object payload) throws InvocationTargetException {
+ if (context == null) {
+ Context iContext = container.getContext(esName);
+ if (!(iContext instanceof ExternalServiceContext)) {
+ TargetException te = new TargetException("Unexpected target context type");
+ te.setIdentifier(iContext.getClass().getName());
+ te.addContextName(iContext.getName());
+ throw te;
+ }
+ context = (ExternalServiceContext) iContext;
+ }
+
+ ExternalServiceInvoker invoker = (ExternalServiceInvoker) context.getHandler();
+ if (payload != null) {
+ return doInvoke(invoker, (Object[]) payload);
+ } else {
+ return doInvoke(invoker, null);
+ }
+ }
+
+ protected Object doInvoke(ExternalServiceInvoker invoker, Object[] args) {
+ return invoker.invoke(method.getName(), args);
+ }
+
+ public boolean isCacheable() {
+ return false;
+ }
+
+ public Message invoke(Message msg) {
+ try {
+ Object resp = invokeTarget(msg.getBody());
+ msg.setBody(resp);
+ } catch (InvocationTargetException e) {
+ msg.setBody(e.getCause());
+ } catch (Throwable e) {
+ msg.setBody(e);
+ }
+ return msg;
+ }
+
+ public void setNext(Interceptor next) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Object clone() throws CloneNotSupportedException {
+ try {
+ ExternalServiceTargetInvoker invoker = (ExternalServiceTargetInvoker) super.clone();
+ invoker.container = container;
+ invoker.context = this.context;
+ invoker.esName = this.esName;
+ invoker.method = this.method;
+ invoker.serviceName = this.serviceName;
+ return invoker;
+ } catch (CloneNotSupportedException e) {
+ // will not happen
+ return null;
+ }
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/WireBuilderSupport.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/WireBuilderSupport.java new file mode 100644 index 0000000000..5b2d9de0e3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/WireBuilderSupport.java @@ -0,0 +1,102 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.extension; + +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.WireBuilder; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.wire.SourceInvocationConfiguration; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetInvocationConfiguration; +import org.apache.tuscany.core.wire.TargetInvoker; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.osoa.sca.annotations.Init; + +/** + * A base class for {@link WireBuilder} implementations + * + * @version $$Rev$$ $$Date$$ + */ +public abstract class WireBuilderSupport<T extends ContextFactory<?>> implements WireBuilder { + + protected RuntimeContext runtimeContext; + protected Class targetClass; + + @Autowire + public void setRuntimeContext(RuntimeContext context) { + runtimeContext = context; + } + + public WireBuilderSupport() { + // reflect the generic type of the subclass + Type type = this.getClass().getGenericSuperclass(); + if (type instanceof ParameterizedType) { + targetClass = (Class) ((ParameterizedType) type).getActualTypeArguments()[0]; + } else { + throw new AssertionError("Subclasses of " + ContextFactoryBuilderSupport.class.getName() + " must be genericized"); + } + } + + @Init(eager = true) + public void init() throws Exception { + runtimeContext.addBuilder(this); + } + + public void connect(SourceWireFactory sourceFactory, TargetWireFactory targetFactory, Class targetType, boolean downScope, + ScopeContext targetScopeContext) throws BuilderConfigException { + if (!targetClass.isAssignableFrom(targetType)) { + return; + } + + for (SourceInvocationConfiguration sourceInvocationConfig : sourceFactory.getConfiguration().getInvocationConfigurations() + .values()) { + TargetInvoker invoker = createInvoker(sourceFactory.getConfiguration() + .getTargetName(), sourceInvocationConfig.getMethod(), targetScopeContext, downScope); + sourceInvocationConfig.setTargetInvoker(invoker); + } + } + + public void completeTargetChain(TargetWireFactory targetFactory, Class targetType, ScopeContext targetScopeContext) + throws BuilderConfigException { + + if (!targetClass.isAssignableFrom(targetType)) { + return; + } + for (TargetInvocationConfiguration targetInvocationConfig : targetFactory.getConfiguration().getInvocationConfigurations() + .values()) { + Method method = targetInvocationConfig.getMethod(); + TargetInvoker invoker = createInvoker(targetFactory.getConfiguration().getTargetName(), method, targetScopeContext, false); + targetInvocationConfig.setTargetInvoker(invoker); + } + } + + /** + * Callback to create the specific <code>TargetInvoker</code> type for dispatching to the target type + * + * @param targetName the fully qualified name of the wire target + * @param operation the operation the invoker will be associated with + * @param context the scope context that manages the target context + * @param downScope whether the wire source scope is "longer" than the target + */ + protected abstract TargetInvoker createInvoker(QualifiedName targetName, Method operation, ScopeContext context, boolean downScope); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/ImplementationProcessor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/ImplementationProcessor.java new file mode 100644 index 0000000000..b464a7f00f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/ImplementationProcessor.java @@ -0,0 +1,65 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.extension.config; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.core.config.ConfigurationLoadException; + +/** + * Implementations process a Java class and contribute to a {@link org.apache.tuscany.model.assembly.ComponentType} + * or provide some validation function. Implementations may contribute to defined <code>ComponentType</code> + * metadata, a general <code>ComponentType</code> extensibility element, or a more specific Java extensibility + * element, which is associated with {@link org.apache.tuscany.core.extension.config.JavaExtensibilityElement} and + * stored in the <code>ComponentType</code>'s extensibility collection. Processors will typically use {@link + * JavaExtensibilityHelper#getExtensibilityElement(org.apache.tuscany.model.assembly.Extensible)}, which + * provides methods for retrieving the Java extensibility element. + * <p/> + * In the runtime, a {@link org.apache.tuscany.core.config.ComponentTypeIntrospector} system service introspects component implementation + * types when an assembly is loaded, calling out to registered processors in the order defined by {@link + * ComponentTypeIntrospector#introspect(Class<?>)}. Generally, processors are also system services which + * register themeselves with a <code>ComponentTypeIntrospector</code>. For convenience, a processor + * implementation can extend <@link org.apache.tuscany.core.config.processor.ImplementationProcessorSupport}, + * which provides mechanisms for doing this. + * <p/> + * There are a series of bootsrap, or primordial, processors configured in the runtime, and they serve as + * examples of how an <code>ImplementationProcessor</code> can be implemented. + * + * @see org.apache.tuscany.core.config.processor.PropertyProcessor + * @see org.apache.tuscany.core.config.processor.ReferenceProcessor + * @see org.apache.tuscany.core.config.processor.InitProcessor + * @see org.apache.tuscany.core.config.processor.DestroyProcessor + * @see org.apache.tuscany.core.config.processor.ComponentNameProcessor + * + * @version $$Rev$$ $$Date$$ + * @see org.apache.tuscany.core.config.processor.ImplementationProcessorSupport + */ +public interface ImplementationProcessor { + + public void visitClass(Class<?> clazz, ComponentType type) throws ConfigurationLoadException; + + public void visitSuperClass(Class<?> clazz, ComponentType type) throws ConfigurationLoadException; + + public void visitMethod(Method method, ComponentType type) throws ConfigurationLoadException; + + public void visitConstructor(Constructor<?> constructor, ComponentType type) throws ConfigurationLoadException; + + public void visitField(Field field, ComponentType type) throws ConfigurationLoadException; + + public void visitEnd(Class<?> clazz, ComponentType type) throws ConfigurationLoadException; + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/InjectorExtensibilityElement.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/InjectorExtensibilityElement.java new file mode 100644 index 0000000000..50818d1ac0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/InjectorExtensibilityElement.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.extension.config; + +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.injection.Injector; + +/** + * An extensiblity element which provides {@link Injector}s based on component type metadata + * + * @version $$Rev$$ $$Date$$ + */ +public interface InjectorExtensibilityElement extends JavaExtensibilityElement { + + /** + * Creates an injector + * @param resolver that returns the current composite context + */ + public Injector<?> getInjector(ContextResolver resolver); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/JavaExtensibilityElement.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/JavaExtensibilityElement.java new file mode 100644 index 0000000000..fba57d8254 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/JavaExtensibilityElement.java @@ -0,0 +1,25 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.extension.config; + +/** + * Serves as a marker for a metadata extensibility point. For example, {@link ImplementationProcessor}s may + * create extensibility elements which are responsible for implementing injection functionality prescribed by + * a Java source annotation. + * + * @version $$Rev$$ $$Date$$ + */ +public interface JavaExtensibilityElement { + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/extensibility/ComponentNameExtensibilityElement.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/extensibility/ComponentNameExtensibilityElement.java new file mode 100644 index 0000000000..e04ca34da6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/extensibility/ComponentNameExtensibilityElement.java @@ -0,0 +1,52 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.extension.config.extensibility; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.apache.tuscany.core.injection.Injector; +import org.apache.tuscany.core.injection.MethodInjector; +import org.apache.tuscany.core.injection.SingletonObjectFactory; +import org.apache.tuscany.core.injection.FieldInjector; +import org.apache.tuscany.core.extension.config.JavaExtensibilityElement; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class ComponentNameExtensibilityElement implements JavaExtensibilityElement { + + private Method method; + private Field field; + + public ComponentNameExtensibilityElement(Method m) { + method = m; + } + + public ComponentNameExtensibilityElement(Field f) { + field = f; + } + + public Injector<?> getEventInvoker(String name) { + if (method != null) { + return new MethodInjector(method, new SingletonObjectFactory<Object>(name)); + }else{ + return new FieldInjector(field, new SingletonObjectFactory<Object>(name)); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/extensibility/ContextExtensibilityElement.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/extensibility/ContextExtensibilityElement.java new file mode 100644 index 0000000000..9099132e36 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/extensibility/ContextExtensibilityElement.java @@ -0,0 +1,52 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.extension.config.extensibility; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.apache.tuscany.core.extension.config.JavaExtensibilityElement; +import org.apache.tuscany.core.injection.Injector; +import org.apache.tuscany.core.injection.MethodInjector; +import org.apache.tuscany.core.injection.FieldInjector; +import org.apache.tuscany.core.injection.ContextObjectFactory; +import org.apache.tuscany.core.builder.ContextResolver; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class ContextExtensibilityElement implements JavaExtensibilityElement { + + private Method method; + private Field field; + + public ContextExtensibilityElement(Method m) { + method = m; + } + + public ContextExtensibilityElement(Field f) { + field = f; + } + + public Injector<?> getInjector(ContextResolver resolver) { + if (method != null) { + return new MethodInjector(method, new ContextObjectFactory(resolver)); + } else { + return new FieldInjector(field, new ContextObjectFactory(resolver)); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/extensibility/DestroyInvokerExtensibilityElement.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/extensibility/DestroyInvokerExtensibilityElement.java new file mode 100644 index 0000000000..9952f507b2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/extensibility/DestroyInvokerExtensibilityElement.java @@ -0,0 +1,29 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.extension.config.extensibility; + +import java.lang.reflect.Method; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class DestroyInvokerExtensibilityElement extends InvokerExtensibilityElement{ + + public DestroyInvokerExtensibilityElement(Method m) { + super(m); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/extensibility/InitInvokerExtensibilityElement.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/extensibility/InitInvokerExtensibilityElement.java new file mode 100644 index 0000000000..4c542b4b5d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/extensibility/InitInvokerExtensibilityElement.java @@ -0,0 +1,37 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.extension.config.extensibility; + +import java.lang.reflect.Method; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class InitInvokerExtensibilityElement extends InvokerExtensibilityElement{ + + private boolean eager; + + public InitInvokerExtensibilityElement(Method m, boolean eager) { + super(m); + this.eager = eager; + } + + public boolean isEager() { + return eager; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/extensibility/InvokerExtensibilityElement.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/extensibility/InvokerExtensibilityElement.java new file mode 100644 index 0000000000..a87acd16cc --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/extension/config/extensibility/InvokerExtensibilityElement.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.extension.config.extensibility; + +import java.lang.reflect.Method; + +import org.apache.tuscany.core.extension.config.JavaExtensibilityElement; +import org.apache.tuscany.core.injection.MethodEventInvoker; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class InvokerExtensibilityElement implements JavaExtensibilityElement { + + private Method method; + private MethodEventInvoker invoker; + + public InvokerExtensibilityElement(Method m) { + method = m; + } + + public MethodEventInvoker getEventInvoker() { + if (invoker == null) { + invoker = new MethodEventInvoker(method); + } + return invoker; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/ContextObjectFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/ContextObjectFactory.java new file mode 100644 index 0000000000..6facd25e59 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/ContextObjectFactory.java @@ -0,0 +1,41 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.injection; + +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.context.CompositeContext; + +/** + * An implementation of <code>ObjectFactory</code> that resolves the current parent context + * + * @version $Rev: 380903 $ $Date: 2006-02-25 00:53:26 -0800 (Sat, 25 Feb 2006) $ + */ +public class ContextObjectFactory implements ObjectFactory<CompositeContext> { + + private final ContextResolver resolver; + + public ContextObjectFactory(ContextResolver resolver) { + assert (resolver != null) : "Resolver cannot be null"; + this.resolver = resolver; + } + + public CompositeContext getInstance() { + return resolver.getCurrentContext(); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/EventInvoker.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/EventInvoker.java new file mode 100644 index 0000000000..6f5de43b96 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/EventInvoker.java @@ -0,0 +1,33 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.injection; + +/** + * Performs an wire on an instance + * + * @version $Rev$ $Date$ + * @see MethodEventInvoker + */ +public interface EventInvoker<T> { + + /** + * Performs the wire on a given instance + * + * @throws ObjectCallbackException + */ + void invokeEvent(T instance) throws ObjectCallbackException; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/FactoryInitException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/FactoryInitException.java new file mode 100644 index 0000000000..589ae796ac --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/FactoryInitException.java @@ -0,0 +1,43 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.injection; + +/** + * Denotes an exception initializing an object factory + * + * @version $Rev$ $Date$ + */ +public class FactoryInitException extends InjectionRuntimeException { + + public FactoryInitException(String message, Throwable cause) { + super(message, cause); + } + + public FactoryInitException(String message) { + super(message); + } + + public FactoryInitException(Throwable cause) { + super(cause); + } + + public FactoryInitException() { + super(); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/FieldInjector.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/FieldInjector.java new file mode 100644 index 0000000000..7be73462d3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/FieldInjector.java @@ -0,0 +1,53 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.injection; + +import org.apache.tuscany.core.builder.ObjectFactory; + +import java.lang.reflect.Field; + +/** + * Injects a value created by an {@link ObjectFactory} on a given field + * + * @version $Rev$ $Date$ + */ +public class FieldInjector<T> implements Injector<T> { + + private final Field field; + + private final ObjectFactory<?> objectFactory; + + /** + * Create an injector and have it use the given <code>ObjectFactory</code> + * to inject a value on the instance using the reflected <code>Field</code> + */ + public FieldInjector(Field field, ObjectFactory<?> objectFactory) { + this.field = field; + this.objectFactory = objectFactory; + } + + /** + * Inject a new value on the given isntance + */ + public void inject(T instance) throws ObjectCreationException { + try { + field.set(instance, objectFactory.getInstance()); + } catch (IllegalAccessException e) { + throw new AssertionError("Field is not accessible [" + field + "]"); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/InjectionRuntimeException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/InjectionRuntimeException.java new file mode 100644 index 0000000000..2c26f3c4b1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/InjectionRuntimeException.java @@ -0,0 +1,45 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.injection; + +import org.apache.tuscany.common.TuscanyRuntimeException; + +/** + * Root unchecked exception for the injection package + * + * @version $Rev$ $Date$ + */ +public abstract class InjectionRuntimeException extends TuscanyRuntimeException { + + public InjectionRuntimeException() { + super(); + } + + public InjectionRuntimeException(String message) { + super(message); + } + + public InjectionRuntimeException(String message, Throwable cause) { + super(message, cause); + } + + public InjectionRuntimeException(Throwable cause) { + super(cause); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/Injector.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/Injector.java new file mode 100644 index 0000000000..306dab3e98 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/Injector.java @@ -0,0 +1,33 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.injection; + +/** + * Implementations inject a pre-configured value on an instance + * + * @version $Rev$ $Date$ + * @see MethodInjector + * @see FieldInjector + */ +public interface Injector<T> { + + /** + * Inject a value on the given instance + */ + void inject(T instance) throws ObjectCreationException; + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/InterCompositeReferenceFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/InterCompositeReferenceFactory.java new file mode 100644 index 0000000000..55d8a88790 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/InterCompositeReferenceFactory.java @@ -0,0 +1,75 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.injection; + +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.TargetException; + +/** + * Returns a direct reference to a target service exposed in another composite, i.e. the factory avoids creating proxies + * and returns the actual target instance + * + * @version $Rev: 384135 $ $Date: 2006-03-07 22:53:58 -0800 (Tue, 07 Mar 2006) $ + */ +public class InterCompositeReferenceFactory<T> implements ObjectFactory<T> { + + private ContextResolver resolver; + + private QualifiedName targetQualifiedName; + + /** + * Reference source is an external service, target is in another module + * + * @param targetName the name of the target service + */ + public InterCompositeReferenceFactory(String targetName) { + targetQualifiedName = new QualifiedName(targetName); + } + + public void setContextResolver(ContextResolver resolver){ + this.resolver = resolver; + } + + public T getInstance() throws ObjectCreationException { + // only return entry points since this is an inter-module wire + Object o = resolver.getCurrentContext().getInstance(targetQualifiedName); + if (o != null) { + return (T) o; + } else { + // walk up the hierarchy of composite contexts + CompositeContext ctx = resolver.getCurrentContext(); + do { + if (ctx == null) { + break; // reached top of context hierarchy + } + Context compContext = ctx.getContext(targetQualifiedName.getPartName()); + if (compContext != null) { + o = compContext.getInstance(targetQualifiedName); + if (o != null) { + return (T) o; + } + } + ctx = ctx.getParent(); + } while (ctx != null); + TargetException e = new TargetException("Target reference not found"); + e.setIdentifier(targetQualifiedName.getQualifiedName()); + throw e; + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/JNDIObjectFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/JNDIObjectFactory.java new file mode 100644 index 0000000000..bed7db887a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/JNDIObjectFactory.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.injection; + +import javax.naming.Context; +import javax.naming.NamingException; + +import org.apache.tuscany.core.builder.ObjectFactory; + +/** + * An implementation of ObjectFactory that creates instances + * by looking them up in a JNDI context. + * + * @version $Rev$ $Date$ + */ +public class JNDIObjectFactory<T> implements ObjectFactory<T> { + private final Context context; + private final String name; + + public JNDIObjectFactory(Context context, String name) { + this.context = context; + this.name = name; + } + + public T getInstance() throws ObjectCreationException { + try { + return (T) context.lookup(name); + } catch (NamingException e) { + throw new ObjectCreationException(e); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/MethodEventInvoker.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/MethodEventInvoker.java new file mode 100644 index 0000000000..69c7670c03 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/MethodEventInvoker.java @@ -0,0 +1,47 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.injection; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * Performs an wire on a method of a given instance + * + * @version $Rev$ $Date$ + */ +public class MethodEventInvoker<T> implements EventInvoker<T> { + private final Method method; + + /** + * Intantiates an invoker for the given method + */ + public MethodEventInvoker(Method method) { + this.method = method; + } + + public void invokeEvent(T instance) throws ObjectCallbackException { + try { + method.invoke(instance, (Object[]) null); + } catch (IllegalAccessException e) { + throw new AssertionError("Method is not accessible [" + method + "]"); + } catch (InvocationTargetException e) { + throw new ObjectCallbackException("Exception thrown by callback method [" + method + "]", e); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/MethodInjector.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/MethodInjector.java new file mode 100644 index 0000000000..6095061872 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/MethodInjector.java @@ -0,0 +1,48 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.injection; + +import org.apache.tuscany.core.builder.ObjectFactory; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * Injects a value created by an {@link ObjectFactory} using a given method + * @version $Rev$ $Date$ + */ +public class MethodInjector<T> implements Injector<T> { + private final Method method; + private final ObjectFactory<?> objectFactory; + + public MethodInjector(Method method, ObjectFactory<?> objectFactory) { + this.method = method; + this.objectFactory = objectFactory; + } + + public void inject(T instance) throws ObjectCreationException { + try { + method.invoke(instance, objectFactory.getInstance()); + } catch (IllegalAccessException e) { + throw new AssertionError("Method is not accessible [" + method + "]"); + } catch (InvocationTargetException e) { + ObjectCreationException oce= new ObjectCreationException("Exception thrown by setter", e); + oce.setIdentifier(method.getName()); + throw oce; + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/NonProxiedTargetFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/NonProxiedTargetFactory.java new file mode 100644 index 0000000000..7f7a307433 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/NonProxiedTargetFactory.java @@ -0,0 +1,54 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.injection; + +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.model.assembly.ConfiguredService; + +/** + * Returns a direct reference to a target within the same composite, i.e. the factory avoids creating proxies and + * returns the actual target instance + * + * @version $Rev$ $Date$ + */ +public class NonProxiedTargetFactory<T> implements ObjectFactory<T> { + + private ContextResolver resolver; + + // the name of the target component/service for this reference + private QualifiedName targetName; + private QualifiedName qualifiedServiceName; + + /** + * Constructs a reference object factory from a configured reference on a type + * + * @throws FactoryInitException + */ + public NonProxiedTargetFactory(ConfiguredService targetService, ContextResolver resolver) throws FactoryInitException { + assert (targetService != null) : "Target service was null"; + assert (resolver != null) : "Context resolver was null"; + + this.resolver = resolver; + targetName = new QualifiedName(targetService.getPart().getName()); + qualifiedServiceName = new QualifiedName("./"+targetName.getPortName()); + } + + public T getInstance() throws ObjectCreationException { + return (T) resolver.getCurrentContext().getContext(targetName.getPartName()).getInstance(qualifiedServiceName); //locateInstance(targetName); //locateInstance(targetName); + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/NullEventInvoker.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/NullEventInvoker.java new file mode 100644 index 0000000000..e8f109f2d8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/NullEventInvoker.java @@ -0,0 +1,30 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.injection; + +/** + * A no-op invoker + * + * @version $Rev$ $Date$ + */ +public final class NullEventInvoker<T> implements EventInvoker<T> { + public static final EventInvoker<?> NULL_INVOKER = new NullEventInvoker(); + + public void invokeEvent(T instance) { + // does nothing + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/ObjectCallbackException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/ObjectCallbackException.java new file mode 100644 index 0000000000..44edee43eb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/ObjectCallbackException.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.injection; + +/** + * Denotes an error when invoking on an object + * + * @version $Rev$ $Date$ + */ +public class ObjectCallbackException extends InjectionRuntimeException { + + public ObjectCallbackException() { + super(); + } + + public ObjectCallbackException(String message) { + super(message); + } + + public ObjectCallbackException(String message, Throwable cause) { + super(message, cause); + } + + public ObjectCallbackException(Throwable cause) { + super(cause); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/ObjectCreationException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/ObjectCreationException.java new file mode 100644 index 0000000000..875eda3680 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/ObjectCreationException.java @@ -0,0 +1,43 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.injection; + +/** + * Denotes an error creating a new object instance + * + * @version $Rev$ $Date$ + */ +public class ObjectCreationException extends InjectionRuntimeException { + + public ObjectCreationException() { + super(); + } + + public ObjectCreationException(String message) { + super(message); + } + + public ObjectCreationException(String message, Throwable cause) { + super(message, cause); + } + + public ObjectCreationException(Throwable cause) { + super(cause); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/PojoObjectFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/PojoObjectFactory.java new file mode 100644 index 0000000000..fac8248b0c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/PojoObjectFactory.java @@ -0,0 +1,76 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.injection; + +import org.apache.tuscany.core.builder.ObjectFactory; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Collections; +import java.util.List; + +/** + * Creates new instances of a Java class, calling a given set of injectors to configure the instance + * + * @version $Rev$ $Date$ + * @see Injector + */ +public class PojoObjectFactory<T> implements ObjectFactory<T> { + + private static final ObjectFactory[] NO_INIT_PARAM = {}; + + private static final List<Injector> NO_SETTER_PARAM = Collections.emptyList(); + + private final Constructor<T> ctr; + + private final ObjectFactory<?>[] initParamsArray; + + private final List<Injector> setters; + + public PojoObjectFactory(Constructor<T> ctr, List<ObjectFactory> initParams, List<Injector> setters) { + this.ctr = ctr; + if (initParams != null && initParams.size() > 0) { + initParamsArray = initParams.toArray(new ObjectFactory[initParams.size()]); + } else { + initParamsArray = NO_INIT_PARAM; + } + this.setters = setters != null ? setters : NO_SETTER_PARAM; + } + + public T getInstance() throws ObjectCreationException { + Object[] initargs = new Object[initParamsArray.length]; + // create the constructor arg array + for (int i = 0; i < initParamsArray.length; i++) { + ObjectFactory<?> objectFactory = initParamsArray[i]; + initargs[i] = objectFactory.getInstance(); + } + try { + T instance = ctr.newInstance(initargs); + // interate through the injectors and inject the instance + for (Injector<T> setter : setters) { + setter.inject(instance); + } + return instance; + } catch (InstantiationException e) { + throw new AssertionError("Class is not instantiable [" + ctr.getDeclaringClass().getName() + "]"); + } catch (IllegalAccessException e) { + throw new AssertionError("Constructor is not accessible [" + ctr + "]"); + } catch (InvocationTargetException e) { + throw new ObjectCreationException("Exception thrown by constructor [" + ctr + "]", e); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/SingletonObjectFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/SingletonObjectFactory.java new file mode 100644 index 0000000000..8a7e0bf782 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/injection/SingletonObjectFactory.java @@ -0,0 +1,37 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.injection; + +import org.apache.tuscany.core.builder.ObjectFactory; + +/** + * Implementation of ObjectFactory that returns a single instance, typically an immutable type. + * + * @version $Rev$ $Date$ + */ +public class SingletonObjectFactory<T> implements ObjectFactory<T> { + private final T instance; + + public SingletonObjectFactory(T instance) { + this.instance = instance; + } + + public T getInstance() { + return instance; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/InvalidPropertyFactoryException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/InvalidPropertyFactoryException.java new file mode 100644 index 0000000000..9ccbbb3a7a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/InvalidPropertyFactoryException.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader; + +import org.apache.tuscany.core.config.ConfigurationLoadException; + +/** + * Exception raised if there is a problem configuring a PropertyFactory. + * + * @version $Rev$ $Date$ + */ +public class InvalidPropertyFactoryException extends ConfigurationLoadException { + private static final long serialVersionUID = 5017976138519117474L; + + /** + * Constructor indicating the cause why the property factory could not be created. + * + * @param className the name of the class that is intended to be the PropertyFactory + * @param cause the Throwable that prevented the PropertyFactory from being created + */ + public InvalidPropertyFactoryException(String className, Throwable cause) { + super(className, cause); + } + + /** + * Returns the name of the property factory implementation class. + * @return the name of the property factory implementation class + */ + public String getClassName() { + return getMessage(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/LoaderContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/LoaderContext.java new file mode 100644 index 0000000000..cef7353bbf --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/LoaderContext.java @@ -0,0 +1,47 @@ +/** + * + * Copyright 2006 The Apache Software Foundation or its licensors as applicable + * + * Licensed 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.core.loader; + +import org.apache.tuscany.common.resource.ResourceLoader; + +/** + * Context holder that can be used during the load process to store information + * that is not part of the logical model. This should be regarded as transient + * and references to this context should not be stored inside the model. + * + * @version $Rev$ $Date$ + */ +public class LoaderContext { + private final ResourceLoader resourceLoader; + + /** + * Constructor specifying the loader for application resources. + * + * @param resourceLoader the loader for application resources + */ + public LoaderContext(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } + + /** + * Returns a resource loader that can be used to load application resources. + * @return a resource loader that can be used to load application resources + */ + public ResourceLoader getResourceLoader() { + return resourceLoader; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/StAXElementLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/StAXElementLoader.java new file mode 100644 index 0000000000..e1a9f55ca4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/StAXElementLoader.java @@ -0,0 +1,40 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.model.assembly.AssemblyObject; + +/** + * A loader that creates a model object from a StAX input stream. + * + * @version $Rev$ $Date$ + */ +public interface StAXElementLoader<T extends AssemblyObject> { + /** + * Build the model object for an element in an XML stream. + * When this method returns the stream will be positioned on the corresponding END_ELEMENT. + * + * @param reader the XML stream reader positioned on the applicable START_ELEMENT + * @param loaderContext the context for the load operation + * @return the model object for that element + */ + T load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/StAXLoaderRegistry.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/StAXLoaderRegistry.java new file mode 100644 index 0000000000..a38d388815 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/StAXLoaderRegistry.java @@ -0,0 +1,91 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyObject; + +/** + * Registry for XML loaders that can parse a StAX input stream and return model objects. + * <p/> + * Loaders will typically be contributed to the system by any extension that needs to + * handle extension specific information contained in some XML configuration file. + * The loader can be contributed as a system component with an autowire reference + * to this registry which is used during initialization to actually register. + * </p> + * This registry can also be used to parse an input stream, dispatching to the + * appropriate loader for each element accepted. Loaders can call back to the + * registry to load sub-elements that they are not able to handle directly. + * + * @version $Rev$ $Date$ + */ +public interface StAXLoaderRegistry { + /** + * Register a loader. This operation will typically be called by a loader + * during its initialization. + * + * @param element the element that should be delegated to the contibuted loader + * @param loader a loader that is being contributed to the system + */ + <T extends AssemblyObject> void registerLoader(QName element, StAXElementLoader<T> loader); + + /** + * Unregister a loader. This will typically be called by a loader as it is being destroyed. + * + * @param element the element that was being delegated to the contibuted loader + * @param loader a loader that should no longer be used + */ + <T extends AssemblyObject> void unregisterLoader(QName element, StAXElementLoader<T> loader); + + /** + * Parse the supplied XML stream dispatching to the appropriate registered loader + * for each element encountered in the stream. + * <p/> + * This method must be called with the XML cursor positioned on a START_ELEMENT event. + * When this method returns, the stream will be positioned on the corresponding + * END_ELEMENT event. + * + * @param reader the XML stream to parse + * @param loaderContext + * @return the model object obtained by parsing the current element on the stream + * @throws XMLStreamException if there was a problem reading the stream + */ + AssemblyObject load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException; + + /** + * Hack to allow loaders to initialize model objects on the fly. + * Remove when initialization has been moved from the model implementation to the loader. + * + * @return the model context for this load operation + */ + @Deprecated + AssemblyContext getContext(); + + /** + * Hack to allow loaders to initialize model objects on the fly. + * Remove when initialization has been moved from the model implementation to the loader. + * + * @param context the model context for this load operation + */ + @Deprecated + void setContext(AssemblyContext context); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/StAXPropertyFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/StAXPropertyFactory.java new file mode 100644 index 0000000000..a05597b51b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/StAXPropertyFactory.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader; + +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.model.assembly.Property; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +/** + * A factory that will create an ObjectFactory for a property by parsing a StAX XMLStreamReader. + * + * @version $Rev$ $Date$ + */ +public interface StAXPropertyFactory<T> { + /** + * Return an ObjectFactory for instances of a property defined in an XML stream. + * + * @param reader the reader to use to access the XML stream + * @param property the Property definition that the resulting ObjectFactory must be able to assign to + * @return an ObjectFactory that can produce instances that can be assigned to the supplied Property + * @throws XMLStreamException if there is a problem reading the stream + * @throws ConfigurationLoadException if there is a problem creating the ObjectFactory + */ + ObjectFactory<T> createObjectFactory(XMLStreamReader reader, Property property) throws XMLStreamException, ConfigurationLoadException; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/StAXUtil.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/StAXUtil.java new file mode 100644 index 0000000000..f9ac2b0559 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/StAXUtil.java @@ -0,0 +1,160 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.core.config.ComponentTypeIntrospector; +import org.apache.tuscany.core.config.ConfigurationException; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.impl.Java5ComponentTypeIntrospector; +import org.apache.tuscany.core.config.processor.ProcessorUtils; +import org.apache.tuscany.core.loader.assembly.ComponentLoader; +import org.apache.tuscany.core.loader.assembly.EntryPointLoader; +import org.apache.tuscany.core.loader.assembly.InterfaceJavaLoader; +import org.apache.tuscany.core.loader.assembly.ModuleFragmentLoader; +import org.apache.tuscany.core.loader.assembly.ModuleLoader; +import org.apache.tuscany.core.loader.impl.StAXLoaderRegistryImpl; +import org.apache.tuscany.core.loader.impl.StringParserPropertyFactory; +import org.apache.tuscany.core.loader.system.SystemBindingLoader; +import org.apache.tuscany.core.loader.system.SystemImplementationLoader; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.core.system.assembly.SystemImplementation; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.ModuleComponent; +import org.apache.tuscany.model.assembly.Multiplicity; +import org.apache.tuscany.model.assembly.OverrideOption; +import org.apache.tuscany.model.assembly.Scope; + +/** + * @version $Rev$ $Date$ + */ +public final class StAXUtil { + private static final Map<String, Multiplicity> MULTIPLICITY = new HashMap<String, Multiplicity>(4); + private static final Map<String, OverrideOption> OVERRIDE_OPTIONS = new HashMap<String, OverrideOption>(3); + + static { + MULTIPLICITY.put("0..1", Multiplicity.ZERO_ONE); + MULTIPLICITY.put("1..1", Multiplicity.ONE_ONE); + MULTIPLICITY.put("0..n", Multiplicity.ZERO_N); + MULTIPLICITY.put("1..n", Multiplicity.ONE_N); + + OVERRIDE_OPTIONS.put("no", OverrideOption.NO); + OVERRIDE_OPTIONS.put("may", OverrideOption.MAY); + OVERRIDE_OPTIONS.put("must", OverrideOption.MUST); + } + + private StAXUtil() { + } + + public static void skipToEndElement(XMLStreamReader reader) throws XMLStreamException { + int depth = 0; + while (true) { + int event = reader.next(); + if (event == XMLStreamConstants.START_ELEMENT) { + depth++; + } else if (event == XMLStreamConstants.END_ELEMENT) { + if (depth == 0) { + return; + } + depth--; + } + } + } + + public static Multiplicity multiplicity(String multiplicity, Multiplicity def) { + return multiplicity == null ? def : MULTIPLICITY.get(multiplicity); + } + + public static OverrideOption overrideOption(String overrideOption, OverrideOption def) { + return overrideOption == null ? def : OVERRIDE_OPTIONS.get(overrideOption); + } + + public static ModuleComponent bootstrapLoader(String name, AssemblyContext context) throws ConfigurationLoadException { + SystemAssemblyFactory factory = new SystemAssemblyFactoryImpl(); + ComponentTypeIntrospector introspector = ProcessorUtils.createCoreIntrospector(factory); + Module module = factory.createModule(); + module.setName("org.apache.tuscany.core.system.loader"); + + List<Component> components = module.getComponents(); + + // bootstrap the minimal set of loaders needed to read the system module files + // all others should be defined in the system.module file + components.add(bootstrapLoader(factory, introspector, ModuleLoader.class)); + components.add(bootstrapLoader(factory, introspector, ModuleFragmentLoader.class)); + Component propFactory = factory.createSystemComponent("org.apache.tuscany.core.system.loader.DefaultPropertyFactory", StAXPropertyFactory.class, StringParserPropertyFactory.class, Scope.MODULE); + introspector.introspect(StAXPropertyFactory.class); + components.add(propFactory); + components.add(bootstrapLoader(factory, introspector, ComponentLoader.class)); + components.add(bootstrapLoader(factory, introspector, EntryPointLoader.class)); + components.add(bootstrapLoader(factory, introspector, InterfaceJavaLoader.class)); + components.add(bootstrapLoader(factory, introspector, SystemImplementationLoader.class)); + components.add(bootstrapLoader(factory, introspector, SystemBindingLoader.class)); + // do not add additional loaders above - they should be in the system.module file + + // bootstrap the registries needed by the bootstrap loaders above + bootstrapService(factory, introspector, module, StAXLoaderRegistry.class, StAXLoaderRegistryImpl.class); + bootstrapService(factory, introspector, module, SystemAssemblyFactory.class, SystemAssemblyFactoryImpl.class); + bootstrapService(factory, introspector, module, ComponentTypeIntrospector.class, Java5ComponentTypeIntrospector.class); + + ModuleComponent mc = factory.createModuleComponent(); + mc.setName(name); + mc.setImplementation(module); + mc.initialize(context); + return mc; + } + + private static Component bootstrapLoader(SystemAssemblyFactory factory, ComponentTypeIntrospector introspector, Class<?> loaderClass) { + SystemImplementation implementation = factory.createSystemImplementation(); + implementation.setImplementationClass(loaderClass); + try { + implementation.setComponentType(introspector.introspect(loaderClass)); + } catch (ConfigurationException e) { + throw (AssertionError) new AssertionError("Invalid bootstrap loader").initCause(e); + } + Component component = factory.createSimpleComponent(); + component.setName(loaderClass.getName()); + component.setImplementation(implementation); + return component; + } + + private static <T> void bootstrapService(SystemAssemblyFactory factory, ComponentTypeIntrospector introspector, Module module, Class<T> service, Class<? extends T> impl) { + String epName = service.getName(); + String compName = impl.getName(); + + Component component = factory.createSystemComponent(compName, service, impl, Scope.MODULE); + try { + component.getImplementation().setComponentType(introspector.introspect(impl)); + } catch (ConfigurationException e) { + throw (AssertionError) new AssertionError("Invalid bootstrap loader").initCause(e); + } + + EntryPoint entryPoint = factory.createSystemEntryPoint(epName, service, compName); + + module.getComponents().add(component); + module.getEntryPoints().add(entryPoint); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/WSDLDefinitionRegistry.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/WSDLDefinitionRegistry.java new file mode 100644 index 0000000000..f88e0f0b35 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/WSDLDefinitionRegistry.java @@ -0,0 +1,95 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader; + +import java.net.URL; +import java.util.List; +import java.io.IOException; +import javax.wsdl.Definition; +import javax.wsdl.PortType; +import javax.wsdl.Service; +import javax.wsdl.WSDLException; +import javax.wsdl.extensions.ExtensionRegistry; +import javax.xml.namespace.QName; + +import org.apache.tuscany.common.resource.ResourceLoader; + +/** + * @version $Rev$ $Date$ + */ +public interface WSDLDefinitionRegistry { + /** + * Loads and registers a WSDL Definition. + * + * @param namespace the expected namespace, or null if any namespace should be allowed + * @param location the location to load the definition from + * @param resourceLoader the application resource loader + * @return the loaded Definition + * @throws IOException if there was a problem reading the document + * @throws WSDLException if there was a problem parsing the definition + */ + Definition loadDefinition(String namespace, URL location, ResourceLoader resourceLoader) throws IOException, WSDLException; + + /** + * Load and register a WSDL definition as specified in a WSDL2.0 wsdlLocation attribute. + * + * @param wsdlLocation the value of the wsdlLocation attribute + * @param resourceLoader application resource loader used to support relative locations + * @return the loaded Definition + * @throws IOException if there was a problem reading the document + * @throws WSDLException if there was a problem parsing the definition + */ + Definition loadDefinition(String wsdlLocation, ResourceLoader resourceLoader) throws IOException, WSDLException; + + /** + * Returns the PortType with the supplied qualified name, or null if no such port has been defined. + * + * @param name the qualified name of the WSDL portType + * @param resourceLoader the application resource loader + * @return the PortType for the supplied name, or null if none has been defined + */ + PortType getPortType(QName name, ResourceLoader resourceLoader); + + /** + * Returns the Service with the supplied qualified name, or null if no such service has been defined. + * + * @param name the qualified name of the WSDL service + * @param resourceLoader the application resource loader + * @return the Service for the supplied name, or null if none has been defined + */ + Service getService(QName name, ResourceLoader resourceLoader); + + + /** + * Returns a list of definitions that have been loaded for the given namespace, or null if + * no WSDL documents have been loaded for the given namespace + * + * @param namespace the namespace to lookup + * @param resourceLoader the application resource loader + * @return The list of definitions that have been loaded for the given namespace, or null + */ + List<Definition> getDefinitionsForNamespace(String namespace, ResourceLoader resourceLoader); + + + /** + * Returns the ExtensionRegistry that is used when parsing WSDL documents during the + * loadDefinition call. + * + * @return the ExtensionRegistry that is used when parsing WSDL documents. + */ + ExtensionRegistry getExtensionRegistry(); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/AbstractLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/AbstractLoader.java new file mode 100644 index 0000000000..fce343df4b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/AbstractLoader.java @@ -0,0 +1,61 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import javax.xml.namespace.QName; + +import org.apache.tuscany.core.loader.StAXElementLoader; +import org.apache.tuscany.core.loader.StAXLoaderRegistry; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.osoa.sca.annotations.Destroy; +import org.osoa.sca.annotations.Init; + +/** + * @version $Rev$ $Date$ + */ +public abstract class AbstractLoader<T extends AssemblyObject> implements StAXElementLoader<T> { + protected SystemAssemblyFactory factory; + protected StAXLoaderRegistry registry; + + @Autowire + public void setFactory(SystemAssemblyFactory factory) { + this.factory = factory; + } + + @Autowire + public void setRegistry(StAXLoaderRegistry registry) { + this.registry = registry; + } + + @Init(eager = true) + public void start() { + registry.registerLoader(getXMLType(), this); + } + + @Destroy + public void stop() { + registry.unregisterLoader(getXMLType(), this); + } + + /** + * Returns the QName of the element that this implementation handles. + * @return the QName of the element that this implementation handles + */ + protected abstract QName getXMLType(); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/AssemblyConstants.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/AssemblyConstants.java new file mode 100644 index 0000000000..73ef4119f8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/AssemblyConstants.java @@ -0,0 +1,47 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import javax.xml.namespace.QName; + +/** + * @version $Rev$ $Date$ + */ +public final class AssemblyConstants { + public static final String SCA_NAMESPACE = "http://www.osoa.org/xmlns/sca/0.9"; + + public static final QName COMPONENT = new QName(SCA_NAMESPACE, "component"); + public static final QName COMPONENT_TYPE = new QName(SCA_NAMESPACE, "componentType"); + public static final QName ENTRY_POINT = new QName(SCA_NAMESPACE, "entryPoint"); + public static final QName EXTERNAL_SERVICE = new QName(SCA_NAMESPACE, "externalService"); + public static final QName IMPORT_WSDL = new QName(SCA_NAMESPACE, "import.wsdl"); + public static final QName INTERFACE_JAVA = new QName(SCA_NAMESPACE, "interface.java"); + public static final QName INTERFACE_WSDL = new QName(SCA_NAMESPACE, "interface.wsdl"); + public static final QName MODULE = new QName(SCA_NAMESPACE, "module"); + public static final QName MODULE_FRAGMENT = new QName(SCA_NAMESPACE, "moduleFragment"); + public static final QName PROPERTY = new QName(SCA_NAMESPACE, "property"); + public static final QName PROPERTIES = new QName(SCA_NAMESPACE, "properties"); + public static final QName REFERENCE = new QName(SCA_NAMESPACE, "reference"); + public static final QName REFERENCES = new QName(SCA_NAMESPACE, "references"); + public static final QName SERVICE = new QName(SCA_NAMESPACE, "service"); + public static final QName WIRE = new QName(SCA_NAMESPACE, "wire"); + public static final QName WIRE_SOURCE = new QName(SCA_NAMESPACE, "source.uri"); + public static final QName WIRE_TARGET = new QName(SCA_NAMESPACE, "target.uri"); + + private AssemblyConstants() { + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ComponentLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ComponentLoader.java new file mode 100644 index 0000000000..0fa3e7ddeb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ComponentLoader.java @@ -0,0 +1,189 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import java.util.List; +import javax.xml.namespace.QName; +import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; +import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.InvalidPropertyFactoryException; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.core.loader.StAXPropertyFactory; +import org.apache.tuscany.core.loader.StAXUtil; +import static org.apache.tuscany.core.loader.assembly.AssemblyConstants.*; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.ConfiguredProperty; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.Implementation; +import org.apache.tuscany.model.assembly.OverrideOption; +import org.apache.tuscany.model.assembly.Property; +import org.osoa.sca.annotations.Scope; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class ComponentLoader extends AbstractLoader { + private StAXPropertyFactory<?> defaultPropertyFactory; + + @Autowire + public void setDefaultPropertyFactory(StAXPropertyFactory<?> defaultPropertyFactory) { + this.defaultPropertyFactory = defaultPropertyFactory; + } + + public QName getXMLType() { + return COMPONENT; + } + + public Component load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + assert COMPONENT.equals(reader.getName()); + + Component component = factory.createSimpleComponent(); + component.setName(reader.getAttributeValue(null, "name")); + + while (true) { + switch (reader.next()) { + case START_ELEMENT: + QName name = reader.getName(); + if (PROPERTIES.equals(name)) { + loadProperties(reader, loaderContext.getResourceLoader(), component); + } else if (REFERENCES.equals(name)) { + loadReferences(reader, component); + } else { + AssemblyObject o = registry.load(reader, loaderContext); + if (o instanceof Implementation) { + Implementation impl = (Implementation) o; + impl.initialize(registry.getContext()); + component.setImplementation(impl); + } + } + reader.next(); + break; + case END_ELEMENT: + List<Property> props = component.getImplementation().getComponentType().getProperties(); + for (Property property : props) { + if (property.isRequired()) { + if (component.getConfiguredProperty(property.getName()) == null) { + ConfigurationLoadException e = new ConfigurationLoadException("Required property not configured"); + e.setIdentifier(property.getName()); + throw e; + } + } + } + return component; + } + } + } + + protected void loadProperties(XMLStreamReader reader, ResourceLoader resourceLoader, Component<?> component) throws XMLStreamException, ConfigurationLoadException { + ComponentType componentType = component.getImplementation().getComponentType(); + List<ConfiguredProperty> configuredProperties = component.getConfiguredProperties(); + + while (true) { + switch (reader.next()) { + case START_ELEMENT: + String name = reader.getLocalName(); + Property property = componentType.getProperty(name); + if (property == null) { + throw new ConfigurationLoadException(name); + } + OverrideOption override = StAXUtil.overrideOption(reader.getAttributeValue(null, "override"), OverrideOption.NO); + +// get a factory for the property + StAXPropertyFactory<?> propertyFactory; + String factoryName = reader.getAttributeValue(null, "factory"); + if (factoryName == null) { + propertyFactory = defaultPropertyFactory; + } else { + propertyFactory = getPropertyFactory(factoryName, resourceLoader); + } + + // create the property value + // FIXME to support complex types we probably should store the factory in the ConfiguredProperty + // FIXME instead of the value as the value may be mutable and should not be shared between instances + ObjectFactory<?> objectFactory = propertyFactory.createObjectFactory(reader, property); + Object value = objectFactory.getInstance(); + + // create the configured property definition + ConfiguredProperty configuredProperty = factory.createConfiguredProperty(); + configuredProperty.setName(name); + configuredProperty.setValue(value); + configuredProperty.setOverrideOption(override); + configuredProperties.add(configuredProperty); + break; + case END_ELEMENT: + return; + } + } + } + + protected StAXPropertyFactory<?> getPropertyFactory(String factoryName, ResourceLoader resourceLoader) throws InvalidPropertyFactoryException { + Class<?> impl; + try { + // try to load factory from application classloader + impl = resourceLoader.loadClass(factoryName); + } catch (ClassNotFoundException e) { + try { + // try to load factory from container classloader + impl = Class.forName(factoryName); + } catch (ClassNotFoundException e1) { + throw new InvalidPropertyFactoryException(factoryName, e); + } + } + try { + return (StAXPropertyFactory<?>) impl.newInstance(); + } catch (InstantiationException e) { + throw new InvalidPropertyFactoryException(factoryName, e); + } catch (IllegalAccessException e) { + throw new InvalidPropertyFactoryException(factoryName, e); + } catch (ClassCastException e) { + throw new InvalidPropertyFactoryException(factoryName, e); + } + } + + protected void loadReferences(XMLStreamReader reader, Component<?> component) throws XMLStreamException { + List<ConfiguredReference> configuredReferences = component.getConfiguredReferences(); + while (true) { + switch (reader.next()) { + case START_ELEMENT: + String name = reader.getLocalName(); + String uri = reader.getElementText(); + + ConfiguredReference configuredReference = component.getConfiguredReference(name); + if (configuredReference == null) { + configuredReference = factory.createConfiguredReference(); + configuredReference.setName(name); + configuredReferences.add(configuredReference); + } + + configuredReference.getTargets().add(uri); + break; + case END_ELEMENT: + return; + } + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ComponentTypeLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ComponentTypeLoader.java new file mode 100644 index 0000000000..fdb8893830 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ComponentTypeLoader.java @@ -0,0 +1,65 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import static org.apache.tuscany.core.loader.assembly.AssemblyConstants.COMPONENT_TYPE; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Property; +import org.apache.tuscany.model.assembly.Reference; +import org.apache.tuscany.model.assembly.Service; +import org.osoa.sca.annotations.Scope; + +import javax.xml.namespace.QName; +import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; +import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class ComponentTypeLoader extends AbstractLoader { + public QName getXMLType() { + return COMPONENT_TYPE; + } + + public ComponentType load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + assert COMPONENT_TYPE.equals(reader.getName()); + ComponentType componentType = factory.createComponentType(); + + while (true) { + switch (reader.next()) { + case START_ELEMENT: + AssemblyObject o = registry.load(reader, loaderContext); + if (o instanceof Service) { + componentType.getServices().add((Service) o); + } else if (o instanceof Reference) { + componentType.getReferences().add((Reference) o); + } else if (o instanceof Property) { + componentType.getProperties().add((Property) o); + } + break; + case END_ELEMENT: + return componentType; + } + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/CompositeLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/CompositeLoader.java new file mode 100644 index 0000000000..9b22a24784 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/CompositeLoader.java @@ -0,0 +1,62 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; +import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.Composite; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.ExternalService; +import org.apache.tuscany.model.assembly.ImportWSDL; +import org.apache.tuscany.model.assembly.Wire; + +/** + * @version $Rev$ $Date$ + */ +public abstract class CompositeLoader extends AbstractLoader { + public void loadComposite(XMLStreamReader reader, Composite composite, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + composite.setName(reader.getAttributeValue(null, "name")); + while (true) { + switch (reader.next()) { + case START_ELEMENT: + AssemblyObject o = registry.load(reader, loaderContext); + if (o instanceof EntryPoint) { + composite.getEntryPoints().add((EntryPoint) o); + } else if (o instanceof ExternalService) { + composite.getExternalServices().add((ExternalService) o); + } else if (o instanceof Component) { + composite.getComponents().add((Component) o); + } else if (o instanceof Wire) { + composite.getWires().add((Wire) o); + } else if (o instanceof ImportWSDL) { + composite.getWSDLImports().add((ImportWSDL) o); + } + reader.next(); + break; + case END_ELEMENT: + return; + } + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/EntryPointLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/EntryPointLoader.java new file mode 100644 index 0000000000..14b60964d5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/EntryPointLoader.java @@ -0,0 +1,90 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.StAXUtil; +import org.apache.tuscany.core.loader.LoaderContext; +import static org.apache.tuscany.core.loader.assembly.AssemblyConstants.ENTRY_POINT; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.Binding; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.Multiplicity; +import org.apache.tuscany.model.assembly.Reference; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.ServiceContract; +import org.osoa.sca.annotations.Scope; + +import javax.xml.namespace.QName; +import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; +import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class EntryPointLoader extends AbstractLoader { + public QName getXMLType() { + return ENTRY_POINT; + } + + public EntryPoint load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + assert ENTRY_POINT.equals(reader.getName()); + EntryPoint entryPoint = factory.createEntryPoint(); + String name = reader.getAttributeValue(null, "name"); + entryPoint.setName(name); + + Service service = factory.createService(); + service.setName(name); + ConfiguredService configuredService = factory.createConfiguredService(); + configuredService.setPort(service); + entryPoint.setConfiguredService(configuredService); + + Reference reference = factory.createReference(); + reference.setMultiplicity(StAXUtil.multiplicity(reader.getAttributeValue(null, "multiplicity"), Multiplicity.ONE_ONE)); + ConfiguredReference configuredReference = factory.createConfiguredReference(); + configuredReference.setPort(reference); + entryPoint.setConfiguredReference(configuredReference); + + while (true) { + switch (reader.next()) { + case START_ELEMENT: + QName qname = reader.getName(); + if (AssemblyConstants.REFERENCE.equals(qname)) { + String uri = reader.getElementText(); + configuredReference.getTargets().add(uri); + } else { + AssemblyObject o = registry.load(reader, loaderContext); + if (o instanceof Binding) { + entryPoint.getBindings().add((Binding) o); + } else if (o instanceof ServiceContract) { + service.setServiceContract((ServiceContract) o); + reference.setServiceContract((ServiceContract) o); + } + } + reader.next(); + break; + case END_ELEMENT: + return entryPoint; + } + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ExternalServiceLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ExternalServiceLoader.java new file mode 100644 index 0000000000..4910c016d8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ExternalServiceLoader.java @@ -0,0 +1,75 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.StAXUtil; +import org.apache.tuscany.core.loader.LoaderContext; +import static org.apache.tuscany.core.loader.assembly.AssemblyConstants.EXTERNAL_SERVICE; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.Binding; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.ExternalService; +import org.apache.tuscany.model.assembly.OverrideOption; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.ServiceContract; +import org.osoa.sca.annotations.Scope; + +import javax.xml.namespace.QName; +import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; +import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class ExternalServiceLoader extends AbstractLoader { + public QName getXMLType() { + return EXTERNAL_SERVICE; + } + + public ExternalService load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + assert EXTERNAL_SERVICE.equals(reader.getName()); + String name = reader.getAttributeValue(null, "name"); + ExternalService externalService = factory.createExternalService(); + externalService.setName(name); + externalService.setOverrideOption(StAXUtil.overrideOption(reader.getAttributeValue(null, "overridable"), OverrideOption.NO)); + + while (true) { + switch (reader.next()) { + case START_ELEMENT: + AssemblyObject o = registry.load(reader, loaderContext); + if (o instanceof ServiceContract) { + Service service = factory.createService(); + service.setName(name); + service.setServiceContract((ServiceContract) o); + ConfiguredService configuredService = factory.createConfiguredService(); + configuredService.setPort(service); + externalService.setConfiguredService(configuredService); + } else if (o instanceof Binding) { + externalService.getBindings().add((Binding) o); + } + reader.next(); + break; + case END_ELEMENT: + return externalService; + } + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ImportWSDLLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ImportWSDLLoader.java new file mode 100644 index 0000000000..6981f05372 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ImportWSDLLoader.java @@ -0,0 +1,95 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import static org.apache.tuscany.core.loader.assembly.AssemblyConstants.IMPORT_WSDL; + +import java.io.IOException; +import java.net.URL; + +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.MissingResourceException; +import org.apache.tuscany.core.config.SidefileLoadException; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.core.loader.StAXUtil; +import org.apache.tuscany.core.loader.WSDLDefinitionRegistry; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.model.assembly.ImportWSDL; +import org.osoa.sca.annotations.Scope; + +/** + * Loader that handles <import.wsdl> elements. + * + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class ImportWSDLLoader extends AbstractLoader { + private WSDLDefinitionRegistry wsdlRegistry; + + @Autowire + public void setWsdlRegistry(WSDLDefinitionRegistry wsdlRegistry) { + this.wsdlRegistry = wsdlRegistry; + } + + public QName getXMLType() { + return IMPORT_WSDL; + } + + public ImportWSDL load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + assert AssemblyConstants.IMPORT_WSDL.equals(reader.getName()); + String namespace = reader.getAttributeValue(null, "namespace"); + String location = reader.getAttributeValue(null, "location"); + if (location == null) + location = reader.getAttributeValue(null, "wsdlLocation"); + ImportWSDL importWSDL = factory.createImportWSDL(location, namespace); + + Definition definition = loadDefinition(namespace, location, loaderContext.getResourceLoader()); +// importWSDL.setDefinition(definition); + + StAXUtil.skipToEndElement(reader); + return importWSDL; + } + + protected Definition loadDefinition(String namespace, String location, ResourceLoader resourceLoader) throws MissingResourceException, SidefileLoadException { + Definition definition; + URL wsdlURL = resourceLoader.getResource(location); + if (wsdlURL == null) { + throw new MissingResourceException(location); + } + + try { + definition = wsdlRegistry.loadDefinition(namespace, wsdlURL, resourceLoader); + } catch (IOException e) { + SidefileLoadException sfe = new SidefileLoadException(e.getMessage()); + sfe.setResourceURI(location); + throw sfe; + } catch (WSDLException e) { + SidefileLoadException sfe = new SidefileLoadException(e.getMessage()); + sfe.setResourceURI(location); + throw sfe; + } + + return definition; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/InterfaceJavaLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/InterfaceJavaLoader.java new file mode 100644 index 0000000000..602cf2cc0a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/InterfaceJavaLoader.java @@ -0,0 +1,45 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.types.java.JavaServiceContract; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +/** + * @version $Rev$ $Date$ + */ +@org.osoa.sca.annotations.Scope("MODULE") +public class InterfaceJavaLoader extends AbstractLoader { + public QName getXMLType() { + return AssemblyConstants.INTERFACE_JAVA; + } + + public JavaServiceContract load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + assert AssemblyConstants.INTERFACE_JAVA.equals(reader.getName()); + JavaServiceContract serviceContract = factory.createJavaServiceContract(); + serviceContract.setScope(Scope.INSTANCE); + serviceContract.setInterfaceName(reader.getAttributeValue(null, "interface")); + serviceContract.setCallbackInterfaceName(reader.getAttributeValue(null, "callbackInterface")); + return serviceContract; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/InterfaceWSDLLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/InterfaceWSDLLoader.java new file mode 100644 index 0000000000..9617cf805f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/InterfaceWSDLLoader.java @@ -0,0 +1,110 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import java.io.IOException; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.MissingInterfaceException; +import org.apache.tuscany.core.loader.WSDLDefinitionRegistry; +import org.apache.tuscany.core.loader.StAXUtil; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.types.wsdl.WSDLServiceContract; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.wsdl.PortType; +import javax.wsdl.WSDLException; + +/** + * @version $Rev$ $Date$ + */ +@org.osoa.sca.annotations.Scope("MODULE") +public class InterfaceWSDLLoader extends AbstractLoader { + private static final String WSDLI = "http://www.w3.org/2006/01/wsdl-instance"; + private static final String WSDLI_LOCATION = "wsdlLocation"; + + private WSDLDefinitionRegistry wsdlRegistry; + + @Autowire + public void setWsdlRegistry(WSDLDefinitionRegistry wsdlRegistry) { + this.wsdlRegistry = wsdlRegistry; + } + + public QName getXMLType() { + return AssemblyConstants.INTERFACE_WSDL; + } + + public WSDLServiceContract load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + assert AssemblyConstants.INTERFACE_WSDL.equals(reader.getName()); + WSDLServiceContract serviceContract = factory.createWSDLServiceContract(); + serviceContract.setScope(Scope.INSTANCE); + + ResourceLoader resourceLoader = loaderContext.getResourceLoader(); + + String location = reader.getAttributeValue(WSDLI, WSDLI_LOCATION); + if (location != null) { + try { + wsdlRegistry.loadDefinition(location, resourceLoader); + } catch (IOException e) { + throw new MissingInterfaceException(e); + } catch (WSDLException e) { + throw new MissingInterfaceException(e); + } + } + + String portTypeURI = reader.getAttributeValue(null, "interface"); + if (portTypeURI != null) { + serviceContract.setPortType(getPortType(portTypeURI, resourceLoader)); + } + + portTypeURI = reader.getAttributeValue(null, "callbackInterface"); + if (portTypeURI != null) { + serviceContract.setCallbackPortType(getPortType(portTypeURI, resourceLoader)); + } + StAXUtil.skipToEndElement(reader); + return serviceContract; + } + + protected PortType getPortType(String uri, ResourceLoader resourceLoader) throws MissingInterfaceException { + + // We currently support two syntaxes for specifying a WSDL portType: + // namespace#portTypeName, this is what we supported in the initial contribution, we will + // deprecate this after M1 + // namespace#wsdl.interface(portTypeName), this is the WSDL 2.0 syntax + + int index = uri.indexOf('#'); + String namespace = uri.substring(0, index); + String fragment = uri.substring(index + 1); + String localName; + if (fragment.startsWith("wsdl.interface(") && fragment.endsWith(")")) { + localName = fragment.substring(15, fragment.length()-1); + } else { + localName = fragment; + } + QName qname = new QName(namespace, localName); + PortType portType = wsdlRegistry.getPortType(qname, resourceLoader); + if (portType == null) { + throw new MissingInterfaceException(uri); + } + return portType; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ModuleFragmentLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ModuleFragmentLoader.java new file mode 100644 index 0000000000..4b3e96cfab --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ModuleFragmentLoader.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.model.assembly.ModuleFragment; +import org.osoa.sca.annotations.Scope; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class ModuleFragmentLoader extends CompositeLoader { + public QName getXMLType() { + return AssemblyConstants.MODULE_FRAGMENT; + } + + public ModuleFragment load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + ModuleFragment fragment = factory.createModuleFragment(); + loadComposite(reader, fragment, loaderContext); + return fragment; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ModuleLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ModuleLoader.java new file mode 100644 index 0000000000..08ab23b3a6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ModuleLoader.java @@ -0,0 +1,50 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.core.system.context.SystemCompositeContextImpl; +import org.apache.tuscany.model.assembly.Module; +import org.osoa.sca.annotations.Scope; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class ModuleLoader extends CompositeLoader { + public QName getXMLType() { + return AssemblyConstants.MODULE; + } + + public Module load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + Module module = factory.createModule(); + loadComposite(reader, module, loaderContext); + // JFM Hack until recursive model in place + if (module.getName().startsWith("org.apache.tuscany.core.system")) { + module.setImplementationClass(SystemCompositeContextImpl.class); + } else { + module.setImplementationClass(CompositeContextImpl.class); + } + return module; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/PropertyLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/PropertyLoader.java new file mode 100644 index 0000000000..cbf1ca00df --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/PropertyLoader.java @@ -0,0 +1,79 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.StAXUtil; +import org.apache.tuscany.core.loader.LoaderContext; +import static org.apache.tuscany.core.loader.assembly.AssemblyConstants.PROPERTY; +import org.apache.tuscany.model.assembly.Property; +import org.osoa.sca.annotations.Scope; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import java.util.HashMap; +import java.util.Map; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class PropertyLoader extends AbstractLoader { + private static final String XSD = "http://www.w3.org/2001/XMLSchema"; + + private static final Map<QName, Class<?>> TYPE_MAP; + static { + // todo support more XSD types, or remove if we store the QName + TYPE_MAP = new HashMap<QName, Class<?>>(17); + TYPE_MAP.put(new QName(XSD, "string"), String.class); + } + + public QName getXMLType() { + return PROPERTY; + } + + public Property load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + assert PROPERTY.equals(reader.getName()); + Property property = factory.createProperty(); + property.setName(reader.getAttributeValue(null, "name")); + String typeName = reader.getAttributeValue(null, "type"); + // support XSD type or Java class name + // todo perhaps we should just store the QName for the PropertyFactory to use + int index = typeName.indexOf(':'); + if (index != -1) { + String prefix = typeName.substring(0, index); + String namespaceURI = reader.getNamespaceURI(prefix); + QName qname = new QName(namespaceURI, typeName.substring(index+1)); + property.setType(TYPE_MAP.get(qname)); + } else { + try { + Class<?> type = loaderContext.getResourceLoader().loadClass(typeName); + property.setType(type); + } catch (ClassNotFoundException e) { + throw new ConfigurationLoadException(e); + } + } + property.setMany(Boolean.parseBoolean(reader.getAttributeValue(null, "many"))); + property.setDefaultValue(reader.getAttributeValue(null, "default")); + String required = reader.getAttributeValue(null, "required"); + property.setRequired(required != null && Boolean.valueOf(required)); + + StAXUtil.skipToEndElement(reader); + return property; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ReferenceLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ReferenceLoader.java new file mode 100644 index 0000000000..aa95210757 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ReferenceLoader.java @@ -0,0 +1,64 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.StAXUtil; +import org.apache.tuscany.core.loader.LoaderContext; +import static org.apache.tuscany.core.loader.assembly.AssemblyConstants.REFERENCE; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.Multiplicity; +import org.apache.tuscany.model.assembly.Reference; +import org.apache.tuscany.model.assembly.ServiceContract; +import org.osoa.sca.annotations.Scope; + +import javax.xml.namespace.QName; +import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; +import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class ReferenceLoader extends AbstractLoader { + public QName getXMLType() { + return REFERENCE; + } + + public Reference load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + assert REFERENCE.equals(reader.getName()); + Reference reference = factory.createReference(); + reference.setName(reader.getAttributeValue(null, "name")); + reference.setMultiplicity(StAXUtil.multiplicity(reader.getAttributeValue(null, "multiplicity"), Multiplicity.ONE_ONE)); + + while (true) { + switch (reader.next()) { + case START_ELEMENT: + AssemblyObject o = registry.load(reader, loaderContext); + if (o instanceof ServiceContract) { + reference.setServiceContract((ServiceContract) o); + } + reader.next(); + break; + case END_ELEMENT: + return reference; + } + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ServiceLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ServiceLoader.java new file mode 100644 index 0000000000..9cb31b55ff --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/ServiceLoader.java @@ -0,0 +1,61 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import static org.apache.tuscany.core.loader.assembly.AssemblyConstants.SERVICE; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.ServiceContract; +import org.osoa.sca.annotations.Scope; + +import javax.xml.namespace.QName; +import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; +import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class ServiceLoader extends AbstractLoader { + public QName getXMLType() { + return SERVICE; + } + + public Service load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + assert SERVICE.equals(reader.getName()); + Service service = factory.createService(); + service.setName(reader.getAttributeValue(null, "name")); + + while (true) { + switch (reader.next()) { + case START_ELEMENT: + AssemblyObject o = registry.load(reader, loaderContext); + if (o instanceof ServiceContract) { + service.setServiceContract((ServiceContract) o); + } + reader.next(); + break; + case END_ELEMENT: + return service; + } + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/WireLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/WireLoader.java new file mode 100644 index 0000000000..0ae3c4405d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/assembly/WireLoader.java @@ -0,0 +1,84 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.loader.assembly; + +import java.util.HashMap; +import java.util.Map; +import javax.xml.namespace.QName; +import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; +import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.model.assembly.Wire; +import org.osoa.sca.annotations.Scope; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class WireLoader extends AbstractLoader { + private static final String XSD = "http://www.w3.org/2001/XMLSchema"; + + private static final Map<QName, Class<?>> TYPE_MAP; + + static { + // todo support more XSD types, or remove if we store the QName + TYPE_MAP = new HashMap<QName, Class<?>>(17); + TYPE_MAP.put(new QName(XSD, "string"), String.class); + } + + public QName getXMLType() { + return AssemblyConstants.WIRE; + } + + public Wire load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + assert AssemblyConstants.WIRE.equals(reader.getName()); + Wire wire = factory.createWire(); + while (true) { + switch (reader.next()) { + case START_ELEMENT: + QName qname = reader.getName(); + if (AssemblyConstants.WIRE_SOURCE.equals(qname)) { + String uri = reader.getElementText(); + int pos = uri.indexOf('/'); + if (pos < 1) { + throw new ConfigurationLoadException("Invalid source wire"); + } + String partName = uri.substring(0, pos); + String portName = uri.substring(pos + 1); + wire.setSource(factory.createServiceURI(null, partName, portName)); + } else if (AssemblyConstants.WIRE_TARGET.equals(qname)) { + String uri = reader.getElementText(); + int pos = uri.indexOf('/'); + if (pos < 1) { + wire.setTarget(factory.createServiceURI(null, uri)); + }else{ + String partName = uri.substring(0, pos); + String portName = uri.substring(pos + 1); + wire.setTarget(factory.createServiceURI(null, partName, portName)); + } + } + break; + case END_ELEMENT: + return wire; + } + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/JNDIPropertyFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/JNDIPropertyFactory.java new file mode 100644 index 0000000000..763c88295c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/JNDIPropertyFactory.java @@ -0,0 +1,62 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader.impl; + +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamException; +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; + +import org.apache.tuscany.core.loader.StAXPropertyFactory; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.injection.JNDIObjectFactory; +import org.apache.tuscany.model.assembly.Property; + +/** + * A StAXPropertyFactory that creates property values by looking them + * up in the default JNDI InitialContext. + * + * This can be used to locate resources in a J2EE environment and inject + * them as configuration properties. For example, to access a database + * a component could write: + * <code> + * &at;Property DataSource myDB; + * </code> + * and configure with + * <code> + * <properties> + * <v:myDb>java:comp/env/jdbc/MyDatabase</v:myDB> + * </properties> + * </code> + * + * @version $Rev$ $Date$ + */ +public class JNDIPropertyFactory implements StAXPropertyFactory { + public ObjectFactory<?> createObjectFactory(XMLStreamReader reader, Property property) throws XMLStreamException, ConfigurationLoadException { + Class<?> type = property.getType(); + assert type != null : "property type is null"; + String text = reader.getElementText(); + try { + Context context = new InitialContext(); + return new JNDIObjectFactory(context, text); + } catch (NamingException e) { + throw new ConfigurationLoadException(e); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/StAXLoaderRegistryImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/StAXLoaderRegistryImpl.java new file mode 100644 index 0000000000..1e9e8ec8fb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/StAXLoaderRegistryImpl.java @@ -0,0 +1,105 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader.impl; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.StAXElementLoader; +import org.apache.tuscany.core.loader.StAXLoaderRegistry; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.osoa.sca.annotations.Scope; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import java.util.HashMap; +import java.util.Map; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class StAXLoaderRegistryImpl implements StAXLoaderRegistry { + private final Map<QName, StAXElementLoader<? extends AssemblyObject>> loaders = new HashMap<QName, StAXElementLoader<? extends AssemblyObject>>(); + + private Monitor monitor; + + @org.apache.tuscany.core.system.annotation.Monitor + public void setMonitor(Monitor monitor) { + this.monitor = monitor; + } + + public <T extends AssemblyObject> void registerLoader(QName element, StAXElementLoader<T> loader) { + monitor.registeringLoader(element); + loaders.put(element, loader); + } + + public <T extends AssemblyObject> void unregisterLoader(QName element, StAXElementLoader<T> loader) { + monitor.unregisteringLoader(element); + loaders.remove(element); + } + + public AssemblyObject load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + QName name = reader.getName(); + monitor.elementLoad(name); + StAXElementLoader<? extends AssemblyObject> loader = loaders.get(name); + if (loader == null) { + ConfigurationLoadException e = new ConfigurationLoadException("Unrecognized element"); + e.setIdentifier(name.toString()); + throw e; + } else { + return loader.load(reader, loaderContext); + } + } + + + private final ThreadLocal<AssemblyContext> modelContext = new ThreadLocal<AssemblyContext>(); + + @Deprecated + public AssemblyContext getContext() { + return modelContext.get(); + } + + @Deprecated + public void setContext(AssemblyContext context) { + modelContext.set(context); + } + + public static interface Monitor { + /** + * Event emitted when a StAX element loader is registered. + * + * @param xmlType the QName of the element the loader will handle + */ + void registeringLoader(QName xmlType); + + /** + * Event emitted when a StAX element loader is unregistered. + * + * @param xmlType the QName of the element the loader will handle + */ + void unregisteringLoader(QName xmlType); + + /** + * Event emitted when a request is made to load an element. + * + * @param xmlType the QName of the element that should be loaded + */ + void elementLoad(QName xmlType); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/StringParserPropertyFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/StringParserPropertyFactory.java new file mode 100644 index 0000000000..2ed33f895c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/StringParserPropertyFactory.java @@ -0,0 +1,110 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader.impl; + +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.injection.SingletonObjectFactory; +import org.apache.tuscany.core.loader.StAXPropertyFactory; +import org.apache.tuscany.model.assembly.Property; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import java.beans.PropertyEditor; +import java.beans.PropertyEditorManager; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +import org.osoa.sca.annotations.Scope; +import org.osoa.sca.annotations.Service; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +@Service(interfaces = {StAXPropertyFactory.class}) +public class StringParserPropertyFactory implements StAXPropertyFactory { + public ObjectFactory<?> createObjectFactory(XMLStreamReader reader, Property property) throws XMLStreamException, ConfigurationLoadException { + Class<?> type = property.getType(); + assert type != null : "property type is null"; + String text = reader.getElementText(); + + // degenerate case where we are returning a String + if (String.class.equals(type)) { + return new SingletonObjectFactory(text); + } + + // special handler to convert hexBinary to a byte[] + if (byte[].class.equals(type)) { + byte[] instance = new byte[text.length() >> 1]; + for (int i = 0; i < instance.length; i++) { + instance[i] = (byte) (Character.digit(text.charAt(i << 1), 16) << 4 | Character.digit(text.charAt((i << 1) + 1), 16)); + } + return new SingletonObjectFactory(instance); + } + + // does this type have a static valueOf(String) method? + try { + Method valueOf = type.getMethod("valueOf", String.class); + if (Modifier.isStatic(valueOf.getModifiers())) { + try { + return new SingletonObjectFactory(valueOf.invoke(null, text)); + } catch (IllegalAccessException e) { + throw new AssertionError("getMethod returned an inaccessible method"); + } catch (InvocationTargetException e) { + // FIXME we should throw something better + throw new ConfigurationLoadException(e.getCause()); + } + } + } catch (NoSuchMethodException e) { + // try something else + } + + // does this type have a constructor that takes a String? + try { + Constructor<?> ctr = type.getConstructor(String.class); + return new SingletonObjectFactory(ctr.newInstance(text)); + } catch (NoSuchMethodException e) { + // try something else + } catch (IllegalAccessException e) { + throw new AssertionError("getConstructor returned an inaccessible method"); + } catch (InstantiationException e) { + throw new ConfigurationLoadException("Property type cannot be instantiated: " + type.getName()); + } catch (InvocationTargetException e) { + // FIXME we should throw something better + throw new ConfigurationLoadException(e.getCause()); + } + + // do we have a property editor for it? + PropertyEditor editor = PropertyEditorManager.findEditor(type); + if (editor != null) { + try { + editor.setAsText(text); + return new SingletonObjectFactory(editor.getValue()); + } catch (IllegalArgumentException e) { + // FIXME we should throw something better + throw new ConfigurationLoadException(e); + + } + } + + // FIXME we should throw something better + throw new ConfigurationLoadException("Do not have a way to parse a String into a " + type.getName()); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/WSDLDefinitionRegistryImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/WSDLDefinitionRegistryImpl.java new file mode 100644 index 0000000000..1063dec3fc --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/impl/WSDLDefinitionRegistryImpl.java @@ -0,0 +1,202 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader.impl; + +import java.io.IOException; +import java.net.URL; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; + +import javax.wsdl.Definition; +import javax.wsdl.PortType; +import javax.wsdl.Service; +import javax.wsdl.WSDLException; +import javax.wsdl.extensions.ExtensionRegistry; +import javax.wsdl.factory.WSDLFactory; +import javax.wsdl.xml.WSDLReader; +import javax.xml.namespace.QName; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.core.loader.WSDLDefinitionRegistry; +import org.osoa.sca.annotations.Scope; + +/** + * @version $Rev$ $Date$ + */ +@org.osoa.sca.annotations.Service(interfaces = {WSDLDefinitionRegistry.class}) +@Scope("MODULE") +public class WSDLDefinitionRegistryImpl implements WSDLDefinitionRegistry { + private final WSDLFactory wsdlFactory; + private final ExtensionRegistry registry; + + private final Map<ResourceLoader,Map<URL, Definition>> definitionsByLocationByLoader = new WeakHashMap<ResourceLoader,Map<URL, Definition>>(); + private final Map<ResourceLoader,Map<String, List<Definition>>> definitionsByNamespaceByLoader = new WeakHashMap<ResourceLoader,Map<String, List<Definition>>>(); + + private Monitor monitor; + + public WSDLDefinitionRegistryImpl() throws WSDLException { + wsdlFactory = WSDLFactory.newInstance(); + registry = wsdlFactory.newPopulatedExtensionRegistry(); + } + + @org.apache.tuscany.core.system.annotation.Monitor + public void setMonitor(Monitor monitor) { + this.monitor = monitor; + } + + public ExtensionRegistry getExtensionRegistry() { + return registry; + } + + public Definition loadDefinition(String wsdlLocation, ResourceLoader resourceLoader) throws IOException, WSDLException { + int index = wsdlLocation.indexOf(' '); + if (index == -1) { + throw new WSDLException(WSDLException.CONFIGURATION_ERROR, "Invalid wsdlLocation: " + wsdlLocation); + } + String namespace = wsdlLocation.substring(0, index).trim(); + URL url; + URI uri; + try { + uri = new URI(wsdlLocation.substring(index + 1).trim()); + } catch (URISyntaxException e) { + throw new WSDLException(WSDLException.CONFIGURATION_ERROR, "Invalid wsdlLocation: " + wsdlLocation); + } + if (uri.isAbsolute()) { + url = uri.toURL(); + } else { + url = resourceLoader.getResource(uri.toString()); + if (url == null) { + throw new WSDLException(WSDLException.CONFIGURATION_ERROR, "Resource not found: " + uri); + } + } + return loadDefinition(namespace, url, resourceLoader); + } + + public Definition loadDefinition(String namespace, URL location, ResourceLoader resourceLoader) throws IOException, WSDLException { + Map<URL, Definition> definitionsByLocation = getDefinitionsByLocation(resourceLoader); + Map<String, List<Definition>> definitionsByNamespace = getDefinitionsByNamespace(resourceLoader); + + Definition definition = definitionsByLocation.get(location); + if (definition != null) { + // return cached copy + return definition; + } + + monitor.readingWSDL(namespace, location); + WSDLReader reader = wsdlFactory.newWSDLReader(); + reader.setFeature("javax.wsdl.verbose", false); + reader.setExtensionRegistry(registry); + + definition = reader.readWSDL(location.toString()); + String definitionNamespace = definition.getTargetNamespace(); + if (namespace != null && !namespace.equals(definitionNamespace)) { + throw new WSDLException(WSDLException.CONFIGURATION_ERROR, namespace + " != " + definition.getTargetNamespace()); + } + + monitor.cachingDefinition(definitionNamespace, location); + definitionsByLocation.put(location, definition); + List<Definition> definitions = definitionsByNamespace.get(definitionNamespace); + if (definitions == null) { + definitions = new ArrayList<Definition>(); + definitionsByNamespace.put(definitionNamespace, definitions); + } + definitions.add(definition); + + return definition; + } + + public List<Definition> getDefinitionsForNamespace(String namespace, ResourceLoader resourceLoader) { + Map<String, List<Definition>> definitionsByNamespace = getDefinitionsByNamespace(resourceLoader); + return definitionsByNamespace.get(namespace); + } + + public PortType getPortType(QName name, ResourceLoader resourceLoader) { + Map<String, List<Definition>> definitionsByNamespace = getDefinitionsByNamespace(resourceLoader); + String namespace = name.getNamespaceURI(); + List<Definition> definitions = definitionsByNamespace.get(namespace); + if (definitions == null) { + return null; + } + for (Definition definition : definitions) { + PortType portType = definition.getPortType(name); + if (portType != null) { + return portType; + } + } + return null; + } + + public Service getService(QName name, ResourceLoader resourceLoader) { + Map<String, List<Definition>> definitionsByNamespace = getDefinitionsByNamespace(resourceLoader); + String namespace = name.getNamespaceURI(); + List<Definition> definitions = definitionsByNamespace.get(namespace); + if (definitions == null) { + return null; + } + for (Definition definition : definitions) { + Service service = definition.getService(name); + if (service != null) { + return service; + } + } + return null; + } + + private Map<String, List<Definition>> getDefinitionsByNamespace(ResourceLoader resourceLoader) { + Map<String, List<Definition>> map = definitionsByNamespaceByLoader.get(resourceLoader); + if (map == null) { + map = new HashMap<String, List<Definition>>(); + definitionsByNamespaceByLoader.put(resourceLoader, map); + } + return map; + } + + private Map<URL, Definition> getDefinitionsByLocation(ResourceLoader resourceLoader) { + Map<URL, Definition> map = definitionsByLocationByLoader.get(resourceLoader); + if (map == null) { + map = new HashMap<URL, Definition>(); + definitionsByLocationByLoader.put(resourceLoader, map); + } + return map; + } + + public static interface Monitor { + /** + * Monitor event emitted immediately before an attempt is made to + * read WSDL for the supplied namespace from the supplied location. + * + * @param namespace the target namespace expected in the WSDL; may be null + * @param location the location where we will attempt to read the WSDL definition from + */ + void readingWSDL(String namespace, URL location); + + /** + * Monitor event emitted immediately before registering a WSDL definition + * in the cache. + * + * @param namespace the target namespace for the WSDL + * @param location the location where the WSDL definition was read from + */ + void cachingDefinition(String namespace, URL location); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/system/SystemBindingLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/system/SystemBindingLoader.java new file mode 100644 index 0000000000..d75f25a232 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/system/SystemBindingLoader.java @@ -0,0 +1,47 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader.system; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.StAXUtil; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.core.loader.assembly.AbstractLoader; +import org.apache.tuscany.core.system.assembly.SystemBinding; +import org.osoa.sca.annotations.Scope; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class SystemBindingLoader extends AbstractLoader { + public static final QName SYSTEM_BINDING = new QName("http://org.apache.tuscany/xmlns/system/0.9", "binding.system"); + + protected QName getXMLType() { + return SYSTEM_BINDING; + } + + public SystemBinding load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + assert SystemBindingLoader.SYSTEM_BINDING.equals(reader.getName()); + SystemBinding binding = factory.createSystemBinding(); + StAXUtil.skipToEndElement(reader); + return binding; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/system/SystemImplementationLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/system/SystemImplementationLoader.java new file mode 100644 index 0000000000..b9f35d8656 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/loader/system/SystemImplementationLoader.java @@ -0,0 +1,68 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader.system; + +import org.apache.tuscany.core.config.ComponentTypeIntrospector; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.StAXUtil; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.core.loader.assembly.AbstractLoader; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.system.assembly.SystemImplementation; +import org.osoa.sca.annotations.Scope; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class SystemImplementationLoader extends AbstractLoader { + public static final QName SYSTEM_IMPLEMENTATION = new QName("http://org.apache.tuscany/xmlns/system/0.9", "implementation.system"); + + private ComponentTypeIntrospector introspector; + + @Autowire + public void setIntrospector(ComponentTypeIntrospector introspector) { + this.introspector = introspector; + } + + protected QName getXMLType() { + return SYSTEM_IMPLEMENTATION; + } + + public SystemImplementation load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + assert SYSTEM_IMPLEMENTATION.equals(reader.getName()); + SystemImplementation implementation = factory.createSystemImplementation(); + String implClass = reader.getAttributeValue(null, "class"); + Class<?> implementationClass; + try { + implementationClass = loaderContext.getResourceLoader().loadClass(implClass); + implementation.setImplementationClass(implementationClass); + } catch (ClassNotFoundException e) { + throw new ConfigurationLoadException(e); + } + + // todo we should allow componentType sidefiles for system implementations + implementation.setComponentType(introspector.introspect(implementationClass)); + + StAXUtil.skipToEndElement(reader); + return implementation; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/message/Message.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/message/Message.java new file mode 100644 index 0000000000..dc623af1fc --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/message/Message.java @@ -0,0 +1,58 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.message; + +import org.apache.tuscany.core.wire.MessageChannel; +import org.apache.tuscany.core.wire.TargetInvoker; + +/** + * Represents a request, response, or exception flowing through a wire + * + * @version $Rev $Date + */ +public interface Message { + + /** + * Returns the body of the message, which will be the payload or parameters associated with the wire + */ + Object getBody(); + + /** + * Sets the body of the message. + */ + void setBody(Object body); + + /** + * Sets the target invoker to dispatch to when the message passes through the request side of the invocation chain + */ + public void setTargetInvoker(TargetInvoker invoker); + + /** + * Sets the target invoker to dispatch to when the message passes through the request side of the invocation chain + */ + public TargetInvoker getTargetInvoker(); + + /** + * Returns the callback channel + */ + public MessageChannel getCallbackChannel(); + + /** + * + */ + public Message getRelatedCallbackMessage(); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/message/MessageFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/message/MessageFactory.java new file mode 100644 index 0000000000..265e4ba601 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/message/MessageFactory.java @@ -0,0 +1,29 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.message; + +/** + * A factory for creating messages flowed through a wire during an invocation + */ +public interface MessageFactory { + + /** + * Returns a new message. + */ + Message createMessage(); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/message/impl/MessageFactoryImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/message/impl/MessageFactoryImpl.java new file mode 100644 index 0000000000..a30f17a938 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/message/impl/MessageFactoryImpl.java @@ -0,0 +1,44 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.message.impl; + +import org.apache.tuscany.core.message.Message; +import org.apache.tuscany.core.message.MessageFactory; +import org.osoa.sca.annotations.Scope; +import org.osoa.sca.annotations.Init; + +/** + * The default message factory + * + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class MessageFactoryImpl implements MessageFactory { + + public MessageFactoryImpl() { + super(); + } + + @Init(eager = true) + public void init(){ + } + + public Message createMessage() { + return new MessageImpl(); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/message/impl/MessageImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/message/impl/MessageImpl.java new file mode 100644 index 0000000000..f7f365952c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/message/impl/MessageImpl.java @@ -0,0 +1,86 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.message.impl; + +import org.apache.tuscany.core.message.Message; +import org.apache.tuscany.core.wire.MessageChannel; +import org.apache.tuscany.core.wire.TargetInvoker; + +/** + * The default implementation of a message flowed through a wire during an invocation + * + * @version $Rev $Date + */ +public class MessageImpl implements Message, MessageChannel { + + private Object body; + private Message relatedCallbackMessage; + private TargetInvoker invoker; + + protected MessageImpl() { + super(); + } + + /** + * @see org.apache.tuscany.core.message.Message#getBody() + */ + public Object getBody() { + return body; + } + + /** + * @see org.apache.tuscany.core.message.Message#setBody(java.lang.Object) + */ + public void setBody(Object body) { + this.body = body; + } + + /** + * @see org.apache.tuscany.core.message.Message#getCallbackChannel() + */ + public MessageChannel getCallbackChannel() { + return this; + } + + /** + * @see org.apache.tuscany.core.wire.MessageChannel#send(org.apache.tuscany.core.message.Message) + */ + public void send(Message message) { + relatedCallbackMessage = message; + } + + /** + * @see org.apache.tuscany.core.message.Message#getRelatedCallbackMessage() + */ + public Message getRelatedCallbackMessage() { + return relatedCallbackMessage; + } + + /** + * @see org.apache.tuscany.core.message.Message#setTargetInvoker(org.apache.tuscany.core.wire.TargetInvoker) + */ + public void setTargetInvoker(TargetInvoker invoker) { + this.invoker = invoker; + } + + /** + * @see org.apache.tuscany.core.message.Message#getTargetInvoker() + */ + public TargetInvoker getTargetInvoker() { + return invoker; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/runtime/RuntimeContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/runtime/RuntimeContext.java new file mode 100644 index 0000000000..16e1fc6483 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/runtime/RuntimeContext.java @@ -0,0 +1,62 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.runtime; + +import org.apache.tuscany.core.builder.WireBuilder; +import org.apache.tuscany.core.context.AutowireContext; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.ConfigurationContext; +import org.apache.tuscany.core.context.SystemCompositeContext; + +/** + * Represents a top-level component context in the runtime, that is the bootstrap context. + * This context serves as the ultimate root of the context hierarchy. Under it are two + * separate trees: the rootContext for user components and the systemContext for + * system components (those that comprise the runtime itself). + * + * @version $Rev$ $Date$ + */ +public interface RuntimeContext extends AutowireContext, ConfigurationContext { + + /* the symbolic name of the runtime bootstrap context */ + public static final String RUNTIME = "tuscany.runtime"; + + /* the symbolic name of the composite context containing all system components in the runtime */ + public static final String SYSTEM = "tuscany.system"; + + /* the symbolic name of the composite context containing all user components in the runtime */ + public static final String ROOT = "tuscany.root"; + + /** + * Returns the context that forms the root of the user component tree. + * All user components will managed by contexts that are children of this root. + * @return the root of the user component tree + */ + public CompositeContext getRootContext(); + + /** + * Returns the context that forms the root of the system component tree. + * All system components, components that provide system services needed by the + * Tuscany runtime itself, will be managed by contexts that are children of this root. + * @return the root of the system component tree + */ + public SystemCompositeContext getSystemContext(); + + /** + * Adds a wire builder to the runtime + */ + @Deprecated + public void addBuilder(WireBuilder builder); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/runtime/RuntimeContextImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/runtime/RuntimeContextImpl.java new file mode 100644 index 0000000000..0ebc063b90 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/runtime/RuntimeContextImpl.java @@ -0,0 +1,221 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.runtime; + +import java.util.List; + +import org.apache.tuscany.common.monitor.MonitorFactory; +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.builder.HierarchicalWireBuilder; +import org.apache.tuscany.core.builder.WireBuilder; +import org.apache.tuscany.core.builder.impl.AssemblyVisitorImpl; +import org.apache.tuscany.core.builder.impl.ContextFactoryBuilderRegistryImpl; +import org.apache.tuscany.core.config.ConfigurationException; +import org.apache.tuscany.core.context.AutowireContext; +import org.apache.tuscany.core.context.AutowireResolutionException; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.ConfigurationContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.CoreRuntimeException; +import org.apache.tuscany.core.context.EventException; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.context.SystemCompositeContext; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.context.impl.AbstractContext; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.system.context.SystemCompositeContextImpl; +import org.apache.tuscany.core.system.context.SystemScopeStrategy; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.Composite; +import org.apache.tuscany.model.assembly.Extensible; + +/** + * Implementation of a <code>RuntimeContext</code> that forms the foundation for a Tuscany environment. + * + * @version $Rev$ $Date$ + */ +public class RuntimeContextImpl extends AbstractContext implements RuntimeContext { + + // the top-level wire builder in the runtime + private final HierarchicalWireBuilder wireBuilder; + + //private final List<RuntimeEventListener> listeners = new ArrayList<RuntimeEventListener>(1); + + private final CompositeContext rootContext; + + private final SystemCompositeContext systemContext; + + private final MonitorFactory monitorFactory; + + private final ContextFactoryBuilderRegistryImpl builderRegistry; + + public RuntimeContextImpl(MonitorFactory monitorFactory, ContextFactoryBuilderRegistry builderRegistry, HierarchicalWireBuilder wireBuilder) { + super(RUNTIME); + this.monitorFactory = monitorFactory; + this.builderRegistry = (ContextFactoryBuilderRegistryImpl) builderRegistry; + this.wireBuilder = wireBuilder; + + rootContext = new CompositeContextImpl(ROOT, this, this, new RuntimeScopeStrategy(), new EventContextImpl(), this); + systemContext = new SystemCompositeContextImpl(SYSTEM, this, this, new SystemScopeStrategy(), new EventContextImpl(), this); + } + + public void start() throws CoreRuntimeException { + if (lifecycleState == RUNNING) { + return; + } + systemContext.start(); + + rootContext.start(); + lifecycleState = RUNNING; + } + + public void stop() throws CoreRuntimeException { + if (lifecycleState == STOPPED) { + return; + } + rootContext.stop(); + systemContext.stop(); + lifecycleState = STOPPED; + } + + public void addBuilder(WireBuilder builder) { + assert (builder != null) : "Builder was null"; + wireBuilder.addWireBuilder(builder); + } + + public Context getContext(String ctxName) { + checkRunning(); + if (ROOT.equals(ctxName)) { + return rootContext; + } else if (SYSTEM.equals(ctxName)) { + return systemContext; + } + return rootContext.getContext(ctxName); + } + + public CompositeContext getRootContext() { + checkRunning(); + return rootContext; + } + + public SystemCompositeContext getSystemContext() { + checkRunning(); + return systemContext; + } + + public void registerModelObject(Extensible model) throws ConfigurationException { + assert (model != null) : "Model was null"; + // note do not configure or buildSource model object since the root context will perform a call back + rootContext.registerModelObject(model); + } + + public void registerModelObjects(List<? extends Extensible> models) throws ConfigurationException { + for (Extensible model : models) { + registerModelObject(model); + } + } + + public CompositeContext getParent() { + return null; // there is no parent + } + + public void setParent(CompositeContext parent) { + throw new UnsupportedOperationException(); + } + + public String getURI() { + return null; + } + + public void setURI(String uri) { + } + + public void setAssemblyContext(AssemblyContext context) { + + } + + //TODO remove + public void fireEvent(int pEventType, Object pMessage) throws EventException { + throw new UnsupportedOperationException(); + } + + public Object locateService(QualifiedName serviceName) { + return null; + } + + public Object locateInstance(QualifiedName serviceName) { + return null; + } + + public Object getInstance(QualifiedName qName) throws TargetException { + return getSystemContext().getInstance(qName); + } + + public synchronized void build(AssemblyObject model) throws BuilderConfigException { + AssemblyVisitorImpl visitor = new AssemblyVisitorImpl(builderRegistry.getBuilders()); + visitor.start(model); + } + + public void connect(SourceWireFactory sourceFactory, TargetWireFactory targetFactory, Class targetType, boolean downScope, + ScopeContext targetScopeContext) throws BuilderConfigException { + wireBuilder.connect(sourceFactory, targetFactory, targetType, downScope, targetScopeContext); + } + + public void completeTargetChain(TargetWireFactory targetFactory, Class targetType, ScopeContext targetScopeContext) + throws BuilderConfigException { + wireBuilder.completeTargetChain(targetFactory, targetType, targetScopeContext); + } + + public <T> T resolveInstance(Class<T> instanceInterface) throws AutowireResolutionException { + if (MonitorFactory.class.equals(instanceInterface)) { + return instanceInterface.cast(monitorFactory); + } else if (ConfigurationContext.class.equals(instanceInterface)) { + return instanceInterface.cast(this); + } else if (AutowireContext.class.equals(instanceInterface)) { + return instanceInterface.cast(this); + } else if (RuntimeContext.class.equals(instanceInterface)) { + return instanceInterface.cast(this); + } else if (ContextFactoryBuilderRegistry.class.equals(instanceInterface)) { + return instanceInterface.cast(builderRegistry); + } else { + // autowire to system components + return instanceInterface.cast(getSystemContext().resolveExternalInstance(instanceInterface)); + } + } + + public <T> T resolveExternalInstance(Class<T> instanceInterface) throws AutowireResolutionException { + return systemContext.resolveExternalInstance(instanceInterface); + } + + public Composite getComposite() { + return systemContext.getComposite(); + } + + public void removeContext(String name) { + + } + + private void checkRunning() { + if (lifecycleState != RUNNING) { + throw new IllegalStateException("Context must be in RUNNING state"); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/runtime/RuntimeMonitor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/runtime/RuntimeMonitor.java new file mode 100644 index 0000000000..c1b87d6a13 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/runtime/RuntimeMonitor.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.runtime; + +import org.apache.tuscany.common.TuscanyException; +import org.apache.tuscany.common.TuscanyRuntimeException; + + +/** + * Serves as a top-level error logging monitor + * + * @version $Rev$ $Date$ + */ +public interface RuntimeMonitor { + + public void log(TuscanyRuntimeException e); + + public void log(TuscanyException e); + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/runtime/RuntimeScopeStrategy.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/runtime/RuntimeScopeStrategy.java new file mode 100644 index 0000000000..5051c2674d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/runtime/RuntimeScopeStrategy.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.runtime; + +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.context.scope.AbstractScopeStrategy; +import org.apache.tuscany.core.context.scope.CompositeScopeContext; +import org.apache.tuscany.model.assembly.Scope; + +import java.util.HashMap; +import java.util.Map; + +/** + * Implements a {@link org.apache.tuscany.core.context.ScopeStrategy} for a runtime context. Specifically, a runtime + * context has only one scope, {@link org.apache.tuscany.model.assembly.Scope#AGGREGATE} + * + * @version $Rev$ $Date$ + */ +public class RuntimeScopeStrategy extends AbstractScopeStrategy { + + public RuntimeScopeStrategy() { + } + + public Map<Scope, ScopeContext> getScopeContexts(EventContext eventContext) { + ScopeContext aggregrateScope = new CompositeScopeContext(eventContext); + Map<Scope, ScopeContext> scopes = new HashMap<Scope, ScopeContext>(); + scopes.put(Scope.AGGREGATE, aggregrateScope); + return scopes; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/DataFactoryObjectFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/DataFactoryObjectFactory.java new file mode 100644 index 0000000000..6b35115e1f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/DataFactoryObjectFactory.java @@ -0,0 +1,61 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.sdo; + +import commonj.sdo.helper.DataFactory; +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.context.AutowireContext; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.injection.ObjectCreationException; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.sdo.util.SDOUtil; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class DataFactoryObjectFactory implements ObjectFactory<DataFactory> { + + private ContextResolver resolver; + + /** + * @throws org.apache.tuscany.core.injection.FactoryInitException + * + */ + public DataFactoryObjectFactory(ContextResolver resolver) { + this.resolver = resolver; + } + + + public DataFactory getInstance() throws ObjectCreationException { + CompositeContext parent = resolver.getCurrentContext(); + if (parent == null) { + return null;// FIXME semantic here means required is not followed + } + if (!(parent instanceof AutowireContext)) { + ObjectCreationException e = new ObjectCreationException("Parent does not implement " + + AutowireContext.class.getName()); + e.setIdentifier(parent.getName()); + throw e; + } + AutowireContext ctx = (AutowireContext) parent; + AssemblyContext assemblyContext = ctx.resolveInstance(AssemblyContext.class); + return SDOUtil.createDataFactory(assemblyContext.getTypeHelper()); + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/TypeHelperObjectFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/TypeHelperObjectFactory.java new file mode 100644 index 0000000000..d345e7be95 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/TypeHelperObjectFactory.java @@ -0,0 +1,61 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.sdo; + +import commonj.sdo.helper.TypeHelper; +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.context.AutowireContext; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.injection.ObjectCreationException; +import org.apache.tuscany.model.assembly.AssemblyContext; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class TypeHelperObjectFactory implements ObjectFactory<TypeHelper> { + + + private ContextResolver resolver; + + /** + * @throws org.apache.tuscany.core.injection.FactoryInitException + * + */ + public TypeHelperObjectFactory(ContextResolver resolver) { + this.resolver = resolver; + } + + + public TypeHelper getInstance() throws ObjectCreationException { + CompositeContext parent = resolver.getCurrentContext(); + if (parent == null) { + return null;// FIXME semantic here means required is not followed + } + if (!(parent instanceof AutowireContext)) { + ObjectCreationException e = new ObjectCreationException("Parent does not implement " + + AutowireContext.class.getName()); + e.setIdentifier(parent.getName()); + throw e; + } + AutowireContext ctx = (AutowireContext) parent; + AssemblyContext assemblyContext = ctx.resolveInstance(AssemblyContext.class); + return assemblyContext.getTypeHelper(); + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/XMLHelperObjectFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/XMLHelperObjectFactory.java new file mode 100644 index 0000000000..04773f9770 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/XMLHelperObjectFactory.java @@ -0,0 +1,61 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.sdo; + +import commonj.sdo.helper.XMLHelper; +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.context.AutowireContext; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.injection.ObjectCreationException; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.sdo.util.SDOUtil; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class XMLHelperObjectFactory implements ObjectFactory<XMLHelper> { + + + private ContextResolver resolver; + + /** + * @throws org.apache.tuscany.core.injection.FactoryInitException + * + */ + public XMLHelperObjectFactory(ContextResolver resolver) { + this.resolver = resolver; + } + + + public XMLHelper getInstance() throws ObjectCreationException { + CompositeContext parent = resolver.getCurrentContext(); + if (parent == null) { + return null;// FIXME semantic here means required is not followed + } + if (!(parent instanceof AutowireContext)) { + ObjectCreationException e = new ObjectCreationException("Parent does not implement " + + AutowireContext.class.getName()); + e.setIdentifier(parent.getName()); + throw e; + } + AutowireContext ctx = (AutowireContext) parent; + AssemblyContext assemblyContext = ctx.resolveInstance(AssemblyContext.class); + return SDOUtil.createXMLHelper(assemblyContext.getTypeHelper()); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/XSDHelperObjectFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/XSDHelperObjectFactory.java new file mode 100644 index 0000000000..eaddf15cb2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/XSDHelperObjectFactory.java @@ -0,0 +1,62 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.sdo; + +import commonj.sdo.helper.XSDHelper; +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.context.AutowireContext; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.injection.ObjectCreationException; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.sdo.util.SDOUtil; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class XSDHelperObjectFactory implements ObjectFactory<XSDHelper> { + + + private ContextResolver resolver; + + /** + * @throws org.apache.tuscany.core.injection.FactoryInitException + * + */ + public XSDHelperObjectFactory(ContextResolver resolver) { + this.resolver = resolver; + } + + + public XSDHelper getInstance() throws ObjectCreationException { + CompositeContext parent = resolver.getCurrentContext(); + if (parent == null) { + return null;// FIXME semantic here means required is not followed + } + if (!(parent instanceof AutowireContext)) { + ObjectCreationException e = new ObjectCreationException("Parent does not implement " + + AutowireContext.class.getName()); + e.setIdentifier(parent.getName()); + throw e; + } + AutowireContext ctx = (AutowireContext) parent; + AssemblyContext assemblyContext = ctx.resolveInstance(AssemblyContext.class); + return SDOUtil.createXSDHelper(assemblyContext.getTypeHelper()); + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/helper/SDOHelper.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/helper/SDOHelper.java new file mode 100644 index 0000000000..a804fc51b4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/helper/SDOHelper.java @@ -0,0 +1,40 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.sdo.helper; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +/** + * Annotation used to indicate a field or method that is used to inject an SDO helper. + * + * The following helpers are supported: + * commonj.sdo.helper.TypeHelper + * commonj.sdo.helper.DataFactory + * commonj.sdo.helper.XSDHelper + * commonj.sdo.helper.XMLHelper + * + */ +@Target({METHOD, FIELD}) +@Retention(RUNTIME) +public @interface SDOHelper { + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/helper/SDOHelperExtensibilityElement.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/helper/SDOHelperExtensibilityElement.java new file mode 100644 index 0000000000..c6f84fa485 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/helper/SDOHelperExtensibilityElement.java @@ -0,0 +1,80 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.sdo.helper; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import commonj.sdo.helper.DataFactory; +import commonj.sdo.helper.TypeHelper; +import commonj.sdo.helper.XMLHelper; +import commonj.sdo.helper.XSDHelper; +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.extension.config.InjectorExtensibilityElement; +import org.apache.tuscany.core.injection.FieldInjector; +import org.apache.tuscany.core.injection.Injector; +import org.apache.tuscany.core.injection.MethodInjector; +import org.apache.tuscany.core.injection.ObjectCreationException; +import org.apache.tuscany.core.sdo.DataFactoryObjectFactory; +import org.apache.tuscany.core.sdo.TypeHelperObjectFactory; +import org.apache.tuscany.core.sdo.XMLHelperObjectFactory; +import org.apache.tuscany.core.sdo.XSDHelperObjectFactory; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class SDOHelperExtensibilityElement implements InjectorExtensibilityElement { + + private Method method; + private Field field; + private Class<?> type; + + public SDOHelperExtensibilityElement(Method m) { + method = m; + assert(method != null); + assert(method.getParameterTypes().length == 1); + type = method.getParameterTypes()[0]; + } + + public SDOHelperExtensibilityElement(Field field) { + assert (field != null); + this.field = field; + this.type = field.getType(); + } + + public Injector<?> getInjector(ContextResolver resolver) { + ObjectFactory<?> factory; + if (TypeHelper.class.equals(type)) { + factory = new TypeHelperObjectFactory(resolver); + } else if (DataFactory.class.equals(type)) { + factory = new DataFactoryObjectFactory(resolver); + } else if (XSDHelper.class.equals(type)) { + factory = new XSDHelperObjectFactory(resolver); + } else if (XMLHelper.class.equals(type)) { + factory = new XMLHelperObjectFactory(resolver); + } else { + ObjectCreationException e = new ObjectCreationException("Unknown type"); + e.setIdentifier(type.getName()); + throw e; + } + if (method != null) { + return new MethodInjector(method, factory); + } + return new FieldInjector(field, factory); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/helper/SDOHelperProcessor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/helper/SDOHelperProcessor.java new file mode 100644 index 0000000000..dc8d97779f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/sdo/helper/SDOHelperProcessor.java @@ -0,0 +1,78 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.sdo.helper; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.InvalidSetterException; +import org.apache.tuscany.core.config.processor.ImplementationProcessorSupport; +import org.apache.tuscany.model.assembly.ComponentType; +import org.osoa.sca.annotations.Scope; + +/** + * @version $$Rev$$ $$Date$$ + */ +@Scope("Module") +public class SDOHelperProcessor extends ImplementationProcessorSupport { + + @Override + public void visitMethod(Method method, ComponentType type) throws ConfigurationLoadException { + if (method.getDeclaringClass().equals(Object.class)) { + return; + } + SDOHelper annotation = method.getAnnotation(SDOHelper.class); + if (annotation != null) { + if (!Modifier.isPublic(method.getModifiers())) { + InvalidSetterException e = new InvalidSetterException("SDO setter method is not public"); + e.setIdentifier(method.toString()); + throw e; + } + Class<?>[] params = method.getParameterTypes(); + if (params.length != 1) { + InvalidSetterException e = new InvalidSetterException("SDO setter method must have one parameter"); + e.setIdentifier(method.toString()); + throw e; + } + type.getExtensibilityElements().add(new SDOHelperExtensibilityElement(method)); + + } + + + } + + @Override + public void visitField(Field field, ComponentType type) throws ConfigurationLoadException { + if (field.getDeclaringClass().equals(Object.class)) { + return; + } + int modifiers = field.getModifiers(); + SDOHelper annotation = field.getAnnotation(SDOHelper.class); + if (annotation != null) { + if (!Modifier.isPublic(modifiers) && !Modifier.isProtected(modifiers)) { + InvalidSetterException e = new InvalidSetterException("Property field is not public or protected"); + e.setIdentifier(field.getName()); + throw e; + } + type.getExtensibilityElements().add(new SDOHelperExtensibilityElement(field)); + } + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/annotation/Autowire.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/annotation/Autowire.java new file mode 100644 index 0000000000..5eb1f6b926 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/annotation/Autowire.java @@ -0,0 +1,31 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.annotation; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; + +/** + * A system annotation to inject an autowired instance + * + * @version $Rev$ $Date$ + */ +@Target( { METHOD, FIELD }) +@Retention(RUNTIME) +public @interface Autowire { + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/annotation/Monitor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/annotation/Monitor.java new file mode 100644 index 0000000000..aa552b8e0d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/annotation/Monitor.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.system.annotation; + +import java.lang.annotation.Target; +import java.lang.annotation.Retention; +import java.lang.annotation.ElementType; +import java.lang.annotation.RetentionPolicy; + +/** + * A system annotation to inject a monitor + * + * @version $Rev: 392146 $ $Date: 2006-04-06 18:11:28 -0700 (Thu, 06 Apr 2006) $ + */ +@Target( { ElementType.METHOD, ElementType.FIELD }) +@Retention(RetentionPolicy.RUNTIME) +public @interface Monitor { +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/annotation/ParentContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/annotation/ParentContext.java new file mode 100644 index 0000000000..a9d07dbb5f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/annotation/ParentContext.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.annotation; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; + +/** + * A system annotation to inject the parent context + * + * @version $Rev$ $Date$ + */ + +@Target( { METHOD, FIELD }) +@Retention(RUNTIME) +public @interface ParentContext { + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/SystemAssemblyFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/SystemAssemblyFactory.java new file mode 100644 index 0000000000..fea8d24ba6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/SystemAssemblyFactory.java @@ -0,0 +1,66 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.assembly; + +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.Scope; + +/** + * A factory for building system assembly model artifacts + * + * @version $Rev$ $Date$ + */ +public interface SystemAssemblyFactory extends AssemblyFactory { + + /** + * Returns an assembly model artifact representing a system component implementation + */ + SystemImplementation createSystemImplementation(); + + /** + * Returns an assembly model artifact representing a system module + */ + SystemModule createSystemModule(); + + /** + * Returns an assembly model artifact representing a system binding + */ + SystemBinding createSystemBinding(); + + /** + * Helper method for creating a typical system component. + * + * @param name the name of the component + * @param service the service that the component provides + * @param impl the component implementation + * @param scope the component's scope + * @return a Component model object with the appropriate system implementation + */ + <T> Component createSystemComponent(String name, Class<T> service, Class<? extends T> impl, Scope scope); + + /** + * Helper method for creating a system entry point wired to a component. + * + * @param entryPointName the name of the entry point + * @param serviceContract the service contract exposed + * @param targetName the component to wire the entry point to + * @return a EntryPoint model object that exposes the service contract and is wired to the named component + */ + EntryPoint createSystemEntryPoint(String entryPointName, Class<?> serviceContract, String targetName); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/SystemBinding.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/SystemBinding.java new file mode 100644 index 0000000000..edc7c87c85 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/SystemBinding.java @@ -0,0 +1,37 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.assembly; + +import org.apache.tuscany.model.assembly.Binding; + +/** + * Represents a system binding + * + * @version $Rev$ $Date$ + */ +public interface SystemBinding extends Binding { + + /** + * Returns the qualified name of the wire target the binding is associated with in component/service form + */ + public String getTargetName(); + + /** + * Sets the qualified name of the wire target the binding is associated with in component/service form + */ + public void setTargetName(String name); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/SystemImplementation.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/SystemImplementation.java new file mode 100644 index 0000000000..a6a024ceca --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/SystemImplementation.java @@ -0,0 +1,38 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.assembly; + +import org.apache.tuscany.model.assembly.AtomicImplementation; + +/** + * Represents a system component implementation + * + * @version $Rev$ $Date$ + */ +public interface SystemImplementation extends AtomicImplementation { + + /** + * Returns the implementation class of the system component + */ + Class<?> getImplementationClass(); + + /** + * Sets the implementation class of the system component + */ + void setImplementationClass(Class<?> value); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/SystemModule.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/SystemModule.java new file mode 100644 index 0000000000..a43aca67a2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/SystemModule.java @@ -0,0 +1,34 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.assembly; + +/** + * + */ +import org.apache.tuscany.model.assembly.Module; + +public interface SystemModule extends Module { + + /** + * Returns the implementation class of the system component + */ + Class<?> getImplementationClass(); + + /** + * Sets the implementation class of the system component + */ + void setImplementationClass(Class<?> value); + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemAssemblyFactoryImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemAssemblyFactoryImpl.java new file mode 100644 index 0000000000..c0d97c9a35 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemAssemblyFactoryImpl.java @@ -0,0 +1,84 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.assembly.impl; + +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.core.system.assembly.SystemBinding; +import org.apache.tuscany.core.system.assembly.SystemImplementation; +import org.apache.tuscany.core.system.assembly.SystemModule; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.impl.AssemblyFactoryImpl; +import org.apache.tuscany.model.types.java.JavaServiceContract; + +/** + * The default implementation of the system assembly factory + * + * @version $Rev$ $Date$ + */ +public class SystemAssemblyFactoryImpl extends AssemblyFactoryImpl implements SystemAssemblyFactory { + + public SystemAssemblyFactoryImpl() { + } + + public SystemImplementation createSystemImplementation() { + return new SystemImplementationImpl(); + } + + public SystemBinding createSystemBinding() { + return new SystemBindingImpl(); + } + + public <T> Component createSystemComponent(String name, Class<T> service, Class<? extends T> impl, Scope scope) { + JavaServiceContract jsc = createJavaServiceContract(); + jsc.setInterface(service); + jsc.setScope(scope); + Service s = createService(); + s.setServiceContract(jsc); + + ComponentType componentType = createComponentType(); + componentType.getServices().add(s); + + SystemImplementation sysImpl = createSystemImplementation(); + sysImpl.setImplementationClass(impl); + sysImpl.setComponentType(componentType); + + Component sc = createSimpleComponent(); + sc.setName(name); + sc.setImplementation(sysImpl); + return sc; + } + + public EntryPoint createSystemEntryPoint(String entryPointName, Class<?> serviceContract, String targetName) { + // create the system binding + SystemBinding systemBinding = createSystemBinding(); + + // define the EP's service contract + JavaServiceContract javaServiceContract = createJavaServiceContract(); + javaServiceContract.setInterface(serviceContract); + + return createEntryPoint(entryPointName, javaServiceContract, systemBinding, targetName); + } + + public SystemModule createSystemModule() { + return new SystemModuleImpl(); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemBindingImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemBindingImpl.java new file mode 100644 index 0000000000..a9996065e2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemBindingImpl.java @@ -0,0 +1,41 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.assembly.impl; + +import org.apache.tuscany.core.system.assembly.SystemBinding; +import org.apache.tuscany.model.assembly.impl.BindingImpl; + +/** + * The default implementation of the system binding assembly artifact + * + * @version $Rev$ $Date$ + */ +public class SystemBindingImpl extends BindingImpl implements SystemBinding { + + protected SystemBindingImpl() { + } + + private String name; + + public String getTargetName() { + return name; + } + + public void setTargetName(String name) { + this.name = name; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemImplementationImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemImplementationImpl.java new file mode 100644 index 0000000000..cca3aef1bb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemImplementationImpl.java @@ -0,0 +1,45 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.assembly.impl; + +import org.apache.tuscany.core.system.assembly.SystemImplementation; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.impl.AtomicImplementationImpl; + +/** + * The default implementation of the system implementation assembly artifact + * + * @version $Rev$ $Date$ + */ +public class SystemImplementationImpl extends AtomicImplementationImpl implements SystemImplementation { + + private Class<?> implementationClass; + + private AssemblyContext modelContext; + + protected SystemImplementationImpl() { + } + + public Class<?> getImplementationClass() { + return implementationClass; + } + + public void setImplementationClass(Class<?> value) { + checkNotFrozen(); + implementationClass = value; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemModuleImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemModuleImpl.java new file mode 100644 index 0000000000..98198cba85 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemModuleImpl.java @@ -0,0 +1,174 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.assembly.impl; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.tuscany.core.system.assembly.SystemModule; +import org.apache.tuscany.core.system.context.SystemCompositeContextImpl; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.AssemblyVisitor; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.ConfiguredProperty; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.ExternalService; +import org.apache.tuscany.model.assembly.Implementation; +import org.apache.tuscany.model.assembly.ModuleFragment; +import org.apache.tuscany.model.assembly.Multiplicity; +import org.apache.tuscany.model.assembly.OverrideOption; +import org.apache.tuscany.model.assembly.Reference; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.ServiceContract; +import org.apache.tuscany.model.assembly.ServiceURI; +import org.apache.tuscany.model.assembly.Wire; +import org.apache.tuscany.model.assembly.impl.CompositeImpl; + +/** + * An implementation of Module. + */ +public class SystemModuleImpl extends CompositeImpl implements SystemModule { + + private List<ModuleFragment> moduleFragments = new ArrayList<ModuleFragment>(); + private Map<String, ModuleFragment> moduleFragmentsMap; + private ComponentType componentType; + private Object contextFactory; + + /** + * Constructor + */ + protected SystemModuleImpl() { + } + + /** + * @see org.apache.tuscany.model.assembly.Implementation#getComponentType() + */ + public ComponentType getComponentType() { + return componentType; + } + + /** + * @see org.apache.tuscany.model.assembly.Implementation#setComponentType(org.apache.tuscany.model.assembly.ComponentType) + */ + public void setComponentType(ComponentType componentType) { + checkNotFrozen(); + this.componentType = componentType; + } + + /** + * @see org.apache.tuscany.model.assembly.Module#getModuleFragments() + */ + public List<ModuleFragment> getModuleFragments() { + return moduleFragments; + } + + /** + * @see org.apache.tuscany.model.assembly.Module#getModuleFragment(java.lang.String) + */ + public ModuleFragment getModuleFragment(String name) { + checkInitialized(); + return moduleFragmentsMap.get(name); + } + + /** + * @see org.apache.tuscany.model.assembly.AssemblyObject#initialize(org.apache.tuscany.model.assembly.AssemblyContext) + */ + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) + return; + + // Initialize module fragments + for (ModuleFragment moduleFragment : moduleFragments) { + + // Add all WSDL imports, components, entry points and external services from the module fragments + getWSDLImports().addAll(moduleFragment.getWSDLImports()); + getComponents().addAll(moduleFragment.getComponents()); + getEntryPoints().addAll(moduleFragment.getEntryPoints()); + getExternalServices().addAll(moduleFragment.getExternalServices()); + + // Add all the wires from the module fragments + getWires().addAll(moduleFragment.getWires()); + + moduleFragment.initialize(modelContext); + } + + // Initialize the composite + super.initialize(modelContext); + } + + /** + * @see org.apache.tuscany.model.assembly.AssemblyObject#freeze() + */ + public void freeze() { + if (isFrozen()) + return; + super.freeze(); + + // Freeze component type and module fragments + if (componentType != null) + componentType.freeze(); + moduleFragments = Collections.unmodifiableList(moduleFragments); + freeze(moduleFragments); + } + + /** + * @see org.apache.tuscany.model.assembly.ContextFactoryHolder#getContextFactory() + */ + public Object getContextFactory() { + return contextFactory; + } + + /** + * @see org.apache.tuscany.model.assembly.ContextFactoryHolder#setContextFactory(java.lang.Object) + */ + public void setContextFactory(Object configuration) { + checkNotFrozen(); + this.contextFactory = configuration; + } + + /** + * @see org.apache.tuscany.model.assembly.impl.CompositeImpl#accept(org.apache.tuscany.model.assembly.AssemblyVisitor) + */ + public boolean accept(AssemblyVisitor visitor) { + if (!super.accept(visitor)) + return false; + + if (componentType != null) { + if (!componentType.accept(visitor)) + return false; + } + + return accept(moduleFragments, visitor); + + } + + public Class<?> getImplementationClass() { + return SystemCompositeContextImpl.class; // FIXME hack + } + + public void setImplementationClass(Class<?> clazz) { + // do nothing + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/builder/SystemContextFactoryBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/builder/SystemContextFactoryBuilder.java new file mode 100644 index 0000000000..835324c392 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/builder/SystemContextFactoryBuilder.java @@ -0,0 +1,343 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.builder; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import org.apache.tuscany.common.monitor.MonitorFactory; +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.builder.NoAccessorException; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.builder.UnknownTypeException; +import org.apache.tuscany.core.builder.impl.ArrayMultiplicityObjectFactory; +import org.apache.tuscany.core.builder.impl.ListMultiplicityObjectFactory; +import org.apache.tuscany.core.config.JavaIntrospectionHelper; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.extension.config.InjectorExtensibilityElement; +import org.apache.tuscany.core.extension.config.extensibility.ComponentNameExtensibilityElement; +import org.apache.tuscany.core.extension.config.extensibility.ContextExtensibilityElement; +import org.apache.tuscany.core.extension.config.extensibility.DestroyInvokerExtensibilityElement; +import org.apache.tuscany.core.extension.config.extensibility.InitInvokerExtensibilityElement; +import org.apache.tuscany.core.injection.EventInvoker; +import org.apache.tuscany.core.injection.FactoryInitException; +import org.apache.tuscany.core.injection.FieldInjector; +import org.apache.tuscany.core.injection.Injector; +import org.apache.tuscany.core.injection.MethodInjector; +import org.apache.tuscany.core.injection.NonProxiedTargetFactory; +import org.apache.tuscany.core.injection.SingletonObjectFactory; +import org.apache.tuscany.core.system.assembly.SystemImplementation; +import org.apache.tuscany.core.system.assembly.SystemModule; +import org.apache.tuscany.core.system.config.SystemContextFactory; +import org.apache.tuscany.core.system.config.SystemInjectorExtensibilityElement; +import org.apache.tuscany.core.system.config.extensibility.MonitorExtensibilityElement; +import org.apache.tuscany.core.system.context.SystemCompositeContextImpl; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.Composite; +import org.apache.tuscany.model.assembly.ConfiguredProperty; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.Implementation; +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.Multiplicity; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.Service; + +/** + * Decorates components whose implementation type is a {@link org.apache.tuscany.core.system.assembly.SystemImplementation} + * with the appropriate runtime configuration. This builder handles both system composite components as well + * as system leaf or "simple" components. Consequently, both simple and composite component types may be + * injected and autowired. + * <p/> + * Note that system component references are not proxied. + * + * @version $Rev$ $Date$ + */ +public class SystemContextFactoryBuilder implements ContextFactoryBuilder { + + private final MonitorFactory monitorFactory; + + public SystemContextFactoryBuilder(MonitorFactory monitorFactory) { + this.monitorFactory = monitorFactory; + } + + @SuppressWarnings("unchecked") + public void build(AssemblyObject modelObject) throws BuilderException { + if (!(modelObject instanceof Component)) { + return; + } + Component component = (Component) modelObject; + + Class implClass; + Scope scope; + // Get the component implementation + Implementation componentImplementation = component.getImplementation(); + if (componentImplementation instanceof SystemImplementation + && component.getContextFactory() == null) { + + // The component is a system component, implemented by a Java class + SystemImplementation implementation = (SystemImplementation) componentImplementation; + if (componentImplementation.getComponentType().getServices() == null + || componentImplementation.getComponentType().getServices().size() < 1) { + BuilderConfigException e = new BuilderConfigException("No service configured on component type"); + e.setIdentifier(component.getName()); + throw e; + } + implClass = implementation.getImplementationClass(); + Scope previous = null; + scope = Scope.MODULE; + List<Service> services = component.getImplementation().getComponentType().getServices(); + for (Service service : services) { + // calculate and validate the scope of the component; ensure that all service scopes are the same unless + // a scope is stateless + Scope current = service.getServiceContract().getScope(); + if (previous != null && current != null && current != previous + && (current != Scope.INSTANCE && previous != Scope.INSTANCE)) { + BuilderException e = new BuilderConfigException("Incompatible scopes specified for services on component"); + e.setIdentifier(component.getName()); + throw e; + } + if (current != null && current != Scope.MODULE) { + scope = current; + } + } + + } else if (componentImplementation instanceof Composite) { + implClass = ((Composite) componentImplementation).getImplementationClass(); + if (implClass == null) { + // FIXME this is a hack + if (((Module) componentImplementation).getName().startsWith("org.apache.tuscany.core.system")) + { + // The component is a system module component, fix the implementation class to our implementation + // of system module component context + implClass = SystemCompositeContextImpl.class; + } else if (componentImplementation instanceof SystemModule) { + implClass = SystemCompositeContextImpl.class; + } else { + // The component is an app module component, fix the implementation class to our implementation + // of app module component context + //FIXME this should be extensible, i.e. the model should specify the impl class of the module + implClass = CompositeContextImpl.class; + } + //END hack + } + scope = Scope.AGGREGATE; + } else { + return; + } + Set<Field> fields; + Set<Method> methods; + SystemContextFactory contextFactory; + try { + fields = JavaIntrospectionHelper.getAllFields(implClass); + methods = JavaIntrospectionHelper.getAllUniqueMethods(implClass); + String name = component.getName(); + if (componentImplementation instanceof Module) { + Module module = (Module) componentImplementation; + contextFactory = new SystemContextFactory(name, module, JavaIntrospectionHelper.getDefaultConstructor(implClass), scope); + + } else { + contextFactory = new SystemContextFactory(name, JavaIntrospectionHelper.getDefaultConstructor(implClass), scope); + } + + //ContextObjectFactory contextObjectFactory = new ContextObjectFactory(contextFactory); + + List<Injector> injectors = new ArrayList<Injector>(); + + // handle properties + List<ConfiguredProperty> configuredProperties = component.getConfiguredProperties(); + if (configuredProperties != null) { + for (ConfiguredProperty property : configuredProperties) { + Injector injector = createPropertyInjector(property, fields, methods); + injectors.add(injector); + } + } + + // FIXME do not inject references on an application module yet + if (implClass != CompositeContextImpl.class) { + // handle references + List<ConfiguredReference> configuredReferences = component.getConfiguredReferences(); + if (configuredReferences != null) { + for (ConfiguredReference reference : configuredReferences) { + Injector injector = createReferenceInjector(reference, fields, methods, contextFactory); + injectors.add(injector); + } + } + } + List<Object> elements = componentImplementation.getComponentType().getExtensibilityElements(); + for (Object element : elements) { + if (element instanceof InitInvokerExtensibilityElement) { + InitInvokerExtensibilityElement invokerElement = (InitInvokerExtensibilityElement) element; + EventInvoker<Object> initInvoker = invokerElement.getEventInvoker(); + boolean eagerInit = invokerElement.isEager(); + contextFactory.setEagerInit(eagerInit); + contextFactory.setInitInvoker(initInvoker); + } else if (element instanceof DestroyInvokerExtensibilityElement) { + DestroyInvokerExtensibilityElement invokerElement = (DestroyInvokerExtensibilityElement) element; + EventInvoker<Object> destroyInvoker = invokerElement.getEventInvoker(); + contextFactory.setDestroyInvoker(destroyInvoker); + } else if (element instanceof ComponentNameExtensibilityElement) { + ComponentNameExtensibilityElement nameElement = (ComponentNameExtensibilityElement) element; + injectors.add(nameElement.getEventInvoker(name)); + } else if (element instanceof ContextExtensibilityElement) { + ContextExtensibilityElement contextElement = (ContextExtensibilityElement) element; + injectors.add(contextElement.getInjector(contextFactory)); + } else if (element instanceof InjectorExtensibilityElement) { + InjectorExtensibilityElement injectorElement = (InjectorExtensibilityElement) element; + injectors.add(injectorElement.getInjector(contextFactory)); + } else if (element instanceof SystemInjectorExtensibilityElement) { + SystemInjectorExtensibilityElement injectorElement = (SystemInjectorExtensibilityElement) element; + injectors.add(injectorElement.getInjector(contextFactory)); + } else if (element instanceof MonitorExtensibilityElement) { + MonitorExtensibilityElement monitorElement = (MonitorExtensibilityElement) element; + injectors.add(monitorElement.getInjector(monitorFactory)); + } + } + contextFactory.setSetters(injectors); + // decorate the logical model + component.setContextFactory(contextFactory); + } catch (BuilderConfigException e) { + e.addContextName(component.getName()); + throw e; + } catch (NoSuchMethodException e) { + BuilderConfigException ce = new BuilderConfigException("Class does not have a no-arg constructor", e); + ce.setIdentifier(implClass.getName()); + throw ce; + } catch (FactoryInitException e) { + BuilderConfigException ce = new BuilderConfigException("Error building component", e); + ce.addContextName(component.getName()); + throw ce; + } + } + + /** + * Creates an <code>Injector</code> for component properties + */ + private Injector createPropertyInjector(ConfiguredProperty property, Set<Field> fields, Set<Method> methods) + throws NoAccessorException { + Object value = property.getValue(); + String propName = property.getProperty().getName(); + // @FIXME is this how to get property type of object + Class type = value.getClass(); + + // There is no efficient way to do this + Method method = null; + Field field = JavaIntrospectionHelper.findClosestMatchingField(propName, type, fields); + if (field == null) { + method = JavaIntrospectionHelper.findClosestMatchingMethod(propName, new Class[]{type}, methods); + if (method == null) { + throw new NoAccessorException(propName); + } + } + Injector injector; + // FIXME support types other than String + if (JavaIntrospectionHelper.isImmutable(type)) { + if (field != null) { + injector = new FieldInjector(field, new SingletonObjectFactory<Object>(value)); + } else { + injector = new MethodInjector(method, new SingletonObjectFactory<Object>(value)); + } + } else { + if (field != null) { + throw new UnknownTypeException(field.getName()); + } else { + throw new UnknownTypeException(method.getName()); + } + } + return injector; + + } + + /** + * Creates object factories that resolve target(s) of a reference and an <code>Injector</code> responsible + * for injecting them into the reference + */ + private Injector createReferenceInjector(ConfiguredReference reference, Set<Field> fields, Set<Method> methods, + ContextResolver resolver) { + + List<ObjectFactory> objectFactories = new ArrayList<ObjectFactory>(); + String refName = reference.getPort().getName(); + Class refClass = reference.getPort().getServiceContract().getInterface(); + for (ConfiguredService configuredService : reference.getTargetConfiguredServices()) { + objectFactories.add(new NonProxiedTargetFactory(configuredService, resolver)); + } + boolean multiplicity = reference.getPort().getMultiplicity() == Multiplicity.ONE_N + || reference.getPort().getMultiplicity() == Multiplicity.ZERO_N; + return createInjector(refName, refClass, multiplicity, objectFactories, fields, methods); + + } + + /** + * Creates an <code>Injector</code> for an object factories associated with a reference. + */ + private Injector createInjector(String refName, Class refClass, boolean multiplicity, List<ObjectFactory> objectFactories, + Set<Field> fields, Set<Method> methods) throws NoAccessorException, BuilderConfigException { + Field field; + Method method = null; + if (multiplicity) { + // since this is a multiplicity, we cannot match on business interface type, so scan through the fields, + // matching on name and List or Array + field = JavaIntrospectionHelper.findMultiplicityFieldByName(refName, fields); + if (field == null) { + // No fields found. Again, since this is a multiplicity, we cannot match on interface type, so + // scan through the fields, matching on name and List or Array + method = JavaIntrospectionHelper.findMultiplicityMethodByName(refName, methods); + if (method == null) { + throw new NoAccessorException(refName); + } + } + Injector injector; + if (field != null) { + // for multiplicities, we need to inject the target or targets using an object factory + // which first delegates to create the proxies and then returns them in the appropriate List or array + // type + if (field.getType().isArray()) { + injector = new FieldInjector(field, new ArrayMultiplicityObjectFactory(refClass, objectFactories)); + } else { + injector = new FieldInjector(field, new ListMultiplicityObjectFactory(objectFactories)); + } + } else { + if (method.getParameterTypes()[0].isArray()) { + injector = new MethodInjector(method, new ArrayMultiplicityObjectFactory(refClass, objectFactories)); + } else { + injector = new MethodInjector(method, new ListMultiplicityObjectFactory(objectFactories)); + } + } + return injector; + } else { + field = JavaIntrospectionHelper.findClosestMatchingField(refName, refClass, fields); + if (field == null) { + method = JavaIntrospectionHelper.findClosestMatchingMethod(refName, new Class[]{refClass}, methods); + if (method == null) { + throw new NoAccessorException(refName); + } + } + Injector injector; + if (field != null) { + injector = new FieldInjector(field, objectFactories.get(0)); + } else { + injector = new MethodInjector(method, objectFactories.get(0)); + } + return injector; + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/builder/SystemEntryPointBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/builder/SystemEntryPointBuilder.java new file mode 100644 index 0000000000..c366da53d6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/builder/SystemEntryPointBuilder.java @@ -0,0 +1,67 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.builder; + +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.BuilderInitException; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.injection.FactoryInitException; +import org.apache.tuscany.core.system.assembly.SystemBinding; +import org.apache.tuscany.core.system.config.SystemEntryPointContextFactory; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.EntryPoint; + +/** + * Decorates the logical model with entry point context configuration builders + * + * @version $Rev: 385747 $ $Date: 2006-03-13 22:12:53 -0800 (Mon, 13 Mar 2006) $ + */ +public class SystemEntryPointBuilder implements ContextFactoryBuilder { + + public SystemEntryPointBuilder() { + } + + public void build(AssemblyObject modelObject) throws BuilderException { + if (!(modelObject instanceof EntryPoint)) { + return; + } + EntryPoint entryPoint = (EntryPoint) modelObject; + if (!(entryPoint.getBindings().get(0) instanceof SystemBinding) + || entryPoint.getContextFactory() != null) { + return; + } + try { + String targetName; + ConfiguredService targetService = entryPoint.getConfiguredReference().getTargetConfiguredServices().get(0); + Class serviceInterface = entryPoint.getConfiguredReference().getPort().getServiceContract().getInterface(); + if (targetService.getPart() == null) { + // FIXME not correct + if (targetService.getPort() == null) { + BuilderInitException e = new BuilderInitException("No target service specified on "); + e.setIdentifier(entryPoint.getName()); + } + targetName = targetService.getPort().getName(); + } else { + targetName = targetService.getPart().getName(); + } + SystemEntryPointContextFactory contextFactory = new SystemEntryPointContextFactory(entryPoint.getName(), + targetName, serviceInterface); + entryPoint.setContextFactory(contextFactory); + } catch (FactoryInitException e) { + e.addContextName(entryPoint.getName()); + throw e; + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/builder/SystemExternalServiceBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/builder/SystemExternalServiceBuilder.java new file mode 100644 index 0000000000..a568e9aa2f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/builder/SystemExternalServiceBuilder.java @@ -0,0 +1,67 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.builder; + +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.injection.InterCompositeReferenceFactory; +import org.apache.tuscany.core.system.assembly.SystemBinding; +import org.apache.tuscany.core.system.config.SystemExternalServiceContextFactory; +import org.apache.tuscany.core.system.injection.AutowireObjectFactory; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.ExternalService; + +/** + * Creates runtime configurations for system type external services + * + * @version $Rev$ $Date$ + */ +public class SystemExternalServiceBuilder implements ContextFactoryBuilder { + + public SystemExternalServiceBuilder() { + } + + public void build(AssemblyObject modelObject) throws BuilderException { + if (!(modelObject instanceof ExternalService)) { + return; + } + ExternalService externalService = (ExternalService) modelObject; + if (externalService.getConfiguredService() != null + && externalService.getContextFactory() != null) { + return; + } else if (externalService.getBindings() == null || externalService.getBindings().size() < 1 + || !(externalService.getBindings().get(0) instanceof SystemBinding)) { + return; + } + SystemBinding binding = (SystemBinding)externalService.getBindings().get(0); + if (binding.getTargetName() != null) { + SystemExternalServiceContextFactory contextFactory = new SystemExternalServiceContextFactory(externalService + .getName(), new InterCompositeReferenceFactory(binding.getTargetName())); + externalService.setContextFactory(contextFactory); + } else if (externalService.getConfiguredService().getPort().getServiceContract().getInterface() != null) { + // autowire + Class<Object> claz = externalService.getConfiguredService().getPort().getServiceContract().getInterface(); + if (claz == null) { + BuilderException e = new BuilderConfigException("Interface type not specified"); + e.setIdentifier(externalService.getName()); + e.addContextName(externalService.getName()); + throw e; + } + SystemExternalServiceContextFactory config = new SystemExternalServiceContextFactory(externalService + .getName(), new AutowireObjectFactory<Object>(claz)); + externalService.setContextFactory(config); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemContextFactory.java new file mode 100644 index 0000000000..2e4a2916ce --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemContextFactory.java @@ -0,0 +1,208 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.system.config; + +import org.apache.tuscany.common.TuscanyRuntimeException; +import org.apache.tuscany.core.builder.ContextCreationException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.config.ConfigurationException; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.injection.EventInvoker; +import org.apache.tuscany.core.injection.Injector; +import org.apache.tuscany.core.injection.PojoObjectFactory; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.system.context.SystemAtomicContext; +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.Scope; + +import java.lang.reflect.Constructor; +import java.util.List; +import java.util.Map; + +/** + * A <code>ContextFactory</code> that handles system component implementation types, which may be either simple, leaf + * types or an composites. + * <p> + * For composite types, this factory delegates to an {@link org.apache.tuscany.core.builder.ObjectFactory} to create an + * instance of the composite implementation and perform injection of configuration and references. Once an composite + * instance is created, the factory will register the composite's children. This process may be done recursively in a + * lazy fashion, descending down an composite hierarchy as a child composite is instantiated. + * + * @version $Rev$ $Date$ + */ +public class SystemContextFactory implements ContextFactory<Context>, ContextResolver { + + // the component name as configured in the hosting module + private String name; + + // if this factory produces composites, the module will be the logical model associated with its children + private Module module; + + private CompositeContext parentContext; + + // the implementation type constructor + private Constructor ctr; + + // injectors for properties, references and other metadata values such as @Context + private List<Injector> setters; + + // an invoker for a method decorated with @Init + private EventInvoker init; + + // whether the component should be eagerly initialized when its scope starts + private boolean eagerInit; + + // an invoker for a method decorated with @Destroy + private EventInvoker destroy; + + // the scope of the implementation instance + private Scope scope; + + // if the component implementation scope is stateless + private boolean stateless; + + // if the component implementation is an composite context + private boolean isComposite; + + /** + * Creates the runtime configuration + * + * @param name the SCDL name of the component the context refers to + * @param ctr the implementation type constructor + * @param scope the scope of the component implementation type + */ + public SystemContextFactory(String name, Constructor ctr, Scope scope) { + this(name, null, ctr, scope); + } + + /** + * Creates the runtime configuration + * + * @param name the SCDL name of the component the context refers to + * @param module if this factory produces aggregagtes, the logical model associated with its children; otherwise + * null + * @param ctr the implementation type constructor + * @param scope the scope of the component implementation type + */ + public SystemContextFactory(String name, Module module, Constructor ctr, Scope scope) { + assert (name != null) : "Name was null"; + assert (ctr != null) : "Constructor was null"; + this.name = name; + this.module = module; + this.ctr = ctr; + this.isComposite = CompositeContext.class.isAssignableFrom(ctr.getDeclaringClass()); + this.scope = scope; + if (isComposite) { + scope = Scope.AGGREGATE; + } else { + stateless = (scope == Scope.INSTANCE); + } + } + + public String getName() { + return name; + } + + public void addProperty(String propertyName, Object value) { + + } + + public Scope getScope() { + return scope; + } + + public Context createContext() throws ContextCreationException { + if (isComposite) { + try { + // composite context types are themselves an instance context + PojoObjectFactory<CompositeContext> objectFactory = new PojoObjectFactory<CompositeContext>(ctr, null, setters); + CompositeContext ctx = objectFactory.getInstance(); + ctx.setName(name); + // the composite has been created, now register its children + if (module != null) { + try { + ctx.registerModelObject(module); + } catch (ConfigurationException e) { + ContextCreationException cce = new ContextCreationException("Error creating context", e); + cce.setIdentifier(getName()); + throw cce; + } + + } + return ctx; + } catch (TuscanyRuntimeException e) { + e.addContextName(name); + throw e; + } + } else { + PojoObjectFactory objectFactory = new PojoObjectFactory(ctr, null, setters); + return new SystemAtomicContext(name, objectFactory, eagerInit, init, destroy, stateless); + } + } + + public void addTargetWireFactory(String serviceName, TargetWireFactory factory) { + throw new UnsupportedOperationException(); + } + + public TargetWireFactory getTargetWireFactory(String serviceName) { + return null; + } + + public Map<String, TargetWireFactory> getTargetWireFactories() { + return null; + } + + public void addSourceWireFactory(String referenceName, SourceWireFactory factory) { + throw new UnsupportedOperationException(); + } + + public void addSourceWireFactories(String referenceName, Class referenceInterface, List<SourceWireFactory> factory, boolean multiplicity) { + + } + + public List<SourceWireFactory> getSourceWireFactories() { + return null; + } + + public void setSetters(List<Injector> setters) { + this.setters = setters; + } + + public void setEagerInit(boolean val) { + eagerInit = val; + } + + public void setInitInvoker(EventInvoker invoker) { + init = invoker; + } + + public void setDestroyInvoker(EventInvoker invoker) { + destroy = invoker; + } + + public void prepare(CompositeContext parent) { + parentContext = parent; + } + + public CompositeContext getCurrentContext() { + return parentContext; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemEntryPointContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemEntryPointContextFactory.java new file mode 100644 index 0000000000..c9cfeccd6b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemEntryPointContextFactory.java @@ -0,0 +1,99 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.config; + +import org.apache.tuscany.core.builder.ContextCreationException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.EntryPointContext; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.system.context.SystemEntryPointContext; +import org.apache.tuscany.model.assembly.Scope; + +import java.util.List; +import java.util.Map; + +/** + * Creates {@link SystemEntryPointContext} instances based on an entry point configuration in an assembly model + * + * @version $Rev$ $Date$ + */ +public class SystemEntryPointContextFactory implements ContextFactory<EntryPointContext>, ContextResolver { + + // the name of the entry point + private String name; + + private CompositeContext parentContext; + + private String targetName; + + private Class serviceInterface; + + public SystemEntryPointContextFactory(String name, String targetName, Class serviceInterface) { + this.name = name; + this.targetName = targetName; + this.serviceInterface = serviceInterface; + } + + public EntryPointContext createContext() throws ContextCreationException { + return new SystemEntryPointContext(name, targetName, serviceInterface, this); + } + + public Scope getScope() { + return Scope.MODULE; + } + + public String getName() { + return name; + } + + + public void addTargetWireFactory(String serviceName, TargetWireFactory pFactory) { + throw new UnsupportedOperationException(); + } + + public TargetWireFactory getTargetWireFactory(String serviceName) { + return null; + } + + public Map<String, TargetWireFactory> getTargetWireFactories() { + return null; + } + + public void addSourceWireFactory(String referenceName, SourceWireFactory pFactory) { + throw new UnsupportedOperationException(); + } + + public void addSourceWireFactories(String referenceName, Class referenceInterface, List<SourceWireFactory> factory, boolean multiplicity) { + throw new UnsupportedOperationException(); + } + public void addProperty(String propertyName, Object value) { + + } + + public List<SourceWireFactory> getSourceWireFactories() { + return null; + } + + public void prepare(CompositeContext parent) { + this.parentContext = parent; + } + + public CompositeContext getCurrentContext() { + return parentContext; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemExtensibilityElement.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemExtensibilityElement.java new file mode 100644 index 0000000000..14655c2393 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemExtensibilityElement.java @@ -0,0 +1,23 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.config; + +/** + * Base marker for system metadata extensions + * + * @version $$Rev$$ $$Date$$ + */ +public interface SystemExtensibilityElement { + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemExternalServiceContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemExternalServiceContextFactory.java new file mode 100644 index 0000000000..d62afa4425 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemExternalServiceContextFactory.java @@ -0,0 +1,110 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.config; + +import org.apache.tuscany.core.builder.ContextCreationException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.ExternalServiceContext; +import org.apache.tuscany.core.injection.InterCompositeReferenceFactory; +import org.apache.tuscany.core.system.context.SystemExternalServiceContext; +import org.apache.tuscany.core.system.injection.AutowireObjectFactory; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.model.assembly.Scope; + +import java.util.List; +import java.util.Map; + +/** + * Creates system type external service contexts + * + * @version $Rev$ $Date$ + * @see org.apache.tuscany.core.context.ExternalServiceContext + * @see org.apache.tuscany.core.system.context.SystemExternalServiceContext + */ +public class SystemExternalServiceContextFactory implements ContextFactory<ExternalServiceContext>, ContextResolver { + + // the name of the external service + private String name; + + // the factory for returning a reference to the implementation instance of the component represented by the external + // service + private ObjectFactory factory; + + private CompositeContext parentContext; + + public SystemExternalServiceContextFactory(String name, ObjectFactory factory) { + assert (name != null) : "Name was null"; + assert (factory != null) : "Object factory was null"; + this.name = name; + this.factory = factory; + } + + public Scope getScope() { + return Scope.MODULE; + } + + public String getName() { + return name; + } + + public void addProperty(String propertyName, Object value) { + throw new UnsupportedOperationException(); + } + + public ExternalServiceContext createContext() throws ContextCreationException { + return new SystemExternalServiceContext(name, factory); + } + + public void addTargetWireFactory(String serviceName, TargetWireFactory pFactory) { + throw new UnsupportedOperationException(); + } + + public TargetWireFactory getTargetWireFactory(String serviceName) { + return null; + } + + public Map<String, TargetWireFactory> getTargetWireFactories() { + return null; + } + + public void addSourceWireFactory(String referenceName, SourceWireFactory pFactory) { + throw new UnsupportedOperationException(); + } + + public void addSourceWireFactories(String referenceName, Class referenceInterface, List<SourceWireFactory> factory, boolean multiplicity) { + + } + + public List<SourceWireFactory> getSourceWireFactories() { + return null; + } + + public void prepare(CompositeContext parent) { + parentContext = parent; + if (factory instanceof InterCompositeReferenceFactory) { + ((InterCompositeReferenceFactory) factory).setContextResolver(this); + } else if (factory instanceof AutowireObjectFactory) { + ((AutowireObjectFactory) factory).setContextResolver(this); + } + } + + public CompositeContext getCurrentContext() { + return parentContext; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemInjectorExtensibilityElement.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemInjectorExtensibilityElement.java new file mode 100644 index 0000000000..7fca219399 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemInjectorExtensibilityElement.java @@ -0,0 +1,34 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.config; + +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.injection.Injector; + +/** + * An extensiblity element which provides {@link org.apache.tuscany.core.injection.Injector}s based on + * component type metadata specific to system services + * + * @version $$Rev$$ $$Date$$ + */ +public interface SystemInjectorExtensibilityElement { + /** + * Creates an injector + * + * @param resolver that returns the current composite context + */ + public Injector<?> getInjector(ContextResolver resolver); + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemObjectContextFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemObjectContextFactory.java new file mode 100644 index 0000000000..d4a21dd427 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/SystemObjectContextFactory.java @@ -0,0 +1,98 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.system.config; + +import org.apache.tuscany.core.builder.ContextCreationException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.injection.SingletonObjectFactory; +import org.apache.tuscany.core.wire.WireFactory; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.system.context.SystemAtomicContext; +import org.apache.tuscany.model.assembly.Scope; + +import java.util.List; +import java.util.Map; + +/** + * A ContextFactory that contains the configuration needed to convert a simple + * Java Object into a component. The object is assumed to be fully initialized and + * will always be added with MODULE scope. + * + * @version $Rev$ $Date$ + */ +public class SystemObjectContextFactory implements ContextFactory { + private final String name; + private final ObjectFactory<?> objectFactory; + + /** + * Construct a ContextFactory for the supplied Java Object. + * + * @param name the name to be assigned to the resulting component + * @param instance the Java Object that provides the implementation + */ + public SystemObjectContextFactory(String name, Object instance) { + this.name = name; + objectFactory = new SingletonObjectFactory<Object>(instance); + } + + public Context createContext() throws ContextCreationException { + return new SystemAtomicContext(name, objectFactory, false, null, null, false); + } + + public Scope getScope() { + return Scope.MODULE; + } + + public String getName() { + return name; + } + + public void addProperty(String propertyName, Object value) { + + } + + public void addTargetWireFactory(String serviceName, TargetWireFactory factory) { + throw new UnsupportedOperationException(); + } + + public TargetWireFactory getTargetWireFactory(String serviceName) { + throw new UnsupportedOperationException(); + } + + public Map getTargetWireFactories() { + throw new UnsupportedOperationException(); + } + + public void addSourceWireFactory(String referenceName, SourceWireFactory factory) { + throw new UnsupportedOperationException(); + } + + public void addSourceWireFactories(String referenceName, Class referenceInterface, List factory, boolean multiplicity) { + + } + + public List<WireFactory> getSourceWireFactories() { + throw new UnsupportedOperationException(); + } + + public void prepare(CompositeContext parent) { + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/extensibility/AutowireExtensibilityElement.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/extensibility/AutowireExtensibilityElement.java new file mode 100644 index 0000000000..42d3151c78 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/extensibility/AutowireExtensibilityElement.java @@ -0,0 +1,53 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.config.extensibility; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.injection.FieldInjector; +import org.apache.tuscany.core.injection.Injector; +import org.apache.tuscany.core.injection.MethodInjector; +import org.apache.tuscany.core.system.config.SystemInjectorExtensibilityElement; +import org.apache.tuscany.core.system.injection.AutowireObjectFactory; + +/** + * A metadata extensbility element for autowires; creates injectors which return the target of an autowire + * + * @version $$Rev$$ $$Date$$ + */ +public class AutowireExtensibilityElement implements SystemInjectorExtensibilityElement { + + private Method method; + private Field field; + + public AutowireExtensibilityElement(Method m) { + assert(m == null || m.getParameterTypes().length == 1): "Illegal number of parameters"; + method = m; + } + + public AutowireExtensibilityElement(Field f) { + field = f; + } + + @SuppressWarnings("unchecked") + public Injector<?> getInjector(ContextResolver resolver) { + if (method != null) { + return new MethodInjector(method, new AutowireObjectFactory(method.getParameterTypes()[0], resolver)); + } else { + return new FieldInjector(field, new AutowireObjectFactory(field.getType(), resolver)); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/extensibility/MonitorExtensibilityElement.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/extensibility/MonitorExtensibilityElement.java new file mode 100644 index 0000000000..61c89d991b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/extensibility/MonitorExtensibilityElement.java @@ -0,0 +1,58 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.config.extensibility; + +import java.lang.reflect.Method; +import java.lang.reflect.Field; + +import org.apache.tuscany.core.system.config.SystemExtensibilityElement; +import org.apache.tuscany.core.injection.Injector; +import org.apache.tuscany.core.injection.MethodInjector; +import org.apache.tuscany.core.injection.ContextObjectFactory; +import org.apache.tuscany.core.injection.FieldInjector; +import org.apache.tuscany.core.injection.SingletonObjectFactory; +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.common.monitor.MonitorFactory; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class MonitorExtensibilityElement implements SystemExtensibilityElement { + + private Method method; + private Field field; + + public MonitorExtensibilityElement(Method m) { + assert(m.getParameterTypes().length == 1): "Illegal number of parameters"; + method = m; + } + + public MonitorExtensibilityElement(Field f) { + field = f; + } + + public Injector<?> getInjector(MonitorFactory factory) { + if (method != null) { + Object monitor = factory.getMonitor(method.getParameterTypes()[0]); + return new MethodInjector(method, new SingletonObjectFactory<Object>(monitor)); + } else { + Object monitor = factory.getMonitor(field.getType()); + return new FieldInjector(field, new SingletonObjectFactory<Object>(monitor)); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/extensibility/ParentContextExtensibilityElement.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/extensibility/ParentContextExtensibilityElement.java new file mode 100644 index 0000000000..b95b87c8de --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/extensibility/ParentContextExtensibilityElement.java @@ -0,0 +1,54 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.system.config.extensibility; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.injection.ContextObjectFactory; +import org.apache.tuscany.core.injection.FieldInjector; +import org.apache.tuscany.core.injection.Injector; +import org.apache.tuscany.core.injection.MethodInjector; +import org.apache.tuscany.core.system.config.SystemInjectorExtensibilityElement; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class ParentContextExtensibilityElement implements SystemInjectorExtensibilityElement { + + private Method method; + private Field field; + + public ParentContextExtensibilityElement(Method m) { + assert(m.getParameterTypes().length == 1): "Illegal number of parameters"; + method = m; + } + + public ParentContextExtensibilityElement(Field f) { + field = f; + } + + public Injector<?> getInjector(ContextResolver resolver) { + if (method != null) { + return new MethodInjector(method, new ContextObjectFactory(resolver)); + } else { + return new FieldInjector(field, new ContextObjectFactory(resolver)); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/processor/AutowireProcessor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/processor/AutowireProcessor.java new file mode 100644 index 0000000000..1885a5eaaa --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/processor/AutowireProcessor.java @@ -0,0 +1,90 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.system.config.processor; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.InvalidSetterException; +import org.apache.tuscany.core.config.processor.ImplementationProcessorSupport; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.system.config.extensibility.AutowireExtensibilityElement; +import org.apache.tuscany.core.context.SystemCompositeContext; +import org.apache.tuscany.core.context.ConfigurationContext; +import org.apache.tuscany.core.context.AutowireContext; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.common.monitor.MonitorFactory; + +/** + * Processes {@link Autowire} annotations + * + * @version $$Rev$$ $$Date$$ + */ +public class AutowireProcessor extends ImplementationProcessorSupport { + + @Override + public void visitMethod(Method method, ComponentType type) throws ConfigurationLoadException { + Autowire annotation = method.getAnnotation(Autowire.class); + if (annotation != null) { + if (!Modifier.isPublic(method.getModifiers())) { + InvalidSetterException e = new InvalidSetterException("Autowire setter method is not public"); + e.setIdentifier(method.toString()); + throw e; + } + if (method.getParameterTypes().length != 1){ + InvalidSetterException e = new InvalidSetterException("Autowire setter method must have one parameter"); + e.setIdentifier(method.toString()); + throw e; + } + checkAutowireType(method.getParameterTypes()[0],method.getDeclaringClass()); + type.getExtensibilityElements().add(new AutowireExtensibilityElement(method)); + } + } + + @Override + public void visitField(Field field, ComponentType type) throws ConfigurationLoadException { + checkAutowireType(field.getType(),field.getDeclaringClass()); + int modifiers = field.getModifiers(); + Autowire annotation = field.getAnnotation(Autowire.class); + if (annotation != null) { + if (!Modifier.isPublic(modifiers) && !Modifier.isProtected(modifiers)) { + InvalidSetterException e = new InvalidSetterException("Autowire field is not public or protected"); + e.setIdentifier(field.getName()); + throw e; + } + type.getExtensibilityElements().add(new AutowireExtensibilityElement(field)); + } + } + + + + private void checkAutowireType(Class paramClass, Class declaringClass) throws BuilderConfigException{ + if (SystemCompositeContext.class.isAssignableFrom(declaringClass) + && !(paramClass.equals(ConfigurationContext.class) + || paramClass.equals(MonitorFactory.class) + || paramClass.equals(RuntimeContext.class) || paramClass.equals( + AutowireContext.class))) { + BuilderConfigException e = new BuilderConfigException("Illegal autowire type for system context"); + e.setIdentifier(paramClass.getName()); + throw e; + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/processor/MonitorProcessor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/processor/MonitorProcessor.java new file mode 100644 index 0000000000..9d7f535cc8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/processor/MonitorProcessor.java @@ -0,0 +1,69 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.system.config.processor; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.InvalidSetterException; +import org.apache.tuscany.core.config.processor.ImplementationProcessorSupport; +import org.apache.tuscany.core.system.annotation.Monitor; +import org.apache.tuscany.core.system.config.extensibility.MonitorExtensibilityElement; +import org.apache.tuscany.model.assembly.ComponentType; + +/** + * Processes {@link org.apache.tuscany.core.system.annotation.Autowire} annotations + * + * @version $$Rev$$ $$Date$$ + */ +public class MonitorProcessor extends ImplementationProcessorSupport { + + @Override + public void visitMethod(Method method, ComponentType type) throws ConfigurationLoadException { + Monitor annotation = method.getAnnotation(Monitor.class); + if (annotation != null) { + if (!Modifier.isPublic(method.getModifiers())) { + InvalidSetterException e = new InvalidSetterException("Monitor setter method is not public"); + e.setIdentifier(method.toString()); + throw e; + } + if (method.getParameterTypes().length != 1) { + InvalidSetterException e = new InvalidSetterException("Monitor setter method must have one parameter"); + e.setIdentifier(method.toString()); + throw e; + } + type.getExtensibilityElements().add(new MonitorExtensibilityElement(method)); + } + } + + @Override + public void visitField(Field field, ComponentType type) throws ConfigurationLoadException { + int modifiers = field.getModifiers(); + Monitor annotation = field.getAnnotation(Monitor.class); + if (annotation != null) { + if (!Modifier.isPublic(modifiers) && !Modifier.isProtected(modifiers)) { + InvalidSetterException e = new InvalidSetterException("Monitor field is not public or protected"); + e.setIdentifier(field.getName()); + throw e; + } + type.getExtensibilityElements().add(new MonitorExtensibilityElement(field)); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/processor/ParentContextProcessor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/processor/ParentContextProcessor.java new file mode 100644 index 0000000000..1ddc68e3e8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/config/processor/ParentContextProcessor.java @@ -0,0 +1,72 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.system.config.processor; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.InvalidSetterException; +import org.apache.tuscany.core.config.processor.ImplementationProcessorSupport; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.system.annotation.ParentContext; +import org.apache.tuscany.core.system.config.extensibility.ParentContextExtensibilityElement; +import org.apache.tuscany.model.assembly.ComponentType; + +/** + * Processes {@link org.apache.tuscany.core.system.annotation.Autowire} annotations + * + * @version $$Rev$$ $$Date$$ + */ +public class ParentContextProcessor extends ImplementationProcessorSupport { + + @Override + public void visitMethod(Method method, ComponentType type) throws ConfigurationLoadException { + ParentContext annotation = method.getAnnotation(ParentContext.class); + if (annotation != null) { + if (!Modifier.isPublic(method.getModifiers())) { + InvalidSetterException e = new InvalidSetterException("ParentContext setter method is not public"); + e.setIdentifier(method.toString()); + throw e; + } + if (method.getParameterTypes().length != 1 + && !CompositeContext.class.isAssignableFrom(method.getParameterTypes()[0])) { + InvalidSetterException e = new InvalidSetterException("ParentContext setter method must have one parameter of type " + CompositeContext.class.getName()); + e.setIdentifier(method.toString()); + throw e; + } + type.getExtensibilityElements().add(new ParentContextExtensibilityElement(method)); + } + } + + @Override + public void visitField(Field field, ComponentType type) throws ConfigurationLoadException { + int modifiers = field.getModifiers(); + ParentContext annotation = field.getAnnotation(ParentContext.class); + if (annotation != null) { + if (!Modifier.isPublic(modifiers) && !Modifier.isProtected(modifiers)) { + InvalidSetterException e = new InvalidSetterException("ParentContext field is not public or protected"); + e.setIdentifier(field.getName()); + throw e; + } + type.getExtensibilityElements().add(new ParentContextExtensibilityElement(field)); + } + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/context/SystemAtomicContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/context/SystemAtomicContext.java new file mode 100644 index 0000000000..374555bfb6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/context/SystemAtomicContext.java @@ -0,0 +1,159 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.context; + +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.injection.EventInvoker; +import org.apache.tuscany.core.injection.ObjectCallbackException; +import org.apache.tuscany.core.injection.ObjectCreationException; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.impl.AbstractContext; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ContextInitException; +import org.apache.tuscany.core.context.event.InstanceCreated; + +/** + * Manages system component implementation instances + * + * @version $Rev$ $Date$ + */ +public class SystemAtomicContext extends AbstractContext implements AtomicContext { + + private boolean eagerInit; + + private EventInvoker<Object> initInvoker; + + private EventInvoker<Object> destroyInvoker; + + private boolean stateless; + + // the cached target instance + private Object cachedTargetInstance; + + // responsible for creating a new implementation instance with injected references and properties + private ObjectFactory objectFactory; + + public SystemAtomicContext(String name, ObjectFactory objectFactory, boolean eagerInit, EventInvoker<Object> initInvoker, + EventInvoker<Object> destroyInvoker, boolean stateless) { + super(name); + assert (objectFactory != null) : "Object factory was null"; + if (eagerInit && initInvoker == null) { + throw new AssertionError("No intialization method found for eager init implementation"); + } + this.objectFactory = objectFactory; + this.eagerInit = eagerInit; + this.initInvoker = initInvoker; + this.destroyInvoker = destroyInvoker; + this.stateless = stateless; + } + + public void setName(String name) { + super.setName(name); + } + + protected int type; + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public void init() throws TargetException{ + getInstance(null); + } + + public void destroy() throws TargetException { + if (cachedTargetInstance != null) { + if (destroyInvoker != null) { + try { + destroyInvoker.invokeEvent(cachedTargetInstance); + } catch (ObjectCallbackException e) { + throw new TargetException(e.getCause()); + } + } + } + lifecycleState = STARTED; + } + + public synchronized Object getInstance(QualifiedName qName) throws TargetException { + if (cachedTargetInstance != null) { + return cachedTargetInstance; // already cached, just return + } + + if (getLifecycleState() == ERROR || getLifecycleState() == CONFIG_ERROR) { + return null; + } + synchronized (this) { + try { + Object instance = objectFactory.getInstance(); + // handle @Init + if (initInvoker != null) { + initInvoker.invokeEvent(instance); + } + publish(new InstanceCreated(this)); + lifecycleState = RUNNING; + if (stateless) { + return instance; + } else { + // cache the actual instance + cachedTargetInstance = instance; + return cachedTargetInstance; + } + } catch (ObjectCreationException e) { + lifecycleState = ERROR; + TargetException te = new TargetException("Error creating component instance", e); + te.setIdentifier(getName()); + throw te; + } + } + + } + + public Object getTargetInstance() throws TargetException { + return getInstance(null); + } + + public boolean isEagerInit() { + return eagerInit; + } + + public boolean isDestroyable() { + return (destroyInvoker != null); + } + + public void start() throws ContextInitException { + if (getLifecycleState() != UNINITIALIZED && getLifecycleState() != STOPPED) { + throw new IllegalStateException("Component must be in UNINITIALIZED state [" + getLifecycleState() + "]"); + } + if (objectFactory == null) { + lifecycleState = ERROR; + ContextInitException e = new ContextInitException("Object factory not found "); + e.setIdentifier(getName()); + throw e; + } + lifecycleState = INITIALIZED; + } + + public void stop() { + lifecycleState = STOPPED; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/context/SystemCompositeContextImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/context/SystemCompositeContextImpl.java new file mode 100644 index 0000000000..9ac0abe38a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/context/SystemCompositeContextImpl.java @@ -0,0 +1,91 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.context; + +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.tuscany.core.config.ConfigurationException; +import org.apache.tuscany.core.context.AutowireContext; +import org.apache.tuscany.core.context.AutowireResolutionException; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.ConfigurationContext; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.context.ScopeStrategy; +import org.apache.tuscany.core.context.SystemCompositeContext; +import org.apache.tuscany.core.context.impl.AbstractCompositeContext; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; +import org.apache.tuscany.core.system.config.SystemObjectContextFactory; +import org.apache.tuscany.core.wire.WireFactoryFactory; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; + + +/** + * Implements an composite context for system components. By default a system context uses the scopes specified by + * {@link org.apache.tuscany.core.system.context.SystemScopeStrategy}. In addition, it implements an autowire policy + * where entry points configured with a {@link org.apache.tuscany.core.system.assembly.SystemBinding} are matched + * according to their exposed interface. A system context may contain child composite contexts but an entry point in a + * child context will only be outwardly accessible if there is an entry point that exposes it configured in the + * top-level system context. + * + * @version $Rev$ $Date$ + */ +public class SystemCompositeContextImpl extends AbstractCompositeContext implements SystemCompositeContext { + public SystemCompositeContextImpl() { + super(); + eventContext = new EventContextImpl(); + scopeStrategy = new SystemScopeStrategy(); + } + + public SystemCompositeContextImpl(String name, + CompositeContext parent, + AutowireContext autowire, + ScopeStrategy strategy, + EventContext ctx, + ConfigurationContext configCtx + ) { + super(name, parent, strategy, ctx, configCtx); + setAutowireContext(autowire); + scopeIndex = new ConcurrentHashMap<String, ScopeContext>(); + } + + public void registerJavaObject(String componentName, Class<?> service, Object instance) throws ConfigurationException { + SystemObjectContextFactory configuration = new SystemObjectContextFactory(componentName, instance); + registerConfiguration(configuration); + ScopeContext scope = scopeContexts.get(configuration.getScope()); + registerAutowireInternal(service, componentName, scope); + } + + // FIXME These should be removed and configured + private static final MessageFactory messageFactory = new MessageFactoryImpl(); + + private static final WireFactoryFactory WIRE_FACTORY_FACTORY = new JDKWireFactoryFactory(); + + public <T> T resolveInstance(Class<T> instanceInterface) throws AutowireResolutionException { + if (CompositeContext.class.equals(instanceInterface)) { + return instanceInterface.cast(this); + } else if (MessageFactory.class.equals(instanceInterface)) { + return instanceInterface.cast(messageFactory); + } else if (WireFactoryFactory.class.equals(instanceInterface)) { + return instanceInterface.cast(WIRE_FACTORY_FACTORY); + } else { + return super.resolveInstance(instanceInterface); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/context/SystemEntryPointContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/context/SystemEntryPointContext.java new file mode 100644 index 0000000000..107e676c47 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/context/SystemEntryPointContext.java @@ -0,0 +1,82 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.context; + +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.context.impl.AbstractContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.CoreRuntimeException; +import org.apache.tuscany.core.context.EntryPointContext; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.TargetException; + +/** + * Manages an entry point into a system module. System entry points cache a direct (i.e. non-proxied) reference to a + * component instance. + * + * @version $Rev$ $Date$ + */ +public class SystemEntryPointContext extends AbstractContext implements EntryPointContext { + + // a reference to the component's implementation instance exposed by the entry point + private Object cachedInstance; + + private ContextResolver resolver; + + private QualifiedName targetName; + + private Class serviceInterface; + + public SystemEntryPointContext(String name, String targetName, Class serviceInterface, ContextResolver resolver) { + super(name); + assert (resolver != null) : "Context resolver was null"; + assert (targetName != null) : "Target name was null"; + assert (serviceInterface != null) : "Service interface is null"; + this.serviceInterface = serviceInterface; + this.resolver = resolver; + this.targetName = new QualifiedName(targetName); + } + + public Object getInstance(QualifiedName qName) throws TargetException { + try { + if (cachedInstance == null) { + Context ctx = resolver.getCurrentContext().getContext(targetName.getPartName()); + if (ctx == null){ + return null; + } + cachedInstance = ctx.getInstance(targetName); + } + return cachedInstance; + } catch (TargetException e) { + e.addContextName(getName()); + throw e; + } + } + + public void start() throws CoreRuntimeException { + lifecycleState = RUNNING; + } + + public void stop() throws CoreRuntimeException { + lifecycleState = STOPPED; + } + + public Object getHandler() throws TargetException { + return getInstance(null); + } + + public Class getServiceInterface() { + return serviceInterface; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/context/SystemExternalServiceContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/context/SystemExternalServiceContext.java new file mode 100644 index 0000000000..b85bd2722b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/context/SystemExternalServiceContext.java @@ -0,0 +1,67 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.context; + +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.context.impl.AbstractContext; +import org.apache.tuscany.core.context.ExternalServiceContext; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.TargetException; + +/** + * An implementation of an external service for system wiring. As system components are not proxied and the system + * binding is by-reference, the implementation caches a reference to its configured target. + * + * @version $Rev$ $Date$ + */ +public class SystemExternalServiceContext extends AbstractContext implements ExternalServiceContext { + + // a factory for retrieving the target of the external service wire + private ObjectFactory factory; + + // the cached target + private Object cachedInstance; + + public SystemExternalServiceContext(String name, ObjectFactory factory) { + super(name); + assert (factory != null) : "Object factory was null"; + this.factory = factory; + } + + public Object getInstance(QualifiedName qName) throws TargetException { + try { + if (cachedInstance == null) { + cachedInstance = factory.getInstance(); + } + return cachedInstance; + } catch (TargetException e) { + e.addContextName(getName()); + throw e; + } + + } + + public void start() { + lifecycleState = RUNNING; + } + + public void stop() { + lifecycleState = STOPPED; + } + + public Object getHandler() throws TargetException { + return this; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/context/SystemScopeStrategy.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/context/SystemScopeStrategy.java new file mode 100644 index 0000000000..76b9f2856d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/context/SystemScopeStrategy.java @@ -0,0 +1,56 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.context; + +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.context.scope.AbstractScopeStrategy; +import org.apache.tuscany.core.context.scope.CompositeScopeContext; +import org.apache.tuscany.core.context.scope.ModuleScopeContext; +import org.apache.tuscany.core.context.scope.StatelessScopeContext; +import org.apache.tuscany.model.assembly.Scope; + +import java.util.HashMap; +import java.util.Map; + +/** + * Implements a {@link org.apache.tuscany.core.context.ScopeStrategy} for a system composite context with the following scopes: + * <ul> + * <li>{@link org.apache.tuscany.model.assembly.Scope#AGGREGATE}</li> + * <li>{@link org.apache.tuscany.model.assembly.Scope#MODULE}</li> + * <li>{@link org.apache.tuscany.model.assembly.Scope#INSTANCE}</li> + * </ul> + * + * @version $Rev$ $Date$ + */ +public class SystemScopeStrategy extends AbstractScopeStrategy { + + public SystemScopeStrategy() { + } + + public Map<Scope, ScopeContext> getScopeContexts(EventContext eventContext) { + ScopeContext aggregrateScope = new CompositeScopeContext(eventContext); + ScopeContext moduleScoper = new ModuleScopeContext(eventContext); + ScopeContext statelessScope = new StatelessScopeContext(eventContext); + Map<Scope, ScopeContext> scopes = new HashMap<Scope, ScopeContext>(); + scopes.put(Scope.AGGREGATE, aggregrateScope); + scopes.put(Scope.MODULE, moduleScoper); + scopes.put(Scope.INSTANCE, statelessScope); + return scopes; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/injection/AutowireObjectFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/injection/AutowireObjectFactory.java new file mode 100644 index 0000000000..6c1d291673 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/system/injection/AutowireObjectFactory.java @@ -0,0 +1,72 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.injection; + +import org.apache.tuscany.core.builder.ContextResolver; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.AutowireContext; +import org.apache.tuscany.core.injection.FactoryInitException; +import org.apache.tuscany.core.injection.ObjectCreationException; + +/** + * Returns an instance by resolving against an AutowireContext. + * + * @version $Rev: 385139 $ $Date: 2006-03-11 11:03:11 -0800 (Sat, 11 Mar 2006) $ + */ +public class AutowireObjectFactory<T> implements ObjectFactory<T> { + + private ContextResolver resolver; + + private Class<T> autowireType; + + /** + * + * @throws FactoryInitException + */ + public AutowireObjectFactory(Class<T> autowireType,ContextResolver resolver) { + assert (autowireType != null) : "Target interface was null"; + this.resolver = resolver; + this.autowireType = autowireType; + } + + /** + * Creates a new factory that resolves against the cuurent context using the given implementation type + * + * @throws FactoryInitException + */ + public AutowireObjectFactory(Class<T> implementationType) { + this(implementationType, null); + } + + public T getInstance() throws ObjectCreationException { + CompositeContext parent = resolver.getCurrentContext(); + if (parent == null) { + return null;// FIXME semantic here means required is not followed + } + if (!(parent instanceof AutowireContext)) { + ObjectCreationException e = new ObjectCreationException("Parent does not implement " + + AutowireContext.class.getName()); + e.setIdentifier(parent.getName()); + throw e; + } + AutowireContext ctx = (AutowireContext) parent; + return ctx.resolveInstance(autowireType); + } + + public void setContextResolver(ContextResolver resolver) { + this.resolver = resolver; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/webapp/ContextBinder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/webapp/ContextBinder.java new file mode 100644 index 0000000000..70b40e7269 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/webapp/ContextBinder.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.webapp; + +import org.osoa.sca.ModuleContext; +import org.osoa.sca.SCA; + +/** + * @version $Rev$ $Date$ + */ +class ContextBinder extends SCA { + static final ContextBinder BINDER = new ContextBinder(); + + public void setContext(ModuleContext context) { + setModuleContext(context); + } + + public void start() { + throw new AssertionError(); + } + + public void stop() { + throw new AssertionError(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/webapp/LazyHTTPSessionId.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/webapp/LazyHTTPSessionId.java new file mode 100644 index 0000000000..c9e69eaa82 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/webapp/LazyHTTPSessionId.java @@ -0,0 +1,56 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.webapp; + +import org.apache.tuscany.core.context.ScopeIdentifier; + +import javax.servlet.http.HttpServletRequest; + +/** + * Implements a <code>ScopeIdentifier</code> for a Servlet-based transport. + * Wraps an <code>HttpServletRequest</code> so that the session id associated + * with the current request may be lazily retrieved by the module context - i.e. + * if a session context or session-scoped component is not accessed, no session + * is created. + * + * @version $Rev$ $Date$ + */ +public class LazyHTTPSessionId implements ScopeIdentifier { + + private HttpServletRequest request; + + //---------------------------------- + // Constructors + //---------------------------------- + + public LazyHTTPSessionId(HttpServletRequest request) { + this.request = request; + } + + //---------------------------------- + // Methods + //---------------------------------- + + /** + * Returns the session identifier + * + * @see org.apache.tuscany.core.context.ScopeIdentifier#getIdentifier() + */ + public Object getIdentifier() { + return request.getSession(true); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/webapp/ServletHost.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/webapp/ServletHost.java new file mode 100644 index 0000000000..85a4a180c5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/webapp/ServletHost.java @@ -0,0 +1,58 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.webapp; + +import javax.servlet.Servlet; + +/** + * Service interface implemented by host environments that allow Servlets + * to be registered. + * <p/> + * This interface allows an SCA system component to register a servlet to handle + * inbound requests. + * + * @version $Rev$ $Date$ + */ +public interface ServletHost { + /** + * Register a mapping for an instance of a Servlet. + * This requests that the servlet container direct all requests to the + * designated mapping to the supplied Servlet instance. + * + * @param mapping the uri-mapping for the Servlet + * @param servlet the Servlet that should be invoked + */ + void registerMapping(String mapping, Servlet servlet); + + /** + * Unregister a servlet mapping. + * This directs the servlet contain not to direct any more requests to + * a previously registered Servlet. + * + * @param mapping the uri-mapping for the Servlet + */ + void unregisterMapping(String mapping); + + /** + * Get the servlet instance registered for the mapping. + * + * @param mapping the uri-mapping for the Servlet + * @return the Servelt for the mapping or null if there is no Servlet registered for the mapping + */ + @Deprecated + Servlet getMapping(String mapping); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/webapp/TuscanyRequestFilter.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/webapp/TuscanyRequestFilter.java new file mode 100644 index 0000000000..6637448204 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/webapp/TuscanyRequestFilter.java @@ -0,0 +1,96 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.webapp; + +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.event.HttpSessionBound; +import org.apache.tuscany.core.context.event.RequestStart; +import org.apache.tuscany.core.context.event.RequestEnd; +import org.osoa.sca.CurrentModuleContext; +import org.osoa.sca.ModuleContext; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.Filter; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.FilterConfig; +import javax.servlet.ServletResponse; +import javax.servlet.FilterChain; +import javax.servlet.ServletRequest; +import java.io.IOException; + +/** + * Notifies the {@link org.apache.tuscany.core.context.CompositeContext} of web request start and end events as well as setting up the + * current session context. The latter is done using lazy Servlet-based session retrieval. The filter fires a session + * start event, passing a <tt>LazyServletSessionId</tt> as the session id. The <tt>LazyServletSessionId</tt> is a + * wrapper for the servlet request which may be called by the <tt>ModuleContext</tt> to retrieve the session id + * lazily. + * + * @version $Rev: 379957 $ $Date: 2006-02-22 14:58:24 -0800 (Wed, 22 Feb 2006) $ + */ +public class TuscanyRequestFilter implements Filter { + private CompositeContext moduleContext; + + public TuscanyRequestFilter() { + } + + public void init(FilterConfig filterConfig) throws ServletException { + ServletContext servletContext = filterConfig.getServletContext(); + moduleContext = (CompositeContext) servletContext.getAttribute(TuscanyServletListener.MODULE_COMPONENT_NAME); + } + + public void destroy() { + } + + public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException { + ModuleContext oldContext = CurrentModuleContext.getContext(); + try { + // Set the current module context + ContextBinder.BINDER.setContext((ModuleContext) moduleContext); + + // Handle a request + if (request instanceof HttpServletRequest) { + if (((HttpServletRequest) request).getSession(false) != null) { + + // A session is already active + moduleContext.publish(new HttpSessionBound(this, ((HttpServletRequest) request).getSession(true))); + } else { + // Create a lazy wrapper since a session is not yet active + moduleContext.publish(new HttpSessionBound(this, new LazyHTTPSessionId((HttpServletRequest) request))); + } + } else { + moduleContext.publish(new HttpSessionBound(this, request)); + } + // Start processing the request + moduleContext.publish(new RequestStart(this, request)); + // Dispatch to the next filter + filterChain.doFilter(request, response); + } catch (Exception e) { + throw new ServletException(e); + + } finally { + try { + // End processing the request + moduleContext.publish(new RequestEnd(this, request)); + } catch (Exception e) { + throw new ServletException(e); + } + ContextBinder.BINDER.setContext(oldContext); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/webapp/TuscanyServletListener.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/webapp/TuscanyServletListener.java new file mode 100644 index 0000000000..8c9c215d64 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/webapp/TuscanyServletListener.java @@ -0,0 +1,129 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.webapp; + +import org.apache.tuscany.common.monitor.MonitorFactory; +import org.apache.tuscany.common.monitor.impl.NullMonitorFactory; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.builder.impl.DefaultWireBuilder; +import org.apache.tuscany.core.client.BootstrapHelper; +import org.apache.tuscany.core.config.ConfigurationException; +import org.apache.tuscany.core.config.ModuleComponentConfigurationLoader; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.SystemCompositeContext; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.HttpSessionEnd; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.core.runtime.RuntimeContextImpl; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.ModuleComponent; +import org.osoa.sca.CurrentModuleContext; +import org.osoa.sca.ModuleContext; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.http.HttpSessionEvent; +import javax.servlet.http.HttpSessionListener; + +/** + * ServletContextListener that can be added to a standard web application to boot + * a Tuscany runtime inside that application. All implementation classes should + * be located in the web application itself. + * + * @version $Rev: 380792 $ $Date: 2006-02-24 11:25:11 -0800 (Fri, 24 Feb 2006) $ + */ +public class TuscanyServletListener implements ServletContextListener, HttpSessionListener { + public static final String SCA_COMPONENT_NAME = "org.apache.tuscany.core.webapp.ModuleComponentName"; + public static final String MODULE_COMPONENT_NAME = "org.apache.tuscany.core.webapp.ModuleComponentContext"; + public static final String TUSCANY_RUNTIME_NAME = RuntimeContext.class.getName(); + + private RuntimeContext runtime; + private CompositeContext moduleContext; + + private static final String SYSTEM_MODULE_COMPONENT = "org.apache.tuscany.core.system"; + + public void contextInitialized(ServletContextEvent servletContextEvent) { + ServletContext servletContext = servletContextEvent.getServletContext(); + String name = servletContext.getInitParameter(SCA_COMPONENT_NAME); + String uri = name; // todo get from context path + MonitorFactory monitorFactory = new NullMonitorFactory(); // todo have one that writes to the servlet log + + try { + bootRuntime(name, uri, monitorFactory); + } catch (ConfigurationException e) { + throw new RuntimeException(e.getMessage(), e); + } + + servletContext.setAttribute(TUSCANY_RUNTIME_NAME, runtime); + servletContext.setAttribute(MODULE_COMPONENT_NAME, moduleContext); + } + + public void contextDestroyed(ServletContextEvent servletContextEvent) { + moduleContext.publish(new ModuleStop(this)); + moduleContext.stop(); + SystemCompositeContext systemContext = runtime.getSystemContext(); + systemContext.publish(new ModuleStop(this)); + systemContext.stop(); + runtime.stop(); + servletContextEvent.getServletContext().removeAttribute(MODULE_COMPONENT_NAME); + servletContextEvent.getServletContext().removeAttribute(TUSCANY_RUNTIME_NAME); + } + + public void sessionCreated(HttpSessionEvent event) { + // do nothing since sessions are lazily created in {@link TuscanyRequestFilter} + } + + public void sessionDestroyed(HttpSessionEvent event) { + // todo do we actually need to bind the module context to the thread to fire this event? + ModuleContext oldContext = CurrentModuleContext.getContext(); + try { + ContextBinder.BINDER.setContext((ModuleContext) moduleContext); + moduleContext.publish(new HttpSessionEnd(this, event.getSession())); + } finally{ + ContextBinder.BINDER.setContext(oldContext); + } + } + + private void bootRuntime(String name, String uri, MonitorFactory monitorFactory) throws ConfigurationException { + + // Create an assembly model context + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + AssemblyContext modelContext = BootstrapHelper.getModelContext(classLoader); + + // Create a runtime context and start it + ContextFactoryBuilderRegistry builderRegistry = BootstrapHelper.bootstrapContextFactoryBuilders(monitorFactory); + runtime = new RuntimeContextImpl(monitorFactory, builderRegistry, new DefaultWireBuilder()); + runtime.start(); + + // Load and start the system configuration + SystemCompositeContext systemContext = runtime.getSystemContext(); + BootstrapHelper.bootstrapStaxLoader(systemContext, modelContext); + ModuleComponentConfigurationLoader loader = BootstrapHelper.getConfigurationLoader(systemContext, modelContext); + ModuleComponent systemModuleComponent = loader.loadSystemModuleComponent(SYSTEM_MODULE_COMPONENT, SYSTEM_MODULE_COMPONENT); + CompositeContext context = BootstrapHelper.registerModule(systemContext, systemModuleComponent); + context.publish(new ModuleStart(this)); + + // Load the SCDL configuration of the application module + CompositeContext rootContext = runtime.getRootContext(); + ModuleComponent moduleComponent = loader.loadModuleComponent(name, uri); + moduleContext = BootstrapHelper.registerModule(rootContext, moduleComponent); + + moduleContext.publish(new ModuleStart(this)); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/Interceptor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/Interceptor.java new file mode 100644 index 0000000000..1e87e45616 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/Interceptor.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +import org.apache.tuscany.core.message.Message; + +/** + * Synchronous, around-style mediation associated with a client- or target- side wire. + * + * @version $Rev$ $Date$ + */ +public interface Interceptor { + + /** + * Process a synchronous wire. + * + * @param msg the request Message for the wire + * @return the response Message from the wire + */ + Message invoke(Message msg); + + /** + * Sets the next interceptor. + * + * @param next + */ + void setNext(Interceptor next); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/InvocationConfiguration.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/InvocationConfiguration.java new file mode 100644 index 0000000000..94e8d91ba5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/InvocationConfiguration.java @@ -0,0 +1,181 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +/** + * Contains a source- or target-side invocation pipeline for a service operation. The runtime framework creates invocation chains + * on a per-operation, per-service basis. Further, invocation chains are further distinguished by being part of the source or + * target sides of a wire. Chains are "bridged" together by the runtime by a set of {@link + * org.apache.tuscany.core.builder.WireBuilder}s with the source-side holding references to the target. + * <p/> + * <code>InvocationChain</code>s are managed by {@link WireConfiguration}s, which are used by {@link + * org.apache.tuscany.core.wire.WireFactory}s to buildSource wires and proxies. + * <p/> + * Invocation configurations must contain at least one interceptor and may have 0 to N handlers. Handlers process a wire request + * or response in a one-way fashion. A typical wire sequence where interceptors and handlers are configured for both the source + * and target-side will proceed as follows: + * <pre> + * <ol> + * <li>The first source interceptor will be called with a message, which will in + * turn invoke the next interceptor in the chain <li>The last source interceptor, which must be of type {@link + * org.apache.tuscany.core.wire.impl.RequestResponseInterceptor} if there are handlers present, will be invoked. The RR + * interceptor will in turn pass the message to a {@link MessageChannel} which will invoke all source-side request handlers. + * <li>The RR interceptor will then invoke the target-side request <code>MessageChannel</code>. + * <li>The last source-side handler, an instance of {@link org.apache.tuscany.core.wire.impl.MessageDispatcher}, will invoke the + * first source-side interceptor, which in turn will pass the message down the target-side interceptor chain. + * <li>If the target is a component instance the last target-side interceptor, an instance of + * {@link org.apache.tuscany.core.wire.impl.InvokerInterceptor} will retrieve the {@link TargetInvoker} from the message and + * call it to invoke the operation on a target instance. <tt>TargetInvoker</tt>s are help by + * the source proxy to enable optimizations such as caching of target instances. <li> The response is returned up the wire + * stack + * until it reaches the source-side <tt>RequestResponseInterceptor</tt>, which invokes the target and source-side response + * channels respectively. + * <li>The response is then passed back up the rest of the wire stack. </ol> + * </pre> + * <p/> + * The source-to-target bridge may be constructed in any of the following ways: + * <pre> + * <ul> + * <li>Source handler-to-target handler + * <li>Source handler-to-target interceptor + * <li>Source interceptor-to-target handler + * <li>Source interceptor-to-target interceptor + * </ul> + * </pre> + * <p/> + * In some scenarios, a service proxy may only contain target-side invocaton chains, for example, when a service is resolved + * through a locate operation by a non-component client. In this case, there will be no source-side wire chains and the target + * invoker will be held by the target-side and passed down the pipeline. + * + * @version $Rev$ $Date$ + * @see org.apache.tuscany.core.builder.WireBuilder + * @see WireFactory + * @see TargetInvoker + * @see org.apache.tuscany.core.wire.impl.MessageDispatcher + */ +public abstract class InvocationConfiguration { + + // the operation on the target that will utlimately be invoked + protected Method operation; + + // responsible for invoking a target instance + protected TargetInvoker targetInvoker; + + protected Interceptor interceptorChainHead; + + protected Interceptor interceptorChainTail; + + protected List<MessageHandler> requestHandlers; + + protected List<MessageHandler> responseHandlers; + + public InvocationConfiguration(Method operation) { + assert (operation != null) : "No operation type specified"; + this.operation = operation; + } + + /** + * Returns the target operation for this invocation chain + */ + public Method getMethod() { + return operation; + } + + /** + * Adds an request handler to the invocation chain + */ + public void addRequestHandler(MessageHandler handler) { + if (requestHandlers == null) { + requestHandlers = new ArrayList<MessageHandler>(); + } + requestHandlers.add(handler); + } + + /** + * Adds an response handler to the invocation chain + */ + public void addResponseHandler(MessageHandler handler) { + if (responseHandlers == null) { + responseHandlers = new ArrayList<MessageHandler>(); + } + responseHandlers.add(handler); + } + + /** + * Returns the request handler chain + */ + public List<MessageHandler> getRequestHandlers() { + return requestHandlers; + } + + /** + * Returns the response handler chain + */ + public List<MessageHandler> getResponseHandlers() { + return responseHandlers; + } + + /** + * Sets the target invoker to pass down the chain + */ + public void setTargetInvoker(TargetInvoker invoker) { + this.targetInvoker = invoker; + } + + /** + * Returns the target invoker that is passed down the chain + */ + public TargetInvoker getTargetInvoker() { + return targetInvoker; + } + + /** + * Adds an interceptor to the chain + */ + public void addInterceptor(Interceptor interceptor) { + if (interceptorChainHead == null) { + interceptorChainHead = interceptor; + } else { + interceptorChainTail.setNext(interceptor); + } + interceptorChainTail = interceptor; + } + + /** + * Returns the last interceptor in the chain + */ + public Interceptor getTailInterceptor() { + return interceptorChainTail; + } + + /** + * Returns the first interceptor in the chain + */ + public Interceptor getHeadInterceptor() { + return interceptorChainHead; + } + + /** + * Signals to the chain that its configuration is complete. Implementations may use this callback to prepare there invocation + * chains. + */ + public abstract void build(); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/InvocationRuntimeException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/InvocationRuntimeException.java new file mode 100644 index 0000000000..5e3dbaa204 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/InvocationRuntimeException.java @@ -0,0 +1,44 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +import org.osoa.sca.ServiceRuntimeException; + +/** + * Denotes a runtime exception thrown during an invocation over a wire + * + * @version $Rev$ $Date$ + */ +public class InvocationRuntimeException extends ServiceRuntimeException { + + public InvocationRuntimeException() { + super(); + } + + public InvocationRuntimeException(String message) { + super(message); + } + + public InvocationRuntimeException(String message, Throwable cause) { + super(message, cause); + } + + public InvocationRuntimeException(Throwable cause) { + super(cause); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/MessageChannel.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/MessageChannel.java new file mode 100644 index 0000000000..07a7594849 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/MessageChannel.java @@ -0,0 +1,33 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +import org.apache.tuscany.core.message.Message; + +/** + * Represents a one-way pipeline through which messages are sent during an invocation over a wire + * + * @see org.apache.tuscany.core.message.Message + */ +public interface MessageChannel { + + /** + * Sends a message + */ + void send(Message message); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/MessageHandler.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/MessageHandler.java new file mode 100644 index 0000000000..19442f3663 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/MessageHandler.java @@ -0,0 +1,34 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +import org.apache.tuscany.core.message.Message; + + +/** + * Performs a uni-directional mediation on a message + * + * @see org.apache.tuscany.core.message.Message + */ +public interface MessageHandler { + + /** + * Process a message. + */ + boolean processMessage(Message message); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/MethodHashMap.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/MethodHashMap.java new file mode 100644 index 0000000000..c0e40e0644 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/MethodHashMap.java @@ -0,0 +1,55 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +import org.apache.tuscany.core.config.JavaIntrospectionHelper; + +import java.lang.reflect.Method; +import java.util.HashMap; + +/** + * A <code>Map</code> implementation that performs a lookup on a collection of methods by method name. This implementation is used + * to map methods on one interface to compatible methods on another interface, for example, when flowing an invocation from a + * proxy injected on a source reference to a target service instance. + * + * @version $Rev$ $Date$ + */ +public class MethodHashMap<T extends InvocationConfiguration> extends HashMap<Method, T> { + + public MethodHashMap() { + super(); + } + + public MethodHashMap(int size) { + super(size); + } + + /** + * @see java.util.HashMap#get(java.lang.Object) + */ + public T get(Object key) { + if (key instanceof Method) { + Method m = (Method) key; + //FIXME find a more efficient way to find a matching method + Method closestMethod = JavaIntrospectionHelper.findClosestMatchingMethod(m.getName(), m.getParameterTypes(), super.keySet()); + return super.get(closestMethod); + } else { + throw new IllegalArgumentException("Key must be a method"); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/ProxyCreationException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/ProxyCreationException.java new file mode 100644 index 0000000000..2caa613b8f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/ProxyCreationException.java @@ -0,0 +1,43 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +/** + * Denotes an error creating a proxy representing for a wire + * + * @version $Rev: 394379 $ $Date: 2006-04-15 15:01:36 -0700 (Sat, 15 Apr 2006) $ + */ +public class ProxyCreationException extends WireException { + + public ProxyCreationException() { + super(); + } + + public ProxyCreationException(String message, Throwable cause) { + super(message, cause); + } + + public ProxyCreationException(String message) { + super(message); + } + + public ProxyCreationException(Throwable cause) { + super(cause); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/SourceInvocationConfiguration.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/SourceInvocationConfiguration.java new file mode 100644 index 0000000000..80e1450a0d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/SourceInvocationConfiguration.java @@ -0,0 +1,131 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +import org.apache.tuscany.core.wire.impl.MessageChannelImpl; +import org.apache.tuscany.core.wire.impl.MessageDispatcher; +import org.apache.tuscany.core.wire.impl.RequestResponseInterceptor; + +import java.lang.reflect.Method; + +/** + * Contains a source-side invocation pipeline for a service operation. + * + * @version $Rev: 394379 $ $Date: 2006-04-15 15:01:36 -0700 (Sat, 15 Apr 2006) $ + */ +public class SourceInvocationConfiguration extends InvocationConfiguration { + + // the pointer to the bridged target head interceptor or null if the target has no interceptors + private Interceptor targetInterceptorChainHead; + + // the pointer to bridged target request channel, or null if the target has an interceptor + private MessageChannel targetRequestChannel; + + // the pointer to bridged target response channel, or null if the target has an interceptor + private MessageChannel targetResponseChannel; + + /** + * Creates an new wire configuration for the given service reference operation + * + * @param operation the method on the interface representing specified by the reference, where the method corresponds to the + * service operation + */ + public SourceInvocationConfiguration(Method operation) { + super(operation); + } + + /** + * Sets the head interceptor of the target-side configuration for the wire. Used when the runtime bridges source and target + * chains. + * + * @param interceptor + */ + public void setTargetInterceptor(Interceptor interceptor) { + targetInterceptorChainHead = interceptor; + } + + /** + * Returns the head target-side interceptor. This will be the head interceptor of the "bridged" target configuration. + */ + public Interceptor getTargetInterceptor() { + return targetInterceptorChainHead; + } + + /** + * Sets the target-side request channel. Used when the runtime bridges source and target chains. + */ + public void setTargetRequestChannel(MessageChannel channel) { + targetRequestChannel = channel; + } + + /** + * Sets the target-side response channel. Used when the runtime bridges source and target chains. + */ + public void setTargetResponseChannel(MessageChannel channel) { + targetResponseChannel = channel; + } + + /** + * Prepares the configuration by linking interceptors and handlers + */ + @Override + public void build() { + + if (requestHandlers != null && targetInterceptorChainHead != null) { + // on target-side, connect existing handlers and interceptors + MessageHandler messageDispatcher = new MessageDispatcher(targetInterceptorChainHead); + requestHandlers.add(messageDispatcher); + } + + if (requestHandlers != null) { + MessageChannel requestChannel = new MessageChannelImpl(requestHandlers); + MessageChannel responseChannel = new MessageChannelImpl(responseHandlers); + Interceptor channelInterceptor = new RequestResponseInterceptor(requestChannel, targetRequestChannel, + responseChannel, targetResponseChannel); + + if (interceptorChainHead != null) { + interceptorChainTail.setNext(channelInterceptor); + } else { + interceptorChainHead = channelInterceptor; + } + + } else { + // no request handlers + if (interceptorChainHead != null) { + if (targetInterceptorChainHead != null) { + // Connect source interceptor chain directly to target interceptor chain + interceptorChainTail.setNext(targetInterceptorChainHead); + // interceptorChainTail = targetInterceptorChainHead; + } else { + // Connect source interceptor chain to the target request channel + Interceptor channelInterceptor = new RequestResponseInterceptor(null, targetRequestChannel, null, + targetResponseChannel); + interceptorChainTail.setNext(channelInterceptor); + } + } else { + // no source interceptor chain or source handlers, conntect to target interceptor chain or channel + if (targetInterceptorChainHead != null) { + interceptorChainHead = targetInterceptorChainHead; + interceptorChainTail = targetInterceptorChainHead; + } else { + Interceptor channelInterceptor = new RequestResponseInterceptor(null, targetRequestChannel, null, + targetResponseChannel); + interceptorChainHead = channelInterceptor; + interceptorChainTail = channelInterceptor; + } + } + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/SourceWireFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/SourceWireFactory.java new file mode 100644 index 0000000000..c460c71bd5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/SourceWireFactory.java @@ -0,0 +1,34 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +/** + * Implementations are responsible for managing the source side of a wire. + * + * @version $$Rev$$ $$Date$$ + */ +public interface SourceWireFactory<T> extends WireFactory<T>{ + + /** + * Returns the configuration information used to create the source-side of a wire, including invocation chains + */ + public WireSourceConfiguration getConfiguration(); + + /** + * Sets the configuration information used to create the source-side of a wire, including invocation chains + */ + public void setConfiguration(WireSourceConfiguration config); + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/TargetInvocationConfiguration.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/TargetInvocationConfiguration.java new file mode 100644 index 0000000000..fc7810763d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/TargetInvocationConfiguration.java @@ -0,0 +1,49 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +import org.apache.tuscany.core.wire.impl.MessageDispatcher; + +import java.lang.reflect.Method; + +/** + * Contains a target-side invocation pipeline for a service operation. + * + * @version $Rev: 394379 $ $Date: 2006-04-15 15:01:36 -0700 (Sat, 15 Apr 2006) $ + */ +public class TargetInvocationConfiguration extends InvocationConfiguration { + + /** + * Creates an new target-side pipeline for the given operation + * + * @param operation the method on the interface representing target service, where the method corresponds to the service + * operation + */ + public TargetInvocationConfiguration(Method operation) { + super(operation); + } + + /** + * Prepares the configuration by linking interceptors and handlers + */ + @Override + public void build() { + if (requestHandlers != null && interceptorChainHead != null) { + // on target-side, connect existing handlers and interceptors + MessageHandler messageDispatcher = new MessageDispatcher(interceptorChainHead); + requestHandlers.add(messageDispatcher); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/TargetInvoker.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/TargetInvoker.java new file mode 100644 index 0000000000..387da1bca3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/TargetInvoker.java @@ -0,0 +1,47 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +import java.lang.reflect.InvocationTargetException; + +/** + * Implementations are responsible for resolving a target and performing the actual invocation on it, for example, a + * service component implementation instance or an external service client. + * + * @version $Rev$ $Date$ + */ +public interface TargetInvoker extends Interceptor, Cloneable{ + + /** + * Responsible for invoking an operation on a target with the given payload + * + * @param payload the parameters of the target operation or null + * @throws InvocationTargetException if the target operation itself throws an exception. The root cause will be set + * to that exception + */ + public Object invokeTarget(Object payload) throws InvocationTargetException; + + /** + * Determines whether the proxy can be cached on the client/source side + */ + public boolean isCacheable(); + + /** + * Implementations must support deep cloning + */ + public Object clone() throws CloneNotSupportedException; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/TargetWireFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/TargetWireFactory.java new file mode 100644 index 0000000000..f46754b975 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/TargetWireFactory.java @@ -0,0 +1,33 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +/** + * Implementations are responsible for managing the target side of a wire + * + * @version $$Rev$$ $$Date$$ + */ +public interface TargetWireFactory<T> extends WireFactory<T> { + + /** + * Returns the configuration information used to create the target-side of a wire, including invocation chains + */ + public WireTargetConfiguration getConfiguration(); + + /** + * Sets the configuration information used to create the target-side of a wire, including invocation chains + */ + public void setConfiguration(WireTargetConfiguration config); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireConfiguration.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireConfiguration.java new file mode 100644 index 0000000000..78ab6ee3c7 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireConfiguration.java @@ -0,0 +1,92 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.message.MessageFactory; + +import java.lang.reflect.Method; +import java.util.Map; + +/** + * Contains configuration for a wire, including its invocation chains. Invocation chains are accessed from the collection of + * {@link InvocationConfiguration}s keyed by operation on the service specified by the source reference or target service. + * <code>WireConfiguration</code> subtypes distinguish between source and target sides of a wire and hence return corresponding + * <code>InvocationChain</code> subtypes. Operations are represented using JDK reflection, i.e. as a <code>Method</code> + * corresponding to the Java interface representing the service. + * <p/> + * Wire configurations are created from an assembly model by the runtime during the buildSource phase. + * + * @version $Rev$ $Date$ + */ +public abstract class WireConfiguration<T extends InvocationConfiguration> { + + protected Map<Method, T> configurations; + + protected ClassLoader proxyClassLoader; + + protected MessageFactory messageFactory; + + protected QualifiedName targetName; + + /** + * Creates the configuration + * + * @param targetName the qualified name of the target service specified by the wire + * @param proxyClassLoader the classloader to use when creating a proxy + * @param messageFactory the factory used to create wire messages + */ + public WireConfiguration(QualifiedName targetName, ClassLoader proxyClassLoader, MessageFactory messageFactory) { + this.targetName = targetName; + this.messageFactory = messageFactory; + if (proxyClassLoader == null) { + this.proxyClassLoader = Thread.currentThread().getContextClassLoader(); + } else { + this.proxyClassLoader = proxyClassLoader; + } + } + + /** + * Returns the qualified name of the target service specified by the wire + */ + public QualifiedName getTargetName() { + return targetName; + } + + /** + * Returns the classloader used for creating proxies + */ + public ClassLoader getProxyClassLoader() { + return proxyClassLoader; + } + + /** + * Returns the factory used to create invocation messages + */ + public MessageFactory getMessageFactory() { + return messageFactory; + } + + /** + * Returns the invocation configuration for each operation on a service specified by a reference or a target service. + */ + public Map<Method, T> getInvocationConfigurations() { + return configurations; + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireException.java new file mode 100644 index 0000000000..0bada0bbfc --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireException.java @@ -0,0 +1,43 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +import org.apache.tuscany.common.TuscanyException; + +/** + * Denotes a top-level exception dealing with a wire + */ +public abstract class WireException extends TuscanyException { + + public WireException() { + super(); + } + + public WireException(String message) { + super(message); + } + + public WireException(String message, Throwable cause) { + super(message, cause); + } + + public WireException(Throwable cause) { + super(cause); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireFactory.java new file mode 100644 index 0000000000..55cab31adf --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireFactory.java @@ -0,0 +1,76 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +/** + * Implementations are responsible for managing source or target sides of a wire, including creation of service proxies. + * Source-side wires are injected on references and may contain policy interceptors and/or handlers specified by them. Target-side + * wires may contain policy interceptors and/or handlers specified by the service the wire is targeted to or one of its + * operations. Source- and target-side <code>WireFactory</code>s are held in the {@link org.apache.tuscany.core.builder.ContextFactory} + * associated with the source reference or target service. + * <p/> + * When an assembly is built by the runtime, source-side and target-side wires are "bridged" on the source side (i.e. a reference + * to the target-side is stored in the source-side). This bridging process is done by a series of {@link + * org.apache.tuscany.core.builder.WireBuilder}s configured in the runtime. When a new component implementation instance is + * created, it will be injected with a proxy for each reference containing the bridged source- and target-side wires. + * <p/> + * Unmanaged code, i.e. clients that are not components, that perform a locate operation are handled differently. In this case, a + * target-side proxy will be returned by the locate operation created by the <code>WireFactory</code> associated with the target + * service. This target-side proxy will only contain the target-side wire and its handlers/interceptors.Ê + * <p/> + * Wires are structured by operation; that is, they contain an invocation chain per operation on a service. Note that the service + * specified by a reference may differ in type from the target service specified by the wire. In this case, a mediation may be + * performed by the runtime. Hence, source-to-target bridging is done on a per operation basis. Source- and target-side Invocation + * chains are accessible through the subtypes of <code>WireFactory</code>. + * + * @version $Rev$ $Date$ + */ +public interface WireFactory<T> { + + /** + * Prepares the factory. This will typically be called at buildSource time, after bridging source- and target-side invocation chains. + * + * @throws WireFactoryInitException if an error is encountered during initialization + */ + public void initialize() throws WireFactoryInitException; + + /** + * Returns a proxy for a service specified by a reference or target + */ + public T createProxy() throws ProxyCreationException; + + /** + * Sets the primary interface type generated proxies implement + */ + public void setBusinessInterface(Class interfaze); + + /** + * Returns the primary interface type implemented by generated proxies + */ + public Class getBusinessInterface(); + + /** + * Adds an interface type generated proxies implement + */ + public void addInterface(Class claz); + + /** + * Returns an array of all interfaces implemented by generated proxies + */ + public Class[] getImplementatedInterfaces(); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireFactoryFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireFactoryFactory.java new file mode 100644 index 0000000000..f055ecd427 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireFactoryFactory.java @@ -0,0 +1,47 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +import java.lang.reflect.InvocationHandler; + +/** + * Implementations provide a runtime system service that creates {@link WireFactory}s + * + * @version $Rev$ $Date$ + */ +public interface WireFactoryFactory { + + /** + * Creates a target-side wire factory + */ + public TargetWireFactory createTargetWireFactory(); + + /** + * Creates a source-side wire factory + */ + public SourceWireFactory createSourceWireFactory(); + + /** + * Determines whether the given object is a proxy + */ + public boolean isProxy(Object object); + + /** + * Returns an wire handler fronting the wire chains used by the proxy. Note that should SCA define a + * DII, this could return such an interface. + * + * @throws IllegalArgumentException if the class is not a proxy + */ + public InvocationHandler getHandler(Object proxy) throws IllegalArgumentException; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireFactoryInitException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireFactoryInitException.java new file mode 100644 index 0000000000..caf535ee00 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireFactoryInitException.java @@ -0,0 +1,43 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +/** + * Denotes an error initializing a wire factory + * + * @version $Rev$ $Date$ + */ +public class WireFactoryInitException extends WireException { + + public WireFactoryInitException() { + super(); + } + + public WireFactoryInitException(String message) { + super(message); + } + + public WireFactoryInitException(String message, Throwable cause) { + super(message, cause); + } + + public WireFactoryInitException(Throwable cause) { + super(cause); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireSourceConfiguration.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireSourceConfiguration.java new file mode 100644 index 0000000000..d9408b2fb0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireSourceConfiguration.java @@ -0,0 +1,68 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.message.MessageFactory; + +import java.lang.reflect.Method; +import java.util.Map; + +/** + * Contains configuration for the source side of a wire + * + * @version $Rev: 394379 $ $Date: 2006-04-15 15:01:36 -0700 (Sat, 15 Apr 2006) $ + */ +public class WireSourceConfiguration extends WireConfiguration<SourceInvocationConfiguration> { + + private String referenceName; + + /** + * Creates the source side of a wire + * + * @param referenceName the name of the reference the wire is associated with + * @param targetName the qualified name of the target service specified by the wire + * @param invocationConfigs a collection of service operation-to-invocation chain mappings + * @param proxyClassLoader the classloader to use when creating a proxy + * @param messageFactory the factory used to create wire messages + */ + public WireSourceConfiguration(String referenceName, QualifiedName targetName, + Map<Method, SourceInvocationConfiguration> invocationConfigs, ClassLoader proxyClassLoader, MessageFactory messageFactory) { + super(targetName, proxyClassLoader, messageFactory); + this.referenceName = referenceName; + this.configurations = invocationConfigs; + } + + /** + * Creates the source side of a wire where the reference is "anonymous", i.e. on an entry point + * + * @param targetName the qualified name of the target service specified by the wire + * @param invocationConfigs a collection of service operation-to-invocation chain mappings + * @param proxyClassLoader the classloader to use when creating a proxy + * @param messageFactory the factory used to create wire messages + */ + public WireSourceConfiguration(QualifiedName targetName, + Map<Method, SourceInvocationConfiguration> invocationConfigs, ClassLoader proxyClassLoader, MessageFactory messageFactory) { + this(null, targetName, invocationConfigs, proxyClassLoader, messageFactory); + } + + + /** + * Returns the name of the source reference + */ + public String getReferenceName() { + return referenceName; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireTargetConfiguration.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireTargetConfiguration.java new file mode 100644 index 0000000000..ce6ebade0c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/WireTargetConfiguration.java @@ -0,0 +1,48 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.wire; + +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.context.QualifiedName; + +import java.lang.reflect.Method; +import java.util.Map; + +/** + * Contains configuration for the target side of a wire + * + * @version $$Rev$$ $$Date$$ + */ +public class WireTargetConfiguration extends WireConfiguration<TargetInvocationConfiguration> { + + /** + * Creates the source side of a wire + * + * @param targetName the qualified name of the target service specified by the wire + * @param invocationConfigs a collection of target service operation-to-invocation chain mappings + * @param proxyClassLoader the classloader to use when creating a proxy + * @param messageFactory the factory used to create wire messages + */ + public WireTargetConfiguration(QualifiedName targetName, Map<Method, TargetInvocationConfiguration> invocationConfigs, + ClassLoader proxyClassLoader, MessageFactory messageFactory) { + super(targetName, proxyClassLoader, messageFactory); + assert (invocationConfigs != null) : "No wire configuration map specified"; + configurations = invocationConfigs; + + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/InvokerInterceptor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/InvokerInterceptor.java new file mode 100644 index 0000000000..9c114c013e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/InvokerInterceptor.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.impl; + +import org.apache.tuscany.core.wire.Interceptor; +import org.apache.tuscany.core.wire.InvocationRuntimeException; +import org.apache.tuscany.core.wire.TargetInvoker; +import org.apache.tuscany.core.message.Message; + +/** + * Serves as a tail interceptor on a target wire chain. This implementation dispatches to the target invoker + * passed inside the wire message. Target invokers are passed from the source in order to allow for caching of + * target instances. + * + * @see org.apache.tuscany.core.wire.TargetInvoker + * @version $Rev$ $Date$ + */ +public class InvokerInterceptor implements Interceptor { + + public InvokerInterceptor() { + } + + public Message invoke(Message msg) throws InvocationRuntimeException { + TargetInvoker invoker = msg.getTargetInvoker(); + if (invoker == null) { + throw new InvocationRuntimeException("No target invoker specified on message"); + } + return invoker.invoke(msg); + } + + public void setNext(Interceptor next) { + throw new IllegalStateException("This interceptor must be the last one in an target interceptor chain"); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/MessageChannelImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/MessageChannelImpl.java new file mode 100644 index 0000000000..8b9d484313 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/MessageChannelImpl.java @@ -0,0 +1,68 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.impl; + +import org.apache.tuscany.core.wire.MessageChannel; +import org.apache.tuscany.core.wire.MessageHandler; +import org.apache.tuscany.core.message.Message; + +import java.util.List; + +/** + * A channel comprising an ordered collection of message handlers. + * + *@see org.apache.tuscany.core.message.Message + * @version $Rev$ $Date$ + */ +public class MessageChannelImpl implements MessageChannel { + + private final List<MessageHandler> pipeline; + + //---------------------------------- + // Constructors + //---------------------------------- + + /** + * Construct a new channel comprising the supplied list of handlers. + * + * @param pipeline the Handlers in the channel + */ + public MessageChannelImpl(List<MessageHandler> pipeline) { + this.pipeline = pipeline; + } + + //---------------------------------- + // Methods + //---------------------------------- + + /** + * Send a message down the channel. The message will be processed by all handlers + * in order until one returns false to indicate processing is complete or all + * handlers have been called. + * + * @param msg a Message to send down the channel + */ + public void send(Message msg) { + if (pipeline!=null) { + for (MessageHandler handler : pipeline) { + if (!handler.processMessage(msg)) { + break; + } + } + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/MessageDispatcher.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/MessageDispatcher.java new file mode 100644 index 0000000000..ada01b7f91 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/MessageDispatcher.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.impl; + +import org.apache.tuscany.core.wire.Interceptor; +import org.apache.tuscany.core.wire.MessageHandler; +import org.apache.tuscany.core.message.Message; + +/** + * A message handler that dispatches the message through an interceptor stack and the uses the response channel to + * return the wire result. + * + * @version $Rev$ $Date$ + */ +public class MessageDispatcher implements MessageHandler { + private final Interceptor head; + + /** + * Construct a handler that dispatches messages to an Interceptor stack. + * + * @param head the interceptor at the head of the stack + */ + public MessageDispatcher(Interceptor head) { + this.head = head; + } + + public boolean processMessage(Message msg) { + Message resp = head.invoke(msg); + msg.getCallbackChannel().send(resp); + return false; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/NullWireFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/NullWireFactory.java new file mode 100644 index 0000000000..e46ed26184 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/NullWireFactory.java @@ -0,0 +1,71 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.wire.impl; + +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.wire.WireConfiguration; +import org.apache.tuscany.core.wire.ProxyCreationException; +import org.apache.tuscany.core.wire.WireFactory; +import org.apache.tuscany.core.wire.WireFactoryInitException; + +/** + * Returns an actual implementation instance as opposed to a proxy. Used in cases where proxying may be optimized away. + * + * @version $Rev: 379957 $ $Date: 2006-02-22 14:58:24 -0800 (Wed, 22 Feb 2006) $ + */ +public class NullWireFactory implements WireFactory { + + private CompositeContext parentContext; + + private String targetName; + + private Class businessInterface; + + public NullWireFactory(String componentName, CompositeContext parentContext) { + assert (parentContext != null) : "Parent context was null"; + this.targetName = componentName; + this.parentContext = parentContext; + } + + public void initialize(Class businessInterface, WireConfiguration config) throws WireFactoryInitException { + this.businessInterface = businessInterface; + } + + public Object createProxy() throws ProxyCreationException { + return parentContext.getContext(targetName); + } + + public void initialize() throws WireFactoryInitException { + } + + public void setBusinessInterface(Class interfaze) { + businessInterface = interfaze; + } + + public Class getBusinessInterface() { + return businessInterface; + } + + public void addInterface(Class claz) { + throw new UnsupportedOperationException(); + } + + public Class[] getImplementatedInterfaces() { + throw new UnsupportedOperationException(); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/OneWayInterceptor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/OneWayInterceptor.java new file mode 100644 index 0000000000..4e3bb460aa --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/OneWayInterceptor.java @@ -0,0 +1,48 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.impl; + +import org.apache.tuscany.core.wire.Interceptor; +import org.apache.tuscany.core.wire.MessageChannel; +import org.apache.tuscany.core.message.Message; + +/** + * An interceptor that sends the wire Message down its request channel and does not expect a response. + * + * @version $Rev$ $Date$ + */ +public class OneWayInterceptor implements Interceptor { + private MessageChannel requestChannel; + + /** + * Construct an interceptor that sends messages down the supplied channel. + * + * @param requestChannel the channel to send messages down + */ + public OneWayInterceptor(MessageChannel requestChannel) { + this.requestChannel = requestChannel; + } + + public Message invoke(Message message) { + requestChannel.send(message); + return null; + } + + public void setNext(Interceptor next) { + throw new IllegalStateException("This interceptor must be the last one in an interceptor chain"); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/RequestResponseInterceptor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/RequestResponseInterceptor.java new file mode 100644 index 0000000000..ae1c69fc12 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/RequestResponseInterceptor.java @@ -0,0 +1,73 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.impl; + +import org.apache.tuscany.core.wire.Interceptor; +import org.apache.tuscany.core.wire.MessageChannel; +import org.apache.tuscany.core.message.Message; + +/** + * An interceptor that first sends a message down its request channel then extracts the response from the + * message and sends it down the response channel before returning it up the interceptor stack. + * + * @version $Rev$ $Date$ + */ +public class RequestResponseInterceptor implements Interceptor { + + private MessageChannel sourceRequestChannel; + + private MessageChannel sourceResponseChannel; + + private MessageChannel targetRequestChannel; + + private MessageChannel targetResponseChannel; + + /** + * Construct an interceptor that sends messages down the supplied channels. + * + * @param targetRequestChannel the channel to send request messages down + * @param targetResponseChannel the channel to sent response messages down + */ + public RequestResponseInterceptor(MessageChannel sourceRequestChannel, MessageChannel targetRequestChannel, + MessageChannel sourceResponseChannel, MessageChannel targetResponseChannel) { + this.sourceRequestChannel = sourceRequestChannel; + this.sourceResponseChannel = sourceResponseChannel; + this.targetRequestChannel = targetRequestChannel; + this.targetResponseChannel = targetResponseChannel; + } + + public Message invoke(Message requestMessage) { + if (sourceRequestChannel != null) { + sourceRequestChannel.send(requestMessage); + } + if (targetRequestChannel != null) { + targetRequestChannel.send(requestMessage); + } + Message responseMessage = requestMessage.getRelatedCallbackMessage(); + if (targetResponseChannel != null) { + targetResponseChannel.send(responseMessage); + } + if (sourceResponseChannel != null) { + sourceResponseChannel.send(responseMessage); + } + return responseMessage; + } + + public void setNext(Interceptor next) { + throw new IllegalStateException("This interceptor must be the last one in an interceptor chain"); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKInvocationHandler.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKInvocationHandler.java new file mode 100644 index 0000000000..2cef096a5e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKInvocationHandler.java @@ -0,0 +1,137 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.jdk; + +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.wire.Interceptor; +import org.apache.tuscany.core.wire.InvocationConfiguration; +import org.apache.tuscany.core.wire.TargetInvoker; +import org.apache.tuscany.core.message.Message; +import org.apache.tuscany.core.message.MessageFactory; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +/** + * Receives a request from a JDK proxy and dispatches it to a target invoker or source interceptor stack + * + * @version $Rev$ $Date$ + */ +public class JDKInvocationHandler implements InvocationHandler { + + private MessageFactory messageFactory; + + /* + * an association of an operation to configuration holder. The holder contains the master wire configuration + * and a locale clone of the master TargetInvoker. TargetInvokers will be cloned by the handler and placed in the + * holder if they are cacheable. This allows optimizations such as avoiding target resolution when a source refers + * to a target of greater scope since the target reference can be maintained by the invoker. When a target invoker + * is not cacheable, the master associated with the wire configuration will be used. + */ + private Map<Method, ConfigHolder> configuration; + + public JDKInvocationHandler(MessageFactory messageFactory, Map<Method, ? extends InvocationConfiguration> configuration) { + assert (messageFactory != null) : "Message factory was null"; + assert (configuration != null) : "Configuration not specified"; + this.configuration = new HashMap<Method, ConfigHolder>(configuration.size()); + for (Map.Entry<Method, ? extends InvocationConfiguration> entry : configuration.entrySet()) { + this.configuration.put(entry.getKey(), new ConfigHolder(entry.getValue())); + } + this.messageFactory = messageFactory; + } + + /** + * Dispatches a client request made on a proxy + */ + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + Interceptor headInterceptor = null; + ConfigHolder holder = configuration.get(method); + if (holder == null) { + TargetException e = new TargetException("Operation not configured"); + e.setIdentifier(method.getName()); + throw e; + } + InvocationConfiguration config = holder.config; + if (config != null) { + headInterceptor = config.getHeadInterceptor(); + } + + TargetInvoker invoker; + + if (holder.cachedInvoker == null) { + assert config != null; + if(config.getTargetInvoker() == null){ + TargetException e= new TargetException("No target invoker configured for operation"); + e.setIdentifier(config.getMethod().getName()); + throw e; + } + if (config.getTargetInvoker().isCacheable()) { + // clone and store the invoker locally + holder.cachedInvoker = (TargetInvoker) config.getTargetInvoker().clone(); + invoker = holder.cachedInvoker; + } else { + invoker = config.getTargetInvoker(); + } + } else { + assert config != null; + invoker = config.getTargetInvoker(); + } + if (headInterceptor == null) { + try { + // short-circuit the dispatch and invoke the target directly + if (config.getTargetInvoker() == null) { + throw new AssertionError("No target invoker [" + method.getName() + "]"); + } + return config.getTargetInvoker().invokeTarget(args); + } catch (InvocationTargetException e) { + // the cause was thrown by the target so throw it + throw e.getCause(); + } + } else { + Message msg = messageFactory.createMessage(); + msg.setTargetInvoker(invoker); + msg.setBody(args); + // dispatch the wire down the chain and get the response + Message resp = headInterceptor.invoke(msg); + + Object body = resp.getBody(); + if (body instanceof Throwable) { + throw (Throwable) body; + } + return body; + } + } + + /** + * A holder used to associate an wire configuration with a local copy of a target invoker that was previously + * cloned from the configuration master + */ + private class ConfigHolder { + + public ConfigHolder(InvocationConfiguration config) { + this.config = config; + } + + InvocationConfiguration config; + + TargetInvoker cachedInvoker; + } + +}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKSourceWireFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKSourceWireFactory.java new file mode 100644 index 0000000000..dbaab87fce --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKSourceWireFactory.java @@ -0,0 +1,92 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.jdk; + +import org.apache.tuscany.core.wire.MethodHashMap; +import org.apache.tuscany.core.wire.WireFactoryInitException; +import org.apache.tuscany.core.wire.SourceInvocationConfiguration; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.WireSourceConfiguration; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Map; + +/** + * Creates proxies that are injected on references using JDK dynamic proxy facilities and front a wire. The proxies implement the + * business interface associated with the service required by reference. + * + * @version $Rev: 394431 $ $Date: 2006-04-15 21:27:44 -0700 (Sat, 15 Apr 2006) $ + */ +public class JDKSourceWireFactory implements SourceWireFactory { + + private static final int UNINITIALIZED = 0; + + private static final int INITIALIZED = 1; + + private int state = UNINITIALIZED; + + private Class[] businessInterfaceArray; + + private Map<Method, SourceInvocationConfiguration> methodToInvocationConfig; + + private WireSourceConfiguration configuration; + + public void initialize() throws WireFactoryInitException { + if (state != UNINITIALIZED) { + throw new IllegalStateException("Proxy factory in wrong state [" + state + "]"); + } + Map<Method, SourceInvocationConfiguration> invocationConfigs = configuration.getInvocationConfigurations(); + methodToInvocationConfig = new MethodHashMap<SourceInvocationConfiguration>(invocationConfigs.size()); + for (Map.Entry<Method, SourceInvocationConfiguration> entry : invocationConfigs.entrySet()) { + Method method = entry.getKey(); + methodToInvocationConfig.put(method, entry.getValue()); + } + state = INITIALIZED; + } + + public Object createProxy() { + if (state != INITIALIZED) { + throw new IllegalStateException("Proxy factory not INITIALIZED [" + state + "]"); + } + InvocationHandler handler = new JDKInvocationHandler(configuration.getMessageFactory(), methodToInvocationConfig); + return Proxy.newProxyInstance(configuration.getProxyClassLoader(), businessInterfaceArray, handler); + } + + public WireSourceConfiguration getConfiguration() { + return configuration; + } + + public void setConfiguration(WireSourceConfiguration config) { + configuration = config; + } + + public void setBusinessInterface(Class interfaze) { + businessInterfaceArray = new Class[]{interfaze}; + } + + public Class getBusinessInterface() { + return businessInterfaceArray[0]; + } + + public void addInterface(Class claz) { + throw new UnsupportedOperationException("Additional proxy interfaces not yet supported"); + } + + public Class[] getImplementatedInterfaces() { + return businessInterfaceArray; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKTargetWireFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKTargetWireFactory.java new file mode 100644 index 0000000000..76f3b0389c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKTargetWireFactory.java @@ -0,0 +1,95 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.wire.jdk; + +import org.apache.tuscany.core.wire.MethodHashMap; +import org.apache.tuscany.core.wire.WireFactoryInitException; +import org.apache.tuscany.core.wire.TargetInvocationConfiguration; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.WireTargetConfiguration; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Map; + +/** + * Creates proxies that are returned to non-SCA clients using JDK dynamic proxy facilities and front a wire. The proxies implement + * the business interface associated with the target service of the wire and are typically returned by a locate operation. + * + * @version $Rev: 394431 $ $Date: 2006-04-15 21:27:44 -0700 (Sat, 15 Apr 2006) $ + */ +public class JDKTargetWireFactory implements TargetWireFactory { + + private static final int UNINITIALIZED = 0; + + private static final int INITIALIZED = 1; + + private int state = UNINITIALIZED; + + private Class[] businessInterfaceArray; + + private Map<Method, TargetInvocationConfiguration> methodToInvocationConfig; + + private WireTargetConfiguration configuration; + + public void initialize() throws WireFactoryInitException { + if (state != UNINITIALIZED) { + throw new IllegalStateException("Proxy factory in wrong state [" + state + "]"); + } + Map<Method, TargetInvocationConfiguration> invocationConfigs = configuration.getInvocationConfigurations(); + methodToInvocationConfig = new MethodHashMap<TargetInvocationConfiguration>(invocationConfigs.size()); + for (Map.Entry<Method, TargetInvocationConfiguration> entry : invocationConfigs.entrySet()) { + Method method = entry.getKey(); + methodToInvocationConfig.put(method, entry.getValue()); + } + state = INITIALIZED; + } + + public Object createProxy() { + if (state != INITIALIZED) { + throw new IllegalStateException("Proxy factory not INITIALIZED [" + state + "]"); + } + InvocationHandler handler = new JDKInvocationHandler(configuration.getMessageFactory(), methodToInvocationConfig); + return Proxy.newProxyInstance(configuration.getProxyClassLoader(), businessInterfaceArray, handler); + } + + public WireTargetConfiguration getConfiguration() { + return configuration; + } + + public void setConfiguration(WireTargetConfiguration config) { + configuration = config; + } + + public void setBusinessInterface(Class interfaze) { + businessInterfaceArray = new Class[]{interfaze}; + } + + public Class getBusinessInterface() { + return businessInterfaceArray[0]; + } + + public void addInterface(Class claz) { + throw new UnsupportedOperationException("Additional proxy interfaces not yet supported"); + } + + public Class[] getImplementatedInterfaces() { + return businessInterfaceArray; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKWireFactoryFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKWireFactoryFactory.java new file mode 100644 index 0000000000..3eaffb9ba8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKWireFactoryFactory.java @@ -0,0 +1,66 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.jdk; + +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.WireFactoryFactory; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Scope; +import org.osoa.sca.annotations.Service; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; + +/** + * A system service that creates JDK dynamic proxy-based {@link org.apache.tuscany.core.wire.WireFactory}s + * + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +@Service(interfaces = {WireFactoryFactory.class}) +public class JDKWireFactoryFactory implements WireFactoryFactory { + + public JDKWireFactoryFactory() { + } + + @Init(eager = true) + public void init() { + } + + public TargetWireFactory createTargetWireFactory() { + return new JDKTargetWireFactory(); + } + + public SourceWireFactory createSourceWireFactory() { + return new JDKSourceWireFactory(); + } + + public boolean isProxy(Object object) { + if (object == null) { + return false; + } else { + return Proxy.isProxyClass(object.getClass()); + } + } + + public InvocationHandler getHandler(Object proxy) { + if (proxy == null) { + return null; + } else { + return Proxy.getInvocationHandler(proxy); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/service/DefaultWireFactoryService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/service/DefaultWireFactoryService.java new file mode 100644 index 0000000000..3c61081caf --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/service/DefaultWireFactoryService.java @@ -0,0 +1,157 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.service; + +import org.apache.tuscany.core.config.JavaIntrospectionHelper; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.wire.MethodHashMap; +import org.apache.tuscany.core.wire.WireFactoryFactory; +import org.apache.tuscany.core.wire.SourceInvocationConfiguration; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetInvocationConfiguration; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.WireSourceConfiguration; +import org.apache.tuscany.core.wire.WireTargetConfiguration; +import org.apache.tuscany.core.wire.impl.InvokerInterceptor; +import org.apache.tuscany.core.builder.system.PolicyBuilderRegistry; +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Scope; +import org.osoa.sca.annotations.Service; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.List; +import java.util.ArrayList; + +/** + * The default implementation of a <code>WireFactoryFactory</code> + * + * @version $$Rev$$ $$Date$$ + */ +@Scope("MODULE") +@Service(interfaces = {org.apache.tuscany.core.wire.service.WireFactoryService.class}) +public class DefaultWireFactoryService implements org.apache.tuscany.core.wire.service.WireFactoryService { + + private MessageFactory messageFactory; + private WireFactoryFactory wireFactoryFactory; + private PolicyBuilderRegistry policyRegistry; + + + public DefaultWireFactoryService() { + + } + + public DefaultWireFactoryService(MessageFactory messageFactory, WireFactoryFactory wireFactoryFactory, PolicyBuilderRegistry registry) { + this.messageFactory = messageFactory; + this.wireFactoryFactory = wireFactoryFactory; + this.policyRegistry = registry; + } + + @Autowire + public void setMessageFactory(MessageFactory messageFactory) { + this.messageFactory = messageFactory; + } + + @Autowire + public void setWireFactoryService(WireFactoryFactory wireFactoryFactory) { + this.wireFactoryFactory = wireFactoryFactory; + } + + @Autowire + public void setPolicyRegistry(PolicyBuilderRegistry policyRegistry) { + this.policyRegistry = policyRegistry; + } + + @Init(eager = true) + public void init() { + } + + public List<SourceWireFactory> createSourceFactory(ConfiguredReference configuredReference) throws BuilderConfigException{ + String referenceName = configuredReference.getPort().getName(); + Class interfaze; + // FIXME hack for NPE when entry points with no set service contract on their configuredReference + if (configuredReference.getPort().getServiceContract() != null){ + interfaze = configuredReference.getPort().getServiceContract().getInterface(); + }else if(configuredReference.getPart() instanceof EntryPoint){ + interfaze = ((EntryPoint)configuredReference.getPart()).getConfiguredService().getPort().getServiceContract().getInterface(); + }else{ + BuilderConfigException bce = new BuilderConfigException("No interface found on configured reference"); + bce.setIdentifier(configuredReference.getName()); + throw bce; + } + List<SourceWireFactory> wireFactories = new ArrayList<SourceWireFactory>(); + List<WireSourceConfiguration> wireConfigurations = new ArrayList<WireSourceConfiguration>(); + for (ConfiguredService configuredService : configuredReference.getTargetConfiguredServices()) { + String targetCompName = configuredService.getPart().getName(); + String targetSerivceName = configuredService.getPort().getName(); + QualifiedName targetName = new QualifiedName(targetCompName + QualifiedName.NAME_SEPARATOR + targetSerivceName); + SourceWireFactory wireFactory = wireFactoryFactory.createSourceWireFactory(); + Map<Method, SourceInvocationConfiguration> iConfigMap = new HashMap<Method, SourceInvocationConfiguration>(); + Set<Method> javaMethods = JavaIntrospectionHelper.getAllUniqueMethods(interfaze); + for (Method method : javaMethods) { + SourceInvocationConfiguration iConfig = new SourceInvocationConfiguration(method); + iConfigMap.put(method, iConfig); + } + WireSourceConfiguration wireConfiguration = new WireSourceConfiguration(referenceName, targetName, iConfigMap, interfaze.getClassLoader(), + messageFactory); + wireConfigurations.add(wireConfiguration); + wireFactory.setBusinessInterface(interfaze); + wireFactory.setConfiguration(wireConfiguration); + wireFactories.add(wireFactory); + } + if (policyRegistry != null) { + // invoke policy builders + policyRegistry.buildSource(configuredReference, wireConfigurations); + } + return wireFactories; + + } + + public TargetWireFactory createTargetFactory(ConfiguredService configuredService) { + org.apache.tuscany.model.assembly.Service service = configuredService.getPort(); + Class interfaze = service.getServiceContract().getInterface(); + QualifiedName targetName = new QualifiedName(configuredService.getPart().getName() + QualifiedName.NAME_SEPARATOR + + service.getName()); + + Map<Method, TargetInvocationConfiguration> iConfigMap = new MethodHashMap<TargetInvocationConfiguration>(); + TargetWireFactory wireFactory = wireFactoryFactory.createTargetWireFactory(); + Set<Method> javaMethods = JavaIntrospectionHelper.getAllUniqueMethods(interfaze); + for (Method method : javaMethods) { + TargetInvocationConfiguration iConfig = new TargetInvocationConfiguration(method); + iConfigMap.put(method, iConfig); + } + WireTargetConfiguration wireConfiguration = new WireTargetConfiguration(targetName, iConfigMap, interfaze.getClassLoader(), messageFactory); + wireFactory.setBusinessInterface(interfaze); + wireFactory.setConfiguration(wireConfiguration); + if (policyRegistry != null) { + // invoke policy builders + policyRegistry.buildTarget(configuredService, wireConfiguration); + } + // add tail interceptor + for (TargetInvocationConfiguration iConfig : wireFactory.getConfiguration().getInvocationConfigurations().values()) { + iConfig.addInterceptor(new InvokerInterceptor()); + } + return wireFactory; + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/service/WireFactoryService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/service/WireFactoryService.java new file mode 100644 index 0000000000..eb41baf69a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/java/org/apache/tuscany/core/wire/service/WireFactoryService.java @@ -0,0 +1,51 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.service; + +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; + +import java.util.List; + +/** + * Implementations provide a system service that creates {@link org.apache.tuscany.core.wire.SourceWireFactory}s + * and {@link org.apache.tuscany.core.wire.TargetWireFactory}s. This service is used by {@link + * org.apache.tuscany.core.builder.ContextFactoryBuilder}s to provide {@link org.apache.tuscany.core.builder.ContextFactory}s with + * {@link org.apache.tuscany.core.wire.WireFactory}s for their references and target services. This service is typically autowired + * to. + * + * @version $$Rev$$ $$Date$$ + */ +public interface WireFactoryService { + + /** + * Creates the source-side wire factory for a reference + * + * @param configuredReference the configured reference to create the wire factory for + * @throws BuilderConfigException + */ + public List<SourceWireFactory> createSourceFactory(ConfiguredReference configuredReference) throws BuilderConfigException; + + /** + * Creates a target-side wire factory for a service implementing a given interface + * + * @param configuredService the configured service to create the wire factory for + * @throws BuilderConfigException + */ + public TargetWireFactory createTargetFactory(ConfiguredService configuredService) throws BuilderConfigException; + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/resources/META-INF/services/org.apache.tuscany.core.runtime.proxy.ServiceProxyFactory b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/resources/META-INF/services/org.apache.tuscany.core.runtime.proxy.ServiceProxyFactory new file mode 100644 index 0000000000..9b2d05d734 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/resources/META-INF/services/org.apache.tuscany.core.runtime.proxy.ServiceProxyFactory @@ -0,0 +1 @@ +org.apache.tuscany.core.runtime.proxy.impl.ServiceProxyFactoryImpl
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/resources/model/anyobject.xsd b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/resources/model/anyobject.xsd new file mode 100644 index 0000000000..47f45d61d7 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/resources/model/anyobject.xsd @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:obj="http://org.apache.tuscany/xmlns/anyobject/v0.0.1/" + targetNamespace="http://org.apache.tuscany/xmlns/anyobject/v0.0.1/" + xmlns:codegen="http://www.eclipse.org/emf/2002/Ecore" + codegen:nsPrefix="obj" + codegen:package="org.apache.tuscany.message.object"> + + <element name="anyObject" type="obj:AnyObject"/> + <complexType name="AnyObject"> + <sequence> + <element name="object" type="obj:Object"/> + </sequence> + </complexType> + + <simpleType name="Object" codegen:instanceClass="java.lang.Object"> + <restriction base="base64Binary"/> + </simpleType> + +</schema> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/resources/model/tuscany-system.xsd b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/resources/model/tuscany-system.xsd new file mode 100644 index 0000000000..9c85db8c37 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/resources/model/tuscany-system.xsd @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://org.apache.tuscany/xmlns/system/0.9" + xmlns:sca="http://www.osoa.org/xmlns/sca/0.9" + xmlns:system="http://org.apache.tuscany/xmlns/system/0.9" + xmlns:sdo="commonj.sdo/xml" + xmlns:sdojava="commonj.sdo/java" + elementFormDefault="qualified" + sdojava:package="org.apache.tuscany.core.system.scdl"> + + <import namespace="http://www.osoa.org/xmlns/sca/0.9" schemaLocation="../../../../../model/src/main/resources/model/sca-core.xsd"/> + + <element name="implementation.system" type="system:SystemImplementation" substitutionGroup="sca:implementation" sdo:name="implementationSystem"/> + <complexType name="SystemImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="class" type="NCName" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> + + <element name="binding.system" type="system:SystemBinding" substitutionGroup="sca:binding" sdo:name="bindingSystem"/> + <complexType name="SystemBinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> + +</schema>
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/resources/org/apache/tuscany/core/MonitorMessages.properties b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/resources/org/apache/tuscany/core/MonitorMessages.properties new file mode 100644 index 0000000000..e3b2ff9a4f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/resources/org/apache/tuscany/core/MonitorMessages.properties @@ -0,0 +1,23 @@ +# Copyright (c) 2006 The Apache Software Foundation or its licensors, as applicable. +# +# Licensed 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. +# +# $Rev$ $Date$ +# + +org.apache.tuscany.core.client.TuscanyRuntime$Monitor#moduleStarted = Started application module [{0}] +org.apache.tuscany.core.client.TuscanyRuntime$Monitor#moduleStartFailed = Fatal exception starting application module [{0}] +org.apache.tuscany.core.client.TuscanyRuntime$Monitor#moduleStopped = Stopped application module [{0}] + +org.apache.tuscany.core.loader.impl.StAXLoaderRegistryImpl$Monitor#registeringLoader = Registering StAXElementLoader for {0} +org.apache.tuscany.core.loader.impl.StAXLoaderRegistryImpl$Monitor#elementLoad = Processing element {0}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/resources/system.module b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/resources/system.module new file mode 100644 index 0000000000..8d76e19283 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/main/resources/system.module @@ -0,0 +1,93 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<module xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:tuscany="http://org.apache.tuscany/xmlns/system/0.9"
+ name="org.apache.tuscany.core.system">
+
+ <component name="org.apache.tuscany.core.loader.WSDLDefinitionRegistry">
+ <tuscany:implementation.system class="org.apache.tuscany.core.loader.impl.WSDLDefinitionRegistryImpl"/>
+ </component>
+
+ <component name="org.apache.tuscany.core.loader.assembly.ComponentTypeLoader">
+ <tuscany:implementation.system class="org.apache.tuscany.core.loader.assembly.ComponentTypeLoader"/>
+ </component>
+
+ <!--
+ <component name="org.apache.tuscany.core.config.processor.ServiceProcessor">
+ <tuscany:implementation.system class="org.apache.tuscany.core.config.processor.ServiceProcessor"/>
+ </component>
+ <component name="org.apache.tuscany.core.config.processor.PropertyProcessor">
+ <tuscany:implementation.system class="org.apache.tuscany.core.config.processor.PropertyProcessor"/>
+ </component>
+ -->
+ <component name="org.apache.tuscany.core.loader.assembly.ExternalServiceLoader">
+ <tuscany:implementation.system class="org.apache.tuscany.core.loader.assembly.ExternalServiceLoader"/>
+ </component>
+
+ <component name="org.apache.tuscany.core.loader.assembly.ImportWSDLLoader">
+ <tuscany:implementation.system class="org.apache.tuscany.core.loader.assembly.ImportWSDLLoader"/>
+ </component>
+
+ <component name="org.apache.tuscany.core.loader.assembly.InterfaceWSDLLoader">
+ <tuscany:implementation.system class="org.apache.tuscany.core.loader.assembly.InterfaceWSDLLoader"/>
+ </component>
+
+ <component name="org.apache.tuscany.core.loader.assembly.PropertyLoader">
+ <tuscany:implementation.system class="org.apache.tuscany.core.loader.assembly.PropertyLoader"/>
+ </component>
+
+ <component name="org.apache.tuscany.core.loader.assembly.ReferenceLoader">
+ <tuscany:implementation.system class="org.apache.tuscany.core.loader.assembly.ReferenceLoader"/>
+ </component>
+
+ <component name="org.apache.tuscany.core.loader.assembly.WireLoader">
+ <tuscany:implementation.system class="org.apache.tuscany.core.loader.assembly.WireLoader"/>
+ </component>
+
+ <component name="org.apache.tuscany.core.loader.assembly.ServiceLoader">
+ <tuscany:implementation.system class="org.apache.tuscany.core.loader.assembly.ServiceLoader"/>
+ </component>
+
+ <component name="org.apache.tuscany.core.builder.system.PolicyBuilderRegistry">
+ <tuscany:implementation.system class="org.apache.tuscany.core.builder.system.DefaultPolicyBuilderRegistry"/>
+ </component>
+
+ <component name="org.apache.tuscany.core.wire.service.internal.WireFactoryService">
+ <tuscany:implementation.system class="org.apache.tuscany.core.wire.service.DefaultWireFactoryService"/>
+ </component>
+
+ <component name="org.apache.tuscany.core.message.MessageFactory">
+ <tuscany:implementation.system class="org.apache.tuscany.core.message.impl.MessageFactoryImpl"/>
+ </component>
+
+ <component name="org.apache.tuscany.core.wire.WireFactoryFactory">
+ <tuscany:implementation.system class="org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory"/>
+ </component>
+
+ <component name="org.apache.tuscany.core.async.work.DefaultWorkManager">
+ <tuscany:implementation.system class="org.apache.tuscany.core.async.work.DefaultWorkManager"/>
+ <properties>
+ <v:scheduledMaximumPoolSize>10</v:scheduledMaximumPoolSize>
+ </properties>
+ </component>
+
+ <component name="org.apache.tuscany.core.async.builder.AsyncPolicyBuilder">
+ <tuscany:implementation.system class="org.apache.tuscany.core.async.builder.AsyncPolicyBuilder"/>
+ </component>
+
+</module>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/invocation/AsyncInvocationConfigurationTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/invocation/AsyncInvocationConfigurationTestCase.java new file mode 100644 index 0000000000..6f55182c2b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/invocation/AsyncInvocationConfigurationTestCase.java @@ -0,0 +1,197 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.async.invocation; + +import java.lang.reflect.Method; +import java.util.concurrent.CountDownLatch; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.core.async.wire.mock.MockHandler; +import org.apache.tuscany.core.async.wire.mock.MockStaticInvoker; +import org.apache.tuscany.core.async.wire.mock.MockSyncInterceptor; +import org.apache.tuscany.core.async.wire.mock.SimpleTarget; +import org.apache.tuscany.core.async.wire.mock.SimpleTargetImpl; +import org.apache.tuscany.core.async.work.DefaultWorkManager; +import org.apache.tuscany.core.message.Message; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; +import org.apache.tuscany.core.wire.SourceInvocationConfiguration; +import org.apache.tuscany.core.wire.TargetInvocationConfiguration; +import org.apache.tuscany.core.wire.impl.InvokerInterceptor; +import org.apache.tuscany.core.wire.impl.MessageChannelImpl; + +public class AsyncInvocationConfigurationTestCase extends TestCase { + + private DefaultWorkManager workManager; + private Method hello; + + private MessageFactory factory = new MessageFactoryImpl(); + + public AsyncInvocationConfigurationTestCase() { + super(); + } + + public AsyncInvocationConfigurationTestCase(String arg0) { + super(arg0); + } + + protected void setUp() throws Exception { + hello = SimpleTarget.class.getMethod("hello", String.class); + + workManager=new DefaultWorkManager(); + workManager.setScheduledMaximumPoolSize(5); + workManager.init(); + } + + protected void tearDown() throws Exception { + workManager.destroy(); + + super.tearDown(); + } + + /** + * Tests basic wiring of a source to a target, including handlers and interceptors + */ + public void testInvokeWithHandlers() throws Exception { + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + + source.addInterceptor(new AsyncInterceptor(workManager, factory)); + + MockHandler sourceRequestHandler = new MockHandler(); + MockHandler sourceResponseHandler = new MockHandler(); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addRequestHandler(sourceRequestHandler); + source.addResponseHandler(sourceResponseHandler); + source.addInterceptor(sourceInterceptor); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockHandler targetRequestHandler = new MockHandler(); + MockHandler targetResponseHandler = new MockHandler(); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addRequestHandler(targetRequestHandler); + target.addResponseHandler(targetResponseHandler); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + // connect the source to the target + source.setTargetRequestChannel(new MessageChannelImpl(target.getRequestHandlers())); + source.setTargetResponseChannel(new MessageChannelImpl(target.getResponseHandlers())); + source.build(); + target.build(); + + CountDownLatch startSignal = new CountDownLatch(1); + CountDownLatch doneSignal = new CountDownLatch(1); + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl(startSignal, doneSignal)); + source.setTargetInvoker(invoker); + + Message msg = factory.createMessage(); + msg.setBody("foo"); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + startSignal.countDown(); + doneSignal.await(); + + Assert.assertEquals(null, response.getBody()); + Assert.assertEquals(1, sourceRequestHandler.getCount()); + //FIXME why isn't the responseHandler invoked? + //Assert.assertEquals(1, sourceResponseHandler.getCount()); + Assert.assertEquals(1, sourceInterceptor.getCount()); + Assert.assertEquals(1, targetRequestHandler.getCount()); + //FIXME + //Assert.assertEquals(1, targetResponseHandler.getCount()); + Assert.assertEquals(1, targetInterceptor.getCount()); + } + + public void testInvokeWithRequestHandlers() throws Exception { + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + + source.addInterceptor(new AsyncInterceptor(workManager, factory)); + + MockHandler sourceRequestHandler = new MockHandler(); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addRequestHandler(sourceRequestHandler); + source.addInterceptor(sourceInterceptor); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockHandler targetRequestHandler = new MockHandler(); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addRequestHandler(targetRequestHandler); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + // connect the source to the target + source.setTargetRequestChannel(new MessageChannelImpl(target.getRequestHandlers())); + source.setTargetResponseChannel(new MessageChannelImpl(target.getResponseHandlers())); + source.build(); + target.build(); + + CountDownLatch startSignal = new CountDownLatch(1); + CountDownLatch doneSignal = new CountDownLatch(1); + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl(startSignal, doneSignal)); + source.setTargetInvoker(invoker); + + Message msg = factory.createMessage(); + msg.setBody("foo"); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + startSignal.countDown(); + doneSignal.await(); + + Assert.assertEquals(null, response.getBody()); + Assert.assertEquals(1, sourceRequestHandler.getCount()); + Assert.assertEquals(1, sourceInterceptor.getCount()); + Assert.assertEquals(1, targetRequestHandler.getCount()); + Assert.assertEquals(1, targetInterceptor.getCount()); + } + + /** + * Tests basic wiring of a source to a target, including handlers and interceptors + */ + public void testInvokeWithInterceptorsOnly() throws Exception { + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + + source.addInterceptor(new AsyncInterceptor(workManager, factory)); + + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addInterceptor(sourceInterceptor); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + // connect the source to the target + source.setTargetInterceptor(target.getHeadInterceptor()); + source.build(); + target.build(); + + CountDownLatch startSignal = new CountDownLatch(1); + CountDownLatch doneSignal = new CountDownLatch(1); + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl(startSignal, doneSignal)); + source.setTargetInvoker(invoker); + + Message msg = factory.createMessage(); + msg.setBody("foo"); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + startSignal.countDown(); + doneSignal.await(); + + Assert.assertEquals(null, response.getBody()); + Assert.assertEquals(1, sourceInterceptor.getCount()); + Assert.assertEquals(1, targetInterceptor.getCount()); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/wire/mock/MockHandler.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/wire/mock/MockHandler.java new file mode 100644 index 0000000000..4f17dc2a76 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/wire/mock/MockHandler.java @@ -0,0 +1,38 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.async.wire.mock; + +import org.apache.tuscany.core.wire.MessageHandler; +import org.apache.tuscany.core.message.Message; + +/** + * + */ +public class MockHandler implements MessageHandler { + + private int count =0; + + public boolean processMessage(Message message) { + //System.out.println("Invoking handler"); + count++; + return true; + } + + public int getCount(){ + return count; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/wire/mock/MockStaticInvoker.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/wire/mock/MockStaticInvoker.java new file mode 100644 index 0000000000..e32de0eec1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/wire/mock/MockStaticInvoker.java @@ -0,0 +1,86 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.async.wire.mock; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.apache.tuscany.core.message.Message; +import org.apache.tuscany.core.wire.Interceptor; +import org.apache.tuscany.core.wire.InvocationRuntimeException; +import org.apache.tuscany.core.wire.TargetInvoker; + +/** + * Caches component instances that do not need to be resolved for every wire, e.g. an wire originating from + * a lesser scope intended for a target with a wider scope + * + * @version $Rev: 377006 $ $Date: 2006-02-11 09:41:59 -0800 (Sat, 11 Feb 2006) $ + */ +public class MockStaticInvoker implements TargetInvoker { + + private Object instance; + + private Method operation; + + public MockStaticInvoker(Method operation, Object instance) { + this.operation = operation; + this.instance = instance; + } + + public boolean isCacheable() { + return true; + } + + public Object invokeTarget(Object payload) throws InvocationTargetException { + try { + if (payload != null && !payload.getClass().isArray()) { + return operation.invoke(instance, payload); + } else { + return operation.invoke(instance, (Object[]) payload); + } + } catch (IllegalAccessException e) { + throw new InvocationRuntimeException(e); + } + } + + public Message invoke(Message msg) { + try { + Object resp = invokeTarget(msg.getBody()); + msg.setBody(resp); + } catch (InvocationTargetException e) { + msg.setBody(e.getCause()); + } catch (Throwable e) { + msg.setBody(e); + } + return msg; + } + + public void setNext(Interceptor next) { + throw new IllegalStateException("This interceptor must be the last interceptor in an interceptor chain"); + } + + public Object clone() throws CloneNotSupportedException { + try { + MockStaticInvoker invoker = (MockStaticInvoker) super.clone(); + invoker.instance = this.instance; + invoker.operation = this.operation; + return invoker; + } catch (CloneNotSupportedException e) { + return null; // will not happen + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/wire/mock/MockSyncInterceptor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/wire/mock/MockSyncInterceptor.java new file mode 100644 index 0000000000..5b70848d06 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/wire/mock/MockSyncInterceptor.java @@ -0,0 +1,45 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.async.wire.mock; + +import org.apache.tuscany.core.wire.Interceptor; +import org.apache.tuscany.core.message.Message; + +public class MockSyncInterceptor implements Interceptor { + + private int count; + + private Interceptor next; + + public MockSyncInterceptor() { + } + + public Message invoke(Message msg) { + ++count; + //System.out.println("Invoking interceptor"); + return next.invoke(msg); + } + + public int getCount() { + return count; + } + + public void setNext(Interceptor next) { + this.next=next; + } +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/wire/mock/SimpleTarget.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/wire/mock/SimpleTarget.java new file mode 100644 index 0000000000..2147a3a4db --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/wire/mock/SimpleTarget.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.async.wire.mock; + +public interface SimpleTarget { + + public void hello(String message) throws Exception; + + public void goodbye(String message) throws Exception; + + public void echo(String message) throws Exception; + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/wire/mock/SimpleTargetImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/wire/mock/SimpleTargetImpl.java new file mode 100644 index 0000000000..e6f76494f6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/wire/mock/SimpleTargetImpl.java @@ -0,0 +1,54 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.async.wire.mock; + +import java.util.concurrent.CountDownLatch; + +public class SimpleTargetImpl implements SimpleTarget { + + private final CountDownLatch startSignal; + private final CountDownLatch doneSignal; + + public SimpleTargetImpl(CountDownLatch startSignal, CountDownLatch doneSignal) { + this.startSignal = startSignal; + this.doneSignal = doneSignal; + } + + public void hello(String message) throws Exception { + try { + startSignal.await(); + doneSignal.countDown(); + } catch (InterruptedException ex) {} + } + + public void goodbye(String message) throws Exception { + try { + startSignal.await(); + doneSignal.countDown(); + } catch (InterruptedException ex) {} + } + + public void echo(String message) throws Exception { + try { + startSignal.await(); + doneSignal.countDown(); + } catch (InterruptedException ex) {} + } + + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/work/DefaultWorkManagerTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/work/DefaultWorkManagerTestCase.java new file mode 100644 index 0000000000..964564f3ee --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/work/DefaultWorkManagerTestCase.java @@ -0,0 +1,98 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.async.work; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.CountDownLatch; + +import javax.resource.spi.work.Work; + +import junit.framework.TestCase; + +import org.apache.tuscany.core.async.work.DefaultWorkManager; + +/** + * Test the PooledWorkManager. + */ +public class DefaultWorkManagerTestCase extends TestCase { + + private Set<Thread> done; + private int count; + + public void testScheduleWork() throws Exception { + + DefaultWorkManager workManager = new DefaultWorkManager(); + workManager.setScheduledMaximumPoolSize(3); + workManager.init(); + + int max=workManager.getScheduledMaximumPoolSize()*5; + done=Collections.synchronizedSet(new HashSet<Thread>()); + count=0; + + CountDownLatch startSignal = new CountDownLatch(1); + CountDownLatch doneSignal = new CountDownLatch(max); + for (int i = 0; i < max; ++i) { + workManager.scheduleWork(new Worker(startSignal, doneSignal)); + } + startSignal.countDown(); + doneSignal.await(); + + assertFalse(done.contains(Thread.currentThread())); + assert(done.size()==workManager.getScheduledMaximumPoolSize()); + assert(count==max); + + done=null; + count=0; + + workManager.destroy(); + + } + + private synchronized void done(Thread thread) { + done.add(thread); + count++; + } + + private class Worker implements Work { + private final CountDownLatch startSignal; + private final CountDownLatch doneSignal; + + Worker(CountDownLatch startSignal, CountDownLatch doneSignal) { + this.startSignal = startSignal; + this.doneSignal = doneSignal; + } + + public void run() { + try { + startSignal.await(); + + DefaultWorkManagerTestCase.this.done(Thread.currentThread()); + //System.out.println(Thread.currentThread()); + + doneSignal.countDown(); + } catch (InterruptedException ex) { + } + } + + public void release() { + } + + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/work/GeronimoWorkManagerTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/work/GeronimoWorkManagerTestCase.java new file mode 100644 index 0000000000..18570d54c3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/async/work/GeronimoWorkManagerTestCase.java @@ -0,0 +1,138 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.async.work; + +import javax.resource.spi.work.Work; +import javax.resource.spi.work.WorkEvent; +import javax.resource.spi.work.WorkListener; + +import junit.framework.TestCase; + +import org.apache.geronimo.connector.work.GeronimoWorkManager; +import org.apache.geronimo.transaction.context.TransactionContextManager; + +/** + * Tests the Geronimo work manager + * + * @version $Rev$ $Date$ + */ +public class GeronimoWorkManagerTestCase extends TestCase { + + private GeronimoWorkManager workManager; + + protected void setUp() throws Exception { + TransactionContextManager transactionContextManager = new TransactionContextManager(); + + workManager = new GeronimoWorkManager(2, transactionContextManager); + workManager.doStart(); + } + + public void testScheduleWork() throws Exception { + TestThread threads[] = startTestThreads(5, 10000, 100); + int accepted = 0; + int started = 0; + for (int i = 0; i < threads.length; i++) { + if (null != threads[i].listener.acceptedEvent) { + accepted++; + } else if (null != threads[i].listener.startedEvent) { + started++; + } else { + fail("incorrect state, expecting accepted or started"); + } + } + assertTrue(accepted > 0); + } + + private TestThread[] startTestThreads(int count, int timeout, int delay) throws Exception { + TestThread threads[] = new TestThread[count]; + for (int i = 0; i < count; i++) { + TestWorkListener listener=new TestWorkListener(); + threads[i] = new TestThread(listener, timeout, delay); + } + for (int i = 0; i < count; i++) { + threads[i].start(); + } + for (int i = 0; i < count; i++) { + threads[i].join(); + } + return threads; + } + + private class TestThread extends Thread { + public final TestWorkListener listener; + private final int timeout; + private final int delay; + + public TestThread(TestWorkListener listener, int timeout, int delay) { + this.listener = listener; + this.timeout = timeout; + this.delay = delay; + } + + public void run() { + try { + workManager.scheduleWork(new TestWorker(delay), timeout, null, listener); + } catch (Exception e) { + e.printStackTrace(); + } + } + + } + + public class TestWorker implements Work { + private final int delay; + + public TestWorker(int delay) { + this.delay = delay; + } + + public void release() { + } + + public void run() { + try { + Thread.sleep(delay); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + } + + public class TestWorkListener implements WorkListener { + public WorkEvent acceptedEvent; + public WorkEvent rejectedEvent; + public WorkEvent startedEvent; + public WorkEvent completedEvent; + + public void workAccepted(WorkEvent e) { + acceptedEvent = e; + } + + public void workRejected(WorkEvent e) { + rejectedEvent = e; + } + + public void workStarted(WorkEvent e) { + startedEvent = e; + } + + public void workCompleted(WorkEvent e) { + completedEvent = e; + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/builder/impl/DefaultWireBuilderTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/builder/impl/DefaultWireBuilderTestCase.java new file mode 100644 index 0000000000..e4aaad62d1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/builder/impl/DefaultWireBuilderTestCase.java @@ -0,0 +1,465 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.builder.impl; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.wire.MethodHashMap; +import org.apache.tuscany.core.wire.WireSourceConfiguration; +import org.apache.tuscany.core.wire.WireTargetConfiguration; +import org.apache.tuscany.core.wire.SourceInvocationConfiguration; +import org.apache.tuscany.core.wire.TargetInvocationConfiguration; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.WireFactoryFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.mock.SimpleTarget; +import org.apache.tuscany.core.wire.mock.MockHandler; +import org.apache.tuscany.core.wire.mock.MockSyncInterceptor; +import org.apache.tuscany.core.wire.mock.MockStaticInvoker; +import org.apache.tuscany.core.wire.mock.SimpleTargetImpl; +import org.apache.tuscany.core.wire.impl.InvokerInterceptor; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; +import org.apache.tuscany.core.message.Message; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; + +import java.lang.reflect.Method; +import java.util.Map; + +public class DefaultWireBuilderTestCase extends TestCase { + + private Method hello; + + private WireFactoryFactory wireFactoryFactory = new JDKWireFactoryFactory(); + + public DefaultWireBuilderTestCase() { + super(); + } + + public DefaultWireBuilderTestCase(String arg0) { + super(arg0); + } + + public void setUp() throws Exception { + hello = SimpleTarget.class.getMethod("hello", String.class); + } + + public void testWireWithInterceptorsAndHandlers() throws Exception { + MessageFactory msgFactory = new MessageFactoryImpl(); + + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + MockHandler sourceRequestHandler = new MockHandler(); + MockHandler sourceResponseHandler = new MockHandler(); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addRequestHandler(sourceRequestHandler); + source.addResponseHandler(sourceResponseHandler); + source.addInterceptor(sourceInterceptor); + + SourceWireFactory sourceFactory = wireFactoryFactory.createSourceWireFactory(); + Map<Method, SourceInvocationConfiguration> sourceInvocationConfigs = new MethodHashMap<SourceInvocationConfiguration>(); + sourceInvocationConfigs.put(hello, source); + WireSourceConfiguration sourceConfig = new WireSourceConfiguration("foo",new QualifiedName("target/SimpleTarget"), + sourceInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + sourceFactory.setConfiguration(sourceConfig); + sourceFactory.setBusinessInterface(SimpleTarget.class); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockHandler targetRequestHandler = new MockHandler(); + MockHandler targetResponseHandler = new MockHandler(); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addRequestHandler(targetRequestHandler); + target.addResponseHandler(targetResponseHandler); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + TargetWireFactory targetFactory = wireFactoryFactory.createTargetWireFactory(); + Map<Method, TargetInvocationConfiguration> targetInvocationConfigs = new MethodHashMap<TargetInvocationConfiguration>(); + targetInvocationConfigs.put(hello, target); + WireTargetConfiguration targetConfig = new WireTargetConfiguration(new QualifiedName("target/SimpleTarget"), + targetInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + targetFactory.setConfiguration(targetConfig); + targetFactory.setBusinessInterface(SimpleTarget.class); + + // connect the source to the target + DefaultWireBuilder builder = new DefaultWireBuilder(); + // no need for scopes since we use a static invoker + builder.connect(sourceFactory, targetFactory, null, true, null); + // source.buildSource(); + target.build(); + // set a static invoker + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + + Message msg = msgFactory.createMessage(); + msg.setBody("foo"); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + Assert.assertEquals("foo", response.getBody()); + Assert.assertEquals(1, sourceRequestHandler.getCount()); + Assert.assertEquals(1, sourceResponseHandler.getCount()); + Assert.assertEquals(1, sourceInterceptor.getCount()); + Assert.assertEquals(1, targetRequestHandler.getCount()); + Assert.assertEquals(1, targetResponseHandler.getCount()); + Assert.assertEquals(1, targetInterceptor.getCount()); + } + + public void testWireWithSourceInterceptorTargetHandlersAndTargetInterceptor() throws Exception { + MessageFactory msgFactory = new MessageFactoryImpl(); + + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addInterceptor(sourceInterceptor); + + SourceWireFactory sourceFactory = new JDKWireFactoryFactory().createSourceWireFactory(); + Map<Method, SourceInvocationConfiguration> sourceInvocationConfigs = new MethodHashMap<SourceInvocationConfiguration>(); + sourceInvocationConfigs.put(hello, source); + WireSourceConfiguration sourceConfig = new WireSourceConfiguration("foo",new QualifiedName("target/SimpleTarget"), + sourceInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + sourceFactory.setConfiguration(sourceConfig); + sourceFactory.setBusinessInterface(SimpleTarget.class); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockHandler targetRequestHandler = new MockHandler(); + MockHandler targetResponseHandler = new MockHandler(); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addRequestHandler(targetRequestHandler); + target.addResponseHandler(targetResponseHandler); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + TargetWireFactory targetFactory = wireFactoryFactory.createTargetWireFactory(); + Map<Method, TargetInvocationConfiguration> targetInvocationConfigs = new MethodHashMap<TargetInvocationConfiguration>(); + targetInvocationConfigs.put(hello, target); + WireTargetConfiguration targetConfig = new WireTargetConfiguration(new QualifiedName("target/SimpleTarget"), + targetInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + targetFactory.setConfiguration(targetConfig); + targetFactory.setBusinessInterface(SimpleTarget.class); + + // connect the source to the target + DefaultWireBuilder builder = new DefaultWireBuilder(); + // no need for scopes since we use a static invoker + builder.connect(sourceFactory, targetFactory, null, true, null); + // source.buildSource(); + target.build(); + // set a static invoker + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + + Message msg = msgFactory.createMessage(); + msg.setBody("foo"); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + Assert.assertEquals("foo", response.getBody()); + Assert.assertEquals(1, sourceInterceptor.getCount()); + Assert.assertEquals(1, targetRequestHandler.getCount()); + Assert.assertEquals(1, targetResponseHandler.getCount()); + Assert.assertEquals(1, targetInterceptor.getCount()); + } + + public void testWireWithInterceptorsAndRequestHandlers() throws Exception { + MessageFactory msgFactory = new MessageFactoryImpl(); + + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + MockHandler sourceRequestHandler = new MockHandler(); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addRequestHandler(sourceRequestHandler); + source.addInterceptor(sourceInterceptor); + + SourceWireFactory sourceFactory = new JDKWireFactoryFactory().createSourceWireFactory(); + Map<Method, SourceInvocationConfiguration> sourceInvocationConfigs = new MethodHashMap<SourceInvocationConfiguration>(); + sourceInvocationConfigs.put(hello, source); + WireSourceConfiguration sourceConfig = new WireSourceConfiguration("foo",new QualifiedName("target/SimpleTarget"), + sourceInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + sourceFactory.setConfiguration(sourceConfig); + sourceFactory.setBusinessInterface(SimpleTarget.class); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockHandler targetRequestHandler = new MockHandler(); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addRequestHandler(targetRequestHandler); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + TargetWireFactory targetFactory = wireFactoryFactory.createTargetWireFactory(); + Map<Method, TargetInvocationConfiguration> targetInvocationConfigs = new MethodHashMap<TargetInvocationConfiguration>(); + targetInvocationConfigs.put(hello, target); + WireTargetConfiguration targetConfig = new WireTargetConfiguration(new QualifiedName("target/SimpleTarget"), + targetInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + targetFactory.setConfiguration(targetConfig); + targetFactory.setBusinessInterface(SimpleTarget.class); + + // connect the source to the target + DefaultWireBuilder builder = new DefaultWireBuilder(); + // no need for scopes since we use a static invoker + builder.connect(sourceFactory, targetFactory, null, true, null); + // source.buildSource(); + target.build(); + // set a static invoker + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + + Message msg = msgFactory.createMessage(); + msg.setBody("foo"); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + Assert.assertEquals("foo", response.getBody()); + Assert.assertEquals(1, sourceRequestHandler.getCount()); + Assert.assertEquals(1, sourceInterceptor.getCount()); + Assert.assertEquals(1, targetRequestHandler.getCount()); + Assert.assertEquals(1, targetInterceptor.getCount()); + } + + public void testWireWithSourceAndTargetInterceptors() throws Exception { + MessageFactory msgFactory = new MessageFactoryImpl(); + + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addInterceptor(sourceInterceptor); + + SourceWireFactory sourceFactory = new JDKWireFactoryFactory().createSourceWireFactory(); + Map<Method, SourceInvocationConfiguration> sourceInvocationConfigs = new MethodHashMap<SourceInvocationConfiguration>(); + sourceInvocationConfigs.put(hello, source); + WireSourceConfiguration sourceConfig = new WireSourceConfiguration("foo",new QualifiedName("target/SimpleTarget"), + sourceInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + sourceFactory.setConfiguration(sourceConfig); + sourceFactory.setBusinessInterface(SimpleTarget.class); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + TargetWireFactory targetFactory = wireFactoryFactory.createTargetWireFactory(); + Map<Method, TargetInvocationConfiguration> targetInvocationConfigs = new MethodHashMap<TargetInvocationConfiguration>(); + targetInvocationConfigs.put(hello, target); + WireTargetConfiguration targetConfig = new WireTargetConfiguration(new QualifiedName("target/SimpleTarget"), + targetInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + targetFactory.setConfiguration(targetConfig); + targetFactory.setBusinessInterface(SimpleTarget.class); + + // connect the source to the target + DefaultWireBuilder builder = new DefaultWireBuilder(); + // no need for scopes since we use a static invoker + builder.connect(sourceFactory, targetFactory, null, true, null); + // source.buildSource(); + target.build(); + // set a static invoker + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + + Message msg = msgFactory.createMessage(); + msg.setBody("foo"); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + Assert.assertEquals("foo", response.getBody()); + Assert.assertEquals(1, sourceInterceptor.getCount()); + Assert.assertEquals(1, targetInterceptor.getCount()); + } + + public void testWireWithSourceInterceptorSourceHandlersAndTargetInterceptor() throws Exception { + MessageFactory msgFactory = new MessageFactoryImpl(); + + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + MockHandler sourceRequestHandler = new MockHandler(); + MockHandler sourceResponseHandler = new MockHandler(); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addRequestHandler(sourceRequestHandler); + source.addResponseHandler(sourceResponseHandler); + source.addInterceptor(sourceInterceptor); + + SourceWireFactory sourceFactory = new JDKWireFactoryFactory().createSourceWireFactory(); + Map<Method, SourceInvocationConfiguration> sourceInvocationConfigs = new MethodHashMap<SourceInvocationConfiguration>(); + sourceInvocationConfigs.put(hello, source); + WireSourceConfiguration sourceConfig = new WireSourceConfiguration("foo",new QualifiedName("target/SimpleTarget"), + sourceInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + sourceFactory.setConfiguration(sourceConfig); + sourceFactory.setBusinessInterface(SimpleTarget.class); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + TargetWireFactory targetFactory = wireFactoryFactory.createTargetWireFactory(); + Map<Method, TargetInvocationConfiguration> targetInvocationConfigs = new MethodHashMap<TargetInvocationConfiguration>(); + targetInvocationConfigs.put(hello, target); + WireTargetConfiguration targetConfig = new WireTargetConfiguration(new QualifiedName("target/SimpleTarget"), + targetInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + targetFactory.setConfiguration(targetConfig); + targetFactory.setBusinessInterface(SimpleTarget.class); + + // connect the source to the target + DefaultWireBuilder builder = new DefaultWireBuilder(); + // no need for scopes since we use a static invoker + builder.connect(sourceFactory, targetFactory, null, true, null); + // source.buildSource(); + target.build(); + // set a static invoker + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + + Message msg = msgFactory.createMessage(); + msg.setBody("foo"); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + Assert.assertEquals("foo", response.getBody()); + Assert.assertEquals(1, sourceRequestHandler.getCount()); + Assert.assertEquals(1, sourceResponseHandler.getCount()); + Assert.assertEquals(1, sourceInterceptor.getCount()); + Assert.assertEquals(1, targetInterceptor.getCount()); + } + + public void testWireWithTargetInterceptorAndTargetHandlers() throws Exception { + MessageFactory msgFactory = new MessageFactoryImpl(); + + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + + SourceWireFactory sourceFactory = new JDKWireFactoryFactory().createSourceWireFactory(); + Map<Method, SourceInvocationConfiguration> sourceInvocationConfigs = new MethodHashMap<SourceInvocationConfiguration>(); + sourceInvocationConfigs.put(hello, source); + WireSourceConfiguration sourceConfig = new WireSourceConfiguration("foo",new QualifiedName("target/SimpleTarget"), + sourceInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + sourceFactory.setConfiguration(sourceConfig); + sourceFactory.setBusinessInterface(SimpleTarget.class); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockHandler targetRequestHandler = new MockHandler(); + MockHandler targetResponseHandler = new MockHandler(); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addRequestHandler(targetRequestHandler); + target.addResponseHandler(targetResponseHandler); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + TargetWireFactory targetFactory = wireFactoryFactory.createTargetWireFactory(); + Map<Method, TargetInvocationConfiguration> targetInvocationConfigs = new MethodHashMap<TargetInvocationConfiguration>(); + targetInvocationConfigs.put(hello, target); + WireTargetConfiguration targetConfig = new WireTargetConfiguration(new QualifiedName("target/SimpleTarget"), + targetInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + targetFactory.setConfiguration(targetConfig); + targetFactory.setBusinessInterface(SimpleTarget.class); + + // connect the source to the target + DefaultWireBuilder builder = new DefaultWireBuilder(); + // no need for scopes since we use a static invoker + builder.connect(sourceFactory, targetFactory, null, true, null); + // source.buildSource(); + target.build(); + // set a static invoker + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + + Message msg = msgFactory.createMessage(); + msg.setBody("foo"); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + Assert.assertEquals("foo", response.getBody()); + Assert.assertEquals(1, targetRequestHandler.getCount()); + Assert.assertEquals(1, targetResponseHandler.getCount()); + Assert.assertEquals(1, targetInterceptor.getCount()); + } + + public void testWireWithTargetInterceptor() throws Exception { + MessageFactory msgFactory = new MessageFactoryImpl(); + + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + + SourceWireFactory sourceFactory = new JDKWireFactoryFactory().createSourceWireFactory(); + Map<Method, SourceInvocationConfiguration> sourceInvocationConfigs = new MethodHashMap<SourceInvocationConfiguration>(); + sourceInvocationConfigs.put(hello, source); + WireSourceConfiguration sourceConfig = new WireSourceConfiguration("foo",new QualifiedName("target/SimpleTarget"), + sourceInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + sourceFactory.setConfiguration(sourceConfig); + sourceFactory.setBusinessInterface(SimpleTarget.class); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + TargetWireFactory targetFactory = wireFactoryFactory.createTargetWireFactory(); + Map<Method, TargetInvocationConfiguration> targetInvocationConfigs = new MethodHashMap<TargetInvocationConfiguration>(); + targetInvocationConfigs.put(hello, target); + WireTargetConfiguration targetConfig = new WireTargetConfiguration(new QualifiedName("target/SimpleTarget"), + targetInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + targetFactory.setConfiguration(targetConfig); + targetFactory.setBusinessInterface(SimpleTarget.class); + + // connect the source to the target + DefaultWireBuilder builder = new DefaultWireBuilder(); + // no need for scopes since we use a static invoker + builder.connect(sourceFactory, targetFactory, null, true, null); + target.build(); + // set a static invoker + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + + Message msg = msgFactory.createMessage(); + msg.setBody("foo"); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + Assert.assertEquals("foo", response.getBody()); + Assert.assertEquals(1, targetInterceptor.getCount()); + } + + /** + * When there are only {@link InvokerInterceptor}s in the source and target chain, we need to bypass one during + * wire up so they are not chained together + */ + public void testWireWithOnlyInvokerInterceptors() throws Exception { + MessageFactory msgFactory = new MessageFactoryImpl(); + + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + source.setTargetInterceptor(new InvokerInterceptor()); + + SourceWireFactory sourceFactory = new JDKWireFactoryFactory().createSourceWireFactory(); + Map<Method, SourceInvocationConfiguration> sourceInvocationConfigs = new MethodHashMap<SourceInvocationConfiguration>(); + sourceInvocationConfigs.put(hello, source); + WireSourceConfiguration sourceConfig = new WireSourceConfiguration("foo",new QualifiedName("target/SimpleTarget"), + sourceInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + sourceFactory.setConfiguration(sourceConfig); + sourceFactory.setBusinessInterface(SimpleTarget.class); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + target.addInterceptor(new InvokerInterceptor()); + + TargetWireFactory targetFactory = wireFactoryFactory.createTargetWireFactory(); + Map<Method, TargetInvocationConfiguration> targetInvocationConfigs = new MethodHashMap<TargetInvocationConfiguration>(); + targetInvocationConfigs.put(hello, target); + WireTargetConfiguration targetConfig = new WireTargetConfiguration(new QualifiedName("target/SimpleTarget"), + targetInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + targetFactory.setConfiguration(targetConfig); + targetFactory.setBusinessInterface(SimpleTarget.class); + + // connect the source to the target + DefaultWireBuilder builder = new DefaultWireBuilder(); + // no need for scopes since we use a static invoker + builder.connect(sourceFactory, targetFactory, null, true, null); + target.build(); + // set a static invoker + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + + Message msg = msgFactory.createMessage(); + msg.setBody("foo"); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + Assert.assertEquals("foo", response.getBody()); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/builder/impl/NegativeDefaultWireBuilderTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/builder/impl/NegativeDefaultWireBuilderTestCase.java new file mode 100644 index 0000000000..983dc577c4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/builder/impl/NegativeDefaultWireBuilderTestCase.java @@ -0,0 +1,89 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.builder.impl; + +import junit.framework.TestCase; +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.wire.MethodHashMap; +import org.apache.tuscany.core.wire.WireSourceConfiguration; +import org.apache.tuscany.core.wire.WireTargetConfiguration; +import org.apache.tuscany.core.wire.SourceInvocationConfiguration; +import org.apache.tuscany.core.wire.TargetInvocationConfiguration; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.WireFactoryFactory; +import org.apache.tuscany.core.wire.jdk.JDKWireFactoryFactory; +import org.apache.tuscany.core.wire.mock.SimpleTarget; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; + +import java.lang.reflect.Method; +import java.util.Map; + +public class NegativeDefaultWireBuilderTestCase extends TestCase { + + private Method hello; + + private WireFactoryFactory wireFactoryFactory = new JDKWireFactoryFactory(); + + public NegativeDefaultWireBuilderTestCase() { + super(); + } + + public NegativeDefaultWireBuilderTestCase(String arg0) { + super(arg0); + } + + public void setUp() throws Exception { + hello = SimpleTarget.class.getMethod("hello", String.class); + } + + public void testNoTargetInterceptorOrHandler() throws Exception { + MessageFactory msgFactory = new MessageFactoryImpl(); + + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + + SourceWireFactory sourceFactory = new JDKWireFactoryFactory().createSourceWireFactory(); + Map<Method, SourceInvocationConfiguration> sourceInvocationConfigs = new MethodHashMap<SourceInvocationConfiguration>(); + sourceInvocationConfigs.put(hello, source); + WireSourceConfiguration sourceConfig = new WireSourceConfiguration("foo",new QualifiedName("target/SimpleTarget"), + sourceInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + sourceFactory.setConfiguration(sourceConfig); + sourceFactory.setBusinessInterface(SimpleTarget.class); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + + TargetWireFactory targetFactory = wireFactoryFactory.createTargetWireFactory(); + Map<Method, TargetInvocationConfiguration> targetInvocationConfigs = new MethodHashMap<TargetInvocationConfiguration>(); + targetInvocationConfigs.put(hello, target); + WireTargetConfiguration targetConfig = new WireTargetConfiguration(new QualifiedName("target/SimpleTarget"), + targetInvocationConfigs, Thread.currentThread().getContextClassLoader(), msgFactory); + targetFactory.setConfiguration(targetConfig); + targetFactory.setBusinessInterface(SimpleTarget.class); + + // connect the source to the target + DefaultWireBuilder builder = new DefaultWireBuilder(); + try { + builder.connect(sourceFactory, targetFactory, null, true, null); + fail("Expected " + BuilderConfigException.class.getName()); + } catch (BuilderConfigException e) { + // success + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/Bean1.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/Bean1.java new file mode 100644 index 0000000000..c02961e5f4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/Bean1.java @@ -0,0 +1,45 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.config; + + +public class Bean1 extends SuperBean { + + public static final int ALL_BEAN1_FIELDS = 6 + ALL_SUPER_FIELDS; + public static final int ALL_BEAN1_PUBLIC_PROTECTED_FIELDS = 5 + ALL_SUPER_PUBLIC_PROTECTED_FIELDS; + + public static final int ALL__BEAN1_METHODS = 4 + ALL_SUPER_METHODS - 1; + + private String field1; + protected String field2; + public String field3; + + public void setMethod1(String param) { + } + + public void setMethod1(int param) { + } + + public void override(String param) throws Exception { + } + + + public void noOverride(String param) throws Exception { + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/Bean2.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/Bean2.java new file mode 100644 index 0000000000..eaba545d8e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/Bean2.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.config; + +import junit.framework.AssertionFailedError; + +import java.util.List; + +public class Bean2 { + + private List methodList; + + public List getMethodList() { + return methodList; + } + + public void setMethodList(List list) { + methodList = list; + } + + private List fieldList; + + public List getfieldList() { + return fieldList; + } + + public void setfieldList(List list) { + throw new AssertionFailedError("setter inadvertantly called"); + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/JavaIntrospectionHelperTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/JavaIntrospectionHelperTestCase.java new file mode 100644 index 0000000000..8a95a6c7b0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/JavaIntrospectionHelperTestCase.java @@ -0,0 +1,163 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.config; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.core.mock.component.Target; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class JavaIntrospectionHelperTestCase extends TestCase { + + public JavaIntrospectionHelperTestCase() { + super(); + } + + public JavaIntrospectionHelperTestCase(String arg0) { + super(arg0); + } + + public void testGetSuperAllFields() throws Exception { + Set<Field> superBeanFields = JavaIntrospectionHelper.getAllFields(SuperBean.class); + Assert.assertEquals(SuperBean.ALL_SUPER_FIELDS, superBeanFields.size()); + } + + public void testBean1AllPublicProtectedFields() throws Exception { + Set<Field> beanFields = JavaIntrospectionHelper.getAllPublicAndProtectedFields(Bean1.class); + Assert.assertEquals(4, beanFields.size()); //Bean1.ALL_BEAN1_PUBLIC_PROTECTED_FIELDS + } + + public void testBean1AllFields() throws Exception { + Set<Field> beanFields = JavaIntrospectionHelper.getAllFields(Bean1.class); + Assert.assertEquals(Bean1.ALL_BEAN1_FIELDS, beanFields.size()); + } + + public void testGetSuperAllMethods() throws Exception { + Set<Method> superBeanMethods = JavaIntrospectionHelper.getAllUniqueMethods(SuperBean.class); + Assert.assertEquals(SuperBean.ALL_SUPER_METHODS, superBeanMethods.size()); + } + + public void testGetBean1AllMethods() throws Exception { + Set<Method> beanMethods = JavaIntrospectionHelper.getAllUniqueMethods(Bean1.class); + Assert.assertEquals(Bean1.ALL__BEAN1_METHODS, beanMethods.size()); + } + + public void testOverrideMethod() throws Exception { + Set<Method> beanFields = JavaIntrospectionHelper.getAllUniqueMethods(Bean1.class); + boolean invoked = false; + for (Method method : beanFields) { + if (method.getName().equals("override")) { + method.invoke(new Bean1(), "foo"); + invoked = true; + } + } + if (!invoked) { + throw new Exception("Override never invoked"); + } + } + + public void testNoOverrideMethod() throws Exception { + Set<Method> beanFields = JavaIntrospectionHelper.getAllUniqueMethods(Bean1.class); + boolean found = false; + for (Method method : beanFields) { + if (method.getName().equals("noOverride") && method.getParameterTypes().length == 0) { + found = true; + } + } + if (!found) { + throw new Exception("No override not found"); + } + } + + public void testGetBean1AllFields() throws Exception { + Set<Field> bean1 = JavaIntrospectionHelper.getAllFields(Bean1.class); + Assert.assertEquals(Bean1.ALL_BEAN1_FIELDS, bean1.size()); + } + + public void testDefaultConstructor() throws Exception { + Constructor ctr = JavaIntrospectionHelper.getDefaultConstructor(Bean2.class); + Assert.assertEquals(ctr, Bean2.class.getConstructor()); + Assert.assertTrue(Bean2.class == ctr.newInstance((Object[]) null).getClass()); + } + + + public void testFindMultiplicityByFieldName() throws Exception{ + Set<Field> fields = JavaIntrospectionHelper.getAllFields(getClass()); + Set<Method> methods = JavaIntrospectionHelper.getAllUniqueMethods(getClass()); + + Assert.assertNotNull(JavaIntrospectionHelper.findMultiplicityFieldByName("testList",fields)); + Assert.assertNotNull(JavaIntrospectionHelper.findMultiplicityMethodByName("fooMethod",methods)); + + // this array is not an interface + Assert.assertNull(JavaIntrospectionHelper.findMultiplicityFieldByName("testStringArray",fields)); + Assert.assertNotNull(JavaIntrospectionHelper.findMultiplicityFieldByName("testArray",fields)); + Assert.assertNotNull(JavaIntrospectionHelper.findMultiplicityMethodByName("setTestArray",methods)); + } + + /** + * Tests generics introspection capabilities + */ + public void testGenerics() throws Exception{ + + List classes = JavaIntrospectionHelper.getGenerics(getClass().getDeclaredField("testList").getGenericType()); + Assert.assertEquals(1,classes.size()); + Assert.assertEquals(String.class,classes.get(0)); + + classes = JavaIntrospectionHelper.getGenerics(getClass().getDeclaredField("testNoGenericsList").getGenericType()); + Assert.assertEquals(0,classes.size()); + + classes = JavaIntrospectionHelper.getGenerics(getClass().getDeclaredField("testMap").getGenericType()); + Assert.assertEquals(2,classes.size()); + Assert.assertEquals(String.class,classes.get(0)); + Assert.assertEquals(Bean1.class,classes.get(1)); + + classes = JavaIntrospectionHelper.getGenerics(getClass().getDeclaredMethod("fooMethod", Map.class).getGenericParameterTypes()[0]); + Assert.assertEquals(2,classes.size()); + Assert.assertEquals(String.class,classes.get(0)); + Assert.assertEquals(Bean1.class,classes.get(1)); + + classes = JavaIntrospectionHelper.getGenerics(getClass().getDeclaredMethod("fooMethod", List.class).getGenericParameterTypes()[0]); + Assert.assertEquals(1,classes.size()); + Assert.assertEquals(String.class,classes.get(0)); + + } + + private List testNoGenericsList; + + private List<String> testList; + + private Map<String,Bean1> testMap; + + private void fooMethod(List<String> foo){ + + } + + private void fooMethod(Map<String, Bean1> foo){ + + } + + private Target[] testArray; + private String[] testStringArray; + + public void setTestArray(Target[] array){} +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/SuperBean.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/SuperBean.java new file mode 100644 index 0000000000..0a4e0cca0c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/SuperBean.java @@ -0,0 +1,48 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.config; + +/** + * @version $Rev: 368822 $ $Date: 2006-01-13 10:54:38 -0800 (Fri, 13 Jan 2006) $ + */ +public class SuperBean { + + public static final int ALL_SUPER_FIELDS = 6; + public static final int ALL_SUPER_PUBLIC_PROTECTED_FIELDS = 5; + + public static final int ALL_SUPER_METHODS = 4; + + private String superField1; + + public String superField2; + + protected String superField3; + + public void setSuperMethod1(String param) { + } + + public void setSuperMethod1(int param) { + } + + public void override(String param) throws Exception { + throw new Exception("Override not handled"); + } + + public void noOverride() throws Exception { + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/CoreAnnotationsProcessingTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/CoreAnnotationsProcessingTestCase.java new file mode 100644 index 0000000000..aeb614e9c6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/CoreAnnotationsProcessingTestCase.java @@ -0,0 +1,173 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.impl; + +import java.util.List; + +import junit.framework.TestCase; +import org.apache.tuscany.core.config.ComponentTypeIntrospector; +import org.apache.tuscany.core.config.JavaIntrospectionHelper; +import org.apache.tuscany.core.config.processor.ProcessorUtils; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Multiplicity; +import org.apache.tuscany.model.assembly.Reference; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.ServiceContract; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class CoreAnnotationsProcessingTestCase extends TestCase { + + private ComponentTypeIntrospector introspector; + private AssemblyFactory factory; + + public void testServiceBasicProcessing() throws Exception { + ComponentType type = factory.createComponentType(); + introspector.introspect(TestComponentImpl.class, type); + assertEquals(1, type.getServices().size()); + ServiceContract contract = type.getServices().get(0).getServiceContract(); + assertEquals(TestComponent.class, contract.getInterface()); + assertEquals(Scope.MODULE, contract.getScope()); + } + + public void testServiceNameSet() throws Exception { + ComponentType type = factory.createComponentType(); + introspector.introspect(TestComponentImpl.class, type); + assertEquals(1, type.getServices().size()); + Service service = type.getServices().get(0); + assertEquals(JavaIntrospectionHelper.getBaseName(TestComponent.class), service.getName()); + } + + /** + * Tests the case where a class implements one interface not marked as with <code>Remotable</code> + */ + public void testSingleServiceProcessing() throws Exception { + ComponentType type = factory.createComponentType(); + introspector.introspect(TestLocalComponentImpl.class, type); + assertEquals(1, type.getServices().size()); + ServiceContract contract = type.getServices().get(0).getServiceContract(); + assertEquals(TestLocalComponent.class, contract.getInterface()); + assertEquals(Scope.MODULE, contract.getScope()); + } + + /** + * Tests the case where an implementation specifies a service interface of its parent as opposed to the + * single interface it directly implements + */ + public void testInteraceHierarchyServiceProcessing() throws Exception { + ComponentType type = factory.createComponentType(); + introspector.introspect(SuperFooImpl.class, type); + assertEquals(1, type.getServices().size()); + ServiceContract contract = type.getServices().get(0).getServiceContract(); + assertEquals(SuperSuperFoo.class, contract.getInterface()); + } + + /** + * Tests the case where a class implements two interfaces, with one specified using <code>@Service</code> + * and one marked with <code>@Remotable</code> + */ + public void testMutlipleServiceProcessing() throws Exception { + ComponentType type = factory.createComponentType(); + introspector.introspect(TestMultipleInterfacesComponentImpl.class, type); + assertEquals(2, type.getServices().size()); + for (Service service : type.getServices()) { + if (!service.getServiceContract().equals(TestComponent.class) && + service.getServiceContract().equals(TestLocalComponent.class)) { + fail("Expected multiple interfaces not found"); + } + } + } + + /** + * Test case when an class implements two non-Remotable interfaces and does not specify one with + * <code>@Service</code> + */ + public void testNonServiceProcessing() throws Exception { + ComponentType type = factory.createComponentType(); + introspector.introspect(TestNonServiceInterfacesImpl.class, type); + assertEquals(1, type.getServices().size()); + ServiceContract contract = type.getServices().get(0).getServiceContract(); + assertEquals(TestNonServiceInterfacesImpl.class, contract.getInterface()); + assertEquals(Scope.MODULE, contract.getScope()); + } + + /** + * Tests the case where a class implements two non-Remotable interfaces, with one specified using + * <code>@Service</code> + */ + public void testNonServiceSpecifiedProcessing() throws Exception { + ComponentType type = factory.createComponentType(); + introspector.introspect(TestNonServiceSpecifiedImpl.class, type); + assertEquals(1, type.getServices().size()); + ServiceContract contract = type.getServices().get(0).getServiceContract(); + assertEquals(TestNonServiceInterface.class, contract.getInterface()); + assertEquals(Scope.MODULE, contract.getScope()); + } + + /** + * Tests the case where a component's scope is specified by its superclass + */ + public void testParentScopeEvaluation() throws Exception { + ComponentType type = factory.createComponentType(); + introspector.introspect(ScopeTestComponent.class, type); + assertEquals(1, type.getServices().size()); + ServiceContract contract = type.getServices().get(0).getServiceContract(); + assertEquals(Scope.MODULE, contract.getScope()); + } + + /** + * FIXME JFM - temporarily disabled until non-annotated properties are fixed public void + * testPropertyProcessing() throws Exception { ComponentType type = factory.createComponentType(); + * introspector.introspect(TestComponentImpl.class, type); List<Property>properties = + * type.getProperties(); assertEquals(3, properties.size()); for (Property property : properties) { if + * (!property.getName().equals("foo") && !property.getName().equals("fooRequired") && + * !property.getName().equals("baz")) { fail("Property names not handled properly"); } if + * (property.getName().equals("fooRequired")) { assertTrue(property.isRequired()); } else { + * assertFalse(property.isRequired()); } } } * + */ + + public void testReferenceProcessing() throws Exception { + ComponentType type = factory.createComponentType(); + introspector.introspect(TestComponentImpl.class, type); + List<Reference>references = type.getReferences(); + assertEquals(5, references.size()); + for (Reference reference : references) { + if (reference.getName().equals("setBarRequired")) { + assertTrue(reference.getMultiplicity() == Multiplicity.ONE_N); + } else if (reference.getName().equals("setBar")) { + assertTrue(reference.getMultiplicity() == Multiplicity.ZERO_N); + } else if (reference.getName().equals("bazRefeference")) { + assertTrue(reference.getMultiplicity() == Multiplicity.ZERO_ONE); + } else if (reference.getName().equals("wombat")) { + assertTrue(reference.getMultiplicity() == Multiplicity.ONE_ONE); + } else if (reference.getName().equals("bar")) { + assertTrue(reference.getMultiplicity() == Multiplicity.ZERO_ONE); + } else { + fail("Reference names not handled properly"); + } + } + } + + + protected void setUp() throws Exception { + super.setUp(); + factory = new SystemAssemblyFactoryImpl(); + introspector = ProcessorUtils.createCoreIntrospector(factory); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/ScopeTestComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/ScopeTestComponent.java new file mode 100644 index 0000000000..1ae24b6b74 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/ScopeTestComponent.java @@ -0,0 +1,24 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.config.impl; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class ScopeTestComponent extends ScopedParent { + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/ScopedParent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/ScopedParent.java new file mode 100644 index 0000000000..0507af1a8a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/ScopedParent.java @@ -0,0 +1,26 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.config.impl; + +import org.osoa.sca.annotations.Scope; + +/** + * @version $$Rev$$ $$Date$$ + */ +@Scope("MODULE") +public class ScopedParent { +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/SuperFoo.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/SuperFoo.java new file mode 100644 index 0000000000..e8a5079184 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/SuperFoo.java @@ -0,0 +1,23 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.config.impl; + +/** + * @version $$Rev$$ $$Date$$ + */ +public interface SuperFoo { +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/SuperFooImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/SuperFooImpl.java new file mode 100644 index 0000000000..1d964cca8d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/SuperFooImpl.java @@ -0,0 +1,26 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.config.impl; + +import org.osoa.sca.annotations.Service; + +/** + * @version $$Rev$$ $$Date$$ + */ +@Service(SuperSuperFoo.class) +public class SuperFooImpl extends SuperSuperFooImpl implements SuperFoo{ +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/SuperSuperFoo.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/SuperSuperFoo.java new file mode 100644 index 0000000000..893c2c5607 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/SuperSuperFoo.java @@ -0,0 +1,23 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.config.impl; + +/** + * @version $$Rev$$ $$Date$$ + */ +public interface SuperSuperFoo { +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/SuperSuperFooImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/SuperSuperFooImpl.java new file mode 100644 index 0000000000..2025dd1cdd --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/SuperSuperFooImpl.java @@ -0,0 +1,20 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.impl; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class SuperSuperFooImpl implements SuperSuperFoo { +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestComponent.java new file mode 100644 index 0000000000..8a462ff405 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestComponent.java @@ -0,0 +1,30 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.config.impl; + +import org.osoa.sca.annotations.Remotable; +import org.osoa.sca.annotations.Scope; + +/** + * @version $$Rev$$ $$Date$$ + */ +@Remotable +@Scope("MODULE") +public interface TestComponent { + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestComponentImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestComponentImpl.java new file mode 100644 index 0000000000..691bf18b3f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestComponentImpl.java @@ -0,0 +1,66 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.impl; + +import java.util.List; + +import org.osoa.sca.annotations.Property; +import org.osoa.sca.annotations.Reference; +import org.osoa.sca.annotations.Service; + +/** + * @version $$Rev$$ $$Date$$ + */ +@Service(interfaces = {TestComponent.class}) +public class TestComponentImpl implements TestComponent { + + @Property + protected String baz; + + @Reference (name="bazRefeference") + protected TestComponent bazRef; + + @Reference (required = true) + protected TestComponent wombat; + + @Property + public void setFoo(String foo){ + + } + + @Property(name = "fooRequired",required = true) + public void setFooRequiredRename(String foo){ + + } + + @Reference + public void bar(String bar){ + + } + + @Reference(name ="setBarRequired", required = true) + public void setBar(List bar){ + + } + + @Reference(name ="setBar", required = false) + public void setBarNonRequired(List bar){ + + } + + public void someSetter(String val){ + + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestLocalComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestLocalComponent.java new file mode 100644 index 0000000000..15b88547f7 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestLocalComponent.java @@ -0,0 +1,29 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.config.impl; + +import org.osoa.sca.annotations.Remotable; +import org.osoa.sca.annotations.Scope; + +/** + * @version $$Rev$$ $$Date$$ + */ +@Scope("MODULE") +public interface TestLocalComponent { + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestLocalComponentImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestLocalComponentImpl.java new file mode 100644 index 0000000000..86aca3b1bf --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestLocalComponentImpl.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.config.impl; + +import java.util.List; + +import org.osoa.sca.annotations.Service; +import org.osoa.sca.annotations.Property; +import org.osoa.sca.annotations.Reference; + +/** + * @version $$Rev$$ $$Date$$ + */ + +public class TestLocalComponentImpl implements TestLocalComponent { + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestMultipleInterfacesComponentImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestMultipleInterfacesComponentImpl.java new file mode 100644 index 0000000000..b395fd5442 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestMultipleInterfacesComponentImpl.java @@ -0,0 +1,29 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.config.impl; + +import org.osoa.sca.annotations.Service; + +/** + * @version $$Rev$$ $$Date$$ + */ + +@Service(interfaces = {TestLocalComponent.class}) +public class TestMultipleInterfacesComponentImpl implements TestComponent, TestLocalComponent { + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestNonServiceInterface.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestNonServiceInterface.java new file mode 100644 index 0000000000..1a595573ae --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestNonServiceInterface.java @@ -0,0 +1,20 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.impl; + +/** + * @version $$Rev$$ $$Date$$ + */ +public interface TestNonServiceInterface { +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestNonServiceInterface2.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestNonServiceInterface2.java new file mode 100644 index 0000000000..8aa6e6cb19 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestNonServiceInterface2.java @@ -0,0 +1,23 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.config.impl; + +/** + * @version $$Rev$$ $$Date$$ + */ +public interface TestNonServiceInterface2 { +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestNonServiceInterfacesImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestNonServiceInterfacesImpl.java new file mode 100644 index 0000000000..4f6f07b239 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestNonServiceInterfacesImpl.java @@ -0,0 +1,23 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.config.impl; + +import org.osoa.sca.annotations.Scope; + +/** + * @version $$Rev$$ $$Date$$ + */ +@Scope("MODULE") +public class TestNonServiceInterfacesImpl implements TestNonServiceInterface, TestNonServiceInterface2{ +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestNonServiceSpecifiedImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestNonServiceSpecifiedImpl.java new file mode 100644 index 0000000000..b8c0d6a7e8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/config/impl/TestNonServiceSpecifiedImpl.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.config.impl; + +import org.osoa.sca.annotations.Scope; +import org.osoa.sca.annotations.Service; + +/** + * @version $$Rev$$ $$Date$$ + */ +@Scope("MODULE") +@Service(TestNonServiceInterface.class) +public class TestNonServiceSpecifiedImpl implements TestNonServiceInterface, TestNonServiceInterface2{ +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/context/AbstractCompositeHierarchyTests.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/context/AbstractCompositeHierarchyTests.java new file mode 100644 index 0000000000..f529595dae --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/context/AbstractCompositeHierarchyTests.java @@ -0,0 +1,109 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.DefaultScopeStrategy; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.mock.MockConfigContext; +import org.apache.tuscany.core.mock.MockFactory; +import org.apache.tuscany.core.mock.component.ModuleScopeSystemComponent; +import org.apache.tuscany.core.mock.component.ModuleScopeSystemComponentImpl; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.Scope; +import org.osoa.sca.ModuleContext; + +import java.util.List; + +/** + * Performs testing of various hierarchical scenarios + * + * @version $Rev$ $Date$ + */ +public abstract class AbstractCompositeHierarchyTests extends TestCase { + protected List<ContextFactoryBuilder> builders; + protected SystemAssemblyFactory factory; + + public void testParentContextIsolation() throws Exception { + CompositeContext parent = createContextHierachy(); + CompositeContext child = (CompositeContext) parent.getContext("test.child"); + Component component = factory.createSystemComponent("TestService1", ModuleScopeSystemComponent.class, ModuleScopeSystemComponentImpl.class, Scope.MODULE); + parent.registerModelObject(component); + EntryPoint ep = MockFactory.createEPSystemBinding("TestService1EP", ModuleScopeSystemComponent.class, "TestService1", component); + parent.registerModelObject(ep); + parent.publish(new ModuleStart(this)); + child.publish(new ModuleStart(this)); + Assert.assertNotNull(parent.getContext("TestService1EP").getInstance(null)); + try { + ((ModuleContext) child).locateService("TestService1EP"); + fail("Expexcted " + ServiceNotFoundException.class.getName()); + } catch (ServiceNotFoundException e) { + // expect exception to be thrown + } + parent.publish(new ModuleStop(this)); + child.publish(new ModuleStop(this)); + parent.stop(); + + } + + /** + * Checks that registration of duplicate named model objects before context start throws an exception + */ + public void testRegisterSameName() throws Exception { + CompositeContext parent = new CompositeContextImpl("test.parent", null, new DefaultScopeStrategy(), + new EventContextImpl(), new MockConfigContext(builders)); + parent.registerModelObject(MockFactory.createSystemCompositeComponent("test.child")); + try { + parent.registerModelObject(MockFactory.createSystemCompositeComponent("test.child")); + parent.start(); + fail("Expected " + DuplicateNameException.class.getName()); + } catch (DuplicateNameException e) { + // expected + } + } + + /** + * Checks that registration of duplicate named model objects after context start throws an exception + */ + public void testRegisterSameNameAfterStart() throws Exception { + CompositeContext parent = new CompositeContextImpl("test.parent", null, new DefaultScopeStrategy(), + new EventContextImpl(), new MockConfigContext(builders)); + parent.registerModelObject(MockFactory.createSystemCompositeComponent("test.child")); + parent.start(); + CompositeContext child = (CompositeContext) parent.getContext("test.child"); + Assert.assertNotNull(child); + try { + parent.registerModelObject(MockFactory.createSystemCompositeComponent("test.child")); + fail("Expected " + DuplicateNameException.class.getName()); + } catch (DuplicateNameException e) { + // expected + } + } + + protected abstract CompositeContext createContextHierachy() throws Exception; + + protected void setUp() throws Exception { + super.setUp(); + factory = new SystemAssemblyFactoryImpl(); + builders = MockFactory.createSystemBuilders(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/context/CompositeContextRegisterTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/context/CompositeContextRegisterTestCase.java new file mode 100644 index 0000000000..b6e7f69daf --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/context/CompositeContextRegisterTestCase.java @@ -0,0 +1,132 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.DefaultScopeStrategy; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.mock.MockConfigContext; +import org.apache.tuscany.core.mock.MockFactory; +import org.apache.tuscany.core.mock.component.GenericSystemComponent; +import org.apache.tuscany.core.mock.component.ModuleScopeSystemComponent; +import org.apache.tuscany.core.mock.component.ModuleScopeSystemComponentImpl; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.Scope; + +import java.util.List; + +/** + * Tests registration of model objects for an composite context + * + * @version $Rev$ $Date$ + */ +public class CompositeContextRegisterTestCase extends TestCase { + private SystemAssemblyFactory factory; + + public void testModuleRegistration() throws Exception { + CompositeContext moduleContext = createContext(); + Module module = MockFactory.createSystemModule(); + moduleContext.registerModelObject(module); + moduleContext.start(); + moduleContext.publish(new ModuleStart(this)); + GenericSystemComponent component = (GenericSystemComponent) moduleContext.getContext("TestService1").getInstance(null); + Assert.assertNotNull(component); + GenericSystemComponent ep = (GenericSystemComponent) moduleContext.getContext("TestService1EP").getInstance(null); + Assert.assertNotNull(ep); + moduleContext.publish(new ModuleStop(this)); + moduleContext.stop(); + } + + public void testModuleRegistrationAfterStart() throws Exception { + CompositeContext moduleContext = createContext(); + moduleContext.start(); + Module module = MockFactory.createSystemModule(); + moduleContext.registerModelObject(module); + moduleContext.publish(new ModuleStart(this)); + GenericSystemComponent component = (GenericSystemComponent) moduleContext.getContext("TestService1").getInstance(null); + Assert.assertNotNull(component); + GenericSystemComponent ep = (GenericSystemComponent) moduleContext.getContext("TestService1EP").getInstance(null); + Assert.assertNotNull(ep); + moduleContext.publish(new ModuleStop(this)); + moduleContext.stop(); + } + + public void testRegistration() throws Exception { + CompositeContext moduleContext = createContext(); + Component component = factory.createSystemComponent("TestService1", ModuleScopeSystemComponent.class, ModuleScopeSystemComponentImpl.class, Scope.MODULE); + moduleContext.registerModelObject(component); + EntryPoint ep = MockFactory.createEPSystemBinding("TestService1EP", ModuleScopeSystemComponent.class, "TestService1", component); + moduleContext.registerModelObject(ep); + moduleContext.start(); + moduleContext.publish(new ModuleStart(this)); + GenericSystemComponent test = (GenericSystemComponent) moduleContext.getContext("TestService1").getInstance(null); + Assert.assertNotNull(test); + GenericSystemComponent testEP = (GenericSystemComponent) moduleContext.getContext("TestService1EP").getInstance(null); + Assert.assertNotNull(testEP); + moduleContext.publish(new ModuleStop(this)); + moduleContext.stop(); + } + + public void testRegistrationAfterStart() throws Exception { + CompositeContext moduleContext = createContext(); + Component component = factory.createSystemComponent("TestService1", ModuleScopeSystemComponent.class, ModuleScopeSystemComponentImpl.class, Scope.MODULE); + moduleContext.start(); + moduleContext.registerModelObject(component); + EntryPoint ep = MockFactory.createEPSystemBinding("TestService1EP", ModuleScopeSystemComponent.class, "TestService1", component); + moduleContext.registerModelObject(ep); + moduleContext.publish(new ModuleStart(this)); + GenericSystemComponent test = (GenericSystemComponent) moduleContext.getContext("TestService1").getInstance(null); + Assert.assertNotNull(test); + GenericSystemComponent testEP = (GenericSystemComponent) moduleContext.getContext("TestService1EP").getInstance(null); + Assert.assertNotNull(testEP); + moduleContext.publish(new ModuleStop(this)); + moduleContext.stop(); + } + + public void testEPRegistrationAfterModuleStart() throws Exception { + CompositeContext moduleContext = createContext(); + Component component = factory.createSystemComponent("TestService1", ModuleScopeSystemComponent.class, ModuleScopeSystemComponentImpl.class, Scope.MODULE); + moduleContext.start(); + moduleContext.registerModelObject(component); + moduleContext.publish(new ModuleStart(this)); + GenericSystemComponent test = (GenericSystemComponent) moduleContext.getContext("TestService1").getInstance(null); + Assert.assertNotNull(test); + EntryPoint ep = MockFactory.createEPSystemBinding("TestService1EP", ModuleScopeSystemComponent.class, "TestService1", component); + moduleContext.registerModelObject(ep); + GenericSystemComponent testEP = (GenericSystemComponent) moduleContext.getContext("TestService1EP").getInstance(null); + Assert.assertNotNull(testEP); + moduleContext.publish(new ModuleStop(this)); + moduleContext.stop(); + } + + protected CompositeContext createContext() { + List<ContextFactoryBuilder> builders = MockFactory.createSystemBuilders(); + return new CompositeContextImpl("test.context", null, new DefaultScopeStrategy(), new EventContextImpl(), + new MockConfigContext(builders)); + } + + protected void setUp() throws Exception { + factory = new SystemAssemblyFactoryImpl(); + super.setUp(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/context/CompositeHierarchyTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/context/CompositeHierarchyTestCase.java new file mode 100644 index 0000000000..bd56a88658 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/context/CompositeHierarchyTestCase.java @@ -0,0 +1,99 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +import junit.framework.Assert; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.DefaultScopeStrategy; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.mock.MockConfigContext; +import org.apache.tuscany.core.mock.MockFactory; +import org.apache.tuscany.core.mock.component.ModuleScopeSystemComponent; +import org.apache.tuscany.core.mock.component.ModuleScopeSystemComponentImpl; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.impl.AssemblyContextImpl; +import org.osoa.sca.ModuleContext; +import org.osoa.sca.ServiceUnavailableException; +import org.osoa.sca.ServiceRuntimeException; + +import java.util.List; + +/** + * Performs testing of various hierarchical scenarios + * + * @version $Rev$ $Date$ + */ +public class CompositeHierarchyTestCase extends AbstractCompositeHierarchyTests { + + /** + * FIXME model Tests adding a component, accessing it and then exposing it as an entry point after the first access + * + * @throws Exception + */ + public void testChildContextIsolation() throws Exception { + CompositeContext parent = createContextHierachy(); + CompositeContext child = (CompositeContext) parent.getContext("test.child"); + Component component = factory.createSystemComponent("TestService1", ModuleScopeSystemComponent.class, ModuleScopeSystemComponentImpl.class, Scope.MODULE); + + component.initialize(new AssemblyContextImpl(factory, null, null)); + child.registerModelObject(component); + parent.publish(new ModuleStart(this)); + child.publish(new ModuleStart(this)); + Assert.assertNotNull(child.getContext("TestService1").getInstance(null)); + try { + ((ModuleContext) parent).locateService("test.child/TestService1"); + fail("Expected " + ServiceUnavailableException.class.getName() + + " since [test.child/TestService1] is not an entry point"); + } catch (ServiceRuntimeException e) { + // should throw an exception since it is not an entry point + } + + // now expose the service as an entry point + // FIXME hack to get around initialization of component - just create another one ;-) + component = factory.createSystemComponent("TestService1", ModuleScopeSystemComponent.class, ModuleScopeSystemComponentImpl.class, Scope.MODULE); + EntryPoint ep = MockFactory.createEPSystemBinding("TestService1EP", ModuleScopeSystemComponent.class, "TestService1", + component); + child.registerModelObject(ep); + Assert.assertNotNull(child.getContext("TestService1EP").getInstance(null)); + Assert.assertNotNull(parent.getContext("test.child").getInstance(new QualifiedName("./TestService1EP"))); + + // now expose the child entry point from the parent context + EntryPoint parentEp = MockFactory.createEntryPointWithStringRef("TestService1EP", ModuleScopeSystemComponent.class, + "TestService1", "test.child/TestService1EP"); + parent.registerModelObject(parentEp); + Assert.assertNotNull(parent.getContext("TestService1EP").getInstance(null)); + + parent.publish(new ModuleStop(this)); + child.publish(new ModuleStop(this)); + parent.stop(); + } + + protected CompositeContext createContextHierachy() throws Exception { + List<ContextFactoryBuilder> systemBuilders = MockFactory.createSystemBuilders(); + CompositeContext parent = new CompositeContextImpl("test.parent", null, new DefaultScopeStrategy(), + new EventContextImpl(), new MockConfigContext(systemBuilders)); + Component component = MockFactory.createCompositeComponent("test.child"); + parent.registerModelObject(component); + parent.start(); + CompositeContext child = (CompositeContext) parent.getContext("test.child"); + Assert.assertNotNull(child); + return parent; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/context/QualifiedNameTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/context/QualifiedNameTestCase.java new file mode 100644 index 0000000000..4f86d1aed5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/context/QualifiedNameTestCase.java @@ -0,0 +1,52 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context; + +import junit.framework.TestCase; + +/** + * Tests parsing of naming patters + * + * @version $Rev$ $Date$ + */ +public class QualifiedNameTestCase extends TestCase { + + public void testSimpleName() throws Exception { + QualifiedName name = new QualifiedName("Foo"); + assertEquals("Foo", name.getPartName()); + assertEquals(null, name.getPortName()); + } + + public void testCompoundName() throws Exception { + QualifiedName name = new QualifiedName("Foo/Bar"); + assertEquals("Foo", name.getPartName()); + assertEquals("Bar", name.getPortName()); + } + + public void testCompoundMultiName() throws Exception { + QualifiedName name = new QualifiedName("Foo/Bar/Baz"); + assertEquals("Foo", name.getPartName()); + assertEquals("Bar/Baz", name.getPortName()); + } + + public void testInvalidName() throws Exception { + try { + QualifiedName name = new QualifiedName("/Foo/Bar"); + fail("Invalid name exception not thrown"); + } catch (InvalidNameException e) { + + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/context/scope/DefaultScopeStrategyTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/context/scope/DefaultScopeStrategyTestCase.java new file mode 100644 index 0000000000..c9e6736833 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/context/scope/DefaultScopeStrategyTestCase.java @@ -0,0 +1,51 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.context.scope; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.model.assembly.Scope; + +/** + * Basic scope strategy tests, including downscope referencing + * + * @version $Rev$ $Date$ + */ +public class DefaultScopeStrategyTestCase extends TestCase { + + public void testDownScopeReferences() throws Exception{ + DefaultScopeStrategy strategy = new DefaultScopeStrategy(); + + Assert.assertTrue(!strategy.downScopeReference(Scope.MODULE,Scope.MODULE)); + Assert.assertTrue(strategy.downScopeReference(Scope.MODULE,Scope.SESSION)); + Assert.assertTrue(strategy.downScopeReference(Scope.MODULE,Scope.REQUEST)); + Assert.assertTrue(strategy.downScopeReference(Scope.MODULE,Scope.INSTANCE)); + + Assert.assertTrue(!strategy.downScopeReference(Scope.SESSION,Scope.MODULE)); + Assert.assertTrue(!strategy.downScopeReference(Scope.SESSION,Scope.SESSION)); + Assert.assertTrue(strategy.downScopeReference(Scope.SESSION,Scope.REQUEST)); + Assert.assertTrue(strategy.downScopeReference(Scope.SESSION,Scope.INSTANCE)); + + Assert.assertTrue(!strategy.downScopeReference(Scope.REQUEST,Scope.MODULE)); + Assert.assertTrue(!strategy.downScopeReference(Scope.REQUEST,Scope.SESSION)); + Assert.assertTrue(!strategy.downScopeReference(Scope.REQUEST,Scope.REQUEST)); + Assert.assertTrue(strategy.downScopeReference(Scope.REQUEST,Scope.INSTANCE)); + + Assert.assertTrue(!strategy.downScopeReference(Scope.REQUEST,Scope.MODULE)); + Assert.assertTrue(!strategy.downScopeReference(Scope.REQUEST,Scope.SESSION)); + Assert.assertTrue(!strategy.downScopeReference(Scope.REQUEST,Scope.REQUEST)); + Assert.assertTrue(!strategy.downScopeReference(Scope.INSTANCE,Scope.INSTANCE)); + } +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/extension/ContextFactorySupportTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/extension/ContextFactorySupportTestCase.java new file mode 100644 index 0000000000..765d6efee4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/extension/ContextFactorySupportTestCase.java @@ -0,0 +1,80 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.extension; + +import junit.framework.TestCase; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.model.assembly.Implementation; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.impl.AtomicImplementationImpl; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class ContextFactorySupportTestCase extends TestCase { + + public void testGenericReflection() throws Exception { + TestFactoryBuilder b = new TestFactoryBuilder(); + assertEquals(TestImplementation.class, b.getImplementationClass()); + } + + public void testNegativeGenericReflection() throws Exception { + try { + new NonGenericFactoryBuilder(); + fail("AssertionError expected on non-genericized subclass of " + ContextFactoryBuilderSupport.class.getName()); + } catch (AssertionError e) { + // indicates success + } + } + + protected void setUp() throws Exception { + super.setUp(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + } + + + private class TestFactoryBuilder extends ContextFactoryBuilderSupport<TestImplementation> { + + + public Class getImplementationClass() { + return implementationClass; + } + + protected ContextFactory createContextFactory(String componentName, TestImplementation implementation, Scope scope) { + return null; + } + } + + private class NonGenericFactoryBuilder extends ContextFactoryBuilderSupport { + + + public Class getImplementationClass() { + return implementationClass; + } + + protected ContextFactory createContextFactory(String componentName, Implementation implementation, Scope scope) { + return null; + } + } + + private class TestImplementation extends AtomicImplementationImpl { + + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/extension/EntryPointBuilderSupportTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/extension/EntryPointBuilderSupportTestCase.java new file mode 100644 index 0000000000..2f911fefa5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/extension/EntryPointBuilderSupportTestCase.java @@ -0,0 +1,78 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.extension; + +import junit.framework.TestCase; +import org.apache.tuscany.core.extension.EntryPointContextFactory; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.model.assembly.Binding; +import org.apache.tuscany.model.assembly.EntryPoint; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class EntryPointBuilderSupportTestCase extends TestCase { + + public void testGenericReflection() throws Exception { + EntryPointBuilderSupportTestCase.TestEntryPointBuilder b = new EntryPointBuilderSupportTestCase.TestEntryPointBuilder(); + assertEquals(EntryPointBuilderSupportTestCase.TestBinding.class, b.getImplementationClass()); + } + + public void testNegativeGenericReflection() throws Exception { + try { + new EntryPointBuilderSupportTestCase.NonGenericFactoryBuilder(); + fail("AssertionError expected on non-genericized subclass of " + ContextFactoryBuilderSupport.class.getName()); + } catch (AssertionError e) { + // indicates success + } + } + + protected void setUp() throws Exception { + super.setUp(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + } + + + private class TestEntryPointBuilder extends EntryPointBuilderSupport<EntryPointBuilderSupportTestCase.TestBinding> { + + public Class getImplementationClass() { + return bindingClass; + } + + protected EntryPointContextFactory createEntryPointContextFactory(EntryPoint entryPoint, MessageFactory msgFactory) { + return null; + } + } + + private class NonGenericFactoryBuilder extends EntryPointBuilderSupport { + + public Class getImplementationClass() { + return bindingClass; + } + + protected EntryPointContextFactory createEntryPointContextFactory(EntryPoint entryPoint, MessageFactory msgFactory) { + return null; + } + } + + private interface TestBinding extends Binding { + + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/extension/ExternalServiceBuilderSupportTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/extension/ExternalServiceBuilderSupportTestCase.java new file mode 100644 index 0000000000..a1c758c526 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/extension/ExternalServiceBuilderSupportTestCase.java @@ -0,0 +1,80 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.extension; + +import junit.framework.TestCase; +import org.apache.tuscany.core.extension.ExternalServiceContextFactory; +import org.apache.tuscany.model.assembly.Binding; +import org.apache.tuscany.model.assembly.ExternalService; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class ExternalServiceBuilderSupportTestCase extends TestCase { + + public void testGenericReflection() throws Exception { + ExternalServiceBuilderSupportTestCase.TestExternalServiceBuilder b = new ExternalServiceBuilderSupportTestCase.TestExternalServiceBuilder(); + assertEquals(ExternalServiceBuilderSupportTestCase.TestBinding.class, b.getImplementationClass()); + } + + public void testNegativeGenericReflection() throws Exception { + try { + new ExternalServiceBuilderSupportTestCase.NonGenericFactoryBuilder(); + fail("AssertionError expected on non-genericized subclass of " + ContextFactoryBuilderSupport.class.getName()); + } catch (AssertionError e) { + // indicates success + } + } + + protected void setUp() throws Exception { + super.setUp(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + } + + + private class TestExternalServiceBuilder extends ExternalServiceBuilderSupport<ExternalServiceBuilderSupportTestCase.TestBinding> { + + + public Class getImplementationClass() { + return bindingClass; + } + + protected ExternalServiceContextFactory createExternalServiceContextFactory(ExternalService externalService) { + return null; + } + } + + private class NonGenericFactoryBuilder extends ExternalServiceBuilderSupport { + + + public Class getImplementationClass() { + return bindingClass; + } + + + protected ExternalServiceContextFactory createExternalServiceContextFactory(ExternalService externalService) { + return null; + } + } + + private interface TestBinding extends Binding { + + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/extension/WireBuilderSupportTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/extension/WireBuilderSupportTestCase.java new file mode 100644 index 0000000000..0fd80c51af --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/extension/WireBuilderSupportTestCase.java @@ -0,0 +1,261 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.extension; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import junit.framework.TestCase; +import org.apache.tuscany.core.builder.ContextCreationException; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.builder.impl.DefaultWireBuilder; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.message.Message; +import org.apache.tuscany.core.wire.Interceptor; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetInvocationConfiguration; +import org.apache.tuscany.core.wire.TargetInvoker; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.core.wire.WireTargetConfiguration; +import org.apache.tuscany.core.wire.jdk.JDKTargetWireFactory; +import org.apache.tuscany.core.wire.mock.MockScopeContext; +import org.apache.tuscany.model.assembly.Implementation; +import org.apache.tuscany.model.assembly.Scope; + +/** + * @version $$Rev$$ $$Date$$ + */ +public class WireBuilderSupportTestCase extends TestCase { + private Method m; + + /** + * Tests that {@link WireBuilderSupport} only processes connect operations and sets target invokers for + * the correct target type. + * <p/> + * Verifies TUSCANY-218 + * + * @throws Exception + */ + public void testTargetInvokerSet() throws Exception { + FooWireBuilder fooBuilder = new FooWireBuilder(); + BarWireBuilder barBuilder = new BarWireBuilder(); + DefaultWireBuilder defaultBuilder = new DefaultWireBuilder(); + defaultBuilder.addWireBuilder(fooBuilder); + defaultBuilder.addWireBuilder(barBuilder); + TargetWireFactory targetFooFactory = new JDKTargetWireFactory(); + Map<Method, TargetInvocationConfiguration> fooConfigs = new HashMap<Method, TargetInvocationConfiguration>(); + TargetInvocationConfiguration fooInvocation = new TargetInvocationConfiguration(m); + fooConfigs.put(m, fooInvocation); + Map<Method, TargetInvocationConfiguration> barConfigs = new HashMap<Method, TargetInvocationConfiguration>(); + TargetInvocationConfiguration barInvocation = new TargetInvocationConfiguration(m); + barConfigs.put(m, barInvocation); + targetFooFactory.setConfiguration(new WireTargetConfiguration(null, fooConfigs, null, null)); + TargetWireFactory targetBarFactory = new JDKTargetWireFactory(); + targetBarFactory.setConfiguration(new WireTargetConfiguration(null, barConfigs, null, null)); + ScopeContext ctx = new MockScopeContext(); + defaultBuilder.completeTargetChain(targetFooFactory, FooContextFactory.class, ctx); + defaultBuilder.completeTargetChain(targetBarFactory, BarContextFactory.class, ctx); + assertEquals(FooInvoker.class, targetFooFactory.getConfiguration().getInvocationConfigurations().get(m).getTargetInvoker().getClass()); + assertEquals(BarInvoker.class, targetBarFactory.getConfiguration().getInvocationConfigurations().get(m).getTargetInvoker().getClass()); + + } + + + protected void setUp() throws Exception { + super.setUp(); + m = SomeInterface.class.getMethod("test", (Class[]) null); + } + + protected void tearDown() throws Exception { + super.tearDown(); + } + + private interface SomeInterface { + void test(); + } + + private interface Foo extends Implementation { + + } + + private interface Bar extends Implementation { + + } + + private class FooWireBuilder extends WireBuilderSupport<FooContextFactory> { + + protected TargetInvoker createInvoker(QualifiedName targetName, Method operation, ScopeContext context, boolean downScope) { + return new FooInvoker(); + } + } + + private class BarWireBuilder extends WireBuilderSupport<BarContextFactory> { + + protected TargetInvoker createInvoker(QualifiedName targetName, Method operation, ScopeContext context, boolean downScope) { + return new BarInvoker(); + } + } + + private class FooInvoker implements TargetInvoker { + + public Object invokeTarget(Object payload) throws InvocationTargetException { + return null; + } + + public boolean isCacheable() { + return false; + } + + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + public Message invoke(Message msg) { + return null; + } + + public void setNext(Interceptor next) { + + } + } + + + private class BarInvoker implements TargetInvoker { + + public Object invokeTarget(Object payload) throws InvocationTargetException { + return null; + } + + public boolean isCacheable() { + return false; + } + + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + public Message invoke(Message msg) { + return null; + } + + public void setNext(Interceptor next) { + + } + } + + private class FooContextFactory implements ContextFactory<AtomicContext> { + + public AtomicContext createContext() throws ContextCreationException { + return null; + } + + public Scope getScope() { + return null; + } + + public String getName() { + return null; + } + + public void addProperty(String propertyName, Object value) { + + } + + public void addTargetWireFactory(String serviceName, TargetWireFactory factory) { + + } + + public TargetWireFactory getTargetWireFactory(String serviceName) { + return null; + } + + public Map getTargetWireFactories() { + return null; + } + + public void addSourceWireFactory(String referenceName, SourceWireFactory factory) { + + } + + public List getSourceWireFactories() { + return null; + } + + public void prepare(CompositeContext parent) { + + } + + public void addSourceWireFactories(String referenceName, Class referenceInterface, List factory, boolean multiplicity) { + + } + } + + + private class BarContextFactory implements ContextFactory<Context> { + public Context createContext() throws ContextCreationException { + return null; + } + + public Scope getScope() { + return null; + } + + public String getName() { + return null; + } + + public void addProperty(String propertyName, Object value) { + + } + + public void addTargetWireFactory(String serviceName, TargetWireFactory factory) { + + } + + public TargetWireFactory getTargetWireFactory(String serviceName) { + return null; + } + + public Map getTargetWireFactories() { + return null; + } + + public void addSourceWireFactory(String referenceName, SourceWireFactory factory) { + + } + + public void addSourceWireFactories(String referenceName, Class referenceInterface, List factory, boolean multiplicity) { + + } + + public List getSourceWireFactories() { + return null; + } + + public void prepare(CompositeContext parent) { + + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/integration/IntraCompositeWireIntegrationTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/integration/IntraCompositeWireIntegrationTestCase.java new file mode 100644 index 0000000000..44be759b69 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/integration/IntraCompositeWireIntegrationTestCase.java @@ -0,0 +1,107 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.integration; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.core.config.ConfigurationException; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.mock.MockFactory; +import org.apache.tuscany.core.mock.component.Source; +import org.apache.tuscany.core.mock.component.Target; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.core.system.assembly.SystemModule; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.core.system.context.SystemCompositeContextImpl; +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.ModuleComponent; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.types.java.JavaServiceContract; + +/** + * Tests intra-composite system wires are properly constructed in the runtime + * + * @version $Rev$ $Date$ + */ +public class IntraCompositeWireIntegrationTestCase extends TestCase { + + + public void testWireConstruction2() throws Exception { + RuntimeContext runtime = MockFactory.createCoreRuntime(); + ModuleComponent moduleComponent = createSystemCompositeComponent("test.system"); + Module module = MockFactory.createSystemModuleWithWiredComponents("system.module",Scope.MODULE, Scope.MODULE); + moduleComponent.setImplementation(module); + runtime.getSystemContext().registerModelObject(moduleComponent); + CompositeContext context = (CompositeContext) runtime.getSystemContext().getContext("test.system"); + context.publish(new ModuleStart(this)); + //context.registerModelObject(module); + Source source = (Source) ((AtomicContext)context.getContext("source")).getTargetInstance(); + Assert.assertNotNull(source); + Target targetRef = source.getTarget(); + Assert.assertNotNull(targetRef); + Target target = (Target) ((AtomicContext)context.getContext("target")).getTargetInstance(); + Assert.assertSame(target, targetRef); + Source source2 = (Source) ((AtomicContext)context.getContext("source")).getTargetInstance(); + Assert.assertSame(target, source2.getTarget()); + context.publish(new ModuleStop(this)); + context.stop(); + } + + private static SystemAssemblyFactory systemFactory = new SystemAssemblyFactoryImpl(); + + /** + * Creates an composite component with the given name + */ + public static ModuleComponent createSystemCompositeComponent(String name) { + ModuleComponent sc = systemFactory.createModuleComponent(); + SystemModule impl = systemFactory.createSystemModule(); + impl.setImplementationClass(SystemCompositeContextImpl.class); + sc.setImplementation(impl); + Service s = systemFactory.createService(); + JavaServiceContract ji = systemFactory.createJavaServiceContract(); + s.setServiceContract(ji); + ji.setScope(Scope.AGGREGATE); + impl.setComponentType(systemFactory.createComponentType()); + impl.getComponentType().getServices().add(s); + sc.setName(name); + sc.setImplementation(impl); + return sc; + } + + + public void testWireConstruction() throws ConfigurationException { + RuntimeContext runtime = MockFactory.createCoreRuntime(); + runtime.getSystemContext().registerModelObject(MockFactory.createSystemCompositeComponent("test.system")); + CompositeContext context = (CompositeContext) runtime.getSystemContext().getContext("test.system"); + + context.publish(new ModuleStart(this)); + context.registerModelObject(MockFactory.createSystemModuleWithWiredComponents("system.module",Scope.MODULE,Scope.MODULE)); + Source source = (Source) ((AtomicContext)context.getContext("source")).getTargetInstance(); + Assert.assertNotNull(source); + Target targetRef = source.getTarget(); + Assert.assertNotNull(targetRef); + Target target = (Target) ((AtomicContext)context.getContext("target")).getTargetInstance(); + Assert.assertSame(target, targetRef); + Source source2 = (Source) ((AtomicContext)context.getContext("source")).getTargetInstance(); + Assert.assertSame(target, source2.getTarget()); + context.publish(new ModuleStop(this)); + context.stop(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/JNDIPropertyFactoryTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/JNDIPropertyFactoryTestCase.java new file mode 100644 index 0000000000..c17d96a145 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/JNDIPropertyFactoryTestCase.java @@ -0,0 +1,210 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader; + +import static javax.naming.Context.INITIAL_CONTEXT_FACTORY; +import java.io.StringReader; +import java.util.Hashtable; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.naming.Context; +import javax.naming.NamingException; +import javax.naming.Name; +import javax.naming.NameClassPair; +import javax.naming.NamingEnumeration; +import javax.naming.Binding; +import javax.naming.NameParser; +import javax.naming.spi.InitialContextFactory; + +import junit.framework.TestCase; + +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.impl.JNDIPropertyFactory; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.Property; +import org.apache.tuscany.model.assembly.impl.AssemblyFactoryImpl; + +/** + * @version $Rev$ $Date$ + */ +@SuppressWarnings({"AccessOfSystemProperties"}) +public class JNDIPropertyFactoryTestCase extends TestCase { + private JNDIPropertyFactory factory; + private XMLInputFactory xmlFactory; + private Property property; + private String oldICF; + + public void testLookup() throws XMLStreamException, ConfigurationLoadException { + String instance = getInstance(String.class, "<foo>foo:/hello</foo>"); + assertEquals("Hello World", instance); + } + + private <T> T getInstance(Class<T> type, String xml) throws XMLStreamException, ConfigurationLoadException { + property.setType(type); + XMLStreamReader reader = xmlFactory.createXMLStreamReader(new StringReader(xml)); + reader.next(); + ObjectFactory<T> objectFactory = (ObjectFactory<T>) factory.createObjectFactory(reader, property); + return objectFactory.getInstance(); + } + + protected void setUp() throws Exception { + super.setUp(); + factory = new JNDIPropertyFactory(); + xmlFactory = XMLInputFactory.newInstance(); + AssemblyFactory assemblyFactory = new AssemblyFactoryImpl(); + property = assemblyFactory.createProperty(); + + oldICF = System.getProperty(INITIAL_CONTEXT_FACTORY); + System.setProperty(INITIAL_CONTEXT_FACTORY, MockContextFactory.class.getName()); + } + + protected void tearDown() throws Exception { + if (oldICF != null) { + System.getProperty(INITIAL_CONTEXT_FACTORY, oldICF); + } + super.tearDown(); + } + + public static class MockContextFactory implements InitialContextFactory { + public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException { + return new MockContext(); + } + } + + public static class MockContext implements Context { + public Object lookup(String name) throws NamingException { + if ("foo:/hello".equals(name)) { + return "Hello World"; + } + throw new AssertionError(); + } + + public Object lookup(Name name) throws NamingException { + throw new UnsupportedOperationException(); + } + + public void bind(Name name, Object obj) throws NamingException { + throw new UnsupportedOperationException(); + } + + public void bind(String name, Object obj) throws NamingException { + throw new UnsupportedOperationException(); + } + + public void rebind(Name name, Object obj) throws NamingException { + throw new UnsupportedOperationException(); + } + + public void rebind(String name, Object obj) throws NamingException { + throw new UnsupportedOperationException(); + } + + public void unbind(Name name) throws NamingException { + throw new UnsupportedOperationException(); + } + + public void unbind(String name) throws NamingException { + throw new UnsupportedOperationException(); + } + + public void rename(Name oldName, Name newName) throws NamingException { + throw new UnsupportedOperationException(); + } + + public void rename(String oldName, String newName) throws NamingException { + throw new UnsupportedOperationException(); + } + + public NamingEnumeration<NameClassPair> list(Name name) throws NamingException { + throw new UnsupportedOperationException(); + } + + public NamingEnumeration<NameClassPair> list(String name) throws NamingException { + throw new UnsupportedOperationException(); + } + + public NamingEnumeration<Binding> listBindings(Name name) throws NamingException { + throw new UnsupportedOperationException(); + } + + public NamingEnumeration<Binding> listBindings(String name) throws NamingException { + throw new UnsupportedOperationException(); + } + + public void destroySubcontext(Name name) throws NamingException { + throw new UnsupportedOperationException(); + } + + public void destroySubcontext(String name) throws NamingException { + throw new UnsupportedOperationException(); + } + + public Context createSubcontext(Name name) throws NamingException { + throw new UnsupportedOperationException(); + } + + public Context createSubcontext(String name) throws NamingException { + throw new UnsupportedOperationException(); + } + + public Object lookupLink(Name name) throws NamingException { + throw new UnsupportedOperationException(); + } + + public Object lookupLink(String name) throws NamingException { + throw new UnsupportedOperationException(); + } + + public NameParser getNameParser(Name name) throws NamingException { + throw new UnsupportedOperationException(); + } + + public NameParser getNameParser(String name) throws NamingException { + throw new UnsupportedOperationException(); + } + + public Name composeName(Name name, Name prefix) throws NamingException { + throw new UnsupportedOperationException(); + } + + public String composeName(String name, String prefix) throws NamingException { + throw new UnsupportedOperationException(); + } + + public Object addToEnvironment(String propName, Object propVal) throws NamingException { + throw new UnsupportedOperationException(); + } + + public Object removeFromEnvironment(String propName) throws NamingException { + throw new UnsupportedOperationException(); + } + + public Hashtable<?, ?> getEnvironment() throws NamingException { + throw new UnsupportedOperationException(); + } + + public void close() throws NamingException { + throw new UnsupportedOperationException(); + } + + public String getNameInNamespace() throws NamingException { + throw new UnsupportedOperationException(); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/MockReaderSupport.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/MockReaderSupport.java new file mode 100644 index 0000000000..542a4d7b2b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/MockReaderSupport.java @@ -0,0 +1,210 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader; + +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.Location; +import javax.xml.namespace.QName; +import javax.xml.namespace.NamespaceContext; + +/** + * Base class for a mock XMLStreamReader. + * + * @version $Rev$ $Date$ + */ +public class MockReaderSupport implements XMLStreamReader { + public QName getName() { + throw new UnsupportedOperationException(); + } + + public Object getProperty(String name) throws IllegalArgumentException { + throw new UnsupportedOperationException(); + } + + public int next() throws XMLStreamException { + throw new UnsupportedOperationException(); + } + + public void require(int i, String name, String name1) throws XMLStreamException { + throw new UnsupportedOperationException(); + } + + public String getElementText() throws XMLStreamException { + throw new UnsupportedOperationException(); + } + + public int nextTag() throws XMLStreamException { + throw new UnsupportedOperationException(); + } + + public boolean hasNext() throws XMLStreamException { + throw new UnsupportedOperationException(); + } + + public void close() throws XMLStreamException { + throw new UnsupportedOperationException(); + } + + public String getNamespaceURI(String name) { + throw new UnsupportedOperationException(); + } + + public boolean isStartElement() { + throw new UnsupportedOperationException(); + } + + public boolean isEndElement() { + throw new UnsupportedOperationException(); + } + + public boolean isCharacters() { + throw new UnsupportedOperationException(); + } + + public boolean isWhiteSpace() { + throw new UnsupportedOperationException(); + } + + public String getAttributeValue(String name, String name1) { + throw new UnsupportedOperationException(); + } + + public int getAttributeCount() { + throw new UnsupportedOperationException(); + } + + public QName getAttributeName(int i) { + throw new UnsupportedOperationException(); + } + + public String getAttributeNamespace(int i) { + throw new UnsupportedOperationException(); + } + + public String getAttributeLocalName(int i) { + throw new UnsupportedOperationException(); + } + + public String getAttributePrefix(int i) { + throw new UnsupportedOperationException(); + } + + public String getAttributeType(int i) { + throw new UnsupportedOperationException(); + } + + public String getAttributeValue(int i) { + throw new UnsupportedOperationException(); + } + + public boolean isAttributeSpecified(int i) { + throw new UnsupportedOperationException(); + } + + public int getNamespaceCount() { + throw new UnsupportedOperationException(); + } + + public String getNamespacePrefix(int i) { + throw new UnsupportedOperationException(); + } + + public String getNamespaceURI(int i) { + throw new UnsupportedOperationException(); + } + + public NamespaceContext getNamespaceContext() { + throw new UnsupportedOperationException(); + } + + public int getEventType() { + throw new UnsupportedOperationException(); + } + + public String getText() { + throw new UnsupportedOperationException(); + } + + public char[] getTextCharacters() { + throw new UnsupportedOperationException(); + } + + public int getTextCharacters(int i, char[] chars, int i1, int i2) throws XMLStreamException { + throw new UnsupportedOperationException(); + } + + public int getTextStart() { + throw new UnsupportedOperationException(); + } + + public int getTextLength() { + throw new UnsupportedOperationException(); + } + + public String getEncoding() { + throw new UnsupportedOperationException(); + } + + public boolean hasText() { + throw new UnsupportedOperationException(); + } + + public Location getLocation() { + throw new UnsupportedOperationException(); + } + + public String getLocalName() { + throw new UnsupportedOperationException(); + } + + public boolean hasName() { + throw new UnsupportedOperationException(); + } + + public String getNamespaceURI() { + throw new UnsupportedOperationException(); + } + + public String getPrefix() { + throw new UnsupportedOperationException(); + } + + public String getVersion() { + throw new UnsupportedOperationException(); + } + + public boolean isStandalone() { + throw new UnsupportedOperationException(); + } + + public boolean standaloneSet() { + throw new UnsupportedOperationException(); + } + + public String getCharacterEncodingScheme() { + throw new UnsupportedOperationException(); + } + + public String getPITarget() { + throw new UnsupportedOperationException(); + } + + public String getPIData() { + throw new UnsupportedOperationException(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/StAXLoaderRegistryTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/StAXLoaderRegistryTestCase.java new file mode 100644 index 0000000000..177e4e5005 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/StAXLoaderRegistryTestCase.java @@ -0,0 +1,145 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader; + +import java.util.List; +import java.util.ArrayList; +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamException; + +import junit.framework.TestCase; + +import org.apache.tuscany.core.loader.impl.StAXLoaderRegistryImpl; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyInitializationException; +import org.apache.tuscany.model.assembly.AssemblyVisitor; +import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl; + +/** + * @version $Rev$ $Date$ + */ +public class StAXLoaderRegistryTestCase extends TestCase { + private StAXLoaderRegistryImpl registry; + private MockElementLoader loader; + private MockObject mockObject; + private MockReader reader; + private MockMonitor monitor; + private QName qname; + private ResourceLoaderImpl rl; + private LoaderContext loaderContext; + + public void testRegistrationEvents() throws XMLStreamException, ConfigurationLoadException { + reader.name = qname; + registry.registerLoader(qname, loader); + assertTrue(monitor.registered.contains(qname)); + assertEquals(1, monitor.registered.size()); + assertTrue(monitor.unregistered.isEmpty()); + assertTrue(monitor.loading.isEmpty()); + + registry.unregisterLoader(qname, loader); + assertTrue(monitor.registered.contains(qname)); + assertEquals(1, monitor.registered.size()); + assertTrue(monitor.unregistered.contains(qname)); + assertEquals(1, monitor.unregistered.size()); + assertTrue(monitor.loading.isEmpty()); + } + + public void testSuccessfulLoad() throws XMLStreamException, ConfigurationLoadException { + reader.name = qname; + registry.registerLoader(qname, loader); + assertSame(mockObject, registry.load(reader, loaderContext)); + assertEquals(1, monitor.loading.size()); + assertTrue(monitor.loading.contains(qname)); + } + + public void testFailedLoad() throws XMLStreamException, ConfigurationLoadException { + registry.registerLoader(qname, loader); + reader.name = new QName("foo"); + try { + registry.load(reader, loaderContext); + fail(); + } catch (ConfigurationLoadException e) { + assertEquals(1, monitor.loading.size()); + assertTrue(monitor.loading.contains(reader.name)); + } + } + + protected void setUp() throws Exception { + super.setUp(); + qname = new QName("test"); + monitor = new MockMonitor(); + registry = new StAXLoaderRegistryImpl(); + registry.setMonitor(monitor); + mockObject = new MockObject(); + loader = new MockElementLoader(); + reader = new MockReader(); + rl = new ResourceLoaderImpl(getClass().getClassLoader()); + loaderContext = new LoaderContext(rl); + } + + public static class MockMonitor implements StAXLoaderRegistryImpl.Monitor { + private List<QName> registered = new ArrayList<QName>(); + private List<QName> unregistered = new ArrayList<QName>(); + private List<QName> loading = new ArrayList<QName>(); + + public void registeringLoader(QName xmlType) { + registered.add(xmlType); + } + + public void unregisteringLoader(QName xmlType) { + unregistered.add(xmlType); + } + + public void elementLoad(QName xmlType) { + loading.add(xmlType); + } + } + + @SuppressWarnings({"NonStaticInnerClassInSecureContext"}) + public class MockElementLoader<MockObject> implements StAXElementLoader { + public AssemblyObject load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + assertEquals(qname, reader.getName()); + assertSame(rl, loaderContext.getResourceLoader()); + return mockObject; + } + } + + public static class MockObject implements AssemblyObject { + public void initialize(AssemblyContext modelContext) throws AssemblyInitializationException { + throw new UnsupportedOperationException(); + } + + public void freeze() { + throw new UnsupportedOperationException(); + } + + public boolean accept(AssemblyVisitor visitor) { + throw new UnsupportedOperationException(); + } + } + + private static class MockReader extends MockReaderSupport { + private QName name; + + public QName getName() { + return name; + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/StringParserPropertyFactoryTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/StringParserPropertyFactoryTestCase.java new file mode 100644 index 0000000000..0efe1ae82a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/StringParserPropertyFactoryTestCase.java @@ -0,0 +1,111 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader; + +import junit.framework.TestCase; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.loader.impl.StringParserPropertyFactory; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.Property; +import org.apache.tuscany.model.assembly.impl.AssemblyFactoryImpl; + +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import java.beans.PropertyEditorManager; +import java.beans.PropertyEditorSupport; +import java.io.StringReader; +import java.net.URI; +import java.util.Arrays; + +/** + * @version $Rev$ $Date$ + */ +public class StringParserPropertyFactoryTestCase extends TestCase { + private StringParserPropertyFactory factory; + private XMLInputFactory xmlFactory; + private Property property; + + public void testSimpleString() throws XMLStreamException, ConfigurationLoadException { + String instance = getInstance(String.class, "<foo>Hello World</foo>"); + assertEquals("Hello World", instance); + } + + public void testByteArray() throws XMLStreamException, ConfigurationLoadException { + byte[] instance = getInstance(byte[].class, "<foo>01020304</foo>"); + assertTrue(Arrays.equals(new byte[]{1, 2, 3, 4}, instance)); + } + + public void testInteger() throws XMLStreamException, ConfigurationLoadException { + Integer instance = getInstance(Integer.class, "<foo>1234</foo>"); + assertEquals(Integer.valueOf(1234), instance); + } + + public void testInt() throws XMLStreamException, ConfigurationLoadException { + int instance = getInstance(Integer.TYPE, "<foo>1234</foo>"); + assertEquals(1234, instance); + } + + public void testBoolean() throws XMLStreamException, ConfigurationLoadException { + Boolean instance = getInstance(Boolean.class, "<foo>true</foo>"); + assertSame(Boolean.TRUE, instance); + } + + public void testConstructor() throws XMLStreamException, ConfigurationLoadException { + // java.net.URI has a ctr that takes a String + URI instance = getInstance(URI.class, "<foo>http://www.apache.org</foo>"); + assertEquals(URI.create("http://www.apache.org"), instance); + } + + public void testPropertyEditor() throws XMLStreamException, ConfigurationLoadException { + // register a property editor for java.lang.Class + PropertyEditorManager.registerEditor(Class.class, ClassEditor.class); + try { + Class<?> instance = getInstance(Class.class, "<foo>java.lang.Integer</foo>"); + assertEquals(Integer.class, instance); + } finally{ + PropertyEditorManager.registerEditor(Class.class, null); + } + } + + private <T> T getInstance(Class<T> type, String xml) throws XMLStreamException, ConfigurationLoadException { + property.setType(type); + XMLStreamReader reader = xmlFactory.createXMLStreamReader(new StringReader(xml)); + reader.next(); + ObjectFactory<T> objectFactory = (ObjectFactory<T>) factory.createObjectFactory(reader, property); + return objectFactory.getInstance(); + } + + protected void setUp() throws Exception { + super.setUp(); + factory = new StringParserPropertyFactory(); + xmlFactory = XMLInputFactory.newInstance(); + AssemblyFactory assemblyFactory = new AssemblyFactoryImpl(); + property = assemblyFactory.createProperty(); + } + + public static class ClassEditor extends PropertyEditorSupport { + public void setAsText(String text) throws IllegalArgumentException { + try { + setValue(Class.forName(text)); + } catch (ClassNotFoundException e) { + throw new IllegalArgumentException(text); + } + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/ComponentLoaderTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/ComponentLoaderTestCase.java new file mode 100644 index 0000000000..37056b3283 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/ComponentLoaderTestCase.java @@ -0,0 +1,151 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import java.util.List; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.config.ComponentTypeIntrospector; +import org.apache.tuscany.core.config.ConfigurationException; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.extension.config.ImplementationProcessor; +import org.apache.tuscany.core.config.impl.Java5ComponentTypeIntrospector; +import org.apache.tuscany.core.config.processor.ProcessorUtils; +import org.apache.tuscany.core.injection.SingletonObjectFactory; +import org.apache.tuscany.core.loader.StAXPropertyFactory; +import org.apache.tuscany.core.loader.impl.StringParserPropertyFactory; +import org.apache.tuscany.core.system.assembly.SystemImplementation; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.ConfiguredProperty; +import org.apache.tuscany.model.assembly.Property; +import org.apache.tuscany.model.assembly.AtomicComponent; + +/** + * @version $Rev$ $Date$ + */ +public class ComponentLoaderTestCase extends LoaderTestSupport { + private ComponentLoader loader; + private ComponentTypeIntrospector introspector; + + public void testStringProperty() throws XMLStreamException, ConfigurationLoadException { + String xml = "<properties><propString>HelloWorld</propString></properties>"; + Component component = createFooComponent(); + loadProperties(xml, component); + ConfiguredProperty prop = component.getConfiguredProperty("propString"); + assertEquals("HelloWorld", prop.getValue()); + } + + public void testIntProperty() throws XMLStreamException, ConfigurationLoadException { + String xml = "<properties><propInt>1234</propInt></properties>"; + Component component = createFooComponent(); + loadProperties(xml, component); + ConfiguredProperty prop = component.getConfiguredProperty("propInt"); + assertEquals(1234, prop.getValue()); + } + + public void testIntegerProperty() throws XMLStreamException, ConfigurationLoadException { + String xml = "<properties><propInteger>1234</propInteger></properties>"; + Component component = createFooComponent(); + loadProperties(xml, component); + ConfiguredProperty prop = component.getConfiguredProperty("propInteger"); + assertEquals(Integer.valueOf(1234), prop.getValue()); + } + + public void testCustomProperty() throws XMLStreamException, ConfigurationLoadException { + String xml = "<properties><propFoo factory='" + FooFactory.class.getName() + "'><name>Hello</name></propFoo></properties>"; + Component component = createFooComponent(); + loadProperties(xml, component); + ConfiguredProperty prop = component.getConfiguredProperty("propFoo"); + Foo instance = (Foo) prop.getValue(); + assertEquals("Hello", instance.name); + } + + private void loadProperties(String xml, Component component) throws XMLStreamException, ConfigurationLoadException { + XMLStreamReader reader = getReader(xml); + loader.loadProperties(reader, resourceLoader, component); + component.initialize(modelContext); + } + + private Component createFooComponent() { + SystemImplementation impl = assemblyFactory.createSystemImplementation(); + impl.setImplementationClass(ServiceImpl.class); + try { + impl.setComponentType(introspector.introspect(ServiceImpl.class)); + } catch (ConfigurationException e) { + throw new AssertionError(); + } + impl.initialize(null); + AtomicComponent component = assemblyFactory.createSimpleComponent(); + component.setImplementation(impl); + return component; + } + + protected void setUp() throws Exception { + super.setUp(); + loader = new ComponentLoader(); + loader.setFactory(assemblyFactory); + loader.setDefaultPropertyFactory(new StringParserPropertyFactory()); + introspector = ProcessorUtils.createCoreIntrospector(assemblyFactory); + } + + public static interface Service { + } + + public static class ServiceImpl implements Service { + public String propString; + public int propInt; + public Integer propInteger; + public Foo propFoo; + } + + public static class Foo { + public Foo() { + } + + private String name; + private Foo foo; + + public void setName(String val) { + name = val; + } + + public void setFoo(Foo val) { + foo = val; + } +/* + + private MyJaxBThing jaxBThing; + + public void setMyJaxBThing(MyJaxBThing thing) { + jaxBthing = thing; + } +*/ + } + + public static class FooFactory implements StAXPropertyFactory<Foo> { + public ObjectFactory<Foo> createObjectFactory(XMLStreamReader reader, Property property) throws XMLStreamException, ConfigurationLoadException { + reader.nextTag(); + String name = reader.getElementText(); + reader.next(); + Foo foo = new Foo(); + foo.setName(name); + return new SingletonObjectFactory<Foo>(foo); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/ComponentTypeLoaderTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/ComponentTypeLoaderTestCase.java new file mode 100644 index 0000000000..43b5bec143 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/ComponentTypeLoaderTestCase.java @@ -0,0 +1,49 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Service; + +/** + * @version $Rev$ $Date$ + */ +public class ComponentTypeLoaderTestCase extends LoaderTestSupport { + + public void testMinimal() throws XMLStreamException, ConfigurationLoadException { + XMLStreamReader reader = getReader("<componentType xmlns='http://www.osoa.org/xmlns/sca/0.9'><service name='service1'/></componentType>"); + ComponentType type = (ComponentType) registry.load(reader, loaderContext); + type.initialize(null); + assertNotNull(type); + assertEquals(1, type.getServices().size()); + Service service = type.getService("service1"); + assertEquals("service1", service.getName()); + assertEquals(XMLStreamConstants.END_DOCUMENT, reader.next()); + } + + protected void setUp() throws Exception { + super.setUp(); + registerLoader(new ComponentTypeLoader()); + registerLoader(new ServiceLoader()); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/EntryPointLoaderTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/EntryPointLoaderTestCase.java new file mode 100644 index 0000000000..8f207261fb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/EntryPointLoaderTestCase.java @@ -0,0 +1,63 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import static org.apache.tuscany.core.loader.assembly.AssemblyConstants.ENTRY_POINT; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.types.java.JavaServiceContract; + +/** + * @version $Rev$ $Date$ + */ +public class EntryPointLoaderTestCase extends LoaderTestSupport { + + public void testMinimal() throws XMLStreamException, ConfigurationLoadException { + String xml = "<entryPoint xmlns='http://www.osoa.org/xmlns/sca/0.9' name='test'></entryPoint>"; + XMLStreamReader reader = getReader(xml); + EntryPoint ep = (EntryPoint) registry.load(reader, loaderContext); + reader.require(XMLStreamConstants.END_ELEMENT, ENTRY_POINT.getNamespaceURI(), ENTRY_POINT.getLocalPart()); + assertEquals(XMLStreamConstants.END_DOCUMENT, reader.next()); + assertNotNull(ep); + assertEquals("test", ep.getName()); + } + + public void testInterface() throws XMLStreamException, ConfigurationLoadException { + String interfaceName = MockService.class.getName(); + String xml = "<entryPoint xmlns='http://www.osoa.org/xmlns/sca/0.9' name='test'><interface.java interface='" + interfaceName + "'/></entryPoint>"; + XMLStreamReader reader = getReader(xml); + EntryPoint ep = (EntryPoint) registry.load(reader, loaderContext); + reader.require(XMLStreamConstants.END_ELEMENT, ENTRY_POINT.getNamespaceURI(), ENTRY_POINT.getLocalPart()); + assertEquals(XMLStreamConstants.END_DOCUMENT, reader.next()); + assertNotNull(ep); + assertEquals("test", ep.getName()); + ConfiguredService configuredService = ep.getConfiguredService(); + JavaServiceContract serviceContract = (JavaServiceContract) configuredService.getPort().getServiceContract(); + assertEquals(interfaceName, serviceContract.getInterfaceName()); + } + + protected void setUp() throws Exception { + super.setUp(); + registerLoader(new EntryPointLoader()); + registerLoader(new InterfaceJavaLoader()); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/ExternalServiceLoaderTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/ExternalServiceLoaderTestCase.java new file mode 100644 index 0000000000..1fc5b367d5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/ExternalServiceLoaderTestCase.java @@ -0,0 +1,64 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import static org.apache.tuscany.core.loader.assembly.AssemblyConstants.EXTERNAL_SERVICE; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamConstants; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.ExternalService; +import org.apache.tuscany.model.types.java.JavaServiceContract; + +/** + * @version $Rev$ $Date$ + */ +public class ExternalServiceLoaderTestCase extends LoaderTestSupport { + + public void testMinimal() throws XMLStreamException, ConfigurationLoadException { + String xml = "<externalService xmlns='http://www.osoa.org/xmlns/sca/0.9' name='test'></externalService>"; + XMLStreamReader reader = getReader(xml); + ExternalService es = (ExternalService) registry.load(reader, loaderContext); + assertNotNull(es); + assertEquals("test", es.getName()); + reader.require(XMLStreamConstants.END_ELEMENT, EXTERNAL_SERVICE.getNamespaceURI(), EXTERNAL_SERVICE.getLocalPart()); + assertEquals(XMLStreamConstants.END_DOCUMENT, reader.next()); + } + + public void testInterface() throws XMLStreamException, ConfigurationLoadException { + String interfaceName = MockService.class.getName(); + String xml = "<externalService xmlns='http://www.osoa.org/xmlns/sca/0.9' name='test'><interface.java interface='" + interfaceName + "'/></externalService>"; + XMLStreamReader reader = getReader(xml); + ExternalService es = (ExternalService) registry.load(reader, loaderContext); + reader.require(XMLStreamConstants.END_ELEMENT, EXTERNAL_SERVICE.getNamespaceURI(), EXTERNAL_SERVICE.getLocalPart()); + assertEquals(XMLStreamConstants.END_DOCUMENT, reader.next()); + assertNotNull(es); + assertEquals("test", es.getName()); + ConfiguredService configuredService = es.getConfiguredService(); + JavaServiceContract serviceContract = (JavaServiceContract) configuredService.getPort().getServiceContract(); + assertEquals(interfaceName, serviceContract.getInterfaceName()); + } + + protected void setUp() throws Exception { + super.setUp(); + registerLoader(new ExternalServiceLoader()); + registerLoader(new InterfaceJavaLoader()); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/InterfaceWSDLLoaderInterfaceStylesTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/InterfaceWSDLLoaderInterfaceStylesTestCase.java new file mode 100644 index 0000000000..8b4f840f71 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/InterfaceWSDLLoaderInterfaceStylesTestCase.java @@ -0,0 +1,101 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import static org.apache.tuscany.core.loader.assembly.AssemblyConstants.INTERFACE_WSDL; + +import java.io.InputStream; +import java.net.URL; + +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl; +import org.apache.tuscany.core.loader.impl.WSDLDefinitionRegistryImpl; +import org.apache.tuscany.model.types.wsdl.WSDLServiceContract; +import org.apache.tuscany.sdo.util.SDOUtil; + +import commonj.sdo.helper.XSDHelper; + +/** + * @version $Rev$ $Date$ + */ +public class InterfaceWSDLLoaderInterfaceStylesTestCase extends LoaderTestSupport { + private WSDLDefinitionRegistryImpl wsdlRegistry; + private ResourceLoader resourceLoader; + private ClassLoader oldCL; + + public void testInterface() throws Exception { + wsdlRegistry.loadDefinition("http://www.interfacestyles.org", getClass().getResource("interfacestyles.wsdl"), resourceLoader); + String xml = "<interface.wsdl xmlns='http://www.osoa.org/xmlns/sca/0.9' interface='http://www.interfacestyles.org#TestInterfaceStylesService'></interface.wsdl>"; + XMLStreamReader reader = getReader(xml); + WSDLServiceContract sc = (WSDLServiceContract) registry.load(reader, loaderContext); + reader.require(XMLStreamConstants.END_ELEMENT, INTERFACE_WSDL.getNamespaceURI(), INTERFACE_WSDL.getLocalPart()); + assertEquals(XMLStreamConstants.END_DOCUMENT, reader.next()); + assertNotNull(sc); + + sc.initialize(modelContext); + + Class scInterface = sc.getInterface(); + assertNotNull(scInterface); + + assertNotNull(scInterface.getMethod("getAccountReportWrapped0", new Class[0])); + assertNotNull(scInterface.getMethod("getAccountReportWrapped1", new Class[] {String.class})); + assertNotNull(scInterface.getMethod("getAccountReportWrappedN", new Class[] {String.class, int.class})); + assertNotNull(scInterface.getMethod("getAccountReportBare0", new Class[0])); + assertNotNull(scInterface.getMethod("getAccountReportBare1Simple", new Class[]{String.class})); + assertNotNull(scInterface.getMethod("getAccountReportBare1Complex", new Class[]{Object.class})); + + } + + protected void setUp() throws Exception { + oldCL = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); + resourceLoader = new ResourceLoaderImpl(getClass().getClassLoader()); + super.setUp(); + + wsdlRegistry = new WSDLDefinitionRegistryImpl(); + wsdlRegistry.setMonitor(NULL_MONITOR); + URL wsdlURL = getClass().getResource("interfacestyles.wsdl"); + wsdlRegistry.loadDefinition("http://www.interfacestyles.org", wsdlURL, resourceLoader); + InterfaceWSDLLoader loader = new InterfaceWSDLLoader(); + loader.setWsdlRegistry(wsdlRegistry); + registerLoader(loader); + + InputStream xsdInputStream = wsdlURL.openStream(); + try { + XSDHelper xsdHelper = SDOUtil.createXSDHelper(modelContext.getTypeHelper()); + xsdHelper.define(xsdInputStream, null); + } finally { + xsdInputStream.close(); + } + } + + protected void tearDown() throws Exception { + Thread.currentThread().setContextClassLoader(oldCL); + super.tearDown(); + } + + private static final WSDLDefinitionRegistryImpl.Monitor NULL_MONITOR = new WSDLDefinitionRegistryImpl.Monitor() { + public void readingWSDL(String namespace, URL location) { + } + + public void cachingDefinition(String namespace, URL location) { + } + }; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/InterfaceWSDLLoaderTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/InterfaceWSDLLoaderTestCase.java new file mode 100644 index 0000000000..f97f13a1f7 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/InterfaceWSDLLoaderTestCase.java @@ -0,0 +1,88 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import java.net.URL; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import static org.apache.tuscany.core.loader.assembly.AssemblyConstants.INTERFACE_WSDL; +import org.apache.tuscany.core.loader.impl.WSDLDefinitionRegistryImpl; +import org.apache.tuscany.model.types.wsdl.WSDLServiceContract; + +/** + * @version $Rev$ $Date$ + */ +public class InterfaceWSDLLoaderTestCase extends LoaderTestSupport { + private WSDLDefinitionRegistryImpl wsdlRegistry; + private ResourceLoader resourceLoader; + + public void testMinimal() throws XMLStreamException, ConfigurationLoadException { + String xml = "<interface.wsdl xmlns='http://www.osoa.org/xmlns/sca/0.9'></interface.wsdl>"; + XMLStreamReader reader = getReader(xml); + WSDLServiceContract sc = (WSDLServiceContract) registry.load(reader, loaderContext); + reader.require(XMLStreamConstants.END_ELEMENT, INTERFACE_WSDL.getNamespaceURI(), INTERFACE_WSDL.getLocalPart()); + assertEquals(XMLStreamConstants.END_DOCUMENT, reader.next()); + assertNotNull(sc); + } + + public void testInterface() throws Exception { + wsdlRegistry.loadDefinition("http://www.example.org", getClass().getResource("example.wsdl"), resourceLoader); + String xml = "<interface.wsdl xmlns='http://www.osoa.org/xmlns/sca/0.9' interface='http://www.example.org#HelloWorld'></interface.wsdl>"; + XMLStreamReader reader = getReader(xml); + WSDLServiceContract sc = (WSDLServiceContract) registry.load(reader, loaderContext); + reader.require(XMLStreamConstants.END_ELEMENT, INTERFACE_WSDL.getNamespaceURI(), INTERFACE_WSDL.getLocalPart()); + assertEquals(XMLStreamConstants.END_DOCUMENT, reader.next()); + assertNotNull(sc); + } + + public void testInterfaceWithLocation() throws Exception { + wsdlRegistry.loadDefinition("http://www.example.org", getClass().getResource("example.wsdl"), resourceLoader); + String xml = "<interface.wsdl xmlns='http://www.osoa.org/xmlns/sca/0.9' xmlns:wsdli='http://www.w3.org/2006/01/wsdl-instance' " + + "wsdli:wsdlLocation='http://www.example.org " + getClass().getResource("example.wsdl") + "' "+ + "interface='http://www.example.org#HelloWorld'"+ + "></interface.wsdl>"; + XMLStreamReader reader = getReader(xml); + WSDLServiceContract sc = (WSDLServiceContract) registry.load(reader, loaderContext); + reader.require(XMLStreamConstants.END_ELEMENT, INTERFACE_WSDL.getNamespaceURI(), INTERFACE_WSDL.getLocalPart()); + assertEquals(XMLStreamConstants.END_DOCUMENT, reader.next()); + assertNotNull(sc); + } + + protected void setUp() throws Exception { + super.setUp(); + wsdlRegistry = new WSDLDefinitionRegistryImpl(); + wsdlRegistry.setMonitor(NULL_MONITOR); + resourceLoader = new ResourceLoaderImpl(getClass().getClassLoader()); + wsdlRegistry.loadDefinition("http://www.example.org", getClass().getResource("example.wsdl"), resourceLoader); + InterfaceWSDLLoader loader = new InterfaceWSDLLoader(); + loader.setWsdlRegistry(wsdlRegistry); + registerLoader(loader); + } + + private static final WSDLDefinitionRegistryImpl.Monitor NULL_MONITOR = new WSDLDefinitionRegistryImpl.Monitor() { + public void readingWSDL(String namespace, URL location) { + } + + public void cachingDefinition(String namespace, URL location) { + } + }; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/LoaderTestSupport.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/LoaderTestSupport.java new file mode 100644 index 0000000000..4e2aea5e83 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/LoaderTestSupport.java @@ -0,0 +1,82 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import java.io.StringReader; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.namespace.QName; + +import junit.framework.TestCase; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.core.loader.impl.StAXLoaderRegistryImpl; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.impl.AssemblyContextImpl; + +/** + * Base class for loader tests with common fixture elements. + * + * @version $Rev$ $Date$ + */ +public abstract class LoaderTestSupport extends TestCase { + protected SystemAssemblyFactory assemblyFactory; + protected ResourceLoader resourceLoader; + protected LoaderContext loaderContext; + protected AssemblyContext modelContext; + protected XMLInputFactory xmlFactory; + protected StAXLoaderRegistryImpl registry; + + protected static final StAXLoaderRegistryImpl.Monitor NULL_MONITOR = new StAXLoaderRegistryImpl.Monitor() { + public void registeringLoader(QName xmlType) { + } + + public void unregisteringLoader(QName xmlType) { + } + + public void elementLoad(QName xmlType) { + } + }; + + protected void setUp() throws Exception { + super.setUp(); + assemblyFactory = new SystemAssemblyFactoryImpl(); + resourceLoader = new ResourceLoaderImpl(getClass().getClassLoader()); + loaderContext = new LoaderContext(resourceLoader); + modelContext = new AssemblyContextImpl(assemblyFactory, null, resourceLoader); + xmlFactory = XMLInputFactory.newInstance(); + registry = new StAXLoaderRegistryImpl(); + registry.setMonitor(NULL_MONITOR); + } + + protected XMLStreamReader getReader(String xml) throws XMLStreamException { + XMLStreamReader reader = xmlFactory.createXMLStreamReader(new StringReader(xml)); + reader.next(); + return reader; + } + + protected void registerLoader(AbstractLoader<?> loader) { + loader.setFactory(assemblyFactory); + loader.setRegistry(registry); + loader.start(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/MockService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/MockService.java new file mode 100644 index 0000000000..c1ea3dbc1e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/MockService.java @@ -0,0 +1,23 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +/** + * @version $Rev$ $Date$ + */ +public interface MockService { +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/WSDLDefinitionRegistryTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/WSDLDefinitionRegistryTestCase.java new file mode 100644 index 0000000000..5543a41f91 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/WSDLDefinitionRegistryTestCase.java @@ -0,0 +1,76 @@ +/** + * + * Copyright 2006 The Apache Software Foundation or its licensors as applicable + * + * Licensed 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.core.loader.assembly; + +import java.net.URL; +import java.io.IOException; + +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.xml.namespace.QName; + +import junit.framework.TestCase; +import org.apache.tuscany.core.loader.impl.WSDLDefinitionRegistryImpl; +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl; + +/** + * @version $Rev$ $Date$ + */ +public class WSDLDefinitionRegistryTestCase extends TestCase { + private static final String NS = "http://www.example.org"; + private WSDLDefinitionRegistryImpl wsdlRegistry; + private ResourceLoader rl; + + + public void testLoadFromAbsoluteWSDLLocation() { + try { + Definition def = wsdlRegistry.loadDefinition(NS + ' ' + rl.getResource("org/apache/tuscany/core/loader/assembly/example.wsdl"), rl); + assertNotNull(def.getPortType(new QName(NS, "HelloWorld"))); + } catch (IOException e) { + fail(e.getMessage()); + } catch (WSDLException e) { + fail(e.getMessage()); + } + } + + public void testLoadFromRelativeWSDLLocation() { + try { + Definition def = wsdlRegistry.loadDefinition(NS + " org/apache/tuscany/core/loader/assembly/example.wsdl", rl); + assertNotNull(def.getPortType(new QName(NS, "HelloWorld"))); + } catch (IOException e) { + fail(e.getMessage()); + } catch (WSDLException e) { + fail(e.getMessage()); + } + } + + protected void setUp() throws Exception { + super.setUp(); + wsdlRegistry = new WSDLDefinitionRegistryImpl(); + wsdlRegistry.setMonitor(NULL_MONITOR); + rl = new ResourceLoaderImpl(getClass().getClassLoader()); + } + + private static final WSDLDefinitionRegistryImpl.Monitor NULL_MONITOR = new WSDLDefinitionRegistryImpl.Monitor() { + public void readingWSDL(String namespace, URL location) { + } + + public void cachingDefinition(String namespace, URL location) { + } + }; +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/WireLoaderTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/WireLoaderTestCase.java new file mode 100644 index 0000000000..3a0331150d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/loader/assembly/WireLoaderTestCase.java @@ -0,0 +1,60 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.loader.assembly; + +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.model.assembly.Wire; + +/** + * @version $Rev$ $Date$ + */ +public class WireLoaderTestCase extends LoaderTestSupport { + + public void testMinimal() throws XMLStreamException, ConfigurationLoadException { + String xml = "<wire xmlns='http://www.osoa.org/xmlns/sca/0.9'><source.uri>foo/fooService</source.uri><target.uri>bar</target.uri></wire>"; + XMLStreamReader reader = getReader(xml); + Wire wire = (Wire) registry.load(reader, loaderContext); + reader.require(XMLStreamConstants.END_ELEMENT, AssemblyConstants.WIRE.getNamespaceURI(), AssemblyConstants.WIRE.getLocalPart()); + assertEquals(XMLStreamConstants.END_DOCUMENT, reader.next()); + assertNotNull(wire); + assertEquals("foo", wire.getSource().getPartName()); + assertEquals("fooService", wire.getSource().getServiceName()); + assertEquals("bar", wire.getTarget().getPartName()); + } + + public void testCompound() throws XMLStreamException, ConfigurationLoadException { + String xml = "<wire xmlns='http://www.osoa.org/xmlns/sca/0.9'><source.uri>foo/fooService</source.uri><target.uri>bar/bazService</target.uri></wire>"; + XMLStreamReader reader = getReader(xml); + Wire wire = (Wire) registry.load(reader, loaderContext); + reader.require(XMLStreamConstants.END_ELEMENT, AssemblyConstants.WIRE.getNamespaceURI(), AssemblyConstants.WIRE.getLocalPart()); + assertEquals(XMLStreamConstants.END_DOCUMENT, reader.next()); + assertNotNull(wire); + assertEquals("foo", wire.getSource().getPartName()); + assertEquals("fooService", wire.getSource().getServiceName()); + assertEquals("bar", wire.getTarget().getPartName()); + assertEquals("bazService", wire.getTarget().getServiceName()); + } + + protected void setUp() throws Exception { + super.setUp(); + registerLoader(new WireLoader()); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/MockConfigContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/MockConfigContext.java new file mode 100644 index 0000000000..820e4d36d8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/MockConfigContext.java @@ -0,0 +1,53 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.mock; + +import org.apache.tuscany.core.builder.BuilderConfigException; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.builder.impl.AssemblyVisitorImpl; +import org.apache.tuscany.core.context.ConfigurationContext; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.wire.SourceWireFactory; +import org.apache.tuscany.core.wire.TargetWireFactory; +import org.apache.tuscany.model.assembly.AssemblyObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * A mock configuration context + * + * @version $Rev$ $Date$ + */ +public class MockConfigContext implements ConfigurationContext { + + private List<ContextFactoryBuilder> builders = new ArrayList<ContextFactoryBuilder>(); + + public MockConfigContext(List<ContextFactoryBuilder> builders) { + this.builders = builders; + } + + public void build(AssemblyObject model) throws BuilderConfigException { + AssemblyVisitorImpl visitor = new AssemblyVisitorImpl(builders); + visitor.start(model); + } + + public void connect(SourceWireFactory sourceFactory, TargetWireFactory targetFactory, Class targetType, boolean downScope, + ScopeContext targetScopeContext) throws BuilderConfigException { + } + + public void completeTargetChain(TargetWireFactory targetFactory, Class targetType, ScopeContext targetScopeContext) throws BuilderConfigException { + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/MockFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/MockFactory.java new file mode 100644 index 0000000000..87e92d783c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/MockFactory.java @@ -0,0 +1,413 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.mock; + +import java.util.ArrayList; +import java.util.List; +import java.lang.reflect.Method; + +import org.apache.tuscany.common.monitor.impl.NullMonitorFactory; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.client.BootstrapHelper; +import org.apache.tuscany.core.config.ComponentTypeIntrospector; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.impl.Java5ComponentTypeIntrospector; +import org.apache.tuscany.core.config.processor.ProcessorUtils; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.extension.config.ImplementationProcessor; +import org.apache.tuscany.core.extension.config.extensibility.DestroyInvokerExtensibilityElement; +import org.apache.tuscany.core.mock.component.ModuleScopeSystemComponent; +import org.apache.tuscany.core.mock.component.ModuleScopeSystemComponentImpl; +import org.apache.tuscany.core.mock.component.Source; +import org.apache.tuscany.core.mock.component.SourceImpl; +import org.apache.tuscany.core.mock.component.Target; +import org.apache.tuscany.core.mock.component.TargetImpl; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.core.runtime.RuntimeContextImpl; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.core.system.assembly.SystemBinding; +import org.apache.tuscany.core.system.assembly.SystemModule; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.core.system.builder.SystemContextFactoryBuilder; +import org.apache.tuscany.core.system.builder.SystemEntryPointBuilder; +import org.apache.tuscany.core.system.builder.SystemExternalServiceBuilder; +import org.apache.tuscany.core.system.context.SystemCompositeContextImpl; +import org.apache.tuscany.core.injection.MethodEventInvoker; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.ExternalService; +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.ModuleComponent; +import org.apache.tuscany.model.assembly.Multiplicity; +import org.apache.tuscany.model.assembly.Part; +import org.apache.tuscany.model.assembly.Reference; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.impl.AssemblyContextImpl; +import org.apache.tuscany.model.types.java.JavaServiceContract; + +/** + * Generates test components, modules, and runtime artifacts + * + * @version $Rev$ $Date$ + */ +public class MockFactory { + + private static SystemAssemblyFactory systemFactory = new SystemAssemblyFactoryImpl(); + private static AssemblyContext assemblyContext = new AssemblyContextImpl(systemFactory, null, null); + private static ComponentTypeIntrospector introspector; + private static ComponentType systemComponentType; + private static ComponentType compositeComponentType; + + private MockFactory() { + } + + public static ComponentType getComponentType() throws ConfigurationLoadException { + if (systemComponentType == null) { + systemComponentType = getIntrospector().introspect(SystemCompositeContextImpl.class); + } + return systemComponentType; + } + + public static ComponentType getCompositeComponentType() throws ConfigurationLoadException { + if (compositeComponentType == null) { + compositeComponentType = getIntrospector().introspect(CompositeContextImpl.class); + } + return compositeComponentType; + } + + public static ComponentTypeIntrospector getIntrospector() { + if (introspector == null) { + introspector = ProcessorUtils.createCoreIntrospector(systemFactory); + } + return introspector; + } + + /** + * Creates an composite component with the given name + */ + public static ModuleComponent createCompositeComponent(String name) throws ConfigurationLoadException { + ModuleComponent sc = systemFactory.createModuleComponent(); + Module impl = systemFactory.createModule(); + impl.setName(name); + //impl.setImplementationClass(CompositeContextImpl.class); + sc.setImplementation(impl); + impl.setImplementationClass(CompositeContextImpl.class); + impl.setComponentType(getCompositeComponentType()); + Service s = systemFactory.createService(); + JavaServiceContract ji = systemFactory.createJavaServiceContract(); + s.setServiceContract(ji); + ji.setScope(Scope.AGGREGATE); +// impl.setComponentType(systemFactory.createComponentType()); + impl.getComponentType().getServices().add(s); + sc.setName(name); + sc.setImplementation(impl); + return sc; + } + + /** + * Creates an composite component with the given name + */ + public static ModuleComponent createSystemCompositeComponent(String name) throws ConfigurationLoadException { + ModuleComponent sc = systemFactory.createModuleComponent(); + SystemModule impl = systemFactory.createSystemModule(); + impl.setName(name); + impl.setImplementationClass(SystemCompositeContextImpl.class); + impl.setComponentType(getComponentType()); + sc.setImplementation(impl); + Service s = systemFactory.createService(); + JavaServiceContract ji = systemFactory.createJavaServiceContract(); + s.setServiceContract(ji); + ji.setScope(Scope.AGGREGATE); + //impl.setComponentType(systemFactory.createComponentType()); + impl.getComponentType().getServices().add(s); + sc.setName(name); + sc.setImplementation(impl); + return sc; + } + + /** + * Creates a basic entry point with no configured reference using the system binding + * + * @param name the name of the entry point + * @param interfaz the inteface exposed by the entry point + * @param refName the name of the entry point reference + */ + public static EntryPoint createEPSystemBinding(String name, Class interfaz, String refName) { + return createEPSystemBinding(name, interfaz, refName, null); + } + + /** + * Creates an entry point wired to the given target (e.g. component, external service) using the system + * binding + * + * @param name the name of the entry point + * @param interfaz the inteface exposed by the entry point + * @param refName the name of the entry point reference + * @param target the target the entry point is wired to + */ + public static EntryPoint createEPSystemBinding(String name, Class interfaz, String refName, Part target) { + JavaServiceContract contract = systemFactory.createJavaServiceContract(); + contract.setInterface(interfaz); + + EntryPoint ep = systemFactory.createEntryPoint(); + ep.setName(name); + + Reference ref = systemFactory.createReference(); + ref.setName(refName); + ref.setServiceContract(contract); + ConfiguredReference configuredReference = systemFactory.createConfiguredReference(); + configuredReference.setPort(ref); + Service service = systemFactory.createService(); + service.setServiceContract(contract); + + ConfiguredService cService = systemFactory.createConfiguredService(); + cService.setPort(service); + cService.initialize(assemblyContext); + + configuredReference.getTargetConfiguredServices().add(cService); + ep.setConfiguredReference(configuredReference); + + Service epService = systemFactory.createService(); + epService.setServiceContract(contract); + + ConfiguredService epCService = systemFactory.createConfiguredService(); + epCService.initialize(assemblyContext); + epCService.setPort(epService); + + ep.setConfiguredService(epCService); + SystemBinding binding = systemFactory.createSystemBinding(); + ep.getBindings().add(binding); + if (target != null) { + if (target instanceof Component) { + ((Component) target).getConfiguredServices().add(cService); + // cService. + } else if (target instanceof ExternalService) { + ((ExternalService) target).setConfiguredService(cService); + } + target.initialize(assemblyContext); + } + ep.initialize(null); + return ep; + } + + /** + * Creates an entry point that should be wired to the given target (e.g. component, external service) + * using the system binding. The system assembly process should resolve the target name to an actual + * target configuration. + * + * @param name the name of the entry point + * @param interfaz the inteface exposed by the entry point + * @param refName the name of the entry point reference + * @param componentName the name of the target to resolve + */ + public static EntryPoint createEntryPointWithStringRef(String name, Class interfaz, String refName, String componentName) { + EntryPoint ep = createEPSystemBinding(name, interfaz, refName, null); + ConfiguredReference cRef = systemFactory.createConfiguredReference(); + Reference ref = systemFactory.createReference(); + cRef.setPort(ref); + Service service = systemFactory.createService(); + service.setName(componentName); + ConfiguredService cService = systemFactory.createConfiguredService(); + cService.setPort(service); + cRef.getTargetConfiguredServices().add(cService); + cRef.initialize(assemblyContext); + cService.initialize(assemblyContext); + JavaServiceContract contract = systemFactory.createJavaServiceContract(); + contract.setInterface(interfaz); + ref.setServiceContract(contract); + ep.setConfiguredReference(cRef); + ep.initialize(assemblyContext); + return ep; + } + + /** + * Creates an external service configured with a {@link SystemBinding} + */ + public static ExternalService createESSystemBinding(String name, String refName) { + ExternalService es = systemFactory.createExternalService(); + es.setName(name); + ConfiguredService configuredService = systemFactory.createConfiguredService(); + es.setConfiguredService(configuredService); + SystemBinding binding = systemFactory.createSystemBinding(); + binding.setTargetName(refName); + es.getBindings().add(binding); + es.initialize(null); + return es; + } + + /** + * Creates an external service that specifies an autowire of the given type + */ + public static ExternalService createAutowirableExternalService(String name, Class type) { + ExternalService es = systemFactory.createExternalService(); + es.setName(name); + JavaServiceContract inter = systemFactory.createJavaServiceContract(); + inter.setInterface(type); + Service service = systemFactory.createService(); + service.setServiceContract(inter); + ConfiguredService cService = systemFactory.createConfiguredService(); + cService.setPort(service); + cService.initialize(assemblyContext); + es.setConfiguredService(cService); + es.getBindings().add(systemFactory.createSystemBinding()); + es.initialize(null); + return es; + } + + /** + * Creates a test system module with a module-scoped component and entry point + */ + public static Module createSystemModule() throws ConfigurationLoadException { + Module module = systemFactory.createSystemModule(); + module.setName("system.module"); + + // create test component + Component component = systemFactory.createSystemComponent("TestService1", ModuleScopeSystemComponent.class, + ModuleScopeSystemComponentImpl.class, Scope.MODULE); + component.getImplementation().setComponentType(getIntrospector().introspect(ModuleScopeSystemComponent.class)); + module.getComponents().add(component); + + // create the entry point + EntryPoint ep = createEPSystemBinding("TestService1EP", ModuleScopeSystemComponent.class, "target", component); + module.getEntryPoints().add(ep); + + module.initialize(assemblyContext); + module.setImplementationClass(SystemCompositeContextImpl.class); + module.setComponentType(getComponentType()); + return module; + } + + public static <T> Component createSystemComponent(String name, Class<T> service, Class<? extends T> impl, Scope scope) throws ConfigurationLoadException { + Component c = systemFactory.createSystemComponent(name, service, impl, scope); + c.getImplementation().setComponentType(getIntrospector().introspect(impl)); + for (Service s : c.getImplementation().getComponentType().getServices()) { + s.getServiceContract().setScope(scope); //hack + } + + return c; + } + + /** + * Creates a test system module with source and target components wired together. + * + * @see org.apache.tuscany.core.mock.component.Source + * @see org.apache.tuscany.core.mock.component.Target + */ + public static Module createSystemModuleWithWiredComponents(String moduleName, Scope sourceScope, Scope targetScope) throws ConfigurationLoadException { + + // create the target component + Component target = systemFactory.createSystemComponent("target", Target.class, TargetImpl.class, targetScope); + target.initialize(assemblyContext); + + // create the source componentType + Component source = systemFactory.createSystemComponent("source", Source.class, SourceImpl.class, sourceScope); + ComponentType sourceComponentType = source.getImplementation().getComponentType(); + List<Reference> references = sourceComponentType.getReferences(); + List<ConfiguredReference> configuredReferences = source.getConfiguredReferences(); + + // wire source to target + references.add(systemFactory.createReference("setTarget", Target.class)); + ConfiguredReference configuredReference = systemFactory.createConfiguredReference("setTarget", "target"); + configuredReferences.add(configuredReference); + + // wire multiplicity using a setter + references.add(systemFactory.createReference("setTargets", Target.class, Multiplicity.ONE_N)); + configuredReference = systemFactory.createConfiguredReference("setTargets", "target"); + configuredReferences.add(configuredReference); + + // wire multiplicity using a field + references.add(systemFactory.createReference("targetsThroughField", Target.class, Multiplicity.ONE_N)); + configuredReference = systemFactory.createConfiguredReference("targetsThroughField", "target"); + configuredReferences.add(configuredReference); + + // wire multiplicity using a setter + references.add(systemFactory.createReference("setArrayOfTargets", Target.class, Multiplicity.ONE_N)); + configuredReference = systemFactory.createConfiguredReference("setArrayOfTargets", "target"); + configuredReferences.add(configuredReference); + + source.initialize(assemblyContext); + + Module module = systemFactory.createSystemModule(); + module.setImplementationClass(SystemCompositeContextImpl.class); + module.setComponentType(getComponentType()); + module.setName(moduleName); + module.getComponents().add(source); + module.getComponents().add(target); + module.initialize(assemblyContext); + return module; + } + + /** + * Creates a test system module component with source and target components wired together. + * + * @see org.apache.tuscany.core.mock.component.Source + * @see org.apache.tuscany.core.mock.component.Target + */ + public static ModuleComponent createSystemModuleComponentWithWiredComponents(String moduleComponentName, Scope sourceScope, + Scope targetScope) throws ConfigurationLoadException { + ModuleComponent mc = systemFactory.createModuleComponent(); + mc.setName(moduleComponentName); + mc.setImplementation(createSystemModuleWithWiredComponents(moduleComponentName + ".module", sourceScope, targetScope)); + return mc; + } + + /** + * Creates a test system module component with a module-scoped component and entry point + */ + public static Module createSystemChildModule() throws ConfigurationLoadException { + Module module = systemFactory.createSystemModule(); + module.setName("system.test.module"); + module.setImplementationClass(SystemCompositeContextImpl.class); + module.setComponentType(getComponentType()); + + // create test component + Component component = systemFactory.createSystemComponent("TestService2", ModuleScopeSystemComponent.class, + ModuleScopeSystemComponentImpl.class, Scope.MODULE); + module.getComponents().add(component); + + // create the entry point + EntryPoint ep = createEPSystemBinding("TestService2EP", ModuleScopeSystemComponent.class, "target", component); + module.getEntryPoints().add(ep); + + module.initialize(assemblyContext); + return module; + } + + /** + * Returns a collection of bootstrap configuration builders + */ + public static List<ContextFactoryBuilder> createSystemBuilders() { + List<ContextFactoryBuilder> builders = new ArrayList<ContextFactoryBuilder>(); + builders.add((new SystemContextFactoryBuilder(null))); + builders.add(new SystemEntryPointBuilder()); + builders.add(new SystemExternalServiceBuilder()); + return builders; + } + + /** + * Creates a default {@link RuntimeContext} configured with support for Java component implementations + */ + public static RuntimeContext createCoreRuntime() { + NullMonitorFactory monitorFactory = new NullMonitorFactory(); + RuntimeContext runtime = new RuntimeContextImpl(monitorFactory, BootstrapHelper.bootstrapContextFactoryBuilders(monitorFactory), null); + runtime.start(); + return runtime; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/AutowireSourceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/AutowireSourceImpl.java new file mode 100644 index 0000000000..fb1cb86873 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/AutowireSourceImpl.java @@ -0,0 +1,64 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.mock.component; + +import org.apache.tuscany.core.system.annotation.Autowire; + +import java.util.List; + +/** + * Mock system component implementation used in autowire tests + * + * @version $Rev$ $Date$ + */ +public class AutowireSourceImpl implements Source { + + @Autowire + protected Target target; + + private List<Target> targets; + + private List<Target> targetsThroughField; + + public void setTarget(Target target) { + this.target = target; + } + + public Target getTarget() { + return target; + } + + public List<Target> getTargets() { + return targets; + } + + public void setTargets(List<Target> targets) { + this.targets = targets; + } + + public List<Target> getTargetsThroughField() { + return targetsThroughField; + } + + private Target[] targetsArray; + + public Target[] getArrayOfTargets() { + return targetsArray; + } + + public void setArrayOfTargets(Target[] targets) { + targetsArray = targets; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/GenericSystemComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/GenericSystemComponent.java new file mode 100644 index 0000000000..1fd02de992 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/GenericSystemComponent.java @@ -0,0 +1,22 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.mock.component; + +public interface GenericSystemComponent { + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/ModuleScopeSystemComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/ModuleScopeSystemComponent.java new file mode 100644 index 0000000000..dabbd9e4ef --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/ModuleScopeSystemComponent.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.mock.component; + +import org.osoa.sca.annotations.Scope; + +/** + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public interface ModuleScopeSystemComponent extends GenericSystemComponent { + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/ModuleScopeSystemComponentImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/ModuleScopeSystemComponentImpl.java new file mode 100644 index 0000000000..58afde9354 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/ModuleScopeSystemComponentImpl.java @@ -0,0 +1,25 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.mock.component; + +/** + * @version $Rev$ $Date$ + */ +public class ModuleScopeSystemComponentImpl implements ModuleScopeSystemComponent { + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/Source.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/Source.java new file mode 100644 index 0000000000..6ce1059db1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/Source.java @@ -0,0 +1,34 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.mock.component; + +import java.util.List; + +/** + * Implementations are used in wiring tests + * + * @version $Rev$ $Date$ + */ +public interface Source { + + public Target getTarget(); + + public List<Target> getTargets(); + + public List<Target> getTargetsThroughField(); + + public Target[] getArrayOfTargets(); + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/SourceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/SourceImpl.java new file mode 100644 index 0000000000..075e70699e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/SourceImpl.java @@ -0,0 +1,67 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.mock.component; + +import java.util.List; + +import org.osoa.sca.annotations.Destroy; + +/** + * Mock system component implementation used in wiring tests + * + * @version $Rev$ $Date$ + */ +public class SourceImpl implements Source { + + private Target target; + + private List<Target> targets; + + private List<Target> targetsThroughField; + + @Destroy + public void foo(){ + } + + public void setTarget(Target target) { + this.target = target; + } + + public Target getTarget() { + return target; + } + + public List<Target> getTargets() { + return targets; + } + + public void setTargets(List<Target> targets) { + this.targets = targets; + } + + public List<Target> getTargetsThroughField() { + return targetsThroughField; + } + + private Target[] targetsArray; + + public Target[] getArrayOfTargets() { + return targetsArray; + } + + public void setArrayOfTargets(Target[] targets) { + targetsArray = targets; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/Target.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/Target.java new file mode 100644 index 0000000000..fb3642a495 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/Target.java @@ -0,0 +1,27 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.mock.component; + +/** + * Implementations are used in wiring tests + * + * @version $Rev$ $Date$ + */ +public interface Target { + + public String getString(); + + public void setString(String val); +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/TargetImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/TargetImpl.java new file mode 100644 index 0000000000..323bee0713 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/mock/component/TargetImpl.java @@ -0,0 +1,33 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.mock.component; + +/** + * Mock system component implementation used in wiring tests + * + * @version $Rev$ $Date$ + */ +public class TargetImpl implements Target { + + private String theString; + + public String getString() { + return theString; + } + + public void setString(String val) { + theString = val; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/runtime/RuntimeBootTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/runtime/RuntimeBootTestCase.java new file mode 100644 index 0000000000..c4e1ea9962 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/runtime/RuntimeBootTestCase.java @@ -0,0 +1,99 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.runtime; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.common.monitor.impl.NullMonitorFactory; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.builder.impl.DefaultWireBuilder; +import org.apache.tuscany.core.client.BootstrapHelper; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.Lifecycle; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.mock.MockFactory; + +/** + * Tests runtime boot scenarios + * + * @version $Rev$ $Date$ + */ +public class RuntimeBootTestCase extends TestCase { + private RuntimeContext runtime; + private NullMonitorFactory monitorFactory; + private ContextFactoryBuilderRegistry builderRegistry; + private DefaultWireBuilder wireBuilder; + + public void testContextParents() { + CompositeContext rootContext = runtime.getRootContext(); + assertNotNull(rootContext); + assertEquals("tuscany.root", rootContext.getName()); + assertSame(runtime, rootContext.getParent()); + assertSame(rootContext, runtime.getContext("tuscany.root")); + + CompositeContext systemContext = runtime.getSystemContext(); + assertNotNull(systemContext); + assertEquals("tuscany.system", systemContext.getName()); + assertSame(runtime, systemContext.getParent()); + assertSame(systemContext, runtime.getContext("tuscany.system")); + } + + public void testRuntimeLifecycle() { + assertEquals(Lifecycle.RUNNING, runtime.getLifecycleState()); + runtime.stop(); + + assertEquals(Lifecycle.STOPPED, runtime.getLifecycleState()); + } + + public void testIncrementalBoot() throws Exception{ + + // start the runtime context + RuntimeContext runtimeContext = new RuntimeContextImpl(monitorFactory, builderRegistry, wireBuilder); + runtimeContext.start(); + + CompositeContext system = runtimeContext.getSystemContext(); + Assert.assertNotNull(system); + // register system components + system.registerModelObject(MockFactory.createSystemModule()); + // start the module scope + system.publish(new ModuleStart(this)); + // register the first module + + // register the second module + + // start the modules + + system.publish(new ModuleStop(this)); + runtimeContext.stop(); + Assert.assertEquals(Lifecycle.STOPPED,system.getLifecycleState()); + } + + protected void setUp() throws Exception { + super.setUp(); + + monitorFactory = new NullMonitorFactory(); + builderRegistry = BootstrapHelper.bootstrapContextFactoryBuilders(monitorFactory); + wireBuilder = new DefaultWireBuilder(); + runtime = new RuntimeContextImpl(monitorFactory, builderRegistry, wireBuilder); + runtime.start(); + } + + protected void tearDown() throws Exception { + runtime.stop(); + super.tearDown(); + } +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/runtime/RuntimeContextImplTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/runtime/RuntimeContextImplTestCase.java new file mode 100644 index 0000000000..d9596239fa --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/runtime/RuntimeContextImplTestCase.java @@ -0,0 +1,286 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.runtime; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.common.monitor.MonitorFactory; +import org.apache.tuscany.common.monitor.impl.NullMonitorFactory; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.client.BootstrapHelper; +import org.apache.tuscany.core.config.ConfigurationException; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.Lifecycle; +import org.apache.tuscany.core.context.ServiceNotFoundException; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.mock.MockFactory; +import org.apache.tuscany.core.mock.component.ModuleScopeSystemComponent; +import org.apache.tuscany.core.mock.component.ModuleScopeSystemComponentImpl; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.core.system.context.TestBuilder; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.ExternalService; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.types.java.JavaServiceContract; + +/** + * Performs basic tests on the runtime context + * + * @version $Rev$ $Date$ + */ +public class RuntimeContextImplTestCase extends TestCase { + + private SystemAssemblyFactory systemFactory = new SystemAssemblyFactoryImpl(); + + private ContextFactoryBuilderRegistry builderRegistry; + + private SystemAssemblyFactory factory; + private MonitorFactory monitorFactory; + private RuntimeContext runtime; + + /** + * Tests explicit wiring of an external service to a system entry point that is wired to a child system + * module entry point + */ + public void testSystemExplicitWiring() throws Exception { + CompositeContext root = runtime.getRootContext(); + Assert.assertNotNull(root); + Assert.assertTrue(root.getLifecycleState() == Lifecycle.RUNNING); + + CompositeContext system = runtime.getSystemContext(); + Assert.assertNotNull(system); + system.registerModelObject(MockFactory.createSystemModule()); + + // register a child system context + system.registerModelObject(MockFactory.createSystemCompositeComponent("system.child")); + CompositeContext systemChild = (CompositeContext) system.getContext("system.child"); + systemChild.registerModelObject(MockFactory.createSystemChildModule()); + + // register a top-level system entry point that exposes the child entry point + EntryPoint ep = MockFactory.createEPSystemBinding("TestService2EP", ModuleScopeSystemComponent.class, "ref"); + ep.getBindings().add(systemFactory.createSystemBinding()); + Service service = systemFactory.createService(); + service.setName("system.child/TestService2EP"); + ep.getConfiguredReference().getTargetConfiguredServices().get(0).setPort(service); + JavaServiceContract inter = systemFactory.createJavaServiceContract(); + inter.setInterface(ModuleScopeSystemComponentImpl.class); + service.setServiceContract(inter); + system.registerModelObject(ep); + system.publish(new ModuleStart(this)); + Assert.assertNotNull(system.getContext("TestService1").getInstance(null)); + Assert.assertNotNull(system.getContext("TestService2EP").getInstance(null)); + + // create a test module and wire an external service to the system entry point + Component moduleComponent = MockFactory.createCompositeComponent("test.module"); + runtime.registerModelObject(moduleComponent); + CompositeContextImpl moduleContext = (CompositeContextImpl) runtime.getContext("test.module"); + Assert.assertNotNull(moduleContext); + ExternalService es = MockFactory.createESSystemBinding("TestService2ES", "tuscany.system/TestService2EP"); + moduleContext.registerModelObject(es); + moduleContext.publish(new ModuleStart(this)); + Assert.assertNotNull(moduleContext.getContext("TestService2ES").getInstance(null)); + + moduleContext.publish(new ModuleStop(this)); + system.publish(new ModuleStop(this)); + } + + /** + * Tests autowiring an external service to a system entry point + */ + public void testSystemAutoWiring() throws Exception { + CompositeContext root = runtime.getRootContext(); + Assert.assertNotNull(root); + Assert.assertTrue(root.getLifecycleState() == Lifecycle.RUNNING); + + CompositeContext system = runtime.getSystemContext(); + Assert.assertNotNull(system); + system.registerModelObject(MockFactory.createSystemModule()); + + // create a test module and wire an external service to the system entry point + Component moduleComponent = MockFactory.createCompositeComponent("test.module"); + runtime.registerModelObject(moduleComponent); + CompositeContextImpl moduleContext = (CompositeContextImpl) runtime.getContext("test.module"); + Assert.assertNotNull(moduleContext); + ExternalService es = MockFactory.createAutowirableExternalService("TestService2ES", ModuleScopeSystemComponent.class); + moduleContext.registerModelObject(es); + + system.publish(new ModuleStart(this)); + moduleContext.publish(new ModuleStart(this)); + // test that the autowire was resolved + Assert.assertNotNull(moduleContext.getContext("TestService2ES").getInstance(null)); + + moduleContext.publish(new ModuleStop(this)); + system.publish(new ModuleStop(this)); + } + + public void testServiceNotFound() throws Exception { + // create a test module + Component moduleComponent = MockFactory.createCompositeComponent("module"); + runtime.registerModelObject(moduleComponent); + CompositeContextImpl moduleContext = (CompositeContextImpl) runtime.getContext("module"); + moduleContext.publish(new ModuleStart(this)); + try { + moduleContext.locateService("TestService"); + fail("Expected " + ServiceNotFoundException.class.getName()); + } catch (ServiceNotFoundException e) { + // expected + } + moduleContext.publish(new ModuleStop(this)); + } + + public void testExternalServiceReferenceNotFound() throws Exception { + CompositeContext system = runtime.getSystemContext(); + + // create a test module + Component moduleComponent = MockFactory.createCompositeComponent("module"); + runtime.registerModelObject(moduleComponent); + CompositeContextImpl moduleContext = (CompositeContextImpl) runtime.getContext("module"); + ExternalService es = MockFactory.createESSystemBinding("TestServiceES", "tuscany.system/TestService1xEP"); + moduleContext.registerModelObject(es); + + // start the modules and test inter-module system wires + system.publish(new ModuleStart(this)); + moduleContext.publish(new ModuleStart(this)); + try { + moduleContext.locateService("TestServiceES"); + fail("Expected " + ServiceNotFoundException.class.getName()); + } catch (ServiceNotFoundException e) { + // expected + } + moduleContext.publish(new ModuleStop(this)); + system.publish(new ModuleStop(this)); + } + + public void testEntryPointReferenceNotFound() throws Exception { + // create a test module + Component moduleComponent = MockFactory.createCompositeComponent("module"); + runtime.registerModelObject(moduleComponent); + + Component component = factory.createSystemComponent("NoService", ModuleScopeSystemComponent.class, ModuleScopeSystemComponentImpl.class, Scope.MODULE); + // do not register the above component! + + CompositeContextImpl moduleContext = (CompositeContextImpl) runtime.getContext("module"); + EntryPoint epSystemBinding = MockFactory.createEPSystemBinding("TestServiceEP", ModuleScopeSystemComponent.class, "NoReference", component); + moduleContext.registerModelObject(epSystemBinding); + + moduleContext.publish(new ModuleStart(this)); + try { + moduleContext.locateService("TestServiceEP"); + fail("Expected " + ServiceNotFoundException.class.getName()); + } catch (ServiceNotFoundException e) { + // expected + } + moduleContext.publish(new ModuleStop(this)); + } + + /** + * Test two module components that have external services wired to entry points contained in each + */ + public void testCircularWires() throws Exception { + // create a test modules + Component module1 = MockFactory.createCompositeComponent("module1"); + runtime.registerModelObject(module1); + Component module2 = MockFactory.createCompositeComponent("module2"); + runtime.registerModelObject(module2); + + CompositeContextImpl moduleContext1 = (CompositeContextImpl) runtime.getContext("module1"); + CompositeContextImpl moduleContext2 = (CompositeContextImpl) runtime.getContext("module2"); + + Component component1 = factory.createSystemComponent("Component1", ModuleScopeSystemComponent.class, ModuleScopeSystemComponentImpl.class, Scope.MODULE); + EntryPoint entryPoint1 = MockFactory.createEPSystemBinding("EntryPoint1", ModuleScopeSystemComponent.class, "Component1", component1); + ExternalService externalService1 = MockFactory.createESSystemBinding("ExternalService1", "module2/EntryPoint2"); + moduleContext1.registerModelObject(component1); + moduleContext1.registerModelObject(entryPoint1); + moduleContext1.registerModelObject(externalService1); + + Component component2 = factory.createSystemComponent("Component2", ModuleScopeSystemComponent.class, ModuleScopeSystemComponentImpl.class, Scope.MODULE); + EntryPoint entryPoint2 = MockFactory.createEPSystemBinding("EntryPoint2", ModuleScopeSystemComponent.class, "Component2", component2); + ExternalService externalService2 = MockFactory.createESSystemBinding("ExternalService2", "module1/EntryPoint1"); + moduleContext2.registerModelObject(component2); + moduleContext2.registerModelObject(entryPoint2); + moduleContext2.registerModelObject(externalService2); + + moduleContext1.publish(new ModuleStart(this)); + moduleContext2.publish(new ModuleStart(this)); + Assert.assertNotNull(moduleContext2.getContext("ExternalService2").getInstance(null)); + Assert.assertNotNull(moduleContext1.getContext("ExternalService1").getInstance(null)); + } + + /** + * Tests that a circular reference between an external service in one module and an entry point in another + * is caught as an error condition FIXME this must be implemented + */ + public void testInterModuleCircularReference() throws Exception { + // create a test modules + Component module1 = MockFactory.createCompositeComponent("module1"); + runtime.registerModelObject(module1); + Component module2 = MockFactory.createCompositeComponent("module2"); + runtime.registerModelObject(module2); + + CompositeContextImpl moduleContext1 = (CompositeContextImpl) runtime.getContext("module1"); + CompositeContextImpl moduleContext2 = (CompositeContextImpl) runtime.getContext("module2"); + ExternalService externalService1 = MockFactory.createESSystemBinding("ExternalService1", "module2/EntryPoint2"); + EntryPoint entryPoint1 = MockFactory.createEPSystemBinding("EntryPoint1", ModuleScopeSystemComponent.class, + "ExternalService1", externalService1); + ExternalService externalService2 = MockFactory.createESSystemBinding("ExternalService2", "module1/EntryPoint1"); + EntryPoint entryPoint2 = MockFactory.createEPSystemBinding("EntryPoint2", ModuleScopeSystemComponent.class, + "ExternalService2", externalService2); + try { + // FIXME this should throw a circular reference exception + moduleContext1.registerModelObject(externalService1); + moduleContext1.registerModelObject(entryPoint1); + moduleContext2.registerModelObject(externalService2); + moduleContext2.registerModelObject(entryPoint2); + // FIXME implement fail("Expected " + ConfigurationException.class.getName()); + } catch (ConfigurationException e) { + // expected + } + } + + public void testRuntimeBuilderAutowire() throws Exception { + + + CompositeContext system = runtime.getSystemContext(); + Component builder = factory.createSystemComponent("TestBuilder", ContextFactoryBuilder.class, TestBuilder.class, Scope.MODULE); + builder.getImplementation().setComponentType(MockFactory.getIntrospector().introspect(TestBuilder.class)); + system.registerModelObject(builder); + system.publish(new ModuleStart(this)); + Component module1 = MockFactory.createCompositeComponent("module1"); + runtime.registerModelObject(module1); + runtime.getContext("module1"); + Assert.assertTrue(((TestBuilder) system.getContext("TestBuilder").getInstance(null)).invoked()); + system.publish(new ModuleStop(this)); + } + + protected void setUp() throws Exception { + super.setUp(); + monitorFactory = new NullMonitorFactory(); + builderRegistry = BootstrapHelper.bootstrapContextFactoryBuilders(monitorFactory); + factory = new SystemAssemblyFactoryImpl(); + + runtime = new RuntimeContextImpl(monitorFactory, builderRegistry, null); + runtime.start(); + } + + protected void tearDown() throws Exception { + runtime.stop(); + super.tearDown(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/runtime/SystemBootstrapTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/runtime/SystemBootstrapTestCase.java new file mode 100644 index 0000000000..45af495239 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/runtime/SystemBootstrapTestCase.java @@ -0,0 +1,127 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.runtime; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.common.monitor.impl.NullMonitorFactory; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.client.BootstrapHelper; +import org.apache.tuscany.core.context.AutowireContext; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.mock.MockFactory; +import org.apache.tuscany.core.mock.component.GenericSystemComponent; +import org.apache.tuscany.core.mock.component.ModuleScopeSystemComponent; +import org.apache.tuscany.core.mock.component.ModuleScopeSystemComponentImpl; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.ExternalService; +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.types.java.JavaServiceContract; + +/** + * Tests bootstrapping a system module + * + * @version $Rev: 385834 $ $Date: 2006-03-14 08:57:08 -0800 (Tue, 14 Mar 2006) $ + */ +public class SystemBootstrapTestCase extends TestCase { + private ContextFactoryBuilderRegistry builderRegistry; + + private SystemAssemblyFactory factory = new SystemAssemblyFactoryImpl(); + + /** + * Simulates booting a runtime process + */ + public void testBoot() throws Exception { + RuntimeContext runtimeContext = new RuntimeContextImpl(new NullMonitorFactory(), builderRegistry,null); + runtimeContext.start(); + + CompositeContext systemContext = runtimeContext.getSystemContext(); + Assert.assertNotNull(systemContext); + Module systemModule = MockFactory.createSystemModule(); + // MockSystemAssemblyFactory.buildModule(systemModule, systemContext); + systemContext.registerModelObject(systemModule); + + // create a test module + Component moduleComponent = MockFactory.createCompositeComponent("module"); + runtimeContext.registerModelObject(moduleComponent); + CompositeContextImpl moduleContext = (CompositeContextImpl) runtimeContext.getContext("module"); + Assert.assertNotNull(moduleContext); + ExternalService es = MockFactory.createESSystemBinding("TestServiceES", "tuscany.system/TestService1EP"); + moduleContext.registerModelObject(es); + + // start the modules and test inter-module system wires + systemContext.publish(new ModuleStart(this)); + moduleContext.publish(new ModuleStart(this)); + + Assert.assertNotNull(systemContext.getContext("TestService1EP").getInstance(null)); + GenericSystemComponent testService = (GenericSystemComponent) systemContext.getContext("TestService1").getInstance(null); + Assert.assertNotNull(testService); + GenericSystemComponent testES = (GenericSystemComponent) moduleContext.getContext("TestServiceES").getInstance(null); + Assert.assertNotNull(testES); + Assert.assertSame(testService, testES); + } + + public void testRuntimeBoot() throws Exception { + RuntimeContext runtime = new RuntimeContextImpl(new NullMonitorFactory(), builderRegistry,null); + runtime.start(); + runtime.getRootContext(); + + CompositeContext system = runtime.getSystemContext(); + system.registerModelObject(MockFactory.createSystemModule()); + system.registerModelObject(MockFactory.createSystemCompositeComponent("module2")); + CompositeContext systemModule2 = (CompositeContext) system.getContext("module2"); + systemModule2.registerModelObject(MockFactory.createSystemChildModule()); + + EntryPoint ep = MockFactory.createEPSystemBinding("TestService2EP", ModuleScopeSystemComponent.class, "ref"); + ep.getBindings().add(factory.createSystemBinding()); + Service service = factory.createService(); + service.setName("module2/TestService2EP"); + JavaServiceContract inter = factory.createJavaServiceContract(); + inter.setInterface(ModuleScopeSystemComponentImpl.class); + service.setServiceContract(inter); + ep.getConfiguredReference().getTargetConfiguredServices().get(0).setPort(service); + system.registerModelObject(ep); + system.publish(new ModuleStart(this)); + Assert.assertNotNull(system.getContext("TestService1").getInstance(null)); + Assert.assertNotNull(system.getContext("TestService2EP").getInstance(null)); + + Assert.assertNotNull(((AutowireContext) system).resolveInstance(ModuleScopeSystemComponent.class)); + // create a test module + Component moduleComponent = MockFactory.createCompositeComponent("test.module"); + runtime.registerModelObject(moduleComponent); + CompositeContextImpl moduleContext = (CompositeContextImpl) runtime.getContext("test.module"); + Assert.assertNotNull(moduleContext); + ExternalService es = MockFactory.createESSystemBinding("TestService2ES", "tuscany.system/TestService2EP"); + moduleContext.registerModelObject(es); + moduleContext.publish(new ModuleStart(this)); + Assert.assertNotNull(moduleContext.getContext("TestService2ES").getInstance(null)); + + moduleContext.publish(new ModuleStop(this)); + system.publish(new ModuleStop(this)); + runtime.stop(); + } + + protected void setUp() throws Exception { + super.setUp(); + builderRegistry = BootstrapHelper.bootstrapContextFactoryBuilders(null); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/builder/MonitorInjectionTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/builder/MonitorInjectionTestCase.java new file mode 100644 index 0000000000..fe6bff635a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/builder/MonitorInjectionTestCase.java @@ -0,0 +1,106 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.core.system.builder; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.common.monitor.MonitorFactory; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.DefaultScopeStrategy; +import org.apache.tuscany.core.mock.MockConfigContext; +import org.apache.tuscany.core.mock.MockFactory; +import org.apache.tuscany.core.system.annotation.Monitor; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.Scope; + +/** + * @version $Rev$ $Date$ + */ +public class MonitorInjectionTestCase extends TestCase { + private SystemContextFactoryBuilder builder; + private Component component; + + public static interface TestService { + } + + public static class TestComponent implements TestService { + @Monitor + protected Monitor1 monitor1; + Monitor2 monitor2; + + @Monitor + public void setMonitor2(Monitor2 monitor2) { + this.monitor2 = monitor2; + } + } + + public static interface Monitor1 { + } + + public static interface Monitor2 { + } + + public void testMonitorInjection() { + builder.build(component); + ContextFactory<?> contextFactory = (ContextFactory<?>) component.getContextFactory(); + Assert.assertNotNull(contextFactory); + contextFactory.prepare(createContext()); + Context ctx = contextFactory.createContext(); + + ctx.start(); + TestComponent instance = (TestComponent) ctx.getInstance(null); + assertSame(MONITOR1, instance.monitor1); + assertSame(MONITOR2, instance.monitor2); + } + + protected void setUp() throws Exception { + super.setUp(); + SystemAssemblyFactory factory = new SystemAssemblyFactoryImpl(); + MockMonitorFactory monitorFactory = new MockMonitorFactory(); + builder = new SystemContextFactoryBuilder(monitorFactory); + component = factory.createSystemComponent("test", TestService.class, TestComponent.class, Scope.MODULE); + component.getImplementation().setComponentType(MockFactory.getIntrospector().introspect(TestComponent.class)); + } + + private static final Monitor1 MONITOR1 = new Monitor1() { + }; + private static final Monitor2 MONITOR2 = new Monitor2() { + }; + + public static class MockMonitorFactory implements MonitorFactory { + public <T> T getMonitor(Class<T> monitorInterface) { + if (Monitor1.class.equals(monitorInterface)) { + return monitorInterface.cast(MONITOR1); + } else if (Monitor2.class.equals(monitorInterface)) { + return monitorInterface.cast(MONITOR2); + } else { + throw new AssertionError(); + } + } + } + + private static CompositeContext createContext() { + return new CompositeContextImpl("test.parent", null, new DefaultScopeStrategy(), new EventContextImpl(), new MockConfigContext(null)); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/builder/SystemComponentImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/builder/SystemComponentImpl.java new file mode 100644 index 0000000000..3398a010e9 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/builder/SystemComponentImpl.java @@ -0,0 +1,167 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.builder; + +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.AutowireContext; +import org.apache.tuscany.core.context.ConfigurationContext; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.core.system.annotation.ParentContext; +import org.osoa.sca.annotations.Destroy; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Property; +import org.osoa.sca.annotations.Scope; + +/** + * A system component used for unit testing + * + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class SystemComponentImpl { + + @Autowire + protected ConfigurationContext ctx; + + @ParentContext + protected CompositeContext parent; + + @Autowire + protected AutowireContext autowireCtx; + + private ConfigurationContext ctxSetter; + + private CompositeContext parentSetter; + + private AutowireContext autowireCtxSetter; + + public ConfigurationContext getConfigContext() { + return ctx; + } + + public CompositeContext getParentContext() { + return parent; + } + + public AutowireContext getAutowireContext() { + return autowireCtx; + } + + @Autowire + public void setConfigContext(ConfigurationContext configCtx) { + ctxSetter = configCtx; + } + + public ConfigurationContext getConfigContextSetter() { + return ctxSetter; + } + + @ParentContext + public void setParentContex(CompositeContext ctx) { + parentSetter = ctx; + } + + public CompositeContext getParentContextSetter() { + return parentSetter; + } + + @Autowire + public void setAutowireContext(AutowireContext ctx) { + autowireCtxSetter = ctx; + } + + public AutowireContext getAutowireContextSetter() { + return autowireCtx; + } + + private boolean inited; + + @Init + public void init(){ + inited=true; + } + + public boolean initialized(){ + return (inited); + } + + private boolean destroyed; + + @Destroy + public void destroy(){ + destroyed=true; + } + + public boolean destroyed(){ + return (destroyed); + } + + @Property + protected int testInt; + + public int getTestInt(){ + return testInt; + } + + @Property + protected double testDouble; + + public double getTestDouble(){ + return testDouble; + } + + @Property + protected float testFloat; + + public float getTestFloat(){ + return testFloat; + } + + @Property + protected short testShort; + + public short getTestShort(){ + return testShort; + } + + @Property + protected boolean testBoolean; + + public boolean getTestBoolean(){ + return testBoolean; + } + + @Property + protected byte testByte; + + public byte getTestByte(){ + return testByte; + } + + @Property + protected char testChar; + + public char getTestChar(){ + return testChar; + } + + @Property + protected String testString; + + public String getTestString(){ + return testString; + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/builder/SystemContextFactoryBuilderTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/builder/SystemContextFactoryBuilderTestCase.java new file mode 100644 index 0000000000..f7543911a6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/builder/SystemContextFactoryBuilderTestCase.java @@ -0,0 +1,173 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.builder; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.DefaultScopeStrategy; +import org.apache.tuscany.core.mock.MockConfigContext; +import org.apache.tuscany.core.mock.MockFactory; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.core.system.assembly.SystemImplementation; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.ConfiguredProperty; +import org.apache.tuscany.model.assembly.Property; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.types.java.JavaServiceContract; + +/** + * Tests to system components are built properly + * + * @version $Rev$ $Date$ + */ +public class SystemContextFactoryBuilderTestCase extends TestCase { + + private SystemAssemblyFactory factory = new SystemAssemblyFactoryImpl(); + + public void testComponentContextBuilder() throws Exception { + SystemContextFactoryBuilder builder = new SystemContextFactoryBuilder(null); + Component component = factory.createSystemComponent("test", null, SystemComponentImpl.class, Scope.AGGREGATE); + component.getImplementation().setComponentType(MockFactory.getIntrospector().introspect(SystemComponentImpl.class)); + ConfiguredProperty cProp = factory.createConfiguredProperty(); + Property prop = factory.createProperty(); + prop.setName("testInt"); + cProp.setValue(1); + cProp.setProperty(prop); + component.getConfiguredProperties().add(cProp); + + cProp = factory.createConfiguredProperty(); + prop = factory.createProperty(); + prop.setName("testString"); + cProp.setValue("test"); + cProp.setProperty(prop); + component.getConfiguredProperties().add(cProp); + + cProp = factory.createConfiguredProperty(); + prop = factory.createProperty(); + prop.setName("testDouble"); + cProp.setValue(1d); + cProp.setProperty(prop); + component.getConfiguredProperties().add(cProp); + + cProp = factory.createConfiguredProperty(); + prop = factory.createProperty(); + prop.setName("testFloat"); + cProp.setValue(1f); + cProp.setProperty(prop); + component.getConfiguredProperties().add(cProp); + + cProp = factory.createConfiguredProperty(); + prop = factory.createProperty(); + prop.setName("testShort"); + cProp.setValue((short) 1); + cProp.setProperty(prop); + component.getConfiguredProperties().add(cProp); + + cProp = factory.createConfiguredProperty(); + prop = factory.createProperty(); + prop.setName("testByte"); + cProp.setValue((byte) 1); + cProp.setProperty(prop); + component.getConfiguredProperties().add(cProp); + + cProp = factory.createConfiguredProperty(); + prop = factory.createProperty(); + prop.setName("testBoolean"); + cProp.setValue(Boolean.TRUE); + cProp.setProperty(prop); + component.getConfiguredProperties().add(cProp); + + cProp = factory.createConfiguredProperty(); + prop = factory.createProperty(); + prop.setName("testChar"); + cProp.setValue('1'); + cProp.setProperty(prop); + component.getConfiguredProperties().add(cProp); + + builder.build(component); + ContextFactory<AtomicContext> contextFactory = (ContextFactory<AtomicContext>) component.getContextFactory(); + Assert.assertNotNull(contextFactory); + contextFactory.prepare(createContext()); + AtomicContext ctx = contextFactory.createContext(); + + ctx.start(); + SystemComponentImpl instance = (SystemComponentImpl) ctx.getInstance(null); + Assert.assertNotNull(instance.getConfigContext()); + Assert.assertNotNull(instance.getParentContext()); + Assert.assertNotNull(instance.getAutowireContext()); + Assert.assertNotNull(instance.getConfigContextSetter()); + Assert.assertNotNull(instance.getParentContextSetter()); + Assert.assertNotNull(instance.getAutowireContextSetter()); + Assert.assertEquals(1, instance.getTestInt()); + Assert.assertEquals(1d, instance.getTestDouble()); + Assert.assertEquals(1f, instance.getTestFloat()); + Assert.assertEquals((short) 1, instance.getTestShort()); + Assert.assertTrue(instance.getTestBoolean()); + Assert.assertEquals('1', instance.getTestChar()); + Assert.assertEquals((byte) 1, instance.getTestByte()); + Assert.assertEquals("test", instance.getTestString()); + + Assert.assertTrue(instance.initialized()); + ctx.destroy(); + ctx.stop(); + Assert.assertTrue(instance.destroyed()); + } + + + public void testDefaultScopeIsModuleScope() throws Exception { + SystemContextFactoryBuilder builder = new SystemContextFactoryBuilder(null); + Component component = createSystemComponentWithNoScope("test", null, SystemComponentImpl.class); + builder.build(component); + ContextFactory<AtomicContext> contextFactory = (ContextFactory<AtomicContext>) component.getContextFactory(); + Assert.assertEquals(Scope.MODULE, contextFactory.getScope()); + } + + + + + private static CompositeContext createContext() { + return new CompositeContextImpl("test.parent", null, new DefaultScopeStrategy(), new EventContextImpl(), + new MockConfigContext(null)); + } + + private <T> Component createSystemComponentWithNoScope(String name, Class<T> service, Class<? extends T> impl) { + JavaServiceContract jsc = factory.createJavaServiceContract(); + jsc.setInterface(service); + Service s = factory.createService(); + s.setServiceContract(jsc); + + ComponentType componentType = factory.createComponentType(); + componentType.getServices().add(s); + + SystemImplementation sysImpl = factory.createSystemImplementation(); + sysImpl.setImplementationClass(impl); + sysImpl.setComponentType(componentType); + + Component sc = factory.createSimpleComponent(); + sc.setName(name); + sc.setImplementation(sysImpl); + return sc; + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/builder/impl/AssemblyVisitorTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/builder/impl/AssemblyVisitorTestCase.java new file mode 100644 index 0000000000..3d63664848 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/builder/impl/AssemblyVisitorTestCase.java @@ -0,0 +1,136 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.builder.impl; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.builder.impl.AssemblyVisitorImpl; +import org.apache.tuscany.core.mock.component.ModuleScopeSystemComponent; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.core.system.assembly.SystemBinding; +import org.apache.tuscany.core.system.assembly.SystemImplementation; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.ConfiguredPort; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.ContextFactoryHolder; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.Reference; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.impl.AssemblyContextImpl; +import org.apache.tuscany.model.types.java.JavaServiceContract; + +/** + * Tests decorating a logical configuration model + * + * @version $Rev$ $Date$ + */ +public class AssemblyVisitorTestCase extends TestCase { + + private static final Object MARKER = new Object(); + + private SystemAssemblyFactory factory = new SystemAssemblyFactoryImpl(); + private AssemblyContext assemblyContext = new AssemblyContextImpl(factory, null, null); + + public void testModelVisit() throws Exception { + ComponentType componentType; + Service service; + SystemImplementation impl; + Component component; + + Module module = factory.createModule(); + + // create target component + componentType = factory.createComponentType(); + service = factory.createService(); + service.setName("target"); + componentType.getServices().add(service); + impl = factory.createSystemImplementation(); + impl.setComponentType(componentType); + component = factory.createSimpleComponent(); + component.setName("target"); + component.setImplementation(impl); + component.initialize(assemblyContext); + module.getComponents().add(component); + + // create source component + componentType = factory.createComponentType(); + Reference ref = factory.createReference(); + ref.setName("ref"); + componentType.getReferences().add(ref); + impl = factory.createSystemImplementation(); + impl.setComponentType(componentType); + component = factory.createSimpleComponent(); + component.setName("source"); + component.setImplementation(impl); + ConfiguredReference cRef = factory.createConfiguredReference("ref", "target"); + component.getConfiguredReferences().add(cRef); + component.initialize(assemblyContext); + module.getComponents().add(component); + + EntryPoint ep = factory.createEntryPoint(); + JavaServiceContract contract = factory.createJavaServiceContract(); + contract.setInterface(ModuleScopeSystemComponent.class); + service = factory.createService(); + service.setServiceContract(contract); + ConfiguredService cService = factory.createConfiguredService(); + cService.setPort(service); + cService.initialize(assemblyContext); + ep.setConfiguredService(cService); + SystemBinding binding = factory.createSystemBinding(); + ep.getBindings().add(binding); + ConfiguredReference cEpRef = factory.createConfiguredReference(); + Reference epRef = factory.createReference(); + cEpRef.setPort(epRef); + ep.setConfiguredReference(cEpRef); + ep.initialize(assemblyContext); + module.getEntryPoints().add(ep); + + List<ContextFactoryBuilder> builders = new ArrayList<ContextFactoryBuilder>(); + builders.add(new TestBuilder()); + AssemblyVisitorImpl visitor = new AssemblyVisitorImpl(builders); + module.initialize(assemblyContext); + visitor.start(module); + + Assert.assertSame(MARKER, component.getContextFactory()); + Assert.assertSame(MARKER, cRef.getProxyFactory()); + Assert.assertSame(MARKER, ep.getContextFactory()); + Assert.assertSame(MARKER, cEpRef.getProxyFactory()); + + } + + private static class TestBuilder implements ContextFactoryBuilder { + public void build(AssemblyObject model) throws BuilderException { + if (model instanceof ConfiguredPort) { + ((ConfiguredPort) model).setProxyFactory(MARKER); + } + if (model instanceof ContextFactoryHolder) { + ((ContextFactoryHolder) model).setContextFactory(MARKER); + } + } + + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/AutowireTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/AutowireTestCase.java new file mode 100644 index 0000000000..6316fe3a67 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/AutowireTestCase.java @@ -0,0 +1,310 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.context; + +import junit.framework.TestCase; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.SystemCompositeContext; +import org.apache.tuscany.core.context.impl.CompositeContextImpl; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.mock.MockFactory; +import org.apache.tuscany.core.mock.component.AutowireSourceImpl; +import org.apache.tuscany.core.mock.component.Source; +import org.apache.tuscany.core.mock.component.Target; +import org.apache.tuscany.core.mock.component.TargetImpl; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.ModuleComponent; +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.impl.AssemblyContextImpl; + +/** + * Tests autowiring for serveral scenarios according to the following runtime scheme: + * + * <code> + * tuscany.runtime + * | + * + tuscany.system + * | | + * | + system1 + * | | | + * | | + system1a + * | | + * | + system2 + * | + * + tuscany.root + * | + * + app1 + * | + * + app1a + * | + * + app1b + * </code> + * + * @version $Rev$ $Date$ + */ +public class AutowireTestCase extends TestCase { + + private static SystemAssemblyFactory systemFactory = new SystemAssemblyFactoryImpl(); + + /** + * Covers the case where a component in app1a requests autowire, which is resolved by the runtime to a service + * exposed on an entry point in tuscany.system. The entry point is wired to an entry point on system1, which itself + * is wired to a component in system1 + */ + public void testScenario1() throws Exception { + RuntimeContext runtime = createScenario1Runtime(); + CompositeContext root = runtime.getRootContext(); + SystemCompositeContext system = runtime.getSystemContext(); + CompositeContext system1 = (CompositeContext) system.getContext("system1"); + system1.publish(new ModuleStart(this)); + Target target = (Target) system.getContext("target.system.ep").getInstance(null); + assertNotNull(target); + CompositeContext app1 = (CompositeContext) root.getContext("app1"); + app1.publish(new ModuleStart(this)); + CompositeContext app1a = (CompositeContext) app1.getContext("app1a"); + app1a.publish(new ModuleStart(this)); + app1a.publish(new ModuleStop(this)); + app1.publish(new ModuleStop(this)); + Source source = (Source) app1a.getContext("source").getInstance(null); + assertEquals(target, source.getTarget()); + source.getTarget().getString(); + runtime.stop(); + } + + /** + * Covers the case where a component in app1a requests autowire, which is resolved to service exposed as an entry + * point on app1b. The entry point is wired to a component in app1b. + */ + public void testScenario2() throws Exception { + RuntimeContext runtime = createScenario2Runtime(); + CompositeContext root = runtime.getRootContext(); + CompositeContext app1 = (CompositeContext) root.getContext("app1"); + app1.publish(new ModuleStart(this)); + CompositeContext app1b = (CompositeContext) app1.getContext("app1b"); + app1b.publish(new ModuleStart(this)); + CompositeContext app1a = (CompositeContext) app1.getContext("app1a"); + app1a.publish(new ModuleStart(this)); + Target target = (Target) app1b.getContext("target.ep").getInstance(null); + assertNotNull(target); + Source source = (Source) app1a.getContext("source").getInstance(null); + assertEquals(target, source.getTarget()); + source.getTarget().getString(); + runtime.stop(); + } + + /** + * Covers the case where a component in system1a requests autowire, which is resolved to an entry point exposed on + * system2. The entry point is wired to a component in system2. + */ + public void testScenario3() throws Exception { + RuntimeContext runtime = createScenario3Runtime(); + SystemCompositeContext system = runtime.getSystemContext(); + + CompositeContext system2 = (CompositeContext) system.getContext("system2"); + system2.publish(new ModuleStart(this)); + Target target = (Target) system2.getContext("target.ep").getInstance(null); + assertNotNull(target); + + CompositeContext system1 = (CompositeContext) system.getContext("system1"); + system1.publish(new ModuleStart(this)); + CompositeContext system1a = (CompositeContext) system1.getContext("system1a"); + system1a.publish(new ModuleStart(this)); + + Source source = (Source) system1a.getContext("source").getInstance(null); + assertEquals(target, source.getTarget()); + source.getTarget().getString(); + runtime.stop(); + } + + /** + * Covers the case where a component in system1a requests autowire, which is resolved to component in its parent, + * system1. + */ + public void testScenario4() throws Exception { + RuntimeContext runtime = createScenario4Runtime(); + SystemCompositeContext system = runtime.getSystemContext(); + CompositeContext system1 = (CompositeContext) system.getContext("system1"); + system1.publish(new ModuleStart(this)); + Target target = (Target) system1.getContext("target").getInstance(null); + assertNotNull(target); + CompositeContext system1a = (CompositeContext) system1.getContext("system1a"); + system1a.publish(new ModuleStart(this)); + + Source source = (Source) system1a.getContext("source").getInstance(null); + assertEquals(target, source.getTarget()); + source.getTarget().getString(); + runtime.stop(); + } + + /** + * Covers the case where a component in system1a requests autowire, which is resolved to component in the parent of + * its parent (grandparent), system. + */ + public void testScenario5() throws Exception { + RuntimeContext runtime = createScenario5Runtime(); + SystemCompositeContext system = runtime.getSystemContext(); + CompositeContext system1 = (CompositeContext) system.getContext("system1"); + system1.publish(new ModuleStart(this)); + Target target = (Target) system.getContext("target").getInstance(null); + assertNotNull(target); + CompositeContext system1a = (CompositeContext) system1.getContext("system1a"); + system1a.publish(new ModuleStart(this)); + + Source source = (Source) system1a.getContext("source").getInstance(null); + assertEquals(target, source.getTarget()); + source.getTarget().getString(); + runtime.stop(); + } + + private RuntimeContext createScenario1Runtime() throws Exception { + RuntimeContext runtime = MockFactory.createCoreRuntime(); + runtime.start(); + SystemCompositeContext system = runtime.getSystemContext(); + ModuleComponent system1Component = MockFactory.createSystemCompositeComponent("system1"); + ModuleComponent system1aComponent = MockFactory.createSystemCompositeComponent("system1a"); + system1Component.getImplementation().getComponents().add(system1aComponent); + Component target = MockFactory.createSystemComponent("target", Target.class, TargetImpl.class, Scope.MODULE); + system1Component.getImplementation().getComponents().add(target); + + EntryPoint ep = MockFactory.createEPSystemBinding("target.ep", Target.class, "target", target); + system1Component.getImplementation().getEntryPoints().add(ep); + system.registerModelObject(system1Component); + EntryPoint systemEp = MockFactory.createEPSystemBinding("target.system.ep", Target.class, "ref"); + + systemEp.getBindings().add(systemFactory.createSystemBinding()); + Service service = systemFactory.createService(); + service.setName("system1/target.ep"); + (systemEp.getConfiguredReference().getTargetConfiguredServices().get(0)).setPort(service); + + system.registerModelObject(systemEp); + ModuleComponent app1Component = createAppModuleComponent("app1"); + ModuleComponent app1aComponent = createAppModuleComponent("app1a"); + Component source = MockFactory.createSystemComponent("source", Source.class, AutowireSourceImpl.class, Scope.MODULE); + app1aComponent.getImplementation().getComponents().add(source); + app1Component.getImplementation().getComponents().add(app1aComponent); + CompositeContext root = runtime.getRootContext(); + root.registerModelObject(app1Component); + system.publish(new ModuleStart(this)); + return runtime; + } + + private RuntimeContext createScenario2Runtime() throws Exception { + RuntimeContext runtime = MockFactory.createCoreRuntime(); + runtime.start(); + + ModuleComponent app1Component = createAppModuleComponent("app1"); + ModuleComponent app1aComponent = createAppModuleComponent("app1a"); + ModuleComponent app1bComponent = createAppModuleComponent("app1b"); + Component source = MockFactory.createSystemComponent("source", Source.class, AutowireSourceImpl.class, Scope.MODULE); + app1aComponent.getImplementation().getComponents().add(source); + app1Component.getImplementation().getComponents().add(app1aComponent); + app1Component.getImplementation().getComponents().add(app1bComponent); + + Component target = MockFactory.createSystemComponent("target", Target.class, TargetImpl.class, Scope.MODULE); + app1bComponent.getImplementation().getComponents().add(target); + + EntryPoint ep = MockFactory.createEPSystemBinding("target.ep", Target.class, "target", target); + ep.getBindings().add(systemFactory.createSystemBinding()); + Service service = systemFactory.createService(); + service.setName("target.ep"); + ep.getConfiguredReference().getTargetConfiguredServices().get(0).setPort(service); + app1bComponent.getImplementation().getEntryPoints().add(ep); + + CompositeContext root = runtime.getRootContext(); + root.registerModelObject(app1Component); + return runtime; + } + + private RuntimeContext createScenario3Runtime() throws Exception { + RuntimeContext runtime = MockFactory.createCoreRuntime(); + runtime.start(); + SystemCompositeContext system = runtime.getSystemContext(); + ModuleComponent system1Component = MockFactory.createSystemCompositeComponent("system1"); + ModuleComponent system2Component = MockFactory.createSystemCompositeComponent("system2"); + ModuleComponent system1aComponent = MockFactory.createSystemCompositeComponent("system1a"); + system1Component.getImplementation().getComponents().add(system1aComponent); + + Component target = MockFactory.createSystemComponent("target", Target.class, TargetImpl.class, Scope.MODULE); + system2Component.getImplementation().getComponents().add(target); + EntryPoint ep = MockFactory.createEPSystemBinding("target.ep", Target.class, "target", target); + system2Component.getImplementation().getEntryPoints().add(ep); + system.registerModelObject(system2Component); + + Component source = MockFactory.createSystemComponent("source", Source.class, AutowireSourceImpl.class, Scope.MODULE); + system1aComponent.getImplementation().getComponents().add(source); + system.registerModelObject(system1Component); + system.publish(new ModuleStart(this)); + return runtime; + } + + private RuntimeContext createScenario4Runtime() throws Exception { + RuntimeContext runtime = MockFactory.createCoreRuntime(); + runtime.start(); + SystemCompositeContext system = runtime.getSystemContext(); + ModuleComponent system1Component = MockFactory.createSystemCompositeComponent("system1"); + ModuleComponent system1aComponent = MockFactory.createSystemCompositeComponent("system1a"); + system1Component.getImplementation().getComponents().add(system1aComponent); + + Component target = MockFactory.createSystemComponent("target", Target.class, TargetImpl.class, Scope.MODULE); + system1Component.getImplementation().getComponents().add(target); + + Component source = MockFactory.createSystemComponent("source", Source.class, AutowireSourceImpl.class, Scope.MODULE); + system1aComponent.getImplementation().getComponents().add(source); + system.registerModelObject(system1Component); + system.publish(new ModuleStart(this)); + return runtime; + } + + private RuntimeContext createScenario5Runtime() throws Exception { + RuntimeContext runtime = MockFactory.createCoreRuntime(); + runtime.start(); + SystemCompositeContext system = runtime.getSystemContext(); + ModuleComponent system1Component = MockFactory.createSystemCompositeComponent("system1"); + ModuleComponent system1aComponent = MockFactory.createSystemCompositeComponent("system1a"); + system1Component.getImplementation().getComponents().add(system1aComponent); + + Component target = MockFactory.createSystemComponent("target", Target.class, TargetImpl.class, Scope.MODULE); + system.registerModelObject(target); + + Component source = MockFactory.createSystemComponent("source", Source.class, AutowireSourceImpl.class, Scope.MODULE); + system1aComponent.getImplementation().getComponents().add(source); + system.registerModelObject(system1Component); + system.publish(new ModuleStart(this)); + return runtime; + } + + private ModuleComponent createAppModuleComponent(String name) throws ConfigurationLoadException { + AssemblyContext assemblyContext = new AssemblyContextImpl(systemFactory, null, null); + ModuleComponent mc = systemFactory.createModuleComponent(); + mc.setName(name); + Module module = systemFactory.createModule(); + module.setImplementationClass(CompositeContextImpl.class); + module.setComponentType(MockFactory.getComponentType()); + module.setName(name); + module.initialize(assemblyContext); + mc.setImplementation(module); + return mc; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/CompositeNestingTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/CompositeNestingTestCase.java new file mode 100644 index 0000000000..27ffc5794e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/CompositeNestingTestCase.java @@ -0,0 +1,98 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.context; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.mock.MockFactory; +import org.apache.tuscany.core.mock.component.Source; +import org.apache.tuscany.core.mock.component.Target; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.model.assembly.ModuleComponent; +import org.apache.tuscany.model.assembly.Scope; + +/** + * Tests registering arbirarily deep child composite contexts + * + * @version $Rev$ $Date$ + */ +public class CompositeNestingTestCase extends TestCase { + + /** + * Tests registration of a 3-level deep hierarchy under the top-level system composite context + */ + public void testSystemContext() throws Exception { + RuntimeContext runtime = MockFactory.createCoreRuntime(); + ModuleComponent child1 = createHierarchy(); + runtime.getSystemContext().registerModelObject(child1); + CompositeContext child1Ctx = (CompositeContext) runtime.getSystemContext().getContext("child1"); + Assert.assertNotNull(child1Ctx); + child1Ctx.publish(new ModuleStart(this)); + analyzeLeafComponents(child1Ctx); + CompositeContext child2Ctx = (CompositeContext) child1Ctx.getContext("child2"); + Assert.assertNotNull(child2Ctx); + child2Ctx.publish(new ModuleStart(this)); + analyzeLeafComponents(child2Ctx); + CompositeContext child3Ctx = (CompositeContext) child2Ctx.getContext("child3"); + Assert.assertNotNull(child3Ctx); + child3Ctx.publish(new ModuleStart(this)); + analyzeLeafComponents(child3Ctx); + + Assert.assertNull(child1Ctx.getContext("child3")); // sanity check + } + + /** + * Tests registration of a 3-level deep hierarchy under the root application composite context + */ + public void testRootContext() throws Exception { + RuntimeContext runtime = MockFactory.createCoreRuntime(); + ModuleComponent child1 = createHierarchy(); + runtime.getRootContext().registerModelObject(child1); + CompositeContext child1Ctx = (CompositeContext) runtime.getRootContext().getContext("child1"); + Assert.assertNotNull(child1Ctx); + child1Ctx.publish(new ModuleStart(this)); + analyzeLeafComponents(child1Ctx); + CompositeContext child2Ctx = (CompositeContext) child1Ctx.getContext("child2"); + Assert.assertNotNull(child2Ctx); + child2Ctx.publish(new ModuleStart(this)); + analyzeLeafComponents(child2Ctx); + CompositeContext child3Ctx = (CompositeContext) child2Ctx.getContext("child3"); + Assert.assertNotNull(child3Ctx); + child3Ctx.publish(new ModuleStart(this)); + analyzeLeafComponents(child3Ctx); + + Assert.assertNull(child1Ctx.getContext("child3")); // sanity check + child1Ctx.publish(new ModuleStop(this)); + } + + private ModuleComponent createHierarchy() throws ConfigurationLoadException { + ModuleComponent child3 = MockFactory.createSystemModuleComponentWithWiredComponents("child3", Scope.MODULE, Scope.MODULE); + ModuleComponent child2 = MockFactory.createSystemModuleComponentWithWiredComponents("child2", Scope.MODULE, Scope.MODULE); + child2.getImplementation().getComponents().add(child3); + ModuleComponent child1 = MockFactory.createSystemModuleComponentWithWiredComponents("child1", Scope.MODULE, Scope.MODULE); + child1.getImplementation().getComponents().add(child2); + return child1; + } + + private void analyzeLeafComponents(CompositeContext ctx) throws Exception { + Source source = (Source) ctx.getContext("source").getInstance(null); + Assert.assertNotNull(source); + Target target = source.getTarget(); + Assert.assertNotNull(target); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/IntraCompositeWireTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/IntraCompositeWireTestCase.java new file mode 100644 index 0000000000..a956263cc8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/IntraCompositeWireTestCase.java @@ -0,0 +1,125 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.context; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.SystemCompositeContext; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.mock.MockConfigContext; +import org.apache.tuscany.core.mock.MockFactory; +import org.apache.tuscany.core.mock.component.Source; +import org.apache.tuscany.core.mock.component.Target; +import org.apache.tuscany.model.assembly.Scope; + +import java.util.List; + +/** + * Tests intra-composite system component wiring scenarios + * + * @version $Rev$ $Date$ + */ +public class IntraCompositeWireTestCase extends TestCase { + + public void testModuleToModuleScope() throws Exception { + SystemCompositeContext context = createContext(); + context.start(); + context.registerModelObject(MockFactory.createSystemModuleWithWiredComponents("system.module",Scope.MODULE, Scope.MODULE)); + context.publish(new ModuleStart(this)); + Source source = (Source) ((AtomicContext) context.getContext("source")).getTargetInstance(); + Assert.assertNotNull(source); + Target targetRef = source.getTarget(); + Assert.assertNotNull(targetRef); + Target target = (Target) ((AtomicContext) context.getContext("target")).getTargetInstance(); + Assert.assertSame(target, targetRef); + Assert.assertSame(target, source.getTarget()); + context.publish(new ModuleStop(this)); + context.stop(); + } + + public void testStatelessToModuleScope() throws Exception { + SystemCompositeContext context = createContext(); + context.start(); + context.registerModelObject(MockFactory.createSystemModuleWithWiredComponents("system.module",Scope.INSTANCE, Scope.MODULE)); + context.publish(new ModuleStart(this)); + Source source = (Source) ((AtomicContext) context.getContext("source")).getTargetInstance(); + Assert.assertNotNull(source); + Target targetRef = source.getTarget(); + Assert.assertNotNull(targetRef); + source = (Source) ((AtomicContext) context.getContext("source")).getTargetInstance(); + Target target = (Target) ((AtomicContext) context.getContext("target")).getTargetInstance(); + Assert.assertSame(target, targetRef); + Assert.assertSame(target, source.getTarget()); + context.publish(new ModuleStop(this)); + context.stop(); + } + + public void testModuleToStatelessScope() throws Exception { + SystemCompositeContext context = createContext(); + context.start(); + context.registerModelObject(MockFactory.createSystemModuleWithWiredComponents("system.module",Scope.MODULE, Scope.INSTANCE)); + context.publish(new ModuleStart(this)); + Source source = (Source) ((AtomicContext) context.getContext("source")).getTargetInstance(); + Assert.assertNotNull(source); + Target targetRef = source.getTarget(); + Assert.assertNotNull(targetRef); + Target target = (Target) ((AtomicContext) context.getContext("target")).getTargetInstance(); + Assert.assertNotSame(target, targetRef); + Source source2 = (Source) ((AtomicContext) context.getContext("source")).getTargetInstance(); + // should be the same since the module scope component was alreadyy created and the stateless + // component will be "attached" to it + Assert.assertSame(source.getTarget(), source2.getTarget()); + context.publish(new ModuleStop(this)); + context.stop(); + } + + public void testMultiplicity() throws Exception { + SystemCompositeContext context = createContext(); + context.start(); + context.registerModelObject(MockFactory.createSystemModuleWithWiredComponents("system.module",Scope.MODULE, Scope.MODULE)); + context.publish(new ModuleStart(this)); + Source source = (Source) ((AtomicContext) context.getContext("source")).getTargetInstance(); + Assert.assertNotNull(source); + Target target = (Target) ((AtomicContext) context.getContext("target")).getTargetInstance(); + Assert.assertNotNull(target); + // test setter injection + List<Target> targets = source.getTargets(); + Assert.assertEquals(1,targets.size()); + assertSame(target,targets.get(0)); + + // test field injection + targets = source.getTargetsThroughField(); + Assert.assertEquals(1,targets.size()); + assertSame(target,targets.get(0)); + + // test array injection + Target[] targetArray = source.getArrayOfTargets(); + Assert.assertEquals(1,targetArray.length); + assertSame(target,targetArray[0]); + + + } + + private SystemCompositeContext createContext() { + SystemCompositeContextImpl context = new SystemCompositeContextImpl(); + context.setName("system.context"); + context.setConfigurationContext(new MockConfigContext(MockFactory.createSystemBuilders())); + return context; + } + + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/SystemCompositeComponentContextTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/SystemCompositeComponentContextTestCase.java new file mode 100644 index 0000000000..75208f47b6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/SystemCompositeComponentContextTestCase.java @@ -0,0 +1,108 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.context; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.mock.MockConfigContext; +import org.apache.tuscany.core.mock.MockFactory; +import org.apache.tuscany.core.mock.component.ModuleScopeSystemComponent; +import org.apache.tuscany.core.mock.component.ModuleScopeSystemComponentImpl; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.Scope; + +import java.util.List; + +/** + * Tests the system composite context + * + * @version $Rev$ $Date$ + */ +public class SystemCompositeComponentContextTestCase extends TestCase { + private SystemAssemblyFactory factory; + private SystemCompositeContextImpl system; + + public void testChildLocate() throws Exception { + system.start(); + Component compositeComponent = MockFactory.createCompositeComponent("system.child"); + system.registerModelObject(compositeComponent); + CompositeContext childContext = (CompositeContext) system.getContext("system.child"); + Assert.assertNotNull(childContext); + + Component component = factory.createSystemComponent("TestService1", ModuleScopeSystemComponent.class, ModuleScopeSystemComponentImpl.class, Scope.MODULE); + EntryPoint ep = MockFactory.createEPSystemBinding("TestService1EP", ModuleScopeSystemComponent.class, "TestService1", component); + childContext.registerModelObject(component); + childContext.registerModelObject(ep); + childContext.publish(new ModuleStart(this)); + Assert.assertNotNull(system.getContext("system.child").getInstance(new QualifiedName("./TestService1EP"))); + childContext.publish(new ModuleStop(this)); + } + + public void testAutowireRegisterBeforeStart() throws Exception { + Component component = factory.createSystemComponent("TestService1", ModuleScopeSystemComponent.class, ModuleScopeSystemComponentImpl.class, Scope.MODULE); + EntryPoint ep = MockFactory.createEPSystemBinding("TestService1EP", ModuleScopeSystemComponent.class, "TestService1", component); + system.registerModelObject(component); + system.registerModelObject(ep); + system.start(); + system.publish(new ModuleStart(this)); + Assert.assertSame(system.getContext("TestService1EP").getInstance(null), system.resolveInstance(ModuleScopeSystemComponent.class)); + } + + public void testAutowireRegisterAfterStart() throws Exception { + Component component = factory.createSystemComponent("TestService1", ModuleScopeSystemComponent.class, ModuleScopeSystemComponentImpl.class, Scope.MODULE); + system.registerModelObject(component); + system.start(); + system.publish(new ModuleStart(this)); + EntryPoint ep = MockFactory.createEPSystemBinding("TestService1EP", ModuleScopeSystemComponent.class, "TestService1", component); + system.registerModelObject(ep); + Assert.assertSame(system.getContext("TestService1EP").getInstance(null), system.resolveInstance(ModuleScopeSystemComponent.class)); + } + + public void testAutowireModuleRegisterBeforeStart() throws Exception { + system.registerModelObject(MockFactory.createSystemModule()); + system.start(); + system.publish(new ModuleStart(this)); + Assert.assertSame(system.getContext("TestService1EP").getInstance(null), system.resolveInstance(ModuleScopeSystemComponent.class)); + } + + public void testAutowireModuleRegisterAfterStart() throws Exception { + system.start(); + system.publish(new ModuleStart(this)); + system.registerModelObject(MockFactory.createSystemModule()); + Assert.assertSame(system.getContext("TestService1EP").getInstance(null), system.resolveInstance(ModuleScopeSystemComponent.class)); + } + + protected void setUp() throws Exception { + super.setUp(); + factory = new SystemAssemblyFactoryImpl(); + List<ContextFactoryBuilder> builders = MockFactory.createSystemBuilders(); + + system = new SystemCompositeContextImpl("system", null, null, new SystemScopeStrategy(), new EventContextImpl(), new MockConfigContext(builders)); + } + + protected void tearDown() throws Exception { + system.publish(new ModuleStop(this)); + system.stop(); + super.tearDown(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/SystemCompositeContextRegisterTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/SystemCompositeContextRegisterTestCase.java new file mode 100644 index 0000000000..4397e39bec --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/SystemCompositeContextRegisterTestCase.java @@ -0,0 +1,37 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.context; + +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.context.CompositeContextRegisterTestCase; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.DefaultScopeStrategy; +import org.apache.tuscany.core.mock.MockConfigContext; +import org.apache.tuscany.core.mock.MockFactory; + +import java.util.List; + +/** + * Tests registration of model objects for an system composite context + * + * @version $Rev$ $Date$ + */ +public class SystemCompositeContextRegisterTestCase extends CompositeContextRegisterTestCase { + + protected CompositeContext createContext() { + List<ContextFactoryBuilder> builders = MockFactory.createSystemBuilders(); + return new SystemCompositeContextImpl("test.context", null, null, new DefaultScopeStrategy(), new EventContextImpl(), new MockConfigContext(builders)); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/SystemCompositeHierarchyTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/SystemCompositeHierarchyTestCase.java new file mode 100644 index 0000000000..ba7a3ba5da --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/SystemCompositeHierarchyTestCase.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.system.context; + +import junit.framework.Assert; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.context.AbstractCompositeHierarchyTests; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.impl.EventContextImpl; +import org.apache.tuscany.core.context.scope.DefaultScopeStrategy; +import org.apache.tuscany.core.mock.MockConfigContext; +import org.apache.tuscany.core.mock.MockFactory; + +import java.util.List; + +/** + * Performs testing of various hierarchical scenarios + * + * @version $Rev$ $Date$ + */ +public class SystemCompositeHierarchyTestCase extends AbstractCompositeHierarchyTests { + + + + protected CompositeContext createContextHierachy() throws Exception { + List<ContextFactoryBuilder> mockBuilders = MockFactory.createSystemBuilders(); + CompositeContext parent = new SystemCompositeContextImpl("test.parent", null, null, new DefaultScopeStrategy(), new EventContextImpl(), new MockConfigContext(mockBuilders)); + parent.registerModelObject(MockFactory.createCompositeComponent("test.child")); + parent.start(); + CompositeContext child = (CompositeContext) parent.getContext("test.child"); + Assert.assertNotNull(child); + return parent; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/SystemObjectRegistrationTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/SystemObjectRegistrationTestCase.java new file mode 100644 index 0000000000..241346e24f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/SystemObjectRegistrationTestCase.java @@ -0,0 +1,84 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.system.context; + +import junit.framework.TestCase; +import org.apache.tuscany.core.config.ConfigurationException; +import org.apache.tuscany.core.context.SystemCompositeContext; +import org.apache.tuscany.core.context.DuplicateNameException; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.core.runtime.RuntimeContextImpl; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.builder.impl.DefaultWireBuilder; +import org.apache.tuscany.core.client.BootstrapHelper; +import org.apache.tuscany.common.monitor.MonitorFactory; +import org.apache.tuscany.common.monitor.impl.NullMonitorFactory; + +/** + * @version $Rev$ $Date$ + */ +public class SystemObjectRegistrationTestCase extends TestCase { + private RuntimeContext runtime; + private SystemCompositeContext systemContext; + + public void testRegistration() throws ConfigurationException { + MockComponent instance = new MockComponent(); + systemContext.registerJavaObject("foo", MockComponent.class, instance); + assertSame(instance, systemContext.getContext("foo").getInstance(null)); + } + + public void testDuplicateRegistration() throws ConfigurationException { + MockComponent instance = new MockComponent(); + systemContext.registerJavaObject("foo", MockComponent.class, instance); + try { + systemContext.registerJavaObject("foo", MockComponent.class, instance); + fail(); + } catch (DuplicateNameException e) { + // ok + } + } + + public void testAutowireToObject() throws ConfigurationException { + MockComponent instance = new MockComponent(); + systemContext.registerJavaObject("foo", MockComponent.class, instance); + assertSame(instance, systemContext.resolveInstance(MockComponent.class)); + assertNull(systemContext.resolveExternalInstance(MockComponent.class)); + } + + protected void setUp() throws Exception { + super.setUp(); + MonitorFactory monitorFactory = new NullMonitorFactory(); + ContextFactoryBuilderRegistry builderRegistry = BootstrapHelper.bootstrapContextFactoryBuilders(monitorFactory); + DefaultWireBuilder wireBuilder = new DefaultWireBuilder(); + runtime = new RuntimeContextImpl(monitorFactory, builderRegistry, wireBuilder); + runtime.start(); + systemContext = runtime.getSystemContext(); + systemContext.publish(new ModuleStart(this)); + } + + protected void tearDown() throws Exception { + runtime.stop(); + super.tearDown(); + } + + private static class MockComponent { + public String hello(String message) { + return message; + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/TestBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/TestBuilder.java new file mode 100644 index 0000000000..c531c8f7f9 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/system/context/TestBuilder.java @@ -0,0 +1,55 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.system.context; + +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Scope; + +import org.apache.tuscany.core.builder.BuilderException; +import org.apache.tuscany.core.builder.ContextFactoryBuilder; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.system.annotation.Autowire; +import org.apache.tuscany.model.assembly.AssemblyObject; + +@Scope("MODULE") +public class TestBuilder implements ContextFactoryBuilder { + private ContextFactoryBuilderRegistry builderRegistry; + + private boolean invoked = false; + + public TestBuilder() { + super(); + } + + @Init(eager = true) + public void init() { + builderRegistry.register(this); + } + + @Autowire + public void setBuilderRegistry(ContextFactoryBuilderRegistry builderRegistry) { + this.builderRegistry = builderRegistry; + } + + public void build(AssemblyObject object) throws BuilderException { + invoked = true; + } + + public boolean invoked() { + return invoked; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/InvocationConfigurationErrorTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/InvocationConfigurationErrorTestCase.java new file mode 100644 index 0000000000..5e4b3e2f9e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/InvocationConfigurationErrorTestCase.java @@ -0,0 +1,155 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.core.wire.impl.InvokerInterceptor; +import org.apache.tuscany.core.wire.impl.MessageChannelImpl; +import org.apache.tuscany.core.wire.mock.MockHandler; +import org.apache.tuscany.core.wire.mock.SimpleTarget; +import org.apache.tuscany.core.wire.mock.MockSyncInterceptor; +import org.apache.tuscany.core.wire.mock.SimpleTargetImpl; +import org.apache.tuscany.core.wire.mock.MockStaticInvoker; +import org.apache.tuscany.core.message.Message; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; + +import java.lang.reflect.Method; + +/** + * Tests error propagation through an innvocation + * + * @version $Rev$ $Date$ + */ +public class InvocationConfigurationErrorTestCase extends TestCase { + + + private Method hello; + + private MessageFactory factory = new MessageFactoryImpl(); + + public InvocationConfigurationErrorTestCase() { + super(); + } + + public InvocationConfigurationErrorTestCase(String arg0) { + super(arg0); + } + + public void setUp() throws Exception { + hello = SimpleTarget.class.getMethod("hello", String.class); + } + + public void testInvokeWithHandlers() throws Exception{ + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + MockHandler sourceRequestHandler = new MockHandler(); + MockHandler sourceResponseHandler = new MockHandler(); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addRequestHandler(sourceRequestHandler); + source.addResponseHandler(sourceResponseHandler); + source.addInterceptor(sourceInterceptor); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockHandler targetRequestHandler = new MockHandler(); + MockHandler targetResponseHandler = new MockHandler(); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addRequestHandler(targetRequestHandler); + target.addResponseHandler(targetResponseHandler); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + // connect the source to the target + source.setTargetRequestChannel(new MessageChannelImpl(target.getRequestHandlers())); + source.setTargetResponseChannel(new MessageChannelImpl(target.getResponseHandlers())); + source.build(); + target.build(); + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + + Message msg = factory.createMessage(); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + Assert.assertTrue(response.getBody() instanceof IllegalArgumentException); + Assert.assertEquals(1,sourceRequestHandler.getCount()); + Assert.assertEquals(1,sourceResponseHandler.getCount()); + Assert.assertEquals(1,sourceInterceptor.getCount()); + Assert.assertEquals(1,targetRequestHandler.getCount()); + Assert.assertEquals(1,targetResponseHandler.getCount()); + Assert.assertEquals(1,targetInterceptor.getCount()); + } + + public void testInvokeWithRequestHandlers() throws Exception{ + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + MockHandler sourceRequestHandler = new MockHandler(); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addRequestHandler(sourceRequestHandler); + source.addInterceptor(sourceInterceptor); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockHandler targetRequestHandler = new MockHandler(); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addRequestHandler(targetRequestHandler); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + // connect the source to the target + source.setTargetRequestChannel(new MessageChannelImpl(target.getRequestHandlers())); + source.setTargetResponseChannel(new MessageChannelImpl(target.getResponseHandlers())); + source.build(); + target.build(); + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + + Message msg = factory.createMessage(); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + Assert.assertTrue(response.getBody() instanceof IllegalArgumentException); + Assert.assertEquals(1,sourceRequestHandler.getCount()); + Assert.assertEquals(1,sourceInterceptor.getCount()); + Assert.assertEquals(1,targetRequestHandler.getCount()); + Assert.assertEquals(1,targetInterceptor.getCount()); + } + + /** + * Tests basic wiring of a source to a target, including handlers and interceptors + */ + public void testInvokeWithInterceptorsOnly() throws Exception{ + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addInterceptor(sourceInterceptor); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + // connect the source to the target + source.setTargetInterceptor(target.getHeadInterceptor()); + source.build(); + target.build(); + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + + Message msg = factory.createMessage(); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + Assert.assertTrue(response.getBody() instanceof IllegalArgumentException); + Assert.assertEquals(1,sourceInterceptor.getCount()); + Assert.assertEquals(1,targetInterceptor.getCount()); + + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/InvocationConfigurationTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/InvocationConfigurationTestCase.java new file mode 100644 index 0000000000..0519573439 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/InvocationConfigurationTestCase.java @@ -0,0 +1,153 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.core.wire.impl.InvokerInterceptor; +import org.apache.tuscany.core.wire.impl.MessageChannelImpl; +import org.apache.tuscany.core.wire.mock.SimpleTarget; +import org.apache.tuscany.core.wire.mock.MockHandler; +import org.apache.tuscany.core.wire.mock.MockSyncInterceptor; +import org.apache.tuscany.core.wire.mock.MockStaticInvoker; +import org.apache.tuscany.core.wire.mock.SimpleTargetImpl; +import org.apache.tuscany.core.message.Message; +import org.apache.tuscany.core.message.MessageFactory; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; + +import java.lang.reflect.Method; + +public class InvocationConfigurationTestCase extends TestCase { + + private Method hello; + + + private MessageFactory factory = new MessageFactoryImpl(); + + public InvocationConfigurationTestCase() { + super(); + } + + public InvocationConfigurationTestCase(String arg0) { + super(arg0); + } + + public void setUp() throws Exception { + hello = SimpleTarget.class.getMethod("hello", String.class); + } + + /** + * Tests basic wiring of a source to a target, including handlers and interceptors + */ + public void testInvokeWithHandlers() throws Exception { + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + MockHandler sourceRequestHandler = new MockHandler(); + MockHandler sourceResponseHandler = new MockHandler(); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addRequestHandler(sourceRequestHandler); + source.addResponseHandler(sourceResponseHandler); + source.addInterceptor(sourceInterceptor); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockHandler targetRequestHandler = new MockHandler(); + MockHandler targetResponseHandler = new MockHandler(); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addRequestHandler(targetRequestHandler); + target.addResponseHandler(targetResponseHandler); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + // connect the source to the target + source.setTargetRequestChannel(new MessageChannelImpl(target.getRequestHandlers())); + source.setTargetResponseChannel(new MessageChannelImpl(target.getResponseHandlers())); + source.build(); + target.build(); + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + + Message msg = factory.createMessage(); + msg.setBody("foo"); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + Assert.assertEquals("foo", response.getBody()); + Assert.assertEquals(1, sourceRequestHandler.getCount()); + Assert.assertEquals(1, sourceResponseHandler.getCount()); + Assert.assertEquals(1, sourceInterceptor.getCount()); + Assert.assertEquals(1, targetRequestHandler.getCount()); + Assert.assertEquals(1, targetResponseHandler.getCount()); + Assert.assertEquals(1, targetInterceptor.getCount()); + } + + public void testInvokeWithRequestHandlers() throws Exception { + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + MockHandler sourceRequestHandler = new MockHandler(); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addRequestHandler(sourceRequestHandler); + source.addInterceptor(sourceInterceptor); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockHandler targetRequestHandler = new MockHandler(); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addRequestHandler(targetRequestHandler); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + // connect the source to the target + source.setTargetRequestChannel(new MessageChannelImpl(target.getRequestHandlers())); + source.setTargetResponseChannel(new MessageChannelImpl(target.getResponseHandlers())); + source.build(); + target.build(); + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + + Message msg = factory.createMessage(); + msg.setBody("foo"); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + Assert.assertEquals("foo", response.getBody()); + Assert.assertEquals(1, sourceRequestHandler.getCount()); + Assert.assertEquals(1, sourceInterceptor.getCount()); + Assert.assertEquals(1, targetRequestHandler.getCount()); + Assert.assertEquals(1, targetInterceptor.getCount()); + } + + /** + * Tests basic wiring of a source to a target, including handlers and interceptors + */ + public void testInvokeWithInterceptorsOnly() throws Exception { + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addInterceptor(sourceInterceptor); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(hello); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + // connect the source to the target + source.setTargetInterceptor(target.getHeadInterceptor()); + source.build(); + target.build(); + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + + Message msg = factory.createMessage(); + msg.setBody("foo"); + msg.setTargetInvoker(invoker); + Message response = source.getHeadInterceptor().invoke(msg); + Assert.assertEquals("foo", response.getBody()); + Assert.assertEquals(1, sourceInterceptor.getCount()); + Assert.assertEquals(1, targetInterceptor.getCount()); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/InvocationErrorTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/InvocationErrorTestCase.java new file mode 100644 index 0000000000..1d04e18757 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/InvocationErrorTestCase.java @@ -0,0 +1,122 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.core.wire.impl.InvokerInterceptor; +import org.apache.tuscany.core.wire.jdk.JDKInvocationHandler; +import org.apache.tuscany.core.wire.mock.MockHandler; +import org.apache.tuscany.core.wire.mock.MockStaticInvoker; +import org.apache.tuscany.core.wire.mock.MockSyncInterceptor; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Map; + +/** + * Tests handling of exceptions thrown during an wire + * + * @version $Rev: 377006 $ $Date: 2006-02-11 09:41:59 -0800 (Sat, 11 Feb 2006) $ + */ +public class InvocationErrorTestCase extends TestCase { + + private Method checkedMethod; + private Method runtimeMethod; + + public InvocationErrorTestCase() { + super(); + } + + public InvocationErrorTestCase(String arg0) { + super(arg0); + } + + public void setUp() throws Exception { + checkedMethod = TestBean.class.getDeclaredMethod("checkedException", (Class[]) null); + runtimeMethod = TestBean.class.getDeclaredMethod("runtimeException", (Class[]) null); + Assert.assertNotNull(checkedMethod); + Assert.assertNotNull(runtimeMethod); + } + + public void testCheckedException() throws Exception { + Map<Method, InvocationConfiguration> config = new MethodHashMap(); + config.put(checkedMethod, getConfiguration(checkedMethod)); + InvocationHandler handler = new JDKInvocationHandler(new MessageFactoryImpl(), config); + try { + TestBean proxy = (TestBean) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), + new Class[]{TestBean.class}, handler); + proxy.checkedException(); + } catch (TestException e) { + return; + } + Assert.fail(TestException.class.getName() + " should have been thrown"); + } + + public void testRuntimeException() throws Exception { + Map<Method, InvocationConfiguration> config = new MethodHashMap<InvocationConfiguration>(); + config.put(runtimeMethod, getConfiguration(runtimeMethod)); + InvocationHandler handler = new JDKInvocationHandler(new MessageFactoryImpl(), config); + try { + TestBean proxy = (TestBean) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), + new Class[]{TestBean.class}, handler); + proxy.runtimeException(); + } catch (TestRuntimeException e) { + return; + } + Assert.fail(TestException.class.getName() + " should have been thrown"); + } + + private InvocationConfiguration getConfiguration(Method m) { + MockStaticInvoker invoker = new MockStaticInvoker(m, new TestBeanImpl()); + SourceInvocationConfiguration invocationConfiguration=new SourceInvocationConfiguration(m); + invocationConfiguration.addInterceptor(new MockSyncInterceptor()); + invocationConfiguration.addRequestHandler(new MockHandler()); + invocationConfiguration.setTargetInvoker(invoker); + invocationConfiguration.setTargetInterceptor(new InvokerInterceptor()); + invocationConfiguration.build(); + return invocationConfiguration; + } + + public interface TestBean { + + public void checkedException() throws TestException; + + public void runtimeException() throws TestRuntimeException; + + } + + public class TestBeanImpl implements TestBean { + + public void checkedException() throws TestException { + throw new TestException(); + } + + public void runtimeException() throws TestRuntimeException { + throw new TestRuntimeException(); + } + } + + public class TestException extends Exception { + } + + public class TestRuntimeException extends RuntimeException { + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/jdk/JDKInvocationHandlerTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/jdk/JDKInvocationHandlerTestCase.java new file mode 100644 index 0000000000..28a2da23b5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/jdk/JDKInvocationHandlerTestCase.java @@ -0,0 +1,126 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.wire.jdk; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.core.wire.InvocationConfiguration; +import org.apache.tuscany.core.wire.MethodHashMap; +import org.apache.tuscany.core.wire.SourceInvocationConfiguration; +import org.apache.tuscany.core.wire.TargetInvocationConfiguration; +import org.apache.tuscany.core.wire.mock.SimpleTarget; +import org.apache.tuscany.core.wire.mock.SimpleTargetImpl; +import org.apache.tuscany.core.wire.mock.MockStaticInvoker; +import org.apache.tuscany.core.wire.mock.MockHandler; +import org.apache.tuscany.core.wire.mock.MockSyncInterceptor; +import org.apache.tuscany.core.wire.impl.InvokerInterceptor; +import org.apache.tuscany.core.wire.impl.MessageChannelImpl; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; + +import java.lang.reflect.Method; +import java.util.Map; + +public class JDKInvocationHandlerTestCase extends TestCase { + + private Method hello; + + public JDKInvocationHandlerTestCase() { + super(); + } + + public JDKInvocationHandlerTestCase(String arg0) { + super(arg0); + } + + public void setUp() throws Exception { + hello = SimpleTarget.class.getMethod("hello", String.class); + } + + public void testBasicInvoke() throws Throwable { + Map<Method, InvocationConfiguration> configs = new MethodHashMap<InvocationConfiguration>(); + configs.put(hello, getInvocationHandler(hello)); + JDKInvocationHandler handler = new JDKInvocationHandler(new MessageFactoryImpl(), configs); + Assert.assertEquals("foo", handler.invoke(null, hello, new Object[] { "foo" })); + } + + public void testErrorInvoke() throws Throwable { + Map<Method, InvocationConfiguration> configs = new MethodHashMap<InvocationConfiguration>(); + configs.put(hello, getInvocationHandler(hello)); + JDKInvocationHandler handler = new JDKInvocationHandler(new MessageFactoryImpl(), configs); + try { + Assert.assertEquals("foo", handler.invoke(null, hello, new Object[] {})); + fail("Expected " + IllegalArgumentException.class.getName()); + } catch (IllegalArgumentException e) { + // should throw + } + } + + public void testDirectErrorInvoke() throws Throwable { + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + + Map<Method, InvocationConfiguration> configs = new MethodHashMap<InvocationConfiguration>(); + configs.put(hello, source); + JDKInvocationHandler handler = new JDKInvocationHandler(new MessageFactoryImpl(), configs); + try { + Assert.assertEquals("foo", handler.invoke(null, hello, new Object[] {})); + fail("Expected " + IllegalArgumentException.class.getName()); + } catch (IllegalArgumentException e) { + // should throw + } + } + + public void testDirectInvoke() throws Throwable { + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + MockStaticInvoker invoker = new MockStaticInvoker(hello, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + + Map<Method, InvocationConfiguration> configs = new MethodHashMap<InvocationConfiguration>(); + configs.put(hello, source); + JDKInvocationHandler handler = new JDKInvocationHandler(new MessageFactoryImpl(), configs); + Assert.assertEquals("foo", handler.invoke(null, hello, new Object[] { "foo" })); + } + + private InvocationConfiguration getInvocationHandler(Method m) { + SourceInvocationConfiguration source = new SourceInvocationConfiguration(m); + MockHandler sourceRequestHandler = new MockHandler(); + MockHandler sourceResponseHandler = new MockHandler(); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addRequestHandler(sourceRequestHandler); + source.addResponseHandler(sourceResponseHandler); + source.addInterceptor(sourceInterceptor); + + TargetInvocationConfiguration target = new TargetInvocationConfiguration(m); + MockHandler targetRequestHandler = new MockHandler(); + MockHandler targetResponseHandler = new MockHandler(); + MockSyncInterceptor targetInterceptor = new MockSyncInterceptor(); + target.addRequestHandler(targetRequestHandler); + target.addResponseHandler(targetResponseHandler); + target.addInterceptor(targetInterceptor); + target.addInterceptor(new InvokerInterceptor()); + + // connect the source to the target + source.setTargetRequestChannel(new MessageChannelImpl(target.getRequestHandlers())); + source.setTargetResponseChannel(new MessageChannelImpl(target.getResponseHandlers())); + source.build(); + target.build(); + MockStaticInvoker invoker = new MockStaticInvoker(m, new SimpleTargetImpl()); + source.setTargetInvoker(invoker); + return source; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/jdk/JDKWireFactoryFactoryTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/jdk/JDKWireFactoryFactoryTestCase.java new file mode 100644 index 0000000000..60f8cf837d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/jdk/JDKWireFactoryFactoryTestCase.java @@ -0,0 +1,83 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.jdk; + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.wire.MethodHashMap; +import org.apache.tuscany.core.wire.WireSourceConfiguration; +import org.apache.tuscany.core.wire.SourceInvocationConfiguration; +import org.apache.tuscany.core.wire.TargetInvocationConfiguration; +import org.apache.tuscany.core.wire.WireTargetConfiguration; +import org.apache.tuscany.core.wire.impl.InvokerInterceptor; +import org.apache.tuscany.core.wire.mock.MockStaticInvoker; +import org.apache.tuscany.core.wire.mock.MockSyncInterceptor; +import org.apache.tuscany.core.wire.mock.SimpleTarget; +import org.apache.tuscany.core.wire.mock.SimpleTargetImpl; +import org.apache.tuscany.core.message.impl.MessageFactoryImpl; + +import java.lang.reflect.Method; +import java.util.Map; + +public class JDKWireFactoryFactoryTestCase extends TestCase { + + private Method hello; + + public JDKWireFactoryFactoryTestCase(String arg0) { + super(arg0); + } + + public void setUp() throws Exception { + hello = SimpleTarget.class.getMethod("hello", String.class); + } + + public void testSourceWireFactory() throws Exception { + SourceInvocationConfiguration source = new SourceInvocationConfiguration(hello); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addInterceptor(sourceInterceptor); + source.setTargetInterceptor(new InvokerInterceptor()); + source.setTargetInvoker(new MockStaticInvoker(hello, new SimpleTargetImpl())); + source.build(); + Map<Method, SourceInvocationConfiguration> configs = new MethodHashMap<SourceInvocationConfiguration>(); + configs.put(hello, source); + WireSourceConfiguration config = new WireSourceConfiguration("foo",new QualifiedName("foo"), configs, Thread.currentThread() + .getContextClassLoader(), new MessageFactoryImpl()); + JDKSourceWireFactory factory = new JDKSourceWireFactory(); + factory.setConfiguration(config); + factory.setBusinessInterface(SimpleTarget.class); + factory.initialize(); + SimpleTarget instance = (SimpleTarget) factory.createProxy(); + Assert.assertEquals("foo",instance.hello("foo")); + } + + public void testTargetWireFactory() throws Exception { + TargetInvocationConfiguration source = new TargetInvocationConfiguration(hello); + MockSyncInterceptor sourceInterceptor = new MockSyncInterceptor(); + source.addInterceptor(sourceInterceptor); + source.addInterceptor(new InvokerInterceptor()); + source.setTargetInvoker(new MockStaticInvoker(hello, new SimpleTargetImpl())); + source.build(); + Map<Method, TargetInvocationConfiguration> configs = new MethodHashMap<TargetInvocationConfiguration>(); + configs.put(hello, source); + WireTargetConfiguration config = new WireTargetConfiguration(new QualifiedName("foo"), configs, Thread.currentThread() + .getContextClassLoader(), new MessageFactoryImpl()); + JDKTargetWireFactory factory = new JDKTargetWireFactory(); + factory.setConfiguration(config); + factory.setBusinessInterface(SimpleTarget.class); + factory.initialize(); + SimpleTarget instance = (SimpleTarget) factory.createProxy(); + Assert.assertEquals("foo",instance.hello("foo")); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/MockHandler.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/MockHandler.java new file mode 100644 index 0000000000..9def6b5b0e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/MockHandler.java @@ -0,0 +1,38 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.wire.mock; + +import org.apache.tuscany.core.wire.MessageHandler; +import org.apache.tuscany.core.message.Message; + +/** + * + */ +public class MockHandler implements MessageHandler { + + private int count =0; + + public boolean processMessage(Message message) { + //System.out.println("Invoking handler"); + count++; + return true; + } + + public int getCount(){ + return count; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/MockScopeContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/MockScopeContext.java new file mode 100644 index 0000000000..915885549a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/MockScopeContext.java @@ -0,0 +1,131 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.mock; + +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.context.RuntimeEventListener; +import org.apache.tuscany.core.context.ContextRuntimeException; +import org.apache.tuscany.core.context.AtomicContext; +import org.apache.tuscany.core.context.ScopeRuntimeException; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.EventFilter; +import org.apache.tuscany.core.context.event.Event; +import org.apache.tuscany.model.assembly.AtomicComponent; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MockScopeContext implements ScopeContext { + + Map<String, Object> components; + + public MockScopeContext() { + components = new HashMap<String, Object>(); + components.put("foo", new SimpleTargetImpl()); + components.put("bar", new SimpleTargetImpl()); + } + + public MockScopeContext(Map<String,Object> instances) { + components = instances; + } + + + public void start() { + } + + public void stop() { + } + + public void publish(Event object) { + //To change body of implemented methods use File | Settings | File Templates. + } + + public void addListener(RuntimeEventListener listener) throws ContextRuntimeException { + } + + public void addListener(EventFilter filter, RuntimeEventListener listener) { + //To change body of implemented methods use File | Settings | File Templates. + } + + public void removeListener(RuntimeEventListener listener) throws ContextRuntimeException { + } + + public String getName() { + return "Mock Scope Container"; + } + + public boolean isCacheable() { + return false; + } + + public int[] getEventTypes() { + return null; + } + + public AtomicContext getContext(String name) { + return null; + } + + public Object getInstance(QualifiedName name) throws ScopeRuntimeException { + return components.get(name.getPartName()); + } + + public AtomicContext getContextByKey(String name, Object key) { + return null; + } + + public void setComponent(AtomicComponent component) throws ScopeRuntimeException { + } + + public void removeContext(String name) throws ScopeRuntimeException { + } + + public void removeContextByKey(String name, Object key) throws ScopeRuntimeException { + } + + public AtomicComponent[] getComponents() { + return null; + } + + + public void registerFactories(List<ContextFactory<Context>> configurations) { + } + + public void registerFactory(ContextFactory<Context> configuration) { + } + + public int getLifecycleState(){ + return RUNNING; + } + + + public void setLifecycleState(int state) { + } + + + public void setName(String name) { + } + + + public void onEvent(Event event) { + //To change body of implemented methods use File | Settings | File Templates. + } +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/MockStaticInvoker.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/MockStaticInvoker.java new file mode 100644 index 0000000000..66e8579cb4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/MockStaticInvoker.java @@ -0,0 +1,86 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.core.wire.mock; + +import org.apache.tuscany.core.wire.Interceptor; +import org.apache.tuscany.core.wire.InvocationRuntimeException; +import org.apache.tuscany.core.wire.TargetInvoker; +import org.apache.tuscany.core.message.Message; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * Caches component instances that do not need to be resolved for every wire, e.g. an wire originating from + * a lesser scope intended for a target with a wider scope + * + * @version $Rev: 377006 $ $Date: 2006-02-11 09:41:59 -0800 (Sat, 11 Feb 2006) $ + */ +public class MockStaticInvoker implements TargetInvoker { + + private Object instance; + + private Method operation; + + public MockStaticInvoker(Method operation, Object instance) { + this.operation = operation; + this.instance = instance; + } + + public boolean isCacheable() { + return true; + } + + public Object invokeTarget(Object payload) throws InvocationTargetException { + try { + if (payload != null && !payload.getClass().isArray()) { + return operation.invoke(instance, payload); + } else { + return operation.invoke(instance, (Object[]) payload); + } + } catch (IllegalAccessException e) { + throw new InvocationRuntimeException(e); + } + } + + public Message invoke(Message msg) { + try { + Object resp = invokeTarget(msg.getBody()); + msg.setBody(resp); + } catch (InvocationTargetException e) { + msg.setBody(e.getCause()); + } catch (Throwable e) { + msg.setBody(e); + } + return msg; + } + + public void setNext(Interceptor next) { + throw new IllegalStateException("This interceptor must be the last interceptor in an interceptor chain"); + } + + public Object clone() throws CloneNotSupportedException { + try { + MockStaticInvoker invoker = (MockStaticInvoker) super.clone(); + invoker.instance = this.instance; + invoker.operation = this.operation; + return invoker; + } catch (CloneNotSupportedException e) { + return null; // will not happen + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/MockSyncInterceptor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/MockSyncInterceptor.java new file mode 100644 index 0000000000..a64caed8eb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/MockSyncInterceptor.java @@ -0,0 +1,45 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.mock; + +import org.apache.tuscany.core.wire.Interceptor; +import org.apache.tuscany.core.message.Message; + +public class MockSyncInterceptor implements Interceptor { + + private int count; + + private Interceptor next; + + public MockSyncInterceptor() { + } + + public Message invoke(Message msg) { + ++count; + //System.out.println("Invoking interceptor"); + return next.invoke(msg); + } + + public int getCount() { + return count; + } + + public void setNext(Interceptor next) { + this.next=next; + } +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/SimpleSource.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/SimpleSource.java new file mode 100644 index 0000000000..8e8af9ec18 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/SimpleSource.java @@ -0,0 +1,25 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.mock; + +public interface SimpleSource { + + public void invokeHello() throws Exception; + + public void invokeGoodbye() throws Exception; +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/SimpleSourceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/SimpleSourceImpl.java new file mode 100644 index 0000000000..900fa9c324 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/SimpleSourceImpl.java @@ -0,0 +1,36 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.mock; + +public class SimpleSourceImpl implements SimpleSource { + + private SimpleTarget proxy; + + public SimpleSourceImpl(SimpleTarget proxy) { + this.proxy = proxy; + } + + public void invokeHello() throws Exception { + proxy.hello("hello"); + } + + public void invokeGoodbye() throws Exception { + proxy.goodbye("hello"); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/SimpleTarget.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/SimpleTarget.java new file mode 100644 index 0000000000..d63d3a0565 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/SimpleTarget.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.mock; + +public interface SimpleTarget { + + public String hello(String message) throws Exception; + + public String goodbye(String message) throws Exception; + + public String echo(String message) throws Exception; + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/SimpleTargetImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/SimpleTargetImpl.java new file mode 100644 index 0000000000..1b6fe93ac8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/java/org/apache/tuscany/core/wire/mock/SimpleTargetImpl.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.core.wire.mock; + +public class SimpleTargetImpl implements SimpleTarget { + + public SimpleTargetImpl() { + super(); + } + + public String hello(String message) throws Exception { + return message; + } + + public String goodbye(String message) throws Exception { + return message; + } + + public String echo(String message) throws Exception { + return message; + } + + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/resources/org/apache/tuscany/core/config/ModuleComponentLoaderTest1.module b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/resources/org/apache/tuscany/core/config/ModuleComponentLoaderTest1.module new file mode 100644 index 0000000000..b261cbe6c0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/resources/org/apache/tuscany/core/config/ModuleComponentLoaderTest1.module @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<module xmlns="http://www.osoa.org/xmlns/sca/0.9" + xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9" + name="ModuleComponentLoaderTest1"> + + <component name="HelloWorldServiceComponent"> + <implementation.java class="org.apache.tuscany.samples.helloworld.HelloWorldServiceComponentImpl"/> + </component> +</module> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/resources/org/apache/tuscany/core/loader/assembly/example.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/resources/org/apache/tuscany/core/loader/assembly/example.wsdl new file mode 100644 index 0000000000..3a23e7b717 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/resources/org/apache/tuscany/core/loader/assembly/example.wsdl @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<wsdl:definitions targetNamespace="http://www.example.org" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" + name="example"> + + <wsdl:portType name="HelloWorld"> + </wsdl:portType> +</wsdl:definitions> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/resources/org/apache/tuscany/core/loader/assembly/example.xsd b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/resources/org/apache/tuscany/core/loader/assembly/example.xsd new file mode 100644 index 0000000000..e34b6e92e0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/resources/org/apache/tuscany/core/loader/assembly/example.xsd @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2006 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:ex="http://tuscany.apache.org/xmlns/example" + targetNamespace="http://tuscany.apache.org/xmlns/example" + > + + <element name="foo" type="string"/> +</schema> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/resources/org/apache/tuscany/core/loader/assembly/interfacestyles.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/resources/org/apache/tuscany/core/loader/assembly/interfacestyles.wsdl new file mode 100644 index 0000000000..eeab33193d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/resources/org/apache/tuscany/core/loader/assembly/interfacestyles.wsdl @@ -0,0 +1,239 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:tns="http://www.interfacestyles.org"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:account="http://www.interfacestyles.org"
+ targetNamespace="http://www.interfacestyles.org" + name="TestInterfaceStylesService">
+
+ <wsdl:types>
+ <xsd:schema targetNamespace="http://www.interfacestyles.org" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:account="http://www.interfacestyles.org" + xmlns:sdojava="commonj.sdo/java" + sdojava:package="org.apache.tuscany.samples.bigbank.account">
+
+ <xsd:element name="getAccountReportWrapped0">
+ <xsd:complexType>
+ <xsd:sequence>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="getAccountReportWrapped0Response">
+ <xsd:complexType>
+ <xsd:sequence>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="getAccountReportWrapped1"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="customerID" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element>
+ <xsd:element name="getAccountReportWrapped1Response"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="accountReport" type="account:AccountReport"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> +
+ <xsd:element name="getAccountReportWrappedN">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="customerID" type="xsd:string"/>
+ <xsd:element name="customerID2" type="xsd:int"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="getAccountReportWrappedNResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="accountReport" type="account:AccountReport"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="getAccountReportBare0" type="xsd:string"/>
+ <xsd:element name="getAccountReportBare0Response" type="xsd:int"/>
+
+ <xsd:element name="getAccountReportBare1Simple" type="xsd:string"/>
+ <xsd:element name="getAccountReportBare1SimpleResponse" type="xsd:int"/>
+
+ <xsd:element name="getAccountReportBare1Complex" type="account:AccountRequest"/>
+ <xsd:element name="getAccountReportBare1ComplexResponse" type="account:AccountReport"/>
+
+ <xsd:complexType name="AccountRequest">
+ <xsd:sequence>
+ <xsd:element name="customerID" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="AccountReport">
+ <xsd:sequence>
+ <xsd:element name="accountSummaries" type="account:AccountSummary" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ <xsd:complexType name="AccountSummary">
+ <xsd:attribute name="accountNumber" type="xsd:string"/>
+ <xsd:attribute name="accountType" type="xsd:string"/>
+ <xsd:attribute name="balance" type="xsd:float"/>
+ </xsd:complexType>
+
+ </xsd:schema>
+ </wsdl:types>
+
+ <wsdl:message name="getAccountReportWrapped0Request">
+ <wsdl:part element="account:getAccountReportWrapped0" name="getAccountReportWrapped0Request"/>
+ </wsdl:message>
+ <wsdl:message name="getAccountReportWrapped0Response">
+ <wsdl:part element="account:getAccountReportWrapped0Response" name="getAccountReportWrapped0Response"/>
+ </wsdl:message>
+
+ <wsdl:message name="getAccountReportWrapped1Request">
+ <wsdl:part element="account:getAccountReportWrapped1" name="getAccountReportWrapped1Request"/>
+ </wsdl:message>
+ <wsdl:message name="getAccountReportWrapped1Response">
+ <wsdl:part element="account:getAccountReportWrapped1Response" name="getAccountReportWrapped1Response"/>
+ </wsdl:message>
+
+ <wsdl:message name="getAccountReportWrappedNRequest">
+ <wsdl:part element="account:getAccountReportWrappedN" name="getAccountReportWrappedNRequest"/>
+ </wsdl:message>
+ <wsdl:message name="getAccountReportWrappedNResponse">
+ <wsdl:part element="account:getAccountReportWrappedNResponse" name="getAccountReportWrappedNResponse"/>
+ </wsdl:message>
+
+ <wsdl:message name="getAccountReportBare0Request">
+ </wsdl:message>
+ <wsdl:message name="getAccountReportBare0Response">
+ </wsdl:message>
+
+ <wsdl:message name="getAccountReportBare1SimpleRequest">
+ <wsdl:part element="account:getAccountReportBare1Simple" name="getAccountReportBare1SimpleRequest"/>
+ </wsdl:message>
+ <wsdl:message name="getAccountReportBare1SimpleResponse">
+ <wsdl:part element="account:getAccountReportBare1SimpleResponse" name="getAccountReportBare1SimpleResponse"/>
+ </wsdl:message>
+
+ <wsdl:message name="getAccountReportBare1ComplexRequest">
+ <wsdl:part element="account:getAccountReportBare1Complex" name="getAccountReportBare1ComplexRequest"/>
+ </wsdl:message>
+ <wsdl:message name="getAccountReportBare1ComplexResponse">
+ <wsdl:part element="account:getAccountReportBare1ComplexResponse" name="getAccountReportBare1ComplexResponse"/>
+ </wsdl:message>
+
+ <wsdl:portType name="TestInterfaceStylesService">
+ <wsdl:operation name="getAccountReportWrapped0">
+ <wsdl:input message="tns:getAccountReportWrapped0Request"/>
+ <wsdl:output message="tns:getAccountReportWrapped0Response"/>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportWrapped1">
+ <wsdl:input message="tns:getAccountReportWrapped1Request"/>
+ <wsdl:output message="tns:getAccountReportWrapped1Response"/>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportWrappedN">
+ <wsdl:input message="tns:getAccountReportWrappedNRequest"/>
+ <wsdl:output message="tns:getAccountReportWrappedNResponse"/>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportBare0">
+ <wsdl:input message="tns:getAccountReportBare0Request"/>
+ <wsdl:output message="tns:getAccountReportBare0Response"/>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportBare1Simple">
+ <wsdl:input message="tns:getAccountReportBare1SimpleRequest"/>
+ <wsdl:output message="tns:getAccountReportBare1SimpleResponse"/>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportBare1Complex">
+ <wsdl:input message="tns:getAccountReportBare1ComplexRequest"/>
+ <wsdl:output message="tns:getAccountReportBare1ComplexResponse"/>
+ </wsdl:operation>
+ </wsdl:portType>
+ <wsdl:binding name="TestInterfaceStylesServiceSOAP" type="tns:TestInterfaceStylesService">
+ <soap:binding style="document"
+ transport="http://schemas.xmlsoap.org/soap/http"/>
+ <wsdl:operation name="getAccountReportWrapped0">
+ <soap:operation
+ soapAction="http://www.interfacestyles.org/getAccountReportWrapped0"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportWrapped1">
+ <soap:operation
+ soapAction="http://www.interfacestyles.org/getAccountReportWrapped1"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportWrappedN">
+ <soap:operation
+ soapAction="http://www.interfacestyles.org/getAccountReportWrappedN"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportBare0">
+ <soap:operation
+ soapAction="http://www.interfacestyles.org/getAccountReportBare0"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportBare1Simple">
+ <soap:operation
+ soapAction="http://www.interfacestyles.org/getAccountReportBare1Simple"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportBare1Complex">
+ <soap:operation
+ soapAction="http://www.interfacestyles.org/getAccountReportBare1Complex"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:service name="TestInterfaceStylesService">
+ <wsdl:port binding="tns:TestInterfaceStylesServiceSOAP"
+ name="TestInterfaceStylesServiceSOAP">
+ <soap:address location="http://localhost:8080/testinterfacestyles/services/TestInterfaceStylesService"/>
+ </wsdl:port>
+ </wsdl:service>
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/resources/system.fragment b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/resources/system.fragment new file mode 100644 index 0000000000..74d04561cd --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/core/src/test/resources/system.fragment @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<moduleFragment xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:system="http://org.apache.tuscany/xmlns/system/0.9" + name="org.apache.tuscany.container.java">
+ +</moduleFragment>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/pom.xml new file mode 100644 index 0000000000..d7f337a955 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/pom.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Copyright (c) 2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + --> +<project> + + <parent> + <groupId>org.apache.tuscany</groupId> + <artifactId>tuscany-sca</artifactId> + <version>incubating-M1</version> + </parent> + + <modelVersion>4.0.0</modelVersion> + <groupId>org.apache.tuscany.databinding</groupId> + <artifactId>tuscany-databinding</artifactId> + <packaging>pom</packaging> + <name>Tuscany SCA Data Bindings</name> + <version>incubating-M1</version> + + <modules> + <module>sdo</module> + </modules> + +</project> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/LICENSE.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/README.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/README.txt new file mode 100644 index 0000000000..9b26d1690a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/README.txt @@ -0,0 +1,35 @@ +Apache Tuscany M1 build (May, 2006) +=================================== + +http://incubator.apache.org/tuscany/ + +Tuscany is an effort undergoing incubation at the Apache Software Foundation +(ASF), sponsored by the Web Services PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness or +stability of the code, it does indicate that the project has yet to be fully +endorsed by the ASF. + + +Support +------- + +Any problem with this release can be reported to the Tuscany mailing list +or in the JIRA issue tracker. + +Mailing list subscription: + tuscany-dev-subscribe@ws.apache.org + +Jira: + http://issues.apache.org/jira/browse/Tuscany + + +Thank you for using Tuscany! + + +The Tuscany Team. + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/pom.xml new file mode 100644 index 0000000000..635711f294 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/pom.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Copyright (c) 2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + --> +<project> + + <parent> + <groupId>org.apache.tuscany.databinding</groupId> + <artifactId>tuscany-databinding</artifactId> + <version>incubating-M1</version> + </parent> + + <modelVersion>4.0.0</modelVersion> + <artifactId>tuscany-databinding-sdo</artifactId> + <name>Tuscany Data Binding based on SDO</name> + <description>Data Binding based on SDO.</description> + <version>incubating-M1</version> + + <dependencies> + <dependency> + <groupId>org.apache.tuscany</groupId> + <artifactId>tuscany-core</artifactId> + <version>${pom.version}</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>3.8.1</version> + <scope>test</scope> + </dependency> + </dependencies> +</project> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/main/java/org/apache/tuscany/databinding/sdo/ImportSDOLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/main/java/org/apache/tuscany/databinding/sdo/ImportSDOLoader.java new file mode 100644 index 0000000000..519d256036 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/main/java/org/apache/tuscany/databinding/sdo/ImportSDOLoader.java @@ -0,0 +1,106 @@ +/** + * + * Copyright 2006 The Apache Software Foundation or its licensors as applicable + * + * Licensed 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.databinding.sdo; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import commonj.sdo.helper.XSDHelper; +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.SidefileLoadException; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.core.loader.StAXUtil; +import org.apache.tuscany.core.loader.assembly.AbstractLoader; +import org.apache.tuscany.core.loader.assembly.AssemblyConstants; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.sdo.util.SDOUtil; +import org.osoa.sca.annotations.Scope; + +/** + * Loader that handles <import.sdo> elements. + * + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class ImportSDOLoader extends AbstractLoader { + public static final QName IMPORT_SDO = new QName(AssemblyConstants.SCA_NAMESPACE, "import.sdo"); + + public QName getXMLType() { + return IMPORT_SDO; + } + + public AssemblyObject load(XMLStreamReader reader, LoaderContext loaderContext) throws XMLStreamException, ConfigurationLoadException { + assert IMPORT_SDO.equals(reader.getName()); + importFactory(reader, loaderContext); + importWSDLOrXSD(reader, loaderContext); + StAXUtil.skipToEndElement(reader); + return null; + } + + private void importFactory(XMLStreamReader reader, LoaderContext loaderContext) throws ConfigurationLoadException { + String factoryName = reader.getAttributeValue(null, "factory"); + if (factoryName != null) { + ResourceLoader resourceLoader = loaderContext.getResourceLoader(); + ClassLoader oldCL = Thread.currentThread().getContextClassLoader(); + try { + // set TCCL as SDO needs it + Thread.currentThread().setContextClassLoader(resourceLoader.getClassLoader()); + Class<?> factoryClass = resourceLoader.loadClass(factoryName); + SDOUtil.registerStaticTypes(factoryClass); + } catch (ClassNotFoundException e) { + throw new ConfigurationLoadException(e.getMessage(), e); + } finally { + Thread.currentThread().setContextClassLoader(oldCL); + } + } + } + + @SuppressWarnings("deprecation") + private void importWSDLOrXSD(XMLStreamReader reader, LoaderContext loaderContext) throws ConfigurationLoadException { + String location = reader.getAttributeValue(null, "wsdlLocation"); + if (location == null) + location = reader.getAttributeValue(null, "schemaLocation"); + if (location != null) { + ResourceLoader resourceLoader = loaderContext.getResourceLoader(); + URL wsdlURL = resourceLoader.getResource(location); + ClassLoader oldCL = Thread.currentThread().getContextClassLoader(); + try { +// Thread.currentThread().setContextClassLoader(resourceLoader.getClassLoader()); + InputStream xsdInputStream = wsdlURL.openStream(); + try { + AssemblyContext context = registry.getContext(); + XSDHelper xsdHelper = SDOUtil.createXSDHelper(context.getTypeHelper()); + xsdHelper.define(xsdInputStream, null); + } finally { + xsdInputStream.close(); + } + } catch (IOException e) { + SidefileLoadException sfe = new SidefileLoadException(e.getMessage()); + sfe.setResourceURI(location); + throw sfe; + } finally { + Thread.currentThread().setContextClassLoader(oldCL); + } + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDOObjectFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDOObjectFactory.java new file mode 100644 index 0000000000..0f0cc13fd8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDOObjectFactory.java @@ -0,0 +1,45 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.databinding.sdo; + +import commonj.sdo.DataObject; +import commonj.sdo.helper.CopyHelper; +import org.apache.tuscany.core.builder.ObjectFactory; +import org.apache.tuscany.core.injection.ObjectCreationException; + +/** + * Creates new instances of an SDO + * + * @version $Rev$ $Date$ + */ +public class SDOObjectFactory implements ObjectFactory<DataObject> { + + private DataObject dataObject; + + public SDOObjectFactory(DataObject dataObject) { + this.dataObject = dataObject; + } + + public DataObject getInstance() throws ObjectCreationException { + return CopyHelper.INSTANCE.copy(dataObject); + } + + public void releaseInstance(DataObject instance) { + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDOXMLHelper.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDOXMLHelper.java new file mode 100644 index 0000000000..d732676c76 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/main/java/org/apache/tuscany/databinding/sdo/SDOXMLHelper.java @@ -0,0 +1,264 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.databinding.sdo;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.core.wire.InvocationRuntimeException;
+import org.apache.tuscany.sdo.util.SDOUtil;
+import org.osoa.sca.ServiceRuntimeException;
+
+import commonj.sdo.DataObject;
+import commonj.sdo.Property;
+import commonj.sdo.Type;
+import commonj.sdo.helper.DataFactory;
+import commonj.sdo.helper.TypeHelper;
+import commonj.sdo.helper.XMLDocument;
+import commonj.sdo.helper.XMLHelper;
+import commonj.sdo.helper.XSDHelper;
+
+/**
+ * Utility methods to convert between XML byte arrays, SDO DataObjects, and Java objects.
+ *
+ * Most of these methods rely on the schemas having been registered with XSDHelper.define
+ */
+public final class SDOXMLHelper {
+
+ private SDOXMLHelper() {
+ // utility class, never contructed
+ }
+
+ /**
+ * Deserialize an XML byte array into Java Objects
+ *
+ * @param xmlBytes
+ * the byte array containing the XML
+ * @param isWrapped
+ *
+ * @return the array of deserialized Java objects
+ * @deprecated TUSCANY-333 use the method that takes a ClassLoader
+ */
+ public static Object[] toObjects(TypeHelper typeHelper, byte[] xmlBytes, boolean isWrapped) {
+ DataObject dataObject = toDataObject(typeHelper, xmlBytes);
+ return toObjects(dataObject, isWrapped);
+ }
+
+ /**
+ * Convert a typed DataObject to Java objects
+ *
+ * @param dataObject
+ * @param isWrapped
+ * @return the array of Objects from the DataObject
+ */
+ public static Object[] toObjects(DataObject dataObject, boolean isWrapped) {
+ if (isWrapped) {
+ List ips = dataObject.getInstanceProperties();
+ Object[] os = new Object[ips.size()];
+ for (int i = 0; i < ips.size(); i++) {
+ os[i] = dataObject.get((Property) ips.get(i));
+ }
+ return os;
+ } else {
+ Object object = dataObject;
+ Type type = dataObject.getType();
+ if (type.isSequenced()) {
+ object = dataObject.getSequence().getValue(0);
+ }
+ return new Object[] { object };
+ }
+ }
+
+ /**
+ * Serializes objects to an XML byte array
+ *
+ * @param os
+ * @param typeNS
+ * @param typeName
+ * @return a byte array containing the XML
+ * @deprecated TUSCANY-333 use the method that takes a ClassLoader
+ */
+ public static byte[] toXMLBytes(TypeHelper typeHelper, Object[] os, QName elementQName, boolean isWrapped) {
+ DataObject dataObject = toDataObject(typeHelper, os, elementQName, isWrapped);
+ return toXMLbytes(typeHelper, dataObject, elementQName);
+ }
+
+ /**
+ * Convert a DataObject to an XML byte array
+ *
+ * @param dataObject
+ * @param typeNS
+ * @param typeName
+ * @return a byte array containing the XML bytes
+ * @deprecated TUSCANY-333 use the method that takes a ClassLoader
+ */
+ public static byte[] toXMLbytes(TypeHelper typeHelper, DataObject dataObject, QName elementQName) {
+ try {
+
+ ByteArrayOutputStream pos = new ByteArrayOutputStream();
+ XMLHelper xmlHelper = SDOUtil.createXMLHelper(typeHelper);
+ xmlHelper.save(dataObject, elementQName.getNamespaceURI(), elementQName.getLocalPart(), pos);
+ pos.close();
+
+ return pos.toByteArray();
+
+ } catch (IOException e) {
+ throw new ServiceRuntimeException(e);
+ }
+ }
+
+ /**
+ * Deserialize an XML byte array into a DataObject
+ *
+ * @param xmlBytes
+ * @return a DataObject
+ * @deprecated TUSCANY-333 use the method that takes a ClassLoader
+ */
+ public static DataObject toDataObject(TypeHelper typeHelper, byte[] xmlBytes) {
+ try {
+
+ XMLHelper xmlHelper = SDOUtil.createXMLHelper(typeHelper);
+ XMLDocument document = xmlHelper.load(new ByteArrayInputStream(xmlBytes));
+
+ return document.getRootObject();
+
+ } catch (IOException e) {
+ throw new ServiceRuntimeException(e);
+ }
+ }
+
+ /**
+ * Convert objects to typed DataObject
+ *
+ * @param typeNS
+ * @param typeName
+ * @param os
+ * @return the DataObject
+ * @deprecated TUSCANY-333 use the method that takes a ClassLoader
+ */
+ public static DataObject toDataObject(TypeHelper typeHelper, Object[] os, QName elementQName, boolean isWrapped) {
+ XSDHelper xsdHelper = SDOUtil.createXSDHelper(typeHelper);
+
+ Property property = xsdHelper.getGlobalProperty(elementQName.getNamespaceURI(), elementQName.getLocalPart(), true);
+ if (null == property) {
+ throw new InvocationRuntimeException("Type '" + elementQName.toString() + "' not found in registered SDO types.");
+ }
+ if (isWrapped) {
+ DataFactory dataFactory = SDOUtil.createDataFactory(typeHelper);
+ DataObject dataObject = dataFactory.create(property.getType());
+ List ips = dataObject.getInstanceProperties();
+ for (int i = 0; i < ips.size(); i++) {
+ dataObject.set(i, os[i]);
+ }
+ return dataObject;
+ } else {
+ Object value = os[0];
+ Type type = property.getType();
+ if (!type.isDataType()) {
+ return (DataObject) value;
+ } else {
+ return SDOUtil.createDataTypeWrapper(type, value);
+ }
+ }
+ }
+
+// ---
+
+ public static DataObject toDataObject(ClassLoader classLoader, TypeHelper typeHelper, Object[] os, QName elementQName, boolean isWrapped) {
+ ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+ try {
+ if (tccl != classLoader) {
+ Thread.currentThread().setContextClassLoader(classLoader);
+ }
+
+ return toDataObject(typeHelper, os, elementQName, isWrapped);
+
+ } finally {
+ if (tccl != classLoader) {
+ Thread.currentThread().setContextClassLoader(tccl);
+ }
+ }
+ }
+
+ public static DataObject toDataObject(ClassLoader classLoader, TypeHelper typeHelper, byte[] xmlBytes) {
+ ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+ try {
+ if (tccl != classLoader) {
+ Thread.currentThread().setContextClassLoader(classLoader);
+ }
+
+ return toDataObject(typeHelper, xmlBytes);
+
+ } finally {
+ if (tccl != classLoader) {
+ Thread.currentThread().setContextClassLoader(tccl);
+ }
+ }
+ }
+
+ public static byte[] toXMLbytes(ClassLoader classLoader, TypeHelper typeHelper, DataObject dataObject, QName elementQName) {
+ ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+ try {
+ if (tccl != classLoader) {
+ Thread.currentThread().setContextClassLoader(classLoader);
+ }
+
+ return toXMLbytes(typeHelper, dataObject, elementQName);
+
+ } finally {
+ if (tccl != classLoader) {
+ Thread.currentThread().setContextClassLoader(tccl);
+ }
+ }
+ }
+
+ public static byte[] toXMLBytes(ClassLoader classLoader, TypeHelper typeHelper, Object[] os, QName elementQName, boolean isWrapped) {
+ ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+ try {
+ if (tccl != classLoader) {
+ Thread.currentThread().setContextClassLoader(classLoader);
+ }
+
+ return toXMLBytes(typeHelper, os, elementQName, isWrapped);
+
+ } finally {
+ if (tccl != classLoader) {
+ Thread.currentThread().setContextClassLoader(tccl);
+ }
+ }
+ }
+
+ public static Object[] toObjects(ClassLoader classLoader, TypeHelper typeHelper, byte[] xmlBytes, boolean isWrapped) {
+ ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+ try {
+ if (tccl != classLoader) {
+ Thread.currentThread().setContextClassLoader(classLoader);
+ }
+
+ return toObjects(typeHelper, xmlBytes, isWrapped);
+
+ } finally {
+ if (tccl != classLoader) {
+ Thread.currentThread().setContextClassLoader(tccl);
+ }
+ }
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/main/resources/system.fragment b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/main/resources/system.fragment new file mode 100644 index 0000000000..a963af3e2e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/main/resources/system.fragment @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Copyright (c) 2006 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<moduleFragment xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:tuscany="http://org.apache.tuscany/xmlns/system/0.9"
+ name="org.apache.tuscany.databinding.sdo">
+
+ <component name="org.apache.tuscany.databinding.sdo.ImportSDOLoader">
+ <tuscany:implementation.system class="org.apache.tuscany.databinding.sdo.ImportSDOLoader"/>
+ </component>
+
+</moduleFragment>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/java/org/apache/tuscany/databinding/sdo/ImportSDOLoaderTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/java/org/apache/tuscany/databinding/sdo/ImportSDOLoaderTestCase.java new file mode 100644 index 0000000000..31815a97b4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/java/org/apache/tuscany/databinding/sdo/ImportSDOLoaderTestCase.java @@ -0,0 +1,59 @@ +/** + * + * Copyright 2006 The Apache Software Foundation or its licensors as applicable + * + * Licensed 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.databinding.sdo; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.tuscany.core.config.ConfigurationLoadException; + +/** + * @version $Rev$ $Date$ + */ +public class ImportSDOLoaderTestCase extends LoaderTestSupport { + private ImportSDOLoader loader; + + public void testMinimal() throws XMLStreamException, ConfigurationLoadException { + String xml = "<import.sdo xmlns='http://www.osoa.org/xmlns/sca/0.9'/>"; + XMLStreamReader reader = getReader(xml); + assertNull(loader.load(reader, null)); + } + + public void testFactory() throws XMLStreamException, ConfigurationLoadException { + String xml = "<import.sdo xmlns='http://www.osoa.org/xmlns/sca/0.9' factory='org.apache.tuscany.databinding.sdo.ImportSDOLoaderTestCase$MockFactory'/>"; + XMLStreamReader reader = getReader(xml); + assertFalse(inited); + assertNull(loader.load(reader, loaderContext)); + assertTrue(inited); + } + + protected void setUp() throws Exception { + super.setUp(); + loader = new ImportSDOLoader(); + } + + private static boolean inited = false; + + public static class MockFactory { + public static Object INSTANCE; + + static { + ImportSDOLoaderTestCase.inited = true; + } + } +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/java/org/apache/tuscany/databinding/sdo/LoaderTestSupport.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/java/org/apache/tuscany/databinding/sdo/LoaderTestSupport.java new file mode 100644 index 0000000000..821a7220dd --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/java/org/apache/tuscany/databinding/sdo/LoaderTestSupport.java @@ -0,0 +1,82 @@ +/** + * + * Copyright 2006 The Apache Software Foundation or its licensors as applicable + * + * Licensed 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.databinding.sdo; + +import java.io.StringReader; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamException; +import javax.xml.namespace.QName; + +import junit.framework.TestCase; +import org.apache.tuscany.core.system.assembly.SystemAssemblyFactory; +import org.apache.tuscany.core.system.assembly.impl.SystemAssemblyFactoryImpl; +import org.apache.tuscany.core.loader.LoaderContext; +import org.apache.tuscany.core.loader.assembly.*; +import org.apache.tuscany.core.loader.impl.StAXLoaderRegistryImpl; +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.impl.AssemblyContextImpl; + +/** + * Base class for loader tests with common fixture elements. + * + * @version $Rev$ $Date$ + */ +public abstract class LoaderTestSupport extends TestCase { + protected SystemAssemblyFactory assemblyFactory; + protected ResourceLoader resourceLoader; + protected LoaderContext loaderContext; + protected AssemblyContext modelContext; + protected XMLInputFactory xmlFactory; + protected StAXLoaderRegistryImpl registry; + + protected static final StAXLoaderRegistryImpl.Monitor NULL_MONITOR = new StAXLoaderRegistryImpl.Monitor() { + public void registeringLoader(QName xmlType) { + } + + public void unregisteringLoader(QName xmlType) { + } + + public void elementLoad(QName xmlType) { + } + }; + + protected void setUp() throws Exception { + super.setUp(); + assemblyFactory = new SystemAssemblyFactoryImpl(); + resourceLoader = new ResourceLoaderImpl(getClass().getClassLoader()); + loaderContext = new LoaderContext(resourceLoader); + modelContext = new AssemblyContextImpl(assemblyFactory, null, resourceLoader); + xmlFactory = XMLInputFactory.newInstance(); + registry = new StAXLoaderRegistryImpl(); + registry.setMonitor(org.apache.tuscany.databinding.sdo.LoaderTestSupport.NULL_MONITOR); + } + + protected XMLStreamReader getReader(String xml) throws XMLStreamException { + XMLStreamReader reader = xmlFactory.createXMLStreamReader(new StringReader(xml)); + reader.next(); + return reader; + } + + protected void registerLoader(AbstractLoader<?> loader) { + loader.setFactory(assemblyFactory); + loader.setRegistry(registry); + loader.start(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/java/org/apache/tuscany/databinding/sdo/SDOXMLHelperTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/java/org/apache/tuscany/databinding/sdo/SDOXMLHelperTestCase.java new file mode 100644 index 0000000000..b72fa93046 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/java/org/apache/tuscany/databinding/sdo/SDOXMLHelperTestCase.java @@ -0,0 +1,141 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * Licensed 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.databinding.sdo;
+
+import java.net.URL;
+
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.sdo.util.DataObjectUtil;
+import org.apache.tuscany.sdo.util.SDOUtil;
+
+import commonj.sdo.DataObject;
+import commonj.sdo.helper.DataFactory;
+import commonj.sdo.helper.TypeHelper;
+import commonj.sdo.helper.XSDHelper;
+
+public class SDOXMLHelperTestCase extends TestCase {
+
+ private TypeHelper typeHelper;
+
+ public static final QName GREETING_QN = new QName("http://helloworldaxis.samples.tuscany.apache.org", "getGreetings");
+
+ private static final String GREETING_NAME = "petra";
+
+ private static final String GREETING_XML = "<helloworldaxis:in0>petra</helloworldaxis:in0>";
+
+ private DataObject greetingDOB;
+
+ private byte[] greetingXML;
+
+ private ClassLoader appCL;
+
+ public static final QName DOCLIT_QN = new QName("http://www.example.org/creditscore/doclit/", "getCreditScoreRequest");
+
+ // private static final Object[] CUSTOMER = { "111-22-3333", "John", "Smith" };
+
+ private DataObject nonWrappedDOB;
+
+ public void testXMLBytes1() {
+ byte[] xmlBytes = SDOXMLHelper.toXMLbytes(appCL, typeHelper, greetingDOB, GREETING_QN);
+ assertNotNull(xmlBytes);
+ assertTrue(new String(xmlBytes).contains("<helloworldaxis:in0>petra</helloworldaxis:in0>"));
+ }
+
+ public void testXMLBytes2() {
+ byte[] xmlBytes = SDOXMLHelper.toXMLBytes(appCL, typeHelper, new Object[] { GREETING_NAME }, GREETING_QN, true);
+ assertNotNull(xmlBytes);
+ assertTrue(new String(xmlBytes).contains(GREETING_XML));
+ }
+
+ // TODO: nonwrapped doesn't work
+ // public void testXMLBytes3() {
+ // byte[] xmlBytes = SDOXMLHelper.toXMLBytes(typeHelper, CUSTOMER, DOCLIT_QN, false);
+ // assertNotNull(xmlBytes);
+ // assertTrue(new String(xmlBytes).contains(DOC_LIT_XML));
+ // }
+
+ public void testToDataObject1() {
+ DataObject dataObject = SDOXMLHelper.toDataObject(appCL, typeHelper, greetingXML);
+ assertNotNull(dataObject);
+ assertEquals(GREETING_NAME, dataObject.getString(0));
+ }
+
+ public void testToDataObject2() {
+ DataObject dataObject = SDOXMLHelper.toDataObject(appCL, typeHelper, new Object[] { GREETING_NAME }, GREETING_QN, true);
+ assertNotNull(dataObject);
+ assertEquals(GREETING_NAME, dataObject.getString(0));
+ }
+
+ // TODO: nonwrapped doesn't work
+ // public void testToDataObject3() {
+ // DataObject dataObject = SDOXMLHelper.toDataObject(typeHelper, CUSTOMER, DOCLIT_QN, false);
+ // assertNotNull(dataObject);
+ // assertEquals(CUSTOMER[0], dataObject.getString(0));
+ // assertEquals(CUSTOMER[1], dataObject.getString(1));
+ // assertEquals(CUSTOMER[2], dataObject.getString(2));
+ // }
+
+ public void testToObjects1() {
+ Object[] os = SDOXMLHelper.toObjects(appCL, typeHelper, greetingXML, true);
+ assertNotNull(os);
+ assertEquals(1, os.length);
+ assertEquals(GREETING_NAME, os[0]);
+ }
+
+ public void testToObjects2() {
+ Object[] os = SDOXMLHelper.toObjects(greetingDOB, true);
+ assertNotNull(os);
+ assertEquals(1, os.length);
+ assertEquals(GREETING_NAME, os[0]);
+ }
+
+ public void testToObjects3() {
+ Object[] os = SDOXMLHelper.toObjects(nonWrappedDOB, false);
+ assertNotNull(os);
+ // assertEquals(3, os.length); TODO: non-wrapped doesn't seem to work
+ }
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ DataObjectUtil.initRuntime();
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ try {
+ appCL = getClass().getClassLoader();
+ Thread.currentThread().setContextClassLoader(appCL);
+ typeHelper = SDOUtil.createTypeHelper();
+ XSDHelper xsdHelper = SDOUtil.createXSDHelper(typeHelper);
+ URL url = getClass().getResource("helloworld.wsdl");
+ xsdHelper.define(url.openStream(), null);
+ url = getClass().getResource("CreditScoreDocLit.wsdl");
+ xsdHelper.define(url.openStream(), null);
+ greetingDOB = SDOXMLHelper.toDataObject(appCL, typeHelper, new Object[] { GREETING_NAME }, GREETING_QN, true);
+ greetingXML = SDOXMLHelper.toXMLBytes(appCL, typeHelper, new Object[] { GREETING_NAME }, GREETING_QN, true);
+
+ DataFactory dataFactory = SDOUtil.createDataFactory(typeHelper);
+ nonWrappedDOB = dataFactory.create("http://www.example.org/creditscore/doclit/", "Customer");
+ nonWrappedDOB.setString(0, "111-22-3333");
+ nonWrappedDOB.setString(1, "John");
+ nonWrappedDOB.setString(2, "Smith");
+
+ } finally {
+ Thread.currentThread().setContextClassLoader(cl);
+ }
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/resources/org/apache/tuscany/databinding/sdo/CreditScoreDocLit.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/resources/org/apache/tuscany/databinding/sdo/CreditScoreDocLit.wsdl new file mode 100644 index 0000000000..09d1a58589 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/resources/org/apache/tuscany/databinding/sdo/CreditScoreDocLit.wsdl @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:tns="http://www.example.org/creditscore/doclit/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="CreditScore"
+ targetNamespace="http://www.example.org/creditscore/doclit/">
+ <wsdl:types>
+ <xsd:schema
+ targetNamespace="http://www.example.org/creditscore/doclit/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <xsd:element name="getCreditScoreRequest" type="tns:Customer" />
+ <xsd:complexType name="Customer">
+ <xsd:sequence>
+ <xsd:element name="ssn" type="xsd:string" />
+ <xsd:element name="firstName" type="xsd:string" />
+ <xsd:element name="lastName" type="xsd:string" />
+ </xsd:sequence>
+ </xsd:complexType>
+ <xsd:element name="getCreditScoreResponse" type="tns:CreditReport"/>
+ <xsd:complexType name="CreditReport">
+ <xsd:sequence>
+ <xsd:element name="score" type="xsd:int"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:schema>
+ </wsdl:types>
+ <wsdl:message name="getCreditScoreResponse">
+ <wsdl:part element="tns:getCreditScoreResponse"
+ name="getCreditScoreResponse" />
+ </wsdl:message>
+ <wsdl:message name="getCreditScoreRequest">
+ <wsdl:part element="tns:getCreditScoreRequest"
+ name="getCreditScoreRequest" />
+ </wsdl:message>
+ <wsdl:portType name="CreditScoreDocLit">
+ <wsdl:operation name="getCreditScore">
+ <wsdl:input message="tns:getCreditScoreRequest" />
+ <wsdl:output message="tns:getCreditScoreResponse" />
+ </wsdl:operation>
+ </wsdl:portType>
+ <wsdl:binding name="CreditScoreDocLitSOAP" type="tns:CreditScoreDocLit">
+ <soap:binding style="document"
+ transport="http://schemas.xmlsoap.org/soap/http" />
+ <wsdl:operation name="getCreditScore">
+ <soap:operation
+ soapAction="http://www.example.org/creditscore/doclit/getCreditScore" />
+ <wsdl:input>
+ <soap:body parts="getCreditScoreRequest" use="literal" />
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body parts="getCreditScoreResponse" use="literal" />
+ </wsdl:output>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:service name="CreditScore">
+ <wsdl:port binding="tns:CreditScoreDocLitSOAP"
+ name="CreditScoreDocLitSOAP">
+ <soap:address location="http://www.example.org/" />
+ </wsdl:port>
+ </wsdl:service>
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/resources/org/apache/tuscany/databinding/sdo/CreditScoreDocLitWrapped.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/resources/org/apache/tuscany/databinding/sdo/CreditScoreDocLitWrapped.wsdl new file mode 100644 index 0000000000..3952c74809 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/resources/org/apache/tuscany/databinding/sdo/CreditScoreDocLitWrapped.wsdl @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:tns="http://www.example.org/creditscore/doclitwrapped/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="CreditScore"
+ targetNamespace="http://www.example.org/creditscore/doclitwrapped/">
+ <wsdl:types>
+ <xsd:schema
+ targetNamespace="http://www.example.org/creditscore/doclitwrapped/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <xsd:element name="getCreditScoreResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="score" type="xsd:int" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="getCreditScore">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="ssn" type="xsd:string" />
+ <xsd:element name="firstName" type="xsd:string" />
+ <xsd:element name="lastName" type="xsd:string" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ </wsdl:types>
+ <wsdl:message name="getCreditScoreResponse">
+ <wsdl:part element="tns:getCreditScoreResponse"
+ name="getCreditScoreResponse" />
+ </wsdl:message>
+ <wsdl:message name="getCreditScoreRequest">
+ <wsdl:part element="tns:getCreditScore"
+ name="getCreditScoreRequest" />
+ </wsdl:message>
+ <wsdl:portType name="CreditScoreDocLitWrapped">
+ <wsdl:operation name="getCreditScore">
+ <wsdl:input message="tns:getCreditScoreRequest" />
+ <wsdl:output message="tns:getCreditScoreResponse" />
+ </wsdl:operation>
+ </wsdl:portType>
+ <wsdl:binding name="CreditScoreDocLitWrappedSOAP" type="tns:CreditScoreDocLitWrapped">
+ <soap:binding style="document"
+ transport="http://schemas.xmlsoap.org/soap/http" />
+ <wsdl:operation name="getCreditScore">
+ <soap:operation
+ soapAction="http://www.example.org/creditscore/doclitwrapped/getCreditScore" />
+ <wsdl:input>
+ <soap:body parts="getCreditScoreRequest" use="literal" />
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body parts="getCreditScoreResponse" use="literal" />
+ </wsdl:output>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:service name="CreditScore">
+ <wsdl:port binding="tns:CreditScoreDocLitWrappedSOAP"
+ name="CreditScoreDocLitWrappedSOAP">
+ <soap:address location="http://localhost:8080/CreditScoreService/services/CreditScoreDocLitWrappedSOAP"/>
+ </wsdl:port>
+ </wsdl:service>
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/resources/org/apache/tuscany/databinding/sdo/helloworld.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/resources/org/apache/tuscany/databinding/sdo/helloworld.wsdl new file mode 100644 index 0000000000..e9312949d3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/databinding/sdo/src/test/resources/org/apache/tuscany/databinding/sdo/helloworld.wsdl @@ -0,0 +1,106 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<wsdl:definitions targetNamespace="http://helloworldaxis.samples.tuscany.apache.org" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://helloworldaxis.samples.tuscany.apache.org" xmlns:intf="http://helloworldaxis.samples.tuscany.apache.org" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="stockquote">
+ <!--WSDL created by Apache Axis version: 1.2.1
+Built on Jun 14, 2005 (09:15:57 EDT)-->
+ <wsdl:types>
+ <schema elementFormDefault="qualified" targetNamespace="http://helloworldaxis.samples.tuscany.apache.org" xmlns="http://www.w3.org/2001/XMLSchema">
+ <element name="getGreetings">
+ <complexType>
+ <sequence>
+ <element name="in0" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="getGreetingsResponse">
+ <complexType>
+ <sequence>
+ <element name="getGreetingsReturn" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ </element>
+ </schema>
+ </wsdl:types>
+
+ <wsdl:message name="getGreetingsRequest">
+
+ <wsdl:part element="impl:getGreetings" name="parameters"/>
+
+ </wsdl:message>
+
+ <wsdl:message name="getGreetingsResponse">
+
+ <wsdl:part element="impl:getGreetingsResponse" name="parameters"/>
+
+ </wsdl:message>
+
+ <wsdl:portType name="HelloWorldServiceImpl">
+
+ <wsdl:operation name="getGreetings">
+
+ <wsdl:input message="impl:getGreetingsRequest" name="getGreetingsRequest"/>
+
+ <wsdl:output message="impl:getGreetingsResponse" name="getGreetingsResponse"/>
+
+ </wsdl:operation>
+
+ </wsdl:portType>
+
+ <wsdl:binding name="helloworldSoapBinding" type="impl:HelloWorldServiceImpl">
+
+ <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+
+ <wsdl:operation name="getGreetings">
+
+ <wsdlsoap:operation soapAction=""/>
+
+ <wsdl:input name="getGreetingsRequest">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:input>
+
+ <wsdl:output name="getGreetingsResponse">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:output>
+
+ </wsdl:operation>
+
+ </wsdl:binding>
+
+ <wsdl:service name="HelloWorldServiceImplService">
+
+ <wsdl:port binding="impl:helloworldSoapBinding" name="helloworld">
+
+ <!-- Tuscany SCA Service --> +<!--
+ <wsdlsoap:address location="http://localhost:8080/tuscany-samples-helloworldws-service/services/HelloWorldService"/>
+--> + <wsdlsoap:address location="http://localhost:9876/tuscany-samples-helloworldws-service/services/HelloWorldService"/>
+
+ <!-- Axis Web Service -->
+ <!-- + <wsdlsoap:address location="http://localhost:8081/helloworldaxissvc/services/helloworld"/>
+ --> +
+ </wsdl:port>
+
+ </wsdl:service>
+
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/LICENSE.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/README.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/README.txt new file mode 100644 index 0000000000..9b26d1690a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/README.txt @@ -0,0 +1,35 @@ +Apache Tuscany M1 build (May, 2006) +=================================== + +http://incubator.apache.org/tuscany/ + +Tuscany is an effort undergoing incubation at the Apache Software Foundation +(ASF), sponsored by the Web Services PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness or +stability of the code, it does indicate that the project has yet to be fully +endorsed by the ASF. + + +Support +------- + +Any problem with this release can be reported to the Tuscany mailing list +or in the JIRA issue tracker. + +Mailing list subscription: + tuscany-dev-subscribe@ws.apache.org + +Jira: + http://issues.apache.org/jira/browse/Tuscany + + +Thank you for using Tuscany! + + +The Tuscany Team. + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/pom.xml new file mode 100644 index 0000000000..c1b74166aa --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/pom.xml @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + --> +<project> + <parent> + <groupId>org.apache.tuscany</groupId> + <artifactId>tuscany-sca</artifactId> + <version>incubating-M1</version> + </parent> + <modelVersion>4.0.0</modelVersion> + <artifactId>tuscany-model</artifactId> + <name>Tuscany Assembly Model</name> + <description>Data model for the Assembly model defined by the SCA specification.</description> + <version>incubating-M1</version> + + <dependencies> + <dependency> + <groupId>org.osoa</groupId> + <artifactId>sca-api</artifactId> + <version>${pom.version}</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.apache.tuscany</groupId> + <artifactId>tuscany-common</artifactId> + <version>${pom.version}</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>commonj</groupId> + <artifactId>sdo-api</artifactId> + <version>incubating-M1</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.apache.tuscany</groupId> + <artifactId>tuscany-sdo-impl</artifactId> + <version>incubating-M1</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>wsdl4j</groupId> + <artifactId>wsdl4j</artifactId> + <version>1.5.2</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>asm</groupId> + <artifactId>asm</artifactId> + <version>2.2</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>3.8.1</version> + <scope>test</scope> + </dependency> + </dependencies> +</project> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/ModelRuntimeException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/ModelRuntimeException.java new file mode 100644 index 0000000000..e167882786 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/ModelRuntimeException.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model; + +import org.apache.tuscany.common.TuscanyRuntimeException; + +/** + * The root runtime exception for the model. + * + * @version $Rev$ $Date$ + */ +@SuppressWarnings({"serial"}) +public abstract class ModelRuntimeException extends TuscanyRuntimeException { + + public ModelRuntimeException() { + super(); + } + + public ModelRuntimeException(String message) { + super(message); + } + + public ModelRuntimeException(String message, Throwable cause) { + super(message, cause); + } + + public ModelRuntimeException(Throwable cause) { + super(cause); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AssemblyContext.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AssemblyContext.java new file mode 100644 index 0000000000..48aed5f35a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AssemblyContext.java @@ -0,0 +1,64 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.model.assembly.loader.AssemblyModelLoader; + +import commonj.sdo.helper.TypeHelper; + +/** + * Context object supplied by visitors that are processing the model. + */ +public interface AssemblyContext { + + /** + * Returns a factory that can be used to create other model objects + * + * @return a factory for model objects + */ + AssemblyFactory getAssemblyFactory(); + + /** + * Returns a loader for resources in the application environment. + * + * @return a loader for resources in the system environment + */ + ResourceLoader getApplicationResourceLoader(); + + /** + * Returns a loader that can be used to load sub-models. + * + * @return a loader for sub-models + */ + AssemblyModelLoader getAssemblyLoader(); + + /** + * Returns an SDO type helper. + * + * @return an SDO type helper + */ + TypeHelper getTypeHelper(); + + /** + * Returns the Web application module URI + * + * @return the module name of the Web app + */ + String getWebAppName(); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AssemblyFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AssemblyFactory.java new file mode 100644 index 0000000000..efbc6bffa4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AssemblyFactory.java @@ -0,0 +1,260 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +import javax.xml.namespace.QName; + +import org.apache.tuscany.model.types.java.JavaServiceContract; +import org.apache.tuscany.model.types.wsdl.WSDLServiceContract; + +/** + * The Factory for the assembly model. Provides a create method for each non-abstract class of the model. + */ +public interface AssemblyFactory { + + /** + * Returns a new SimpleComponent. + * + * @return a new SimpleComponent + */ + AtomicComponent createSimpleComponent(); + + /** + * Returns a new ComponentType. + * + * @return a new ComponentType + */ + ComponentType createComponentType(); + + /** + * Returns a new EntryPoint. + * + * @return a new EntryPoint + */ + EntryPoint createEntryPoint(); + + /** + * Returns a new ExternalService. + * + * @return a new ExternalService + */ + ExternalService createExternalService(); + + /** + * Returns a new JavaServiceContract. + * + * @return a new JavaServiceContract + */ + JavaServiceContract createJavaServiceContract(); + + /** + * Returns a new Module. + * + * @return a new Module + */ + Module createModule(); + + /** + * Returns a new ModuleComponent. + * + * @return a new ModuleComponent + */ + ModuleComponent createModuleComponent(); + + /** + * Returns a new ModuleFragment. + * + * @return a new ModuleFragment + */ + ModuleFragment createModuleFragment(); + + /** + * Returns a new Reference. + * + * @return a new Reference + */ + Reference createReference(); + + /** + * Returns a new ConfiguredReference. + * + * @return a new ConfiguredReference + */ + ConfiguredReference createConfiguredReference(); + + /** + * Returns a new Service. + * + * @return a new Service + */ + Service createService(); + + /** + * Returns a new ConfiguredService. + * + * @return a new ConfiguredService + */ + ConfiguredService createConfiguredService(); + + /** + * Returns a new Subsystem. + * + * @return a new Subsystem + */ + Subsystem createSubsystem(); + + /** + * Returns a new Property. + * + * @return a new Property + */ + Property createProperty(); + + /** + * Returns a new ConfiguredProperty. + * + * @return a new ConfiguredProperty + */ + ConfiguredProperty createConfiguredProperty(); + + /** + * Returns a new WSDLServiceContract. + * + * @return a new WSDLServiceContract + */ + WSDLServiceContract createWSDLServiceContract(); + + /** + * Create a new ServiceURI from the given uri string. + * + * @param uri the URI for the service + * @return a new ServiceURI created from the supplied URI + */ + ServiceURI createServiceURI(String uri); + + /** + * Creates a new ServiceURI from a module component and a service name. + * + * @param moduleComponent the module component exposing the service + * @param serviceName the name of the service exposed by the module + * @return a new ServiceURI for the exposed service + */ + ServiceURI createServiceURI(ModuleComponent moduleComponent, String serviceName); + + /** + * Creates a new ServiceURI from a module component and configured port. + * + * @param moduleComponent the module component exposing the service + * @param part the part that is providing the service + * @param configuredPort the port on the part + * @return a new serviceURI for the exposed service + */ + ServiceURI createServiceURI(ModuleComponent moduleComponent, Part part, ConfiguredPort configuredPort); + + ServiceURI createServiceURI(ModuleComponent moduleComponent, String partName, String serviceName); + + /** + * Create a qname from a URI + * + * @param uri + * @return a new qname + */ + QName createQName(String uri); + + /** + * Create a wire + * + * @return an new wire + */ + Wire createWire(); + + /** + * Helper method for creating a reference. + * + * @param name the name of the reference + * @param service the Java type of the service + * @return a Reference + */ + Reference createReference(String name, Class<?> service); + + /** + * Helper method for creating a reference. + * + * @param name the name of the reference + * @param service the Java type of the service + * @param multiplicity the multiplicity of the reference + * @return a Reference + */ + Reference createReference(String name, Class<?> service, Multiplicity multiplicity); + + /** + * Helper method for creating a configured reference. + * + * @param name the name of the reference + * @param targets the targets for the reference + * @return a ConfiguredReference + */ + ConfiguredReference createConfiguredReference(String name, String... targets); + + /** + * Helper method for creating an EntryPoint wired to a single target. + * + * @param entryPointName the name of the entry point + * @param serviceContract the service contract the EntryPoint should expose + * @param binding the binding the EntryPoint should use + * @param targetName the target the EntryPoint exposes + * @return an EntryPoint that exposes the supplied service and is wired to the target + */ + EntryPoint createEntryPoint(String entryPointName, ServiceContract serviceContract, Binding binding, String targetName); + + /** + * Helper method for creating an EntryPoint wired to a single target. + * + * @param entryPointName the name of the entry point + * @param configuredService the configured service to expose + * @param binding the binding the EntryPoint should use + * @param configuredReference a configured reference to the target + * @return an EntryPoint that exposes the supplied service using the supplied bindng and which is wired + * using the supplied reference + */ + EntryPoint createEntryPoint(String entryPointName, ConfiguredService configuredService, Binding binding, ConfiguredReference configuredReference); + + /** + * Helper method for creating a simple Property. + * + * @param name the property name + * @param type the Java type of the property + * @return a Property with the supplied name and type + */ + Property createProperty(String name, Class<?> type); + + /** + * Returns a new ImportWSDL model object. + * + * @return a new ImportWSDL model object + */ + ImportWSDL createImportWSDL(); + + /** + * Returns a new ImportWSDL model object initialized with the supplied values. + * + * @param location the location where the WSDL definition can be found + * @param namespace the namespace URI for this import + * @return a new ImportWSDL model object + */ + ImportWSDL createImportWSDL(String location, String namespace); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AssemblyInitializationException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AssemblyInitializationException.java new file mode 100644 index 0000000000..69a7854df9 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AssemblyInitializationException.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +import org.apache.tuscany.model.ModelRuntimeException; + +/** + * Denotes an exception initializing an assembly model artifact. + * + * @version $Rev$ $Date$ + */ +public class AssemblyInitializationException extends ModelRuntimeException { + private static final long serialVersionUID = 747289653378365323L; + + public AssemblyInitializationException() { + super(); + } + + public AssemblyInitializationException(String message) { + super(message); + } + + public AssemblyInitializationException(String message, Throwable cause) { + super(message, cause); + } + + public AssemblyInitializationException(Throwable cause) { + super(cause); + } + +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AssemblyObject.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AssemblyObject.java new file mode 100644 index 0000000000..d25f114902 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AssemblyObject.java @@ -0,0 +1,45 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +/** + * Base interface for all assembly model objects providing methods for managing the model itself. + */ +public interface AssemblyObject { + + /** + * Initialize this model object. + * + * @param modelContext context providing access to the environment in which this model is being used + * @throws AssemblyInitializationException if an error ocurrs initializing the artifact + */ + void initialize(AssemblyContext modelContext) throws AssemblyInitializationException; + + /** + * Freeze this model object preventing any additional changes. + */ + void freeze(); + + /** + * Accept a visitor + * + * @param visitor a visitor that is visiting the model + * @return true if processing is complete and the visitor should stop traversing the model + */ + boolean accept(AssemblyVisitor visitor); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AssemblyVisitor.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AssemblyVisitor.java new file mode 100644 index 0000000000..f153b9b4f6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AssemblyVisitor.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +/** + * A visitor that traverses the model performing some operation. + */ +public interface AssemblyVisitor { + + /** + * Visit the given model object. + * + * @param modelObject the assembly model object to visit + * @return true if processing is complete + */ + boolean visit(AssemblyObject modelObject); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AtomicComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AtomicComponent.java new file mode 100644 index 0000000000..0c98bbbe95 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AtomicComponent.java @@ -0,0 +1,25 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + + +/** + * An atomic component, specifically not an {@link Composite}. + */ +public interface AtomicComponent extends Component<AtomicImplementation> { +} +
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AtomicImplementation.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AtomicImplementation.java new file mode 100644 index 0000000000..4d0703186b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/AtomicImplementation.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + + +/** + * The implementation for a specific atomic component instance. + * This interface will typically be extended by component type implementations to indicate the + * specific implementation to be used by a runtime and to allow for additional runtime configuration + * properties. + */ +public interface AtomicImplementation extends Implementation { + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Binding.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Binding.java new file mode 100644 index 0000000000..51becc29c2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Binding.java @@ -0,0 +1,40 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + + +/** + * The binding of an entry point or external service to a transport. + * This model object will typically be extended by binding implementations to allow + * specification of binding/transport specific information. + */ +public interface Binding extends AssemblyObject { + /** + * Returns the binding URI. + * @return the binding uri + * TODO do we need this? + */ + String getURI(); + + /** + * Sets binding URI. + * @param value the binding uri + * TODO do we need this? + */ + void setURI(String value); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Component.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Component.java new file mode 100644 index 0000000000..b8d566f1d6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Component.java @@ -0,0 +1,81 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +import java.util.List; + + +/** + * A component is a configured instance of a generic {@link Implementation}. + */ +public interface Component<I extends Implementation> extends Part { + + /** + * Returns the Implementation for this configured instance. + * @return the Implementation for this configured instance + */ + I getImplementation(); + + /** + * Sets the Implementation for this configured instance + * @param value the Implementation for this configured instance + */ + void setImplementation(I value); + + /** + * Returns a list of configured property values for this configured instance. + * These values will be used to initialize the component when it is activated. + * @return a list of ConfiguredProperty values + */ + List<ConfiguredProperty> getConfiguredProperties(); + + /** + * Returns the ConfiguredProperty value for the specified property. + * + * @param name the name of the Property + * @return the configured property value for the named property + */ + ConfiguredProperty getConfiguredProperty(String name); + + /** + * Returns the configured references for the configured instance. + * + * @return the configured references for the configured instance + */ + List<ConfiguredReference> getConfiguredReferences(); + + /** + * Returns the ConfiguredReference value for the specified reference. + * @param name the name of the Property + * @return the configured reference value for the named reference + */ + ConfiguredReference getConfiguredReference(String name); + + /** + * Returns the configured services for the configured instance. + * @return the configured services for the configured instance + */ + List<ConfiguredService> getConfiguredServices(); + + /** + * Returns the ConfiguredService value for the specified property. + * @param name the name of the Property + * @return the configured service value for the named service + */ + ConfiguredService getConfiguredService(String name); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ComponentType.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ComponentType.java new file mode 100644 index 0000000000..58ac9bc9de --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ComponentType.java @@ -0,0 +1,66 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +import java.util.List; + + +/** + * A logical definition of a type of component separate from any specific implementation. + */ +public interface ComponentType extends Extensible { + + /** + * Returns a list of services exposed by this component type. + * @return a list of services exposed by this component type + */ + List<Service> getServices(); + + /** + * Returns the specfied service if exposed by this component type. + * @param name the name of the service + * @return the service identified by the supplied name, or null if there is no service with that name + */ + Service getService(String name); + + /** + * Returns the list of references this component type consumes. + * @return the list of references this component type consumes + */ + List<Reference> getReferences(); + + /** + * Returns the specified reference. + * @param name the name of the reference + * @return the reference identified by the supplied name, or null if there is no reference with that name + */ + Reference getReference(String name); + + /** + * Returns the list of properties that can be used to configure components with this component type. + * @return the list of properties that can be used to configure components with this component type + */ + List<Property> getProperties(); + + /** + * Returns the specified property + * @param name the name of the property + * @return the property with the supplied name, or null if there is no property with that name + */ + Property getProperty(String name); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Composite.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Composite.java new file mode 100644 index 0000000000..09f51945bb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Composite.java @@ -0,0 +1,94 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +import java.util.List; + +/** + * A model object that describes a container for parts. + */ +public interface Composite extends Implementation { + + /** + * Returns the name of the composite. + * @return the name of the composite + */ + String getName(); + + /** + * Sets the name of the composite. + * @param name the name of the composite + */ + void setName(String name); + + /** + * Returns the named part. + * @param name + */ + Part getPart(String name); + + /** + * Returns all entry points contained in this composite. + * @return a list of all EntryPoint model objects contained in this composite + */ + List<EntryPoint> getEntryPoints(); + + /** + * Returns all components contained in this composite. + * @return a list of all Component model objects contained in this composite + */ + List<Component> getComponents(); + + /** + * Returns all external services contained in this composite. + * @return a list of all ExternalService model objects contained in this composite + */ + List<ExternalService> getExternalServices(); + + /** + * Returns the wires contained in this composite. + */ + List<Wire> getWires(); + + /** + * Returns the WSDL imports declared in this composite. + */ + List<ImportWSDL> getWSDLImports(); + + /** + * Returns the WSDL imports for the given namespace. + * @param namespace + */ + List<ImportWSDL> getWSDLImports(String namespace); + + /** + * Returns the configured service at the given address. + * @param address + */ + ConfiguredService getConfiguredService(ServiceURI address); + + /** + * Returns the implementation class. + */ + Class<?> getImplementationClass(); + + /** + * Sets the implementation class. + */ + void setImplementationClass(Class<?> value); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/CompositeComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/CompositeComponent.java new file mode 100644 index 0000000000..c78fe28ff5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/CompositeComponent.java @@ -0,0 +1,35 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +/** + * Specialization of Component that represents a configured {@link Module}. + */ +public interface CompositeComponent<I extends Composite> extends Component<I> { + + /** + * Returns the uri that uniquely identifies this module component. + * @return the uri that uniquely identifies this module component + */ + String getURI(); + + /** + * Sets the uri that uniquely identifies this module component. + * @param uri the uri that uniquely identifies this module component + */ + void setURI(String uri); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ConfiguredPort.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ConfiguredPort.java new file mode 100644 index 0000000000..7f562e99d9 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ConfiguredPort.java @@ -0,0 +1,63 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + + +/** + * Represents a configured port (e.g. a configured reference or configured service). + */ +public interface ConfiguredPort<P extends Port> extends AssemblyObject, ProxyFactoryHolder { + + /** + * Returns the name of the port being configured. + * + * @return the name of the port being configured + */ + String getName(); + + /** + * Set the name of the port being configured. + * + * @param name the name of the port being configured + */ + void setName(String name); + + /** + * Returns the port that is being configured. + * @return the port that is being configured + */ + P getPort(); + + /** + * Sets the port that is being configured. + * @param port the port that is being configured + */ + void setPort(P port); + + /** + * Returns the part containing this port. + * @return the part that contains this port + */ + Part getPart(); + + /** + * Sets the configured part containing this port. + * @param part the configured part containing this port. + */ + void setPart(Part part); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ConfiguredProperty.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ConfiguredProperty.java new file mode 100644 index 0000000000..0d3a3e5011 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ConfiguredProperty.java @@ -0,0 +1,74 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +/** + * The configured value of a {@link Property}. + */ +public interface ConfiguredProperty extends AssemblyObject { + + //FIXME remove the name attribute? + /** + * Returns the name of the property being configured. + * @return the name of the property being configured + */ + String getName(); + + /** + * Set the name of the property being configured. + * @param name the name of the property being configured + */ + void setName(String name); + + /** + * Returns the {@link Property} whose value is being set. + * @return the {@link Property} whose value is being set + */ + Property getProperty(); + + /** + * Sets the {@link Property} whose value is being set. + * @param property the {@link Property} whose value is being set + */ + void setProperty(Property property); + + /** + * Returns the value being set for this usage of the {@link Property}. + * @return the value being set for this usage of the {@link Property} + */ + Object getValue(); + + /** + * Sets the value being set for this usage of the {@link Property}. + * @param value the value being set for this usage of the {@link Property} + */ + void setValue(Object value); + + /** + * Returns the override option that determines if any configuration for this property + * that is contained in this composite can be overridden by configuration supplied from outside. + */ + OverrideOption getOverrideOption(); + + /** + * Set the override option that determines if any configuration for this property + * that is contained in this composite can be overridden by configuration supplied from outside. + * + * @param value the option that determines how property configuration can be overriden + */ + void setOverrideOption(OverrideOption value); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ConfiguredReference.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ConfiguredReference.java new file mode 100644 index 0000000000..22cb734869 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ConfiguredReference.java @@ -0,0 +1,44 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +import java.util.List; + +/** + * A configured reference associated with a particular usage. + * Each configuredReference represents a configured version of an logical + * reference defined in the ComponentType. If the logical reference + * has a multiplicity greater than 1 (0..n or 1..n) then the configured + * reference many have multiple targets. + */ +public interface ConfiguredReference extends ConfiguredPort<Reference> { + + /** + * List of URIs for the targets of this reference. + * + * @return the list of URIs for the targets of this reference + */ + List<String> getTargets(); + + /** + * Returns the list of configured services that are wired to this configured reference. + * + * @return the list of configured services that are wired to this configured reference + */ + List<ConfiguredService> getTargetConfiguredServices(); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ConfiguredService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ConfiguredService.java new file mode 100644 index 0000000000..696250ea44 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ConfiguredService.java @@ -0,0 +1,25 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + + +/** + * A configured service associated with a particular usage. + */ +public interface ConfiguredService extends ConfiguredPort<Service> { + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ContextFactoryHolder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ContextFactoryHolder.java new file mode 100644 index 0000000000..20259f245d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ContextFactoryHolder.java @@ -0,0 +1,34 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +/** + * A model object that can hold a runtime context factory object. + */ +public interface ContextFactoryHolder { + + /** + * Sets the context factory + */ + void setContextFactory(Object contextFactory); + + /** + * Returns the context factory + */ + Object getContextFactory(); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/EntryPoint.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/EntryPoint.java new file mode 100644 index 0000000000..a90b89c4f5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/EntryPoint.java @@ -0,0 +1,67 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +import java.util.List; + + +/** + * An entry point exposed by its containing {@link Composite}. + * References from outside the composite can only be connected to its entry points. + */ +public interface EntryPoint extends Part { + + /** + * Returns the bindings supported by this entry point. + * A single entry point may be bound to multiple transports. + * + * @return a list of bindings supported by this entry point + */ + List<Binding> getBindings(); + + /** + * Returns the configured service exposed by this entry point. + * + * @return the configured service exposed by this entry point + */ + ConfiguredService getConfiguredService(); + + /** + * Sets the configured service exposed by this entry point. + * + * @param configuredService the configured service exposed by this entry point + */ + void setConfiguredService(ConfiguredService configuredService); + + /** + * Returns the configured reference that wires this entry point to the published service + * inside the composite. + * + * @return the reference that wires this entry point to the published service + */ + ConfiguredReference getConfiguredReference(); + + /** + * Sets the configured reference that wires this entry point to the published service + * inside the composite. + * + * @param configuredReference the configured reference that wires this entry point to + * the published service inside the composite + */ + void setConfiguredReference(ConfiguredReference configuredReference); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Extensible.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Extensible.java new file mode 100644 index 0000000000..b4651a6186 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Extensible.java @@ -0,0 +1,37 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +import java.util.List; + +/** + * An extensible model object. We actually need this even though we have the ability to load specializations + * of individual model objects + */ +public interface Extensible extends AssemblyObject { + + /** + * Returns the extensibility elements. + */ + List<Object> getExtensibilityElements(); + + /** + * Returns the extensibility attributes. + */ + List<Object> getExtensibilityAttributes(); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ExternalService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ExternalService.java new file mode 100644 index 0000000000..f2b72ec928 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ExternalService.java @@ -0,0 +1,59 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +import java.util.List; + + +/** + * An external service consumed by its containing {@link Composite}. + * All references used by the composite are specified as external services. + */ +public interface ExternalService extends Part { + + /** + * Returns the bindings that can be used by operations on this external service. + * A single external service may be bound to multiple transports. + */ + List<Binding> getBindings(); + + /** + * Returns the override option that determines if any wiring for this external service + * that is contained in this composite can be overridden by wired supplied from outside. + */ + OverrideOption getOverrideOption(); + + /** + * Set the override option that determines if any wiring for this external service + * that is contained in this composite can be overridden by wired supplied from outside. + * + * @param value the option that determines how wires can be overriden + */ + void setOverrideOption(OverrideOption value); + + /** + * Returns the configured service that this external service provides to other parts of the containing composite. + * @return the configured service that this external service provides to other parts of the containing composite + */ + ConfiguredService getConfiguredService(); + + /** + * Sets the configured service that this external service provides to other parts of the containing composite + * @param configuredService the configured service that this external service provides to other parts of the containing composite + */ + void setConfiguredService(ConfiguredService configuredService); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Implementation.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Implementation.java new file mode 100644 index 0000000000..2777d985f8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Implementation.java @@ -0,0 +1,40 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + + +/** + * The implementation for a specific component instance. + * This interface will typically be extended by component type implementations to indicate the + * specific implementation to be used by a runtime and to allow for additional runtime configuration + * properties. + */ +public interface Implementation extends Extensible { + + /** + * Returns the generic component type corresponding to this implementation. + * @return the generic component type corresponding to this implementation + */ + ComponentType getComponentType(); + + /** + * Sets the generic component type corresponding to this implementation. + * @param componentType the generic component type corresponding to this implementation + */ + void setComponentType(ComponentType componentType); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ImportWSDL.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ImportWSDL.java new file mode 100644 index 0000000000..7c858a1b76 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ImportWSDL.java @@ -0,0 +1,62 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.model.assembly; + +import javax.wsdl.Definition; + +/** + * Model object that represents the import of an external WSDL definition. + * + * @version $Rev$ $Date$ + */ +public interface ImportWSDL extends AssemblyObject { + /** + * Returns the location where the WSDL definition can be found. + * @return the location where the WSDL definition can be found + */ + String getLocation(); + + /** + * Set the location where the WSDL definition can be found. + * @param uri the location where the WSDL definition can be found + */ + void setLocation(String uri); + + /** + * Returns the namespace URI for this import. + * @return the namespace URI for this import + */ + String getNamespace(); + + /** + * Sets the namespace URI for this import. + * @param uri the namespace URI for this import + */ + void setNamespace(String uri); + + /** + * Returns the WSDL Definition. + * @return the WSDL Definition + */ + Definition getDefinition(); + + /** + * Sets the WSDL Definition. + * @param definition the WSDL Definition + */ + void setDefinition(Definition definition); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Module.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Module.java new file mode 100644 index 0000000000..40d1d1534b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Module.java @@ -0,0 +1,40 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +import java.util.List; + +/** + * A specialized {@link Implementation} that defines a modular unit of assembly. + * A Module denotes the extent of assembly in which pass-by-reference semantics are supported. + */ +public interface Module extends Composite { + + /** + * Returns a list of assembly fragments that combine to form a single module. + * @return a list of assembly fragments that combine to form a single module + */ + List<ModuleFragment> getModuleFragments(); + + /** + * Returns the specified assembly fragment. + * @param name the name of the fragment + * @return the fragment with the specified name, or null if there is no fragment with that name + */ + ModuleFragment getModuleFragment(String name); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ModuleComponent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ModuleComponent.java new file mode 100644 index 0000000000..00f6079096 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ModuleComponent.java @@ -0,0 +1,24 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +/** + * Specialization of Component that represents a configured {@link Module}. + */ +public interface ModuleComponent extends CompositeComponent<Module> { + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ModuleFragment.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ModuleFragment.java new file mode 100644 index 0000000000..dec1e8bfd3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ModuleFragment.java @@ -0,0 +1,25 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +/** + * A fragment of assembly configuration within a module. + * To support flexibility and reuse, modules can be defined in multiple fragments that are + * then combined by the runtime to form the complete module definition. + */ +public interface ModuleFragment extends Composite { +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Multiplicity.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Multiplicity.java new file mode 100644 index 0000000000..c51ab7b8ea --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Multiplicity.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +/** + * Enumeration for multiplicity. + */ +public enum Multiplicity { + /** + * Indicates a relationship that is optionally connected to the requestor and which, if supplied, + * must be connected to exactly one provider. + */ + ZERO_ONE, + + /** + * Indicates a relationship that must be connected between exactly one requestor and + * exactly one provider. + */ + ONE_ONE, + + /** + * Indicates a relationship that is optionally connects the requestor to zero to unbounded providers. + */ + ZERO_N, + + /** + * Indicates a relationship that must be connected at the requestor and which connects it to + * zero to unbounded providers. + */ + ONE_N + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/OverrideOption.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/OverrideOption.java new file mode 100644 index 0000000000..68489d0200 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/OverrideOption.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +/** + * Enumeration for override options that are used to control whether configuration information + * can be overridden by larger grained definitions. + */ +public enum OverrideOption { + /** + * Indicates that the supplied configuration cannot be overridden. + */ + NO, + + /** + * Indicates that the supplied configuration may be overriden. + */ + MAY, + + /** + * Indicates that the supplied configuration must be overriden. + */ + MUST + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Part.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Part.java new file mode 100644 index 0000000000..9645ad6d35 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Part.java @@ -0,0 +1,49 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + + + +/** + * A configured object that is contained inside a {@link Composite}. + */ +public interface Part extends Extensible, ContextFactoryHolder { + /** + * Returns the name that uniquely identifies this component within its containing composite. + * @return the name that uniquely identifies this component within its containing composite + */ + String getName(); + + /** + * Sets the name that uniquely identifies this component within its containing composite. + * @param value the name that uniquely identifies this component within its containing composite + */ + void setName(String value); + + /** + * Returns the composite that contains this component. + * @return the composite that contains this component + */ + Composite getComposite(); + + /** + * Sets the composite that contains this component. + * @param the composite that contains this component + */ + void setComposite(Composite composite); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Port.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Port.java new file mode 100644 index 0000000000..13b9d0a1db --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Port.java @@ -0,0 +1,47 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +/** + * Abstraction for the association of a service contract with a requestor or provider. + */ +public interface Port extends AssemblyObject { + /** + * Returns the contract for invocations of a service using this port. + * @return the oontract for invocations of a service using this port + */ + ServiceContract getServiceContract(); + + /** + * Set the contract for invocations of a service using this port. + * @param contract the contract for invocations of a service using this port + */ + void setServiceContract(ServiceContract contract); + + /** + * Returns the name of the port where it is associated with a requestor or provider. + * @return the name of the port + */ + String getName(); + + /** + * Sets the name of the port where it is associated with a requestor or provider. + * @param name the name of the port where it is associated with a requestor or provider + */ + void setName(String name); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Property.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Property.java new file mode 100644 index 0000000000..1f238efce6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Property.java @@ -0,0 +1,91 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + + + +/** + * A description of a property that can be used to configure a component. + */ +public interface Property extends Extensible { + // todo should we decalre this as Property<T> where T would be the type of this Property? + + /** + * Returns the property name. + * @return the property name + */ + String getName(); + + /** + * Sets the property name. + * @param name the property name + */ + void setName(String name); + + /** + * Returns the default value of the property. + * @return the default value of ths property + */ + Object getDefaultValue(); + + /** + * Sets the default value of the property. + * @param value the default value of ths property + */ + void setDefaultValue(Object value); + + /** + * Returns true if the property allows multiple values. + * @return true if the property allows multiple values + */ + boolean isMany(); + + /** + * Sets whether or not the property allows multiple values. + * @param value true if the property should allow multiple values + */ + void setMany(boolean value); + + /** + * Returns true if a value must be supplied for the property. + * @return true is a value must be supplied for the property + */ + boolean isRequired(); + + /** + * Sets whether a value must be supplied for the property. + * For ease of use, it is recommended that a meaningful default value should + * be supplied for all properties; users should only be required to specify + * a value if there is no reasonable default. + * + * @param value set to true to require that a value be supplied for uses of this property + */ + void setRequired(boolean value); + + /** + * Returns the type of this property as used by the runtime. + * @return the type of this property as used by the runtime + */ + Class<?> getType(); + + /** + * Sets the type of this property as used by the runtime + * @param value the type of this property as used by the runtime + */ + void setType(Class<?> value); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ProxyFactoryHolder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ProxyFactoryHolder.java new file mode 100644 index 0000000000..055448b2f5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ProxyFactoryHolder.java @@ -0,0 +1,34 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +/** + * A model object that can hold a runtime proxy factory object. + */ +public interface ProxyFactoryHolder { + + /** + * Sets the proxy factory + */ + void setProxyFactory(Object proxyFactory); + + /** + * Returns the proxy factory + */ + Object getProxyFactory(); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Reference.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Reference.java new file mode 100644 index 0000000000..8cc13e98ec --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Reference.java @@ -0,0 +1,36 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + + +/** + * The association of a port with a requestor. + */ +public interface Reference extends Port { + /** + * Returns the multiplicity allowed for wires connected to this reference. + * @return the multiplicity allowed for wires connected to this reference + */ + Multiplicity getMultiplicity(); + + /** + * Sets the multiplicity allowed for wires connected to this reference. + * @param multiplicity the multiplicity allowed for wires connected to this reference + */ + void setMultiplicity(Multiplicity multiplicity); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Scope.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Scope.java new file mode 100644 index 0000000000..c7194292f0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Scope.java @@ -0,0 +1,31 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +/** + * The types of scope supported by assemblies. + */ +public enum Scope { + // todo define what these are + INSTANCE, + REQUEST, + SESSION, + MODULE, + AGGREGATE, + UNDEFINED + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Service.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Service.java new file mode 100644 index 0000000000..c73002efba --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Service.java @@ -0,0 +1,24 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + + +/** + * The association of a port with a provider. + */ +public interface Service extends Port { +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ServiceContract.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ServiceContract.java new file mode 100644 index 0000000000..1600e11663 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ServiceContract.java @@ -0,0 +1,60 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +/** + * The contract specified by a requestor or provider for invocations across a port. + */ +public interface ServiceContract extends Extensible { + + /** + * Returns the interface for invocations from the requestor to the provider. + * @return the interface for invocations from the requestor to the provider + */ + Class getInterface(); + + /** + * Sets the interface for invocations from the requestor to the provider. + * @param value the interface for invocations from the requestor to the provider + */ + void setInterface(Class value); + + /** + * Returns the callback interface for wire from the provider back to its requestor. + * @return the callback interface for wire from the provider back to its requestor + */ + Class getCallbackInterface(); + + /** + * Sets the callback interface for wire from the provider back to its requestor. + * @param value the callback interface for wire from the provider back to its requestor + */ + void setCallbackInterface(Class value); + + /** + * Returns the scope of this service contract. + * @return + */ + Scope getScope(); + + /** + * Sets the scope. + * @param scope of this service contract. + */ + void setScope(Scope scope); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ServiceURI.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ServiceURI.java new file mode 100644 index 0000000000..740febc360 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/ServiceURI.java @@ -0,0 +1,58 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + +/** + * Represents a service URI. + */ +public interface ServiceURI { + + /** + * Returns true if the address scheme is sca + * @return + */ + public boolean isSCAScheme(); + + /** + * @return Returns the address. + */ + public String getAddress(); + + /** + * @return Returns the path. + */ + public String getPath(); + + /** + * Returns the module component name + * @return + */ + public String getModuleComponentName(); + + /** + * Returns the part name + * @return + */ + public String getPartName(); + + /** + * Returns the service name + * @return + */ + public String getServiceName(); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Subsystem.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Subsystem.java new file mode 100644 index 0000000000..709ba4da35 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Subsystem.java @@ -0,0 +1,38 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + + + +/** + * Represents a subsystem. + */ +public interface Subsystem extends Composite { + + /** + * Returns the subsystem uri. + * @return + */ + String getURI(); + + /** + * Sets the subsystem uri. + * @param value + */ + void setURI(String value); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Wire.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Wire.java new file mode 100644 index 0000000000..dfe553210a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Wire.java @@ -0,0 +1,48 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly; + + +/** + * A connection between a requestor (source) and a provider (target). + */ +public interface Wire extends Extensible { + /** + * Returns the URI for the source of the request. + * @return the URI for the source of the request + */ + ServiceURI getSource(); + + /** + * Sets the URI for the source of the request. + * @param uri the URI for the source of the request + */ + void setSource(ServiceURI uri); + + /** + * Returns the URI for the target of the request. + * @return the URI for the target of the request + */ + ServiceURI getTarget(); + + /** + * Sets the URI for the target of the request. + * @param uri the URI for the target of the request + */ + void setTarget(ServiceURI uri); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyContextImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyContextImpl.java new file mode 100644 index 0000000000..a7f9012db7 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyContextImpl.java @@ -0,0 +1,88 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.loader.AssemblyModelLoader; +import org.apache.tuscany.sdo.util.SDOUtil; + +import commonj.sdo.helper.TypeHelper; + +/** + */ +public class AssemblyContextImpl implements AssemblyContext { + + private final AssemblyFactory assemblyFactory; + private final AssemblyModelLoader assemblyLoader; + private final ResourceLoader applicationResourceLoader; + private final TypeHelper typeHelper; + private String webAppName; + + public AssemblyContextImpl(AssemblyModelLoader assemblyLoader, ResourceLoader resourceLoader) { + this(new AssemblyFactoryImpl(), assemblyLoader, resourceLoader); + } + + public AssemblyContextImpl(AssemblyFactory assemblyFactory, AssemblyModelLoader assemblyLoader, ResourceLoader artifactLoader) { + this(assemblyFactory, assemblyLoader, artifactLoader, SDOUtil.createTypeHelper()); + } + + public AssemblyContextImpl(AssemblyFactory assemblyFactory, AssemblyModelLoader assemblyLoader, ResourceLoader artifactLoader, String webAppName) { + this(assemblyFactory, assemblyLoader, artifactLoader, SDOUtil.createTypeHelper(), webAppName); + } + public AssemblyContextImpl(AssemblyFactory assemblyFactory, AssemblyModelLoader assemblyLoader, ResourceLoader artifactLoader, TypeHelper typeHelper) { + this(assemblyFactory, assemblyLoader, artifactLoader, SDOUtil.createTypeHelper(), null); + } + + public AssemblyContextImpl(AssemblyFactory assemblyFactory, AssemblyModelLoader assemblyLoader, ResourceLoader artifactLoader, TypeHelper typeHelper, String webAppName) { + this.assemblyFactory = assemblyFactory; + this.assemblyLoader = assemblyLoader; + this.applicationResourceLoader = artifactLoader; + this.typeHelper=typeHelper; + this.webAppName=webAppName; + } + + /** + * @see org.apache.tuscany.model.assembly.AssemblyContext#getAssemblyFactory() + */ + public AssemblyFactory getAssemblyFactory() { + return assemblyFactory; + } + + public ResourceLoader getApplicationResourceLoader() { + return applicationResourceLoader; + } + + /** + * @see org.apache.tuscany.model.assembly.AssemblyContext#getAssemblyLoader() + */ + public AssemblyModelLoader getAssemblyLoader() { + return assemblyLoader; + } + + /** + * @see org.apache.tuscany.model.assembly.AssemblyContext#getTypeHelper() + */ + public TypeHelper getTypeHelper() { + return typeHelper; + } + + public String getWebAppName() { + return webAppName; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyFactoryImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyFactoryImpl.java new file mode 100644 index 0000000000..c88ea4448f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyFactoryImpl.java @@ -0,0 +1,217 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import javax.xml.namespace.QName; + +import org.apache.tuscany.model.assembly.Part; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.ConfiguredPort; +import org.apache.tuscany.model.assembly.ConfiguredProperty; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.ExternalService; +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.ModuleComponent; +import org.apache.tuscany.model.assembly.ModuleFragment; +import org.apache.tuscany.model.assembly.Multiplicity; +import org.apache.tuscany.model.assembly.Property; +import org.apache.tuscany.model.assembly.Reference; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.ServiceURI; +import org.apache.tuscany.model.assembly.AtomicComponent; +import org.apache.tuscany.model.assembly.Subsystem; +import org.apache.tuscany.model.assembly.Wire; +import org.apache.tuscany.model.assembly.Binding; +import org.apache.tuscany.model.assembly.ServiceContract; +import org.apache.tuscany.model.assembly.ImportWSDL; +import org.apache.tuscany.model.types.java.JavaServiceContract; +import org.apache.tuscany.model.types.java.impl.JavaServiceContractImpl; +import org.apache.tuscany.model.types.wsdl.WSDLServiceContract; +import org.apache.tuscany.model.types.wsdl.impl.WSDLServiceContractImpl; + +/** + * Default implementation of AssemblyFactory + */ +public class AssemblyFactoryImpl implements AssemblyFactory { + + /** + * Constructor + */ + public AssemblyFactoryImpl() { + super(); + } + + public AtomicComponent createSimpleComponent() { + return new AtomicComponentImpl(); + } + + public ComponentType createComponentType() { + return new ComponentTypeImpl(); + } + + public EntryPoint createEntryPoint() { + return new EntryPointImpl(); + } + + public ExternalService createExternalService() { + return new ExternalServiceImpl(); + } + + public JavaServiceContract createJavaServiceContract() { + return new JavaServiceContractImpl(); + } + + public Module createModule() { + return new ModuleImpl(); + } + + public ModuleFragment createModuleFragment() { + return new ModuleFragmentImpl(); + } + + public ModuleComponent createModuleComponent() { + return new ModuleComponentImpl(); + } + + public Property createProperty() { + return new PropertyImpl(); + } + + public ConfiguredProperty createConfiguredProperty() { + return new ConfiguredPropertyImpl(); + } + + public Reference createReference() { + return new ReferenceImpl(); + } + + public ConfiguredReference createConfiguredReference() { + return new ConfiguredReferenceImpl(); + } + + public Service createService() { + return new ServiceImpl(); + } + + public ConfiguredService createConfiguredService() { + return new ConfiguredServiceImpl(); + } + + public Subsystem createSubsystem() { + return new SubsystemImpl(); + } + + public WSDLServiceContract createWSDLServiceContract() { + return new WSDLServiceContractImpl(); + } + + public ServiceURI createServiceURI(String uri) { + return new ServiceURIImpl(uri); + } + + public ServiceURI createServiceURI(ModuleComponent moduleComponent, String serviceName) { + return new ServiceURIImpl(moduleComponent, serviceName); + } + + public ServiceURI createServiceURI(ModuleComponent moduleComponent, Part part, ConfiguredPort configuredPort) { + return new ServiceURIImpl(moduleComponent, part, configuredPort); + } + + public ServiceURI createServiceURI(ModuleComponent moduleComponent, String partName, String serviceName) { + return new ServiceURIImpl(moduleComponent,partName,serviceName); + } + + public QName createQName(String uri) { + int h = uri.indexOf('#'); + return new QName(uri.substring(0, h), uri.substring(h + 1)); + } + + public Wire createWire() { + return new WireImpl(); + } + + public Reference createReference(String name, Class<?> service) { + return createReference(name,service,Multiplicity.ZERO_ONE); + } + + public Reference createReference(String name, Class<?> service, Multiplicity multiplicity){ + JavaServiceContract refContract = createJavaServiceContract(); + refContract.setInterface(service); + Reference reference = createReference(); + reference.setName(name); + reference.setServiceContract(refContract); + reference.setMultiplicity(multiplicity); + return reference; + } + + public ConfiguredReference createConfiguredReference(String name, String... targets) { + ConfiguredReference ref = createConfiguredReference(); + ref.setName(name); + for (String target : targets) { + ref.getTargets().add(target); + } + return ref; + } + + public EntryPoint createEntryPoint(String entryPointName, ServiceContract serviceContract, Binding binding, String targetName) { + // create and configure the exposed service + Service service = createService(); + service.setName(entryPointName); + service.setServiceContract(serviceContract); + ConfiguredService configuredService = createConfiguredService(); + configuredService.setPort(service); + + // create and configure a reference to target + Reference reference = createReference(); + reference.setMultiplicity(Multiplicity.ONE_ONE); + reference.setServiceContract(serviceContract); + ConfiguredReference configuredReference = createConfiguredReference(null, targetName); + configuredReference.setPort(reference); + + return createEntryPoint(entryPointName, configuredService, binding, configuredReference); + } + + public EntryPoint createEntryPoint(String entryPointName, ConfiguredService configuredService, Binding binding, ConfiguredReference configuredReference) { + EntryPoint entryPoint = createEntryPoint(); + entryPoint.setName(entryPointName); + entryPoint.setConfiguredService(configuredService); + entryPoint.setConfiguredReference(configuredReference); + entryPoint.getBindings().add((Binding)binding); + return entryPoint; + } + + public Property createProperty(String name, Class<?> type) { + Property property = createProperty(); + property.setName(name); + property.setType(type); + return property; + } + + public ImportWSDL createImportWSDL() { + return new ImportWSDLImpl(); + } + + public ImportWSDL createImportWSDL(String location, String namespace) { + ImportWSDL importWSDL = createImportWSDL(); + importWSDL.setLocation(location); + importWSDL.setNamespace(namespace); + return importWSDL; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyObjectImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyObjectImpl.java new file mode 100644 index 0000000000..38056e1e1c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyObjectImpl.java @@ -0,0 +1,123 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyObject; +import org.apache.tuscany.model.assembly.AssemblyVisitor; + +/** + * A base class for assembly model objects. + */ +public abstract class AssemblyObjectImpl implements AssemblyObject { + + private boolean frozen; + private boolean initialized; + + protected AssemblyObjectImpl() { + } + + public boolean accept(AssemblyVisitor visitor) { + return visitor.visit(this); + } + + /** + * Walk a visitor through a collection of model objects. + * @param collection + * @param visitor + */ + protected boolean accept(Collection collection, AssemblyVisitor visitor) { + for (Object member : collection) { + if (member instanceof AssemblyObject) { + if (!((AssemblyObject)member).accept(visitor)) + return false; + } + } + return true; + } + + public void freeze() { + if (!frozen) + frozen=true; + } + + /** + * Returns true if the object is frozen + */ + protected boolean isFrozen() { + return frozen; + } + + /** + * Freeze a list and its members + */ + protected <T> List<T> freeze(List<T> list) { + list=Collections.unmodifiableList(list); + for (Object member : list) { + if (member instanceof AssemblyObject) { + ((AssemblyObject)member).freeze(); + } + } + return list; + } + + /** + * Check that the current model object can be modified. + * @throws IllegalStateException + */ + protected void checkNotFrozen() { + if (frozen) + throw new IllegalStateException("Attempt to modify a frozen assembly model"); + } + + public void initialize(AssemblyContext modelContext) { + if (!initialized) + initialized=true; + } + + /** + * Returns true if the object is initialized + */ + protected boolean isInitialized() { + return initialized; + } + + /** + * Initialize members of a collection + */ + protected void initialize(Collection collection, AssemblyContext modelContext) { + for (Object member : collection) { + if (member instanceof AssemblyObject) { + ((AssemblyObject)member).initialize(modelContext); + } + } + } + + /** + * Check that the current model object is initialized. + * @throws IllegalStateException + */ + protected void checkInitialized() { + if (!initialized) + throw new IllegalStateException("Attempt to use an uninitialized assembly model"); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AtomicComponentImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AtomicComponentImpl.java new file mode 100644 index 0000000000..186d685d12 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AtomicComponentImpl.java @@ -0,0 +1,30 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.AtomicComponent; +import org.apache.tuscany.model.assembly.AtomicImplementation; + +/** + * An implementation of AtomicComponent. + */ +public class AtomicComponentImpl extends ComponentImpl<AtomicImplementation> implements AtomicComponent { + + protected AtomicComponentImpl() { + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AtomicImplementationImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AtomicImplementationImpl.java new file mode 100644 index 0000000000..1f85afa2cc --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AtomicImplementationImpl.java @@ -0,0 +1,29 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.AtomicImplementation; + +/** + * An implementation of AtomicImplementation. + */ +public abstract class AtomicImplementationImpl extends ImplementationImpl implements AtomicImplementation { + + protected AtomicImplementationImpl() { + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/BindingImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/BindingImpl.java new file mode 100644 index 0000000000..c13dabb17e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/BindingImpl.java @@ -0,0 +1,62 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyVisitor; +import org.apache.tuscany.model.assembly.Binding; + +/** + * An implementation of Binding. + */ +public class BindingImpl extends ExtensibleImpl implements Binding { + + private String uri; + + protected BindingImpl() { + } + + public String getURI() { + return uri; + } + + public void setURI(String value) { + checkNotFrozen(); + uri=value; + } + + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) + return; + super.initialize(modelContext); + } + + public void freeze() { + if (isFrozen()) + return; + super.freeze(); + + } + + public boolean accept(AssemblyVisitor visitor) { + if (!super.accept(visitor)) + return false; + + return true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ComponentImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ComponentImpl.java new file mode 100644 index 0000000000..a952ebe34d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ComponentImpl.java @@ -0,0 +1,213 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.AssemblyInitializationException; +import org.apache.tuscany.model.assembly.AssemblyVisitor; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.ConfiguredPort; +import org.apache.tuscany.model.assembly.ConfiguredProperty; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.Implementation; +import org.apache.tuscany.model.assembly.Property; +import org.apache.tuscany.model.assembly.Reference; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.util.NotifyingList; + +/** + * An implementation of Component. + */ +public abstract class ComponentImpl<I extends Implementation> extends PartImpl implements Component<I> { + + /** + * A list of configured ports synchronized with a map + */ + private class ConfiguredPortList<E extends ConfiguredPort> extends NotifyingList<E>{ + + Map<String, E> map; + + private ConfiguredPortList(Map<String, E> map) { + this.map=map; + } + + protected void added(E element) { + String name=element.getPort()!=null? element.getPort().getName():element.getName(); + map.put(name, element); + element.setPart(ComponentImpl.this); + } + protected void removed(E element) { + String name=element.getPort()!=null? element.getPort().getName():element.getName(); + map.remove(name); + element.setPart(null); + } + } + + private Map<String, ConfiguredReference> configuredReferencesMap = new HashMap<String, ConfiguredReference>(); + private List<ConfiguredReference> configuredReferences = new ConfiguredPortList<ConfiguredReference>(configuredReferencesMap); + + private Map<String, ConfiguredService> configuredServicesMap = new HashMap<String, ConfiguredService>(); + private List<ConfiguredService> configuredServices = new ConfiguredPortList<ConfiguredService>(configuredServicesMap); + + /** + * A list of properties synchronized with a map + */ + private class ConfiguredPropertyList<E extends ConfiguredProperty> extends NotifyingList<E>{ + + protected void added(E element) { + String name=element.getProperty()!=null? element.getProperty().getName():element.getName(); + configuredPropertiesMap.put(name, element); + } + protected void removed(E element) { + String name=element.getProperty()!=null? element.getProperty().getName():element.getName(); + configuredPropertiesMap.remove(name); + } + } + + private List<ConfiguredProperty> configuredProperties = new ConfiguredPropertyList<ConfiguredProperty>(); + private Map<String, ConfiguredProperty> configuredPropertiesMap=new HashMap<String, ConfiguredProperty>(); + + private I implementation; + + public I getImplementation() { + return implementation; + } + + public void setImplementation(I value) { + checkNotFrozen(); + implementation = value; + } + + public List<ConfiguredService> getConfiguredServices() { + return configuredServices; + } + + public ConfiguredService getConfiguredService(String name) { + return configuredServicesMap.get(name); + } + + public List<ConfiguredReference> getConfiguredReferences() { + return configuredReferences; + } + + public ConfiguredReference getConfiguredReference(String name) { + return configuredReferencesMap.get(name); + } + + public List<ConfiguredProperty> getConfiguredProperties() { + return configuredProperties; + } + + public ConfiguredProperty getConfiguredProperty(String name) { + return configuredPropertiesMap.get(name); + } + + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) + return; + super.initialize(modelContext); + + // Initialize the implementation + if (implementation == null) { + throw new AssemblyInitializationException("No implementation for component [" + getName() + ']'); + } + implementation.initialize(modelContext); + + // Derive the configured services from the component implementation + ComponentType componentType=implementation.getComponentType(); + AssemblyFactory factory = modelContext.getAssemblyFactory(); + for (Service service : componentType.getServices()) { + ConfiguredService configuredService = factory.createConfiguredService(); + configuredService.setPort(service); + configuredServices.add(configuredService); + configuredService.initialize(modelContext); + } + + // Derive the configured references from the references on the component info + for (Reference reference : componentType.getReferences()) { + ConfiguredReference configuredReference = configuredReferencesMap.get(reference.getName()); + if (configuredReference==null) { + configuredReference=factory.createConfiguredReference(); + configuredReference.setPort(reference); + configuredReferences.add(configuredReference); + configuredReference.initialize(modelContext); + } else { + configuredReference.setPort(reference); + configuredReference.initialize(modelContext); + } + } + for (ConfiguredReference configuredReference : configuredReferences) { + if (configuredReference.getPort()==null) { + throw new AssemblyInitializationException("Undefined reference ["+configuredReference.getName()+"]"); + } + } + + // Derive the configured properties from the properties on the component info + for (Property property : componentType.getProperties()) { + ConfiguredProperty configuredProperty = configuredPropertiesMap.get(property.getName()); + if (configuredProperty != null) { + configuredProperty.setProperty(property); + configuredProperty.initialize(modelContext); + } + } + for (ConfiguredProperty configuredProperty : configuredProperties) { + if (configuredProperty.getProperty()==null) { + throw new AssemblyInitializationException("Undefined property ["+configuredProperty.getName()+"]"); + } + } + + } + + public void freeze() { + if (isFrozen()) + return; + super.freeze(); + + // Freeze configured services, references and properties + configuredServices = freeze(configuredServices); + configuredReferences = freeze(configuredReferences); + configuredProperties = freeze(configuredProperties); + if (implementation != null) + implementation.freeze(); + } + + public boolean accept(AssemblyVisitor visitor) { + if (!super.accept(visitor)) + return false; + + if (!accept(configuredServices, visitor)) + return false; + if (!accept(configuredReferences, visitor)) + return false; + if (!accept(configuredProperties, visitor)) + return false; + if (implementation != null) { + if (!implementation.accept(visitor)) + return false; + } + + return true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ComponentTypeImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ComponentTypeImpl.java new file mode 100644 index 0000000000..617206b6af --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ComponentTypeImpl.java @@ -0,0 +1,147 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyVisitor; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Port; +import org.apache.tuscany.model.assembly.Property; +import org.apache.tuscany.model.assembly.Reference; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.util.NotifyingList; + +/** + * An implementation of ComponentType. + */ +public class ComponentTypeImpl extends ExtensibleImpl implements ComponentType { + + /** + * A list of ports synchronized with a map + */ + private class PortList<E extends Port> extends NotifyingList<E>{ + + Map<String, E> map; + + private PortList(Map<String, E> map) { + this.map=map; + } + + protected void added(E element) { + map.put(element.getName(), element); + } + protected void removed(E element) { + map.remove(element.getName()); + } + } + + private Map<String, Reference> referencesMap=new HashMap<String, Reference>(); + private List<Reference> references=new PortList<Reference>(referencesMap); + + private Map<String, Service> servicesMap=new HashMap<String, Service>(); + private List<Service> services=new PortList<Service>(servicesMap); + + /** + * A list of properties synchronized with a map + */ + private class PropertyList<E extends Property> extends NotifyingList<E>{ + + protected void added(E element) { + propertiesMap.put(element.getName(), element); + } + protected void removed(E element) { + propertiesMap.remove(element.getName()); + } + } + + private Map<String, Property> propertiesMap=new HashMap<String, Property>(); + private List<Property> properties=new PropertyList<Property>(); + + protected ComponentTypeImpl() { + } + + public List<Reference> getReferences() { + return references; + } + + public Reference getReference(String name) { + return referencesMap.get(name); + } + + public List<Service> getServices() { + return services; + } + + public Service getService(String name) { + return servicesMap.get(name); + } + + public List<Property> getProperties() { + return properties; + } + + public Property getProperty(String name) { + return propertiesMap.get(name); + } + + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) + return; + super.initialize(modelContext); + + // Initialize references, properties and services + for (Reference reference : references) { + reference.initialize(modelContext); + } + for (Property property : properties) { + property.initialize(modelContext); + } + for (Service service : services) { + service.initialize(modelContext); + } + } + + public void freeze() { + if (isFrozen()) + return; + super.freeze(); + + // Freeze lists of services, references and properties + services=freeze(services); + references=freeze(references); + properties=freeze(properties); + } + + public boolean accept(AssemblyVisitor visitor) { + if (!super.accept(visitor)) + return false; + + if (!accept(services, visitor)) + return false; + if (!accept(references, visitor)) + return false; + if (!accept(properties, visitor)) + return false; + + return true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/CompositeImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/CompositeImpl.java new file mode 100644 index 0000000000..fff32e3398 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/CompositeImpl.java @@ -0,0 +1,357 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.AssemblyVisitor; +import org.apache.tuscany.model.assembly.Component; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Composite; +import org.apache.tuscany.model.assembly.ConfiguredProperty; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.EntryPoint; +import org.apache.tuscany.model.assembly.ExternalService; +import org.apache.tuscany.model.assembly.Implementation; +import org.apache.tuscany.model.assembly.ImportWSDL; +import org.apache.tuscany.model.assembly.Multiplicity; +import org.apache.tuscany.model.assembly.OverrideOption; +import org.apache.tuscany.model.assembly.Part; +import org.apache.tuscany.model.assembly.Reference; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.ServiceContract; +import org.apache.tuscany.model.assembly.ServiceURI; +import org.apache.tuscany.model.assembly.Wire; +import org.apache.tuscany.model.util.NotifyingList; + +/** + * An implementation of Composite. + */ +public abstract class CompositeImpl extends ExtensibleImpl implements Composite { + + private String name; + private ComponentType componentType; + private Class<?> implementationClass; + + /** + * A list of parts synchronized with a map + */ + private class PartList<E extends Part> extends NotifyingList<E> { + protected void added(E element) { + partsMap.put(element.getName(), element); + element.setComposite(CompositeImpl.this); + } + + protected void removed(E element) { + partsMap.remove(element.getName()); + element.setComposite(null); + } + } + + private Map<String, Part> partsMap = new HashMap<String, Part>(); + + private List<Component> components = new PartList<Component>(); + private List<EntryPoint> entryPoints = new PartList<EntryPoint>(); + private List<ExternalService> externalServices = new PartList<ExternalService>(); + + private List<Wire> wires = new ArrayList<Wire>(); + + /** + * A list of WSDL imports synchronized with a map + */ + private class ImportWSDLList extends NotifyingList<ImportWSDL> { + protected void added(ImportWSDL element) { + List<ImportWSDL> importList = wsdlImportsMap.get(element.getNamespace()); + if (importList == null) { + importList = new ArrayList<ImportWSDL>(); + wsdlImportsMap.put(element.getNamespace(), importList); + } + importList.add(element); + } + + protected void removed(ImportWSDL element) { + List<ImportWSDL> importList = wsdlImportsMap.get(element.getNamespace()); + if (importList != null) { + importList.remove(element); + if (importList.isEmpty()) + wsdlImportsMap.remove(element.getNamespace()); + } + } + } + + private Map<String, List<ImportWSDL>> wsdlImportsMap = new HashMap<String, List<ImportWSDL>>(); + + private List<ImportWSDL> wsdlImports = new ImportWSDLList(); + + protected CompositeImpl() { + } + + public String getName() { + return name; + } + + public void setName(String newName) { + checkNotFrozen(); + name = newName; + } + + public List<Component> getComponents() { + return components; + } + + public List<EntryPoint> getEntryPoints() { + return entryPoints; + } + + public List<ExternalService> getExternalServices() { + return externalServices; + } + + public Part getPart(String name) { + return partsMap.get(name); + } + + public List<Wire> getWires() { + return wires; + } + + public List<ImportWSDL> getWSDLImports() { + return wsdlImports; + } + + public List<ImportWSDL> getWSDLImports(String namespace) { + return wsdlImportsMap.get(namespace); + } + + public ComponentType getComponentType() { + return componentType; + } + + public void setComponentType(ComponentType componentType) { + checkNotFrozen(); + this.componentType = componentType; + } + + public ConfiguredService getConfiguredService(ServiceURI address) { + String partName = address.getPartName(); + String serviceName = address.getServiceName(); + Part part = getPart(partName); + if (part instanceof Component) { + Component<?> component = (Component<?>) part; + if (serviceName != null) { + return component.getConfiguredService(serviceName); + } else { + if (!component.getConfiguredServices().isEmpty()) { + return component.getConfiguredServices().get(0); + } else { + return null; + } + } + + } + if (part instanceof ExternalService) { + ExternalService externalService = (ExternalService) part; + return externalService.getConfiguredService(); + } else + return null; + } + + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) + return; + super.initialize(modelContext); + + // Initialize WSDL imports + for (ImportWSDL importWSDL : wsdlImports) { + importWSDL.initialize(modelContext); + } + + // Initialize parts + for (Part part : externalServices) { + part.initialize(modelContext); + } + for (Part part : components) { + part.initialize(modelContext); + } + for (Part part : entryPoints) { + part.initialize(modelContext); + } + + // Derive the component type from the entry points and external services in the composite + // Also derive properties from the overridable properties of the components in the composite + if (componentType == null) { + AssemblyFactory factory = modelContext.getAssemblyFactory(); + componentType = factory.createComponentType(); + for (EntryPoint entryPoint : getEntryPoints()) { + Service service = factory.createService(); + service.setName(entryPoint.getName()); + ServiceContract serviceContract = entryPoint.getConfiguredService().getPort().getServiceContract(); + if (serviceContract != null) + service.setServiceContract(serviceContract); + componentType.getServices().add(service); + + ConfiguredReference configuredReference = entryPoint.getConfiguredReference(); + ServiceURI sourceURI = factory.createServiceURI(null, entryPoint, configuredReference); + for (String target : configuredReference.getTargets()) { + ServiceURI targetURI = factory.createServiceURI(null, target); + Wire wire = factory.createWire(); + wire.setSource(sourceURI); + wire.setTarget(targetURI); + getWires().add(wire); + } + } + for (ExternalService externalService : getExternalServices()) { + if (externalService.getOverrideOption() == null || externalService.getOverrideOption() == OverrideOption.NO) + continue; + Reference reference = factory.createReference(); + reference.setName(externalService.getName()); + ServiceContract serviceContract = externalService.getConfiguredService().getPort().getServiceContract(); + if (serviceContract != null) + reference.setServiceContract(serviceContract); + componentType.getReferences().add(reference); + } + for (Component<Implementation> component : getComponents()) { + for (ConfiguredProperty configuredProperty : component.getConfiguredProperties()) { + if (configuredProperty.getOverrideOption() == null || configuredProperty.getOverrideOption() == OverrideOption.NO) + continue; + componentType.getProperties().add(configuredProperty.getProperty()); + } + + for (ConfiguredReference configuredReference : component.getConfiguredReferences()) { + // Create a wire + ServiceURI sourceURI = factory.createServiceURI(null, component, configuredReference); + for (String target : configuredReference.getTargets()) { + ServiceURI targetURI = factory.createServiceURI(null, target); + Wire wire = factory.createWire(); + wire.setSource(sourceURI); + wire.setTarget(targetURI); + getWires().add(wire); + } + } + } + } + componentType.initialize(modelContext); + + // Wire the parts in this composite + wire(modelContext); + } + + /** + * Wire the parts in this composite. + * @param modelContext + */ + protected void wire(AssemblyContext modelContext) { + for (Wire wire : getWires()) { + + // Get the source reference + ServiceURI sourceURI = wire.getSource(); + ConfiguredReference configuredReference = null; + String partName = sourceURI.getPartName(); + String referenceName = sourceURI.getServiceName(); + if (referenceName != null) { + //Component<?> component = (Component<?>)getPart(partName); +// if (component != null) { + Part part = getPart(partName); + if (part instanceof Component) { + configuredReference = ((Component) part).getConfiguredReference(referenceName); + } else if (part instanceof EntryPoint) { + configuredReference = ((EntryPoint) part).getConfiguredReference(); + } + } else { + EntryPoint entryPoint = (EntryPoint) getPart(partName); + if (entryPoint != null) { + configuredReference = entryPoint.getConfiguredReference(); + } + } + if (configuredReference == null) { + throw new IllegalArgumentException("Cannot find wire source " + sourceURI.getPath()); + } else { + + // Resolve the target service endpoint + ServiceURI targetURI = wire.getTarget(); + ConfiguredService configuredService = getConfiguredService(targetURI); + if (configuredService != null) { + + // Wire the reference to the target + Multiplicity multiplicity = configuredReference.getPort().getMultiplicity(); + if (multiplicity == Multiplicity.ZERO_N || multiplicity == Multiplicity.ONE_N) { + configuredReference.getTargetConfiguredServices().add(configuredService); + } else { + configuredReference.getTargetConfiguredServices().clear(); + configuredReference.getTargetConfiguredServices().add(configuredService); + } + } else { + throw new IllegalArgumentException("Cannot find service '" + targetURI.getPath() +"'."); + } + } + } + } + + public Class<?> getImplementationClass() { + return implementationClass; + } + + public void setImplementationClass(Class<?> clazz) { + checkNotFrozen(); + this.implementationClass = clazz; + } + + public void freeze() { + if (isFrozen()) + return; + super.freeze(); + + // Freeze component type + if (componentType != null) + componentType.freeze(); + + // Freeze lists + wsdlImports = freeze(wsdlImports); + components = freeze(components); + entryPoints = freeze(entryPoints); + externalServices = freeze(externalServices); + wires = freeze(wires); + } + + public boolean accept(AssemblyVisitor visitor) { + if (!super.accept(visitor)) + return false; + + if (!accept(wsdlImports, visitor)) + return false; + + if (!accept(partsMap.values(), visitor)) + return false; + + if (!accept(wires, visitor)) + return false; + + if (componentType != null) { + if (!componentType.accept(visitor)) + return false; + } + + return true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ConfiguredPortImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ConfiguredPortImpl.java new file mode 100644 index 0000000000..f1007e8c07 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ConfiguredPortImpl.java @@ -0,0 +1,106 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.Part; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyVisitor; +import org.apache.tuscany.model.assembly.ConfiguredPort; +import org.apache.tuscany.model.assembly.Port; + +/** + * Implementation of ConfiguredPort. + */ +public abstract class ConfiguredPortImpl<P extends Port> extends AssemblyObjectImpl implements ConfiguredPort<P> { + private String name; + private Part part; + private P port; + + private Object proxyFactory; + + protected ConfiguredPortImpl() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + checkNotFrozen(); + this.name=name; + } + + public P getPort() { + return port; + } + + public void setPort(P port) { + checkNotFrozen(); + this.port = port; + } + + public Part getPart() { + return part; + } + + public void setPart(Part part) { + checkNotFrozen(); + this.part=part; + } + + public Object getProxyFactory() { + return proxyFactory; + } + + public void setProxyFactory(Object proxyFactory) { + checkNotFrozen(); + this.proxyFactory = proxyFactory; + } + + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) + return; + super.initialize(modelContext); + + if (port!=null) { + name=port.getName(); + port.initialize(modelContext); + } + } + + public void freeze() { + if (isFrozen()) + return; + super.freeze(); + + if (port!=null) + port.freeze(); + } + + public boolean accept(AssemblyVisitor visitor) { + if (!super.accept(visitor)) + return false; + + if (port!=null) { + if (!port.accept(visitor)) + return false; + } + + return true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ConfiguredPropertyImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ConfiguredPropertyImpl.java new file mode 100644 index 0000000000..4c64676451 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ConfiguredPropertyImpl.java @@ -0,0 +1,102 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyVisitor; +import org.apache.tuscany.model.assembly.ConfiguredProperty; +import org.apache.tuscany.model.assembly.OverrideOption; +import org.apache.tuscany.model.assembly.Property; + +/** + * Implementation of ConfiguredProperty + */ +public class ConfiguredPropertyImpl extends AssemblyObjectImpl implements ConfiguredProperty { + private String name; + private OverrideOption overrideOption; + private Object value; + private Property property; + + protected ConfiguredPropertyImpl() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Property getProperty() { + return property; + } + + public void setProperty(Property property) { + checkNotFrozen(); + this.property = property; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + checkNotFrozen(); + this.value = value; + } + + public OverrideOption getOverrideOption() { + return overrideOption; + } + + public void setOverrideOption(OverrideOption value) { + checkNotFrozen(); + this.overrideOption=value; + } + + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) + return; + super.initialize(modelContext); + + if (property!=null) + property.initialize(modelContext); + } + + public void freeze() { + if (isFrozen()) + return; + super.freeze(); + + if (property!=null) + property.freeze(); + } + + public boolean accept(AssemblyVisitor visitor) { + if (!super.accept(visitor)) + return false; + + if (property!=null) { + if (!property.accept(visitor)) + return false; + } + + return true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ConfiguredReferenceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ConfiguredReferenceImpl.java new file mode 100644 index 0000000000..f21a5be52e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ConfiguredReferenceImpl.java @@ -0,0 +1,53 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.Reference; + +/** + * An implementation of ConfiguredReference. + */ +public class ConfiguredReferenceImpl extends ConfiguredPortImpl<Reference> implements ConfiguredReference { + + private List<String> targets = new ArrayList<String>(); + + private List<ConfiguredService> targetConfiguredServices = new ArrayList<ConfiguredService>(); + + protected ConfiguredReferenceImpl() { + } + + public List<String> getTargets() { + return targets; + } + + public List<ConfiguredService> getTargetConfiguredServices() { + return targetConfiguredServices; + } + + public void freeze() { + super.freeze(); + + targetConfiguredServices = freeze(targetConfiguredServices); + targets = freeze(targets); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ConfiguredServiceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ConfiguredServiceImpl.java new file mode 100644 index 0000000000..923af1882c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ConfiguredServiceImpl.java @@ -0,0 +1,30 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.Service; + +/** + * An implementation of ConfiguredService. + */ +public class ConfiguredServiceImpl extends ConfiguredPortImpl<Service> implements ConfiguredService { + + protected ConfiguredServiceImpl() { + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/EntryPointImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/EntryPointImpl.java new file mode 100644 index 0000000000..a894a7c48f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/EntryPointImpl.java @@ -0,0 +1,116 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyVisitor; +import org.apache.tuscany.model.assembly.Binding; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.EntryPoint; + +/** + * An implementation of EntryPoint. + */ +public class EntryPointImpl extends PartImpl implements EntryPoint { + + private ConfiguredService configuredService; + private ConfiguredReference configuredReference; + private List<Binding> bindings=new ArrayList<Binding>(); + + protected EntryPointImpl() { + } + + public ConfiguredReference getConfiguredReference() { + return configuredReference; + } + + public void setConfiguredReference(ConfiguredReference configuredReference) { + checkNotFrozen(); + configuredReference.setPart(this); + this.configuredReference=configuredReference; + } + + public ConfiguredService getConfiguredService() { + return configuredService; + } + + public void setConfiguredService(ConfiguredService configuredService) { + checkNotFrozen(); + configuredService.setPart(this); + this.configuredService=configuredService; + } + + public List<Binding> getBindings() { + return bindings; + } + + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) + return; + super.initialize(modelContext); + + // Initialize the service contract and reference to the published service + if (configuredReference != null) { + configuredReference.initialize(modelContext); + } + if (configuredService != null) { + configuredService.initialize(modelContext); + } + + // Initialize the bindings + initialize(bindings, modelContext); + } + + public void freeze() { + if (isFrozen()) + return; + super.freeze(); + + // Freeze the service contract and configured reference + if (configuredReference != null) + configuredReference.freeze(); + if (configuredService != null) + configuredService.freeze(); + + // Freeze the bindings + bindings=freeze(bindings); + } + + public boolean accept(AssemblyVisitor visitor) { + if (!super.accept(visitor)) + return false; + + if (configuredReference!=null) { + if (!configuredReference.accept(visitor)) + return false; + } + + if (configuredService!=null) { + if (!configuredService.accept(visitor)) + return false; + } + + if (!accept(bindings, visitor)) + return false; + + return true; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ExtensibleImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ExtensibleImpl.java new file mode 100644 index 0000000000..6adf66dc9e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ExtensibleImpl.java @@ -0,0 +1,75 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyVisitor; +import org.apache.tuscany.model.assembly.Extensible; + +/** + * An implementation of Extensible. + */ +public abstract class ExtensibleImpl extends AssemblyObjectImpl implements Extensible { + + private List<Object> extensibilityElements = new ArrayList<Object>(); + private List<Object> extensibilityAttributes = new ArrayList<Object>(); + + protected ExtensibleImpl() { + } + + public List<Object> getExtensibilityElements() { + return extensibilityElements; + } + + public List<Object> getExtensibilityAttributes() { + return extensibilityAttributes; + } + + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) + return; + super.initialize(modelContext); + + // Initialize extensibility elements and attributes + initialize(extensibilityElements, modelContext); + initialize(extensibilityAttributes, modelContext); + } + + public void freeze() { + if (isFrozen()) + return; + super.freeze(); + + // Freeze extensibility elements and attributes + freeze(extensibilityElements); + freeze(extensibilityAttributes); + } + + public boolean accept(AssemblyVisitor visitor) { + if (!super.accept(visitor)) + return false; + + if (!accept(extensibilityElements, visitor)) + return false; + return accept(extensibilityAttributes, visitor); + + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ExternalServiceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ExternalServiceImpl.java new file mode 100644 index 0000000000..9110731c34 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ExternalServiceImpl.java @@ -0,0 +1,116 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyVisitor; +import org.apache.tuscany.model.assembly.Binding; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.ExternalService; +import org.apache.tuscany.model.assembly.OverrideOption; + +/** + * An implementation ExternalService. + */ +public class ExternalServiceImpl extends PartImpl implements ExternalService { + + private ConfiguredService configuredService; + private OverrideOption overrideOption; + private List<Binding> bindings=new ArrayList<Binding>(); + + private Object contextFactory; + + protected ExternalServiceImpl() { + } + + public OverrideOption getOverrideOption() { + return overrideOption; + } + + public void setOverrideOption(OverrideOption newOverridable) { + checkNotFrozen(); + overrideOption=newOverridable; + } + + public List<Binding> getBindings() { + return bindings; + } + + public ConfiguredService getConfiguredService() { + return configuredService; + } + + public void setConfiguredService(ConfiguredService configuredService) { + checkNotFrozen(); + configuredService.setPart(this); + this.configuredService=configuredService; + } + + public Object getContextFactory() { + return contextFactory; + } + + public void setContextFactory(Object contextFactory) { + this.contextFactory=contextFactory; + } + + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) + return; + super.initialize(modelContext); + + // Initialize the configured service + if (configuredService != null) { + configuredService.initialize(modelContext); + } + + // Initialize the bindings + initialize(bindings, modelContext); + } + + public void freeze() { + if (isFrozen()) + return; + super.freeze(); + + // Freeze the configured service + if (configuredService!= null) + configuredService.freeze(); + + // Freeze the bindings + bindings=freeze(bindings); + } + + public boolean accept(AssemblyVisitor visitor) { + if (!super.accept(visitor)) + return false; + + if (configuredService!=null) { + if (!configuredService.accept(visitor)) + return false; + } + + if (!accept(bindings, visitor)) + return false; + + return true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ImplementationImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ImplementationImpl.java new file mode 100644 index 0000000000..a44d80cc66 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ImplementationImpl.java @@ -0,0 +1,72 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyVisitor; +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Implementation; + +/** + * An implementation of Implementation. + */ +public abstract class ImplementationImpl extends ExtensibleImpl implements Implementation { + + private ComponentType componentType; + + public ComponentType getComponentType() { + return componentType; + } + + public void setComponentType(ComponentType componentType) { + checkNotFrozen(); + this.componentType=componentType; + } + + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) + return; + super.initialize(modelContext); + + // Initialize the component type + if (componentType!=null) { + componentType.initialize(modelContext); + } + + } + + public void freeze() { + if (isFrozen()) + return; + super.freeze(); + + if (componentType!=null) + componentType.freeze(); + } + + public boolean accept(AssemblyVisitor visitor) { + if (!super.accept(visitor)) + return false; + + if (componentType!=null) { + if (!componentType.accept(visitor)) + return false; + } + return true; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ImportWSDLImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ImportWSDLImpl.java new file mode 100644 index 0000000000..56aedd18f5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ImportWSDLImpl.java @@ -0,0 +1,82 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.model.assembly.impl; + +import java.net.URL; + +import javax.wsdl.Definition; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.ImportWSDL; + +/** + * Implementation of ImportWSDL. + * + * @version $Rev$ $Date$ + */ +public class ImportWSDLImpl extends AssemblyObjectImpl implements ImportWSDL { + private String location; + private String namespace; + private Definition definition; + + protected ImportWSDLImpl() { + } + + public String getLocation() { + return location; + } + + public void setLocation(String uri) { + checkNotFrozen(); + this.location = uri; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String uri) { + checkNotFrozen(); + this.namespace = uri; + } + + public Definition getDefinition() { + return definition; + } + + public void setDefinition(Definition definition) { + checkNotFrozen(); + this.definition = definition; + } + + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) + return; + super.initialize(modelContext); + + // Load the WSDL definition if necessary + ResourceLoader resourceLoader = modelContext.getApplicationResourceLoader(); + if (definition == null) { + URL url = resourceLoader.getResource(location); + if (url == null) + throw new IllegalArgumentException("Cannot find " + location); + definition = modelContext.getAssemblyLoader().loadDefinition(url.toString()); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleComponentImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleComponentImpl.java new file mode 100644 index 0000000000..60cb42a981 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleComponentImpl.java @@ -0,0 +1,41 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.ModuleComponent; + +/** + * An implementation of ModuleComponent. + */ +public class ModuleComponentImpl extends ComponentImpl<Module> implements ModuleComponent { + + private String uri; + + protected ModuleComponentImpl() { + } + + public String getURI() { + return uri; + } + + public void setURI(String value) { + checkNotFrozen(); + uri=value; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleFragmentImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleFragmentImpl.java new file mode 100644 index 0000000000..08536d23b8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleFragmentImpl.java @@ -0,0 +1,35 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.ModuleFragment; + +/** + * An implementation of ModuleFragment. + */ +public class ModuleFragmentImpl extends CompositeImpl implements ModuleFragment { + + protected ModuleFragmentImpl() { + } + + protected void wire(AssemblyContext modelContext) { + // No wiring inside a module fragment + // Wires are handled at the module level + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleImpl.java new file mode 100644 index 0000000000..f64317ac86 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleImpl.java @@ -0,0 +1,104 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyVisitor; +import org.apache.tuscany.model.assembly.Module; +import org.apache.tuscany.model.assembly.ModuleFragment; +import org.apache.tuscany.model.util.NotifyingList; + +/** + * An implementation of Module. + */ +public class ModuleImpl extends CompositeImpl implements Module { + + /** + * A list of module fragments synchronized with a map + */ + private class ModuleFragmentList<E extends ModuleFragment> extends NotifyingList<E> { + protected void added(E element) { + moduleFragmentsMap.put(element.getName(), element); + } + + protected void removed(E element) { + moduleFragmentsMap.remove(element.getName()); + } + } + + private List<ModuleFragment> moduleFragments = new ModuleFragmentList<ModuleFragment>(); + private Map<String, ModuleFragment> moduleFragmentsMap = new HashMap<String, ModuleFragment>(); + + /** + * Constructor + */ + protected ModuleImpl() { + } + + public List<ModuleFragment> getModuleFragments() { + return moduleFragments; + } + + public ModuleFragment getModuleFragment(String name) { + checkInitialized(); + return moduleFragmentsMap.get(name); + } + + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) + return; + + // Initialize module fragments + for (ModuleFragment moduleFragment : moduleFragments) { + + // Add all WSDL imports, components, entry points and external services from the module fragments + getWSDLImports().addAll(moduleFragment.getWSDLImports()); + getComponents().addAll(moduleFragment.getComponents()); + getEntryPoints().addAll(moduleFragment.getEntryPoints()); + getExternalServices().addAll(moduleFragment.getExternalServices()); + + // Add all the wires from the module fragments + getWires().addAll(moduleFragment.getWires()); + + moduleFragment.initialize(modelContext); + } + + // Initialize the composite + super.initialize(modelContext); + } + + public void freeze() { + if (isFrozen()) + return; + super.freeze(); + + moduleFragments = freeze(moduleFragments); + } + + public boolean accept(AssemblyVisitor visitor) { + if (!super.accept(visitor)) + return false; + + return accept(moduleFragments, visitor); + + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/PartImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/PartImpl.java new file mode 100644 index 0000000000..3743c7505b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/PartImpl.java @@ -0,0 +1,61 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.Composite; +import org.apache.tuscany.model.assembly.Part; + +/** + * Implementation of Part. + */ +public abstract class PartImpl extends ExtensibleImpl implements Part { + private Composite composite; + private String name; + + private Object contextFactory; + + protected PartImpl() { + } + + public String getName() { + return name; + } + + public void setName(String value) { + checkNotFrozen(); + name=value; + } + + public Composite getComposite() { + return composite; + } + + public void setComposite(Composite composite) { + checkNotFrozen(); + this.composite=composite; + } + + public Object getContextFactory() { + return contextFactory; + } + + public void setContextFactory(Object contextFactory) { + checkNotFrozen(); + this.contextFactory=contextFactory; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/PortImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/PortImpl.java new file mode 100644 index 0000000000..c11cee590a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/PortImpl.java @@ -0,0 +1,82 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyVisitor; +import org.apache.tuscany.model.assembly.Port; +import org.apache.tuscany.model.assembly.ServiceContract; + +/** + * An implementation of Port. + */ +public abstract class PortImpl extends AssemblyObjectImpl implements Port { + + private ServiceContract serviceContract; + private String name; + + protected PortImpl() { + } + + public String getName() { + return name; + } + + public void setName(String value) { + checkNotFrozen(); + name=value; + } + + public ServiceContract getServiceContract() { + return serviceContract; + } + + public void setServiceContract(ServiceContract value) { + checkNotFrozen(); + serviceContract=value; + } + + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) + return; + super.initialize(modelContext); + + if (serviceContract!=null) + serviceContract.initialize(modelContext); + } + + public void freeze() { + if (isFrozen()) + return; + super.freeze(); + + if (serviceContract!=null) + serviceContract.freeze(); + } + + public boolean accept(AssemblyVisitor visitor) { + if (!super.accept(visitor)) + return false; + + if (serviceContract!=null) { + if (!serviceContract.accept(visitor)) + return false; + } + + return true; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/PropertyImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/PropertyImpl.java new file mode 100644 index 0000000000..e91245504b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/PropertyImpl.java @@ -0,0 +1,80 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.Property; + +/** + * An implementation of Property. + */ +public class PropertyImpl extends ExtensibleImpl implements Property { + + private Object defaultValue; + private String name; + private boolean many; + private boolean required; + private Class<?> type; + + protected PropertyImpl() { + } + + public Object getDefaultValue() { + return defaultValue; + } + + public String getName() { + return name; + } + + public Class<?> getType() { + return type; + } + + public boolean isMany() { + return many; + } + + public boolean isRequired() { + return required; + } + + public void setDefaultValue(Object value) { + checkNotFrozen(); + defaultValue = value; + } + + public void setMany(boolean value) { + checkNotFrozen(); + many = value; + } + + public void setName(String value) { + checkNotFrozen(); + name = value; + } + + public void setRequired(boolean value) { + checkNotFrozen(); + required = value; + } + + public void setType(Class<?> value) { + checkNotFrozen(); + type = value; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ReferenceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ReferenceImpl.java new file mode 100644 index 0000000000..1a064e5092 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ReferenceImpl.java @@ -0,0 +1,41 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.Multiplicity; +import org.apache.tuscany.model.assembly.Reference; + +/** + * An implementation of Reference. + */ +public class ReferenceImpl extends PortImpl implements Reference { + + private Multiplicity multiplicity; + + protected ReferenceImpl() { + } + + public Multiplicity getMultiplicity() { + return multiplicity; + } + + public void setMultiplicity(Multiplicity multiplicity) { + checkNotFrozen(); + this.multiplicity=multiplicity; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ServiceContractImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ServiceContractImpl.java new file mode 100644 index 0000000000..f71702792b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ServiceContractImpl.java @@ -0,0 +1,60 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.Scope; +import org.apache.tuscany.model.assembly.ServiceContract; + +/** + * An implementation of ServiceContract. + */ +public class ServiceContractImpl extends ExtensibleImpl implements ServiceContract { + + private Class interface_; + private Class callbackInterface; + private Scope scope; + + protected ServiceContractImpl() { + } + + public Class getCallbackInterface() { + return callbackInterface; + } + + public Class getInterface() { + return interface_; + } + + public Scope getScope() { + return scope; + } + + public void setCallbackInterface(Class value) { + checkNotFrozen(); + callbackInterface=value; + } + + public void setInterface(Class value) { + checkNotFrozen(); + interface_=value; + } + + public void setScope(Scope scope) { + checkNotFrozen(); + this.scope=scope; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ServiceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ServiceImpl.java new file mode 100644 index 0000000000..d1432d0149 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ServiceImpl.java @@ -0,0 +1,29 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.Service; + +/** + * An implementation of Service. + */ +public class ServiceImpl extends PortImpl implements Service { + + protected ServiceImpl() { + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ServiceURIImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ServiceURIImpl.java new file mode 100644 index 0000000000..ef180814ff --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ServiceURIImpl.java @@ -0,0 +1,210 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.ConfiguredPort; +import org.apache.tuscany.model.assembly.ConfiguredReference; +import org.apache.tuscany.model.assembly.ConfiguredService; +import org.apache.tuscany.model.assembly.ModuleComponent; +import org.apache.tuscany.model.assembly.Part; +import org.apache.tuscany.model.assembly.Service; +import org.apache.tuscany.model.assembly.ServiceURI; + +/** + * An implementation of ServiceURI. + */ +public class ServiceURIImpl implements ServiceURI { + + private String address; + private Boolean isSCAScheme; + private boolean isParsed; + private String moduleComponentName; + private String partName; + private String serviceName; + + /** + * Constructs a new ServiceURIImpl. + * @param address + */ + protected ServiceURIImpl(String address) { + this.address = address; + } + + /** + * Constructs a new ServiceURIImpl. + * @param moduleComponent + * @param partName + * @param portName + */ + protected ServiceURIImpl(ModuleComponent moduleComponent, String partName, String portName) { + if (moduleComponent != null) + moduleComponentName = moduleComponent.getName(); + else + moduleComponentName = ""; + this.partName = partName; + this.serviceName = portName; + } + + /** + * Constructs a new ServiceURIImpl. + * @param moduleComponent + * @param configuredPort + */ + protected ServiceURIImpl(ModuleComponent moduleComponent, Part part, ConfiguredPort configuredPort) { + if (moduleComponent != null) + moduleComponentName = moduleComponent.getName(); + else + moduleComponentName = ""; + if (configuredPort instanceof ConfiguredService) { + partName = part.getName(); + ConfiguredService configuredService = (ConfiguredService) configuredPort; + Service service = configuredService.getPort(); + if (service != null) { + serviceName = configuredService.getPort().getName(); + address = "sca:///" + moduleComponentName + '/' + partName + '/' + serviceName; + } else { + address = "sca:///" + moduleComponentName + '/' + partName; + } + + } else if (configuredPort instanceof ConfiguredReference) { + ConfiguredReference configuredReference = (ConfiguredReference) configuredPort; + partName = part.getName(); + serviceName = configuredReference.getPort().getName(); + if (serviceName!=null) + address = "sca:///" + moduleComponentName + '/' + partName + '/' + serviceName; + else + address = "sca:///" + moduleComponentName + '/' + partName; + } + + isSCAScheme = Boolean.TRUE; + isParsed = true; + } + + /** + * Constructor + * + * @param moduleComponent + * @param targetServiceName + */ + protected ServiceURIImpl(ModuleComponent moduleComponent, String targetServiceName) { + if (moduleComponent != null) + moduleComponentName = moduleComponent.getName(); + else + moduleComponentName = ""; + int s = targetServiceName.indexOf('/'); + if (s == -1) { + partName = targetServiceName; + address = "sca:///" + moduleComponentName + '/' + partName; + } else { + partName = targetServiceName.substring(0, s); + this.serviceName = targetServiceName.substring(s + 1); + address = "sca:///" + moduleComponentName + '/' + partName + '/' + this.serviceName; + } + isSCAScheme = Boolean.TRUE; + isParsed = true; + } + + public boolean isSCAScheme() { + if (isSCAScheme == null) { + if (address != null && address.startsWith("sca://")) { + isSCAScheme = Boolean.TRUE; + } else { + isSCAScheme = Boolean.FALSE; + } + } + return isSCAScheme.booleanValue(); + } + + public String getAddress() { + return address; + } + + public String getPath() { + StringBuffer path = new StringBuffer(); + String mc = getModuleComponentName(); + if (mc != null) { + path.append(mc); + } + String p = getPartName(); + if (p !=null) { + if (path.length()!=0) + path.append('/'); + path.append(p); + } + String s = getServiceName(); + if (s !=null) { + if (path.length()!=0) + path.append('/'); + path.append(s); + } + return path.toString(); + } + + /** + * Parse the address. + */ + private void parse() { + isParsed = true; + if (isSCAScheme()) { + int s1 = address.indexOf('/', 6); + if (s1 == -1) + return; + s1++; + int s2 = address.indexOf('/', s1); + if (s2 == -1) + return; + moduleComponentName = address.substring(s1, s2); + s2++; + int s3 = address.indexOf('/', s2); + if (s3 == -1) { + partName = address.substring(s2); + return; + } + partName = address.substring(s2, s3); + s3++; + serviceName = address.substring(s3); + } + } + + /** + * Returns the module component name + */ + public String getModuleComponentName() { + if (!isParsed) + parse(); + return moduleComponentName; + } + + /** + * Returns the part name + */ + public String getPartName() { + if (!isParsed) + parse(); + return partName; + } + + /** + * Returns the service name + */ + public String getServiceName() { + if (!isParsed) + parse(); + return serviceName; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/SubsystemImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/SubsystemImpl.java new file mode 100644 index 0000000000..334e34ba5b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/SubsystemImpl.java @@ -0,0 +1,51 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.ComponentType; +import org.apache.tuscany.model.assembly.Subsystem; + +/** + * An implementation of Subsystem. + */ +public class SubsystemImpl extends CompositeImpl implements Subsystem { + + private String uri; + + protected SubsystemImpl() { + } + + public String getURI() { + return uri; + } + + public void setURI(String value) { + checkNotFrozen(); + uri=value; + } + + public ComponentType getComponentType() { + //TODO implement + return null; + } + + public void setComponentType(ComponentType componentType) { + } + + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/WireImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/WireImpl.java new file mode 100644 index 0000000000..c7c4bda7a1 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/WireImpl.java @@ -0,0 +1,51 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.impl; + +import org.apache.tuscany.model.assembly.ServiceURI; +import org.apache.tuscany.model.assembly.Wire; + +/** + * An implementation of Wire. + */ +public class WireImpl extends ExtensibleImpl implements Wire { + + private ServiceURI source; + private ServiceURI target; + + protected WireImpl() { + } + + public ServiceURI getSource() { + return source; + } + + public void setSource(ServiceURI uri) { + checkNotFrozen(); + source=uri; + } + + public ServiceURI getTarget() { + return target; + } + + public void setTarget(ServiceURI uri) { + checkNotFrozen(); + target=uri; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/loader/AssemblyModelLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/loader/AssemblyModelLoader.java new file mode 100644 index 0000000000..95793cc439 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/loader/AssemblyModelLoader.java @@ -0,0 +1,38 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.loader; + +import java.util.List; + +import javax.wsdl.Definition; + +/** + * An assembly model loader. + */ +public interface AssemblyModelLoader { + + /** + * Load a WSDL definition + */ + Definition loadDefinition(String uri); + + /** + * Load definitions by namespace + */ + List<Definition> loadDefinitions(String namespace); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/AssemblyModelLoadException.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/AssemblyModelLoadException.java new file mode 100644 index 0000000000..6c5e0ef75d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/AssemblyModelLoadException.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.scdl.loader.impl; + +import org.apache.tuscany.common.TuscanyRuntimeException; + +/** + * The root runtime exception for the model loader. + * + * @version $Rev$ $Date$ + */ +public class AssemblyModelLoadException extends TuscanyRuntimeException { + private static final long serialVersionUID = -5891723952359470362L; + + public AssemblyModelLoadException() { + super(); + } + + public AssemblyModelLoadException(String message) { + super(message); + } + + public AssemblyModelLoadException(String message, Throwable cause) { + super(message, cause); + } + + public AssemblyModelLoadException(Throwable cause) { + super(cause); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLAssemblyModelLoaderImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLAssemblyModelLoaderImpl.java new file mode 100644 index 0000000000..8413350e50 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLAssemblyModelLoaderImpl.java @@ -0,0 +1,71 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.scdl.loader.impl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.wsdl.Definition; +import javax.wsdl.WSDLException; +import javax.wsdl.factory.WSDLFactory; +import javax.wsdl.xml.WSDLReader; + +import org.apache.tuscany.model.assembly.loader.AssemblyModelLoader; + +/** + */ +public class SCDLAssemblyModelLoaderImpl implements AssemblyModelLoader { + private WSDLReader wsdlReader; + private Map<String, Definition> definitions=new HashMap<String, Definition>(); + private Map<String, List<Definition>> definitionsByNamespace=new HashMap<String, List<Definition>>(); + + public Definition loadDefinition(String uri) { + Definition definition=definitions.get(uri); + if (definition!=null) + return definition; + + try { + if (wsdlReader==null) { + wsdlReader=WSDLFactory.newInstance().newWSDLReader(); + wsdlReader.setFeature("javax.wsdl.verbose", false); + } + definition = wsdlReader.readWSDL(uri); + } catch (WSDLException e) { + throw new IllegalArgumentException(e); + } + if (definition==null) + throw new IllegalArgumentException("Could not load WSDL definition at "+uri); + + definitions.put(uri, definition); + + String namespace=definition.getTargetNamespace(); + List<Definition> list=definitionsByNamespace.get(namespace); + if (list==null) { + list=new ArrayList<Definition>(); + definitionsByNamespace.put(namespace, list); + } + list.add(definition); + + return definition; + } + + public List<Definition> loadDefinitions(String namespace) { + return definitionsByNamespace.get(namespace); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/types/java/JavaServiceContract.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/types/java/JavaServiceContract.java new file mode 100644 index 0000000000..68f9dfa6f8 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/types/java/JavaServiceContract.java @@ -0,0 +1,34 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.types.java; + +import org.apache.tuscany.model.assembly.ServiceContract; + + +/** + * Represents a Java service contract. + */ +public interface JavaServiceContract extends ServiceContract { + + String getInterfaceName(); + + void setInterfaceName(String interfaceName); + + String getCallbackInterfaceName(); + + void setCallbackInterfaceName(String callbackInterfaceName); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/types/java/impl/JavaServiceContractImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/types/java/impl/JavaServiceContractImpl.java new file mode 100644 index 0000000000..d384bcd670 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/types/java/impl/JavaServiceContractImpl.java @@ -0,0 +1,89 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.types.java.impl; + +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.impl.ServiceContractImpl; +import org.apache.tuscany.model.types.java.JavaServiceContract; + +/** + * An implementation of JavaServiceContract. + */ +public class JavaServiceContractImpl extends ServiceContractImpl implements JavaServiceContract { + + private String interfaceName; + private String callbackInterfaceName; + + /** + * Constructor + */ + public JavaServiceContractImpl() { + } + + /** + * @param interfaceName The interfaceName to set. + */ + public void setInterfaceName(String interfaceName) { + this.interfaceName = interfaceName; + } + + /** + * @param callbackInterfaceName The callbackInterfaceName to set. + */ + public void setCallbackInterfaceName(String callbackInterfaceName) { + this.callbackInterfaceName = callbackInterfaceName; + } + + public String getInterfaceName() { + return interfaceName; + } + + public String getCallbackInterfaceName() { + return callbackInterfaceName; + } + + /** + * @see org.apache.tuscany.model.assembly.impl.ExtensibleImpl#initialize(org.apache.tuscany.model.assembly.AssemblyContext) + */ + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) + return; + + // Load the interface + if (getInterface()==null && interfaceName!=null) { + try { + Class<?> interfaceClass=modelContext.getApplicationResourceLoader().loadClass(interfaceName); + setInterface(interfaceClass); + } catch (ClassNotFoundException e) { + throw new IllegalArgumentException(e); + } + } + + // Load the callback interface + if (getCallbackInterface()==null && callbackInterfaceName!=null) { + try { + Class<?> callbackInterfaceClass=modelContext.getApplicationResourceLoader().loadClass(callbackInterfaceName); + setInterface(callbackInterfaceClass); + } catch (ClassNotFoundException e) { + throw new IllegalArgumentException(e); + } + } + + super.initialize(modelContext); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/types/wsdl/WSDLServiceContract.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/types/wsdl/WSDLServiceContract.java new file mode 100644 index 0000000000..999242a4c2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/types/wsdl/WSDLServiceContract.java @@ -0,0 +1,51 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.types.wsdl; + +import javax.wsdl.PortType; + +import org.apache.tuscany.model.assembly.ServiceContract; + +/** + * A WSDL service contract. + */ +public interface WSDLServiceContract extends ServiceContract { + + /** + * Returns the WSDL portType. + * @return the WSDL portType + */ + PortType getPortType(); + + /** + * Sets the WSDL portType. + * @param portType + */ + void setPortType(PortType portType); + + /** + * Returns the callback WSDL portType. + * @return the callback WSDL portType + */ + PortType getCallbackPortType(); + + /** + * Sets the callback WSDL portType. + * @param portType + */ + void setCallbackPortType(PortType portType); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/types/wsdl/impl/WSDLServiceContractImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/types/wsdl/impl/WSDLServiceContractImpl.java new file mode 100644 index 0000000000..a596eb539f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/types/wsdl/impl/WSDLServiceContractImpl.java @@ -0,0 +1,234 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.types.wsdl.impl; + +import static org.objectweb.asm.Opcodes.ACC_ABSTRACT; +import static org.objectweb.asm.Opcodes.ACC_INTERFACE; +import static org.objectweb.asm.Opcodes.ACC_PUBLIC; +import static org.objectweb.asm.Opcodes.V1_5; + +import java.util.ArrayList; +import java.util.List; + +import javax.wsdl.Operation; +import javax.wsdl.Part; +import javax.wsdl.PortType; +import javax.xml.namespace.QName; + +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.impl.ServiceContractImpl; +import org.apache.tuscany.model.types.wsdl.WSDLServiceContract; +import org.apache.tuscany.model.util.XMLNameUtil; +import org.apache.tuscany.sdo.util.SDOUtil; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Type; + +import commonj.sdo.Property; +import commonj.sdo.helper.TypeHelper; +import commonj.sdo.helper.XSDHelper; + +/** + * An implementation of WSDLServiceContract. + */ +public class WSDLServiceContractImpl extends ServiceContractImpl implements WSDLServiceContract { + + private PortType portType; + + private PortType callbackPortType; + + private static final String[] EMPTY_STRINGS = new String[0]; + + /** + * Constructor + */ + public WSDLServiceContractImpl() { + } + + public PortType getPortType() { + return portType; + } + + public void setPortType(PortType portType) { + checkNotFrozen(); + this.portType = portType; + } + + public PortType getCallbackPortType() { + return callbackPortType; + } + + public void setCallbackPortType(PortType portType) { + checkNotFrozen(); + callbackPortType = portType; + } + + /** + * @see org.apache.tuscany.model.assembly.impl.ExtensibleImpl#initialize(org.apache.tuscany.model.assembly.AssemblyContext) + */ + public void initialize(AssemblyContext modelContext) { + if (isInitialized()) + return; + super.initialize(modelContext); + + // Load the Java interface for the portType + if (portType != null && getInterface() == null) { + QName qname = portType.getQName(); + String interfaceName = XMLNameUtil.getFullyQualifiedClassNameFromQName(qname.getNamespaceURI(), qname.getLocalPart()); + Class<?> interfaceClass; + try { + // Load the interface + interfaceClass = modelContext.getApplicationResourceLoader().loadClass(interfaceName); + } catch (ClassNotFoundException e) { + // Generate the interface on the fly + interfaceClass = generateJavaInterface(modelContext.getTypeHelper(), modelContext.getApplicationResourceLoader(), portType, interfaceName); + } + super.setInterface(interfaceClass); + } + + // Load the Java interface for the callback portType + if (callbackPortType != null && getCallbackInterface() == null) { + QName qname = callbackPortType.getQName(); + String interfaceName = XMLNameUtil.getFullyQualifiedClassNameFromQName(qname.getNamespaceURI(), qname.getLocalPart()); + Class<?> interfaceClass; + try { + // Load the interface + interfaceClass = modelContext.getApplicationResourceLoader().loadClass(interfaceName); + } catch (ClassNotFoundException e) { + // Generate the interface on the fly + interfaceClass = generateJavaInterface(modelContext.getTypeHelper(), modelContext.getApplicationResourceLoader(), portType, interfaceName); + } + super.setCallbackInterface(interfaceClass); + } + } + + /** + * Generate a Java interface from a WSDL portType. + * + * @param portType + * @param interfaceName + * @return a Java interface that provides the same service contract as the WSDL portType + */ + @SuppressWarnings("unchecked") + private static Class<?> generateJavaInterface(TypeHelper typeHelper, ResourceLoader resourceLoader, PortType portType, String interfaceName) { + + ClassLoader cl=Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(resourceLoader.getClassLoader()); + + // Create an XSD helper + XSDHelper xsdHelper = SDOUtil.createXSDHelper(typeHelper); + + ClassWriter cw = new ClassWriter(false); + + // Generate the interface + interfaceName = interfaceName.replace('.', '/'); + cw.visit(V1_5, ACC_PUBLIC + ACC_ABSTRACT + ACC_INTERFACE, interfaceName, null, "java/lang/Object", EMPTY_STRINGS); + + // Generate methods from the WSDL operations + for (Operation operation : (List<Operation>) portType.getOperations()) { + + //FIXME Workaround for TUSCANY-170, we will need to make this consistent with the algorithm used by Axis2 WSDL2Java + // to generate method names from operations names + //String methodName = XMLNameUtil.getJavaNameFromXMLName(operation.getName(), false); + String methodName = operation.getName(); + + // FIXME later we may want to wwitch to use the Axis2 WSDL2Java (not to generate the Java source, + // just to figure the WSDL to Java mapping) + + // Derive the method signature from the input message part (and check if it's a doc-wrapped or doc-bare operation) + List<Class> inputTypes=new ArrayList<Class>(); + boolean wrapped = false; + if (operation.getInput() != null && operation.getInput().getMessage()!=null && !operation.getInput().getMessage().getParts().isEmpty()) { + QName qname=((Part)operation.getInput().getMessage().getParts().values().iterator().next()).getElementName(); + if (qname!=null) { + Property property = xsdHelper.getGlobalProperty(qname.getNamespaceURI(), qname.getLocalPart(), true); + commonj.sdo.Type type = property.getType(); + if (property.getName().equals(operation.getName())) { + String localName = xsdHelper.getLocalName(type); + if (localName.indexOf("_._")!=-1) { + for (Property param : (List<Property>)type.getProperties()) { + Class inputType = param.getType().getInstanceClass(); + if (inputType == null) + inputType = Object.class; + inputTypes.add(inputType); + } + wrapped=true; + } + } + + // Bare doc style + if (!wrapped) { + Class inputType = type.getInstanceClass(); + if (inputType == null) + inputType = Object.class; + inputTypes.add(inputType); + } + + } else { + // FIXME only support elements for now + } + } + + // Derive the return type from the output message part (also support doc-wrapped and doc-bare here) + Class outputType=Void.class; + if (operation.getOutput() != null && operation.getOutput().getMessage()!=null && !operation.getOutput().getMessage().getParts().isEmpty()) { + QName qname=((Part)operation.getOutput().getMessage().getParts().values().iterator().next()).getElementName(); + if (qname!=null) { + Property property = xsdHelper.getGlobalProperty(qname.getNamespaceURI(), qname.getLocalPart(), true); + commonj.sdo.Type type = property.getType(); + if (wrapped) { + if (!type.getProperties().isEmpty()) { + outputType=((Property)type.getProperties().get(0)).getType().getInstanceClass(); + if (outputType==null) + outputType=Object.class; + } + } else { + outputType = type.getInstanceClass(); + if (outputType==null) + outputType=Object.class; + } + } else { + // FIXME only support elements for now + } + } + + // FIXME integrate XSD to Java type mapping here + StringBuffer inputSignature=new StringBuffer(); + for (Class inputType : inputTypes) { + inputSignature.append(Type.getDescriptor(inputType)); + } + String outputSignature = Type.getDescriptor(outputType); + + cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, methodName, '(' + inputSignature.toString() + ')' + outputSignature, null, null).visitEnd(); + } + + // Generate the bytecodes + cw.visitEnd(); + byte[] bytes = cw.toByteArray(); + + // Add the class to the resource loader + + return resourceLoader.addClass(bytes); + + } finally { + Thread.currentThread().setContextClassLoader(cl); + } + + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/util/NotifyingList.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/util/NotifyingList.java new file mode 100644 index 0000000000..1f064e0977 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/util/NotifyingList.java @@ -0,0 +1,108 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.util; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * A list that invokes added or removed methods when elements are added or removed. + * + */ +public abstract class NotifyingList<E> extends ArrayList<E> { + + private boolean frozen; + + public NotifyingList() { + } + + public void freeze() { + frozen=true; + } + + protected void checkNotFrozen() { + if (frozen) + throw new IllegalStateException("Attempt to modify a frozen list"); + } + + public boolean add(E element) { + checkNotFrozen(); + boolean result=super.add(element); + added(element); + return result; + } + + public void add(int index, E element) { + checkNotFrozen(); + super.add(index, element); + added(element); + } + + public boolean addAll(Collection<? extends E> c) { + checkNotFrozen(); + boolean result=super.addAll(c); + for (E element : c) + added(element); + return result; + } + + public boolean addAll(int index, Collection<? extends E> c) { + checkNotFrozen(); + boolean result=super.addAll(index, c); + for (E element : c) + added(element); + return result; + } + + public void clear() { + checkNotFrozen(); + List<E> l=new ArrayList<E>(this); + super.clear(); + for (E element : l) + removed(element); + } + + public E remove(int index) { + checkNotFrozen(); + E element=super.remove(index); + removed(element); + return element; + } + + @SuppressWarnings("unchecked") + public boolean remove(Object element) { + checkNotFrozen(); + boolean result=super.remove(element); + removed((E)element); + return result; + } + + @SuppressWarnings("unchecked") + public boolean removeAll(Collection<?> c) { + checkNotFrozen(); + boolean result=super.removeAll(c); + for (E element : (Collection<? extends E>)c) + removed(element); + return result; + } + + protected abstract void added(E element); + + protected abstract void removed(E element); + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/util/XMLNameUtil.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/util/XMLNameUtil.java new file mode 100644 index 0000000000..f493356594 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/java/org/apache/tuscany/model/util/XMLNameUtil.java @@ -0,0 +1,212 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.util; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import org.apache.tuscany.sdo.helper.SDOXSDEcoreBuilder; + + + +/** + * A utility class that converts between XML names and Java names. + */ +public final class XMLNameUtil { + + private static final List<String> DOMAINS = Arrays.asList(new String[]{"COM", "com", "ORG", "org"}); + + /** + * Constructor + */ + private XMLNameUtil() { + super(); + } + + /** + * Return an EPackage name for the given namespace. + * + * @param namespace + * @return an EPackage name for the given namespace + */ + public static String getPackageNameFromNamespace(String namespace) { + return org.apache.tuscany.sdo.helper.SDOXSDEcoreBuilder.getDefaultPackageName(namespace); + } + + /** + * Trim the file extension from a path. + * @param path + * @return + */ + private static String trimFileExtension(String path) { + int s=path.lastIndexOf('/'); + int d=path.lastIndexOf('.'); + if (d>s) { + return path.substring(0,d); + } else { + return path; + } + } + + /** + * Returns a namespace prefix for the given package Name. + * + * @param packageName + * @return a namespace prefix for the given package Name + */ + public static String getNSPrefixFromPackageName(String packageName) { + int index = packageName.lastIndexOf('.'); + return index == -1 ? packageName : packageName.substring(index + 1); + } + + /** + * Parse the given name. + * + * @param sourceName + * @param separator + * @return some stuff parsed from the name + */ + private static List<String> parseName(String sourceName, char separator) { + List<String> result = new ArrayList<String>(); + if (sourceName != null) { + StringBuilder currentWord = new StringBuilder(64); + boolean lastIsLower = false; + int index; + int length; + for (index = 0, length = sourceName.length(); index < length; ++index) { + char curChar = sourceName.charAt(index); + if (!Character.isJavaIdentifierPart(curChar)) { + curChar = separator; + } + if (Character.isUpperCase(curChar) + || (!lastIsLower && Character.isDigit(curChar)) + || curChar == separator) { + + if (lastIsLower && currentWord.length() > 1 + || curChar == separator && currentWord.length() > 0) { + result.add(currentWord.toString()); + currentWord = new StringBuilder(64); + } + lastIsLower = false; + } else { + if (!lastIsLower) { + int currentWordLength = currentWord.length(); + if (currentWordLength > 1) { + char lastChar = currentWord.charAt(--currentWordLength); + currentWord.setLength(currentWordLength); + result.add(currentWord.toString()); + currentWord = new StringBuilder(64); + currentWord.append(lastChar); + } + } + lastIsLower = true; + } + + if (curChar != separator) { + currentWord.append(curChar); + } + } + + result.add(currentWord.toString()); + } + return result; + } + + /** + * Returns a valid Java name from an XML Name. + * + * @param name + * @param isUpperCase + * @return a valid Java name from an XML Name + */ + public static String getJavaNameFromXMLName(String name, boolean isUpperCase) { + List<String> parsedName = parseName(name, '_'); + StringBuilder result = new StringBuilder(64 * parsedName.size()); + for (String nameComponent: parsedName) { + if (nameComponent.length() > 0) { + if (result.length() > 0 || isUpperCase) { + result.append(Character.toUpperCase(nameComponent.charAt(0))); + result.append(nameComponent.substring(1)); + } else { + result.append(nameComponent); + } + } + } + + if (result.length() == 0) { + return "_"; + } + if (Character.isJavaIdentifierStart(result.charAt(0))) { + return isUpperCase ? result.toString() : decapitalizeName(result.toString()); + } + return "_" + result; + } + + /** + * Returns a valid fully qualified class name from a QName. + * @param namespace + * @param name + * @return a valid fully qualified class name from a QName + */ + public static String getFullyQualifiedClassNameFromQName(String namespace, String name) { + return XMLNameUtil.getPackageNameFromNamespace(namespace) + '.' + + XMLNameUtil.getJavaNameFromXMLName(name, true); + } + + /** + * Decapitalize a name. + * @param name + * @return a decapitalized name + */ + public static String decapitalizeName(String name) { + if (name.length() == 0) { + return name; + } else { + String lowerName = name.toLowerCase(); + int i; + for (i = 0; i < name.length(); i++) { + if (name.charAt(i) == lowerName.charAt(i)) { + break; + } + } + if (i > 1 && i < name.length()) { + --i; + } + return name.substring(0, i).toLowerCase() + name.substring(i); + } + } + + /** + * Capitalize a name. + * @param name + * @return a capitalized name + */ + public static String capitalizeName(String name) { + int l = name.length(); + if (l == 0) { + return name; + } else if (l == 1) { + return name.toUpperCase(); + } else { + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-binding-sca.xsd b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-binding-sca.xsd new file mode 100644 index 0000000000..3b003ce77a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-binding-sca.xsd @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/0.9" + xmlns:sca="http://www.osoa.org/xmlns/sca/0.9" + xmlns:sdo="commonj.sdo/xml" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core.xsd"/> + + <element name="binding.sca" type="sca:SCABinding" substitutionGroup="sca:binding" sdo:name="bindingSca"/> + <complexType name="SCABinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-binding-webservice.xsd b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-binding-webservice.xsd new file mode 100644 index 0000000000..79131506c4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-binding-webservice.xsd @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/0.9" + xmlns:sca="http://www.osoa.org/xmlns/sca/0.9" + xmlns:sdo="commonj.sdo/xml" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core.xsd"/> + + <element name="binding.ws" type="sca:WebServiceBinding" substitutionGroup="sca:binding" sdo:name="bindingWs"/> + <complexType name="WebServiceBinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="port" type="anyURI" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-core.xsd b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-core.xsd new file mode 100644 index 0000000000..7d3ca73676 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-core.xsd @@ -0,0 +1,239 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/0.9" + xmlns:sca="http://www.osoa.org/xmlns/sca/0.9" + xmlns:sdo="commonj.sdo/xml" + xmlns:sdojava="commonj.sdo/java" + sdojava:package="org.apache.tuscany.model.scdl" + elementFormDefault="qualified"> + + <element name="componentType" type="sca:ComponentType"/> + <complexType name="ComponentType"> + <sequence> + <element minOccurs="0" maxOccurs="unbounded" name="service" type="sca:Service"/> + <element minOccurs="0" maxOccurs="unbounded" name="reference" type="sca:Reference"/> + <element minOccurs="0" maxOccurs="unbounded" name="property" type="sca:Property"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + <complexType name="Service"> + <sequence> + <element minOccurs="1" maxOccurs="1" ref="sca:interface"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + <element name="interface" type="sca:Interface"/> + <complexType name="Interface"/> + + <complexType name="Reference"> + <sequence> + <element minOccurs="1" maxOccurs="1" ref="sca:interface"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <attribute name="multiplicity" type="sca:Multiplicity" use="optional" default="1..1"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + <complexType name="Property"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <attribute name="type" type="QName" use="required" sdo:name="dataType"/> + <attribute name="many" type="boolean" default="false" use="optional"/> + <attribute name="required" type="boolean" default="false" use="optional"/> + <attribute name="default" type="string" use="optional"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + + <element name="moduleFragment" type="sca:ModuleFragment"/> + <complexType name="ModuleFragment"> + <sequence> + <!-- This is a Tuscany extension --> + <element minOccurs="0" maxOccurs="unbounded" name="import" type="sca:Import"/> + <element minOccurs="0" maxOccurs="unbounded" name="entryPoint" type="sca:EntryPoint"/> + <element minOccurs="0" maxOccurs="unbounded" name="component" type="sca:Component"/> + <element minOccurs="0" maxOccurs="unbounded" name="externalService" type="sca:ExternalService"/> + <element minOccurs="0" maxOccurs="unbounded" name="wire" type="sca:ModuleWire"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + <element name="module" type="sca:Module"/> + <complexType name="Module"> + <complexContent> + <extension base="sca:ModuleFragment"/> + </complexContent> + </complexType> + + <complexType name="EntryPoint"> + <sequence> + <element minOccurs="0" maxOccurs="1" ref="sca:interface"/> + <element minOccurs="1" maxOccurs="unbounded" ref="sca:binding"/> + <element minOccurs="1" maxOccurs="unbounded" name="reference" type="anyURI"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <attribute name="multiplicity" type="sca:Multiplicity" use="optional" default="1..1"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + <!-- a multiplicity 1..1 or 0..n sample + <reference>StockQuoteComponent</reference> - type must be URI + a multiplicity 1..n or 0..n sample + <reference>StockQuoteComponent1</reference> - type must be URI + <reference>StockQuoteComponent2</reference> + --> + + <element name="binding" type="sca:Binding"/> + <complexType name="Binding"> + <attribute name="uri" type="anyURI" use="optional"/> + </complexType> + + <complexType name="Component"> + <sequence> + <element minOccurs="1" maxOccurs="1" ref="sca:implementation"/> + <element minOccurs="0" maxOccurs="1" name="properties" type="sca:PropertyValues"/> + <element minOccurs="0" maxOccurs="1" name="references" type="sca:ReferenceValues"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + <!-- a multiplicity 1..1 or 0..1 sample + <references> + <v:stockQuote>StockQuoteComponent</v:stockquote> - type must be URI + </references> + a multiplicity 1..n or 0..n sample + <references> + <v:stockQuote>StockQuoteComponent1</v:stockQuote> - type must be URI + <v:stockQuote>StockQuoteComponent2</v:stockQuote> + </references> + --> + + <element name="implementation" type="sca:Implementation"/> + <complexType name="Implementation"/> + + <complexType name="PropertyValues"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + <complexType name="ReferenceValues"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + + <complexType name="ExternalService"> + <sequence> + <element minOccurs="1" maxOccurs="1" ref="sca:interface"/> + <element minOccurs="0" maxOccurs="unbounded" ref="sca:binding"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <attribute name="overridable" type="sca:OverrideOptions" default="may" use="optional"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + + <complexType name="ModuleWire"> + <sequence> + <element minOccurs="1" maxOccurs="1" ref="sca:source.uri"/> + <element minOccurs="1" maxOccurs="1" ref="sca:target.uri"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + <element name="source" type="anyType"/> + <element name="target" type="anyType"/> + + <element name="source.uri" type="anyURI" substitutionGroup="sca:source" sdo:name="sourceUri"/> + <element name="target.uri" type="anyURI" substitutionGroup="sca:target" sdo:name="targetUri"/> + + <element name="subsystem" type="sca:Subsystem"/> + <complexType name="Subsystem"> + <sequence> + <element minOccurs="0" maxOccurs="unbounded" name="entryPoint" type="sca:EntryPoint"/> + <element minOccurs="0" maxOccurs="unbounded" name="moduleComponent" type="sca:ModuleComponent"/> + <element minOccurs="0" maxOccurs="unbounded" name="externalService" type="sca:ExternalService"/> + <element minOccurs="0" maxOccurs="unbounded" name="wire" type="sca:SystemWire"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <attribute name="uri" type="anyURI" use="optional"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + <complexType name="ModuleComponent"> + <sequence> + <element minOccurs="0" maxOccurs="1" name="properties" type="sca:PropertyValues"/> + <element minOccurs="0" maxOccurs="1" name="references" type="sca:ReferenceValues"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <attribute name="module" type="NCName" use="required"/> + <attribute name="uri" type="anyURI" use="optional"/> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + <complexType name="SystemWire"> + <sequence> + <element minOccurs="1" maxOccurs="1" ref="sca:source"/> + <element minOccurs="1" maxOccurs="1" ref="sca:target"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + </complexType> + + <element name="source.epr" type="anyType" substitutionGroup="sca:source" sdo:name="sourceEpr"/> + <element name="target.epr" type="anyType" substitutionGroup="sca:target" sdo:name="targetEpr"/> + + <simpleType name="Multiplicity"> + <restriction base="string"> + <enumeration value="0..1" sdo:name="_01"/> + <enumeration value="1..1" sdo:name="_11"/> + <enumeration value="0..n" sdo:name="_0n"/> + <enumeration value="1..n" sdo:name="_1n"/> + </restriction> + </simpleType> + + <simpleType name="OverrideOptions"> + <restriction base="string"> + <enumeration value="no"/> + <enumeration value="may"/> + <enumeration value="must"/> + </restriction> + </simpleType> + + <!-- This is a Tuscany extension --> + <element name="import" type="sca:Import"/> + <complexType name="Import"/> + +</schema> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-implementation-java.xsd b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-implementation-java.xsd new file mode 100644 index 0000000000..d7998a355c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-implementation-java.xsd @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/0.9" + xmlns:sca="http://www.osoa.org/xmlns/sca/0.9" + xmlns:sdo="commonj.sdo/xml" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core.xsd"/> + + <element name="implementation.java" type="sca:JavaImplementation" substitutionGroup="sca:implementation" sdo:name="implementationJava"/> + <complexType name="JavaImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="class" type="NCName" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-interface-java.xsd b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-interface-java.xsd new file mode 100644 index 0000000000..2b3f263b52 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-interface-java.xsd @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/0.9" + xmlns:sca="http://www.osoa.org/xmlns/sca/0.9" + xmlns:sdo="commonj.sdo/xml" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core.xsd"/> + + <element name="interface.java" type="sca:JavaInterface" substitutionGroup="sca:interface" sdo:name="interfaceJava"/> + <complexType name="JavaInterface"> + <complexContent> + <extension base="sca:Interface"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="interface" type="NCName" use="required"/> + <attribute name="callbackInterface" type="NCName" use="optional"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-interface-wsdl.xsd b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-interface-wsdl.xsd new file mode 100644 index 0000000000..3649f4d898 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca-interface-wsdl.xsd @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/0.9" + xmlns:sca="http://www.osoa.org/xmlns/sca/0.9" + xmlns:sdo="commonj.sdo/xml" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core.xsd"/> + + <element name="interface.wsdl" type="sca:WSDLPortType" substitutionGroup="sca:interface" sdo:name="interfaceWsdl"/> + <complexType name="WSDLPortType"> + <complexContent> + <extension base="sca:Interface"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="interface" type="anyURI" use="required"/> + <attribute name="callbackInterface" type="anyURI" use="optional"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> + + <!-- This is a Tuscany extension --> + <element name="import.wsdl" type="sca:WSDLImport" substitutionGroup="sca:import" sdo:name="importWsdl"/> + <complexType name="WSDLImport"> + <complexContent> + <extension base="sca:Import"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="namespace" type="anyURI" use="optional"/> + <attribute name="location" type="anyURI" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> + + <!-- This is a Tuscany extension --> + <element name="import.sdo" type="sca:SDOImport" substitutionGroup="sca:import" sdo:name="importSdo"/> + <complexType name="SDOImport"> + <complexContent> + <extension base="sca:Import"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="location" type="anyURI" use="optional"/> + <attribute name="factory" type="NCName" use="optional"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> + +</schema> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca.xsd b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca.xsd new file mode 100644 index 0000000000..d49dfeff79 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/model/sca.xsd @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/0.9" + xmlns:sdojava="commonj.sdo/java" + xmlns:sca="http://www.osoa.org/xmlns/sca/0.9" + sdojava:package="org.apache.tuscany.model.scdl"> + + <include schemaLocation="sca-core.xsd"/> + + <include schemaLocation="sca-interface-java.xsd"/> + <include schemaLocation="sca-interface-wsdl.xsd"/> + + <include schemaLocation="sca-implementation-java.xsd"/> + + <include schemaLocation="sca-binding-webservice.xsd"/> + <include schemaLocation="sca-binding-sca.xsd"/> + +</schema> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/org/apache/tuscany/model/Messages.properties b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/org/apache/tuscany/model/Messages.properties new file mode 100644 index 0000000000..4581e44bff --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/main/resources/org/apache/tuscany/model/Messages.properties @@ -0,0 +1,25 @@ +# Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. +# +# Licensed 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. +# ==================================================================== +# To code developer: +# Do NOT change the properties between this line and the +# "%%% END OF TRANSLATED PROPERTIES %%%" line. +# Make a new property name, append to the end of the file and change +# the code to use the new property. +# ==================================================================== + +# ===================================================================== +# %%% END OF TRANSLATED PROPERTIES %%% +# ===================================================================== +# NLS_MESSAGEFORMAT_ALL diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/account/AccountReport.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/account/AccountReport.java new file mode 100644 index 0000000000..b1b5913adc --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/account/AccountReport.java @@ -0,0 +1,32 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.tests.bigbank.account.services.account; + +import java.util.List; + +/** + * @model + */ + +public interface AccountReport { + + /** + * @model type="services.account.AccountSummary" + */ + + List getAccountSummaries(); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/account/AccountService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/account/AccountService.java new file mode 100644 index 0000000000..83df13439a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/account/AccountService.java @@ -0,0 +1,25 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.tests.bigbank.account.services.account; + +import org.osoa.sca.annotations.Remotable; + +@Remotable +public interface AccountService { + + public AccountReport getAccountReport(String customerID); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/account/AccountService.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/account/AccountService.wsdl new file mode 100644 index 0000000000..baf9ecd81d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/account/AccountService.wsdl @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:tns="http://www.bigbank.com/AccountService/"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://www.bigbank.com/AccountService/"
+
+ name="AccountService">
+
+ <wsdl:types>
+ <xsd:schema targetNamespace="http://www.bigbank.com/AccountService/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <xsd:element name="customerID" type="xsd:string"/>
+ <xsd:element name="getAccountReportResponse" type="tns:AccountReport"/>
+
+ <xsd:complexType name="AccountReport">
+ <xsd:sequence>
+ <xsd:element name="accountSummary" type="tns:AccountSummary" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ <xsd:complexType name="AccountSummary">
+ <xsd:sequence>
+ <xsd:element name="accountNumber" type="xsd:string"/>
+ <xsd:element name="accountType" type="xsd:string"/>
+ <xsd:element name="balance" type="xsd:float"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ </xsd:schema>
+ </wsdl:types>
+ <wsdl:message name="getAccountReportRequest">
+ <wsdl:part element="tns:customerID" name="getAccountReportRequest"/>
+ </wsdl:message>
+ <wsdl:message name="getAccountReportResponse">
+ <wsdl:part element="tns:getAccountReportResponse" name="getAccountReportResponse"/>
+ </wsdl:message>
+ <wsdl:portType name="AccountService">
+ <wsdl:operation name="getAccountReport">
+ <wsdl:input message="tns:getAccountReportRequest"/>
+ <wsdl:output message="tns:getAccountReportResponse"/>
+ </wsdl:operation>
+ </wsdl:portType>
+ <wsdl:binding name="AccountServiceSOAP" type="tns:AccountService">
+ <soap:binding style="document"
+ transport="http://schemas.xmlsoap.org/soap/http"/>
+ <wsdl:operation name="getAccountReport">
+ <soap:operation
+ soapAction="http://www.bigbank.com/AccountService/getAccountReport"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:service name="AccountService">
+ <wsdl:port binding="tns:AccountServiceSOAP"
+ name="AccountServiceSOAP">
+ <soap:address location="http://localhost:8080/tuscany-model/services/AccountService"/>
+ </wsdl:port>
+ </wsdl:service>
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/account/AccountServiceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/account/AccountServiceImpl.java new file mode 100644 index 0000000000..a5619bb41e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/account/AccountServiceImpl.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.tests.bigbank.account.services.account; + +import org.osoa.sca.annotations.Property; +import org.osoa.sca.annotations.Reference; + +import org.apache.tuscany.model.assembly.tests.bigbank.account.services.accountdata.AccountDataService; +import org.apache.tuscany.model.assembly.tests.bigbank.account.services.stockquote.StockQuoteService; + +public class AccountServiceImpl implements AccountService { + + @Property + public String currency = "USD"; + + @Reference + public AccountDataService accountDataService; + @Reference + public StockQuoteService stockQuoteService; + + public AccountServiceImpl() { + } + + public AccountReport getAccountReport(String customerID) { + return null; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/account/AccountSummary.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/account/AccountSummary.java new file mode 100644 index 0000000000..c1650c79fa --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/account/AccountSummary.java @@ -0,0 +1,46 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.tests.bigbank.account.services.account; + +/** + * @model + */ + +public interface AccountSummary { + + /** + * @model + */ + String getAccountNumber(); + + void setAccountNumber(String accountNumber); + + /** + * @model + */ + String getAccountType(); + + void setAccountType(String accountType); + + /** + * @model + */ + float getBalance(); + + void setBalance(float balance); +} + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/accountdata/AccountDataService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/accountdata/AccountDataService.java new file mode 100644 index 0000000000..04ae8e5bd5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/accountdata/AccountDataService.java @@ -0,0 +1,26 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.tests.bigbank.account.services.accountdata; + +public interface AccountDataService { + + CheckingAccount getCheckingAccount(String customerID); + + SavingsAccount getSavingsAccount(String customerID); + + StockAccount getStockAccount(String customerID); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/accountdata/AccountDataServiceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/accountdata/AccountDataServiceImpl.java new file mode 100644 index 0000000000..4d5eee1f01 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/accountdata/AccountDataServiceImpl.java @@ -0,0 +1,48 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.tests.bigbank.account.services.accountdata; + +public class AccountDataServiceImpl implements AccountDataService { + + public CheckingAccount getCheckingAccount(String customerID) { + + CheckingAccount checkingAccount = new CheckingAccount(); + checkingAccount.setAccountNumber(customerID + "_CHA12345"); + checkingAccount.setBalance(1500.0f); + + return checkingAccount; + } + + public SavingsAccount getSavingsAccount(String customerID) { + + SavingsAccount savingsAccount = new SavingsAccount(); + savingsAccount.setAccountNumber(customerID + "_SAA12345"); + savingsAccount.setBalance(1500.0f); + + return savingsAccount; + } + + public StockAccount getStockAccount(String customerID) { + + StockAccount stockAccount = new StockAccount(); + stockAccount.setAccountNumber(customerID + "_STA12345"); + stockAccount.setSymbol("IBM"); + stockAccount.setQuantity(100); + + return stockAccount; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/accountdata/CheckingAccount.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/accountdata/CheckingAccount.java new file mode 100644 index 0000000000..d4f2f8be6c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/accountdata/CheckingAccount.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.tests.bigbank.account.services.accountdata; + +public class CheckingAccount { + + private String accountNumber; + private float balance; + + public String getAccountNumber() { + return accountNumber; + } + + public void setAccountNumber(String accountNumber) { + this.accountNumber = accountNumber; + } + + public float getBalance() { + return balance; + } + + public void setBalance(float balance) { + this.balance = balance; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/accountdata/SavingsAccount.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/accountdata/SavingsAccount.java new file mode 100644 index 0000000000..73474585da --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/accountdata/SavingsAccount.java @@ -0,0 +1,39 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.tests.bigbank.account.services.accountdata; + +public class SavingsAccount { + + private String accountNumber; + private float balance; + + public String getAccountNumber() { + return accountNumber; + } + + public void setAccountNumber(String accountNumber) { + this.accountNumber = accountNumber; + } + + public float getBalance() { + return balance; + } + + public void setBalance(float balance) { + this.balance = balance; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/accountdata/StockAccount.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/accountdata/StockAccount.java new file mode 100644 index 0000000000..eeb7238abc --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/accountdata/StockAccount.java @@ -0,0 +1,48 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.tests.bigbank.account.services.accountdata; + +public class StockAccount { + + private String accountNumber; + private String symbol; + private int quantity; + + public String getAccountNumber() { + return accountNumber; + } + + public void setAccountNumber(String accountNumber) { + this.accountNumber = accountNumber; + } + + public int getQuantity() { + return quantity; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/stockquote/StockQuoteService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/stockquote/StockQuoteService.java new file mode 100644 index 0000000000..7545e9fbbb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/stockquote/StockQuoteService.java @@ -0,0 +1,24 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.tests.bigbank.account.services.stockquote; + +public interface StockQuoteService { + + public float getQuote(String symbol); +} + +
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/stockquote/StockQuoteServiceImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/stockquote/StockQuoteServiceImpl.java new file mode 100644 index 0000000000..85f85340ec --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/stockquote/StockQuoteServiceImpl.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.model.assembly.tests.bigbank.account.services.stockquote; + +/* Dummy'd up StockQuoteService, override webservice for now */ + +public class StockQuoteServiceImpl implements StockQuoteService { + + public float getQuote(String symbol) { + // Just hardcode for now + return 83.00f; + } + +}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/stockquote/StockQuoteWebService.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/stockquote/StockQuoteWebService.wsdl new file mode 100644 index 0000000000..6af61ef80e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/bigbank/account/services/stockquote/StockQuoteWebService.wsdl @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<wsdl:definitions targetNamespace="http://webservice.stockquote" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://webservice.stockquote" xmlns:intf="http://webservice.stockquote" xmlns:tns1="http://stockquote" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="stockquote">
+ <!--WSDL created by Apache Axis version: 1.2.1
+Built on Jun 14, 2005 (09:15:57 EDT)-->
+ <wsdl:types>
+ <schema elementFormDefault="qualified" targetNamespace="http://stockquote" xmlns="http://www.w3.org/2001/XMLSchema">
+ <complexType name="GetQuoteRequest">
+ <sequence>
+ <element name="symbol" nillable="true" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ <complexType name="GetQuoteResponse">
+ <sequence>
+ <element name="price" type="xsd:float"/>
+ </sequence>
+ </complexType>
+ </schema>
+ <schema elementFormDefault="qualified" targetNamespace="http://webservice.stockquote" xmlns="http://www.w3.org/2001/XMLSchema">
+ <import namespace="http://stockquote"/>
+ <element name="request" type="tns1:GetQuoteRequest"/>
+ <element name="getQuoteReturn" type="tns1:GetQuoteResponse"/>
+ </schema>
+ </wsdl:types>
+
+ <wsdl:message name="getQuoteResponse">
+
+ <wsdl:part element="impl:getQuoteReturn" name="getQuoteReturn"/>
+
+ </wsdl:message>
+
+ <wsdl:message name="getQuoteRequest">
+
+ <wsdl:part element="impl:request" name="request"/>
+
+ </wsdl:message>
+
+ <wsdl:portType name="StockQuoteWebService">
+
+ <wsdl:operation name="getQuote" parameterOrder="request">
+
+ <wsdl:input message="impl:getQuoteRequest" name="getQuoteRequest"/>
+
+ <wsdl:output message="impl:getQuoteResponse" name="getQuoteResponse"/>
+
+ </wsdl:operation>
+
+ </wsdl:portType>
+
+ <wsdl:binding name="StockQuoteWebServiceSoapBinding" type="impl:StockQuoteWebService">
+
+ <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+
+ <wsdl:operation name="getQuote">
+
+ <wsdlsoap:operation soapAction=""/>
+
+ <wsdl:input name="getQuoteRequest">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:input>
+
+ <wsdl:output name="getQuoteResponse">
+
+ <wsdlsoap:body use="literal"/>
+
+ </wsdl:output>
+
+ </wsdl:operation>
+
+ </wsdl:binding>
+
+ <wsdl:service name="StockQuoteWebServiceService">
+
+ <wsdl:port binding="impl:StockQuoteWebServiceSoapBinding" name="StockQuoteWebService">
+
+ <wsdlsoap:address location="http://localhost:8123/StockQuoteWebService/services/StockQuoteWebService"/>
+
+ </wsdl:port>
+
+ </wsdl:service>
+
+</wsdl:definitions>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/resources/org/apache/tuscany/model/assembly/tests/sca.module b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/resources/org/apache/tuscany/model/assembly/tests/sca.module new file mode 100644 index 0000000000..7290f9c0c3 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/resources/org/apache/tuscany/model/assembly/tests/sca.module @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+
+ name="tuscany.model.assembly.tests.bigbank.account">
+
+ <entryPoint name="AccountService">
+ <interface.java interface="org.apache.tuscany.model.assembly.tests.bigbank.account.services.account.AccountService"/>
+ <binding.ws port="http://www.bigbank.com/AccountService#wsdl.endpoint(AccountService/AccountServiceSOAP)"/> + <!--
+ <reference>AccountServiceComponent</reference> + -->
+ </entryPoint>
+
+ <component name="AccountServiceComponent">
+ <implementation.java class="org.apache.tuscany.model.assembly.tests.bigbank.account.services.account.AccountServiceImpl"/> + <!--
+ <properties>
+ <v:currency>EURO</v:currency>
+ </properties>
+ <references>
+ <v:accountDataService>AccountDataServiceComponent</v:accountDataService>
+ <v:stockQuoteService>StockQuoteService</v:stockQuoteService>
+ </references> + -->
+ </component>
+
+ <component name="AccountDataServiceComponent">
+ <implementation.java class="org.apache.tuscany.model.assembly.tests.bigbank.account.services.accountdata.AccountDataServiceImpl"/>
+ </component>
+
+ <component name="StockQuoteService">
+ <implementation.java class="org.apache.tuscany.model.assembly.tests.bigbank.account.services.stockquote.StockQuoteServiceImpl"/>
+ </component>
+
+ <!--
+ <externalService name="StockQuoteService">
+ <interface.java interface="org.apache.tuscany.model.assembly.tests.bigbank.account.services.stockquote"/>
+ <binding.ws port="http://www.quickstockquote.com/StockQuoteService#wsdl.endpoint(StockQuote/StockQuoteServiceSOAP)"/>
+ </externalService>
+ -->
+
+</module>
+
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/resources/org/apache/tuscany/model/assembly/tests/sca.subsystem b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/resources/org/apache/tuscany/model/assembly/tests/sca.subsystem new file mode 100644 index 0000000000..bff90f010d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/model/src/test/resources/org/apache/tuscany/model/assembly/tests/sca.subsystem @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<subsystem xmlns="http://www.osoa.org/xmlns/sca/0.9"
+
+ name="tuscany.runtime.bigbank.account">
+
+ <moduleComponent name="AccountModuleComponent" module="tuscany.runtime.bigbank.account"/>
+
+</subsystem>
+
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.java2wsdl/LICENSE.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.java2wsdl/LICENSE.txt new file mode 100644 index 0000000000..75b52484ea --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.java2wsdl/LICENSE.txt @@ -0,0 +1,202 @@ +
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed 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.
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.java2wsdl/README.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.java2wsdl/README.txt new file mode 100644 index 0000000000..9b26d1690a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.java2wsdl/README.txt @@ -0,0 +1,35 @@ +Apache Tuscany M1 build (May, 2006) +=================================== + +http://incubator.apache.org/tuscany/ + +Tuscany is an effort undergoing incubation at the Apache Software Foundation +(ASF), sponsored by the Web Services PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness or +stability of the code, it does indicate that the project has yet to be fully +endorsed by the ASF. + + +Support +------- + +Any problem with this release can be reported to the Tuscany mailing list +or in the JIRA issue tracker. + +Mailing list subscription: + tuscany-dev-subscribe@ws.apache.org + +Jira: + http://issues.apache.org/jira/browse/Tuscany + + +Thank you for using Tuscany! + + +The Tuscany Team. + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.java2wsdl/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.java2wsdl/pom.xml new file mode 100644 index 0000000000..6ade2cf913 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.java2wsdl/pom.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.
+ -->
+<project>
+ <parent>
+ <groupId>org.apache.tuscany.sca.plugins</groupId>
+ <artifactId>tuscany-sca-plugins</artifactId>
+ <version>incubating-M1</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>tuscany-plugin-java2wsdl</artifactId>
+ <packaging>maven-plugin</packaging>
+ <name>Tuscany SCA - Maven Plugin for Java2WSDL</name>
+ <description>Implementation of Java2WSDL Generator</description>
+ <version>incubating-M1</version>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-plugin-api</artifactId>
+ <version>2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany</groupId>
+ <artifactId>tuscany-sca-tools</artifactId>
+ <version>${pom.version}</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.4</source>
+ <target>1.5</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.java2wsdl/src/main/java/org/apache/tuscany/tools/java2wsdl/plugin/Java2WSDLGeneratorMojo.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.java2wsdl/src/main/java/org/apache/tuscany/tools/java2wsdl/plugin/Java2WSDLGeneratorMojo.java new file mode 100644 index 0000000000..f1b9d91523 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.java2wsdl/src/main/java/org/apache/tuscany/tools/java2wsdl/plugin/Java2WSDLGeneratorMojo.java @@ -0,0 +1,156 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.tools.java2wsdl.plugin;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ws.java2wsdl.Java2WSDLConstants;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.tuscany.tools.java2wsdl.generate.Java2WSDLGeneratorFactory;
+import org.apache.ws.java2wsdl.utils.Java2WSDLCommandLineOption;
+
+/**
+ * @version $Rev$ $Date$
+ * @goal generate
+ * @phase generate-sources
+ * @description Generate WSDL from a given Java class / interface
+ */
+public class Java2WSDLGeneratorMojo extends AbstractMojo
+{
+
+ /**
+ * The name of the class for which the WSDL must be generated
+ * @parameter
+ *
+ */
+ private String sourceClassName;
+
+ /**
+ * The location where the wsdls should be generated into
+ * @parameter expression="${project.build.directory}\\java2wsdl-wsdl"
+ */
+ private String targetLocation;
+
+ /**
+ * The name of the wsdl file
+ * @parameter
+ */
+ private String wsdlFilename;
+
+
+ /**
+ * Classpaths to be included
+ * @parameter
+ *
+ */
+ String[] classpaths;
+
+ /**
+ * The name of the service
+ * @parameter
+ */
+ private String serviceName;
+
+ /**
+ * The binding style for the service
+ * @parameter
+ */
+ private String bindingStyle;
+
+ /**
+ * The binding use option
+ * @parameter
+ */
+ private String bindingUse;
+
+ /**
+ * The soap address
+ * @parameter
+ */
+ private String soapAddress;
+
+ public void execute() throws MojoExecutionException
+ {
+ try
+ {
+ Java2WSDLGeneratorFactory.getInstance().createGenerator().generateWSDL(createOptionsMap ());
+ }
+ catch ( Exception e )
+ {
+ throw new MojoExecutionException("Exception in Java2WSDL Maven Plugin ", e);
+ }
+ }
+
+ protected Map createOptionsMap()
+ {
+ Map optionsMap = new Hashtable();
+
+ optionsMap.put(Java2WSDLConstants.CLASSNAME_OPTION,
+ new Java2WSDLCommandLineOption(Java2WSDLConstants.CLASSNAME_OPTION, new String[]{sourceClassName}));
+
+ if ( targetLocation != null )
+ {
+ optionsMap.put(Java2WSDLConstants.OUTPUT_LOCATION_OPTION,
+ new Java2WSDLCommandLineOption(Java2WSDLConstants.OUTPUT_LOCATION_OPTION, new String[]{targetLocation}));
+ }
+
+ if ( wsdlFilename != null )
+ {
+ optionsMap.put(Java2WSDLConstants.OUTPUT_FILENAME_OPTION,
+ new Java2WSDLCommandLineOption(Java2WSDLConstants.OUTPUT_FILENAME_OPTION, new String[]{wsdlFilename}));
+ }
+
+ if ( classpaths != null && classpaths.length > 0 )
+ {
+ optionsMap.put(Java2WSDLConstants.CLASSPATH_OPTION,
+ new Java2WSDLCommandLineOption(Java2WSDLConstants.CLASSPATH_OPTION, classpaths));
+ }
+
+ if ( serviceName != null )
+ {
+ optionsMap.put(Java2WSDLConstants.SERVICE_NAME_OPTION,
+ new Java2WSDLCommandLineOption(Java2WSDLConstants.SERVICE_NAME_OPTION, new String[]{serviceName}));
+ }
+
+ if ( bindingStyle != null )
+ {
+ optionsMap.put(Java2WSDLConstants.STYLE_OPTION,
+ new Java2WSDLCommandLineOption(Java2WSDLConstants.STYLE_OPTION, new String[]{bindingStyle}));
+ }
+
+ if ( bindingUse != null )
+ {
+ optionsMap.put(Java2WSDLConstants.USE_OPTION,
+ new Java2WSDLCommandLineOption(Java2WSDLConstants.USE_OPTION, new String[]{bindingUse}));
+ }
+
+ if ( soapAddress != null )
+ {
+ optionsMap.put(Java2WSDLConstants.LOCATION_OPTION,
+ new Java2WSDLCommandLineOption(Java2WSDLConstants.LOCATION_OPTION, new String[]{soapAddress}));
+ }
+
+ return optionsMap;
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.wsdl2java/LICENSE.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.wsdl2java/LICENSE.txt new file mode 100644 index 0000000000..75b52484ea --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.wsdl2java/LICENSE.txt @@ -0,0 +1,202 @@ +
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed 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.
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.wsdl2java/README.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.wsdl2java/README.txt new file mode 100644 index 0000000000..9b26d1690a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.wsdl2java/README.txt @@ -0,0 +1,35 @@ +Apache Tuscany M1 build (May, 2006) +=================================== + +http://incubator.apache.org/tuscany/ + +Tuscany is an effort undergoing incubation at the Apache Software Foundation +(ASF), sponsored by the Web Services PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness or +stability of the code, it does indicate that the project has yet to be fully +endorsed by the ASF. + + +Support +------- + +Any problem with this release can be reported to the Tuscany mailing list +or in the JIRA issue tracker. + +Mailing list subscription: + tuscany-dev-subscribe@ws.apache.org + +Jira: + http://issues.apache.org/jira/browse/Tuscany + + +Thank you for using Tuscany! + + +The Tuscany Team. + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.wsdl2java/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.wsdl2java/pom.xml new file mode 100644 index 0000000000..e340ceb602 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.wsdl2java/pom.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.
+ -->
+<project>
+ <parent>
+ <groupId>org.apache.tuscany.sca.plugins</groupId>
+ <artifactId>tuscany-sca-plugins</artifactId>
+ <version>incubating-M1</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>tuscany-plugin-wsdl2java</artifactId>
+ <packaging>maven-plugin</packaging>
+ <name>Tuscany SCA - Maven Plugin for WSDL2Java</name>
+ <description>Implementation of WSDL2Java Generator</description>
+ <version>incubating-M1</version>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-plugin-api</artifactId>
+ <version>2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tuscany</groupId>
+ <artifactId>tuscany-sca-tools</artifactId>
+ <version>${pom.version}</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.4</source>
+ <target>1.5</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.wsdl2java/src/main/java/org/apache/tuscany/tools/wsdl2java/plugin/WSDL2JavaGeneratorMojo.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.wsdl2java/src/main/java/org/apache/tuscany/tools/wsdl2java/plugin/WSDL2JavaGeneratorMojo.java new file mode 100644 index 0000000000..37ff6655d7 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.wsdl2java/src/main/java/org/apache/tuscany/tools/wsdl2java/plugin/WSDL2JavaGeneratorMojo.java @@ -0,0 +1,150 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.tools.wsdl2java.plugin; + +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.util.List; + +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.tuscany.tools.wsdl2java.generate.WSDL2JavaGenerator; + +/** + * @version $Rev$ $Date$ + * @goal generate + * @phase generate-sources + * @description Generate SDO interface classes from an XML Schema + */ +public class WSDL2JavaGeneratorMojo extends AbstractMojo { + /** + * The directory containing wsdl files; defaults to ${basedir}/src/main/wsdl + * @parameter expression="${basedir}/src/main/wsdl" + */ + private String wsdlDir; + + /** + * Name of the wsdl file; if omitted all files in the directory are processed + * @parameter + */ + private File wsdlFile; + + /** + * The Java package to generate into. By default the value is derived from the schema URI. + * + * @parameter + */ + private String javaPackage; + + /** + * The directory to generate into; defaults to ${project.build.directory}/wsdl2java-source + * + * @parameter expression="${project.build.directory}/wsdl2java-source" + */ + private String targetDirectory; + + /** + * The directory to generate into; defaults to ${project.build.directory}/wsdl2java-source + * + * @parameter + */ + private WSDLFileOption[] wsdlFiles; + + /** + * @parameter expression="${project.compileSourceRoots}" + * @readonly + */ + private List compilerSourceRoots; + + public void execute() throws MojoExecutionException { + + if(null != wsdlFiles){ + for(int i=0; i< wsdlFiles.length ; ++i ){ + System.err.println("wsdlFiles" + wsdlFiles[i].getFileName()); + WSDLFileOption wf = wsdlFiles[i]; + + if(null == wf.getTargetDirectory()) + wf.setTargetDirectory(targetDirectory); + if(null == wf.getJavaPackage()){ + wf.setJavaPackage(javaPackage); + } + if(wf.getFileName() == null || wf.getFileName().length() ==0){ + throw new MojoExecutionException("no fileName specfied for wsdl."); + } + if(!wf.getFileName().canRead() || !wf.getFileName().isFile()){ + + throw new MojoExecutionException("file can not be read:"+wf.getFileName()); + } + + } + }else{ + + + + if (wsdlFile == null) { + + File[] files = new File(wsdlDir).listFiles(FILTER); + + wsdlFiles= new WSDLFileOption[files.length]; + for(int i= files.length -1; i> -1; --i){ + + + wsdlFiles[i] = new WSDLFileOption(); + wsdlFiles[i].setFileName(files[i]); + wsdlFiles[i].setJavaPackage(javaPackage); + wsdlFiles[i].setPorts(null); + wsdlFiles[i].setTargetDirectory(targetDirectory); + + + } + + } else { + wsdlFiles= new WSDLFileOption[]{new WSDLFileOption()}; + wsdlFiles[0].setFileName(wsdlFile); + wsdlFiles[0].setJavaPackage(javaPackage); + wsdlFiles[0].setPorts(null); + wsdlFiles[0].setTargetDirectory(targetDirectory); + } + } + + int genOptions = 0; + + for (int i = 0; i < wsdlFiles.length; i++) { + File file = wsdlFiles[i].getFileName(); + File marker = new File(targetDirectory, ".gen#" + file.getName()+".wsdl2java"); + if (file.lastModified() > marker.lastModified()) { + getLog().info("Generating Java service interfaces from " + file); + WSDL2JavaGenerator.generateFromWSDL(file.toString(), wsdlFiles[i].getPorts(), wsdlFiles[i].getTargetDirectory(), wsdlFiles[i].getJavaPackage(), null, genOptions); + } + try { + marker.createNewFile(); + } catch (IOException e) { + throw new MojoExecutionException(e.getMessage(), e); + } + marker.setLastModified(System.currentTimeMillis()); + } + + compilerSourceRoots.add(targetDirectory); + } + + private static final FileFilter FILTER = new FileFilter() { + public boolean accept(File pathname) { + return (pathname.isFile() || !pathname.isHidden()); + } + }; +}
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.wsdl2java/src/main/java/org/apache/tuscany/tools/wsdl2java/plugin/WSDLFileOption.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.wsdl2java/src/main/java/org/apache/tuscany/tools/wsdl2java/plugin/WSDLFileOption.java new file mode 100644 index 0000000000..2d2ae5ed2d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/plugin.wsdl2java/src/main/java/org/apache/tuscany/tools/wsdl2java/plugin/WSDLFileOption.java @@ -0,0 +1,90 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.tools.wsdl2java.plugin;
+
+import java.io.File;
+
+public class WSDLFileOption {
+ /**
+ * Name of the wsdl file; if omitted all files in the directory are processed
+ *
+ */
+ private File fileName;
+
+ /**
+ * The Java package to generate into. By default the value is derived from the schema URI.
+ *
+ *
+ */
+ private String javaPackage;
+
+ /**
+ * The directory to generate into; defaults to ${project.build.directory}/wsdl2java-source
+ *
+ *
+ */
+ private String targetDirectory;
+
+ /**
+ * @parameter expression="${project.compileSourceRoots}"
+ * @readonly
+ */
+
+ private String ports[];
+
+ /**
+ * @parameter expression="${project.compileSourceRoots}"
+ * @readonly
+ */
+
+
+ public WSDLFileOption(){}
+
+ public String getJavaPackage() {
+ return javaPackage;
+ }
+
+ public void setJavaPackage(String javaPackage) {
+ this.javaPackage = javaPackage;
+ }
+
+
+ public String[] getPorts() {
+ return ports;
+ }
+
+ public void setPorts(String[] ports) {
+ this.ports = ports;
+ }
+
+ public String getTargetDirectory() {
+ return targetDirectory;
+ }
+
+ public void setTargetDirectory(String targetDirectory) {
+ this.targetDirectory = targetDirectory;
+ }
+
+ public File getFileName() {
+ return fileName;
+ }
+
+ public void setFileName(File fileName) {
+ this.fileName = fileName;
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/pom.xml new file mode 100644 index 0000000000..a8c04a4b37 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/plugins/pom.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.
+ -->
+<project>
+ <parent>
+ <groupId>org.apache.tuscany</groupId>
+ <artifactId>tuscany-sca</artifactId>
+ <version>incubating-M1</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.apache.tuscany.sca.plugins</groupId>
+ <artifactId>tuscany-sca-plugins</artifactId>
+ <packaging>pom</packaging>
+ <name>Tuscany SCA Maven Plugins</name>
+ <version>incubating-M1</version>
+
+ <modules>
+ <module>plugin.wsdl2java</module>
+ <module>plugin.java2wsdl</module>
+ </modules>
+</project>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/pom.xml new file mode 100644 index 0000000000..a73f1f5619 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/pom.xml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + --> +<project> + <parent> + <groupId>org.apache.tuscany</groupId> + <artifactId>tuscany-project</artifactId> + <version>incubating-M1</version> + </parent> + <modelVersion>4.0.0</modelVersion> + <artifactId>tuscany-sca</artifactId> + <packaging>pom</packaging> + <name>Tuscany SCA Implementation Project</name> + <version>incubating-M1</version> + + <modules> + <module>common</module> + <module>model</module> + <module>core</module> + <module>bindings</module> + <module>databinding</module> + <module>containers</module> + <module>tomcat</module> + <module>tools</module> + <module>plugins</module> + </modules> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <includes> + <include>**/*TestCase.java</include> + </includes> + <reportFormat>brief</reportFormat> + <useFile>false</useFile> + </configuration> + </plugin> + </plugins> + <testResources> + <testResource> + <directory>src/test/java</directory> + <includes> + <include>**/*.componentType</include> + </includes> + </testResource> + <testResource> + <directory>src/test/resources</directory> + <includes> + <include>**/*</include> + </includes> + </testResource> + </testResources> + </build> +</project> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/LICENSE.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/README.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/README.txt new file mode 100644 index 0000000000..9b26d1690a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/README.txt @@ -0,0 +1,35 @@ +Apache Tuscany M1 build (May, 2006) +=================================== + +http://incubator.apache.org/tuscany/ + +Tuscany is an effort undergoing incubation at the Apache Software Foundation +(ASF), sponsored by the Web Services PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness or +stability of the code, it does indicate that the project has yet to be fully +endorsed by the ASF. + + +Support +------- + +Any problem with this release can be reported to the Tuscany mailing list +or in the JIRA issue tracker. + +Mailing list subscription: + tuscany-dev-subscribe@ws.apache.org + +Jira: + http://issues.apache.org/jira/browse/Tuscany + + +Thank you for using Tuscany! + + +The Tuscany Team. + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/pom.xml new file mode 100644 index 0000000000..ff16f54136 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/pom.xml @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + --> +<project> + <parent> + <groupId>org.apache.tuscany</groupId> + <artifactId>tuscany-sca</artifactId> + <version>incubating-M1</version> + </parent> + <modelVersion>4.0.0</modelVersion> + <artifactId>tuscany-tomcat</artifactId> + <name>Tuscany Apache Tomcat Integration</name> + <description>Integration of the Tuscany runtime with Apache Tomcat.</description> + <version>incubating-M1</version> + + <dependencies> + <dependency> + <groupId>org.apache.tuscany.sca.containers</groupId> + <artifactId>tuscany-container-java</artifactId> + <version>${pom.version}</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.apache.tuscany.sca.bindings</groupId> + <artifactId>tuscany-binding-axis2</artifactId> + <version>${pom.version}</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>tomcat</groupId> + <artifactId>servlet-api</artifactId> + <version>5.0.18</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>tomcat</groupId> + <artifactId>catalina</artifactId> + <version>5.5.15</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>tomcat</groupId> + <artifactId>tomcat-util</artifactId> + <version>5.5.15</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>tomcat</groupId> + <artifactId>tomcat-coyote</artifactId> + <version>5.5.15</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>tomcat</groupId> + <artifactId>tomcat-http</artifactId> + <version>5.5.15</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>tomcat</groupId> + <artifactId>naming-factory</artifactId> + <version>5.5.15</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>tomcat</groupId> + <artifactId>naming-resources</artifactId> + <version>5.5.15</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + <version>1.0.4</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>commons-modeler</groupId> + <artifactId>commons-modeler</artifactId> + <version>1.1M1</version> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>3.8.1</version> + <scope>test</scope> + </dependency> + </dependencies> +</project> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/ContainerLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/ContainerLoader.java new file mode 100644 index 0000000000..60c9a7961f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/ContainerLoader.java @@ -0,0 +1,100 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.tomcat; + +import java.beans.PropertyChangeListener; + +import org.apache.catalina.Container; +import org.apache.catalina.Loader; + +/** + * Implementation of a TomcatLoader that allows privileged servlets from the container + * classloader to be loaded into an unprivileged application. This allows the Tuscany + * integration code to add servlets to the application, for example, to handle web + * services requests. + * + * @version $Rev$ $Date$ + */ +public class ContainerLoader implements Loader { + private static final String INFO = ContainerLoader.class.getName() + "/SNAPSHOT"; + private final ClassLoader cl; + private Container container; + + /** + * Constructor specifying the classloader to be used. + * + * @param cl the classloader this Loader wraps, typically the container classloader + */ + public ContainerLoader(ClassLoader cl) { + this.cl = cl; + } + + public void backgroundProcess() { + } + + public ClassLoader getClassLoader() { + return cl; + } + + public Container getContainer() { + return container; + } + + public void setContainer(Container container) { + this.container = container; + } + + public boolean getDelegate() { + return false; + } + + public void setDelegate(boolean delegate) { + throw new UnsupportedOperationException(); + } + + public String getInfo() { + return INFO; + } + + public boolean getReloadable() { + return false; + } + + public void setReloadable(boolean reloadable) { + throw new UnsupportedOperationException(); + } + + public void addPropertyChangeListener(PropertyChangeListener listener) { + throw new UnsupportedOperationException(); + } + + public void addRepository(String repository) { + throw new UnsupportedOperationException(); + } + + public String[] findRepositories() { + throw new UnsupportedOperationException(); + } + + public boolean modified() { + throw new UnsupportedOperationException(); + } + + public void removePropertyChangeListener(PropertyChangeListener listener) { + throw new UnsupportedOperationException(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TomcatHost.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TomcatHost.java new file mode 100644 index 0000000000..8351da8edd --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TomcatHost.java @@ -0,0 +1,53 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.tomcat; + +import javax.servlet.Servlet; + +import org.osoa.sca.annotations.Scope; + +import org.apache.tuscany.core.webapp.ServletHost; + +/** + * SCA Component that acts as a proxy for the Tomcat Host container that created the runtime. + * + * @version $Rev$ $Date$ + */ +@Scope("MODULE") +public class TomcatHost implements ServletHost { + private TuscanyHost host; + + public void setHost(TuscanyHost host) { + this.host = host; + } + + public TuscanyHost getHost() { + return host; + } + + public void registerMapping(String mapping, Servlet servlet) { + host.registerMapping(mapping, servlet); + } + + public void unregisterMapping(String mapping) { + host.unregisterMapping(mapping); + } + + public Servlet getMapping(String mapping) { + return host.getMapping(mapping); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyContextListener.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyContextListener.java new file mode 100644 index 0000000000..7e3edf67f9 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyContextListener.java @@ -0,0 +1,152 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.tomcat; + +import javax.servlet.ServletContext; + +import org.apache.catalina.Context; +import org.apache.catalina.Lifecycle; +import org.apache.catalina.LifecycleEvent; +import org.apache.catalina.LifecycleListener; +import org.apache.catalina.util.StringManager; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.tuscany.common.resource.ResourceLoader; +import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl; +import org.apache.tuscany.core.client.BootstrapHelper; +import org.apache.tuscany.core.config.ConfigurationException; +import org.apache.tuscany.core.config.ModuleComponentConfigurationLoader; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.EventException; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.ModuleComponent; +import org.apache.tuscany.model.assembly.impl.AssemblyContextImpl; +import org.apache.tuscany.model.assembly.loader.AssemblyModelLoader; + +/** + * @version $Rev$ $Date$ + */ +public class TuscanyContextListener implements LifecycleListener { + private static final Log log = LogFactory.getLog(TuscanyContextListener.class); + private static final StringManager sm = StringManager.getManager("org.apache.tuscany.tomcat"); + private static final String TUSCANY_RUNTIME_NAME = RuntimeContext.class.getName(); + public static final String MODULE_COMPONENT_NAME = "org.apache.tuscany.core.webapp.ModuleComponentContext"; + + private final AssemblyFactory modelFactory; + private final AssemblyModelLoader modelLoader; + private final RuntimeContext runtime; + private CompositeContext moduleContext; + private TuscanyValve valve; + + public TuscanyContextListener(RuntimeContext runtimeContext, AssemblyFactory modelFactory, AssemblyModelLoader modelLoader) { + this.runtime = runtimeContext; + this.modelFactory = modelFactory; + this.modelLoader = modelLoader; + } + + public void lifecycleEvent(LifecycleEvent event) { + String type = event.getType(); + if (Lifecycle.AFTER_START_EVENT.equals(type)) { + startContext((Context) event.getLifecycle()); + } else if (Lifecycle.STOP_EVENT.equals(type)) { + stopContext((Context) event.getLifecycle()); + } + } + + private void startContext(Context ctx) { + ClassLoader appLoader = ctx.getLoader().getClassLoader(); + if (appLoader.getResource("sca.module") == null) { + return; + } + + log.info(sm.getString("context.configLoad", ctx.getName())); + try { + loadContext(ctx); + } catch (ConfigurationException e) { + log.error(sm.getString("context.configError"), e); + // todo mark application as unavailable + return; + } + + try { + moduleContext.publish(new ModuleStart(this)); + } catch (EventException e) { + log.error(sm.getString("context.moduleStartError"), e); + // todo unload module component from runtime + // todo mark application as unavailable + return; + } catch (RuntimeException e) { + log.error(sm.getString("context.unknownRuntimeException"), e); + // todo unload module component from runtime + throw e; + } + + // add a valve to this context's pipeline that will associate the request with the runtime + if (valve == null) { + valve = new TuscanyValve(moduleContext); + } else { + valve.setContext(moduleContext); + valve.setEnabled(true); + } + ctx.getPipeline().addValve(valve); + // add the RuntimeContext in as a servlet context parameter + ServletContext servletContext = ctx.getServletContext(); + servletContext.setAttribute(TUSCANY_RUNTIME_NAME, runtime); + servletContext.setAttribute(MODULE_COMPONENT_NAME, moduleContext); + } + + private void loadContext(Context ctx) throws ConfigurationException { + ResourceLoader resourceLoader = new ResourceLoaderImpl(ctx.getLoader().getClassLoader()); + ClassLoader oldCl = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); + try { + AssemblyContextImpl modelContext = new AssemblyContextImpl(modelFactory, modelLoader, resourceLoader, ctx.getName()); + + ModuleComponentConfigurationLoader loader = BootstrapHelper.getConfigurationLoader(runtime.getSystemContext(), modelContext); + + // Load the SCDL configuration of the application module + ModuleComponent moduleComponent = loader.loadModuleComponent(ctx.getName(), ctx.getPath()); + + // Register it under the root application context + CompositeContext rootContext = runtime.getRootContext(); + rootContext.registerModelObject(moduleComponent); + moduleContext = (CompositeContext) rootContext.getContext(moduleComponent.getName()); + //TODO remove the hack below + moduleContext.setAssemblyContext(modelContext); + } finally { + Thread.currentThread().setContextClassLoader(oldCl); + } + } + + private void stopContext(Context ctx) { + if (moduleContext != null) { + moduleContext.publish(new ModuleStop(this)); + } + CompositeContext rootContext = runtime.getRootContext(); + rootContext.removeContext(moduleContext.getName()); + valve.setEnabled(false); + //ctx.getPipeline().removeValve(valve); + //valve = null; + moduleContext.stop(); + moduleContext = null; + // todo unload module component from runtime + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyHost.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyHost.java new file mode 100644 index 0000000000..37984ef40d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyHost.java @@ -0,0 +1,185 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.tomcat; + +import javax.servlet.Servlet; + +import org.apache.catalina.Container; +import org.apache.catalina.Context; +import org.apache.catalina.LifecycleException; +import org.apache.catalina.Wrapper; +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.core.StandardHost; +import org.apache.catalina.util.StringManager; +import org.apache.tomcat.util.buf.MessageBytes; +import org.apache.tomcat.util.http.mapper.MappingData; + +import org.apache.tuscany.common.monitor.impl.NullMonitorFactory; +import org.apache.tuscany.core.builder.ContextFactoryBuilderRegistry; +import org.apache.tuscany.core.builder.impl.DefaultWireBuilder; +import org.apache.tuscany.core.client.BootstrapHelper; +import org.apache.tuscany.core.config.ConfigurationLoadException; +import org.apache.tuscany.core.config.ModuleComponentConfigurationLoader; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.SystemCompositeContext; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.runtime.RuntimeContext; +import org.apache.tuscany.core.runtime.RuntimeContextImpl; +import org.apache.tuscany.core.webapp.ServletHost; +import org.apache.tuscany.model.assembly.AssemblyContext; +import org.apache.tuscany.model.assembly.AssemblyFactory; +import org.apache.tuscany.model.assembly.ModuleComponent; +import org.apache.tuscany.model.assembly.loader.AssemblyModelLoader; + +/** + * A specialied Tomcat Host that extends the Standardhost implementation and adds SCA capabilities. + * <p/> + * As children are added, they are examined for the presence of SCA configuration + * information and if any is found then the web application is treated as an + * SCA Module defintion which is used to create a ModuleComponent. The name of the + * context is used as the name of the ModuleComponent and its context path is used + * as the URI. + * + * @version $Rev$ $Date$ + */ +@SuppressWarnings({"serial"}) +public class TuscanyHost extends StandardHost implements ServletHost { + private static final String SYSTEM_MODULE_COMPONENT = "org.apache.tuscany.core.system"; + + private static final StringManager sm = StringManager.getManager("org.apache.tuscany.tomcat"); + + private RuntimeContext runtime; + private AssemblyModelLoader modelLoader; + private AssemblyFactory modelFactory; + + public synchronized void start() throws LifecycleException { + startRuntime(); + super.start(); + } + + public synchronized void stop() throws LifecycleException { + super.stop(); + stopRuntime(); + } + + private void startRuntime() { + // Create an assembly model context + AssemblyContext modelContext = BootstrapHelper.getModelContext(getClass().getClassLoader()); + modelFactory = modelContext.getAssemblyFactory(); + modelLoader = modelContext.getAssemblyLoader(); + + // Create and start the runtime + NullMonitorFactory monitorFactory = new NullMonitorFactory(); + ContextFactoryBuilderRegistry builderRegistry = BootstrapHelper.bootstrapContextFactoryBuilders(monitorFactory); + runtime = new RuntimeContextImpl(monitorFactory, builderRegistry, new DefaultWireBuilder()); + runtime.start(); + + // Load and start the system configuration + try { + SystemCompositeContext systemContext = runtime.getSystemContext(); + BootstrapHelper.bootstrapStaxLoader(systemContext, modelContext); + ModuleComponentConfigurationLoader loader = BootstrapHelper.getConfigurationLoader(systemContext, modelContext); + ModuleComponent systemModuleComponent = loader.loadSystemModuleComponent(SYSTEM_MODULE_COMPONENT, SYSTEM_MODULE_COMPONENT); + CompositeContext context = BootstrapHelper.registerModule(systemContext, systemModuleComponent); + context.publish(new ModuleStart(this)); + + TomcatHost host = systemContext.resolveInstance(TomcatHost.class); + host.setHost(this); + } catch (ConfigurationLoadException e) { + getLogger().warn(sm.getString("runtime.loadSystemFailed", e.getResourceURI()), e); + return; + } catch (Exception e) { + getLogger().warn(sm.getString("runtime.registerSystemFailed"), e); + runtime.stop(); + runtime = null; + return; + } + + getLogger().info(sm.getString("runtime.started")); + } + + private void stopRuntime() { + if (runtime == null) { + return; + } + runtime.getSystemContext().publish(new ModuleStop(this)); + + runtime.stop(); + runtime = null; + getLogger().info(sm.getString("runtime.stopped")); + } + + public synchronized void addChild(Container child) { + if (!(child instanceof StandardContext)) { + throw new IllegalArgumentException(sm.getString("tuscanyHost.notContext")); + } + StandardContext ctx = (StandardContext) child; + ctx.addLifecycleListener(new TuscanyContextListener(runtime, modelFactory, modelLoader)); + super.addChild(child); + } + + public String toString() { + StringBuilder sb = new StringBuilder(132); + if (getParent() != null) { + sb.append(getParent().toString()).append('.'); + } + sb.append("TuscanyHost[").append(getName()).append(']'); + return (sb.toString()); + } + + public void registerMapping(String mapping, Servlet servlet) { + Context ctx = map(mapping); + if (ctx == null) { + throw new UnsupportedOperationException("Cannot find context for mapping " + mapping); + } + String contextPath = ctx.getPath(); + assert mapping.startsWith(contextPath); + mapping = mapping.substring(contextPath.length()); + Wrapper wrapper = new TuscanyWrapper(servlet); + wrapper.setName(mapping.substring(0,mapping.lastIndexOf('/'))); + ctx.addChild(wrapper); + wrapper.addMapping(mapping); + ctx.getMapper().addWrapper(mapping, wrapper, false); + } + + public void unregisterMapping(String mapping) { + } + + public Servlet getMapping(String mapping) { + Context ctx = map(mapping); + if (ctx == null) { + return null; + } + String contextPath = ctx.getPath(); + assert mapping.startsWith(contextPath); + + MappingData mappingData = new MappingData(); + MessageBytes mb = MessageBytes.newInstance(); + mb.setString(mapping); + try { + ctx.getMapper().map(mb, mappingData); + } catch (Exception e) { + return null; + } + if (!(mappingData.wrapper instanceof TuscanyWrapper)) { + return null; + } + TuscanyWrapper wrapper = (TuscanyWrapper) mappingData.wrapper; + return wrapper.getServlet(); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyValve.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyValve.java new file mode 100644 index 0000000000..352a04bde0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyValve.java @@ -0,0 +1,130 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.tomcat; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpSession; + +import org.apache.catalina.connector.Request; +import org.apache.catalina.connector.Response; +import org.apache.catalina.valves.ValveBase; +import org.osoa.sca.CurrentModuleContext; +import org.osoa.sca.ModuleContext; +import org.osoa.sca.SCA; + +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.event.HttpSessionBound; +import org.apache.tuscany.core.context.event.RequestStart; +import org.apache.tuscany.core.context.event.RequestEnd; +import org.apache.tuscany.core.webapp.LazyHTTPSessionId; + +/** + * Valve that can be added to a pipeline to automatically set the SCA environment as each request is processed. + * + * @version $Rev$ $Date$ + */ +public class TuscanyValve extends ValveBase { + /** + * Name of the note that contains the request id + */ + private static final String REQUEST_ID = "org.apache.tuscany.tomcat.REQUEST_ID"; + + private static final ContextBinder BINDER = new ContextBinder(); + + private CompositeContext moduleComponentContext; + + private boolean enabled = true; + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public void setContext(CompositeContext moduleComponentContext) { + this.moduleComponentContext = moduleComponentContext; + } + + public TuscanyValve(CompositeContext moduleComponentContext) { + this.moduleComponentContext = moduleComponentContext; + } + + public void invoke(Request request, Response response) throws IOException, ServletException { + if (!enabled){ + return; + } + Object oldRequestId = request.getNote(REQUEST_ID); + ModuleContext oldContext = CurrentModuleContext.getContext(); + // bind the current module context to the thread for use by CurrentModuleContext + BINDER.setContext((ModuleContext) moduleComponentContext); + try { + if (oldRequestId != null) { + // the request has already been started, just invoke the next valve + next.invoke(request, response); + } else { + // tell the runtime a new request is starting + Object requestId = new Object(); + + HttpSession session = request.getSession(false); + if (session != null) { + // A session is already active + moduleComponentContext .publish(new HttpSessionBound(this,session)); + } else { + // Create a lazy wrapper since a session is not yet active + moduleComponentContext.publish(new HttpSessionBound(this, new LazyHTTPSessionId(request))); + } + + try { + moduleComponentContext.publish(new RequestStart(this, requestId)); + } catch (Exception e) { + throw new ServletException(e.getMessage(), e); + } + request.setNote(REQUEST_ID, requestId); + + try { + // invoke the next valve in the pipeline + next.invoke(request, response); + } finally { + // notify the runtime the request is ending + request.removeNote(REQUEST_ID); + try { + moduleComponentContext.publish(new RequestEnd(this, requestId)); + } catch (Exception e) { + // the application already did its work, log and ignore + // todo log this exception + } + } + } + } finally { + // restore the previous module context onto the thread + BINDER.setContext(oldContext); + } + } + + private static class ContextBinder extends SCA { + public void setContext(ModuleContext context) { + setModuleContext(context); + } + + public void start() { + throw new AssertionError(); + } + + public void stop() { + throw new AssertionError(); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyWrapper.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyWrapper.java new file mode 100644 index 0000000000..de53ad4d45 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/java/org/apache/tuscany/tomcat/TuscanyWrapper.java @@ -0,0 +1,43 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.tomcat; + +import javax.servlet.Servlet; + +import org.apache.catalina.core.StandardWrapper; + +/** + * @version $Rev$ $Date$ + */ +public class TuscanyWrapper extends StandardWrapper { + private static final long serialVersionUID = 1L; + + private final Servlet servlet; + + public TuscanyWrapper(Servlet servlet) { + super(); + this.servlet = servlet; + } + + public synchronized Servlet loadServlet() { + return servlet; + } + + public Servlet getServlet() { + return servlet; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/resources/org/apache/tuscany/tomcat/LocalStrings.properties b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/resources/org/apache/tuscany/tomcat/LocalStrings.properties new file mode 100644 index 0000000000..43fc99958e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/resources/org/apache/tuscany/tomcat/LocalStrings.properties @@ -0,0 +1,25 @@ +# Copyright (c) 2006 The Apache Software Foundation or its licensors, as applicable. +# +# Licensed 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. + +runtime.loadSystemFailed = Error loading system configuration from: {0} +runtime.registerSystemFailed = Error registering system configuration: +runtime.started = Started Tuscany runtime +runtime.stopped = Stopped Tuscany runtime + +tuscanyHost.notContext = Child of a TuscanyHost must be a StandardContext +context.configLoad = Loading SCA configuration for application {0} + +context.configError = Error loading the SCA configuration +context.moduleStartError = Error starting SCA module +context.unknownRuntimeException = Unexpected RuntimeException diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/resources/org/apache/tuscany/tomcat/Messages.properties b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/resources/org/apache/tuscany/tomcat/Messages.properties new file mode 100644 index 0000000000..f926ca6488 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/resources/org/apache/tuscany/tomcat/Messages.properties @@ -0,0 +1,39 @@ +# Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. +# +# Licensed 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. +# ==================================================================== +# To code developer: +# Do NOT change the properties between this line and the +# "%%% END OF TRANSLATED PROPERTIES %%%" line. +# Make a new property name, append to the end of the file and change +# the code to use the new property. +# ==================================================================== + +# ===================================================================== +# %%% END OF TRANSLATED PROPERTIES %%% +# ===================================================================== +# NLS_MESSAGEFORMAT_ALL + +SCA_STARTING =Tuscany: Starting SCA runtime. +SCA_STARTED =Tuscany: Started SCA runtime. +SCA_STOPPING =Tuscany: Stopping SCA runtime. +SCA_STOPPED =Tuscany: Stopped SCA runtime. +SCA_STARTING_MODULE =Tuscany: Starting SCA module component {0}. +SCA_LOADED_MODULE =Tuscany: Loaded SCA module {0}. +SCA_STARTED_MODULE =Tuscany: Started SCA module component {0}. +SCA_STOPPING_MODULE =Tuscany: Stopping SCA module component {0}. +SCA_STOPPED_MODULE =Tuscany: Stopped SCA module component {0}. +SCA_START_MODULE_FAILED =Tuscany: Error starting SCA module component {0}: {1}. +SCA_STOP_MODULE_FAILED =Tuscany: Error stopping SCA module component {0}: {1}. +SCA_START_WEBAPP_FAILED =Tuscany: Error starting Web application {0}: {1}. +SCA_STOP_WEBAPP_FAILED =Tuscany: Error stopping Web application {0}: {1}.
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/resources/system.fragment b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/resources/system.fragment new file mode 100644 index 0000000000..e379e1d90b --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/main/resources/system.fragment @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="ASCII"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<moduleFragment xmlns="http://www.osoa.org/xmlns/sca/0.9" + xmlns:tuscany="http://org.apache.tuscany/xmlns/system/0.9" + name="org.apache.tuscany.tomcat"> + + <entryPoint name="org.apache.tuscany.tomcat.TomcatHost"> + <interface.java interface="org.apache.tuscany.tomcat.TomcatHost"/> + <tuscany:binding.system/> + <reference>TomcatHost</reference> + </entryPoint> + + <component name="TomcatHost"> + <tuscany:implementation.system class="org.apache.tuscany.tomcat.TomcatHost"/> + </component> + +</moduleFragment> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/AbstractTomcatTest.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/AbstractTomcatTest.java new file mode 100644 index 0000000000..babe25adc7 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/AbstractTomcatTest.java @@ -0,0 +1,298 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.tomcat.integration; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; +import java.util.Vector; + +import javax.servlet.ServletInputStream; +import javax.servlet.ServletOutputStream; + +import junit.framework.TestCase; + +import org.apache.catalina.Globals; +import org.apache.catalina.Host; +import org.apache.catalina.connector.Connector; +import org.apache.catalina.connector.Request; +import org.apache.catalina.connector.Response; +import org.apache.catalina.core.ApplicationFilterFactory; +import org.apache.catalina.core.StandardEngine; + +/** + * @version $Rev$ $Date$ + */ +public class AbstractTomcatTest extends TestCase { + protected Map<String, Class<?>> classes; + protected Host host; + protected MockRequest request; + protected MockResponse response; + protected StandardEngine engine; + + protected void setUp() throws Exception { + super.setUp(); + classes = new HashMap<String, Class<?>>(); + classes.put(TestServlet.class.getName(), TestServlet.class); + classes.put(HelloWorldService.class.getName(), HelloWorldService.class); + classes.put(HelloWorldImpl.class.getName(), HelloWorldImpl.class); + } + + protected void setupTomcat(File baseDir, Host host) throws Exception { + File appBase = new File(baseDir, "webapps").getCanonicalFile(); + + // Configure a Tomcat Engine + engine = new StandardEngine(); + engine.setName("Catalina"); + engine.setDefaultHost("localhost"); + engine.setBaseDir(baseDir.getAbsolutePath()); + + this.host = host; + host.setName("localhost"); + host.setAppBase(appBase.getAbsolutePath()); + engine.addChild(host); + + // buildSource a empty request/response + Connector connector = new Connector("HTTP/1.1"); + request = new MockRequest(); + request.setConnector(connector); + response = new MockResponse(); + request.setResponse(response); + request.setMethod("POST"); + request.setScheme("http"); + } + + public static class MockRequest extends Request { + private String method; + private String scheme; + private String requestURI; + private String contentType; + private Map<String,String> headers = new HashMap<String,String>(); + private ServletInputStream inputStream; + + public void setScheme(String scheme) { + this.scheme = scheme; + } + + public void setMethod(String method) { + this.method = method; + } + + public void setRequestURI(String requestURI) { + this.requestURI = requestURI; + } + + public String getScheme() { + return scheme; + } + + public String getMethod() { + return method; + } + + public int getServerPort() { + return 80; + } + + public String getServerName() { + return "localhost"; + } + + public String getRequestURI() { + return requestURI; + } + + public void setAttribute(String name, Object value) { + if (name.startsWith("org.apache.tomcat.")) { + return; + } + super.setAttribute(name, value); + } + + public Object getAttribute(String name) { + if (name.equals(Globals.DISPATCHER_TYPE_ATTR)) { + return (dispatcherType == null) + ? ApplicationFilterFactory.REQUEST_INTEGER + : dispatcherType; + } else if (name.equals(Globals.DISPATCHER_REQUEST_PATH_ATTR)) { + return (requestDispatcherPath == null) + ? getRequestPathMB().toString() + : requestDispatcherPath.toString(); + } + + return attributes.get(name); + } + + public String getHeader(String name) { + return headers.get(name); + } + + public Enumeration getHeaderNames() { + return Collections.enumeration(headers.keySet()); + } + + public void setContentType(String contentType) { + this.contentType = contentType; + } + + public String getContentType() { + return contentType; + } + + public ServletInputStream getInputStream() throws IOException { + return inputStream; + } + + public InputStream getStream() { + return inputStream; + } + + public void setStream(ServletInputStream stream) { + inputStream = stream; + } + + @Override + public String getRemoteHost() { + + return "locahost"; + } + + @Override + public int getRemotePort() { + + return 1080; + } + + @Override + public String getRemoteAddr() { + + return "127.0.0.1"; + } + + @Override + public Enumeration getParameterNames() { + return new Vector().elements(); + } + + @Override + public String getParameter(String param) { + if ("wsdl".equals(param)) { + return ""; + } else { + return null; + } + } + } + + public static class MockResponse extends Response { + private boolean suspended; + private String contentType; + private int status = 200; + private Map<String, String> headers = new HashMap<String, String>(); + private MockOutputStream outputStream = new MockOutputStream(); + + public boolean isCommitted() { + return false; + } + + public boolean isAppCommitted() { + return false; + } + + public void sendAcknowledgement() { + } + + public void setSuspended(boolean suspended) { + this.suspended = suspended; + } + + public boolean isSuspended() { + return suspended; + } + + public void setStatus(int status, String message) { + this.status = status; + } + + public int getStatus() { + return status; + } + + public void reset() { + } + + public void addHeader(String name, String value) { + headers.put(name, value); + } + + public String[] getHeaderNames() { + return (String[]) headers.keySet().toArray(new String[headers.size()]); + } + + public String getContentType() { + return contentType; + } + + public void setContentType(String contentType) { + this.contentType = contentType; + } + + public OutputStream getStream() { + return outputStream; + } + + public ServletOutputStream getOutputStream() throws IOException { + return outputStream; + } + } + + public static class MockInputStream extends ServletInputStream { + private final byte[] bytes; + private int index; + + public MockInputStream(byte[] bytes) { + this.bytes = bytes; + } + + public int read() throws IOException { + if (index == bytes.length) { + return -1; + } + else { + return bytes[index++]; + } + } + } + + public static class MockOutputStream extends ServletOutputStream { + private ByteArrayOutputStream os = new ByteArrayOutputStream(); + + public void write(int b) throws IOException { + os.write(b); + } + + public String toString() { + return os.toString(); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/HelloWorldImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/HelloWorldImpl.java new file mode 100644 index 0000000000..4db61fa58c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/HelloWorldImpl.java @@ -0,0 +1,29 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.tomcat.integration; + +import org.osoa.sca.annotations.Service; + +/** + * @version $Rev$ $Date$ + */ +@Service(HelloWorldService.class) +public class HelloWorldImpl implements HelloWorldService { + public String getGreetings(String name) { + return "Hello " + name; + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/HelloWorldService.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/HelloWorldService.java new file mode 100644 index 0000000000..a9b78cadf4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/HelloWorldService.java @@ -0,0 +1,24 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.tomcat.integration; + +/** + * @version $Rev$ $Date$ + */ +public interface HelloWorldService { + public String getGreetings(String name); +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TestClassLoader.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TestClassLoader.java new file mode 100644 index 0000000000..486fec5bd4 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TestClassLoader.java @@ -0,0 +1,51 @@ +/** + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.tomcat.integration; + +import java.util.Map; +import java.net.URL; + +import org.apache.catalina.loader.WebappClassLoader; + +/** + * A version of Tomcat's application classloader that only allows certain classes to be loaded. + * This is used in the integration tests to make sure that no Tuscany classes are exposed to the + * application except the ones needed to run the tests. + * + * @version $Rev$ $Date$ + */ +@SuppressWarnings({"CustomClassloader"}) +public class TestClassLoader extends WebappClassLoader { + private final Map<String, Class<?>> classes; + + public TestClassLoader(Map<String, Class<?>> classes, URL url, ClassLoader parent) { + super(parent); + this.classes = classes; + addURL(url); + } + + public Class<?> findClass(String name) throws ClassNotFoundException { + Class<?> clazz = classes.get(name); + if (clazz != null) { + return clazz; + } + if (name.startsWith("java.") || name.startsWith("javax.") || name.startsWith("org.osoa.")) { + return super.findClass(name); + } + throw new ClassNotFoundException(name); + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TestServlet.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TestServlet.java new file mode 100644 index 0000000000..2cd8ce06a2 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TestServlet.java @@ -0,0 +1,60 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.tomcat.integration; + +import java.io.IOException; +import javax.servlet.GenericServlet; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +import org.osoa.sca.CurrentModuleContext; +import org.osoa.sca.ModuleContext; + +/** + * @version $Rev$ $Date$ + */ +@SuppressWarnings({"serial"}) +public class TestServlet extends GenericServlet { + + public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { + Object runtime = getServletContext().getAttribute("org.apache.tuscany.core.runtime.RuntimeContext"); + if (runtime == null || "org.apache.tuscany.core.runtime.RuntimeContext".equals(runtime.getClass().getName())) { + throw new ServletException("Runtime not bound to org.apache.tuscany.core.runtime.RuntimeContext"); + } + + Object module = getServletContext().getAttribute("org.apache.tuscany.core.webapp.ModuleComponentContext"); + if (module == null || "org.apache.tuscany.core.context.CompositeContext".equals(module.getClass().getName())) { + throw new ServletException("Module composite not bound to org.apache.tuscany.core.webapp.ModuleComponentContext"); + } + + ModuleContext moduleContext = CurrentModuleContext.getContext(); + if (moduleContext == null) { + throw new ServletException("No module context returned"); + } + String name = moduleContext.getName(); + if (!"/testContext".equals(name)) { + throw new ServletException("Invalid module context name: " + name); + } + + HelloWorldService helloService = (HelloWorldService) moduleContext.locateService("HelloWorld"); + String greetings = helloService.getGreetings("World"); + if (!"Hello World".equals(greetings)) { + throw new ServletException("Serivce returned " + greetings); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TomcatIntegrationTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TomcatIntegrationTestCase.java new file mode 100644 index 0000000000..75bd85cf65 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TomcatIntegrationTestCase.java @@ -0,0 +1,200 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.tomcat.integration; + +import org.apache.catalina.Valve; +import org.apache.catalina.Loader; +import org.apache.catalina.Wrapper; +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.core.StandardWrapper; +import org.apache.catalina.startup.ContextConfig; +import org.apache.tomcat.util.buf.MessageBytes; +import org.apache.tomcat.util.http.mapper.MappingData; + +import org.apache.tuscany.tomcat.TuscanyHost; +import org.apache.tuscany.tomcat.TuscanyValve; +import org.apache.tuscany.tomcat.ContainerLoader; + +import java.io.File; +import java.io.IOException; +import javax.servlet.Servlet; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +/** + * @version $Rev$ $Date$ + */ +public class TomcatIntegrationTestCase extends AbstractTomcatTest { + protected File app1; + private Loader loader; + private StandardContext ctx; + + public void testComponentIntegration() throws Exception { + // define our test servlet + StandardWrapper wrapper = new StandardWrapper(); + wrapper.setServletClass(TestServlet.class.getName()); + ctx.addChild(wrapper); + + host.addChild(ctx); + boolean found = false; + for (Valve valve: ctx.getPipeline().getValves()) { + if (valve instanceof TuscanyValve) { + found = true; + break; + } + } + assertTrue("TuscanyValve not in pipeline", found); + + request.setContext(ctx); + request.setWrapper(wrapper); + host.invoke(request, response); + + host.removeChild(ctx); + } + + public void testWebServiceIntegration() throws Exception { + host.addChild(ctx); + + Wrapper wrapper = (Wrapper) ctx.findChild("/services"); + assertNotNull("No webservice wrapper present", wrapper); + request.setContext(ctx); + request.setRequestURI("/services/HelloWorldService"); + request.setWrapper(wrapper); + request.setContentType("text/xml"); + String xml = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:q0=\"http://helloworldaxis.samples.tuscany.apache.org\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" + + "<soapenv:Body>\n" + + "<q0:getGreetings>\n" + + "<q0:in0>World</q0:in0>\n" + + "</q0:getGreetings>\n" + + "</soapenv:Body>\n" + + "</soapenv:Envelope>\n"; + request.setStream(new MockInputStream(xml.getBytes("UTF-8"))); + host.invoke(request, response); + xml = "<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Header /><soapenv:Body><helloworldaxis:getGreetingsResponse xmlns:helloworldaxis=\"http://helloworldaxis.samples.tuscany.apache.org\">\n" + + " <helloworldaxis:getGreetingsReturn>Hello World</helloworldaxis:getGreetingsReturn>\n" + + "</helloworldaxis:getGreetingsResponse></soapenv:Body></soapenv:Envelope>"; + assertEquals(xml, response.getOutputStream().toString()); + + assertEquals(200, response.getStatus()); + host.removeChild(ctx); + } + + /** + * Test ?WSDL works + */ + public void testWebServiceIntegrationWSDL() throws Exception { +// ?WSDL doesn't work right now: TUSCANY-61 +// Wrapper wrapper = (Wrapper) ctx.findChild("/services"); +// assertNotNull("No webservice wrapper present", wrapper); +// request.setContext(ctx); +// request.setRequestURI("/services/HelloWorldService"); +// request.setMethod("GET"); +// +// request.setWrapper(wrapper); +// +// host.invoke(request, response); +// +// assertEquals(200, response.getStatus()); +// +// String s = response.getOutputStream().toString(); // would be better to validate with WSDl4J +// assertTrue(s.contains("<wsdl:service name=\"HelloWorldServiceImplService\">")); +// +// host.removeChild(ctx); + } + + public void testServletMapping() throws Exception { + TuscanyHost tuscanyHost = (TuscanyHost) host; + host.addChild(ctx); + + MockServlet servlet = new MockServlet(); + tuscanyHost.registerMapping("/testContext/magicServlet", servlet); + assertSame(ctx, host.map("/testContext/magicServlet")); + MessageBytes uri = MessageBytes.newInstance(); + uri.setString("/testContext/magicServlet"); + MappingData mappingData = new MappingData(); + ctx.getMapper().map(uri, mappingData); + assertTrue(mappingData.requestPath.equals("/magicServlet")); + + assertSame(servlet, tuscanyHost.getMapping("/testContext/magicServlet")); + host.removeChild(ctx); + } + + public void testServletMappingWithWildard() throws Exception { + TuscanyHost tuscanyHost = (TuscanyHost) host; + host.addChild(ctx); + + MockServlet servlet = new MockServlet(); + tuscanyHost.registerMapping("/testContext/magicServlet/*", servlet); + assertSame(ctx, host.map("/testContext/magicServlet/foo")); + MessageBytes uri = MessageBytes.newInstance(); + uri.setString("/testContext/magicServlet/foo"); + MappingData mappingData = new MappingData(); + mappingData.recycle(); + ctx.getMapper().map(uri, mappingData); + assertTrue(mappingData.requestPath.equals("/magicServlet/foo")); + + assertSame(servlet, tuscanyHost.getMapping("/testContext/magicServlet/bar")); + host.removeChild(ctx); + } + + protected void setUp() throws Exception { + super.setUp(); + app1 = new File(getClass().getResource("/app1").toURI()); + File baseDir = new File(app1, "../../tomcat").getCanonicalFile(); + setupTomcat(baseDir, new TuscanyHost()); + engine.start(); + + TestClassLoader cl = new TestClassLoader(classes, new File(app1, "WEB-INF/classes").toURL(), getClass().getClassLoader()); + cl.start(); + loader = new ContainerLoader(cl); + + // create the webapp Context + ctx = new StandardContext(); + ctx.addLifecycleListener(new ContextConfig()); + ctx.setName("/testContext"); + ctx.setDocBase(app1.getAbsolutePath()); + ctx.setLoader(loader); + } + + protected void tearDown() throws Exception { + engine.stop(); + super.tearDown(); + } + + public static class MockServlet implements Servlet { + public void init(ServletConfig servletConfig) throws ServletException { + throw new UnsupportedOperationException(); + } + + public ServletConfig getServletConfig() { + throw new UnsupportedOperationException(); + } + + public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { + } + + public String getServletInfo() { + throw new UnsupportedOperationException(); + } + + public void destroy() { + throw new UnsupportedOperationException(); + } + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TomcatStandaloneTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TomcatStandaloneTestCase.java new file mode 100644 index 0000000000..1aeb966625 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/java/org/apache/tuscany/tomcat/integration/TomcatStandaloneTestCase.java @@ -0,0 +1,79 @@ +/** + * + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.tomcat.integration; + +import java.io.File; + +import org.apache.catalina.Valve; +import org.apache.catalina.Wrapper; +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.core.StandardHost; +import org.apache.catalina.startup.ContextConfig; + +import org.apache.tuscany.tomcat.TuscanyValve; + +/** + * @version $Rev$ $Date$ + */ +@SuppressWarnings({"ClassLoader2Instantiation"}) +public class TomcatStandaloneTestCase extends AbstractTomcatTest { + protected File app2; + + public void testRuntimeIntegration() throws Exception { + StandardContext ctx = new StandardContext(); + + // caution: this sets the parent of the webapp loader to the test classloader so it can find TestServlet + // anything that relies on the TCCL may not work correctly + ClassLoader cl = TestServlet.class.getClassLoader(); + ctx.setParentClassLoader(cl); + + ctx.addLifecycleListener(new ContextConfig()); + ctx.setName("/testContext"); + ctx.setDocBase(app2.getAbsolutePath()); + +// Doesn't work, see TUSCANY-328 +// host.addChild(ctx); +// boolean found = false; +// for (Valve valve: ctx.getPipeline().getValves()) { +// if (valve instanceof TuscanyValve) { +// found = true; +// break; +// } +// } +// assertFalse("TuscanyValve in pipeline", found); + +// request.setContext(ctx); +// request.setWrapper((Wrapper) ctx.findChild("TestServlet")); +// host.invoke(request, response); + +// host.removeChild(ctx); + } + + protected void setUp() throws Exception { + super.setUp(); + app2 = new File(getClass().getResource("/app2").toURI()); + File baseDir = new File(app2, "../../tomcat").getCanonicalFile(); + setupTomcat(baseDir, new StandardHost()); + engine.start(); + } + + protected void tearDown() throws Exception { + engine.stop(); + super.tearDown(); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app1/WEB-INF/axis2.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app1/WEB-INF/axis2.xml new file mode 100644 index 0000000000..07566475de --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app1/WEB-INF/axis2.xml @@ -0,0 +1,183 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + --> +<axisconfig name="AxisJava2.0"> + <!-- ================================================= --> + <!-- Parameters --> + <!-- ================================================= --> + <parameter name="hotdeployment" locked="false">false</parameter> + <parameter name="hotupdate" locked="false">false</parameter> + <parameter name="enableMTOM" locked="false">false</parameter> + <!-- Uncomment this to enable REST support --> + <!-- <parameter name="enableREST" locked="false">true</parameter>--> + + + <parameter name="userName" locked="false">admin</parameter> + <parameter name="password" locked="false">axis2</parameter> + + <parameter name="seralizeLocation" locked="false">.</parameter> + <hostConfiguration> + <ip>127.0.0.1</ip> + <port>5555</port> + </hostConfiguration> + + + <!--if you want to extract the service archive file and work with that please uncomment this--> + <!--else , it wont extract archive file or does not take into consideration if someone drop--> + <!--exploded directory into /service directory--> + <!--<parameter name="extractServiceArchive" locked="false">true</parameter>--> + + + <!-- The way of adding listener to the system--> + <!-- <listener class="org.apache.axis2.ObserverIMPL">--> + <!-- <parameter name="RSS_URL" locked="false">http://127.0.0.1/rss</parameter>--> + <!-- </listener>--> + + <!-- ================================================= --> + <!-- Message Receivers --> + <!-- ================================================= --> + <!--This is the Deafult Message Receiver for the system , if you want to have MessageReceivers for --> + <!--all the other MEP implement it and add the correct entry to here , so that you can refer from--> + <!--any operation --> + <!--Note : You can ovride this for particular service by adding the same element with your requirement--> + <messageReceivers> + <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" + class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/> + <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" + class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/> + </messageReceivers> + <!-- ================================================= --> + <!-- Transport Ins --> + <!-- ================================================= --> + <transportReceiver name="http" class="org.apache.axis2.transport.http.SimpleHTTPServer"> + <parameter name="port" locked="false">6060</parameter> + </transportReceiver> + + <!-- Uncomment this one with the appropriate papameters to enable the SMTP transport Receiver + <transportReceiver name="mail" class="org.apache.axis2.transport.mail.SimpleMailListener"> + <parameter name="transport.mail.pop3.host" locked="false">127.0.0.1</parameter> + <parameter name="transport.mail.pop3.user" locked="false">axis2</parameter> + <parameter name="transport.mail.pop3.password" locked="false">axis2</parameter> + <parameter name="transport.mail.pop3.port" locked="false">110</parameter> + <parameter name="transport.mail.replyToAddress" locked="false">axis2@127.0.0.1</parameter> + </transportReceiver> --> + + <!--REMOVED FOR TUSCANY transportReceiver name="tcp" class="org.apache.axis2.transport.tcp.TCPServer"> + <parameter name="port" locked="false">6060</parameter> + </transportReceiver --> + + <!--REMOVED FOR TUSCANY transportReceiver name="jms" class="org.apache.axis2.transport.jms.SimpleJMSListener"> + <parameter name="transport.jms.Destination" locked="false">dynamicQueues/FOO</parameter> + <parameter name="java.naming.factory.initial" locked="false"> + org.activemq.jndi.ActiveMQInitialContextFactory</parameter> + <parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter> + </transportReceiver> + --> + + <!-- ================================================= --> + <!-- Transport Outs --> + <!-- ================================================= --> + + <!--REMOVED FOR TUSCANY transportSender name="tcp" class="org.apache.axis2.transport.tcp.TCPTransportSender"/> --> + <transportSender name="local" class="org.apache.axis2.transport.local.LocalTransportSender"/> + <!--REMOVED FOR TUSCANY transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender"/> --> + <transportSender name="http" class="org.apache.axis2.transport.http.CommonsHTTPTransportSender"> + <parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter> + <parameter name="Transfer-Encoding" locked="false">chunked</parameter> + </transportSender> + <transportSender name="https" + class="org.apache.axis2.transport.http.CommonsHTTPTransportSender"> + <parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter> + <parameter name="Transfer-Encoding" locked="false">chunked</parameter> + </transportSender> + + <!-- Uncomment this one with the appropriate papameters to enable the SMTP transport Receiver + <transportSender name="mailto" class="org.apache.axis2.transport.mail.MailTransportSender"> + <parameter name="transport.mail.smtp.host" locked="false">127.0.0.1</parameter> + <parameter name="transport.mail.smtp.user" locked="false">axis2</parameter> + <parameter name="transport.mail.smtp.password" locked="false">axis2</parameter> + <parameter name="transport.mail.smtp.port" locked="false">25</parameter> + </transportSender> + --> + + <!-- ================================================= --> + <!-- Global Modules --> + <!-- ================================================= --> + <!-- Comment this to disable Addressing --> + <!--REMOVED FOR TUSCANY module ref="addressing"/> --> + + + <!--Configuring module , providing parameters for modules whether they refer or not--> + <!--<moduleConfig name="addressing">--> + <!--<parameter name="addressingPara" locked="false">N/A</parameter>--> + <!--</moduleConfig>--> + + <!-- ================================================= --> + <!-- Phases --> + <!-- ================================================= --> + <phaseOrder type="inflow"> + <!-- System pre defined phases --> + <phase name="TransportIn"/> + <phase name="PreDispatch"/> + <phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase"> + <handler name="AddressingBasedDispatcher" + class="org.apache.axis2.engine.AddressingBasedDispatcher"> + <order phase="Dispatch"/> + </handler> + + <handler name="RequestURIBasedDispatcher" + class="org.apache.axis2.engine.RequestURIBasedDispatcher"> + <order phase="Dispatch"/> + </handler> + + <handler name="SOAPActionBasedDispatcher" + class="org.apache.axis2.engine.SOAPActionBasedDispatcher"> + <order phase="Dispatch"/> + </handler> + + <handler name="SOAPMessageBodyBasedDispatcher" + class="org.apache.axis2.engine.SOAPMessageBodyBasedDispatcher"> + <order phase="Dispatch"/> + </handler> + <handler name="InstanceDispatcher" + class="org.apache.axis2.engine.InstanceDispatcher"> + <order phase="PostDispatch"/> + </handler> + </phase> + <!-- System pre defined phases --> + <!-- After Postdispatch phase module author or or service author can add any phase he want --> + <phase name="userphase1"/> + </phaseOrder> + <phaseOrder type="outflow"> + <!-- user can add his own phases to this area --> + <phase name="userphase1"/> + <!--system predefined phase--> + <!--these phase will run irrespective of the service--> + <phase name="PolicyDetermination"/> + <phase name="MessageOut"/> + </phaseOrder> + <phaseOrder type="INfaultflow"> + <!-- user can add his own phases to this area --> + <phase name="userphase1"/> + </phaseOrder> + <phaseOrder type="Outfaultflow"> + <!-- user can add his own phases to this area --> + <phase name="userphase1"/> + <phase name="PolicyDetermination"/> + <phase name="MessageOut"/> + </phaseOrder> +</axisconfig> + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app1/WEB-INF/classes/sca.module b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app1/WEB-INF/classes/sca.module new file mode 100644 index 0000000000..4d19c4d192 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app1/WEB-INF/classes/sca.module @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9" + name="testModule"> + + <import.sdo wsdlLocation="wsdl/helloworld.wsdl"/> + <import.wsdl wsdlLocation="wsdl/helloworld.wsdl"/> + + <entryPoint name="HelloWorldService"> + <interface.wsdl interface="http://helloworldaxis.samples.tuscany.apache.org#wsdl.interface(HelloWorldServiceImpl)"/> + <binding.ws port="http://helloworldaxis.samples.tuscany.apache.org#wsdl.endpoint(HelloWorldServiceImplService/helloworld)"/> + <reference>HelloWorld/HelloWorldService</reference> + </entryPoint> + + <component name="HelloWorld"> + <implementation.java class="org.apache.tuscany.tomcat.integration.HelloWorldImpl"/> + </component> + +</module> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app1/WEB-INF/classes/wsdl/helloworld.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app1/WEB-INF/classes/wsdl/helloworld.wsdl new file mode 100644 index 0000000000..3d299481e5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app1/WEB-INF/classes/wsdl/helloworld.wsdl @@ -0,0 +1,97 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<wsdl:definitions targetNamespace="http://helloworldaxis.samples.tuscany.apache.org" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://helloworldaxis.samples.tuscany.apache.org" xmlns:intf="http://helloworldaxis.samples.tuscany.apache.org" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="helloworld"> + <!--WSDL created by Apache Axis version: 1.2.1 +Built on Jun 14, 2005 (09:15:57 EDT)--> + <wsdl:types> + <schema elementFormDefault="qualified" targetNamespace="http://helloworldaxis.samples.tuscany.apache.org" xmlns="http://www.w3.org/2001/XMLSchema"> + <element name="getGreetings"> + <complexType> + <sequence> + <element name="in0" type="xsd:string"/> + </sequence> + </complexType> + </element> + <element name="getGreetingsResponse"> + <complexType> + <sequence> + <element name="getGreetingsReturn" type="xsd:string"/> + </sequence> + </complexType> + </element> + </schema> + </wsdl:types> + + <wsdl:message name="getGreetingsRequest"> + + <wsdl:part element="impl:getGreetings" name="parameters"/> + + </wsdl:message> + + <wsdl:message name="getGreetingsResponse"> + + <wsdl:part element="impl:getGreetingsResponse" name="parameters"/> + + </wsdl:message> + + <wsdl:portType name="HelloWorldServiceImpl"> + + <wsdl:operation name="getGreetings"> + + <wsdl:input message="impl:getGreetingsRequest" name="getGreetingsRequest"/> + + <wsdl:output message="impl:getGreetingsResponse" name="getGreetingsResponse"/> + + </wsdl:operation> + + </wsdl:portType> + + <wsdl:binding name="helloworldSoapBinding" type="impl:HelloWorldServiceImpl"> + + <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + + <wsdl:operation name="getGreetings"> + + <wsdlsoap:operation soapAction=""/> + + <wsdl:input name="getGreetingsRequest"> + + <wsdlsoap:body use="literal"/> + + </wsdl:input> + + <wsdl:output name="getGreetingsResponse"> + + <wsdlsoap:body use="literal"/> + + </wsdl:output> + + </wsdl:operation> + + </wsdl:binding> + + <wsdl:service name="HelloWorldServiceImplService"> + + <wsdl:port binding="impl:helloworldSoapBinding" name="helloworld"> + + <wsdlsoap:address location="http://localhost:8080/sample-helloworldws/services/HelloWorldService"/> + + </wsdl:port> + + </wsdl:service> + +</wsdl:definitions> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app1/WEB-INF/web.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app1/WEB-INF/web.xml new file mode 100644 index 0000000000..f109ddf404 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app1/WEB-INF/web.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE web-app + PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" + "http://java.sun.com/dtd/web-app_2_3.dtd"> +<!-- + * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + --> +<web-app> +</web-app> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app1/index.html b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app1/index.html new file mode 100644 index 0000000000..71653b974f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app1/index.html @@ -0,0 +1,18 @@ +<html> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<body>Hello World</body> +</html> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app2/WEB-INF/classes/sca.module b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app2/WEB-INF/classes/sca.module new file mode 100644 index 0000000000..90ad0d44e0 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app2/WEB-INF/classes/sca.module @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<module xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ name="testModule">
+
+ <import.sdo wsdlLocation="wsdl/helloworld.wsdl"/>
+ <import.wsdl wsdlLocation="wsdl/helloworld.wsdl"/>
+
+ <entryPoint name="HelloWorldService">
+ <interface.wsdl interface="http://helloworldaxis.samples.tuscany.apache.org#wsdl.interface(HelloWorldServiceImpl)"/>
+ <binding.ws port="http://helloworldaxis.samples.tuscany.apache.org#wsdl.endpoint(HelloWorldServiceImplService/helloworld)"/>
+ <reference>HelloWorld/HelloWorldService</reference>
+ </entryPoint>
+
+ <component name="HelloWorld">
+ <implementation.java class="org.apache.tuscany.tomcat.integration.HelloWorldImpl"/>
+ </component>
+
+</module>
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app2/WEB-INF/classes/wsdl/helloworld.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app2/WEB-INF/classes/wsdl/helloworld.wsdl new file mode 100644 index 0000000000..3d299481e5 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app2/WEB-INF/classes/wsdl/helloworld.wsdl @@ -0,0 +1,97 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed 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. + --> +<wsdl:definitions targetNamespace="http://helloworldaxis.samples.tuscany.apache.org" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://helloworldaxis.samples.tuscany.apache.org" xmlns:intf="http://helloworldaxis.samples.tuscany.apache.org" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="helloworld"> + <!--WSDL created by Apache Axis version: 1.2.1 +Built on Jun 14, 2005 (09:15:57 EDT)--> + <wsdl:types> + <schema elementFormDefault="qualified" targetNamespace="http://helloworldaxis.samples.tuscany.apache.org" xmlns="http://www.w3.org/2001/XMLSchema"> + <element name="getGreetings"> + <complexType> + <sequence> + <element name="in0" type="xsd:string"/> + </sequence> + </complexType> + </element> + <element name="getGreetingsResponse"> + <complexType> + <sequence> + <element name="getGreetingsReturn" type="xsd:string"/> + </sequence> + </complexType> + </element> + </schema> + </wsdl:types> + + <wsdl:message name="getGreetingsRequest"> + + <wsdl:part element="impl:getGreetings" name="parameters"/> + + </wsdl:message> + + <wsdl:message name="getGreetingsResponse"> + + <wsdl:part element="impl:getGreetingsResponse" name="parameters"/> + + </wsdl:message> + + <wsdl:portType name="HelloWorldServiceImpl"> + + <wsdl:operation name="getGreetings"> + + <wsdl:input message="impl:getGreetingsRequest" name="getGreetingsRequest"/> + + <wsdl:output message="impl:getGreetingsResponse" name="getGreetingsResponse"/> + + </wsdl:operation> + + </wsdl:portType> + + <wsdl:binding name="helloworldSoapBinding" type="impl:HelloWorldServiceImpl"> + + <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + + <wsdl:operation name="getGreetings"> + + <wsdlsoap:operation soapAction=""/> + + <wsdl:input name="getGreetingsRequest"> + + <wsdlsoap:body use="literal"/> + + </wsdl:input> + + <wsdl:output name="getGreetingsResponse"> + + <wsdlsoap:body use="literal"/> + + </wsdl:output> + + </wsdl:operation> + + </wsdl:binding> + + <wsdl:service name="HelloWorldServiceImplService"> + + <wsdl:port binding="impl:helloworldSoapBinding" name="helloworld"> + + <wsdlsoap:address location="http://localhost:8080/sample-helloworldws/services/HelloWorldService"/> + + </wsdl:port> + + </wsdl:service> + +</wsdl:definitions> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app2/WEB-INF/web.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app2/WEB-INF/web.xml new file mode 100644 index 0000000000..9bd3882e81 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app2/WEB-INF/web.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE web-app + PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" + "http://java.sun.com/dtd/web-app_2_3.dtd"> + +<!-- + * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + --> +<web-app> + <context-param> + <param-name>org.apache.tuscany.core.webapp.ModuleComponentName</param-name> + <param-value>/testContext</param-value> + </context-param> + <filter> + <filter-name>TuscanyFilter</filter-name> + <filter-class>org.apache.tuscany.core.webapp.TuscanyRequestFilter</filter-class> + </filter> + <filter-mapping> + <filter-name>TuscanyFilter</filter-name> + <servlet-name>TestServlet</servlet-name> + </filter-mapping> + <listener> + <listener-class>org.apache.tuscany.core.webapp.TuscanyServletListener</listener-class> + </listener> + <servlet> + <servlet-name>TestServlet</servlet-name> + <servlet-class>org.apache.tuscany.tomcat.integration.TestServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>TestServlet</servlet-name> + <url-pattern>/servlet</url-pattern> + </servlet-mapping> +</web-app> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app2/index.html b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app2/index.html new file mode 100644 index 0000000000..55ecbd81ba --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tomcat/src/test/resources/app2/index.html @@ -0,0 +1,3 @@ +<html> +<body>Hello World</body> +</html>
\ No newline at end of file diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/LICENSE.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/README.txt b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/README.txt new file mode 100644 index 0000000000..9b26d1690a --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/README.txt @@ -0,0 +1,35 @@ +Apache Tuscany M1 build (May, 2006) +=================================== + +http://incubator.apache.org/tuscany/ + +Tuscany is an effort undergoing incubation at the Apache Software Foundation +(ASF), sponsored by the Web Services PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness or +stability of the code, it does indicate that the project has yet to be fully +endorsed by the ASF. + + +Support +------- + +Any problem with this release can be reported to the Tuscany mailing list +or in the JIRA issue tracker. + +Mailing list subscription: + tuscany-dev-subscribe@ws.apache.org + +Jira: + http://issues.apache.org/jira/browse/Tuscany + + +Thank you for using Tuscany! + + +The Tuscany Team. + diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/pom.xml b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/pom.xml new file mode 100644 index 0000000000..52f6b0c682 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/pom.xml @@ -0,0 +1,155 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Copyright (c) 2005-2006 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + --> +<project> + <parent> + <groupId>org.apache.tuscany</groupId> + <artifactId>tuscany-sca</artifactId> + <version>incubating-M1</version> + </parent> + <modelVersion>4.0.0</modelVersion> + <artifactId>tuscany-sca-tools</artifactId> + <name>Tuscany SCA Tools</name> + <description>SCA Tools.</description> + <version>incubating-M1</version> + + <repositories> + <repository> + <id>eclipse.emf</id> + <url>http://download.eclipse.org/tools/emf/maven2</url> + <snapshots> + <enabled>true</enabled> + </snapshots> + </repository> + </repositories> + + <dependencies> + <dependency> + <groupId>org.apache.tuscany</groupId> + <artifactId>tuscany-sdo-impl</artifactId> + <version>incubating-M1</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.apache.tuscany</groupId> + <artifactId>tuscany-model</artifactId> + <version>incubating-M1</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>org.eclipse.emf</groupId> + <artifactId>codegen</artifactId> + <version>2.2.0-RC4</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>org.eclipse.emf</groupId> + <artifactId>codegen-ecore</artifactId> + <version>2.2.0-RC4</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>axis2</groupId> + <artifactId>axis2-kernel</artifactId> + <version>1.0</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>axis2</groupId> + <artifactId>axis2-codegen</artifactId> + <version>1.0</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>wsdl4j</groupId> + <artifactId>wsdl4j</artifactId> + <version>1.5.2</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + <version>1.0.4</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <version>1.2.12</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>ws-commons</groupId> + <artifactId>policy</artifactId> + <version>1.0</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>ws-commons</groupId> + <artifactId>axiom-api</artifactId> + <version>1.0</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>ws-commons</groupId> + <artifactId>axiom-impl</artifactId> + <version>1.0</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>stax</groupId> + <artifactId>stax-api</artifactId> + <version>1.0</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>woodstox</groupId> + <artifactId>wstx-asl</artifactId> + <version>2.9.3</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>org.apache.ws.commons</groupId> + <artifactId>XmlSchema</artifactId> + <version>1.0.2</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>annogen</groupId> + <artifactId>annogen</artifactId> + <version>0.1.0</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>3.8.1</version> + <scope>test</scope> + </dependency> + </dependencies> + +</project> diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/GenerationParameters.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/GenerationParameters.java new file mode 100644 index 0000000000..dfd5506af9 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/GenerationParameters.java @@ -0,0 +1,314 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.tools.java2wsdl.generate;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Map;
+
+import org.apache.ws.java2wsdl.Java2WSDLConstants;
+import org.apache.ws.java2wsdl.Java2WSDLUtils;
+import org.apache.ws.java2wsdl.utils.Java2WSDLCommandLineOption;
+
+/**
+ * This class encapsulates the parameters that effect the generation of the
+ * WSDL. For example they contain all user settings such as source class,
+ * target location etc.
+ *
+ */
+public class GenerationParameters
+{
+ public static final String WSDL_FILENAME_SUFFIX = ".wsdl";
+
+ private Map cmdLineOptions = null;
+ private FileOutputStream outputFileStream = null;
+ private String sourceClassName = null;
+
+ private String targetNamespace = null;
+ private String targetNamespacePrefix = null;
+ private String schemaTargetNamespace = null;
+ private String schemaTargetNamespacePrefix = null;
+ private ClassLoader classLoader = null;
+ private String serviceName = null;
+ private String style = null;
+ private String use = null;
+ private String locationUri = null;
+
+ public GenerationParameters(Map cmdLineOptions) throws Exception
+ {
+ this.cmdLineOptions = cmdLineOptions;
+ loadParameters();
+ }
+
+ protected void loadParameters() throws Exception
+ {
+ initializeSourceClassName();
+ resolveFileOutputStream();
+ resolveClassLoader4InputClasspath();
+ initializeOtherParams();
+ }
+
+ private Java2WSDLCommandLineOption loadOption(String shortOption, String longOption) {
+ //short option gets precedence
+ Java2WSDLCommandLineOption option = null;
+ if (longOption != null) {
+ option = (Java2WSDLCommandLineOption) cmdLineOptions.get(longOption);
+ if (option != null) {
+ return option;
+ }
+ }
+ if (shortOption != null) {
+ option = (Java2WSDLCommandLineOption) cmdLineOptions.get(shortOption);
+ }
+
+ return option;
+ }
+
+ protected void initializeSourceClassName() throws Exception
+ {
+ Java2WSDLCommandLineOption option =
+ loadOption(Java2WSDLConstants.CLASSNAME_OPTION, Java2WSDLConstants.CLASSNAME_OPTION_LONG);
+ sourceClassName = option == null ? null : option.getOptionValue();
+
+ if (sourceClassName == null || sourceClassName.equals("")) {
+ throw new Exception("class name must be present!");
+ }
+ }
+
+ /**
+ * @throws Exception
+ */
+ protected void resolveFileOutputStream() throws Exception
+ {
+ File outputFolder;
+ Java2WSDLCommandLineOption option = loadOption(Java2WSDLConstants.OUTPUT_LOCATION_OPTION,
+ Java2WSDLConstants.OUTPUT_LOCATION_OPTION_LONG);
+ String outputFolderName = option == null ? System.getProperty("user.dir") : option.getOptionValue();
+
+ outputFolder = new File(outputFolderName);
+ if (!outputFolder.exists()) {
+ outputFolder.mkdirs();
+ } else if (!outputFolder.isDirectory()) {
+ throw new Exception("The specified location " + outputFolderName + "is not a folder");
+ }
+
+ option = loadOption(Java2WSDLConstants.OUTPUT_FILENAME_OPTION,
+ Java2WSDLConstants.OUTPUT_FILENAME_OPTION_LONG);
+ String outputFileName = option == null ? null : option.getOptionValue();
+ //derive a file name from the class name if the filename is not specified
+ if (outputFileName == null)
+ {
+ outputFileName = Java2WSDLUtils.getSimpleClassName(sourceClassName) + WSDL_FILENAME_SUFFIX;
+ }
+
+ //first create a file in the given location
+ File outputFile = new File(outputFolder, outputFileName);
+ try
+ {
+ if (!outputFile.exists())
+ {
+ outputFile.createNewFile();
+ }
+ outputFileStream = new FileOutputStream(outputFile);
+ }
+ catch (IOException e)
+ {
+ throw new Exception(e);
+ }
+ }
+
+ protected void resolveClassLoader4InputClasspath() throws Exception
+ {
+ Java2WSDLCommandLineOption option = null;
+
+ if (option != null) {
+ ArrayList optionValues = option.getOptionValues();
+ URL[] urls = new URL[optionValues.size()];
+ String[] classPathEntries = (String[]) optionValues.toArray(new String[optionValues.size()]);
+
+ try {
+ for (int i = 0; i < classPathEntries.length; i++) {
+ String classPathEntry = classPathEntries[i];
+ //this should be a file(or a URL)
+ if (Java2WSDLUtils.isURL(classPathEntry)) {
+ urls[i] = new URL(classPathEntry);
+ } else {
+ urls[i] = new File(classPathEntry).toURL();
+ }
+ }
+ } catch (MalformedURLException e) {
+ throw new Exception(e);
+ }
+
+ classLoader = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());
+
+ } else {
+ classLoader = Thread.currentThread().getContextClassLoader();
+ }
+ }
+
+ protected void initializeOtherParams()
+ {
+// set the other parameters to the builder
+ Java2WSDLCommandLineOption option = loadOption(Java2WSDLConstants.SCHEMA_TARGET_NAMESPACE_OPTION,
+ Java2WSDLConstants.SCHEMA_TARGET_NAMESPACE_OPTION_LONG);
+ schemaTargetNamespace = (option == null) ? null : option.getOptionValue();
+
+ option = loadOption(Java2WSDLConstants.SCHEMA_TARGET_NAMESPACE_PREFIX_OPTION,
+ Java2WSDLConstants.SCHEMA_TARGET_NAMESPACE_PREFIX_OPTION_LONG);
+ schemaTargetNamespacePrefix = (option == null) ? null : option.getOptionValue();
+
+ option = loadOption(Java2WSDLConstants.TARGET_NAMESPACE_OPTION,
+ Java2WSDLConstants.TARGET_NAMESPACE_OPTION_LONG);
+ targetNamespace = (option == null) ? null : option.getOptionValue();
+
+ option = loadOption(Java2WSDLConstants.TARGET_NAMESPACE_PREFIX_OPTION,
+ Java2WSDLConstants.TARGET_NAMESPACE_PREFIX_OPTION_LONG);
+ targetNamespacePrefix = (option == null) ? null : option.getOptionValue();
+
+ option = loadOption(Java2WSDLConstants.SERVICE_NAME_OPTION,
+ Java2WSDLConstants.SERVICE_NAME_OPTION_LONG);
+ serviceName = (option == null) ? Java2WSDLUtils.getSimpleClassName(sourceClassName) : option.getOptionValue();
+
+ option = loadOption(Java2WSDLConstants.STYLE_OPTION,Java2WSDLConstants.STYLE_OPTION);
+ style = (option == null) ? null : option.getOptionValue();
+
+
+ option = loadOption(Java2WSDLConstants.LOCATION_OPTION,
+ Java2WSDLConstants.LOCATION_OPTION);
+ locationUri = (option == null) ? null : option.getOptionValue();
+
+ option = loadOption(Java2WSDLConstants.USE_OPTION,Java2WSDLConstants.USE_OPTION);
+ use = (option == null) ? null : option.getOptionValue();
+ }
+
+ public ClassLoader getClassLoader()
+ {
+ return classLoader;
+ }
+
+ public void setClassLoader(ClassLoader classLoader)
+ {
+ this.classLoader = classLoader;
+ }
+
+ public String getLocationUri()
+ {
+ return locationUri;
+ }
+
+ public void setLocationUri(String locationUri)
+ {
+ this.locationUri = locationUri;
+ }
+
+ public FileOutputStream getOutputFileStream()
+ {
+ return outputFileStream;
+ }
+
+ public void setOutputFileStream(FileOutputStream outputFileStream)
+ {
+ this.outputFileStream = outputFileStream;
+ }
+
+ public String getSchemaTargetNamespace()
+ {
+ return schemaTargetNamespace;
+ }
+
+ public void setSchemaTargetNamespace(String schemaTargetNamespace)
+ {
+ this.schemaTargetNamespace = schemaTargetNamespace;
+ }
+
+ public String getSchemaTargetNamespacePrefix()
+ {
+ return schemaTargetNamespacePrefix;
+ }
+
+ public void setSchemaTargetNamespacePrefix(String schemaTargetNamespacePrefix)
+ {
+ this.schemaTargetNamespacePrefix = schemaTargetNamespacePrefix;
+ }
+
+ public String getServiceName()
+ {
+ return serviceName;
+ }
+
+ public void setServiceName(String serviceName)
+ {
+ this.serviceName = serviceName;
+ }
+
+ public String getSourceClassName()
+ {
+ return sourceClassName;
+ }
+
+ public void setSourceClassName(String sourceClassName)
+ {
+ this.sourceClassName = sourceClassName;
+ }
+
+ public String getStyle()
+ {
+ return style;
+ }
+
+ public void setStyle(String style)
+ {
+ this.style = style;
+ }
+
+ public String getTargetNamespace()
+ {
+ return targetNamespace;
+ }
+
+ public void setTargetNamespace(String targetNamespace)
+ {
+ this.targetNamespace = targetNamespace;
+ }
+
+ public String getTargetNamespacePrefix()
+ {
+ return targetNamespacePrefix;
+ }
+
+ public void setTargetNamespacePrefix(String targetNamespacePrefix)
+ {
+ this.targetNamespacePrefix = targetNamespacePrefix;
+ }
+
+ public String getUse()
+ {
+ return use;
+ }
+
+ public void setUse(String use)
+ {
+ this.use = use;
+ }
+}
+
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/Java2WSDL.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/Java2WSDL.java new file mode 100644 index 0000000000..5538ec1cfa --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/Java2WSDL.java @@ -0,0 +1,59 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.tools.java2wsdl.generate;
+
+import org.apache.ws.java2wsdl.utils.Java2WSDLCommandLineOptionParser;
+import org.apache.ws.java2wsdl.utils.Java2WSDLOptionsValidator;
+
+/**
+ * This class provides the tooling abstraction to Tuscany Java2WSDL and can be
+ * invoked from command line with the follwing options as with Axis2 Java2WSDL
+ *
+ */
+public class Java2WSDL {
+ /**
+ * @param args
+ */
+ public static void main(String[] args)
+ {
+ //parse the cmd line args
+ Java2WSDLCommandLineOptionParser commandLineOptionParser =
+ new Java2WSDLCommandLineOptionParser(args);
+ // validate the arguments
+ validateCommandLineOptions(commandLineOptionParser);
+
+ Java2WSDLGeneratorFactory.getInstance().createGenerator().
+ generateWSDL(commandLineOptionParser.getAllOptions());
+
+ // Uncomment the following statement to directly run the Axis2 tool
+ // without
+ // runAxis2Tool(args);
+ }
+
+ private static void runAxis2Tool(String[] args) {
+ org.apache.ws.java2wsdl.Java2WSDL.main(args);
+ }
+
+ private static void validateCommandLineOptions(Java2WSDLCommandLineOptionParser parser) {
+ if (parser.getAllOptions().size() == 0) {
+ org.apache.ws.java2wsdl.Java2WSDL.printUsage();
+ } else if (parser.getInvalidOptions(new Java2WSDLOptionsValidator()).size() > 0) {
+ org.apache.ws.java2wsdl.Java2WSDL.printUsage();
+ }
+
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/Java2WSDLGenerator.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/Java2WSDLGenerator.java new file mode 100644 index 0000000000..0decbd6011 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/Java2WSDLGenerator.java @@ -0,0 +1,46 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.tools.java2wsdl.generate;
+
+import java.io.OutputStream;
+import java.util.Map;
+
+/**
+ * This is the Java2WSDL Generator facade that will be used by Tuscany
+ * components for java to wsdl conversion.
+ *
+ */
+public interface Java2WSDLGenerator {
+ public void generateWSDL(String[] args);
+
+ public void generateWSDL(Map commandLineOptions);
+
+ public void addWSDLGenListener(WSDLGenListener l);
+
+ public void removeWSDLGenListener(WSDLGenListener l);
+
+ public Map getCommandLineOptions();
+
+ public void setCommandLineOptoins(Map cmdLineOpts);
+
+ public WSDLModel getWSDLModel();
+
+ public OutputStream getOutputStream();
+
+ public void setOutputStream(OutputStream outStream);
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/Java2WSDLGeneratorFactory.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/Java2WSDLGeneratorFactory.java new file mode 100644 index 0000000000..3e9e745aee --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/Java2WSDLGeneratorFactory.java @@ -0,0 +1,87 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.tools.java2wsdl.generate;
+
+import java.util.Vector;
+
+/**
+ * Factory that creates Java2WSDL Generators. Presently the there is a Default
+ * Generator that wraps around the AXIS2 Java2WSDL implementation. The factory
+ * can be extended to create generators that wrap around other implementations
+ * if required.
+ */
+
+public class Java2WSDLGeneratorFactory {
+ /*
+ * singleton instance of this factory class
+ */
+ private static Java2WSDLGeneratorFactory factory = null;
+
+ /**
+ * code for the default generator
+ */
+ public static final int DEFAULT_GENERATOR = 0;
+
+ /**
+ * Default Generator class name
+ */
+ public static final String DEFAULT_GENERATOR_CLASSNAME = "org.apache.tuscany.tools.java2wsdl.generate.Java2WSDLGeneratorImpl";
+
+ /**
+ * list of generator classnames in a position that corresponds to their
+ * code. For example the default generator's code is 0 and hence this
+ * generator's classname is stored at index '0' of the list
+ */
+ protected Vector<String> generatorClassNames = new Vector<String>();
+
+ /**
+ * @return the singleton instance of this generator factory
+ */
+ public static Java2WSDLGeneratorFactory getInstance() {
+ if (factory == null) {
+ factory = new Java2WSDLGeneratorFactory();
+ }
+ return factory;
+ }
+
+ private Java2WSDLGeneratorFactory() {
+ generatorClassNames.addElement(DEFAULT_GENERATOR_CLASSNAME);
+ }
+
+ public Java2WSDLGenerator createGenerator() {
+ return createGenerator(DEFAULT_GENERATOR);
+ }
+
+ /**
+ * creates an instance of a Java2WSDL Generator based on the input type
+ *
+ * @param genType
+ * type of the generator to be created
+ * @return an instance of a Java2WSDL Generator
+ */
+ public Java2WSDLGenerator createGenerator(int genType) {
+ try {
+ return (Java2WSDLGenerator) (Class.forName(generatorClassNames
+ .elementAt(genType)).newInstance());
+ } catch (Exception e) {
+ System.out
+ .println(" Unable to create Java2WSDL generator due to .....");
+ System.out.println(e);
+ return null;
+ }
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/Java2WSDLGeneratorImpl.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/Java2WSDLGeneratorImpl.java new file mode 100644 index 0000000000..1e3498be3d --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/Java2WSDLGeneratorImpl.java @@ -0,0 +1,286 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.tools.java2wsdl.generate;
+
+import java.io.OutputStream;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import org.apache.ws.java2wsdl.Java2WSDL;
+import org.apache.axis2.wsdl.util.CommandLineOption;
+import org.apache.axis2.wsdl.util.CommandLineOptionParser;
+import org.apache.axis2.wsdl.util.Java2WSDLOptionsValidator;
+import org.apache.ws.java2wsdl.Java2WSDLUtils;
+
+/**
+ * This is an implementation of the Java2WSDLGenerator facade. This
+ * implementation is a decorator around the Axis2 implementation of the
+ * Java2WSDL conversion. The WSDL generation is divided into phases that are
+ * stringed up as a template method. The phases are - User Input Validation -
+ * WSDL Java Model Generation - Serialization of WSDL Java Model The function of
+ * each phase is accomplished by delegation to the appropriate classes in Axis2.
+ * At the start and end of each phase an event is published to subcribers
+ * denoting the start and end of the phase.
+ *
+ * Such a spliting up of the Java2WSDL conversion into phases has been designed
+ * to enable interceptors to modify the model or apply transformations to the
+ * output. Typically the interceptors can subscribe to the start and end events
+ * of these phases and hence be able to intercept.
+ *
+ * Note: This class contains substantial AXIS2 Java2WSDL code refactored into
+ * it. These will be removed as and when the Axis2 code is fixed.
+ *
+ */
+public class Java2WSDLGeneratorImpl implements Java2WSDLGenerator
+{
+ private List<WSDLGenListener> genPhaseListeners = new Vector<WSDLGenListener>();
+ private GenerationParameters genParams = null;
+ private Map<String, CommandLineOption> commandLineOptions = null;
+ private TuscanyJava2WSDLBuilder java2WsdlBuilder;
+ private OutputStream outputStream = null;
+
+ /*public static final String HTTP = "http://";
+
+ public static final String WSDL_FILENAME_SUFFIX = ".wsdl";
+
+ public static final String DEFAULT_PREFIX = "wsdl";
+
+ public static final char PACKAGE_CLASS_DELIMITER = '.';
+
+ public static final String DEFAULT_TARGET_NAMESPACE_PREFIX = "tns";
+
+ public static final String DEFAULT_SCHEMA_TARGET_NAMESPACE_PREFIX = "stns";
+
+ private String sourceClassName = null;
+
+
+
+ private ClassLoader classLoader;
+
+ private WSDLDescription wsdlDescription = null;
+
+ private WSDLModel wsdlModel = null;*/
+
+ public Java2WSDLGeneratorImpl()
+ {
+
+ }
+
+ private void multicastGenPhaseCompletionEvent(int genPhase) {
+ WSDLGenEvent event = new WSDLGenEvent(this, genPhase);
+ Iterator iterator = genPhaseListeners.iterator();
+ while (iterator.hasNext()) {
+ ((WSDLGenListener) iterator.next()).WSDLGenPhaseCompleted(event);
+ }
+ }
+
+ private void initJava2WSDLBuilder() throws Exception
+ {
+// Now we are done with loading the basic values - time to create the builder
+ java2WsdlBuilder = new TuscanyJava2WSDLBuilder(genParams.getOutputFileStream(),
+ genParams.getSourceClassName(),
+ genParams.getClassLoader());
+ java2WsdlBuilder.setSchemaTargetNamespace(genParams.getSchemaTargetNamespace());
+ java2WsdlBuilder.setSchemaTargetNamespacePrefix(genParams.getSchemaTargetNamespacePrefix());
+ java2WsdlBuilder.setTargetNamespace(genParams.getTargetNamespace());
+ java2WsdlBuilder.setTargetNamespacePrefix(genParams.getTargetNamespacePrefix());
+ java2WsdlBuilder.setServiceName(genParams.getServiceName() == null ?
+ Java2WSDLUtils.getSimpleClassName(genParams.getSourceClassName()) : genParams.getServiceName());
+
+ if (genParams.getStyle() != null)
+ {
+ java2WsdlBuilder.setStyle(genParams.getStyle());
+ }
+
+ if (genParams.getLocationUri() != null) {
+ java2WsdlBuilder.setLocationUri(genParams.getLocationUri());
+ }
+
+ if (genParams.getUse() != null)
+ {
+ java2WsdlBuilder.setUse(genParams.getUse());
+ }
+ }
+
+ protected boolean validateInputArgs(String[] args)
+ {
+ boolean isValid = true;
+ CommandLineOptionParser parser = new CommandLineOptionParser(args);
+ if (parser.getAllOptions().size() == 0) {
+ Java2WSDL.printUsage();
+ isValid = false;
+ } else if (parser.getInvalidOptions(new Java2WSDLOptionsValidator())
+ .size() > 0) {
+ Java2WSDL.printUsage();
+ isValid = false;
+ }
+
+ if (isValid)
+ {
+ commandLineOptions = parser.getAllOptions();
+ }
+
+ return isValid;
+ }
+
+ public boolean buildWSDLDocument() throws Exception
+ {
+ boolean isComplete = true;
+ initJava2WSDLBuilder();
+ java2WsdlBuilder.buildWSDL();
+
+ return isComplete;
+ }
+
+ public boolean serializeWSDLDocument() throws Exception {
+ boolean isComplete = true;
+
+ if ( getOutputStream() == null )
+ {
+ setOutputStream(genParams.getOutputFileStream());
+ }
+
+ java2WsdlBuilder.getWsdlDocument().serialize(getOutputStream());
+ getOutputStream().flush();
+ getOutputStream().close();;
+
+ return isComplete;
+ }
+
+ /*
+ * This is the template method that splits the Java2WSDL generation cycle
+ * into phase / steps.
+ *
+ * @see tuscany.tools.Java2WSDLGeneratorIfc#generateWSDL(java.lang.String[])
+ */
+ public void generateWSDL(Map commandLineOptions)
+ {
+ try
+ {
+ // load the user options into an easy to access abstraction
+ genParams = new GenerationParameters(commandLineOptions);
+
+ // if the WSDL Model generation was successul
+ if ( buildWSDLDocument() )
+ {
+ // multicast event for generation of wsdl model
+ multicastGenPhaseCompletionEvent(WSDLGenListener.WSDL_MODEL_CREATION);
+ // if the serialization of the generated (and fixed) model
+ // is successful
+ if (serializeWSDLDocument()) {
+ // multicast event for writing of the WSDL Model to
+ // supplied output stream
+ multicastGenPhaseCompletionEvent(WSDLGenListener.WSDL_MODEL_WRITING);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+
+ // TODO Auto-generated method stub
+
+ }
+
+ public void generateWSDL(String[] args)
+ {
+ // if the argument input are found to be valid
+ if (validateInputArgs(args))
+ {
+ //multicast event for input args validation complete
+ multicastGenPhaseCompletionEvent(WSDLGenListener.INPUT_ARGS_VALIDATION);
+ generateWSDL(commandLineOptions);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see tuscany.tools.Java2WSDLGeneratorIfc#addWSDLGenListener(tuscany.tools.WSDLGenListener)
+ */
+ public void addWSDLGenListener(WSDLGenListener l) {
+ genPhaseListeners.add(l);
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see tuscany.tools.Java2WSDLGeneratorIfc#removeWSDLGenListener(tuscany.tools.WSDLGenListener)
+ */
+ public void removeWSDLGenListener(WSDLGenListener l) {
+ genPhaseListeners.remove(l);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see tuscany.tools.Java2WSDLGeneratorIfc#getCommandLineOptions()
+ */
+ public Map getCommandLineOptions() {
+ return commandLineOptions;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see tuscany.tools.Java2WSDLGeneratorIfc#setCommandLineOptoins(java.util.Map)
+ */
+ public void setCommandLineOptoins(Map cmdLineOpts) {
+ commandLineOptions = cmdLineOpts;
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see tuscany.tools.Java2WSDLGeneratorIfc#getOutputStream()
+ */
+ public OutputStream getOutputStream() {
+ // TODO Auto-generated method stub
+ return outputStream;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see tuscany.tools.Java2WSDLGeneratorIfc#setOutputStream(java.io.OutputStream)
+ */
+ public void setOutputStream(OutputStream outStream) {
+ outputStream = outStream;
+ }
+
+
+ public TuscanyJava2WSDLBuilder getJava2WsdlBuilder()
+ {
+ return java2WsdlBuilder;
+ }
+
+ public void setJava2WsdlBuilder(TuscanyJava2WSDLBuilder java2WsdlBuilder)
+ {
+ this.java2WsdlBuilder = java2WsdlBuilder;
+ }
+
+ public WSDLModel getWSDLModel()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/TuscanyJava2OMBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/TuscanyJava2OMBuilder.java new file mode 100644 index 0000000000..49c3e4df9f --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/TuscanyJava2OMBuilder.java @@ -0,0 +1,428 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.tools.java2wsdl.generate;
+
+import java.io.ByteArrayInputStream;
+import java.io.StringWriter;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
+import org.apache.axiom.om.OMNode;
+import org.apache.axiom.om.impl.builder.StAXOMBuilder;
+import org.apache.ws.commons.schema.XmlSchema;
+import org.apache.ws.java2wsdl.Java2WSDLConstants;
+import org.apache.ws.java2wsdl.utils.TypeTable;
+import org.codehaus.jam.JMethod;
+
+public class TuscanyJava2OMBuilder implements Java2WSDLConstants {
+
+ private TypeTable typeTable = null;
+
+ private static int prefixCount = 1;
+
+ private static final String NAMESPACE_PREFIX = "ns";
+
+ private JMethod method [];
+
+ private Collection schemaCollection;
+
+ private String serviceName;
+
+ private String targetNamespace;
+
+ private String targetNamespacePrefix;
+
+ private OMNamespace ns1;
+
+ private OMNamespace soap;
+
+ private OMNamespace soap12;
+
+ private OMNamespace tns;
+
+ private OMNamespace wsdl;
+
+ private OMNamespace mime;
+
+ private OMNamespace http;
+
+ private String style;
+
+ private String use;
+
+ private String locationURL;
+
+ public TuscanyJava2OMBuilder(JMethod[] method, Collection schemaCollection,
+ TypeTable typeTab, String serviceName, String targetNamespace,
+ String targetNamespacePrefix, String style, String use,
+ String locationURL) {
+ this.method = method;
+ this.schemaCollection = schemaCollection;
+ this.typeTable = typeTab;
+ if (style == null) {
+ this.style = DOCUMNT;
+ } else {
+ this.style = style;
+ }
+ if (use == null) {
+ this.use = LITERAL;
+ } else {
+ this.use = use;
+ }
+
+ if (locationURL == null) {
+ this.locationURL = DEFAULT_LOCATION_URL;
+ } else {
+ this.locationURL = locationURL;
+ }
+ this.serviceName = serviceName;
+
+ if (targetNamespace != null && !targetNamespace.trim().equals("")) {
+ this.targetNamespace = targetNamespace;
+ } else {
+ this.targetNamespace = DEFAULT_TARGET_NAMESPACE;
+ }
+
+ if (targetNamespacePrefix != null
+ && !targetNamespacePrefix.trim().equals("")) {
+ this.targetNamespacePrefix = targetNamespacePrefix;
+ } else {
+ this.targetNamespacePrefix = DEFAULT_TARGET_NAMESPACE_PREFIX;
+ }
+ }
+
+ public OMElement generateOM() throws Exception {
+ OMFactory fac = OMAbstractFactory.getOMFactory();
+ wsdl = fac.createOMNamespace(WSDL_NAMESPACE,
+ DEFAULT_WSDL_NAMESPACE_PREFIX);
+ OMElement ele = fac.createOMElement("definitions", wsdl);
+
+ ele.addAttribute("targetNamespace", targetNamespace, null);
+ generateNamespaces(fac, ele);
+ generateTypes(fac, ele);
+ generateMessages(fac, ele);
+ generatePortType(fac, ele);
+ generateBinding(fac, ele);
+ generateService(fac, ele);
+ return ele;
+ }
+
+ private void generateNamespaces(OMFactory fac, OMElement defintions) {
+ soap = defintions.declareNamespace(URI_WSDL11_SOAP, SOAP11_PREFIX);
+ tns = defintions.declareNamespace(targetNamespace,
+ targetNamespacePrefix);
+ soap12 = defintions.declareNamespace(URI_WSDL12_SOAP, SOAP12_PREFIX);
+ http = defintions.declareNamespace(HTTP_NAMESPACE, HTTP_PREFIX);
+ mime = defintions.declareNamespace(MIME_NAMESPACE, MIME_PREFIX);
+ }
+
+ private void generateTypes(OMFactory fac, OMElement defintions)
+ throws Exception {
+ OMElement wsdlTypes = fac.createOMElement("types", wsdl);
+ StringWriter writer = new StringWriter();
+
+ // wrap the Schema elements with this start and end tags to create a
+ // document root
+ // under which the schemas can fall into
+ writer.write("<xmlSchemas>");
+ writeSchemas(writer);
+ writer.write("</xmlSchemas>");
+ XMLStreamReader xmlReader = XMLInputFactory.newInstance()
+ .createXMLStreamReader(
+ new ByteArrayInputStream(writer.toString().getBytes()));
+
+ StAXOMBuilder staxOMBuilders = new StAXOMBuilder(fac, xmlReader);
+ Iterator iterator = staxOMBuilders.getDocumentElement()
+ .getChildElements();
+ while (iterator.hasNext()) {
+ wsdlTypes.addChild((OMNode) iterator.next());
+ }
+ defintions.addChild(wsdlTypes);
+ }
+
+ private void writeSchemas(StringWriter writer) {
+ Iterator iterator = schemaCollection.iterator();
+ XmlSchema xmlSchema = null;
+ //Iterator typeIterator = null;
+ while (iterator.hasNext()) {
+ xmlSchema = (XmlSchema) iterator.next();
+ //typeIterator = xmlSchema.getSchemaTypes().getValues();
+ /*while (typeIterator.hasNext()) {
+ xmlSchema.getItems().add((XmlSchemaObject) typeIterator.next());
+
+ }*/
+ xmlSchema.write(writer);
+ }
+ }
+
+ private void generateMessages(OMFactory fac, OMElement definitions) {
+ Hashtable namespaceMap = new Hashtable();
+ String namespacePrefix = null;
+ String namespaceURI = null;
+ QName messagePartType = null;
+ for (int i = 0; i < method.length; i++) {
+ JMethod jmethod = method[i];
+
+ // only if a type for the message part has already been defined
+ if ((messagePartType = typeTable.getComplexSchemaType(jmethod
+ .getSimpleName())) != null) {
+ namespaceURI = messagePartType.getNamespaceURI();
+ // avoid duplicate namespaces
+ if ((namespacePrefix = (String) namespaceMap.get(namespaceURI)) == null) {
+ namespacePrefix = generatePrefix();
+ namespaceMap.put(namespaceURI, namespacePrefix);
+ }
+
+ //Request Message
+ OMElement requestMessge = fac.createOMElement(
+ MESSAGE_LOCAL_NAME, wsdl);
+ requestMessge.addAttribute(ATTRIBUTE_NAME, jmethod
+ .getSimpleName()
+ + MESSAGE_SUFFIX, null);
+ definitions.addChild(requestMessge);
+ OMElement requestPart = fac.createOMElement(
+ PART_ATTRIBUTE_NAME, wsdl);
+ requestMessge.addChild(requestPart);
+ requestPart.addAttribute(ATTRIBUTE_NAME, "part1", null);
+
+ requestPart.addAttribute(ELEMENT_ATTRIBUTE_NAME,
+ namespacePrefix + COLON_SEPARATOR
+ + jmethod.getSimpleName(), null);
+ }
+
+ // only if a type for the message part has already been defined
+ if ((messagePartType = typeTable.getComplexSchemaType(jmethod
+ .getSimpleName()
+ + RESPONSE)) != null) {
+ namespaceURI = messagePartType.getNamespaceURI();
+ if ((namespacePrefix = (String) namespaceMap.get(namespaceURI)) == null) {
+ namespacePrefix = generatePrefix();
+ namespaceMap.put(namespaceURI, namespacePrefix);
+ }
+ //Response Message
+ OMElement responseMessge = fac.createOMElement(
+ MESSAGE_LOCAL_NAME, wsdl);
+ responseMessge.addAttribute(ATTRIBUTE_NAME, jmethod
+ .getSimpleName()
+ + RESPONSE_MESSAGE, null);
+ definitions.addChild(responseMessge);
+ OMElement responsePart = fac.createOMElement(
+ PART_ATTRIBUTE_NAME, wsdl);
+ responseMessge.addChild(responsePart);
+ responsePart.addAttribute(ATTRIBUTE_NAME, "part1", null);
+
+ responsePart.addAttribute(ELEMENT_ATTRIBUTE_NAME,
+ namespacePrefix + COLON_SEPARATOR
+ + jmethod.getSimpleName() + RESPONSE, null);
+ }
+ }
+
+ // now add these unique namespaces to the the definitions element
+ Enumeration enumeration = namespaceMap.keys();
+ while (enumeration.hasMoreElements()) {
+ namespaceURI = (String) enumeration.nextElement();
+ definitions.declareNamespace(namespaceURI, (String) namespaceMap
+ .get(namespaceURI));
+ }
+ }
+
+ /**
+ * Generate the porttypes
+ */
+ private void generatePortType(OMFactory fac, OMElement defintions) {
+ JMethod jmethod = null;
+ OMElement operation = null;
+ OMElement message = null;
+ OMElement portType = fac.createOMElement(PORT_TYPE_LOCAL_NAME, wsdl);
+ defintions.addChild(portType);
+ portType.addAttribute(ATTRIBUTE_NAME, serviceName + PORT_TYPE_SUFFIX,
+ null);
+ //adding message refs
+ for (int i = 0; i < method.length; i++) {
+ jmethod = method[i];
+ operation = fac.createOMElement(OPERATION_LOCAL_NAME, wsdl);
+ portType.addChild(operation);
+ operation.addAttribute(ATTRIBUTE_NAME, jmethod.getSimpleName(),
+ null);
+
+ message = fac.createOMElement(IN_PUT_LOCAL_NAME, wsdl);
+ message.addAttribute(MESSAGE_LOCAL_NAME, tns.getPrefix()
+ + COLON_SEPARATOR + jmethod.getSimpleName()
+ + MESSAGE_SUFFIX, null);
+ operation.addChild(message);
+
+ if (!jmethod.getReturnType().isVoidType()) {
+ message = fac.createOMElement(OUT_PUT_LOCAL_NAME, wsdl);
+ message.addAttribute(MESSAGE_LOCAL_NAME, tns.getPrefix()
+ + COLON_SEPARATOR + jmethod.getSimpleName()
+ + RESPONSE_MESSAGE, null);
+ operation.addChild(message);
+ }
+ }
+
+ }
+
+ /**
+ * Generate the service
+ */
+ public void generateService(OMFactory fac, OMElement defintions) {
+ OMElement service = fac.createOMElement(SERVICE_LOCAL_NAME, wsdl);
+ defintions.addChild(service);
+ service.addAttribute(ATTRIBUTE_NAME, serviceName, null);
+ OMElement port = fac.createOMElement(PORT, wsdl);
+ service.addChild(port);
+ port.addAttribute(ATTRIBUTE_NAME, serviceName + SOAP11PORT, null);
+ port.addAttribute(BINDING_LOCAL_NAME, tns.getPrefix() + COLON_SEPARATOR
+ + serviceName + BINDING_NAME_SUFFIX, null);
+ addExtensionElement(fac, port, soap, SOAP_ADDRESS, LOCATION, locationURL
+ + serviceName);
+
+ port = fac.createOMElement(PORT, wsdl);
+ service.addChild(port);
+ port.addAttribute(ATTRIBUTE_NAME, serviceName + SOAP12PORT, null);
+ port.addAttribute(BINDING_LOCAL_NAME, tns.getPrefix() + COLON_SEPARATOR
+ + serviceName + SOAP12BINDING_NAME_SUFFIX, null);
+ addExtensionElement(fac, port, soap12, SOAP_ADDRESS, LOCATION, locationURL
+ + serviceName);
+ }
+
+ /**
+ * Generate the bindings
+ */
+ private void generateBinding(OMFactory fac, OMElement defintions) {
+ generateSoap11Binding(fac, defintions);
+ generateSoap12Binding(fac, defintions);
+ }
+
+ private void generateSoap11Binding(OMFactory fac, OMElement defintions) {
+ OMElement binding = fac.createOMElement(BINDING_LOCAL_NAME, wsdl);
+ defintions.addChild(binding);
+ binding.addAttribute(ATTRIBUTE_NAME, serviceName + BINDING_NAME_SUFFIX,
+ null);
+ binding.addAttribute("type", tns.getPrefix() + COLON_SEPARATOR
+ + serviceName + PORT_TYPE_SUFFIX, null);
+
+ addExtensionElement(fac, binding, soap, BINDING_LOCAL_NAME, TRANSPORT,
+ TRANSPORT_URI, STYLE, style);
+
+ for (int i = 0; i < method.length; i++) {
+ JMethod jmethod = method[i];
+ OMElement operation = fac.createOMElement(OPERATION_LOCAL_NAME,
+ wsdl);
+ binding.addChild(operation);
+
+ addExtensionElement(fac, operation, soap, OPERATION_LOCAL_NAME,
+ SOAP_ACTION, URN_PREFIX + COLON_SEPARATOR
+ + jmethod.getSimpleName(), STYLE, style);
+ operation.addAttribute(ATTRIBUTE_NAME, jmethod.getSimpleName(),
+ null);
+
+ OMElement input = fac.createOMElement(IN_PUT_LOCAL_NAME, wsdl);
+ addExtensionElement(fac, input, soap, SOAP_BODY, SOAP_USE, use,
+ "namespace", targetNamespace);
+ operation.addChild(input);
+
+ if (!jmethod.getReturnType().isVoidType()) {
+ OMElement output = fac.createOMElement(OUT_PUT_LOCAL_NAME, wsdl);
+ addExtensionElement(fac, output, soap, SOAP_BODY, SOAP_USE, use,
+ "namespace", targetNamespace);
+ operation.addChild(output);
+ }
+ }
+ }
+
+ private void generateSoap12Binding(OMFactory fac, OMElement defintions) {
+ OMElement binding = fac.createOMElement(BINDING_LOCAL_NAME, wsdl);
+ defintions.addChild(binding);
+ binding.addAttribute(ATTRIBUTE_NAME, serviceName + SOAP12BINDING_NAME_SUFFIX,
+ null);
+ binding.addAttribute("type", tns.getPrefix() + COLON_SEPARATOR
+ + serviceName + PORT_TYPE_SUFFIX, null);
+
+ addExtensionElement(fac, binding, soap12, BINDING_LOCAL_NAME, TRANSPORT,
+ TRANSPORT_URI, STYLE, style);
+
+ for (int i = 0; i < method.length; i++) {
+ JMethod jmethod = method[i];
+ OMElement operation = fac.createOMElement(OPERATION_LOCAL_NAME,
+ wsdl);
+ binding.addChild(operation);
+ operation.declareNamespace(URI_WSDL12_SOAP, SOAP12_PREFIX);
+
+ addExtensionElement(fac, operation, soap12, OPERATION_LOCAL_NAME,
+ SOAP_ACTION, URN_PREFIX + COLON_SEPARATOR
+ + jmethod.getSimpleName(), STYLE, style);
+ operation.addAttribute(ATTRIBUTE_NAME, jmethod.getSimpleName(),
+ null);
+
+ OMElement input = fac.createOMElement(IN_PUT_LOCAL_NAME, wsdl);
+ addExtensionElement(fac, input, soap12, SOAP_BODY, SOAP_USE, use,
+ "namespace", targetNamespace);
+ operation.addChild(input);
+
+ if (!jmethod.getReturnType().isVoidType()) {
+ OMElement output = fac.createOMElement(OUT_PUT_LOCAL_NAME, wsdl);
+ addExtensionElement(fac, output, soap12, SOAP_BODY, SOAP_USE, use,
+ "namespace", targetNamespace);
+ operation.addChild(output);
+ }
+ }
+ }
+
+// private void addExtensionElement(OMFactory fac, OMElement element, String name, OMNamespace namespace,
+// Hashtable attrs) {
+// OMElement soapbinding = fac.createOMElement(name, namespace);
+// element.addChild(soapbinding);
+// Enumeration enumeration = attrs.keys();
+// String attrName = null;
+// while (enumeration.hasMoreElements()) {
+// attrName = (String) enumeration.nextElement();
+// soapbinding.addAttribute(attrName, (String) attrs.get(attrName), null);
+// }
+// }
+
+ private void addExtensionElement(OMFactory fac, OMElement element, OMNamespace namespace,
+ String name, String att1Name, String att1Value, String att2Name,
+ String att2Value) {
+ OMElement soapbinding = fac.createOMElement(name, namespace);
+ element.addChild(soapbinding);
+ soapbinding.addAttribute(att1Name, att1Value, null);
+ soapbinding.addAttribute(att2Name, att2Value, null);
+ }
+
+ private void addExtensionElement(OMFactory fac, OMElement element, OMNamespace namespace,
+ String name, String att1Name, String att1Value) {
+ OMElement soapbinding = fac.createOMElement(name, namespace);
+ element.addChild(soapbinding);
+ soapbinding.addAttribute(att1Name, att1Value, null);
+ }
+
+ private String generatePrefix() {
+ return NAMESPACE_PREFIX + prefixCount++;
+ }
+
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/TuscanyJava2WSDLBuilder.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/TuscanyJava2WSDLBuilder.java new file mode 100644 index 0000000000..ede8b6e692 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/TuscanyJava2WSDLBuilder.java @@ -0,0 +1,165 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.tools.java2wsdl.generate;
+
+import java.io.OutputStream;
+import java.util.Collection;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.ws.java2wsdl.Java2WSDLConstants;
+import org.apache.ws.java2wsdl.Java2WSDLUtils;
+import org.apache.ws.java2wsdl.SchemaGenerator;
+
+public class TuscanyJava2WSDLBuilder {
+
+ private OutputStream out;
+ private String className;
+ private ClassLoader classLoader;
+ private String wsdlPrefix = "wsdl";
+
+ private String serviceName = null;
+
+ //these apply for the WSDL
+ private String targetNamespace = null;
+ private String targetNamespacePrefix = null;
+
+ private String schemaTargetNamespace = null;
+ private String schemaTargetNamespacePrefix = null;
+ private String style = Java2WSDLConstants.DOCUMNT;
+ private String use = Java2WSDLConstants.LITERAL;
+ private String locationUri = Java2WSDLConstants.DEFAULT_LOCATION_URL;
+
+ private OMElement wsdlDocument = null;
+
+ public String getSchemaTargetNamespace() {
+ return schemaTargetNamespace;
+ }
+
+ public String getStyle() {
+ return style;
+ }
+
+ public String getLocationUri() {
+ return locationUri;
+ }
+
+ public void setLocationUri(String locationUri) {
+ this.locationUri = locationUri;
+ }
+
+ public void setStyle(String style) {
+ this.style = style;
+ }
+
+ public String getUse() {
+ return use;
+ }
+
+ public void setUse(String use) {
+ this.use = use;
+ }
+
+ public void setSchemaTargetNamespace(String schemaTargetNamespace) {
+ this.schemaTargetNamespace = schemaTargetNamespace;
+ }
+
+ public String getSchemaTargetNamespacePrefix() {
+ return schemaTargetNamespacePrefix;
+ }
+
+ public void setSchemaTargetNamespacePrefix(String schemaTargetNamespacePrefix) {
+ this.schemaTargetNamespacePrefix = schemaTargetNamespacePrefix;
+ }
+
+ public String getTargetNamespace() {
+ return targetNamespace;
+ }
+
+ public void setTargetNamespace(String targetNamespace) {
+ this.targetNamespace = targetNamespace;
+ }
+
+ public String getTargetNamespacePrefix() {
+ return targetNamespacePrefix;
+ }
+
+ public void setTargetNamespacePrefix(String targetNamespacePrefix) {
+ this.targetNamespacePrefix = targetNamespacePrefix;
+ }
+
+ public String getServiceName() {
+ return serviceName;
+ }
+
+ public void setServiceName(String serviceName) {
+ this.serviceName = serviceName;
+ }
+
+
+ public String getWsdlPrefix() {
+ return wsdlPrefix;
+ }
+
+ public void setWsdlPrefix(String wsdlPrefix) {
+ this.wsdlPrefix = wsdlPrefix;
+ }
+
+ /**
+ * @param out
+ * @param className
+ * @param classLoader
+ */
+ public TuscanyJava2WSDLBuilder(OutputStream out, String className, ClassLoader classLoader) {
+ this.out = out;
+ this.className = className;
+ this.classLoader = classLoader;
+ }
+
+
+ /**
+ * Externally visible generator method
+ *
+ * @throws Exception
+ */
+ public void buildWSDL() throws Exception
+ {
+ SchemaGenerator sg = new SchemaGenerator(classLoader, className,
+ schemaTargetNamespace, schemaTargetNamespacePrefix);
+ Collection schemaCollection = sg.generateSchema();
+ TuscanyJava2OMBuilder java2OMBuilder = new TuscanyJava2OMBuilder(sg.getMethods(),
+ schemaCollection,
+ sg.getTypeTable(),
+ serviceName == null ? Java2WSDLUtils.getSimpleClassName(className) : serviceName,
+ targetNamespace == null ? Java2WSDLUtils.namespaceFromClassName(className, classLoader).toString():targetNamespace,
+ targetNamespacePrefix,
+ style,
+ use,
+ locationUri);
+ wsdlDocument = java2OMBuilder.generateOM();
+ }
+
+ public OMElement getWsdlDocument()
+ {
+ return wsdlDocument;
+ }
+
+ public void setWsdlDocument(OMElement wsdlDocument)
+ {
+ this.wsdlDocument = wsdlDocument;
+ }
+}
+
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/WSDLGenEvent.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/WSDLGenEvent.java new file mode 100644 index 0000000000..951742a255 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/WSDLGenEvent.java @@ -0,0 +1,36 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.tools.java2wsdl.generate;
+
+import java.util.EventObject;
+
+public class WSDLGenEvent extends EventObject {
+ private int generationPhase = WSDLGenListener.UNKNOWN;
+
+ public WSDLGenEvent(Object source, int genPhase) {
+ super(source);
+ this.generationPhase = genPhase;
+ }
+
+ public int getGenerationPhase() {
+ return generationPhase;
+ }
+
+ public void setGenerationPhase(int generationPhase) {
+ this.generationPhase = generationPhase;
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/WSDLGenListener.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/WSDLGenListener.java new file mode 100644 index 0000000000..b4ae356bf6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/WSDLGenListener.java @@ -0,0 +1,37 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.tools.java2wsdl.generate;
+
+public interface WSDLGenListener {
+ public static int UNKNOWN = 0;
+
+ public static int INPUT_ARGS_PARSING = 1;
+
+ public static int INPUT_ARGS_VALIDATION = 2;
+
+ public static int WSDL_MODEL_CREATION = 3;
+
+ public static int WSDL_MODEL_WRITING = 4;
+
+ public static String[] phaseAsString = { "Unknown",
+ "Input Arguments Parsing", "Input Arguments Validation",
+ "WSDL Model Creation", "WSDL Model Writing" };
+
+ public void WSDLGenPhaseStarted(WSDLGenEvent event);
+
+ public void WSDLGenPhaseCompleted(WSDLGenEvent event);
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/WSDLModel.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/WSDLModel.java new file mode 100644 index 0000000000..69446eb0ca --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/java2wsdl/generate/WSDLModel.java @@ -0,0 +1,29 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.tools.java2wsdl.generate;
+
+
+/**
+ * This class provides a higher level abstraction to parts of the WSDL model
+ * generated by Axis to enable easy and straight forward access to these parts
+ * when the Tuscany Java2WSDL is applying fixes to the model.
+ *
+ */
+public class WSDLModel
+{
+ //this class is to be populated later after identifying requirements for it.
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/wsdl2java/generate/JavaInterfaceEmitter.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/wsdl2java/generate/JavaInterfaceEmitter.java new file mode 100644 index 0000000000..7bb2559b62 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/wsdl2java/generate/JavaInterfaceEmitter.java @@ -0,0 +1,200 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.tools.wsdl2java.generate; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.namespace.QName; + +import org.apache.axis2.description.AxisMessage; +import org.apache.axis2.description.AxisOperation; +import org.apache.axis2.util.FileWriter; +import org.apache.axis2.wsdl.WSDLConstants; +import org.apache.axis2.wsdl.codegen.CodeGenConfiguration; +import org.apache.axis2.wsdl.codegen.emitter.JavaEmitter; +import org.apache.axis2.wsdl.codegen.writer.InterfaceWriter; +import org.apache.axis2.wsdl.databinding.TypeMapper; +import org.apache.tuscany.model.util.XMLNameUtil; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +/** + * Overrides the Axis2 JavaEmitter to generate unwrapped methods. + */ +public class JavaInterfaceEmitter extends JavaEmitter { + + private CodeGenConfiguration codegenConfiguration; + private TypeMapper typeMapper; + + public void setCodeGenConfiguration(CodeGenConfiguration configuration) { + super.setCodeGenConfiguration(configuration); + codegenConfiguration=configuration; + } + + public void setMapper(TypeMapper typeMapper) { + super.setMapper(typeMapper); + this.typeMapper = typeMapper; + } + + private List getParameterElementList(Document doc, AxisMessage message, boolean wrapped) { + List parameterElementList = new ArrayList(); + + if (message != null && message.getElementQName()!=null) { + + SDODataBindingTypeMappingEntry typeMappingEntry = + (SDODataBindingTypeMappingEntry)this.typeMapper.getTypeMappingObject(message.getElementQName()); + List typeMappings; + if (wrapped) { + typeMappings = (List)typeMappingEntry.getPropertyClassNames(); + } else { + typeMappings = new ArrayList(); + typeMappings.add(typeMappingEntry.getClassName()); + } + + for (int i=0; i<typeMappings.size(); i++) { + Element param = doc.createElement("param"); + parameterElementList.add(param); + + String typeMapping = (String)typeMappings.get(i); + + addAttribute(doc, "name", this.typeMapper.getParameterName(message.getElementQName()), param); + addAttribute(doc, "type", (typeMapping == null) + ? "" + : typeMapping, param); + + // add an extra attribute to say whether the type mapping is the default + if (TypeMapper.DEFAULT_CLASS_NAME.equals(typeMapping)) { + addAttribute(doc, "default", "yes", param); + } + + addAttribute(doc, "value", null, param); + + // add this as a body parameter + addAttribute(doc, "location", "body", param); + + } + } + + return parameterElementList; + } + + private List getParameterElementList(Document doc, List parameters, String location) { + List parameterElementList = new ArrayList(); + + if ((parameters != null) && !parameters.isEmpty()) { + int count = parameters.size(); + + for (int i = 0; i < count; i++) { + Element param = doc.createElement("param"); + QName name = (QName) parameters.get(i); + + addAttribute(doc, "name", this.typeMapper.getParameterName(name), param); + + String typeMapping = this.typeMapper.getTypeMappingName(name); + String typeMappingStr = (typeMapping == null) + ? "" + : typeMapping; + + addAttribute(doc, "type", typeMappingStr, param); + addAttribute(doc, "location", location, param); + parameterElementList.add(param); + } + } + + return parameterElementList; + } + + protected boolean isWrapped(AxisOperation operation) { + boolean wrapped = false; + + if (isInputPresentForMEP(operation.getMessageExchangePattern())) { + QName qname = operation.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE).getElementQName(); + if (qname != null && qname.getLocalPart().equals(operation.getName().getLocalPart())) { + + SDODataBindingTypeMappingEntry typeMappingEntry = + (SDODataBindingTypeMappingEntry)this.typeMapper.getTypeMappingObject(qname); + if (typeMappingEntry.isAnonymous()) { + wrapped = true; + } + } + } + + return wrapped; + } + + private boolean isInputPresentForMEP(String MEP) { + return WSDLConstants.MEP_URI_IN_ONLY.equals(MEP) || + WSDLConstants.MEP_URI_IN_OPTIONAL_OUT.equals(MEP) || + WSDLConstants.MEP_URI_OUT_OPTIONAL_IN.equals(MEP) || + WSDLConstants.MEP_URI_ROBUST_OUT_ONLY.equals(MEP) || + WSDLConstants.MEP_URI_ROBUST_IN_ONLY.equals(MEP) || + WSDLConstants.MEP_URI_IN_OUT.equals(MEP); + } + + protected Element getInputElement(Document doc, AxisOperation operation, List headerParameterQNameList) { + return getElement(doc, "input", operation.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE), isWrapped(operation), headerParameterQNameList); + } + + protected Element getOutputElement(Document doc, AxisOperation operation, List headerParameterQNameList) { + return getElement(doc, "output", operation.getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE), isWrapped(operation), headerParameterQNameList); + } + + protected Element getElement(Document doc, String elementName, AxisMessage message, boolean wrapped, List headerParameterQNameList) { + Element element = doc.createElement(elementName); + + List parameterElementList = getParameterElementList(doc, message, wrapped); + for (int i = 0; i < parameterElementList.size(); i++) { + element.appendChild((Element) parameterElementList.get(i)); + } + + List outputElementList = getParameterElementList(doc, headerParameterQNameList, "header"); + + for (int i = 0; i < outputElementList.size(); i++) { + element.appendChild((Element) outputElementList.get(i)); + } + + return element; + } + + protected void writeInterface(boolean writeDatabinders) throws Exception { + Document interfaceModel = createDOMDocumentForInterface(writeDatabinders); + if (!codegenConfiguration.getOutputLocation().exists()) { + codegenConfiguration.getOutputLocation().mkdirs(); + } + InterfaceWriter interfaceWriter = new InterfaceWriter(this.codegenConfiguration + .getOutputLocation(), this.codegenConfiguration.getOutputLanguage()); + + String packageName = interfaceModel.getDocumentElement().getAttribute("package"); + String className = interfaceModel.getDocumentElement().getAttribute("name"); + + System.out.println(">> Generating Java class " + packageName + "." + className); + File outputFile = FileWriter.createClassFile(this.codegenConfiguration.getOutputLocation(), + packageName, className, ".java"); + if (outputFile.exists()) { + outputFile.delete(); + } + + writeClass(interfaceModel, interfaceWriter); + } + + protected String makeJavaClassName(String word) { + return XMLNameUtil.getJavaNameFromXMLName(word, true); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/wsdl2java/generate/JavaInterfaceGenerator.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/wsdl2java/generate/JavaInterfaceGenerator.java new file mode 100644 index 0000000000..7c31e0535c --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/wsdl2java/generate/JavaInterfaceGenerator.java @@ -0,0 +1,219 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.tools.wsdl2java.generate; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import javax.wsdl.Binding; +import javax.wsdl.Definition; +import javax.wsdl.Port; +import javax.wsdl.PortType; +import javax.wsdl.Service; +import javax.wsdl.WSDLException; +import javax.wsdl.factory.WSDLFactory; +import javax.wsdl.xml.WSDLReader; +import javax.xml.namespace.QName; +import javax.xml.parsers.ParserConfigurationException; + +import org.apache.axis2.AxisFault; +import org.apache.axis2.description.AxisService; +import org.apache.axis2.description.WSDL2AxisServiceBuilder; +import org.apache.axis2.util.XMLUtils; +import org.apache.axis2.wsdl.codegen.CodeGenConfiguration; +import org.apache.axis2.wsdl.codegen.CodeGenerationException; +import org.apache.axis2.wsdl.codegen.extension.CodeGenExtension; +import org.apache.axis2.wsdl.codegen.extension.DefaultDatabindingExtension; +import org.apache.axis2.wsdl.codegen.extension.PackageFinder; +import org.apache.axis2.wsdl.codegen.extension.WSDLValidatorExtension; +import org.apache.axis2.wsdl.databinding.JavaTypeMapper; +import org.apache.tuscany.model.util.XMLNameUtil; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +public class JavaInterfaceGenerator { + + private List codegenExtensions = new ArrayList(); + private List<CodeGenConfiguration> codegenConfigurations= new LinkedList<CodeGenConfiguration>(); + + + + + public JavaInterfaceGenerator(String uri, String ports[], String outputLocation, String packageName, + Map<QName, SDODataBindingTypeMappingEntry> typeMapping) throws CodeGenerationException { + + Definition definition; + try { + definition = readWSDL(uri); + } catch (WSDLException e) { + throw new CodeGenerationException(e); + } + + HashSet interestedPorts= ports == null ? null : new HashSet(Arrays.asList(ports)); + + // Service service=(Service)definition.getServices().values().().next(); + + HashSet<QName> donePortTypes= new HashSet<QName>(); + + for (Iterator sIter = definition.getServices().values().iterator(); sIter.hasNext(); ) { + Service service = (Service) sIter.next(); + + QName serviceQname = service.getQName(); + for (Iterator pIter= service.getPorts().values().iterator(); pIter.hasNext(); ) { + Port port= (Port) pIter.next(); + if(interestedPorts != null && ! interestedPorts.contains(port.getName())) continue;//not iterested. + PortType portType= getPortType(port); + if(null == portType) continue; // not connected. + QName pQName= portType.getQName(); + if(donePortTypes.contains(pQName)) continue; //allready did it. + donePortTypes.add(pQName); + + if (packageName == null) { + packageName = XMLNameUtil.getPackageNameFromNamespace(definition.getTargetNamespace()); + } + JavaTypeMapper typeMapper = new JavaTypeMapper(); + for (Map.Entry<QName, SDODataBindingTypeMappingEntry> e : typeMapping.entrySet()) { + typeMapper.addTypeMappingObject(e.getKey(), e.getValue()); + } + AxisService axisService; + try { + axisService = new WSDL2AxisServiceBuilder(definition, serviceQname, port.getName()).populateService(); + } catch (AxisFault e) { + throw new CodeGenerationException(e); + } + axisService.setName(port.getBinding().getPortType().getQName().getLocalPart()); + CodeGenConfiguration codegenConfiguration = new CodeGenConfiguration(Collections.EMPTY_MAP); + codegenConfigurations.add(codegenConfiguration); + codegenConfiguration.setAxisService(axisService); + codegenConfiguration.setAdvancedCodeGenEnabled(false); + codegenConfiguration.setAsyncOn(false); + codegenConfiguration.setDatabindingType("sdo"); + codegenConfiguration.setGenerateAll(true); + codegenConfiguration.setGenerateDeployementDescriptor(false); + codegenConfiguration.setOutputLanguage("java"); + codegenConfiguration.setOutputLocation(new File(outputLocation)); + codegenConfiguration.setPackageName(packageName); + codegenConfiguration.setPackClasses(false); + codegenConfiguration.setPolicyMap(Collections.EMPTY_MAP); + codegenConfiguration.setPortName(port.getName()); + codegenConfiguration.setServerSide(false); + codegenConfiguration.setServiceName(service.getQName().getLocalPart()); + codegenConfiguration.setSyncOn(true); + codegenConfiguration.setTypeMapper(typeMapper); + codegenConfiguration.setWriteMessageReceiver(false); + codegenConfiguration.setWriteTestCase(false); + addExtension(new WSDLValidatorExtension(), codegenConfiguration); + addExtension(new PackageFinder(), codegenConfiguration); + addExtension(new SDODataBindingCodegenExtension(typeMapper), codegenConfiguration); + addExtension(new DefaultDatabindingExtension(), codegenConfiguration); + } + } + } + + + private PortType getPortType(Port port) { + Binding binding = port.getBinding(); + if(null != binding){ + return binding.getPortType(); + } + return null; + + } + + + @SuppressWarnings("unchecked") + private void addExtension(CodeGenExtension ext, CodeGenConfiguration codegenConfiguration) { + ext.init(codegenConfiguration); + codegenExtensions.add(ext); + } + + public void generate() throws CodeGenerationException { + try { + for (int i = 0; i < codegenExtensions.size(); i++) { + ((CodeGenExtension)codegenExtensions.get(i)).engage(); + } + + for(CodeGenConfiguration codegenConfiguration : codegenConfigurations){ + JavaInterfaceEmitter emitter = new JavaInterfaceEmitter(); + emitter.setCodeGenConfiguration(codegenConfiguration); + emitter.setMapper(codegenConfiguration.getTypeMapper()); + + emitter.writeInterface(false); + } + + } catch (Exception e) { + throw new CodeGenerationException(e); + } + } + + /** + * Read the WSDL file + * @param uri + * @return + * @throws WSDLException + */ + private Definition readWSDL(String uri) throws WSDLException { + + WSDLReader reader = + WSDLFactory.newInstance().newWSDLReader(); + reader.setFeature("javax.wsdl.importDocuments", true); + + File file = new File(uri); + String baseURI; + + if (uri.startsWith("http://")){ + baseURI = uri; + } else{ + if(file.getParentFile() == null){ + try { + baseURI = new File(".").getCanonicalFile().toURI().toString(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else { + baseURI = file.getParentFile().toURI().toString(); + } + } + + Document doc; + try { + doc = XMLUtils.newDocument(uri); + } catch (ParserConfigurationException e) { + throw new WSDLException(WSDLException.PARSER_ERROR, + "Parser Configuration Error", + e); + } catch (SAXException e) { + throw new WSDLException(WSDLException.PARSER_ERROR, + "Parser SAX Error", + e); + + } catch (IOException e) { + throw new WSDLException(WSDLException.INVALID_WSDL, "IO Error", e); + } + + return reader.readWSDL(baseURI, doc); + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/wsdl2java/generate/SDODataBindingCodegenExtension.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/wsdl2java/generate/SDODataBindingCodegenExtension.java new file mode 100644 index 0000000000..2523b7efd6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/wsdl2java/generate/SDODataBindingCodegenExtension.java @@ -0,0 +1,47 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.tools.wsdl2java.generate; + +import org.apache.axis2.wsdl.codegen.extension.AbstractDBProcessingExtension; +import org.apache.axis2.wsdl.databinding.TypeMapper; + +/** + * SDO data binding codegen extension. + */ +public class SDODataBindingCodegenExtension extends AbstractDBProcessingExtension { + + private TypeMapper typeMapper; + + public SDODataBindingCodegenExtension(TypeMapper typeMapper) { + this.typeMapper=typeMapper; + } + + protected boolean testFallThrough(String dbFrameworkName) { + return !dbFrameworkName.equals("sdo"); + } + + public void engage() { + if (testFallThrough(configuration.getDatabindingType())) { + return; + } + + // Set the type mapper into the config + configuration.setTypeMapper(typeMapper); + + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/wsdl2java/generate/SDODataBindingTypeMappingEntry.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/wsdl2java/generate/SDODataBindingTypeMappingEntry.java new file mode 100644 index 0000000000..2f2e5521be --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/wsdl2java/generate/SDODataBindingTypeMappingEntry.java @@ -0,0 +1,49 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.tools.wsdl2java.generate; + +import java.util.List; + +/** + * This represents a type mapping entry, used by the JavaInterfaceEmitter to generate + * method signatures. + */ +public class SDODataBindingTypeMappingEntry { + + private final boolean anonymous; + private final List<String> propertyClassNames; + private final String className; + + public SDODataBindingTypeMappingEntry(String className, boolean anonymous, List<String> propertyClassNames) { + this.className = className; + this.anonymous = anonymous; + this.propertyClassNames = propertyClassNames; + } + + public boolean isAnonymous() { + return anonymous; + } + + public String getClassName() { + return className; + } + + public List<String> getPropertyClassNames() { + return propertyClassNames; + } + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/wsdl2java/generate/WSDL2JavaGenerator.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/wsdl2java/generate/WSDL2JavaGenerator.java new file mode 100644 index 0000000000..5cf3426c7e --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/main/java/org/apache/tuscany/tools/wsdl2java/generate/WSDL2JavaGenerator.java @@ -0,0 +1,347 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.tools.wsdl2java.generate; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.StringTokenizer; + +import javax.xml.namespace.QName; + +import org.apache.tuscany.sdo.helper.XSDHelperImpl; +import org.apache.tuscany.sdo.util.DataObjectUtil; +import org.eclipse.emf.codegen.ecore.genmodel.GenClass; +import org.eclipse.emf.codegen.ecore.genmodel.GenModel; +import org.eclipse.emf.codegen.ecore.genmodel.GenModelFactory; +import org.eclipse.emf.codegen.ecore.genmodel.GenPackage; +import org.eclipse.emf.codegen.util.CodeGenUtil; +import org.eclipse.emf.common.util.Diagnostic; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EClassifier; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.impl.EPackageRegistryImpl; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.util.BasicExtendedMetaData; +import org.eclipse.emf.ecore.util.ExtendedMetaData; + +import commonj.sdo.helper.XSDHelper; + +public class WSDL2JavaGenerator { + + /** + * Generate Java interfaces from WSDL Usage arguments: [ -targetDirectory + * <target-root-directory> ] [ -javaPackage <java-package-name> ] + * <wsdl-file> For example: generate somedir/somefile.wsdl Basic options: + * -targetDirectory Generates the Java source code in the specified + * directory. By default, the code is generated in the same directory as the + * input wsdl file. -javaPackage Overrides the Java package for the + * generated classes. By default the package name is derived from the + * targetNamespace of the WSDL definition being generated. For example, if + * the targetNamespace is "http://www.example.com/simple", the default + * package will be "com.example.simple". + */ + public static void main(String args[]) { + if (args.length == 0) { + printUsage(); + return; + } + + String portName = null; + String targetDirectory = null; + String wsdlJavaPackage = null; + String xsdJavaPackage = null; + + int index = 0; + for (; index < args.length && args[index].startsWith("-"); ++index) { + if (args[index].equalsIgnoreCase("-port")) { + portName = args[++index]; + } else if (args[index].equalsIgnoreCase("-targetDirectory")) { + targetDirectory = args[++index]; + } else if (args[index].equalsIgnoreCase("-javaPackage")) { + wsdlJavaPackage = args[++index]; + } + // else if (...) + else { + printUsage(); + return; + } + } + + String wsdlFileName = args[index]; + if (wsdlFileName == null || targetDirectory == null) { + printUsage(); + return; + } + + generateFromWSDL(wsdlFileName, portName!=null? new String[]{portName}:null, targetDirectory, wsdlJavaPackage, xsdJavaPackage, 0); + + } + + @SuppressWarnings("unchecked") + public static void generateFromWSDL(String wsdlFileName, String targetDirectory, + String wsdlJavaPackage, + String xsdJavaPackage, int genOptions){ + generateFromWSDL( wsdlFileName, null, targetDirectory, + wsdlJavaPackage, + xsdJavaPackage, genOptions); + + } + + + @SuppressWarnings("unchecked") + public static void generateFromWSDL(String wsdlFileName, String[] ports, + String targetDirectory, String wsdlJavaPackage, + String xsdJavaPackage, int genOptions) + { + + // Initialize the SDO runtime + DataObjectUtil.initRuntime(); + EPackage.Registry packageRegistry = new EPackageRegistryImpl(EPackage.Registry.INSTANCE); + ExtendedMetaData extendedMetaData = new BasicExtendedMetaData(packageRegistry); + XSDHelper xsdHelper = new XSDHelperImpl(extendedMetaData); + + try { + + // Load the WSDL file + File inputFile = new File(wsdlFileName).getAbsoluteFile(); + InputStream inputStream = new FileInputStream(inputFile); + + // Define SDO metadata + xsdHelper.define(inputStream, inputFile.toURI().toString()); + + if (targetDirectory == null) { + targetDirectory = new File(wsdlFileName).getCanonicalFile().getParent(); + } else { + targetDirectory = new File(targetDirectory).getCanonicalPath(); + } + + // Populate the typeMapping table that will be given to the Axis2 WSDL2Java + Map<QName, SDODataBindingTypeMappingEntry> typeMapping = + new HashMap<QName, SDODataBindingTypeMappingEntry>(); + if (!packageRegistry.values().isEmpty()) { + ResourceSet resourceSet = DataObjectUtil.createResourceSet(); + + // Populate list of GenPackages and a map of GenClasses keyed by EClass + List<GenPackage> genPackages = new ArrayList<GenPackage>(); + Map<EClass, GenClass> genClasses = new HashMap<EClass, GenClass>(); + for (Iterator iter = packageRegistry.values().iterator(); iter.hasNext();) { + EPackage currentEPackage = (EPackage)iter.next(); + String currentBasePackage = extractBasePackageName(currentEPackage, xsdJavaPackage); + String currentPrefix = CodeGenUtil.capName(currentEPackage.getName()); + + GenPackage currentGenPackage = createGenPackage(currentEPackage, currentBasePackage, + currentPrefix, genOptions, resourceSet); + genPackages.add(currentGenPackage); + for (GenClass genClass : (List<GenClass>)currentGenPackage.getGenClasses()) { + genClasses.put(genClass.getEcoreClass(), genClass); + } + + } + + // Process all the SDO packages + // Populate the qname -> interfaceName typeMapping table + for (GenPackage currentGenPackage : genPackages) { + EPackage currentEPackage = currentGenPackage.getEcorePackage(); + + // Populate the type mappings for all the complex types + for (GenClass genClass : (List<GenClass>)currentGenPackage.getGenClasses()) { + QName qname = new QName(extendedMetaData.getNamespace(currentEPackage), + extendedMetaData.getName(genClass.getEcoreClass())); + String interfaceName = currentGenPackage.getInterfacePackageName() + '.' + + genClass.getInterfaceName(); + SDODataBindingTypeMappingEntry typeMappingEntry = + new SDODataBindingTypeMappingEntry(interfaceName, false, null); + typeMapping.put(qname, typeMappingEntry); + } + + // Process all the global XSD elements + EClass documentRoot = extendedMetaData.getDocumentRoot(currentEPackage); + if (documentRoot != null) { + for (EStructuralFeature element : (List<EStructuralFeature>)extendedMetaData + .getElements(documentRoot)) { + EClassifier elementType = element.getEType(); + + // Handle a complex type + if (elementType instanceof EClass) { + EClass eClass = (EClass)elementType; + + GenClass genClass = genClasses.get(elementType); + QName qname = new QName(extendedMetaData.getNamespace(currentEPackage), + extendedMetaData.getName(element)); + String interfaceName = genClass.getGenPackage().getInterfacePackageName() + + '.' + genClass.getInterfaceName(); + boolean anonymous = extendedMetaData.isAnonymous(eClass); + + // Build list of property class names + List<String> propertyClassNames=new ArrayList<String>(); + for (EStructuralFeature feature : (List<EStructuralFeature>)eClass.getEStructuralFeatures()) { + EClassifier propertyType = feature.getEType(); + if (propertyType instanceof EClass) { + GenClass propertyGenClass = genClasses.get(propertyType); + String propertyClassName = propertyGenClass.getGenPackage().getInterfacePackageName() + + '.' + propertyGenClass.getInterfaceName(); + propertyClassNames.add(propertyClassName); + } else if (propertyType instanceof EClassifier) { + String propertyClassName = propertyType.getInstanceClass().getName(); + propertyClassNames.add(propertyClassName); + } + } + + SDODataBindingTypeMappingEntry typeMappingEntry = + new SDODataBindingTypeMappingEntry(interfaceName, anonymous, propertyClassNames); + typeMapping.put(qname, typeMappingEntry); + + } else { + + // Handle a simple type + QName qname = new QName(extendedMetaData.getNamespace(currentEPackage), + extendedMetaData.getName(element)); + String className = elementType.getInstanceClass().getName(); + SDODataBindingTypeMappingEntry typeMappingEntry = + new SDODataBindingTypeMappingEntry(className, false, null); + typeMapping.put(qname, typeMappingEntry); + } + } + } + } + } + + try { + JavaInterfaceGenerator codeGenerator = new JavaInterfaceGenerator(wsdlFileName, + ports, + targetDirectory, + wsdlJavaPackage, + typeMapping); + codeGenerator.generate(); + } catch (Exception e) { + throw new IllegalArgumentException(e); + } + + } catch (IOException e) { + throw new IllegalArgumentException(e); + } + } + + @SuppressWarnings("unchecked") + public static GenPackage createGenPackage(EPackage ePackage, String basePackage, String prefix, + int genOptions, ResourceSet resourceSet) { + GenModel genModel = ecore2GenModel(ePackage, basePackage, prefix, genOptions); + + URI ecoreURI = URI.createURI("file:///" + ePackage.getName() + ".ecore"); + URI genModelURI = ecoreURI.trimFileExtension().appendFileExtension("genmodel"); + + Resource ecoreResource = resourceSet.createResource(ecoreURI); + ecoreResource.getContents().add(ePackage); + + Resource genModelResource = resourceSet.createResource(genModelURI); + genModelResource.getContents().add(genModel); + + return (GenPackage)genModel.getGenPackages().get(0); + } + + public static GenModel ecore2GenModel(EPackage ePackage, String basePackage, + String prefix, int genOptions) { + GenModel genModel = GenModelFactory.eINSTANCE.createGenModel(); + genModel.initialize(Collections.singleton(ePackage)); + + genModel.setRootExtendsInterface(""); + genModel.setRootImplementsInterface("commonj.sdo.DataObject"); + genModel.setRootExtendsClass("org.apache.tuscany.sdo.impl.DataObjectImpl"); + genModel.setFeatureMapWrapperInterface("commonj.sdo.Sequence"); + genModel.setFeatureMapWrapperInternalInterface("org.apache.tuscany.sdo.util.BasicSequence"); + genModel.setFeatureMapWrapperClass("org.apache.tuscany.sdo.util.BasicSequence"); + genModel.setSuppressEMFTypes(true); + genModel.setSuppressEMFMetaData(true); + genModel.setSuppressEMFModelTags(true); + genModel.setCanGenerate(true); + // FIXME workaround java.lang.NoClassDefFoundError: + // org/eclipse/jdt/core/jdom/IDOMNode with 02162006 build + genModel.setFacadeHelperClass("Hack"); + genModel.setForceOverwrite(true); + + GenPackage genPackage = (GenPackage)genModel.getGenPackages().get(0); + + if (basePackage != null) { + genPackage.setBasePackage(basePackage); + } + if (prefix != null) { + genPackage.setPrefix(prefix); + } + + return genModel; + } + + public static String extractBasePackageName(EPackage ePackage, String javaPackage) { + String qualifiedName = javaPackage != null ? javaPackage : ePackage.getName(); + String name = /* CodeGenUtil. */shortName(qualifiedName); + String baseName = qualifiedName.substring(0, qualifiedName.length() - name.length()); + if (javaPackage != null || !name.equals(qualifiedName)) { + ePackage.setName(name); + } + return baseName != null ? /* CodeGenUtil. */safeQualifiedName(baseName) : null; + } + + public static String shortName(String qualifiedName) { + int index = qualifiedName.lastIndexOf("."); + return index != -1 ? qualifiedName.substring(index + 1) : qualifiedName; + } + + public static String safeQualifiedName(String qualifiedName) { + StringBuffer safeQualifiedName = new StringBuffer(); + for (StringTokenizer stringTokenizer = new StringTokenizer(qualifiedName, "."); + stringTokenizer.hasMoreTokens();) { + String name = stringTokenizer.nextToken(); + safeQualifiedName.append(CodeGenUtil.safeName(name)); + if (stringTokenizer.hasMoreTokens()) { + safeQualifiedName.append('.'); + } + } + return safeQualifiedName.toString(); + } + + protected static void printDiagnostic(Diagnostic diagnostic, String indent) { + System.out.print(indent); + System.out.println(diagnostic.getMessage()); + for (Iterator i = diagnostic.getChildren().iterator(); i.hasNext();) { + printDiagnostic((Diagnostic)i.next(), indent + " "); + } + } + + protected static void printUsage() { + System.out.println("Usage arguments:"); + System.out.println(" [ -targetDirectory <target-root-directory> ]"); + System.out.println(" [ -javaPackage <java-package-name> ]"); + System.out.println(" <wsdl-file>"); + System.out.println(""); + System.out.println("For example:"); + System.out.println(""); + System.out.println(" generate somedir/somefile.wsdl"); + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/java2wsdl/generate/Account.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/java2wsdl/generate/Account.java new file mode 100644 index 0000000000..110f206700 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/java2wsdl/generate/Account.java @@ -0,0 +1,51 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.tools.java2wsdl.generate;
+
+import java.math.BigDecimal;
+
+public class Account {
+ int accountType;
+
+ String accountNo;
+
+ BigDecimal balance;
+
+ public String getAccountNo() {
+ return accountNo;
+ }
+
+ public void setAccountNo(String accountNo) {
+ this.accountNo = accountNo;
+ }
+
+ public int getAccountType() {
+ return accountType;
+ }
+
+ public void setAccountType(int accountType) {
+ this.accountType = accountType;
+ }
+
+ public BigDecimal getBalance() {
+ return balance;
+ }
+
+ public void setBalance(BigDecimal balance) {
+ this.balance = balance;
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/java2wsdl/generate/Customer.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/java2wsdl/generate/Customer.java new file mode 100644 index 0000000000..a1ff6d9771 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/java2wsdl/generate/Customer.java @@ -0,0 +1,27 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.tools.java2wsdl.generate;
+
+public class Customer {
+ private String name = "";
+
+ public int custType = 0;
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/java2wsdl/generate/CustomerValue.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/java2wsdl/generate/CustomerValue.java new file mode 100644 index 0000000000..8f84925f58 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/java2wsdl/generate/CustomerValue.java @@ -0,0 +1,32 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.tools.java2wsdl.generate;
+
+public class CustomerValue {
+
+ public int getValue(String custId, String stockSymbol) {
+ return 0;
+ }
+
+ public Customer getCustomerDetails(String custId) {
+ return new Customer();
+ }
+
+ /*
+ * private String privateOperation() { return ""; }
+ */
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/java2wsdl/generate/CustomerWithAccount.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/java2wsdl/generate/CustomerWithAccount.java new file mode 100644 index 0000000000..a117c47626 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/java2wsdl/generate/CustomerWithAccount.java @@ -0,0 +1,44 @@ +/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed 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.tools.java2wsdl.generate;
+
+public class CustomerWithAccount {
+
+ private Customer customer = new Customer();
+
+ private Account[] accounts;
+
+ public int getValue(String custId, String stockSymbol) {
+ return 123;
+ }
+
+ public Customer getCustomerDetails(String custId) {
+ return customer;
+ }
+
+ public Account getCustomerAccount(String custId, String accountId) {
+ return accounts[0];
+ }
+
+ public Account[] getAccounts() {
+ return accounts;
+ }
+
+ public void setAccounts(Account[] accounts) {
+ this.accounts = accounts;
+ }
+}
diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/java2wsdl/generate/TuscanyJava2WSDLTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/java2wsdl/generate/TuscanyJava2WSDLTestCase.java new file mode 100644 index 0000000000..c064ee4abe --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/java2wsdl/generate/TuscanyJava2WSDLTestCase.java @@ -0,0 +1,86 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.tools.java2wsdl.generate; + +import java.io.File; + +import junit.framework.TestCase; + +/** + * A JUnit test case to test the Tuscany Java 2 WSDL Generation + */ +public class TuscanyJava2WSDLTestCase extends TestCase { + + /** + * setup the pre-requisites for the test case to run + * + * @exception Exception + */ + protected void setUp() throws Exception { + // System.out.println("inside setup"); + super.setUp(); + } + + /** + * @exception Exception + */ + protected void tearDown() throws Exception { + // System.out.println("inside tearDown"); + super.tearDown(); + } + + /** + * Simple WSDL generation test. + */ + public void testSimpleWSDLGeneration() { + String[] arguments = new String[] { "-cn", + "org.apache.tuscany.tools.java2wsdl.generate.CustomerValue", + "-o", "target/java2wsdl-source", }; + + Java2WSDL.main(arguments); + + File file = new File("target/java2wsdl-source/CustomerValue.wsdl"); + assertTrue(file.exists() && file.isFile()); + } + + /** + * Test WSDL generation where a parameter Object[] is involved. + */ + public void testWsdlGeneration2() { + + String[] arguments = new String[] { + "-cn", + "org.apache.tuscany.tools.java2wsdl.generate.CustomerWithAccount", + "-o", "target/java2wsdl-source", }; + Java2WSDL.main(arguments); + + File file = new File("target/java2wsdl-source/CustomerWithAccount.wsdl"); + assertTrue(file.exists() && file.isFile()); + } + + /** + * Test WSDL generation from a java interface and then generate the java + * interface using the generated WSDL. + */ + public void testRoundTrip() { + // TODO implement round trip + // this should re-generate java interfaces from the generated wsdl + // and compile (?) the generated java code. + // fail(); + + } +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/wsdl2java/generate/WSDL2JavaGeneratorTestCase.java b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/wsdl2java/generate/WSDL2JavaGeneratorTestCase.java new file mode 100644 index 0000000000..a5ee20f9fb --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/java/org/apache/tuscany/tools/wsdl2java/generate/WSDL2JavaGeneratorTestCase.java @@ -0,0 +1,42 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.tools.wsdl2java.generate; + +import junit.framework.TestCase; + +/** + * Test case for WSDL2Java + */ +public class WSDL2JavaGeneratorTestCase extends TestCase { + + public void testAccountService() { + + String basedir = System.getProperty("basedir"); + if (basedir == null) + basedir ="."; + + + String[] args=new String[] { "-targetDirectory", basedir + "/target/wsdl2java-source", + "-javaPackage", "org.apache.tuscany.tools.wsdl2java.generate.account", + basedir + "/src/test/resources/AccountService.wsdl"}; + + WSDL2JavaGenerator.main(args); + + } + + +} diff --git a/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/resources/AccountService.wsdl b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/resources/AccountService.wsdl new file mode 100644 index 0000000000..8a694fa4fd --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060518/java/sca/tools/src/test/resources/AccountService.wsdl @@ -0,0 +1,239 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed 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.
+ -->
+<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:tns="http://www.bigbank.com/Account/"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:account="http://www.bigbank.com/Account/"
+ targetNamespace="http://www.bigbank.com/Account/" + name="AccountService">
+
+ <wsdl:types>
+ <xsd:schema targetNamespace="http://www.bigbank.com/Account/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:account="http://www.bigbank.com/Account/" + xmlns:sdojava="commonj.sdo/java" + sdojava:package="org.apache.tuscany.samples.bigbank.account">
+
+ <xsd:element name="getAccountReportWrapped0">
+ <xsd:complexType>
+ <xsd:sequence>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="getAccountReportWrapped0Response">
+ <xsd:complexType>
+ <xsd:sequence>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="getAccountReportWrapped1"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="customerID" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element>
+ <xsd:element name="getAccountReportWrapped1Response"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="accountReport" type="account:AccountReport"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> +
+ <xsd:element name="getAccountReportWrappedN">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="customerID" type="xsd:string"/>
+ <xsd:element name="customerID2" type="xsd:int"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="getAccountReportWrappedNResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="accountReport" type="account:AccountReport"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="getAccountReportBare0" type="xsd:string"/>
+ <xsd:element name="getAccountReportBare0Response" type="xsd:int"/>
+
+ <xsd:element name="getAccountReportBare1Simple" type="xsd:string"/>
+ <xsd:element name="getAccountReportBare1SimpleResponse" type="xsd:int"/>
+
+ <xsd:element name="getAccountReportBare1Complex" type="account:AccountRequest"/>
+ <xsd:element name="getAccountReportBare1ComplexResponse" type="account:AccountReport"/>
+
+ <xsd:complexType name="AccountRequest">
+ <xsd:sequence>
+ <xsd:element name="customerID" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="AccountReport">
+ <xsd:sequence>
+ <xsd:element name="accountSummaries" type="account:AccountSummary" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ <xsd:complexType name="AccountSummary">
+ <xsd:attribute name="accountNumber" type="xsd:string"/>
+ <xsd:attribute name="accountType" type="xsd:string"/>
+ <xsd:attribute name="balance" type="xsd:float"/>
+ </xsd:complexType>
+
+ </xsd:schema>
+ </wsdl:types>
+
+ <wsdl:message name="getAccountReportWrapped0Request">
+ <wsdl:part element="account:getAccountReportWrapped0" name="getAccountReportWrapped0Request"/>
+ </wsdl:message>
+ <wsdl:message name="getAccountReportWrapped0Response">
+ <wsdl:part element="account:getAccountReportWrapped0Response" name="getAccountReportWrapped0Response"/>
+ </wsdl:message>
+
+ <wsdl:message name="getAccountReportWrapped1Request">
+ <wsdl:part element="account:getAccountReportWrapped1" name="getAccountReportWrapped1Request"/>
+ </wsdl:message>
+ <wsdl:message name="getAccountReportWrapped1Response">
+ <wsdl:part element="account:getAccountReportWrapped1Response" name="getAccountReportWrapped1Response"/>
+ </wsdl:message>
+
+ <wsdl:message name="getAccountReportWrappedNRequest">
+ <wsdl:part element="account:getAccountReportWrappedN" name="getAccountReportWrappedNRequest"/>
+ </wsdl:message>
+ <wsdl:message name="getAccountReportWrappedNResponse">
+ <wsdl:part element="account:getAccountReportWrappedNResponse" name="getAccountReportWrappedNResponse"/>
+ </wsdl:message>
+
+ <wsdl:message name="getAccountReportBare0Request">
+ </wsdl:message>
+ <wsdl:message name="getAccountReportBare0Response">
+ </wsdl:message>
+
+ <wsdl:message name="getAccountReportBare1SimpleRequest">
+ <wsdl:part element="account:getAccountReportBare1Simple" name="getAccountReportBare1SimpleRequest"/>
+ </wsdl:message>
+ <wsdl:message name="getAccountReportBare1SimpleResponse">
+ <wsdl:part element="account:getAccountReportBare1SimpleResponse" name="getAccountReportBare1SimpleResponse"/>
+ </wsdl:message>
+
+ <wsdl:message name="getAccountReportBare1ComplexRequest">
+ <wsdl:part element="account:getAccountReportBare1Complex" name="getAccountReportBare1ComplexRequest"/>
+ </wsdl:message>
+ <wsdl:message name="getAccountReportBare1ComplexResponse">
+ <wsdl:part element="account:getAccountReportBare1ComplexResponse" name="getAccountReportBare1ComplexResponse"/>
+ </wsdl:message>
+
+ <wsdl:portType name="Account_Service">
+ <wsdl:operation name="getAccountReportWrapped0">
+ <wsdl:input message="tns:getAccountReportWrapped0Request"/>
+ <wsdl:output message="tns:getAccountReportWrapped0Response"/>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportWrapped1">
+ <wsdl:input message="tns:getAccountReportWrapped1Request"/>
+ <wsdl:output message="tns:getAccountReportWrapped1Response"/>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportWrappedN">
+ <wsdl:input message="tns:getAccountReportWrappedNRequest"/>
+ <wsdl:output message="tns:getAccountReportWrappedNResponse"/>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportBare0">
+ <wsdl:input message="tns:getAccountReportBare0Request"/>
+ <wsdl:output message="tns:getAccountReportBare0Response"/>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportBare1Simple">
+ <wsdl:input message="tns:getAccountReportBare1SimpleRequest"/>
+ <wsdl:output message="tns:getAccountReportBare1SimpleResponse"/>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportBare1Complex">
+ <wsdl:input message="tns:getAccountReportBare1ComplexRequest"/>
+ <wsdl:output message="tns:getAccountReportBare1ComplexResponse"/>
+ </wsdl:operation>
+ </wsdl:portType>
+ <wsdl:binding name="AccountServiceSOAP" type="tns:Account_Service">
+ <soap:binding style="document"
+ transport="http://schemas.xmlsoap.org/soap/http"/>
+ <wsdl:operation name="getAccountReportWrapped0">
+ <soap:operation
+ soapAction="http://www.bigbank.com/Account/getAccountReportWrapped0"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportWrapped1">
+ <soap:operation
+ soapAction="http://www.bigbank.com/Account/getAccountReportWrapped1"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportWrappedN">
+ <soap:operation
+ soapAction="http://www.bigbank.com/Account/getAccountReportWrappedN"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportBare0">
+ <soap:operation
+ soapAction="http://www.bigbank.com/Account/getAccountReportBare0"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportBare1Simple">
+ <soap:operation
+ soapAction="http://www.bigbank.com/Account/getAccountReportBare1Simple"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="getAccountReportBare1Complex">
+ <soap:operation
+ soapAction="http://www.bigbank.com/Account/getAccountReportBare1Complex"/>
+ <wsdl:input>
+ <soap:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:service name="AccountService">
+ <wsdl:port binding="tns:AccountServiceSOAP"
+ name="AccountServiceSOAP">
+ <soap:address location="http://localhost:8080/sample-account/services/AccountService"/>
+ </wsdl:port>
+ </wsdl:service>
+</wsdl:definitions>
|