Initial proposal
Project: http://git-wip-us.apache.org/repos/asf/karaf-boot/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf-boot/commit/a0248b78 Tree: http://git-wip-us.apache.org/repos/asf/karaf-boot/tree/a0248b78 Diff: http://git-wip-us.apache.org/repos/asf/karaf-boot/diff/a0248b78 Branch: refs/heads/master Commit: a0248b78854b61535c55bf748a9159a093a624c9 Parents: Author: Jean-Baptiste Onofré <[email protected]> Authored: Wed Sep 9 16:09:55 2015 +0200 Committer: Jean-Baptiste Onofré <[email protected]> Committed: Wed Sep 9 16:09:55 2015 +0200 ---------------------------------------------------------------------- .gitignore | 10 + LICENSE | 475 +++++++++++++++++++ README.md | 12 + karaf-boot-parent/pom.xml | 73 +++ karaf-boot-samples/README.md | 20 + .../karaf-boot-sample-simple/pom.xml | 33 ++ .../karaf/boot/sample/simple/SimpleBean.java | 14 + karaf-boot-starter/README.md | 11 + karaf-boot-starter/pom.xml | 34 ++ .../karaf-boot-maven-plugin/pom.xml | 77 +++ .../tools/maven/plugin/FilteredClassFinder.java | 60 +++ .../boot/tools/maven/plugin/GenerateMojo.java | 107 +++++ .../boot/tools/maven/plugin/Generator.java | 223 +++++++++ .../maven/plugin/OsgiServiceProviderWriter.java | 86 ++++ .../boot/tools/maven/plugin/model/Bean.java | 152 ++++++ .../boot/tools/maven/plugin/model/BeanRef.java | 69 +++ .../boot/tools/maven/plugin/model/Context.java | 121 +++++ .../plugin/model/JavaxTransactionFactory.java | 40 ++ .../boot/tools/maven/plugin/model/Matcher.java | 23 + .../maven/plugin/model/OsgiServiceRef.java | 41 ++ .../tools/maven/plugin/model/ProducedBean.java | 13 + .../boot/tools/maven/plugin/model/Property.java | 90 ++++ .../maven/plugin/model/PropertyWriter.java | 23 + .../plugin/model/SpringTransactionFactory.java | 40 ++ .../maven/plugin/model/TransactionalDef.java | 39 ++ .../boot/tools/maven/plugin/GeneratorTest.java | 99 ++++ .../boot/tools/maven/plugin/Namespaces.java | 54 +++ .../boot/tools/maven/plugin/model/BeanTest.java | 92 ++++ .../tools/maven/plugin/model/ContextTest.java | 84 ++++ .../tools/maven/plugin/model/PropertyTest.java | 73 +++ .../maven/plugin/model/TestBeanForRef.java | 39 ++ .../boot/tools/maven/plugin/test/MyBean1.java | 52 ++ .../boot/tools/maven/plugin/test/MyBean3.java | 50 ++ .../boot/tools/maven/plugin/test/MyBean4.java | 13 + .../tools/maven/plugin/test/MyFactoryBean.java | 17 + .../tools/maven/plugin/test/MyProduced.java | 18 + .../tools/maven/plugin/test/ParentBean.java | 33 ++ .../boot/tools/maven/plugin/test/ServiceA.java | 23 + .../tools/maven/plugin/test/ServiceAImpl1.java | 28 ++ .../tools/maven/plugin/test/ServiceAImpl2.java | 34 ++ .../boot/tools/maven/plugin/test/ServiceB.java | 23 + .../maven/plugin/test/ServiceReferences.java | 33 ++ karaf-boot-tools/pom.xml | 38 ++ karaf-boot/README.md | 5 + karaf-boot/pom.xml | 33 ++ .../main/java/org/apache/karaf/boot/Arg.java | 53 +++ .../main/java/org/apache/karaf/boot/Bean.java | 79 +++ .../main/java/org/apache/karaf/boot/Bind.java | 31 ++ .../java/org/apache/karaf/boot/Destroy.java | 31 ++ .../java/org/apache/karaf/boot/Element.java | 43 ++ .../main/java/org/apache/karaf/boot/Init.java | 31 ++ .../main/java/org/apache/karaf/boot/Inject.java | 32 ++ .../main/java/org/apache/karaf/boot/List.java | 36 ++ .../java/org/apache/karaf/boot/Reference.java | 69 +++ .../org/apache/karaf/boot/ReferenceList.java | 67 +++ .../apache/karaf/boot/ReferenceListener.java | 28 ++ .../java/org/apache/karaf/boot/Register.java | 31 ++ .../apache/karaf/boot/RegistrationListener.java | 29 ++ .../java/org/apache/karaf/boot/Service.java | 56 +++ .../org/apache/karaf/boot/ServiceProperty.java | 36 ++ .../main/java/org/apache/karaf/boot/Unbind.java | 31 ++ .../java/org/apache/karaf/boot/Unregister.java | 31 ++ pom.xml | 43 ++ 63 files changed, 3484 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/.gitignore ---------------------------------------------------------------------- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..22d0ed1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*.i?? +.idea +.project +.classpath +.settings +target +eclipse-classes +atlassian-ide-plugin.xml +bin +dependency-reduced-pom.xml http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/LICENSE ---------------------------------------------------------------------- diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b36a53d --- /dev/null +++ b/LICENSE @@ -0,0 +1,475 @@ + + 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. + +For asm: +Copyright (c) 2000-2011 INRIA, France Telecom +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE. + +For equinox: +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 Java Service Wrapper: +Copyright (c) 1999, 2006 Tanuki Software, Inc. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of the Java Service Wrapper and associated +documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sub-license, +and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + +Portions of the Software have been derived from source code +developed by Silver Egg Technology under the following license: + +BEGIN Silver Egg Techology License ----------------------------------- + + Copyright (c) 2001 Silver Egg Technology + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sub-license, and/or + sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + +END Silver Egg Techology License ------------------------------------- + +For slf4j +Copyright (c) 2004-2011 QOS.ch +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/README.md ---------------------------------------------------------------------- diff --git a/README.md b/README.md new file mode 100644 index 0000000..40eb582 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +Apache Karaf Boot +----------------- + +Karaf Boot provides an easy way to create artifacts ready to be deployed in Karaf, and also possibility to embed, configure, and bootstrap Karaf in a ready to run artifact. + +You focus on your business, and Karaf Boot deals with all the "plumbing" for you. + +Karaf Boot provides: + +* set of dependencies providing annotations that you can use directly in your code: you focus on your business code, Karaf Boot does the rest +* a Maven plugin processing the annotations to create key turn artifacts +* an utility start to easily embed, configure, and bootstrap Karaf http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-parent/pom.xml ---------------------------------------------------------------------- diff --git a/karaf-boot-parent/pom.xml b/karaf-boot-parent/pom.xml new file mode 100644 index 0000000..9142128 --- /dev/null +++ b/karaf-boot-parent/pom.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + <modelVersion>4.0.0</modelVersion> + + <groupId>org.apache.karaf.boot</groupId> + <artifactId>karaf-boot-parent</artifactId> + <version>1.0.0-SNAPSHOT</version> + <packaging>pom</packaging> + + <dependencies> + <dependency> + <groupId>org.apache.karaf.boot</groupId> + <artifactId>karaf-boot</artifactId> + <version>1.0.0-SNAPSHOT</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.karaf.boot</groupId> + <artifactId>karaf-boot-maven-plugin</artifactId> + <version>1.0.0-SNAPSHOT</version> + <inherited>true</inherited> + <extensions>true</extensions> + <executions> + <execution> + <phase>generate-resources</phase> + <goals> + <goal>generate</goal> + </goals> + <configuration> + <scanPaths> + <scanPath>${project.build.sourceDirectory}</scanPath> + </scanPaths> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <version>2.5.4</version> + <inherited>true</inherited> + <extensions>true</extensions> + <configuration> + <supportedProjectTypes> + <supportedProjectType>jar</supportedProjectType> + <supportedProjectType>war</supportedProjectType> + </supportedProjectTypes> + </configuration> + <executions> + <execution> + <phase>package</phase> + <goals> + <goal>bundle</goal> + </goals> + <configuration> + <instructions> + <Import-Package> + org.apache.karaf.boot*;resolution:=optional, + * + </Import-Package> + </instructions> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + +</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-samples/README.md ---------------------------------------------------------------------- diff --git a/karaf-boot-samples/README.md b/karaf-boot-samples/README.md new file mode 100644 index 0000000..31be07a --- /dev/null +++ b/karaf-boot-samples/README.md @@ -0,0 +1,20 @@ +* karaf-boot-simple + Simple bean +* karaf-boot-service-provider + Service provider +* karaf-boot-service-consumer + Service consumer +* karaf-boot-config-managed + Managed by configuration (reload) +* karaf-boot-servlet + Servlet provider +* karaf-boot-rest + REST service provider +* karaf-boot-soap + SOAP service provider +* karaf-boot-jpa + JPA implementation +* karaf-boot-profile + Build a profile based on karaf-boot definition +* karaf-boot-starter + Package and configure Karaf as a ready to run artifact \ No newline at end of file http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-samples/karaf-boot-sample-simple/pom.xml ---------------------------------------------------------------------- diff --git a/karaf-boot-samples/karaf-boot-sample-simple/pom.xml b/karaf-boot-samples/karaf-boot-sample-simple/pom.xml new file mode 100644 index 0000000..538503d --- /dev/null +++ b/karaf-boot-samples/karaf-boot-sample-simple/pom.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + <!-- + + 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. + --> + + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.karaf.boot</groupId> + <artifactId>karaf-boot-parent</artifactId> + <version>1.0.0-SNAPSHOT</version> + </parent> + + <artifactId>karaf-boot-sample-simple</artifactId> + <version>1.0.0-SNAPSHOT</version> + +</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-samples/karaf-boot-sample-simple/src/main/java/org/apache/karaf/boot/sample/simple/SimpleBean.java ---------------------------------------------------------------------- diff --git a/karaf-boot-samples/karaf-boot-sample-simple/src/main/java/org/apache/karaf/boot/sample/simple/SimpleBean.java b/karaf-boot-samples/karaf-boot-sample-simple/src/main/java/org/apache/karaf/boot/sample/simple/SimpleBean.java new file mode 100644 index 0000000..b89f733 --- /dev/null +++ b/karaf-boot-samples/karaf-boot-sample-simple/src/main/java/org/apache/karaf/boot/sample/simple/SimpleBean.java @@ -0,0 +1,14 @@ +package org.apache.karaf.boot.sample.simple; + +import org.apache.karaf.boot.Bean; +import org.apache.karaf.boot.Init; + +@Bean(id = "simple-bean") +public class SimpleBean { + + @Init + public void simple() { + System.out.println("Hello world"); + } + +} http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-starter/README.md ---------------------------------------------------------------------- diff --git a/karaf-boot-starter/README.md b/karaf-boot-starter/README.md new file mode 100644 index 0000000..43dc8e3 --- /dev/null +++ b/karaf-boot-starter/README.md @@ -0,0 +1,11 @@ +Karaf Boot Starter +------------------ +Karaf Boot Starter provides a convenient way to create a ready to execute artifact, embedding Karaf. + +You just have to extend the KarafApplication class. In the config() method, you can define: +- the configuration +- the bundles +- the features +of your embedded Karaf instance. + +The Karaf Boot Starter Maven plugin will create the "key turn" jar that you can execute directly, on any machine. \ No newline at end of file http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-starter/pom.xml ---------------------------------------------------------------------- diff --git a/karaf-boot-starter/pom.xml b/karaf-boot-starter/pom.xml new file mode 100644 index 0000000..20fd28e --- /dev/null +++ b/karaf-boot-starter/pom.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + <!-- + + 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. + --> + + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.karaf.boot</groupId> + <artifactId>karaf-boot-build</artifactId> + <version>1.0.0-SNAPSHOT</version> + <relativePath>../pom.xml</relativePath> + </parent> + + <artifactId>karaf-boot-starter</artifactId> + <packaging>pom</packaging> + +</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-tools/karaf-boot-maven-plugin/pom.xml ---------------------------------------------------------------------- diff --git a/karaf-boot-tools/karaf-boot-maven-plugin/pom.xml b/karaf-boot-tools/karaf-boot-maven-plugin/pom.xml new file mode 100644 index 0000000..19bb184 --- /dev/null +++ b/karaf-boot-tools/karaf-boot-maven-plugin/pom.xml @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.karaf.boot</groupId> + <artifactId>karaf-boot-tools</artifactId> + <version>1.0.0-SNAPSHOT</version> + <relativePath>../pom.xml</relativePath> + </parent> + + <artifactId>karaf-boot-maven-plugin</artifactId> + <packaging>maven-plugin</packaging> + + <dependencies> + <dependency> + <groupId>javax.inject</groupId> + <artifactId>javax.inject</artifactId> + <version>1</version> + </dependency> + <dependency> + <groupId>org.apache.xbean</groupId> + <artifactId>xbean-finder-shaded</artifactId> + <version>4.0</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + <version>4.1.0.RELEASE</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-tx</artifactId> + <version>4.1.0.RELEASE</version> + </dependency> + <dependency> + <groupId>javax.persistence</groupId> + <artifactId>persistence-api</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>javax.transaction</groupId> + <artifactId>javax.transaction-api</artifactId> + <version>1.2</version> + </dependency> + <dependency> + <groupId>org.ops4j.pax.cdi</groupId> + <artifactId>pax-cdi-api</artifactId> + <version>0.9.0</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-plugin-api</artifactId> + <version>3.1.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-core</artifactId> + <version>3.1.1</version> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.12</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.4</version> + <scope>test</scope> + </dependency> + </dependencies> + +</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/FilteredClassFinder.java ---------------------------------------------------------------------- diff --git a/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/FilteredClassFinder.java b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/FilteredClassFinder.java new file mode 100644 index 0000000..7ba607b --- /dev/null +++ b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/FilteredClassFinder.java @@ -0,0 +1,60 @@ +/** + * 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.karaf.boot.tools.maven.plugin; + +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import javax.inject.Singleton; + +import org.apache.xbean.finder.ClassFinder; +import org.springframework.stereotype.Component; + +public class FilteredClassFinder { + + @SuppressWarnings("unchecked") + public static Set<Class<?>> findClasses(ClassFinder finder, Collection<String> packageNames) { + return findClasses(finder, packageNames, new Class[]{Singleton.class, Component.class}); + } + + public static Set<Class<?>> findClasses(ClassFinder finder, Collection<String> packageNames, Class<? extends Annotation>[] annotations) { + Set<Class<?>> rawClasses = new HashSet<Class<?>>(); + for (Class<? extends Annotation> annotation : annotations) { + rawClasses.addAll(finder.findAnnotatedClasses(annotation)); + } + return filterByBasePackages(rawClasses, packageNames); + } + + private static Set<Class<?>> filterByBasePackages(Set<Class<?>> rawClasses, Collection<String> packageNames) { + Set<Class<?>> filteredClasses = new HashSet<Class<?>>(); + for (Class<?> clazz : rawClasses) { + for (String packageName : packageNames) { + if (clazz.getPackage().getName().startsWith(packageName)) { + filteredClasses.add(clazz); + continue; + } + } + } + //System.out.println("Raw: " + rawClasses); + //System.out.println("Filtered: " + beanClasses); + return filteredClasses; + } +} http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/GenerateMojo.java ---------------------------------------------------------------------- diff --git a/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/GenerateMojo.java b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/GenerateMojo.java new file mode 100644 index 0000000..72d5f28 --- /dev/null +++ b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/GenerateMojo.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.karaf.boot.tools.maven.plugin; + +import java.io.File; +import java.io.FileOutputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import org.apache.karaf.boot.tools.maven.plugin.model.Context; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.model.Resource; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.project.MavenProject; +import org.apache.xbean.finder.ClassFinder; + +/** + * Generates blueprint from spring annotations + * @goal generate + * @phase process-classes + * @requiresDependencyResolution compile + * @inheritByDefault false + * @description Generates artifact using karaf-boot annotations and supporting spring annotations @Component, @Autowire and @Value + */ +public class GenerateMojo extends AbstractMojo { + + /** + * The maven project. + * + * @parameter default-value="${project}" + * @required + */ + protected MavenProject project; + + /** + * @parameter + * @required + */ + protected List<String> scanPaths; + + /** + * true: Purely annotated mode (needs jpa 2.1.0 and transaction-blueprint 1.1.0) + * false: XML based mode for JPA 1.x and transaction-blueprint < 1.1.0 + * @parameter default-value="true" + * @required + */ + protected boolean persistenceAnnotated; + + public void execute() throws MojoExecutionException, MojoFailureException { + try { + String buildDir = project.getBuild().getDirectory(); + String generatedDir = buildDir + "/generated-resources"; + Resource resource = new Resource(); + resource.setDirectory(generatedDir); + project.addResource(resource); + ClassFinder finder = createProjectScopeFinder(); + + File file = new File(generatedDir, "OSGI-INF/blueprint/autowire.xml"); + file.getParentFile().mkdirs(); + System.out.println("Generating blueprint to " + file); + Set<Class<?>> classes = FilteredClassFinder.findClasses(finder, scanPaths); + Context context = new Context(classes); + context.resolve(); + new Generator(context, new FileOutputStream(file), persistenceAnnotated).generate(); + } catch (Exception e) { + throw new MojoExecutionException("Error building commands help", e); + } + } + + private ClassFinder createProjectScopeFinder() throws MalformedURLException { + List<URL> urls = new ArrayList<URL>(); + + urls.add( new File(project.getBuild().getOutputDirectory()).toURI().toURL() ); + for ( Object artifactO : project.getArtifacts() ) { + Artifact artifact = (Artifact)artifactO; + File file = artifact.getFile(); + if ( file != null ) { + urls.add( file.toURI().toURL() ); + } + } + ClassLoader loader = new URLClassLoader(urls.toArray(new URL[urls.size()]), getClass().getClassLoader()); + return new ClassFinder(loader, urls); + } + +} http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/Generator.java ---------------------------------------------------------------------- diff --git a/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/Generator.java b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/Generator.java new file mode 100644 index 0000000..8806d05 --- /dev/null +++ b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/Generator.java @@ -0,0 +1,223 @@ +/** + * 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.karaf.boot.tools.maven.plugin; + +import java.io.OutputStream; +import java.lang.reflect.Field; + +import javax.persistence.PersistenceContext; +import javax.persistence.PersistenceUnit; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; + +import org.apache.karaf.boot.tools.maven.plugin.model.Bean; +import org.apache.karaf.boot.tools.maven.plugin.model.Context; +import org.apache.karaf.boot.tools.maven.plugin.model.OsgiServiceRef; +import org.apache.karaf.boot.tools.maven.plugin.model.ProducedBean; +import org.apache.karaf.boot.tools.maven.plugin.model.Property; +import org.apache.karaf.boot.tools.maven.plugin.model.PropertyWriter; +import org.apache.karaf.boot.tools.maven.plugin.model.TransactionalDef; + +public class Generator implements PropertyWriter { + private static final String NS_BLUEPRINT = "http://www.osgi.org/xmlns/blueprint/v1.0.0"; + private static final String NS_EXT = "http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"; + private static final String NS_JPA = "http://aries.apache.org/xmlns/jpa/v1.1.0"; + private static final String NS_JPA2 = "http://aries.apache.org/xmlns/jpan/v1.0.0"; + private static final String NS_TX = "http://aries.apache.org/xmlns/transactions/v1.2.0"; + + private Context context; + private XMLStreamWriter writer; + private boolean persistenceAnnotated; + + public Generator(Context context, OutputStream os, boolean persistenceAnnotated) throws XMLStreamException { + this.context = context; + this.persistenceAnnotated = persistenceAnnotated; + + XMLOutputFactory factory = XMLOutputFactory.newInstance(); + writer = factory.createXMLStreamWriter(os); + } + + public void generate() { + try { + writer.writeStartDocument(); + writer.writeCharacters("\n"); + writeBlueprint(); + + if (persistenceAnnotated) { + if (isJpaUsed()) { + writer.writeEmptyElement(NS_JPA2, "enable"); + writer.writeCharacters("\n"); + } + writer.writeEmptyElement(NS_TX, "enable-annotations"); + writer.writeCharacters("\n"); + //if (isJtaUsed()) { +// writer.writeEmptyElement(NS_TX, "enable-annotations"); + //} + } + for (Bean bean : context.getBeans()) { + writeBeanStart(bean); + bean.writeProperties(this); + writer.writeEndElement(); + writer.writeCharacters("\n"); + } + + writeServiceRefs(); + new OsgiServiceProviderWriter(writer).write(context.getBeans()); + + writer.writeEndElement(); + writer.writeCharacters("\n"); + writer.writeEndDocument(); + writer.writeCharacters("\n"); + writer.close(); + } catch (XMLStreamException e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + private boolean isJpaUsed() { + boolean jpaUsed = false; + for (Bean bean : context.getBeans()) { + if (bean.persistenceFields.length > 0) { + jpaUsed = true; + } + } + return jpaUsed; + } + + private boolean isJtaUsed() { + boolean jtaUsed = false; + for (Bean bean : context.getBeans()) { + if (bean.transactionDef != null) { + jtaUsed = true; + } + + } + return jtaUsed; + } + + private void writeBlueprint() throws XMLStreamException { + writer.writeStartElement("blueprint"); + writer.writeDefaultNamespace(NS_BLUEPRINT); + writer.writeNamespace("ext", NS_EXT); + if (persistenceAnnotated) { + writer.writeNamespace("jpa", NS_JPA2); + } else { + writer.writeNamespace("jpa", NS_JPA); + } + writer.writeNamespace("tx", NS_TX); + } + + public void writeBeanStart(Bean bean) throws XMLStreamException { + writer.writeStartElement("bean"); + writer.writeAttribute("id", bean.id); + writer.writeAttribute("class", bean.clazz.getName()); + writer.writeAttribute("ext", NS_EXT, "field-injection", "true"); + if (bean instanceof ProducedBean) { + writeFactory((ProducedBean)bean); + } + if (bean.initMethod != null) { + writer.writeAttribute("init-method", bean.initMethod); + } + if (bean.destroyMethod != null) { + writer.writeAttribute("destroy-method", bean.destroyMethod); + } + writer.writeCharacters("\n"); + + if (!persistenceAnnotated) { + writeTransactional(bean.transactionDef); + writePersistenceFields(bean.persistenceFields); + } + } + + private void writeFactory(ProducedBean bean) throws XMLStreamException { + writer.writeAttribute("factory-ref", bean.factoryBeanId); + writer.writeAttribute("factory-method", bean.factoryMethod); + } + + private void writeTransactional(TransactionalDef transactionDef) + throws XMLStreamException { + if (transactionDef != null) { + writer.writeCharacters(" "); + writer.writeEmptyElement("tx", "transaction", NS_TX); + writer.writeAttribute("method", transactionDef.getMethod()); + writer.writeAttribute("value", transactionDef.getType()); + writer.writeCharacters("\n"); + } + } + + + private void writePersistenceFields(Field[] fields) throws XMLStreamException { + for (Field field : fields) { + writePersistenceField(field); + } + } + + private void writePersistenceField(Field field) throws XMLStreamException { + PersistenceContext persistenceContext = field.getAnnotation(PersistenceContext.class); + if (persistenceContext != null) { + writer.writeCharacters(" "); + writer.writeEmptyElement("jpa", "context", NS_JPA); + writer.writeAttribute("unitname", persistenceContext.unitName()); + writer.writeAttribute("property", field.getName()); + writer.writeCharacters("\n"); + } + PersistenceUnit persistenceUnit = field.getAnnotation(PersistenceUnit.class); + if (persistenceUnit != null) { + writer.writeCharacters(" "); + writer.writeEmptyElement("jpa", "unit", NS_JPA); + writer.writeAttribute("unitname", persistenceUnit.unitName()); + writer.writeAttribute("property", field.getName()); + writer.writeCharacters("\n"); + } + } + + private void writeServiceRefs() throws XMLStreamException { + for (OsgiServiceRef serviceBean : context.getServiceRefs()) { + writeServiceRef(serviceBean); + } + } + + private void writeServiceRef(OsgiServiceRef serviceBean) throws XMLStreamException { + writer.writeEmptyElement("reference"); + writer.writeAttribute("id", serviceBean.id); + writer.writeAttribute("interface", serviceBean.clazz.getName()); + if (serviceBean.filter != null && !"".equals(serviceBean.filter)) { + writer.writeAttribute("filter", serviceBean.filter); + } + writer.writeCharacters("\n"); + } + + public void writeProperty(Property property) { + try { + writer.writeCharacters(" "); + writer.writeEmptyElement("property"); + writer.writeAttribute("name", property.name); + if (property.ref != null) { + writer.writeAttribute("ref", property.ref); + } else if (property.value != null) { + writer.writeAttribute("value", property.value); + } + writer.writeCharacters("\n"); + } catch (XMLStreamException e) { + throw new RuntimeException(e.getMessage(), e); + } + } + +} http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/OsgiServiceProviderWriter.java ---------------------------------------------------------------------- diff --git a/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/OsgiServiceProviderWriter.java b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/OsgiServiceProviderWriter.java new file mode 100644 index 0000000..95d57df --- /dev/null +++ b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/OsgiServiceProviderWriter.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.karaf.boot.tools.maven.plugin; + +import java.util.Collection; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; + +import org.apache.karaf.boot.tools.maven.plugin.model.Bean; +import org.ops4j.pax.cdi.api.OsgiServiceProvider; +import org.ops4j.pax.cdi.api.Properties; +import org.ops4j.pax.cdi.api.Property; + +public class OsgiServiceProviderWriter { + private XMLStreamWriter writer; + + public OsgiServiceProviderWriter(XMLStreamWriter writer) { + this.writer = writer; + } + + public void write(Collection<Bean> beans) throws XMLStreamException { + for (Bean bean : beans) { + write(bean); + } + } + + public void write(Bean bean) throws XMLStreamException { + OsgiServiceProvider serviceProvider = bean.clazz.getAnnotation(OsgiServiceProvider.class); + if (serviceProvider == null) { + return; + } + if (serviceProvider.classes().length == 0) { + throw new IllegalArgumentException("Need to provide the interface class in the @OsgiServiceProvider(classes={...}) annotation on " + bean.clazz); + } + Properties properties = bean.clazz.getAnnotation(Properties.class); + if (properties == null) { + writer.writeEmptyElement("service"); + } else { + writer.writeStartElement("service"); + } + writer.writeAttribute("ref", bean.id); + Class<?> serviceIf = serviceProvider.classes()[0]; + writer.writeAttribute("interface", serviceIf.getName()); + writer.writeCharacters("\n"); + if (properties != null) { + writeProperties(properties); + writer.writeEndElement(); + writer.writeCharacters("\n"); + } + } + + private void writeProperties(Properties properties) throws XMLStreamException { + writer.writeCharacters(" "); + writer.writeStartElement("service-properties"); + writer.writeCharacters("\n"); + for (Property property : properties.value()) { + writer.writeCharacters(" "); + writer.writeEmptyElement("entry"); + writer.writeAttribute("key", property.name()); + writer.writeAttribute("value", property.value()); + writer.writeCharacters("\n"); + } + writer.writeCharacters(" "); + writer.writeEndElement(); + writer.writeCharacters("\n"); + } + + +} http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/Bean.java ---------------------------------------------------------------------- diff --git a/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/Bean.java b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/Bean.java new file mode 100644 index 0000000..995649c --- /dev/null +++ b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/Bean.java @@ -0,0 +1,152 @@ +/** + * 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.karaf.boot.tools.maven.plugin.model; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.persistence.PersistenceContext; +import javax.persistence.PersistenceUnit; + +public class Bean extends BeanRef { + public String initMethod; + public String destroyMethod; + public SortedSet<Property> properties; + public Field[] persistenceFields; + public TransactionalDef transactionDef; + + public Bean(Class<?> clazz) { + super(clazz); + + for (Method method : clazz.getDeclaredMethods()) { + PostConstruct postConstruct = getEffectiveAnnotation(method, PostConstruct.class); + if (postConstruct != null) { + this.initMethod = method.getName(); + } + PreDestroy preDestroy = getEffectiveAnnotation(method, PreDestroy.class); + if (preDestroy != null) { + this.destroyMethod = method.getName(); + } + } + this.persistenceFields = getPersistenceFields(); + this.transactionDef = new JavaxTransactionFactory().create(clazz); + if (this.transactionDef == null) { + this.transactionDef = new SpringTransactionFactory().create(clazz); + } + properties = new TreeSet<Property>(); + } + + private Field[] getPersistenceFields() { + List<Field> persistenceFields = new ArrayList<Field>(); + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + PersistenceContext persistenceContext = field.getAnnotation(PersistenceContext.class); + PersistenceUnit persistenceUnit = field.getAnnotation(PersistenceUnit.class); + if (persistenceContext !=null || persistenceUnit != null) { + persistenceFields.add(field); + } + } + return persistenceFields.toArray(new Field[]{}); + } + + public void resolve(Matcher matcher) { + Class<?> curClass = this.clazz; + while (curClass != null && curClass != Object.class) { + resolveProperties(matcher, curClass); + curClass = curClass.getSuperclass(); + } + } + + private void resolveProperties(Matcher matcher, Class<?> curClass) { + for (Field field : curClass.getDeclaredFields()) { + Property prop = Property.create(matcher, field); + if (prop != null) { + properties.add(prop); + } + } + } + + private static <T extends Annotation> T getEffectiveAnnotation(Method method, Class<T> annotationClass) { + final Class<?> methodClass = method.getDeclaringClass(); + final String name = method.getName(); + final Class<?>[] params = method.getParameterTypes(); + + // 1. Current class + final T rootAnnotation = method.getAnnotation(annotationClass); + if (rootAnnotation != null) { + return rootAnnotation; + } + + // 2. Superclass + final Class<?> superclass = methodClass.getSuperclass(); + if (superclass != null) { + final T annotation = getMethodAnnotation(superclass, name, params, annotationClass); + if (annotation != null) + return annotation; + } + + // 3. Interfaces + for (final Class<?> intfs : methodClass.getInterfaces()) { + final T annotation = getMethodAnnotation(intfs, name, params, annotationClass); + if (annotation != null) + return annotation; + } + + return null; + } + + private static <T extends Annotation> T getMethodAnnotation(Class<?> searchClass, String name, Class<?>[] params, + Class<T> annotationClass) { + try { + Method method = searchClass.getMethod(name, params); + return getEffectiveAnnotation(method, annotationClass); + } catch (NoSuchMethodException e) { + return null; + } + } + + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((clazz == null) ? 0 : clazz.getName().hashCode()); + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } + + @Override + public String toString() { + return clazz.getName(); + } + + public void writeProperties(PropertyWriter writer) { + for (Property property : properties) { + writer.writeProperty(property); + } + } + +} http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/BeanRef.java ---------------------------------------------------------------------- diff --git a/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/BeanRef.java b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/BeanRef.java new file mode 100644 index 0000000..ba67f33 --- /dev/null +++ b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/BeanRef.java @@ -0,0 +1,69 @@ +package org.apache.karaf.boot.tools.maven.plugin.model; + +import java.lang.reflect.Field; + +import javax.inject.Named; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +public class BeanRef implements Comparable<BeanRef> { + public String id; + public Class<?> clazz; + + /** + * + * @param clazz interface or implementation class + */ + public BeanRef(Class<?> clazz) { + this.clazz = clazz; + this.id = getBeanName(clazz); + } + + public BeanRef(Class<?> type, String id) { + this.clazz = type; + this.id = id; + } + + public BeanRef(Field field) { + this(field.getType(), getDestinationId(field)); + } + + private static String getDestinationId(Field field) { + Named named = field.getAnnotation(Named.class); + if (named != null) { + return named.value(); + } + Qualifier qualifier = field.getAnnotation(Qualifier.class); + if (qualifier != null) { + return qualifier.value(); + } + return null; + } + + public static String getBeanName(Class<?> clazz) { + Component component = clazz.getAnnotation(Component.class); + Named named = clazz.getAnnotation(Named.class); + if (component != null && !"".equals(component.value())) { + return component.value(); + } else if (named != null && !"".equals(named.value())) { + return named.value(); + } else { + String name = clazz.getSimpleName(); + return getBeanNameFromSimpleName(name); + } + } + + private static String getBeanNameFromSimpleName(String name) { + return name.substring(0, 1).toLowerCase() + name.substring(1, name.length()); + } + + public boolean matches(BeanRef template) { + boolean assignable = template.clazz.isAssignableFrom(this.clazz); + return assignable && ((template.id == null) || id.equals(template.id)); + } + + public int compareTo(BeanRef other) { + return this.id.compareTo(other.id); + } +} http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/Context.java ---------------------------------------------------------------------- diff --git a/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/Context.java b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/Context.java new file mode 100644 index 0000000..442bc6e --- /dev/null +++ b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/Context.java @@ -0,0 +1,121 @@ +/** + * 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.karaf.boot.tools.maven.plugin.model; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Collection; +import java.util.SortedSet; +import java.util.TreeSet; + +import javax.enterprise.inject.Produces; + +import org.ops4j.pax.cdi.api.OsgiService; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.service.blueprint.container.BlueprintContainer; +import org.osgi.service.blueprint.container.Converter; + +public class Context implements Matcher { + + SortedSet<Bean> beans; + SortedSet<OsgiServiceRef> serviceRefs; + + public Context(Class<?>... beanClasses) { + this(Arrays.asList(beanClasses)); + } + + public Context(Collection<Class<?>> beanClasses) { + this.beans = new TreeSet<Bean>(); + this.serviceRefs = new TreeSet<OsgiServiceRef>(); + addBeans(beanClasses); + } + + private void addBeans(Collection<Class<?>> beanClasses) { + for (Class<?> clazz : beanClasses) { + Bean bean = new Bean(clazz); + beans.add(bean); + addServiceRefs(clazz); + addProducedBeans(clazz, bean.id); + } + } + + private void addProducedBeans(Class<?> clazz, String factoryBeanId) { + for (Method method : clazz.getMethods()) { + Produces produces = method.getAnnotation(Produces.class); + if (produces != null) { + Class<?> producedClass = method.getReturnType(); + ProducedBean producedBean = new ProducedBean(producedClass, factoryBeanId, method.getName()); + beans.add(producedBean); + } + } + } + + private void addServiceRefs(Class<?> clazz) { + for (Field field : clazz.getDeclaredFields()) { + OsgiService osgiService = field.getAnnotation(OsgiService.class); + if (osgiService != null) { + serviceRefs.add(new OsgiServiceRef(field)); + } + } + } + + public void resolve() { + for (Bean bean : beans) { + bean.resolve(this); + } + } + + public BeanRef getMatching(BeanRef template) { + for (Bean bean : beans) { + if (bean.matches(template)) { + return bean; + } + } + for (BeanRef bean : serviceRefs) { + if (bean.matches(template)) { + return bean; + } + } + if (template.clazz == BundleContext.class) { + return new BeanRef(BundleContext.class, "blueprintBundleContext"); + } + if (template.clazz == Bundle.class) { + return new BeanRef(Bundle.class, "blueprintBundle"); + } + if (template.clazz == BlueprintContainer.class) { + return new BeanRef(BlueprintContainer.class, "blueprintContainer"); + } + if (template.clazz == Converter.class) { + return new BeanRef(Converter.class, "blueprintConverter"); + } + + return null; + } + + public SortedSet<Bean> getBeans() { + return beans; + } + + public SortedSet<OsgiServiceRef> getServiceRefs() { + return serviceRefs; + } + +} http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/JavaxTransactionFactory.java ---------------------------------------------------------------------- diff --git a/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/JavaxTransactionFactory.java b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/JavaxTransactionFactory.java new file mode 100644 index 0000000..c00a54c --- /dev/null +++ b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/JavaxTransactionFactory.java @@ -0,0 +1,40 @@ +/** + * 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.karaf.boot.tools.maven.plugin.model; + +import java.util.HashMap; + +import javax.transaction.Transactional; +import javax.transaction.Transactional.TxType; + +public class JavaxTransactionFactory { + private static HashMap<TxType, String> txTypeNames; + + static { + txTypeNames = new HashMap<TxType, String>(); + txTypeNames.put(TxType.REQUIRED, TransactionalDef.TYPE_REQUIRED); + txTypeNames.put(TxType.REQUIRES_NEW, TransactionalDef.TYPE_REQUIRES_NEW); + } + + TransactionalDef create(Class<?> clazz) { + Transactional transactional = clazz.getAnnotation(Transactional.class); + return transactional != null ? + new TransactionalDef("*", txTypeNames.get(transactional.value())) : null; + } +} http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/Matcher.java ---------------------------------------------------------------------- diff --git a/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/Matcher.java b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/Matcher.java new file mode 100644 index 0000000..f703ed1 --- /dev/null +++ b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/Matcher.java @@ -0,0 +1,23 @@ +/** + * 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.karaf.boot.tools.maven.plugin.model; + +public interface Matcher { + BeanRef getMatching(BeanRef template); +} http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/a0248b78/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/OsgiServiceRef.java ---------------------------------------------------------------------- diff --git a/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/OsgiServiceRef.java b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/OsgiServiceRef.java new file mode 100644 index 0000000..5069663 --- /dev/null +++ b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/tools/maven/plugin/model/OsgiServiceRef.java @@ -0,0 +1,41 @@ +/** + * 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.karaf.boot.tools.maven.plugin.model; + +import java.lang.reflect.Field; + +import org.ops4j.pax.cdi.api.OsgiService; + +/** + * Synthetic bean that refers to an OSGi service + */ +public class OsgiServiceRef extends BeanRef { + + public String filter; + + public OsgiServiceRef(Field field) { + super(field); + if (id == null) { + id = getBeanName(clazz); + } + OsgiService osgiService = field.getAnnotation(OsgiService.class); + filter = osgiService.filter(); + } + +}
