From 9bed5ae38c581999db465b42b504026a7097af95 Mon Sep 17 00:00:00 2001 From: lresende Date: Wed, 11 Nov 2009 23:11:56 +0000 Subject: Moving 1.x branches git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@835141 13f79535-47bb-0310-9956-ffa450edef68 --- .../runtime/webapp/plugin.war/LICENSE.txt | 1407 ++++++++++++++++++++ .../runtime/webapp/plugin.war/NOTICE.txt | 14 + .../runtime/webapp/plugin.war/pom.xml | 48 + .../org/apache/tuscany/plugin/war/Dependency.java | 122 ++ .../apache/tuscany/plugin/war/TuscanyWarMojo.java | 489 +++++++ .../pre-spec-changes/runtime/webapp/pom.xml | 40 + .../runtime/webapp/webapp-api/.ruleset | 190 +++ .../runtime/webapp/webapp-api/LICENSE.txt | 202 +++ .../runtime/webapp/webapp-api/NOTICE.txt | 14 + .../runtime/webapp/webapp-api/pom.xml | 60 + .../apache/tuscany/runtime/webapp/Constants.java | 89 ++ .../runtime/webapp/InvalidResourcePath.java | 31 + .../runtime/webapp/ServletLauncherMonitor.java | 33 + .../runtime/webapp/TuscanyContextListener.java | 110 ++ .../tuscany/runtime/webapp/TuscanyFilter.java | 75 ++ .../runtime/webapp/TuscanyInitException.java | 48 + .../runtime/webapp/TuscanyRequestListener.java | 76 ++ .../tuscany/runtime/webapp/TuscanyServlet.java | 58 + .../runtime/webapp/TuscanySessionListener.java | 53 + .../tuscany/runtime/webapp/WebappRuntime.java | 77 ++ .../tuscany/runtime/webapp/WebappRuntimeInfo.java | 36 + .../runtime/webapp/WebappRuntimeInfoImpl.java | 67 + .../apache/tuscany/runtime/webapp/WebappUtil.java | 56 + .../tuscany/runtime/webapp/WebappUtilImpl.java | 124 ++ .../webapp/TuscanyContextListenerTestCase.java | 102 ++ .../runtime/webapp/TuscanyFilterTestCase.java | 122 ++ .../runtime/webapp/TuscanyServletTestCase.java | 80 ++ .../webapp/TuscanySessionListenerTestCase.java | 60 + .../tuscany/runtime/webapp/WebappUtilTestCase.java | 131 ++ .../runtime/webapp/webapp-host/.ruleset | 190 +++ .../runtime/webapp/webapp-host/LICENSE.txt | 202 +++ .../runtime/webapp/webapp-host/NOTICE.txt | 14 + .../runtime/webapp/webapp-host/pom.xml | 70 + .../tuscany/runtime/webapp/LazyHTTPSessionId.java | 58 + .../tuscany/runtime/webapp/ServletHostImpl.java | 142 ++ .../webapp/ServletLauncherInitException.java | 48 + .../webapp/UnSupportedRuntimeException.java | 44 + .../runtime/webapp/WebResourceScanExtender.java | 82 ++ .../tuscany/runtime/webapp/WebappRuntimeImpl.java | 179 +++ .../main/resources/META-INF/sca/binding.axis2.scdl | 44 + .../resources/META-INF/sca/databinding.sdo.scdl | 34 + .../main/resources/META-INF/tuscany/webapp.scdl | 172 +++ .../org/apache/tuscany/runtime/webapp/Foo.java | 25 + .../org/apache/tuscany/runtime/webapp/FooImpl.java | 25 + .../runtime/webapp/LazyHTTPSessionIdTestCase.java | 44 + .../runtime/webapp/ServletHostTestCase.java | 86 ++ .../runtime/webapp/WebappRuntimeImplTestCase.java | 107 ++ .../webapp-host/src/test/resources/testapp.scdl | 26 + 48 files changed, 5606 insertions(+) create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/LICENSE.txt create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/NOTICE.txt create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/pom.xml create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/src/main/java/org/apache/tuscany/plugin/war/Dependency.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/src/main/java/org/apache/tuscany/plugin/war/TuscanyWarMojo.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/pom.xml create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/.ruleset create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/LICENSE.txt create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/NOTICE.txt create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/pom.xml create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/Constants.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/InvalidResourcePath.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/ServletLauncherMonitor.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyContextListener.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyFilter.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyInitException.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyRequestListener.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyServlet.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanySessionListener.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappRuntime.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappRuntimeInfo.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappRuntimeInfoImpl.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappUtil.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappUtilImpl.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/TuscanyContextListenerTestCase.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/TuscanyFilterTestCase.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/TuscanyServletTestCase.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/TuscanySessionListenerTestCase.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/WebappUtilTestCase.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/.ruleset create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/LICENSE.txt create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/NOTICE.txt create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/pom.xml create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/LazyHTTPSessionId.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/ServletHostImpl.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/ServletLauncherInitException.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/UnSupportedRuntimeException.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/WebResourceScanExtender.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/WebappRuntimeImpl.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/resources/META-INF/sca/binding.axis2.scdl create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/resources/META-INF/sca/databinding.sdo.scdl create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/resources/META-INF/tuscany/webapp.scdl create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/Foo.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/FooImpl.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/LazyHTTPSessionIdTestCase.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/ServletHostTestCase.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/WebappRuntimeImplTestCase.java create mode 100644 sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/resources/testapp.scdl (limited to 'sca-java-1.x/branches/pre-spec-changes/runtime/webapp') diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/LICENSE.txt b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/LICENSE.txt new file mode 100644 index 0000000000..9601ead3f6 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/LICENSE.txt @@ -0,0 +1,1407 @@ + + 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. + + +APACHE TUSCANY SUBCOMPONENTS: + +The Apache Tuscany distribution includes a number of subcomponents with +separate copyright notices and license terms. Your use of the source +code for the these subcomponents is subject to the terms and +conditions of the following licenses. + +=============================================================================== + +For the Eclipse Modeling Framework component and the Celtix binding: + +Eclipse Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE +PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF +THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and +documentation distributed under this Agreement, and +b) in the case of each subsequent Contributor: + +i) changes to the Program, and + +ii) additions to the Program; + +where such changes and/or additions to the Program originate from and +are distributed by that particular Contributor. A Contribution +'originates' from a Contributor if it was added to the Program by such +Contributor itself or anyone acting on such Contributor's behalf. +Contributions do not include additions to the Program which: (i) are +separate modules of software distributed in conjunction with the +Program under their own license agreement, and (ii) are not derivative +works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor +which are necessarily infringed by the use or sale of its Contribution +alone or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this +Agreement, including all Contributors. + +2. GRANT OF RIGHTS + +a) Subject to the terms of this Agreement, each Contributor hereby +grants Recipient a non-exclusive, worldwide, royalty-free copyright +license to reproduce, prepare derivative works of, publicly display, +publicly perform, distribute and sublicense the Contribution of such +Contributor, if any, and such derivative works, in source code and +object code form. + +b) Subject to the terms of this Agreement, each Contributor hereby +grants Recipient a non-exclusive, worldwide, royalty-free patent +license under Licensed Patents to make, use, sell, offer to sell, +import and otherwise transfer the Contribution of such Contributor, if +any, in source code and object code form. This patent license shall +apply to the combination of the Contribution and the Program if, at +the time the Contribution is added by the Contributor, such addition +of the Contribution causes such combination to be covered by the +Licensed Patents. The patent license shall not apply to any other +combinations which include the Contribution. No hardware per se is +licensed hereunder. + +c) Recipient understands that although each Contributor grants the +licenses to its Contributions set forth herein, no assurances are +provided by any Contributor that the Program does not infringe the +patent or other intellectual property rights of any other entity. Each +Contributor disclaims any liability to Recipient for claims brought by +any other entity based on infringement of intellectual property rights +or otherwise. As a condition to exercising the rights and licenses +granted hereunder, each Recipient hereby assumes sole responsibility +to secure any other intellectual property rights needed, if any. For +example, if a third party patent license is required to allow +Recipient to distribute the Program, it is Recipient's responsibility +to acquire that license before distributing the Program. + +d) Each Contributor represents that to its knowledge it has sufficient +copyright rights in its Contribution, if any, to grant the copyright +license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form +under its own license agreement, provided that: + +a) it complies with the terms and conditions of this Agreement; and + +b) its license agreement: + +i) effectively disclaims on behalf of all Contributors all warranties +and conditions, express and implied, including warranties or +conditions of title and non-infringement, and implied warranties or +conditions of merchantability and fitness for a particular purpose; + +ii) effectively excludes on behalf of all Contributors all liability +for damages, including direct, indirect, special, incidental and +consequential damages, such as lost profits; + +iii) states that any provisions which differ from this Agreement are +offered by that Contributor alone and not by any other party; and + +iv) states that source code for the Program is available from such +Contributor, and informs licensees how to obtain it in a reasonable +manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + +a) it must be made available under this Agreement; and + +b) a copy of this Agreement must be included with each copy of the +Program. + +Contributors may not remove or alter any copyright notices contained +within the Program. + +Each Contributor must identify itself as the originator of its +Contribution, if any, in a manner that reasonably allows subsequent +Recipients to identify the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain +responsibilities with respect to end users, business partners and the +like. While this license is intended to facilitate the commercial use +of the Program, the Contributor who includes the Program in a +commercial product offering should do so in a manner which does not +create potential liability for other Contributors. Therefore, if a +Contributor includes the Program in a commercial product offering, +such Contributor ("Commercial Contributor") hereby agrees to defend +and indemnify every other Contributor ("Indemnified Contributor") +against any losses, damages and costs (collectively "Losses") arising +from claims, lawsuits and other legal actions brought by a third party +against the Indemnified Contributor to the extent caused by the acts +or omissions of such Commercial Contributor in connection with its +distribution of the Program in a commercial product offering. The +obligations in this section do not apply to any claims or Losses +relating to any actual or alleged intellectual property infringement. +In order to qualify, an Indemnified Contributor must: a) promptly +notify the Commercial Contributor in writing of such claim, and b) +allow the Commercial Contributor to control, and cooperate with the +Commercial Contributor in, the defense and any related settlement +negotiations. The Indemnified Contributor may participate in any such +claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those +performance claims and warranties, and if a court requires any other +Contributor to pay any damages as a result, the Commercial Contributor +must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS +PROVIDED 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. Each Recipient is solely +responsible for determining the appropriateness of using and +distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement , including but not limited to +the risks and costs of program errors, compliance with applicable +laws, damage to or loss of data, programs or equipment, and +unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR +ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING +WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR +DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED +HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that +the Program itself (excluding combinations of the Program with other +software or hardware) infringes such Recipient's patent(s), then such +Recipient's rights granted under Section 2(b) shall terminate as of +the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and +survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign +the responsibility to serve as the Agreement Steward to a suitable +separate entity. Each new version of the Agreement will be given a +distinguishing version number. The Program (including Contributions) +may always be distributed subject to the version of the Agreement +under which it was received. In addition, after a new version of the +Agreement is published, Contributor may elect to distribute the +Program (including its Contributions) under the new version. Except as +expressly stated in Sections 2(a) and 2(b) above, Recipient receives +no rights or licenses to the intellectual property of any Contributor +under this Agreement, whether expressly, by implication, estoppel or +otherwise. All rights in the Program not expressly granted under this +Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and +the intellectual property laws of the United States of America. No +party to this Agreement will bring a legal action under this Agreement +more than one year after the cause of action arose. Each party waives +its rights to a jury trial in any resulting litigation. + +=============================================================================== + +For the Rhino JavaScript container component: + +Netscape Public License V1.1 + + AMENDMENTS + + The Netscape Public License Version 1.1 ("NPL") consists of the + Mozilla Public License Version 1.1 with the following Amendments, + including Exhibit A-Netscape Public License. Files identified with + "Exhibit A-Netscape Public License" are governed by the Netscape + Public License Version 1.1. + + Additional Terms applicable to the Netscape Public License. + I. Effect. + These additional terms described in this Netscape Public + License -- Amendments shall apply to the Mozilla Communicator + client code and to all Covered Code under this License. + + II. "Netscape's Branded Code" means Covered Code that Netscape + distributes and/or permits others to distribute under one or more + trademark(s) which are controlled by Netscape but which are not + licensed for use under this License. + + III. Netscape and logo. + This License does not grant any rights to use the trademarks + "Netscape", the "Netscape N and horizon" logo or the "Netscape + lighthouse" logo, "Netcenter", "Gecko", "Java" or "JavaScript", + "Smart Browsing" even if such marks are included in the Original + Code or Modifications. + + IV. Inability to Comply Due to Contractual Obligation. + Prior to licensing the Original Code under this License, Netscape + has licensed third party code for use in Netscape's Branded Code. + To the extent that Netscape is limited contractually from making + such third party code available under this License, Netscape may + choose to reintegrate such code into Covered Code without being + required to distribute such code in Source Code form, even if + such code would otherwise be considered "Modifications" under + this License. + + V. Use of Modifications and Covered Code by Initial Developer. + V.1. In General. + The obligations of Section 3 apply to Netscape, except to + the extent specified in this Amendment, Section V.2 and V.3. + + V.2. Other Products. + Netscape may include Covered Code in products other than the + Netscape's Branded Code which are released by Netscape + during the two (2) years following the release date of the + Original Code, without such additional products becoming + subject to the terms of this License, and may license such + additional products on different terms from those contained + in this License. + + V.3. Alternative Licensing. + Netscape may license the Source Code of Netscape's Branded + Code, including Modifications incorporated therein, without + such Netscape Branded Code becoming subject to the terms of + this License, and may license such Netscape Branded Code on + different terms from those contained in this License. + + VI. Litigation. + Notwithstanding the limitations of Section 11 above, the + provisions regarding litigation in Section 11(a), (b) and (c) of + the License shall apply to all disputes relating to this License. + + EXHIBIT A-Netscape Public License. + + "The contents of this file are subject to the Netscape Public + License Version 1.1 (the "License"); you may not use this file + except in compliance with the License. You may obtain a copy of + the License at http://www.mozilla.org/NPL/ + + Software distributed under the License is distributed on an "AS + IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + implied. See the License for the specific language governing + rights and limitations under the License. + + The Original Code is Mozilla Communicator client code, released + March 31, 1998. + + The Initial Developer of the Original Code is Netscape + Communications Corporation. Portions created by Netscape are + Copyright (C) 1998-1999 Netscape Communications Corporation. All + Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the + terms of the _____ license (the "[___] License"), in which case + the provisions of [______] License are applicable instead of + those above. If you wish to allow use of your version of this + file only under the terms of the [____] License and not to allow + others to use your version of this file under the NPL, indicate + your decision by deleting the provisions above and replace them + with the notice and other provisions required by the [___] + License. If you do not delete the provisions above, a recipient + may use your version of this file under either the NPL or the + [___] License." + + ---------------------------------------------------------------------- + + MOZILLA PUBLIC LICENSE + Version 1.1 + + --------------- + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source + Code. + + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. + + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or + previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. + + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Application of this License. + + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) + +7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] + + +=============================================================================== + +For the JAX-WS Reference Implementation component: + +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + + + 1. Definitions. + + 1.1. "Contributor" means each individual or entity that + creates or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the + Original Software, prior Modifications used by a + Contributor (if any), and the Modifications made by that + particular Contributor. + + 1.3. "Covered Software" means (a) the Original Software, or + (b) Modifications, or (c) the combination of files + containing Original Software with files containing + Modifications, in each case including portions thereof. + + 1.4. "Executable" means the Covered Software in any form + other than Source Code. + + 1.5. "Initial Developer" means the individual or entity + that first makes Original Software available under this + License. + + 1.6. "Larger Work" means a work which combines Covered + Software or portions thereof with code not governed by the + terms of this License. + + 1.7. "License" means this document. + + 1.8. "Licensable" means having the right to grant, to the + maximum extent possible, whether at the time of the initial + grant or subsequently acquired, any and all of the rights + conveyed herein. + + 1.9. "Modifications" means the Source Code and Executable + form of any of the following: + + A. Any file that results from an addition to, + deletion from or modification of the contents of a + file containing Original Software or previous + Modifications; + + B. Any new file that contains any part of the + Original Software or previous Modification; or + + C. Any new file that is contributed or otherwise made + available under the terms of this License. + + 1.10. "Original Software" means the Source Code and + Executable form of computer software code that is + originally released under this License. + + 1.11. "Patent Claims" means any patent claim(s), now owned + or hereafter acquired, including without limitation, + method, process, and apparatus claims, in any patent + Licensable by grantor. + + 1.12. "Source Code" means (a) the common form of computer + software code in which modifications are made and (b) + associated documentation included in or with such code. + + 1.13. "You" (or "Your") means an individual or a legal + entity exercising rights under, and complying with all of + the terms of, this License. For legal entities, "You" + includes any entity which controls, is controlled by, or is + under common control with You. For purposes of this + definition, "control" means (a) the power, direct or + indirect, to cause the direction or management of such + entity, whether by contract or otherwise, or (b) ownership + of more than fifty percent (50%) of the outstanding shares + or beneficial ownership of such entity. + + 2. License Grants. + + 2.1. The Initial Developer Grant. + + Conditioned upon Your compliance with Section 3.1 below and + subject to third party intellectual property claims, the + Initial Developer hereby grants You a world-wide, + royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than + patent or trademark) Licensable by Initial Developer, + to use, reproduce, modify, display, perform, + sublicense and distribute the Original Software (or + portions thereof), with or without Modifications, + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, + using or selling of Original Software, to make, have + made, use, practice, sell, and offer for sale, and/or + otherwise dispose of the Original Software (or + portions thereof). + + (c) The licenses granted in Sections 2.1(a) and (b) + are effective on the date Initial Developer first + distributes or otherwise makes the Original Software + available to a third party under the terms of this + License. + + (d) Notwithstanding Section 2.1(b) above, no patent + license is granted: (1) for code that You delete from + the Original Software, or (2) for infringements + caused by: (i) the modification of the Original + Software, or (ii) the combination of the Original + Software with other software or devices. + + 2.2. Contributor Grant. + + Conditioned upon Your compliance with Section 3.1 below and + subject to third party intellectual property claims, each + Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + (a) under intellectual property rights (other than + patent or trademark) Licensable by Contributor to + use, reproduce, modify, display, perform, sublicense + and distribute the Modifications created by such + Contributor (or portions thereof), either on an + unmodified basis, with other Modifications, as + Covered Software and/or as part of a Larger Work; and + + + (b) under Patent Claims infringed by the making, + using, or selling of Modifications made by that + Contributor either alone and/or in combination with + its Contributor Version (or portions of such + combination), to make, use, sell, offer for sale, + have made, and/or otherwise dispose of: (1) + Modifications made by that Contributor (or portions + thereof); and (2) the combination of Modifications + made by that Contributor with its Contributor Version + (or portions of such combination). + + (c) The licenses granted in Sections 2.2(a) and + 2.2(b) are effective on the date Contributor first + distributes or otherwise makes the Modifications + available to a third party. + + (d) Notwithstanding Section 2.2(b) above, no patent + license is granted: (1) for any code that Contributor + has deleted from the Contributor Version; (2) for + infringements caused by: (i) third party + modifications of Contributor Version, or (ii) the + combination of Modifications made by that Contributor + with other software (except as part of the + Contributor Version) or other devices; or (3) under + Patent Claims infringed by Covered Software in the + absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1. Availability of Source Code. + + Any Covered Software that You distribute or otherwise make + available in Executable form must also be made available in + Source Code form and that Source Code form must be + distributed only under the terms of this License. You must + include a copy of this License with every copy of the + Source Code form of the Covered Software You distribute or + otherwise make available. You must inform recipients of any + such Covered Software in Executable form as to how they can + obtain such Covered Software in Source Code form in a + reasonable manner on or through a medium customarily used + for software exchange. + + 3.2. Modifications. + + The Modifications that You create or to which You + contribute are governed by the terms of this License. You + represent that You believe Your Modifications are Your + original creation(s) and/or You have sufficient rights to + grant the rights conveyed by this License. + + 3.3. Required Notices. + + You must include a notice in each of Your Modifications + that identifies You as the Contributor of the Modification. + You may not remove or alter any copyright, patent or + trademark notices contained within the Covered Software, or + any notices of licensing or any descriptive text giving + attribution to any Contributor or the Initial Developer. + + 3.4. Application of Additional Terms. + + You may not offer or impose any terms on any Covered + Software in Source Code form that alters or restricts the + applicable version of this License or the recipients' + rights hereunder. You may choose to offer, and to charge a + fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Software. + However, you may do so only on Your own behalf, and not on + behalf of the Initial Developer or any Contributor. You + must make it absolutely clear that any such warranty, + support, indemnity or liability obligation is offered by + You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred + by the Initial Developer or such Contributor as a result of + warranty, support, indemnity or liability terms You offer. + + + 3.5. Distribution of Executable Versions. + + You may distribute the Executable form of the Covered + Software under the terms of this License or under the terms + of a license of Your choice, which may contain terms + different from this License, provided that You are in + compliance with the terms of this License and that the + license for the Executable form does not attempt to limit + or alter the recipient's rights in the Source Code form + from the rights set forth in this License. If You + distribute the Covered Software in Executable form under a + different license, You must make it absolutely clear that + any terms which differ from this License are offered by You + alone, not by the Initial Developer or Contributor. You + hereby agree to indemnify the Initial Developer and every + Contributor for any liability incurred by the Initial + Developer or such Contributor as a result of any such terms + You offer. + + 3.6. Larger Works. + + You may create a Larger Work by combining Covered Software + with other code not governed by the terms of this License + and distribute the Larger Work as a single product. In such + a case, You must make sure the requirements of this License + are fulfilled for the Covered Software. + + 4. Versions of the License. + + 4.1. New Versions. + + Sun Microsystems, Inc. is the initial license steward and + may publish revised and/or new versions of this License + from time to time. Each version will be given a + distinguishing version number. Except as provided in + Section 4.3, no one other than the license steward has the + right to modify this License. + + 4.2. Effect of New Versions. + + You may always continue to use, distribute or otherwise + make the Covered Software available under the terms of the + version of the License under which You originally received + the Covered Software. If the Initial Developer includes a + notice in the Original Software prohibiting it from being + distributed or otherwise made available under any + subsequent version of the License, You must distribute and + make the Covered Software available under the terms of the + version of the License under which You originally received + the Covered Software. Otherwise, You may also choose to + use, distribute or otherwise make the Covered Software + available under the terms of any subsequent version of the + License published by the license steward. + + 4.3. Modified Versions. + + When You are an Initial Developer and You want to create a + new license for Your Original Software, You may create and + use a modified version of this License if You: (a) rename + the license and remove any references to the name of the + license steward (except to note that the license differs + from this License); and (b) otherwise make it clear that + the license contains terms which differ from this License. + + + 5. DISCLAIMER OF WARRANTY. + + COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" + BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, + INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED + SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR + PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND + PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY + COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE + INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF + ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF + WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS + DISCLAIMER. + + 6. TERMINATION. + + 6.1. This License and the rights granted hereunder will + terminate automatically if You fail to comply with terms + herein and fail to cure such breach within 30 days of + becoming aware of the breach. Provisions which, by their + nature, must remain in effect beyond the termination of + this License shall survive. + + 6.2. If You assert a patent infringement claim (excluding + declaratory judgment actions) against Initial Developer or + a Contributor (the Initial Developer or Contributor against + whom You assert such claim is referred to as "Participant") + alleging that the Participant Software (meaning the + Contributor Version where the Participant is a Contributor + or the Original Software where the Participant is the + Initial Developer) directly or indirectly infringes any + patent, then any and all rights granted directly or + indirectly to You by such Participant, the Initial + Developer (if the Initial Developer is not the Participant) + and all Contributors under Sections 2.1 and/or 2.2 of this + License shall, upon 60 days notice from Participant + terminate prospectively and automatically at the expiration + of such 60 day notice period, unless if within such 60 day + period You withdraw Your claim with respect to the + Participant Software against such Participant either + unilaterally or pursuant to a written agreement with + Participant. + + 6.3. In the event of termination under Sections 6.1 or 6.2 + above, all end user licenses that have been validly granted + by You or any distributor hereunder prior to termination + (excluding licenses granted to You by any distributor) + shall survive termination. + + 7. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE + INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF + COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE + LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR + CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT + LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK + STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL + INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT + APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO + NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR + CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT + APPLY TO YOU. + + 8. U.S. GOVERNMENT END USERS. + + The Covered Software is a "commercial item," as that term is + defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial + computer software" (as that term is defined at 48 C.F.R. + 252.227-7014(a)(1)) and "commercial computer software + documentation" as such terms are used in 48 C.F.R. 12.212 (Sept. + 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 + through 227.7202-4 (June 1995), all U.S. Government End Users + acquire Covered Software with only those rights set forth herein. + This U.S. Government Rights clause is in lieu of, and supersedes, + any other FAR, DFAR, or other clause or provision that addresses + Government rights in computer software under this License. + + 9. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the + extent necessary to make it enforceable. This License shall be + governed by the law of the jurisdiction specified in a notice + contained within the Original Software (except to the extent + applicable law, if any, provides otherwise), excluding such + jurisdiction's conflict-of-law provisions. Any litigation + relating to this License shall be subject to the jurisdiction of + the courts located in the jurisdiction and venue specified in a + notice contained within the Original Software, with the losing + party responsible for costs, including, without limitation, court + costs and reasonable attorneys' fees and expenses. The + application of the United Nations Convention on Contracts for the + International Sale of Goods is expressly excluded. Any law or + regulation which provides that the language of a contract shall + be construed against the drafter shall not apply to this License. + You agree that You alone are responsible for compliance with the + United States export administration regulations (and the export + control laws and regulation of any other countries) when You use, + distribute or otherwise make available any Covered Software. + + 10. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or + indirectly, out of its utilization of rights under this License + and You agree to work with Initial Developer and Contributors to + distribute such responsibility on an equitable basis. Nothing + herein is intended or shall be deemed to constitute any admission + of liability. + diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/NOTICE.txt b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/NOTICE.txt new file mode 100644 index 0000000000..d83ebbe236 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/NOTICE.txt @@ -0,0 +1,14 @@ +${pom.name} +Copyright (c) 2005 - 2006 The Apache Software Foundation + +Apache Tuscany is an effort undergoing incubation at The Apache Software +Foundation (ASF), sponsored by the Apache 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. + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). + diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/pom.xml b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/pom.xml new file mode 100644 index 0000000000..50883f98a0 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/pom.xml @@ -0,0 +1,48 @@ + + + + + org.apache.tuscany.sca.runtime.webapp + webapp + 0.1-pre-spec-SNAPSHOT + + 4.0.0 + tuscany-war-plugin + maven-plugin + Tuscany War Plugin + + + + org.apache.maven + maven-plugin-api + 2.0 + + + org.apache.maven + maven-artifact + 2.0 + + + commons-io + commons-io + 1.2 + + + diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/src/main/java/org/apache/tuscany/plugin/war/Dependency.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/src/main/java/org/apache/tuscany/plugin/war/Dependency.java new file mode 100644 index 0000000000..3f3f674a66 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/src/main/java/org/apache/tuscany/plugin/war/Dependency.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.plugin.war; + +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.factory.ArtifactFactory; + +/** + * Represents a configured tuscany dependency for boot and extension libraries. + * + * @version $Rev$ $Date$ + */ +public class Dependency { + + /** + * JAR type artifact. + */ + private static final String TYPE_JAR = "jar"; + + /** + * Default boot libraries. TODO Decide on whether to get snapshot version rather than hardcoded version.. + */ + private static final Dependency[] DEFAULT_BOOT_LIBS = new Dependency[] { new WebappHostDependency() }; + + /** + * Group Id that is injected in from configuration. + */ + private String groupId; + + /** + * Artifact Id that is injected in from configuration. + */ + private String artifactId; + + /** + * Version that is injected in from configuration. + */ + private String version; + + /** + * Default constructor. + * + */ + public Dependency() { + } + + /** + * Initializes the field. + * + * @param groupId + * Group id. + * @param artifactId + * Artifact id. + * @param version + * Artifact version. + */ + public Dependency(String groupId, String artifactId, String version) { + super(); + this.groupId = groupId; + this.artifactId = artifactId; + this.version = version; + } + + /** + * Gets the artifact using the specified artifact factory. + * + * @param artifactFactory + * Artifact factory to use. + * @return Artifact identified by the dependency. + */ + public Artifact getArtifact(ArtifactFactory artifactFactory) { + return artifactFactory.createArtifact(groupId, artifactId, version, Artifact.SCOPE_RUNTIME, TYPE_JAR); + } + + /** + * Returns the default boot libraries. + * + * @return Default boot libraries. + */ + public static Dependency[] getDefaultBootLibs() { + return DEFAULT_BOOT_LIBS; + } + + /** + * Checks whether the specified artifact has the same artifact id. + * + * @param artifact + * Artifact to be matched. + * @return True if the sepcified artifact has the same id. + */ + public boolean match(Artifact artifact) { + // TODO Auto-generated method stub + return artifact.getArtifactId().equals(artifactId); + } + + /** + * Webapp host depndency. + */ + private static class WebappHostDependency extends Dependency { + // TODO Decide on whether to get snapshot version rather than hardcoded version + private WebappHostDependency() { + super("org.apache.tuscany.sca.runtime.webapp", "webapp-host", "0.1-pre-spec-SNAPSHOT"); + } + } + +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/src/main/java/org/apache/tuscany/plugin/war/TuscanyWarMojo.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/src/main/java/org/apache/tuscany/plugin/war/TuscanyWarMojo.java new file mode 100644 index 0000000000..622d8686b2 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/plugin.war/src/main/java/org/apache/tuscany/plugin/war/TuscanyWarMojo.java @@ -0,0 +1,489 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.plugin.war; + +import java.beans.XMLEncoder; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.jar.JarOutputStream; +import java.util.zip.ZipException; + +import org.apache.commons.io.IOUtils; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.factory.ArtifactFactory; +import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException; +import org.apache.maven.artifact.metadata.ArtifactMetadataSource; +import org.apache.maven.artifact.metadata.ResolutionGroup; +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.artifact.resolver.ArtifactNotFoundException; +import org.apache.maven.artifact.resolver.ArtifactResolutionException; +import org.apache.maven.artifact.resolver.ArtifactResolutionResult; +import org.apache.maven.artifact.resolver.ArtifactResolver; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; + +/** + * Build the tuscany war file by adding the tuscany dependencies. + * + * Performs the following tasks. + * + * + * @goal tuscany-war + * @phase package + * + * @version $Rev$ $Date$ + * + */ +public class TuscanyWarMojo extends AbstractMojo { + + /** + * Tuscany path. + */ + private static final String TUSCANY_PATH = "WEB-INF/tuscany/"; + + /** + * Tuscany boot path. + */ + private static final String BOOT_PATH = TUSCANY_PATH + "boot/"; + + /** + * Tuscany extension path. + */ + private static final String EXTENSION_PATH = TUSCANY_PATH + "extensions/"; + + /** + * Tuscany repository path. + */ + private static final String REPOSITORY_PATH = TUSCANY_PATH + "repository/"; + + /** + * Artifact metadata source. + * + * @component + */ + private ArtifactMetadataSource metadataSource; + + /** + * Used to look up Artifacts in the remote repository. + * + * @parameter expression="${component.org.apache.maven.artifact.factory.ArtifactFactory}" + * @required + * @readonly + */ + private ArtifactFactory artifactFactory; + + /** + * Used to look up Artifacts in the remote repository. + * + * @parameter expression="${component.org.apache.maven.artifact.resolver.ArtifactResolver}" + * @required + * @readonly + */ + protected ArtifactResolver resolver; + + /** + * Location of the local repository. + * + * @parameter expression="${localRepository}" + * @readonly + * @required + */ + private ArtifactRepository localRepository; + + /** + * List of Remote Repositories used by the resolver + * + * @parameter expression="${project.remoteArtifactRepositories}" + * @readonly + * @required + */ + private List remoteRepositories; + + /** + * The directory for the generated WAR. + * + * @parameter expression="${project.build.directory}" + * @required + */ + private String outputDirectory; + + /** + * The directory for the generated WAR. + * + * @parameter + */ + private Dependency[] bootLibs = Dependency.getDefaultBootLibs(); + + /** + * The directory for the generated WAR. + * + * @parameter + */ + private Dependency[] extensions = new Dependency[0]; + + /** + * The directory for the generated WAR. + * + * @parameter + */ + private Dependency[] dependencies = new Dependency[0]; + + /** + * The name of the generated WAR. + * + * @parameter expression="${project.build.finalName}" + * @required + */ + private String warName; + + /** + * A flag to indicate whether extension dependencies should be resolved transitively. + * + * @parameter + */ + private boolean loadExtensionDependencies; + + /** + * The default version of boot dependany jar files + * + * @parameter + */ + private String runTimeVersion = null; + + /** + * WEB-INF jar files. + */ + private Set packagedLibs = new HashSet(); + + /** + * Transitive dependencies for extensions. + */ + private Map transDepenedencyMap = new HashMap(); + + /** + * Executes the MOJO. + */ + public void execute() throws MojoExecutionException { + + JarFile originalWar = null; + JarOutputStream newWar = null; + File originalWarFile = null; + File newWarFile = null; + + boolean success = false; + + try { + + // if there is a runtime version specified and no bootLib dependancies, + // modify the bootLibs to have the runtime version. + if (runTimeVersion != null && bootLibs == Dependency.getDefaultBootLibs()) { + Dependency dependancy = new Dependency("org.apache.tuscany.sca.runtime.webapp", + "webapp-host", runTimeVersion); + bootLibs = new Dependency[] {dependancy}; + } + + originalWarFile = new File(outputDirectory, warName + ".war"); + originalWar = new JarFile(originalWarFile); + + newWarFile = new File(outputDirectory, warName + "-temp.war"); + newWar = new JarOutputStream(new FileOutputStream(newWarFile)); + + copyOriginal(originalWar, newWar); + + addEntry(newWar, TUSCANY_PATH); + addEntry(newWar, BOOT_PATH); + addEntry(newWar, EXTENSION_PATH); + addEntry(newWar, REPOSITORY_PATH); + + for (Dependency dependency : bootLibs) { + for (Artifact art : resolveArtifact(dependency.getArtifact(artifactFactory), true)) { + addArtifact(newWar, BOOT_PATH, art); + } + } + + for (Dependency dependency : extensions) { + for (Artifact art : resolveArtifact(dependency.getArtifact(artifactFactory), loadExtensionDependencies)) { + if (dependency.match(art)) { + addArtifact(newWar, EXTENSION_PATH, art); + } + + // Load dependencies even for the extension itself + if (loadExtensionDependencies) { + loadTransitiveDependencies(newWar, art); + } + + } + } + + for (Dependency dependency : dependencies) { + for (Artifact art : resolveArtifact(dependency.getArtifact(artifactFactory), loadExtensionDependencies)) { + loadTransitiveDependencies(newWar, art); + } + } + + writeDependencyMetadata(newWar); + + success = true; + + } catch (Exception ex) { + throw new MojoExecutionException(ex.getMessage(), ex); + } finally { + IOUtils.closeQuietly(newWar); + } + + if (success) { + if (!originalWarFile.delete()) { + throw new MojoExecutionException("Unable to rename war file"); + } + if (!newWarFile.renameTo(originalWarFile)) { + throw new MojoExecutionException("Unable to rename war file"); + } + } + + } + + /** + * Adds an entry to the JAR failing safe for duplicate. + * + * @param jar JAR to which the entry is added. + * @param entry Entry to be added. + * @return True if added successfully. + * @throws IOException In case of an IO error. + */ + private boolean addEntry(JarOutputStream jar, String entry) throws IOException { + try { + jar.putNextEntry(new JarEntry(entry)); + return true; + } catch (ZipException duplicateEntry) { + getLog().info(duplicateEntry.getMessage()); + return false; + } + } + + /** + * Writes the dependency metadata. + * @param newWar WAR to which the metadata is written. + * @throws IOException In case of an IO error. + */ + private void writeDependencyMetadata(JarOutputStream newWar) throws IOException { + + FileOutputStream depMapOutStream = null; + FileInputStream depMapInStream = null; + + try { + String metadataFile = "dependency.metadata"; + + File file = new File(outputDirectory, "webapp"); + file = new File(file, REPOSITORY_PATH); + file.mkdirs(); + + file = new File(file, metadataFile); + file.createNewFile(); + + depMapOutStream = new FileOutputStream(file); + XMLEncoder xmlEncoder = new XMLEncoder(depMapOutStream); + xmlEncoder.writeObject(transDepenedencyMap); + xmlEncoder.close(); + + if (addEntry(newWar, REPOSITORY_PATH + metadataFile)) { + depMapInStream = new FileInputStream(file); + IOUtils.copy(depMapInStream, newWar); + } + + } finally { + IOUtils.closeQuietly(depMapOutStream); + IOUtils.closeQuietly(depMapInStream); + } + + } + + /** + * Builds the transitive dependencies for artifacts. + * + * @param newWar WARto which the artifacts are added. + * @param art Extension artifact. + * @throws IOException In case of an unexpected IO error. + * @throws ArtifactResolutionException If the artifact cannot be resolved. + * @throws ArtifactNotFoundException If the artifact is not found. + * @throws ArtifactMetadataRetrievalException In case of error in retrieving metadata. + */ + private void loadTransitiveDependencies(JarOutputStream newWar, Artifact art) throws IOException, ArtifactResolutionException, + ArtifactNotFoundException, ArtifactMetadataRetrievalException { + + String artPath = art.getGroupId() + "/" + art.getArtifactId() + "/" + art.getVersion() + "/"; + String path = REPOSITORY_PATH + artPath; + addArtifact(newWar, path, art); + + Set transDepenedenyList = new HashSet(); + transDepenedencyMap.put(artPath, transDepenedenyList); + + // Get the transitive dependencies for each dependency. + for (Artifact transArt : resolveArtifact(art, true)) { + String transArtPath = transArt.getGroupId() + "/" + transArt.getArtifactId() + "/" + transArt.getVersion() + "/"; + if (addArtifact(newWar, REPOSITORY_PATH + transArtPath, transArt)) { + transDepenedenyList.add(transArtPath + transArt.getFile().getName()); + } + } + + } + + /** + * Resolves the specified artifact. + * + * @param artifact Artifact to be resolved. + * @param transitive Whether to resolve transitively. + * @return A set of resolved artifacts. + * @throws IOException In case of an unexpected IO error. + * @throws ArtifactResolutionException If the artifact cannot be resolved. + * @throws ArtifactNotFoundException If the artifact is not found. + * @throws ArtifactMetadataRetrievalException In case of error in retrieving metadata. + */ + private Set resolveArtifact(Artifact artifact, boolean transitive) throws IOException, ArtifactResolutionException, + ArtifactNotFoundException, ArtifactMetadataRetrievalException { + + Set resolvedArtifacts = new HashSet(); + + // Resolve the artifact + resolver.resolve(artifact, remoteRepositories, localRepository); + resolvedArtifacts.add((Artifact) artifact); + + if (!transitive) { + return resolvedArtifacts; + } + + // Transitively resolve all the dependencies + ResolutionGroup resolutionGroup = metadataSource.retrieve(artifact, localRepository, remoteRepositories); + ArtifactResolutionResult result = resolver.resolveTransitively(resolutionGroup.getArtifacts(), artifact, remoteRepositories, localRepository, + metadataSource); + + // Add the artifacts to the deployment unit + for (Object depArtifact : result.getArtifacts()) { + resolvedArtifacts.add((Artifact) depArtifact); + } + return resolvedArtifacts; + + } + + /** + * Adds the artifact to the war file. + * + * @param newWar War file to which the artifact is added. + * @param path Path within the war file where artifact is added. + * @param artifact Artifact to be added. + * @throws IOException In case of an unexpected IO error. + */ + private boolean addArtifact(JarOutputStream newWar, String path, Artifact artifact) throws IOException { + + FileInputStream artifactStream = null; + FileOutputStream fileOutputStream = null; + + try { + + File artifactFile = artifact.getFile(); + // For extensions, we'll add it even the packagedLibs has it + if ((!EXTENSION_PATH.equals(path)) && packagedLibs.contains(artifactFile.getName())) { + return false; + } + artifactStream = new FileInputStream(artifactFile); + + newWar.putNextEntry(new JarEntry(path + artifactFile.getName())); + + File file = new File(outputDirectory, "webapp"); + file = new File(file, path); + file.mkdirs(); + + file = new File(file, artifactFile.getName()); + fileOutputStream = new FileOutputStream(file); + + IOUtils.copy(artifactStream, fileOutputStream); + IOUtils.closeQuietly(artifactStream); + + artifactStream = new FileInputStream(artifactFile); + IOUtils.copy(artifactStream, newWar); + + packagedLibs.add(artifactFile.getName()); + + getLog().info("Processed " + path + artifactFile.getName()); + + return true; + + } finally { + IOUtils.closeQuietly(artifactStream); + IOUtils.closeQuietly(fileOutputStream); + } + + } + + /** + * Copies the original war file. + * + * @param originalWar Original war file. + * @param newWar New war file. + * @throws IOException In case of an unexpected IO error. + */ + private void copyOriginal(JarFile originalWar, JarOutputStream newWar) throws IOException { + + Enumeration entries = originalWar.entries(); + packagedLibs.clear(); + + while (entries.hasMoreElements()) { + + JarEntry entry = (JarEntry) entries.nextElement(); + InputStream jarEntryStream = null; + + try { + jarEntryStream = originalWar.getInputStream(entry); + newWar.putNextEntry(entry); + IOUtils.copy(jarEntryStream, newWar); + String name = entry.getName(); + + if (name.endsWith(".jar")) { + packagedLibs.add(name.substring(name.lastIndexOf("/") + 1)); + } + } finally { + IOUtils.closeQuietly(jarEntryStream); + } + + } + + originalWar.close(); + + } + +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/pom.xml b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/pom.xml new file mode 100644 index 0000000000..f25de0252d --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/pom.xml @@ -0,0 +1,40 @@ + + + + + + org.apache.tuscany.sca.runtime + parent + 0.1-pre-spec-SNAPSHOT + + + 4.0.0 + org.apache.tuscany.sca.runtime.webapp + webapp + pom + Apache Tuscany Webapp SCA Runtime + + + webapp-api + webapp-host + plugin.war + + + diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/.ruleset b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/.ruleset new file mode 100644 index 0000000000..3886f07f2d --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/.ruleset @@ -0,0 +1,190 @@ + + + + PMD Plugin preferences rule set + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/LICENSE.txt b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/LICENSE.txt new file mode 100644 index 0000000000..0084319535 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/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, serviceDefinition 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/branches/pre-spec-changes/runtime/webapp/webapp-api/NOTICE.txt b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/NOTICE.txt new file mode 100644 index 0000000000..d83ebbe236 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/NOTICE.txt @@ -0,0 +1,14 @@ +${pom.name} +Copyright (c) 2005 - 2006 The Apache Software Foundation + +Apache Tuscany is an effort undergoing incubation at The Apache Software +Foundation (ASF), sponsored by the Apache 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. + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). + diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/pom.xml b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/pom.xml new file mode 100644 index 0000000000..639d1beb1f --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/pom.xml @@ -0,0 +1,60 @@ + + + + + org.apache.tuscany.sca.runtime.webapp + webapp + 0.1-pre-spec-SNAPSHOT + + 4.0.0 + webapp-api + jar + Apache Tuscany Web Application Runtime + Integration code to run Tuscany in a Web application. + + + + javax.servlet + servlet-api + + + + org.apache.tuscany.sca.kernel + tuscany-host-api + ${sca.version} + compile + + + + + org.easymock + easymockclassextension + 2.2 + test + + + + org.apache.tuscany.sca + test + ${sca.version} + test + + + diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/Constants.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/Constants.java new file mode 100644 index 0000000000..28a4cc2ca3 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/Constants.java @@ -0,0 +1,89 @@ +package org.apache.tuscany.runtime.webapp; + +/** + * Constants used by the web application booter + * + * @version $Rev$ $Date$ + */ +public final class Constants { + + /** + * Name of the parameter that defines the name of webapp resource containing bootstrap jars. + */ + static final String BOOTDIR_PARAM = "tuscany.bootDir"; + + /** + * Default value for BOOTDIR_PARAM. + */ + static final String BOOTDIR_DEFAULT = "/WEB-INF/tuscany/boot"; + + /** + * Name of the parameter that defines the class to load to launch the runtime. + */ + static final String RUNTIME_PARAM = "tuscany.runtimeImpl"; + + /** + * Name of the default webapp runtime implementation. + */ + static final String RUNTIME_DEFAULT = "org.apache.tuscany.runtime.webapp.WebappRuntimeImpl"; + + /** + * Servlet context-param name for user-specified system SCDL path. + */ + static final String SYSTEM_SCDL_PATH_PARAM = "tuscany.systemScdlPath"; + + /** + * Default webapp system SCDL path. + */ + static final String SYSTEM_SCDL_PATH_DEFAULT = "META-INF/tuscany/webapp.scdl"; + + /** + * Servlet context-param name for user-specified application SCDL path. + */ + static final String APPLICATION_SCDL_PATH_PARAM = "tuscany.applicationScdlPath"; + + /** + * Default application SCDL path. + */ + static final String APPLICATION_SCDL_PATH_DEFAULT = "/WEB-INF/default.scdl"; + + /** + * Servlet context-param name for setting if the runtime is online. + */ + static final String ONLINE_PARAM = "tuscany.online"; + + /** + * Context attribute to which the Tuscany runtime for this servlet context is stored. + */ + static final String RUNTIME_ATTRIBUTE = "tuscany.runtime"; + + /** + * Context attribute for storing the CompositeContext that should be bound to the thread.` + */ + @Deprecated + static final String CONTEXT_ATTRIBUTE = "tuscany.context"; + + /** + * Servlet context-param name for the path to the composite to set as the webb app composite + */ + static final String CURRENT_COMPOSITE_PATH_PARAM = "tuscany.currentCompositePath"; + + /** + * Servlet context-param name for user-specified system SCDL path. + */ + static final String EXTENSION_SCDL_PATH_PARAM = "tuscany.extensionScdlPath"; + + /** + * Default path for extensions if no "extensionScdlPath param is specified + */ + static final String DEFAULT_EXTENSION_PATH_PARAM = "/WEB-INF/tuscany/extensions"; + + /** + * Servlet context-param name for system monitoring level. Supported values are the names of statics defined in + * java.util.logging.Level. If absent, no monitoring will take place. + */ + static final String SYSTEM_MONITORING_PARAM = "tuscany.monitoringLevel"; + + private Constants() { + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/InvalidResourcePath.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/InvalidResourcePath.java new file mode 100644 index 0000000000..3d1353de25 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/InvalidResourcePath.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +/** + * Denotes an invalid or non-existing path for a resource required by the runtime bootstrap + * + * @version $Rev$ $Date$ + */ +public class InvalidResourcePath extends TuscanyInitException { + + public InvalidResourcePath(String message, String identifier, Throwable cause) { + super(message, identifier, cause); + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/ServletLauncherMonitor.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/ServletLauncherMonitor.java new file mode 100644 index 0000000000..5936240481 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/ServletLauncherMonitor.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import org.apache.tuscany.api.annotation.LogLevel; + +/** + * A monitor interface used during runtime bootstrap + * + * @version $Rev$ $Date$ + */ +public interface ServletLauncherMonitor { + + @LogLevel("DEBUG") + void deployExtension(String path); + +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyContextListener.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyContextListener.java new file mode 100644 index 0000000000..15f8133a3d --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyContextListener.java @@ -0,0 +1,110 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import java.net.MalformedURLException; +import java.net.URL; +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import org.apache.tuscany.api.TuscanyRuntimeException; +import org.apache.tuscany.host.runtime.ShutdownException; +import static org.apache.tuscany.runtime.webapp.Constants.ONLINE_PARAM; +import static org.apache.tuscany.runtime.webapp.Constants.RUNTIME_ATTRIBUTE; + +/** + * Launches a Tuscany runtime in a web application, loading information from servlet context parameters. This listener + * manages one runtime per servlet context; the lifecycle of that runtime corresponds to the the lifecycle of the + * associated servlet context. + *

+ * The runtime is launched in a child classloader of the web application, thereby providing isolation between + * application and system artifacts. Application code only has access to the SCA API and may not reference Tuscany + * system artifacts directly. + *

+ * The web.xml of a web application embedding Tuscany must have entries for this listener and {@link + * TuscanySessionListener}. The latter notifies the runtime of session creation and expiration events through a + * "bridging" contract, {@link WebappRuntime}. The web.xml may also optionally be configured with entries + * for {@link TuscanyFilter} and {@link TuscanyServlet}. The former must be mapped to all urls that execute "unmanaged" + * code which accesses the Tuscany runtime though the SCA API, for example, JSPs and Servlets. The latter forwards + * service requests into the runtime, by default requests sent to URLs relative to the context path beginning with + * /services. + * + * @version $Rev$ $Date$ + */ +public class TuscanyContextListener implements ServletContextListener { + + public void contextInitialized(ServletContextEvent event) { + ServletContext servletContext = event.getServletContext(); + WebappUtil utils = getUtils(servletContext); + try { + ClassLoader webappClassLoader = Thread.currentThread().getContextClassLoader(); + ClassLoader bootClassLoader = utils.getBootClassLoader(webappClassLoader); + WebappRuntime runtime = utils.getRuntime(bootClassLoader); + boolean online = Boolean.valueOf(utils.getInitParameter(ONLINE_PARAM, "true")); + WebappRuntimeInfo info = new WebappRuntimeInfoImpl(servletContext, + servletContext.getResource("/WEB-INF/tuscany/"), + online); + URL systemScdl = utils.getSystemScdl(bootClassLoader); + URL applicationScdl = utils.getApplicationScdl(webappClassLoader); + String name = utils.getApplicationName(); + + runtime.setServletContext(servletContext); + runtime.setRuntimeInfo(info); + runtime.setHostClassLoader(webappClassLoader); + runtime.setSystemScdl(systemScdl); + runtime.setApplicationName(name); + runtime.setApplicationScdl(applicationScdl); + runtime.initialize(); + + servletContext.setAttribute(RUNTIME_ATTRIBUTE, runtime); + } catch (TuscanyRuntimeException e) { + servletContext.log(e.getMessage(), e); + e.printStackTrace(); + throw e; + } catch (MalformedURLException e) { + servletContext.log(e.getMessage(), e); + e.printStackTrace(); + throw new TuscanyInitException(e); + } catch (Throwable e) { + servletContext.log(e.getMessage(), e); + e.printStackTrace(); + throw new TuscanyInitException(e); + } + } + + protected WebappUtil getUtils(ServletContext servletContext) { + return new WebappUtilImpl(servletContext); + } + + public void contextDestroyed(ServletContextEvent event) { + ServletContext servletContext = event.getServletContext(); + WebappRuntime runtime = (WebappRuntime) servletContext.getAttribute(RUNTIME_ATTRIBUTE); + if (runtime == null) { + return; + } + servletContext.removeAttribute(RUNTIME_ATTRIBUTE); + try { + runtime.destroy(); + } catch (ShutdownException e) { + servletContext.log("Error destorying runtume", e); + } + } + +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyFilter.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyFilter.java new file mode 100644 index 0000000000..58e3895bc7 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyFilter.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.ServletContext; + +import org.osoa.sca.CompositeContext; +import org.osoa.sca.CurrentCompositeContext; + +import static org.apache.tuscany.runtime.webapp.Constants.RUNTIME_ATTRIBUTE; +import static org.apache.tuscany.runtime.webapp.Constants.CONTEXT_ATTRIBUTE; + +/** + * Maps an incoming request and the current composite context to the composite component for the web application. This + * filter must be applied to all web application urls that execute unmanaged code (e.g. JSPs and Servlets) which + * accesses the Tuscany runtime. + * + * @version $Rev$ $Date$ + */ +public class TuscanyFilter implements Filter { + private CompositeContext context; + private WebappRuntime runtime; + + public void init(FilterConfig config) throws ServletException { + ServletContext servletContext = config.getServletContext(); + runtime = (WebappRuntime) servletContext.getAttribute(RUNTIME_ATTRIBUTE); + if (runtime == null) { + throw new ServletException("Tuscany is not configured for the web application"); + } + context = (CompositeContext) servletContext.getAttribute(CONTEXT_ATTRIBUTE); + if (context == null) { + throw new ServletException("No context specified"); + } + } + + public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) + throws IOException, ServletException { + CompositeContext oldContext = CurrentCompositeContext.setContext(context); + try { + runtime.startRequest(); + filterChain.doFilter(req, resp); + } finally { + CurrentCompositeContext.setContext(oldContext); + runtime.stopRequest(); + } + } + + public void destroy() { + context = null; + runtime = null; + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyInitException.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyInitException.java new file mode 100644 index 0000000000..a929dd6307 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyInitException.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import org.apache.tuscany.api.TuscanyRuntimeException; + +/** + * Exception indicating that there was a problem starting the Tuscany runtime. + * + * @version $Rev$ $Date$ + */ +public class TuscanyInitException extends TuscanyRuntimeException { + public TuscanyInitException(String string) { + super(string); + } + + public TuscanyInitException(String message, String identifier) { + super(message, identifier); + } + + public TuscanyInitException(String string, Throwable throwable) { + super(string, throwable); + } + + public TuscanyInitException(String message, String identifier, Throwable cause) { + super(message, identifier, cause); + } + + public TuscanyInitException(Throwable throwable) { + super(throwable); + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyRequestListener.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyRequestListener.java new file mode 100644 index 0000000000..325532aef6 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyRequestListener.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import static org.apache.tuscany.runtime.webapp.Constants.RUNTIME_ATTRIBUTE; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletRequestEvent; +import javax.servlet.ServletRequestListener; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +/** + * Notifies the Tuscany runtime of session creation and expiration events. + * + * @version $Rev: 441961 $ $Date: 2006-09-10 11:48:29 -0400 (Sun, 10 Sep 2006) $ + */ +public class TuscanyRequestListener implements ServletRequestListener { + private WebappRuntime runtime; + + public void requestDestroyed(ServletRequestEvent servletRequestEvent) { + + final ServletContext context = servletRequestEvent.getServletContext(); + getRuntime(context); + ServletRequest servletRequest = servletRequestEvent.getServletRequest(); + if (servletRequest instanceof HttpServletRequest) { + HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; + HttpSession session = httpServletRequest.getSession(false); + runtime.httpRequestEnded(session == null ? null : session.getId()); + + } + + } + + public void requestInitialized(ServletRequestEvent servletRequestEvent) { + + final ServletContext context = servletRequestEvent.getServletContext(); + getRuntime(context); + ServletRequest servletRequest = servletRequestEvent.getServletRequest(); + if (servletRequest instanceof HttpServletRequest) { + runtime.httpRequestStarted((HttpServletRequest) servletRequest); + + } + + } + + protected WebappRuntime getRuntime(final ServletContext context) { + if (runtime == null) { + + runtime = (WebappRuntime) context.getAttribute(RUNTIME_ATTRIBUTE); + if (runtime == null) { + context.log("requestInitialized", new ServletException("Tuscany runtime not configured")); + return null; + } + } + return runtime; + } +} \ No newline at end of file diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyServlet.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyServlet.java new file mode 100644 index 0000000000..3132559fdd --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanyServlet.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import java.io.IOException; +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServlet; + +import org.apache.tuscany.host.servlet.ServletRequestInjector; +import static org.apache.tuscany.runtime.webapp.Constants.RUNTIME_ATTRIBUTE; + +/** + * A servlet that forwards requests intended for SCA services into the Tuscany runtime via a ServletRequestInjector. + * This servlet is typically mapped to relative paths beginning with /services in the web.xml + *

+ * TODO a better URL mapping scheme out to be implemented that corresponds to the SCA specification + */ +public class TuscanyServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + private ServletRequestInjector requestInjector; + + @Override + public void init(ServletConfig config) throws ServletException { + ServletContext servletContext = config.getServletContext(); + WebappRuntime runtime = (WebappRuntime) servletContext.getAttribute(RUNTIME_ATTRIBUTE); + if (runtime == null) { + throw new ServletException("Tuscany runtime not configured for web application"); + } + requestInjector = runtime.getRequestInjector(); + } + + @Override + public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { + requestInjector.service(req, res); + } + +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanySessionListener.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanySessionListener.java new file mode 100644 index 0000000000..0335c7bc6a --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/TuscanySessionListener.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpSessionEvent; +import javax.servlet.http.HttpSessionListener; + +import static org.apache.tuscany.runtime.webapp.Constants.RUNTIME_ATTRIBUTE; + +/** + * Notifies the Tuscany runtime of session creation and expiration events. + * + * @version $Rev$ $Date$ + */ +public class TuscanySessionListener implements HttpSessionListener { + private WebappRuntime runtime; + + public void sessionCreated(HttpSessionEvent event) { + if (runtime == null) { + ServletContext context = event.getSession().getServletContext(); + runtime = (WebappRuntime) context.getAttribute(RUNTIME_ATTRIBUTE); + if (runtime == null) { + context.log("Error on session creation", new ServletException("Tuscany runtime not configured")); + return; + } + } + runtime.sessionCreated(event); + } + + public void sessionDestroyed(HttpSessionEvent event) { + if (runtime != null) { + runtime.sessionDestroyed(event); + } + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappRuntime.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappRuntime.java new file mode 100644 index 0000000000..48b4ee8292 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappRuntime.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSessionListener; + +import org.apache.tuscany.host.runtime.TuscanyRuntime; +import org.apache.tuscany.host.servlet.ServletRequestInjector; + +/** + * The contract for artifacts loaded in the web application classloader to comminicate with the Tuscany runtime loaded + * in a child classloader. For example, filters and listeners may use this interface to notify the runtime of the web + * container events. + * + * @version $Rev$ $Date$ + * @see TuscanyFilter + * @see TuscanySessionListener + */ +public interface WebappRuntime extends HttpSessionListener, TuscanyRuntime { + /** + * Returns the ServletContext associated with this runtime. + * + * @return the ServletContext associated with this runtime + */ + ServletContext getServletContext(); + + /** + * Sets the ServletContext associated with this runtime. + * + * @param servletContext the ServletContext associated with this runtime + */ + void setServletContext(ServletContext servletContext); + + /** + * Returns the request injector for the runtime + */ + ServletRequestInjector getRequestInjector(); + + /** + * Notification that the web application has begun servicing a request + */ + void startRequest(); + + /** + * Notification that the web application has stopped servicing a request + */ + void stopRequest(); + + /** + * Request has been started for the given request + */ + void httpRequestStarted(HttpServletRequest request); + + /** + * Request has been ended with the given session id + */ + void httpRequestEnded(Object id); + +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappRuntimeInfo.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappRuntimeInfo.java new file mode 100644 index 0000000000..d08ae10e07 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappRuntimeInfo.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import javax.servlet.ServletContext; + +import org.apache.tuscany.host.RuntimeInfo; + +/** + * @version $Rev$ $Date$ + */ +public interface WebappRuntimeInfo extends RuntimeInfo { + String COMPONENT_NAME = "WebappRuntimeInfo"; + /** + * Returns the ServletContext associated with this webapp runtime. + * + * @return the ServletContext associated with this webapp runtime. + */ + ServletContext getServletContext(); +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappRuntimeInfoImpl.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappRuntimeInfoImpl.java new file mode 100644 index 0000000000..1f08fa2790 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappRuntimeInfoImpl.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import java.io.File; +import java.net.URL; +import java.net.URI; +import javax.servlet.ServletContext; + +/** + * @version $Rev$ $Date$ + */ +public class WebappRuntimeInfoImpl implements WebappRuntimeInfo { + private final ServletContext servletContext; + private final URL baseURL; + private final boolean online; + + public WebappRuntimeInfoImpl(ServletContext servletContext, URL baseURL, boolean online) { + this.servletContext = servletContext; + this.baseURL = baseURL; + this.online = online; + } + + public ServletContext getServletContext() { + return servletContext; + } + + public URL getBaseURL() { + return baseURL; + } + + public File getInstallDirectory() { + return new File(""); + } + + public File getApplicationRootDirectory() { + return new File(""); + } + + public boolean isOnline() { + return online; + } + + public URI getDomain() { + throw new UnsupportedOperationException(); + } + + public String getRuntimeId() { + throw new UnsupportedOperationException(); + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappUtil.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappUtil.java new file mode 100644 index 0000000000..263436bd96 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappUtil.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import java.net.MalformedURLException; +import java.net.URL; + +/** + * @version $Rev$ $Date$ + */ +public interface WebappUtil { + + String getApplicationName(); + + WebappRuntime getRuntime(ClassLoader bootClassLoader) throws TuscanyInitException; + + /** + * Return the classloader that should be used to boot the Tuscany runtime. This will be a child of the web + * application's ClassLoader. + * + * @param webappClassLoader the web application's classloader + * @return a classloader that can be used to load the Tuscany runtime classes + */ + ClassLoader getBootClassLoader(ClassLoader webappClassLoader) throws InvalidResourcePath; + + URL getSystemScdl(ClassLoader bootClassLoader) throws InvalidResourcePath; + + URL getApplicationScdl(ClassLoader bootClassLoader) throws InvalidResourcePath; + + URL getScdlURL(String path, ClassLoader classLoader) throws MalformedURLException; + + /** + * Return a init parameter from the servlet context or provide a default. + * + * @param name the name of the parameter + * @param value the default value + * @return the value of the specified parameter, or the default if not defined + */ + String getInitParameter(String name, String value); +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappUtilImpl.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappUtilImpl.java new file mode 100644 index 0000000000..fcaec7f8ac --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/main/java/org/apache/tuscany/runtime/webapp/WebappUtilImpl.java @@ -0,0 +1,124 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.Set; +import javax.servlet.ServletContext; + +import static org.apache.tuscany.runtime.webapp.Constants.APPLICATION_SCDL_PATH_DEFAULT; +import static org.apache.tuscany.runtime.webapp.Constants.APPLICATION_SCDL_PATH_PARAM; +import static org.apache.tuscany.runtime.webapp.Constants.BOOTDIR_DEFAULT; +import static org.apache.tuscany.runtime.webapp.Constants.BOOTDIR_PARAM; +import static org.apache.tuscany.runtime.webapp.Constants.RUNTIME_DEFAULT; +import static org.apache.tuscany.runtime.webapp.Constants.RUNTIME_PARAM; +import static org.apache.tuscany.runtime.webapp.Constants.SYSTEM_SCDL_PATH_DEFAULT; +import static org.apache.tuscany.runtime.webapp.Constants.SYSTEM_SCDL_PATH_PARAM; + +/** + * @version $Rev$ $Date$ + */ +public class WebappUtilImpl implements WebappUtil { + private final ServletContext servletContext; + + public WebappUtilImpl(ServletContext servletContext) { + this.servletContext = servletContext; + } + + public WebappRuntime getRuntime(ClassLoader bootClassLoader) throws TuscanyInitException { + try { + String className = getInitParameter(RUNTIME_PARAM, RUNTIME_DEFAULT); + return (WebappRuntime) bootClassLoader.loadClass(className).newInstance(); + } catch (InstantiationException e) { + throw new TuscanyInitException(e); + } catch (IllegalAccessException e) { + throw new TuscanyInitException(e); + } catch (ClassNotFoundException e) { + throw new TuscanyInitException("Runtime Implementation not found", e); + } + } + + public ClassLoader getBootClassLoader(ClassLoader webappClassLoader) throws InvalidResourcePath { + String bootDirName = getInitParameter(BOOTDIR_PARAM, BOOTDIR_DEFAULT); + Set paths = servletContext.getResourcePaths(bootDirName); + if (paths == null) { + // nothing in boot directory, assume everything is in the webapp classloader + return webappClassLoader; + } + URL[] urls = new URL[paths.size()]; + int i = 0; + for (Object path : paths) { + try { + urls[i++] = servletContext.getResource((String) path); + } catch (MalformedURLException e) { + throw new InvalidResourcePath(APPLICATION_SCDL_PATH_PARAM, path.toString(), e); + } + } + return new URLClassLoader(urls, webappClassLoader); + } + + public URL getSystemScdl(ClassLoader bootClassLoader) throws InvalidResourcePath { + String path = getInitParameter(SYSTEM_SCDL_PATH_PARAM, SYSTEM_SCDL_PATH_DEFAULT); + try { + return getScdlURL(path, bootClassLoader); + } catch (MalformedURLException e) { + throw new InvalidResourcePath(SYSTEM_SCDL_PATH_PARAM, path, e); + } + } + + public String getApplicationName() { + String name = servletContext.getServletContextName(); + if (name == null) { + name = "application"; + } + return name; + } + + public URL getApplicationScdl(ClassLoader bootClassLoader) throws InvalidResourcePath { + String path = getInitParameter(APPLICATION_SCDL_PATH_PARAM, APPLICATION_SCDL_PATH_DEFAULT); + try { + return getScdlURL(path, bootClassLoader); + } catch (MalformedURLException e) { + throw new InvalidResourcePath(APPLICATION_SCDL_PATH_PARAM, path, e); + } + } + + public URL getScdlURL(String path, ClassLoader classLoader) throws MalformedURLException { + URL ret = null; + if (path.charAt(0) == '/') { + // user supplied an absolute path - look up as a webapp resource + ret = servletContext.getResource(path); + } + if (ret == null) { + // user supplied a relative path - look up as a boot classpath resource + ret = classLoader.getResource(path); + } + return ret; + } + + public String getInitParameter(String name, String value) { + String result = servletContext.getInitParameter(name); + if (result != null && result.length() != 0) { + return result; + } + return value; + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/TuscanyContextListenerTestCase.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/TuscanyContextListenerTestCase.java new file mode 100644 index 0000000000..c4c5f842b2 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/TuscanyContextListenerTestCase.java @@ -0,0 +1,102 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import java.net.URL; +import java.lang.reflect.Method; +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; + +import junit.framework.TestCase; +import static org.easymock.classextension.EasyMock.*; + +import org.apache.tuscany.host.MonitorFactory; + +/** + * @version $Rev$ $Date$ + */ +public class TuscanyContextListenerTestCase extends TestCase { + private ServletContext context; + private TuscanyContextListener listener; + private ClassLoader cl; + private ClassLoader bootClassLoader; + private URL systemUrl; + private URL applicationUrl; + private Method getUtilsMethod; + private MonitorFactory monitorFactory; + private WebappUtil utils; + + public void testInitializationUsingDefaults() throws Exception { + ServletContextEvent event = createMock(ServletContextEvent.class); + expect(event.getServletContext()).andReturn(context); + replay(event); + + WebappRuntime runtime = createMock(WebappRuntime.class); + expect(utils.getBootClassLoader(cl)).andReturn(bootClassLoader); + expect(utils.getInitParameter("tuscany.online", "true")).andReturn("true"); + expect(utils.getRuntime(bootClassLoader)).andReturn(runtime); + expect(utils.getSystemScdl(bootClassLoader)).andReturn(systemUrl); + expect(utils.getApplicationScdl(cl)).andReturn(applicationUrl); + expect(utils.getApplicationName()).andReturn("application"); + replay(utils); + + expect(context.getResource("/WEB-INF/tuscany/")).andReturn(null); + context.setAttribute(eq(Constants.RUNTIME_ATTRIBUTE), isA(WebappRuntime.class)); + replay(context); + replay(cl); + replay(bootClassLoader); + expect(listener.getUtils(context)).andReturn(utils); + replay(listener); + runtime.setServletContext(context); + runtime.setRuntimeInfo(isA(WebappRuntimeInfo.class)); + runtime.setHostClassLoader(cl); + runtime.setSystemScdl(systemUrl); + runtime.setApplicationName("application"); + runtime.setApplicationScdl(applicationUrl); + runtime.initialize(); + replay(runtime); + + ClassLoader oldCl = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(cl); + listener.contextInitialized(event); + } finally { + Thread.currentThread().setContextClassLoader(oldCl); + } + verify(event); + verify(context); + verify(listener); + verify(cl); + verify(bootClassLoader); + verify(runtime); + } + + protected void setUp() throws Exception { + super.setUp(); + getUtilsMethod = TuscanyContextListener.class.getDeclaredMethod("getUtils", ServletContext.class); + utils = createMock(WebappUtil.class); + listener = createMock(TuscanyContextListener.class, new Method[]{getUtilsMethod}); + context = createMock(ServletContext.class); + cl = createMock(ClassLoader.class); + bootClassLoader = createMock(ClassLoader.class); + systemUrl = new URL("file:/system.scdl"); + applicationUrl = new URL("file:/application.scdl"); + monitorFactory = createMock(MonitorFactory.class); + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/TuscanyFilterTestCase.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/TuscanyFilterTestCase.java new file mode 100644 index 0000000000..80cfd3513a --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/TuscanyFilterTestCase.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +import junit.framework.TestCase; +import org.easymock.EasyMock; +import org.osoa.sca.CompositeContext; + +import static org.apache.tuscany.runtime.webapp.Constants.CONTEXT_ATTRIBUTE; +import static org.apache.tuscany.runtime.webapp.Constants.RUNTIME_ATTRIBUTE; + +/** + * @version $Rev$ $Date$ + */ +public class TuscanyFilterTestCase extends TestCase { + private TuscanyFilter filter; + private FilterConfig config; + private ServletContext servletContext; + private WebappRuntime runtime; + private CompositeContext context; + private ServletRequest request; + private ServletResponse response; + private FilterChain chain; + + public void testFilterInit() { + EasyMock.expect(config.getServletContext()).andReturn(servletContext); + EasyMock.expect(servletContext.getAttribute(RUNTIME_ATTRIBUTE)).andReturn(runtime); + EasyMock.expect(servletContext.getAttribute(CONTEXT_ATTRIBUTE)).andReturn(context); + + EasyMock.replay(servletContext); + EasyMock.replay(config); + EasyMock.replay(runtime); + EasyMock.replay(context); + try { + filter.init(config); + } catch (ServletException e) { + fail(e.getMessage()); + } + EasyMock.verify(servletContext); + EasyMock.verify(config); + EasyMock.verify(runtime); + EasyMock.verify(context); + } + + public void testFilterInitWithNoRuntimeConfigured() { + EasyMock.expect(config.getServletContext()).andReturn(servletContext); + EasyMock.expect(servletContext.getAttribute(RUNTIME_ATTRIBUTE)).andReturn(null); + + EasyMock.replay(servletContext); + EasyMock.replay(config); + EasyMock.replay(runtime); + EasyMock.replay(context); + try { + filter.init(config); + fail("Expected a ServletException"); + } catch (ServletException e) { + // OK + } + EasyMock.verify(servletContext); + EasyMock.verify(config); + EasyMock.verify(runtime); + EasyMock.verify(context); + } + + public void testContextIsAssociatedWithThread() throws ServletException, IOException { + EasyMock.expect(config.getServletContext()).andReturn(servletContext); + EasyMock.expect(servletContext.getAttribute(RUNTIME_ATTRIBUTE)).andReturn(runtime); + EasyMock.expect(servletContext.getAttribute(CONTEXT_ATTRIBUTE)).andReturn(context); + EasyMock.replay(servletContext); + EasyMock.replay(config); + filter.init(config); + + chain.doFilter(EasyMock.same(request), EasyMock.same(response)); + EasyMock.replay(chain); + runtime.startRequest(); + runtime.stopRequest(); + EasyMock.replay(runtime); + try { + filter.doFilter(request, response, chain); + } catch (IOException e) { + fail(e.getMessage()); + } + EasyMock.verify(chain); + EasyMock.verify(runtime); + } + + protected void setUp() throws Exception { + super.setUp(); + filter = new TuscanyFilter(); + config = EasyMock.createMock(FilterConfig.class); + servletContext = EasyMock.createMock(ServletContext.class); + runtime = EasyMock.createMock(WebappRuntime.class); + context = EasyMock.createMock(CompositeContext.class); + request = EasyMock.createMock(ServletRequest.class); + response = EasyMock.createMock(ServletResponse.class); + chain = EasyMock.createMock(FilterChain.class); + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/TuscanyServletTestCase.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/TuscanyServletTestCase.java new file mode 100644 index 0000000000..5213ae9cb1 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/TuscanyServletTestCase.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +import junit.framework.TestCase; +import org.apache.tuscany.host.servlet.ServletRequestInjector; +import static org.apache.tuscany.runtime.webapp.Constants.RUNTIME_ATTRIBUTE; +import org.easymock.EasyMock; +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.createNiceMock; +import static org.easymock.EasyMock.eq; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.verify; + +/** + * Verifies {@link TuscanyServlet} properly services a request + * + * @version $Rev$ $Date$ + */ +public class TuscanyServletTestCase extends TestCase { + + public void testRequestInjection() throws Exception { + ServletRequest req = createNiceMock(ServletRequest.class); + ServletResponse resp = createNiceMock(ServletResponse.class); + ServletRequestInjector injector = createMock(ServletRequestInjector.class); + injector.service(eq(req), eq(resp)); + EasyMock.replay(injector); + WebappRuntime runtime = createMock(WebappRuntime.class); + expect(runtime.getRequestInjector()).andReturn(injector); + replay(runtime); + ServletContext context = createNiceMock(ServletContext.class); + EasyMock.expect(context.getAttribute(RUNTIME_ATTRIBUTE)).andReturn(runtime); + EasyMock.replay(context); + TuscanyServlet servlet = new TuscanyServlet(); + ServletConfig config = createMock(ServletConfig.class); + expect(config.getServletContext()).andReturn(context); + replay(config); + servlet.init(config); + servlet.service(req, resp); + verify(context); + verify(injector); + } + + public void testRuntimeNotConfigured() throws Exception { + ServletContext context = createNiceMock(ServletContext.class); + TuscanyServlet servlet = new TuscanyServlet(); + ServletConfig config = createMock(ServletConfig.class); + expect(config.getServletContext()).andReturn(context); + replay(config); + try { + servlet.init(config); + fail(); + } catch (ServletException e) { + //expected + } + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/TuscanySessionListenerTestCase.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/TuscanySessionListenerTestCase.java new file mode 100644 index 0000000000..156ff35b68 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/TuscanySessionListenerTestCase.java @@ -0,0 +1,60 @@ +package org.apache.tuscany.runtime.webapp; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpSessionEvent; + +import junit.framework.TestCase; +import static org.apache.tuscany.runtime.webapp.Constants.RUNTIME_ATTRIBUTE; +import org.easymock.EasyMock; + +/** + * Verifies {@link org.apache.tuscany.runtime.webapp.TuscanySessionListener} notifies the runtime of session events + * + * @version $Rev$ $Date$ + */ +public class TuscanySessionListenerTestCase extends TestCase { + + public void testSessionPropagated() throws Exception { + WebappRuntime runtime = EasyMock.createNiceMock(WebappRuntime.class); + runtime.sessionCreated(EasyMock.isA(HttpSessionEvent.class)); + runtime.sessionDestroyed(EasyMock.isA(HttpSessionEvent.class)); + EasyMock.replay(runtime); + ServletContext context = EasyMock.createNiceMock(ServletContext.class); + EasyMock.expect(context.getAttribute(RUNTIME_ATTRIBUTE)).andReturn(runtime); + EasyMock.replay(context); + HttpSession session = EasyMock.createNiceMock(HttpSession.class); + EasyMock.expect(session.getServletContext()).andReturn(context); + EasyMock.replay(session); + HttpSessionEvent event = new HttpSessionEvent(session); + TuscanySessionListener listener = new TuscanySessionListener(); + listener.sessionCreated(event); + listener.sessionDestroyed(event); + EasyMock.verify(context); + EasyMock.verify(runtime); + } + + /** + * Verifies an error is logged when no runtime is configured + * + * @throws Exception + */ + public void testRuntimeNotConfigured() throws Exception { + ServletContext context = EasyMock.createNiceMock(ServletContext.class); + context.log(EasyMock.isA(String.class), EasyMock.isA(ServletException.class)); + EasyMock.replay(context); + TuscanySessionListener listener = new TuscanySessionListener(); + HttpSession session = EasyMock.createNiceMock(HttpSession.class); + EasyMock.expect(session.getServletContext()).andReturn(context); + EasyMock.replay(session); + HttpSessionEvent event = new HttpSessionEvent(session); + listener.sessionCreated(event); + EasyMock.verify(context); + } + + public void testSessionDestroyedBeforeCreated() throws Exception { + TuscanySessionListener listener = new TuscanySessionListener(); + listener.sessionDestroyed(null); + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/WebappUtilTestCase.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/WebappUtilTestCase.java new file mode 100644 index 0000000000..f865a4e740 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-api/src/test/java/org/apache/tuscany/runtime/webapp/WebappUtilTestCase.java @@ -0,0 +1,131 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import java.net.MalformedURLException; +import java.net.URL; +import javax.servlet.ServletContext; + +import junit.framework.TestCase; +import static org.easymock.classextension.EasyMock.*; + +/** + * @version $Rev$ $Date$ + */ +public class WebappUtilTestCase extends TestCase { + private ServletContext context; + private WebappUtilImpl listener; + private ClassLoader cl; + private URL systemUrl; + + + public void testGetInitParameterWhenSpecified() { + String name = "name"; + String value = "default"; + expect(context.getInitParameter(name)).andReturn(value); + replay(context); + + assertEquals(value, listener.getInitParameter(name, "default")); + verify(context); + } + + public void testGetInitParameterUsingDefault() { + String name = "name"; + String value = "default"; + expect(context.getInitParameter(name)).andReturn(null); + replay(context); + + assertEquals(value, listener.getInitParameter(name, value)); + verify(context); + } + + public void testGetInitParameterWithZeroLength() { + String name = "name"; + String value = "default"; + expect(context.getInitParameter(name)).andReturn(""); + replay(context); + + assertEquals(value, listener.getInitParameter(name, value)); + verify(context); + } + + public void testGetScdlFromWebapp() throws MalformedURLException { + String path = "/WEB-INF/test"; + expect(context.getResource(path)).andReturn(systemUrl); + replay(context); + replay(cl); + assertSame(systemUrl, listener.getScdlURL(path, cl)); + verify(context); + verify(cl); + } + + public void testGetScdlFromWebappMissing() throws MalformedURLException { + String path = "/WEB-INF/test"; + expect(context.getResource(path)).andReturn(null); + replay(context); + expect(cl.getResource(path)).andReturn(null); + replay(cl); + assertNull(listener.getScdlURL(path, cl)); + verify(context); + verify(cl); + } + + public void testGetScdlFromWebappMalformed() throws MalformedURLException { + String path = "/WEB-INF/test"; + expect(context.getResource(path)).andThrow(new MalformedURLException()); + replay(context); + replay(cl); + try { + listener.getScdlURL(path, cl); + fail(); + } catch (MalformedURLException e) { + // OK + } + verify(context); + verify(cl); + } + + public void testGetScdlFromClasspath() throws MalformedURLException { + String path = "META-INF/test"; + replay(context); + expect(cl.getResource(path)).andReturn(systemUrl); + replay(cl); + assertSame(systemUrl, listener.getScdlURL(path, cl)); + verify(context); + verify(cl); + } + + public void testGetScdlFromClasspathMissing() throws MalformedURLException { + String path = "META-INF/test"; + replay(context); + expect(cl.getResource(path)).andReturn(null); + replay(cl); + assertNull(listener.getScdlURL(path, cl)); + verify(context); + verify(cl); + } + + protected void setUp() throws Exception { + super.setUp(); + context = createMock(ServletContext.class); + listener = new WebappUtilImpl(context); + cl = createMock(ClassLoader.class); + systemUrl = new URL("file:/system.scdl"); + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/.ruleset b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/.ruleset new file mode 100644 index 0000000000..3886f07f2d --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/.ruleset @@ -0,0 +1,190 @@ + + + + PMD Plugin preferences rule set + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/LICENSE.txt b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/LICENSE.txt new file mode 100644 index 0000000000..0084319535 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/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, serviceDefinition 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/branches/pre-spec-changes/runtime/webapp/webapp-host/NOTICE.txt b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/NOTICE.txt new file mode 100644 index 0000000000..d83ebbe236 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/NOTICE.txt @@ -0,0 +1,14 @@ +${pom.name} +Copyright (c) 2005 - 2006 The Apache Software Foundation + +Apache Tuscany is an effort undergoing incubation at The Apache Software +Foundation (ASF), sponsored by the Apache 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. + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). + diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/pom.xml b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/pom.xml new file mode 100644 index 0000000000..bc5b897422 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/pom.xml @@ -0,0 +1,70 @@ + + + + + org.apache.tuscany.sca.runtime.webapp + webapp + 0.1-pre-spec-SNAPSHOT + + 4.0.0 + webapp-host + jar + Apache Tuscany Web Application Host + Host code to run Tuscany in a Web application. + + + + javax.servlet + servlet-api + + + + org.apache.tuscany.sca.kernel + core + + + org.apache.tuscany.sca.services + maven + ${sca.version} + runtime + + + + org.apache.tuscany.sca.runtime.webapp + webapp-api + ${sca.version} + compile + + + + + org.easymock + easymockclassextension + + + + org.apache.tuscany.sca + test + ${sca.version} + test + + + + diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/LazyHTTPSessionId.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/LazyHTTPSessionId.java new file mode 100644 index 0000000000..8d3f1153ba --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/LazyHTTPSessionId.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.tuscany.core.component.ScopeIdentifier; + +/** + * Implements a ScopeIdentifier for a Servlet-based transport. + * Wraps an HttpServletRequest 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/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/ServletHostImpl.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/ServletHostImpl.java new file mode 100644 index 0000000000..f642e272e0 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/ServletHostImpl.java @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.Servlet; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +import org.osoa.sca.annotations.EagerInit; +import org.osoa.sca.annotations.Service; + +import org.apache.tuscany.spi.annotation.Autowire; +import org.apache.tuscany.spi.component.ScopeContainer; +import org.apache.tuscany.spi.component.ScopeRegistry; +import org.apache.tuscany.spi.component.WorkContext; +import org.apache.tuscany.spi.event.Event; +import org.apache.tuscany.spi.event.EventFilter; +import org.apache.tuscany.spi.event.EventPublisher; +import org.apache.tuscany.spi.event.RuntimeEventListener; +import org.apache.tuscany.spi.host.ServletHost; +import org.apache.tuscany.spi.model.Scope; + +import org.apache.tuscany.core.component.event.HttpRequestEnded; +import org.apache.tuscany.core.component.event.HttpRequestStart; +import org.apache.tuscany.core.component.event.HttpSessionEnd; +import org.apache.tuscany.core.component.event.HttpSessionStart; +import org.apache.tuscany.host.servlet.ServletRequestInjector; + +/** + * A ServletHost implementation that forwards requests to registered servlets + * + * @version $Rev$ $Date$ + */ +@Service(ServletHost.class) +@EagerInit +public class ServletHostImpl implements ServletHost, ServletRequestInjector, EventPublisher { + protected Map servlets; + protected ScopeRegistry registry; + protected WorkContext workContext; + + public ServletHostImpl() { + this.servlets = new HashMap(); + } + + @Autowire(required = false) + public void setSessionScopeContainer(ScopeRegistry registry) { + this.registry = registry; + } + + @Autowire(required = false) + public void setWorkContext(WorkContext workContext) { + this.workContext = workContext; + } + + public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException { + assert req instanceof HttpServletRequest : "implementation only supports HttpServletRequest"; + String path = ((HttpServletRequest) req).getPathInfo(); + Servlet servlet = servlets.get(path); + if (servlet == null) { + throw new IllegalStateException("No servlet registered for path: " + path); + } + servlet.service(req, resp); + } + + public void registerMapping(String path, Servlet servlet) { + if (servlets.containsKey(path)) { + throw new IllegalStateException("Servlet already registered at path: " + path); + } + servlets.put(path, servlet); + } + + public boolean isMappingRegistered(String mapping) { + return servlets.containsKey(mapping); + + } + + public Servlet unregisterMapping(String path) { + return servlets.remove(path); + } + + public void addListener(RuntimeEventListener listener) { + throw new UnSupportedRuntimeException("Not Supported"); + + } + + public void addListener(EventFilter filter, RuntimeEventListener listener) { + throw new UnSupportedRuntimeException("Not Supported"); + + } + + public void publish(Event event) { + if (null != registry && (event instanceof HttpSessionStart || event instanceof HttpSessionEnd)) { + ScopeContainer sc = registry.getScopeContainer(Scope.SESSION); + if (null != sc) { + sc.onEvent(event); + + } + } + if (null != workContext) { + if (event instanceof HttpRequestStart) { + Object key = ((HttpRequestStart) event).getId(); + if (null != key) { + workContext.setIdentifier(Scope.SESSION, ((HttpRequestStart) event).getId()); + } else { // new request with no session. + workContext.clearIdentifier(Scope.SESSION); + } + } else if (event instanceof HttpRequestEnded) { + workContext.clearIdentifier(Scope.SESSION); + + } + + } + + } + + public void removeListener(RuntimeEventListener listener) { + throw new UnSupportedRuntimeException("Not Supported"); + + } + +} \ No newline at end of file diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/ServletLauncherInitException.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/ServletLauncherInitException.java new file mode 100644 index 0000000000..0b47744e5f --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/ServletLauncherInitException.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import org.apache.tuscany.api.TuscanyRuntimeException; + +/** + * Thrown when an error is encountered booting the runtme in a web app environment + * + * @version $Rev$ $Date$ + */ +public class ServletLauncherInitException extends TuscanyRuntimeException { + + public ServletLauncherInitException() { + } + + public ServletLauncherInitException(String message) { + super(message); + } + + public ServletLauncherInitException(String message, String identifier) { + super(message, identifier); + } + + public ServletLauncherInitException(String message, Throwable cause) { + super(message, cause); + } + + public ServletLauncherInitException(Throwable cause) { + super(cause); + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/UnSupportedRuntimeException.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/UnSupportedRuntimeException.java new file mode 100644 index 0000000000..9cfa7345d6 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/UnSupportedRuntimeException.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import org.apache.tuscany.api.TuscanyRuntimeException; + +/** + * Thrown when an error is encountered booting the runtme in a web app environment + * + * @version $Rev: 439728 $ $Date: 2006-09-03 02:02:44 -0400 (Sun, 03 Sep 2006) $ + */ +public class UnSupportedRuntimeException extends TuscanyRuntimeException { + + public UnSupportedRuntimeException() { + } + + public UnSupportedRuntimeException(String message) { + super(message); + } + + public UnSupportedRuntimeException(String message, Throwable cause) { + super(message, cause); + } + + public UnSupportedRuntimeException(Throwable cause) { + super(cause); + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/WebResourceScanExtender.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/WebResourceScanExtender.java new file mode 100644 index 0000000000..89f0f31b1b --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/WebResourceScanExtender.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Set; +import javax.servlet.ServletContext; + +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Property; + +import org.apache.tuscany.spi.annotation.Autowire; + +import org.apache.tuscany.core.services.extension.AbstractExtensionDeployer; + +/** + * @version $Rev$ $Date$ + */ +public class WebResourceScanExtender extends AbstractExtensionDeployer { + private final WebappRuntimeInfo runtimeInfo; + private final String path; + + public WebResourceScanExtender(@Autowire WebappRuntimeInfo runtimeInfo, + @Property(name = "path") String path) { + this.runtimeInfo = runtimeInfo; + this.path = path; + } + + @Init + public void init() { + ServletContext servletContext = runtimeInfo.getServletContext(); + Set extensions = servletContext.getResourcePaths(path); + if (extensions == null || extensions.isEmpty()) { + // no extensions in this webapp + return; + } + + for (Object e : extensions) { + String extensionPath = (String) e; + URL extension; + try { + extension = servletContext.getResource(extensionPath); + } catch (MalformedURLException e1) { + // web container should return an invalid URL for a path it gave us + throw new AssertionError(); + } + + String name = extensionPath.substring(path.length()); + if (name.charAt(name.length() - 1) == '/') { + // TODO support exploded extensions + continue; + } + if (name.charAt(0) == '.') { + // hidden file + continue; + } + + int lastDot = name.lastIndexOf('.'); + if (lastDot != -1) { + name = name.substring(0, lastDot); + } + deployExtension(name, extension); + } + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/WebappRuntimeImpl.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/WebappRuntimeImpl.java new file mode 100644 index 0000000000..82278f89ee --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/java/org/apache/tuscany/runtime/webapp/WebappRuntimeImpl.java @@ -0,0 +1,179 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import java.util.StringTokenizer; +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpSessionEvent; + +import org.osoa.sca.CompositeContext; + +import org.apache.tuscany.core.component.event.HttpRequestEnded; +import org.apache.tuscany.core.component.event.HttpRequestStart; +import org.apache.tuscany.core.component.event.HttpSessionEnd; +import org.apache.tuscany.core.component.event.HttpSessionStart; +import org.apache.tuscany.core.component.event.RequestEnd; +import org.apache.tuscany.core.component.event.RequestStart; +import org.apache.tuscany.core.launcher.CompositeContextImpl; +import org.apache.tuscany.core.runtime.AbstractRuntime; +import org.apache.tuscany.host.runtime.InitializationException; +import org.apache.tuscany.host.servlet.ServletRequestInjector; +import org.apache.tuscany.spi.component.AtomicComponent; +import org.apache.tuscany.spi.component.ComponentRegistrationException; +import org.apache.tuscany.spi.component.CompositeComponent; +import org.apache.tuscany.spi.component.SCAObject; +import org.apache.tuscany.spi.event.EventPublisher; + +/** + * Bootstrapper for the Tuscany runtime in a web application host. This listener manages one runtime per servlet + * context; the lifecycle of that runtime corresponds to the the lifecycle of the associated servlet context. + *

+ * The bootstrapper launches the runtime, booting system extensions and applications, according to the servlet + * parameters defined in {@link Constants}. When the runtime is instantiated, it is placed in the servlet context with + * the attribute {@link Constants#RUNTIME_PARAM}. The runtime implements {@link WebappRuntime} so that filters and + * servlets loaded in the parent web app classloader may pass events and requests to it. + *

+ * By default, the top-most application composite component will be returned when "non-managed" web application code + * such as JSPs call {@link org.osoa.sca.CurrentCompositeContext}. If a composite deeper in the hierarchy should be + * returned instead, the web.xml must contain an entry for {@link Constants#CURRENT_COMPOSITE_PATH_PARAM} + * whose value is a component path expression using '/' as a delimeter such as foo/bar/baz. + * + * @version $$Rev$$ $$Date$$ + */ + +public class WebappRuntimeImpl extends AbstractRuntime implements WebappRuntime { + private ServletContext servletContext; + + + private ServletRequestInjector requestInjector; + private CompositeContextImpl context; + private CompositeComponent application; + + public ServletContext getServletContext() { + return servletContext; + } + + public void setServletContext(ServletContext servletContext) { + this.servletContext = servletContext; + } + + protected void registerSystemComponents() throws InitializationException { + super.registerSystemComponents(); + try { + getSystemComponent().registerJavaObject(WebappRuntimeInfo.COMPONENT_NAME, + WebappRuntimeInfo.class, + (WebappRuntimeInfo) getRuntimeInfo()); + } catch (ComponentRegistrationException e) { + throw new InitializationException(e); + } + } + + public void initialize() throws InitializationException { + super.initialize(); + + try { + SCAObject host = getTuscanySystem().getSystemChild("servletHost"); + if (!(host instanceof AtomicComponent)) { + throw new InitializationException("Servlet host must be an atomic component"); + } + requestInjector = (ServletRequestInjector) ((AtomicComponent) host).getTargetInstance(); + + if (getApplicationScdl() == null) { + throw new TuscanyInitException("Could not find application SCDL"); + } + getRuntime().getRootComponent().start(); + application = deployApplicationScdl(getDeployer(), + getRuntime().getRootComponent(), + getApplicationName(), + getApplicationScdl(), + getHostClassLoader()); + application.start(); + CompositeComponent current = application; + String path = servletContext.getInitParameter(Constants.CURRENT_COMPOSITE_PATH_PARAM); + if (path != null) { + StringTokenizer tokenizer = new StringTokenizer(path, "/"); + while (tokenizer.hasMoreTokens()) { + SCAObject o = current.getChild(tokenizer.nextToken()); + if (!(o instanceof CompositeComponent)) { + throw new ServletLauncherInitException("Invalid context path", path); + } + current = (CompositeComponent) o; + } + } + context = new CompositeContextImpl(current, getWireService()); + servletContext.setAttribute(Constants.CONTEXT_ATTRIBUTE, context); + } catch (Exception e) { + throw new ServletLauncherInitException(e); + } + } + + public void destroy() { + servletContext.removeAttribute(Constants.CONTEXT_ATTRIBUTE); + if (application != null) { + application.stop(); + application = null; + } + super.destroy(); + } + + public CompositeContext getContext() { + return context; + } + + public ServletRequestInjector getRequestInjector() { + return requestInjector; + } + + public void sessionCreated(HttpSessionEvent event) { + HttpSessionStart startSession = new HttpSessionStart(this, event.getSession().getId()); + application.publish(startSession); + ((EventPublisher) requestInjector).publish(startSession); + } + + public void sessionDestroyed(HttpSessionEvent event) { + HttpSessionEnd endSession = new HttpSessionEnd(this, event.getSession().getId()); + application.publish(endSession); + ((EventPublisher) requestInjector).publish(endSession); + } + + public void httpRequestStarted(HttpServletRequest request) { + HttpSession session = request.getSession(false); + Object sessionId = session == null ? new LazyHTTPSessionId(request) : session.getId(); + HttpRequestStart httpRequestStart = new HttpRequestStart(this, sessionId); + application.publish(httpRequestStart); + ((EventPublisher) requestInjector).publish(httpRequestStart); + } + + public void httpRequestEnded(Object sessionid) { + HttpRequestEnded httpRequestEnded = new HttpRequestEnded(this, sessionid); + application.publish(httpRequestEnded); + ((EventPublisher) requestInjector).publish(httpRequestEnded); + } + + + public void startRequest() { + application.publish(new RequestStart(this)); + } + + public void stopRequest() { + application.publish(new RequestEnd(this)); + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/resources/META-INF/sca/binding.axis2.scdl b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/resources/META-INF/sca/binding.axis2.scdl new file mode 100644 index 0000000000..b1a1fde4c4 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/resources/META-INF/sca/binding.axis2.scdl @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/resources/META-INF/sca/databinding.sdo.scdl b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/resources/META-INF/sca/databinding.sdo.scdl new file mode 100644 index 0000000000..6897567d2d --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/resources/META-INF/sca/databinding.sdo.scdl @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/resources/META-INF/tuscany/webapp.scdl b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/resources/META-INF/tuscany/webapp.scdl new file mode 100644 index 0000000000..58af279788 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/main/resources/META-INF/tuscany/webapp.scdl @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + + + + + + + + + + http://repo1.maven.org/maven2/,http://people.apache.org/repo/m2-snapshot-repository,http://people.apache.org/repo/m2-incubating-repository/,http://people.apache.org/repo/m1-snapshot-repository/ + + + + + /WEB-INF/tuscany/extensions/ + + + + + + + + + + + + + + + + diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/Foo.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/Foo.java new file mode 100644 index 0000000000..75b49de188 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/Foo.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +/** + * @version $Rev$ $Date$ + */ +public interface Foo { +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/FooImpl.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/FooImpl.java new file mode 100644 index 0000000000..dd938f2a58 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/FooImpl.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +/** + * @version $Rev$ $Date$ + */ +public class FooImpl implements Foo { +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/LazyHTTPSessionIdTestCase.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/LazyHTTPSessionIdTestCase.java new file mode 100644 index 0000000000..f41fa2361b --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/LazyHTTPSessionIdTestCase.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.runtime.webapp; + +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import junit.framework.TestCase; + +public class LazyHTTPSessionIdTestCase extends TestCase { + + public void testGetIdentifier() { + HttpSession id = createMock(HttpSession.class); + + HttpServletRequest request = createMock(HttpServletRequest.class); + expect(request.getSession(true)).andReturn(id); + replay(request); + + LazyHTTPSessionId lazyHTTPSessionId = new LazyHTTPSessionId(request); + assertEquals(id, lazyHTTPSessionId.getIdentifier()); + } + +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/ServletHostTestCase.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/ServletHostTestCase.java new file mode 100644 index 0000000000..3d979e8f46 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/ServletHostTestCase.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.verify; + +import javax.servlet.Servlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import junit.framework.TestCase; +import org.easymock.EasyMock; + +/** + * @version $Rev$ $Date$ + */ +public class ServletHostTestCase extends TestCase { + + public void testDispatch() throws Exception { + HttpServletRequest req = createMock(HttpServletRequest.class); + expect(req.getPathInfo()).andReturn("foo"); + replay(req); + HttpServletResponse res = createMock(HttpServletResponse.class); + Servlet servlet = createMock(Servlet.class); + servlet.service(req, res); + EasyMock.expectLastCall(); + replay(servlet); + ServletHostImpl host = new ServletHostImpl(); + host.registerMapping("foo", servlet); + host.service(req, res); + verify(servlet); + } + + public void testDuplicateRegistration() throws Exception { + Servlet servlet = createMock(Servlet.class); + ServletHostImpl host = new ServletHostImpl(); + host.registerMapping("foo", servlet); + assertEquals(true, host.isMappingRegistered("foo")); + assertEquals(false, host.isMappingRegistered("bar")); + try { + host.registerMapping("foo", servlet); + fail(); + } catch (IllegalStateException e) { + // expected + } + } + + public void testUnregister() throws Exception { + HttpServletRequest req = createMock(HttpServletRequest.class); + expect(req.getPathInfo()).andReturn("foo"); + replay(req); + HttpServletResponse res = createMock(HttpServletResponse.class); + Servlet servlet = createMock(Servlet.class); + replay(servlet); + ServletHostImpl host = new ServletHostImpl(); + host.registerMapping("foo", servlet); + Servlet unregedServlet = host.unregisterMapping("foo"); + assertEquals(unregedServlet, servlet); + try { + host.service(req, res); + } catch (IllegalStateException e) { + // expected + } + verify(servlet); + } + +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/WebappRuntimeImplTestCase.java b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/WebappRuntimeImplTestCase.java new file mode 100644 index 0000000000..c4e7c35208 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/java/org/apache/tuscany/runtime/webapp/WebappRuntimeImplTestCase.java @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.runtime.webapp; + +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.verify; +import static org.easymock.EasyMock.isA; +import static org.easymock.EasyMock.eq; +import org.osoa.sca.CompositeContext; + +import java.net.URL; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; + +import junit.framework.TestCase; + +import org.apache.tuscany.core.monitor.NullMonitorFactory; +import org.apache.tuscany.host.servlet.ServletRequestInjector; +import org.apache.tuscany.spi.component.WorkContext; +import org.apache.tuscany.spi.model.Scope; + +/** + * @version $Rev$ $Date$ + */ +public class WebappRuntimeImplTestCase extends TestCase { + private URL applicationScdl; + private URL systemScdl; + private WebappRuntimeImpl runtime; + private ServletContext context; + + /** + * Verifies the web app host is configured properly to perform a basic boot + */ + public void testBootWithDefaults() throws Exception { + expect(context.getResourcePaths("/WEB-INF/tuscany/extensions/")).andReturn(null); + expect(context.getInitParameter("tuscany.currentCompositePath")).andReturn(null); + context.setAttribute(eq(Constants.CONTEXT_ATTRIBUTE), isA(CompositeContext.class)); + replay(context); + runtime.initialize(); + verify(context); + } + + public void testLazyHttpSessionId() throws Exception { + expect(context.getResourcePaths("/WEB-INF/tuscany/extensions/")).andReturn(null); + expect(context.getInitParameter("tuscany.currentCompositePath")).andReturn(null); + context.setAttribute(eq(Constants.CONTEXT_ATTRIBUTE), isA(CompositeContext.class)); + replay(context); + runtime.initialize(); + verify(context); + + HttpServletRequest request = createMock(HttpServletRequest.class);; + expect(request.getSession(true)).andReturn(null); + expect(request.getSession(false)).andReturn(null); + replay(request); + + runtime.httpRequestStarted(request); + + ServletRequestInjector injector = runtime.getRequestInjector(); + class WorkContextAccessor extends ServletHostImpl { + ServletHostImpl servletHostImpl; + WorkContextAccessor(ServletHostImpl servletHostImpl){ + this.servletHostImpl = servletHostImpl; + } + WorkContext getWorkContext() { + return servletHostImpl.workContext; + } + } + WorkContext workContext = new WorkContextAccessor((ServletHostImpl)injector).getWorkContext(); + workContext.getIdentifier(Scope.SESSION); + verify(request); + } + + protected void setUp() throws Exception { + super.setUp(); + systemScdl = getClass().getResource("/META-INF/tuscany/webapp.scdl"); + applicationScdl = getClass().getResource("/testapp.scdl"); + context = createMock(ServletContext.class); + + runtime = new WebappRuntimeImpl(); + runtime.setRuntimeInfo(new WebappRuntimeInfoImpl(context, null, false)); + runtime.setMonitorFactory(new NullMonitorFactory()); + runtime.setHostClassLoader(getClass().getClassLoader()); + runtime.setServletContext(context); + runtime.setSystemScdl(systemScdl); + runtime.setApplicationName("foo"); + runtime.setApplicationScdl(applicationScdl); + } +} diff --git a/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/resources/testapp.scdl b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/resources/testapp.scdl new file mode 100644 index 0000000000..9b5bda7fb6 --- /dev/null +++ b/sca-java-1.x/branches/pre-spec-changes/runtime/webapp/webapp-host/src/test/resources/testapp.scdl @@ -0,0 +1,26 @@ + + + + + + + + + -- cgit v1.2.3