diff options
author | Ralf Mollik | 2017-08-28 15:34:39 +0000 |
---|---|---|
committer | Ralf Mollik | 2017-08-28 15:34:39 +0000 |
commit | aa4009a4efbfa7055d83e67710d4b99efd6794c7 (patch) | |
tree | 172ebe60bf0e0bacc9753388f94d0209ef8fd577 | |
download | org.eclipse.osbp.osgi.hybrid.api-aa4009a4efbfa7055d83e67710d4b99efd6794c7.tar.gz org.eclipse.osbp.osgi.hybrid.api-aa4009a4efbfa7055d83e67710d4b99efd6794c7.tar.xz org.eclipse.osbp.osgi.hybrid.api-aa4009a4efbfa7055d83e67710d4b99efd6794c7.zip |
parallel ip - initial checkin
Signed-off-by: Ralf Mollik <ramollik@compex-commerce.com>
39 files changed, 4239 insertions, 0 deletions
diff --git a/.project b/.project new file mode 100644 index 0000000..d2e8493 --- /dev/null +++ b/.project @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>org.eclipse.osbp.osgi.hybrid.api.aggregator</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.m2e.core.maven2Builder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.sonarlint.eclipse.core.sonarlintBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.m2e.core.maven2Nature</nature> + </natures> +</projectDescription> diff --git a/about.html b/about.html new file mode 100644 index 0000000..64c0598 --- /dev/null +++ b/about.html @@ -0,0 +1,28 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/> +<title>About</title> +</head> +<body lang="EN-US"> +<h2>About This Content</h2> + +<p>June 1, 2016</p> +<h3>License</h3> + +<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise +indicated below, the Content is provided to you under the terms and conditions of the +Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available +at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>. +For purposes of the EPL, "Program" will mean the Content.</p> + +<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is +being redistributed by another party ("Redistributor") and different terms and conditions may +apply to your use of any object code in the Content. Check the Redistributor's license that was +provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise +indicated below, the terms and conditions of the EPL still apply to any source code in the Content +and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p> + +</body> +</html>
\ No newline at end of file diff --git a/jenkins.build.config.xml b/jenkins.build.config.xml new file mode 100644 index 0000000..1ff5579 --- /dev/null +++ b/jenkins.build.config.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--#======================================================================= --> +<!--# Copyright (c) 2016 - Loetz GmbH&Co.KG --> +<!--# All rights reserved. This program and the accompanying materials --> +<!--# are made available under the terms of the Eclipse Public License v1.0 --> +<!--# which accompanies this distribution, and is available at --> +<!--# http://www.eclipse.org/legal/epl-v10.html --> +<!--# --> +<!--# Contributors: --> +<!--# Christophe Loetz (Loetz GmbH&Co.KG) - initial API and implementation --> +<!--#======================================================================= --> +<!--# Module specific parameters for the Jenkins Job --> +<!--#======================================================================= --> + +<jenkins> + <!-- DO NOT EDIT BELOW THIS LINE --> + <jenkins.build.dependencies> + <jenkins.build.dependency>org.eclipse.osbp.bpm.api</jenkins.build.dependency> + <jenkins.build.dependency>org.eclipse.osbp.dsl</jenkins.build.dependency> + <jenkins.build.dependency>org.eclipse.osbp.ecview.extension</jenkins.build.dependency> + <jenkins.build.dependency>org.eclipse.osbp.ecview.extension.api</jenkins.build.dependency> + <jenkins.build.dependency>org.eclipse.osbp.eventbroker</jenkins.build.dependency> + <jenkins.build.dependency>org.eclipse.osbp.persistence</jenkins.build.dependency> + <jenkins.build.dependency>org.eclipse.osbp.preferences</jenkins.build.dependency> + <jenkins.build.dependency>org.eclipse.osbp.runtime</jenkins.build.dependency> + <jenkins.build.dependency>org.eclipse.osbp.runtime.web</jenkins.build.dependency> + <jenkins.build.dependency>org.eclipse.osbp.ui.api</jenkins.build.dependency> + <jenkins.build.dependency>org.eclipse.osbp.utils</jenkins.build.dependency> + <jenkins.build.dependency>org.eclipse.osbp.webserver.messagequeue</jenkins.build.dependency> + </jenkins.build.dependencies> +</jenkins> diff --git a/notice.html b/notice.html new file mode 100644 index 0000000..c3d34c3 --- /dev/null +++ b/notice.html @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> +<title>Eclipse Foundation Software User Agreement</title> +</head> + +<body lang="EN-US"> +<h2>Eclipse Foundation Software User Agreement</h2> +<p>April 9, 2014</p> + +<h3>Usage Of Content</h3> + +<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS + (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND + CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE + OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR + NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND + CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p> + +<h3>Applicable Licenses</h3> + +<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 + ("EPL"). A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>. + For purposes of the EPL, "Program" will mean the Content.</p> + +<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code + repository ("Repository") in software modules ("Modules") and made available as downloadable archives ("Downloads").</p> + +<ul> + <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</li> + <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</li> + <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins + and/or Fragments associated with that Feature.</li> + <li>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</li> +</ul> + +<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and +Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module +including, but not limited to the following locations:</p> + +<ul> + <li>The top-level (root) directory</li> + <li>Plug-in and Fragment directories</li> + <li>Inside Plug-ins and Fragments packaged as JARs</li> + <li>Sub-directories of the directory named "src" of certain Plug-ins</li> + <li>Feature directories</li> +</ul> + +<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license ("Feature Update License") during the +installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or +inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature. +Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in +that directory.</p> + +<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE +OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p> + +<ul> + <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li> + <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li> + <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li> + <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li> + <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li> +</ul> + +<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please +contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p> + + +<h3>Use of Provisioning Technology</h3> + +<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse + Update Manager ("Provisioning Technology") for the purpose of allowing users to install software, documentation, information and/or + other materials (collectively "Installable Software"). This capability is provided with the intent of allowing such users to + install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a + href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a> + ("Specification").</p> + +<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the + applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology + in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the + Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p> + +<ol> + <li>A series of actions may occur ("Provisioning Process") in which a user may execute the Provisioning Technology + on a machine ("Target Machine") with the intent of installing, extending or updating the functionality of an Eclipse-based + product.</li> + <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be + accessed and copied to the Target Machine.</li> + <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable + Software ("Installable Software Agreement") and such Installable Software Agreement shall be accessed from the Target + Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern + the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such + indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li> +</ol> + +<h3>Cryptography</h3> + +<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to + another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import, + possession, or use, and re-export of encryption software, to see if this is permitted.</p> + +<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p> +</body> +</html> diff --git a/org.eclipse.osbp.osgi.hybrid.api.feature/.project b/org.eclipse.osbp.osgi.hybrid.api.feature/.project new file mode 100644 index 0000000..707e2f4 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api.feature/.project @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>org.eclipse.osbp.osgi.hybrid.api.feature</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.xtext.ui.shared.xtextBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.FeatureBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.m2e.core.maven2Builder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.sonarlint.eclipse.core.sonarlintBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.xtext.ui.shared.xtextNature</nature> + <nature>org.eclipse.m2e.core.maven2Nature</nature> + <nature>org.eclipse.pde.FeatureNature</nature> + </natures> +</projectDescription> diff --git a/org.eclipse.osbp.osgi.hybrid.api.feature/LICENSE.txt b/org.eclipse.osbp.osgi.hybrid.api.feature/LICENSE.txt new file mode 100644 index 0000000..ff42ad4 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api.feature/LICENSE.txt @@ -0,0 +1,161 @@ +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.
\ No newline at end of file diff --git a/org.eclipse.osbp.osgi.hybrid.api.feature/build.properties b/org.eclipse.osbp.osgi.hybrid.api.feature/build.properties new file mode 100644 index 0000000..b8920ff --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api.feature/build.properties @@ -0,0 +1,2 @@ +bin.includes = license.html, epl-v10.html, feature.xml,\ + feature.properties diff --git a/org.eclipse.osbp.osgi.hybrid.api.feature/epl-v10.html b/org.eclipse.osbp.osgi.hybrid.api.feature/epl-v10.html new file mode 100644 index 0000000..b398acc --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api.feature/epl-v10.html @@ -0,0 +1,259 @@ +<!--?xml version="1.0" encoding="ISO-8859-1" ?--> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"><head> +<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> +<title>Eclipse Public License - Version 1.0</title> +<style type="text/css"> + body { + size: 8.5in 11.0in; + margin: 0.25in 0.5in 0.25in 0.5in; + tab-interval: 0.5in; + } + p { + margin-left: auto; + margin-top: 0.5em; + margin-bottom: 0.5em; + } + p.list { + margin-left: 0.5in; + margin-top: 0.05em; + margin-bottom: 0.05em; + } + </style> + +</head> + +<body lang="EN-US"> + +<h2>Eclipse Public License - v 1.0</h2> + +<p>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.</p> + +<p><b>1. DEFINITIONS</b></p> + +<p>"Contribution" means:</p> + +<p class="list">a) in the case of the initial Contributor, the initial +code and documentation distributed under this Agreement, and</p> +<p class="list">b) in the case of each subsequent Contributor:</p> +<p class="list">i) changes to the Program, and</p> +<p class="list">ii) additions to the Program;</p> +<p class="list">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.</p> + +<p>"Contributor" means any person or entity that distributes +the Program.</p> + +<p>"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.</p> + +<p>"Program" means the Contributions distributed in accordance +with this Agreement.</p> + +<p>"Recipient" means anyone who receives the Program under +this Agreement, including all Contributors.</p> + +<p><b>2. GRANT OF RIGHTS</b></p> + +<p class="list">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.</p> + +<p class="list">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.</p> + +<p class="list">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.</p> + +<p class="list">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.</p> + +<p><b>3. REQUIREMENTS</b></p> + +<p>A Contributor may choose to distribute the Program in object code +form under its own license agreement, provided that:</p> + +<p class="list">a) it complies with the terms and conditions of this +Agreement; and</p> + +<p class="list">b) its license agreement:</p> + +<p class="list">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;</p> + +<p class="list">ii) effectively excludes on behalf of all Contributors +all liability for damages, including direct, indirect, special, +incidental and consequential damages, such as lost profits;</p> + +<p class="list">iii) states that any provisions which differ from this +Agreement are offered by that Contributor alone and not by any other +party; and</p> + +<p class="list">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.</p> + +<p>When the Program is made available in source code form:</p> + +<p class="list">a) it must be made available under this Agreement; and</p> + +<p class="list">b) a copy of this Agreement must be included with each +copy of the Program.</p> + +<p>Contributors may not remove or alter any copyright notices contained +within the Program.</p> + +<p>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.</p> + +<p><b>4. COMMERCIAL DISTRIBUTION</b></p> + +<p>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.</p> + +<p>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.</p> + +<p><b>5. NO WARRANTY</b></p> + +<p>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.</p> + +<p><b>6. DISCLAIMER OF LIABILITY</b></p> + +<p>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.</p> + +<p><b>7. GENERAL</b></p> + +<p>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.</p> + +<p>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.</p> + +<p>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.</p> + +<p>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.</p> + +<p>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.</p> + + + +</body></html>
\ No newline at end of file diff --git a/org.eclipse.osbp.osgi.hybrid.api.feature/feature.properties b/org.eclipse.osbp.osgi.hybrid.api.feature/feature.properties new file mode 100644 index 0000000..fa581ac --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api.feature/feature.properties @@ -0,0 +1,169 @@ +############################################################################### +# Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany). +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +# +# Contributors: +# Cristiano Gavião - initial API and implementation +############################################################################### +# feature.properties +# contains externalized strings for feature.xml +# "%foo" in feature.xml corresponds to the key "foo" in this file +# java.io.Properties file (ISO 8859-1 with "\" escapes) +# This file should be translated. + +# "featureName" property - name of the feature +featureName =OSBP Hybrid API
+ +# "providerName" property - name of the company that provides the feature +providerName=Eclipse OSBP + +# "description" property - description of the feature +description=This feature provides the bundles for OSBP OSGi hybrid API. + +# "updateSiteName" property - label for the update site +updateSiteName= + +# "copyright" property - text of the "Feature Update Copyright" +copyright=\ +Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) \n\ +All rights reserved. This program and the accompanying materials\n\ +are made available under the terms of the Eclipse Public License v1.0\n\ +which accompanies this distribution, and is available at\n\ +http://www.eclipse.org/legal/epl-v10.html\n\ +\n\ +################ end of copyright property #################################### + +# "licenseURL" property - URL of the "Feature License" +# do not translate value - just change to point to a locale-specific HTML page +licenseURL=license.html + +# "license" property - text of the "Feature Update License" +# should be plain text version of license agreement pointed to be "licenseURL" +license=\ +Eclipse Foundation Software User Agreement\n\ +February 1, 2011\n\ +\n\ +Usage Of Content\n\ +\n\ +THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\ +OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\ +USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\ +AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\ +NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\ +AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\ +AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\ +OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\ +TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\ +OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\ +BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\ +\n\ +Applicable Licenses\n\ +\n\ +Unless otherwise indicated, all Content made available by the\n\ +Eclipse Foundation is provided to you under the terms and conditions of\n\ +the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\ +provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\ +For purposes of the EPL, "Program" will mean the Content.\n\ +\n\ +Content includes, but is not limited to, source code, object code,\n\ +documentation and other files maintained in the Eclipse Foundation source code\n\ +repository ("Repository") in software modules ("Modules") and made available\n\ +as downloadable archives ("Downloads").\n\ +\n\ + - Content may be structured and packaged into modules to facilitate delivering,\n\ + extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\ + plug-in fragments ("Fragments"), and features ("Features").\n\ + - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\ + in a directory named "plugins".\n\ + - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\ + Each Feature may be packaged as a sub-directory in a directory named "features".\n\ + Within a Feature, files named "feature.xml" may contain a list of the names and version\n\ + numbers of the Plug-ins and/or Fragments associated with that Feature.\n\ + - Features may also include other Features ("Included Features"). Within a Feature, files\n\ + named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\ +\n\ +The terms and conditions governing Plug-ins and Fragments should be\n\ +contained in files named "about.html" ("Abouts"). The terms and\n\ +conditions governing Features and Included Features should be contained\n\ +in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\ +Licenses may be located in any directory of a Download or Module\n\ +including, but not limited to the following locations:\n\ +\n\ + - The top-level (root) directory\n\ + - Plug-in and Fragment directories\n\ + - Inside Plug-ins and Fragments packaged as JARs\n\ + - Sub-directories of the directory named "src" of certain Plug-ins\n\ + - Feature directories\n\ +\n\ +Note: if a Feature made available by the Eclipse Foundation is installed using the\n\ +Provisioning Technology (as defined below), you must agree to a license ("Feature \n\ +Update License") during the installation process. If the Feature contains\n\ +Included Features, the Feature Update License should either provide you\n\ +with the terms and conditions governing the Included Features or inform\n\ +you where you can locate them. Feature Update Licenses may be found in\n\ +the "license" property of files named "feature.properties" found within a Feature.\n\ +Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\ +terms and conditions (or references to such terms and conditions) that\n\ +govern your use of the associated Content in that directory.\n\ +\n\ +THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\ +TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\ +SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\ +\n\ + - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\ + - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\ + - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\ + - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\ + - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\ + - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\ +\n\ +IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\ +TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\ +is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\ +govern that particular Content.\n\ +\n\ +\n\Use of Provisioning Technology\n\ +\n\ +The Eclipse Foundation makes available provisioning software, examples of which include,\n\ +but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\ +the purpose of allowing users to install software, documentation, information and/or\n\ +other materials (collectively "Installable Software"). This capability is provided with\n\ +the intent of allowing such users to install, extend and update Eclipse-based products.\n\ +Information about packaging Installable Software is available at\n\ +http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\ +\n\ +You may use Provisioning Technology to allow other parties to install Installable Software.\n\ +You shall be responsible for enabling the applicable license agreements relating to the\n\ +Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\ +in accordance with the Specification. By using Provisioning Technology in such a manner and\n\ +making it available in accordance with the Specification, you further acknowledge your\n\ +agreement to, and the acquisition of all necessary rights to permit the following:\n\ +\n\ + 1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\ + the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\ + extending or updating the functionality of an Eclipse-based product.\n\ + 2. During the Provisioning Process, the Provisioning Technology may cause third party\n\ + Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\ + 3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\ + govern the use of the Installable Software ("Installable Software Agreement") and such\n\ + Installable Software Agreement shall be accessed from the Target Machine in accordance\n\ + with the Specification. Such Installable Software Agreement must inform the user of the\n\ + terms and conditions that govern the Installable Software and must solicit acceptance by\n\ + the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\ + indication of agreement by the user, the provisioning Technology will complete installation\n\ + of the Installable Software.\n\ +\n\ +Cryptography\n\ +\n\ +Content may contain encryption software. The country in which you are\n\ +currently may have restrictions on the import, possession, and use,\n\ +and/or re-export to another country, of encryption software. BEFORE\n\ +using any encryption software, please check the country's laws,\n\ +regulations and policies concerning the import, possession, or use, and\n\ +re-export of encryption software, to see if this is permitted.\n\ +\n\ +Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n +########### end of license property ########################################## diff --git a/org.eclipse.osbp.osgi.hybrid.api.feature/feature.xml b/org.eclipse.osbp.osgi.hybrid.api.feature/feature.xml new file mode 100644 index 0000000..99c2a80 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api.feature/feature.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--#======================================================================= --> +<!--# Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) --> +<!--# All rights reserved. This program and the accompanying materials --> +<!--# are made available under the terms of the Eclipse Public License v1.0 --> +<!--# which accompanies this distribution, and is available at --> +<!--# http://www.eclipse.org/legal/epl-v10.html --> +<!--# --> +<!--# Contributors: --> +<!--# Christophe Loetz (Loetz GmbH&Co.KG) - initial API and implementation --> +<!--#======================================================================= --> + +<feature + id="org.eclipse.osbp.osgi.hybrid.api.feature" + label="%featureName" + version="0.9.0.qualifier" + provider-name="%providerName"> + + <description> + %description + </description> + + <copyright> + %copyright + </copyright> + + <license url="%licenseURL"> + %license + </license> + + <plugin + id="org.eclipse.osbp.osgi.hybrid.api" + download-size="0" + install-size="0" + version="0.0.0" + unpack="false"/> + +</feature> diff --git a/org.eclipse.osbp.osgi.hybrid.api.feature/license.html b/org.eclipse.osbp.osgi.hybrid.api.feature/license.html new file mode 100644 index 0000000..6e579a5 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api.feature/license.html @@ -0,0 +1,164 @@ +<!--?xml version="1.0" encoding="ISO-8859-1" ?--> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"><head> +<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> +<title>Eclipse Foundation Software User Agreement</title> +</head> + +<body lang="EN-US"> +<h2>Eclipse Foundation Software User Agreement</h2> +<p>February 1, 2011</p> + +<h3>Usage Of Content</h3> + +<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS + (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND + CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE + OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR + NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND + CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p> + +<h3>Applicable Licenses</h3> + +<p>Unless otherwise indicated, all Content made available by the Eclipse + Foundation is provided to you under the terms and conditions of the +Eclipse Public License Version 1.0 + ("EPL"). A copy of the EPL is provided with this Content and is also + available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>. + For purposes of the EPL, "Program" will mean the Content.</p> + +<p>Content includes, but is not limited to, source code, object code, +documentation and other files maintained in the Eclipse Foundation +source code + repository ("Repository") in software modules ("Modules") and made +available as downloadable archives ("Downloads").</p> + +<ul> + <li>Content may be structured and packaged into modules to +facilitate delivering, extending, and upgrading the Content. Typical +modules may include plug-ins ("Plug-ins"), plug-in fragments +("Fragments"), and features ("Features").</li> + <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</li> + <li>A Feature is a bundle of one or more Plug-ins and/or +Fragments and associated material. Each Feature may be packaged as a +sub-directory in a directory named "features". Within a Feature, files +named "feature.xml" may contain a list of the names and version numbers +of the Plug-ins + and/or Fragments associated with that Feature.</li> + <li>Features may also include other Features ("Included +Features"). Within a Feature, files named "feature.xml" may contain a +list of the names and version numbers of Included Features.</li> +</ul> + +<p>The terms and conditions governing Plug-ins and Fragments should be +contained in files named "about.html" ("Abouts"). The terms and +conditions governing Features and +Included Features should be contained in files named "license.html" +("Feature Licenses"). Abouts and Feature Licenses may be located in any + directory of a Download or Module +including, but not limited to the following locations:</p> + +<ul> + <li>The top-level (root) directory</li> + <li>Plug-in and Fragment directories</li> + <li>Inside Plug-ins and Fragments packaged as JARs</li> + <li>Sub-directories of the directory named "src" of certain Plug-ins</li> + <li>Feature directories</li> +</ul> + +<p>Note: if a Feature made available by the Eclipse Foundation is +installed using the Provisioning Technology (as defined below), you must + agree to a license ("Feature Update License") during the +installation process. If the Feature contains Included Features, the +Feature Update License should either provide you with the terms and +conditions governing the Included Features or +inform you where you can locate them. Feature Update Licenses may be +found in the "license" property of files named "feature.properties" +found within a Feature. +Such Abouts, Feature Licenses, and Feature Update Licenses contain the +terms and conditions (or references to such terms and conditions) that +govern your use of the associated Content in +that directory.</p> + +<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER +TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. + SOME OF THESE +OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p> + +<ul> + <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li> + <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li> + <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li> + <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li> + <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li> + <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li> +</ul> + +<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND +CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, +or Feature Update License is provided, please +contact the Eclipse Foundation to determine what terms and conditions +govern that particular Content.</p> + + +<h3>Use of Provisioning Technology</h3> + +<p>The Eclipse Foundation makes available provisioning software, +examples of which include, but are not limited to, p2 and the Eclipse + Update Manager ("Provisioning Technology") for the purpose of +allowing users to install software, documentation, information and/or + other materials (collectively "Installable Software"). This +capability is provided with the intent of allowing such users to + install, extend and update Eclipse-based products. Information about +packaging Installable Software is available at <a href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a> + ("Specification").</p> + +<p>You may use Provisioning Technology to allow other parties to install + Installable Software. You shall be responsible for enabling the + applicable license agreements relating to the Installable Software to + be presented to, and accepted by, the users of the Provisioning +Technology + in accordance with the Specification. By using Provisioning +Technology in such a manner and making it available in accordance with +the + Specification, you further acknowledge your agreement to, and the +acquisition of all necessary rights to permit the following:</p> + +<ol> + <li>A series of actions may occur ("Provisioning Process") in +which a user may execute the Provisioning Technology + on a machine ("Target Machine") with the intent of installing, +extending or updating the functionality of an Eclipse-based + product.</li> + <li>During the Provisioning Process, the Provisioning Technology +may cause third party Installable Software or a portion thereof to be + accessed and copied to the Target Machine.</li> + <li>Pursuant to the Specification, you will provide to the user +the terms and conditions that govern the use of the Installable + Software ("Installable Software Agreement") and such Installable +Software Agreement shall be accessed from the Target + Machine in accordance with the Specification. Such Installable +Software Agreement must inform the user of the terms and conditions that + govern + the Installable Software and must solicit acceptance by the end +user in the manner prescribed in such Installable Software Agreement. +Upon such + indication of agreement by the user, the provisioning Technology +will complete installation of the Installable Software.</li> +</ol> + +<h3>Cryptography</h3> + +<p>Content may contain encryption software. The country in which you are + currently may have restrictions on the import, possession, and use, +and/or re-export to + another country, of encryption software. BEFORE using any encryption +software, please check the country's laws, regulations and policies +concerning the import, + possession, or use, and re-export of encryption software, to see if +this is permitted.</p> + +<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p> + + +</body></html>
\ No newline at end of file diff --git a/org.eclipse.osbp.osgi.hybrid.api.feature/pom.xml b/org.eclipse.osbp.osgi.hybrid.api.feature/pom.xml new file mode 100644 index 0000000..7464a40 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api.feature/pom.xml @@ -0,0 +1,82 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--#======================================================================= --> +<!--# Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany). --> +<!--# All rights reserved. This program and the accompanying materials --> +<!--# are made available under the terms of the Eclipse Public License v1.0 --> +<!--# which accompanies this distribution, and is available at --> +<!--# http://www.eclipse.org/legal/epl-v10.html --> +<!--# --> +<!--# Contributors: --> +<!--# Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation API and implementation --> +<!--#======================================================================= --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.eclipse.osbp.osgi.hybrid.api</groupId> + <artifactId>org.eclipse.osbp.osgi.hybrid.api.aggregator</artifactId> + <version>0.9.0-SNAPSHOT</version> + </parent> + + <artifactId>org.eclipse.osbp.osgi.hybrid.api.feature</artifactId> + <packaging>eclipse-feature</packaging> + + <build> + <plugins> + <plugin> + <groupId>org.eclipse.tycho.extras</groupId> + <artifactId>tycho-source-feature-plugin</artifactId> + <version>${tychoExtrasVersion}</version> + <executions> + <execution> + <id>source-feature</id> + <phase>package</phase> + <goals> + <goal>source-feature</goal> + </goals> + </execution> + </executions> + <configuration> + <labelSuffix> (source)</labelSuffix> + </configuration> + </plugin> + <plugin> + <!-- workaround while bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=398250 + is not fixed --> + <groupId>org.eclipse.tycho</groupId> + <artifactId>tycho-p2-plugin</artifactId> + <version>${tycho-version}</version> + <executions> + <execution> + <id>attached-p2-metadata</id> + <phase>package</phase> + <goals> + <goal>p2-metadata</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <artifactId>maven-javadoc-plugin</artifactId> + <executions> + <execution> + <id>javadoc-jar</id> + <phase>package</phase> + <goals> + <goal>jar</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>org.eclipse.osbp.osgi.hybrid.api</groupId> + <artifactId>org.eclipse.osbp.osgi.hybrid.api</artifactId> + <version>0.9.0-SNAPSHOT</version> + </dependency> + </dependencies> + +</project> diff --git a/org.eclipse.osbp.osgi.hybrid.api.feature/src/main/javadoc/README.txt b/org.eclipse.osbp.osgi.hybrid.api.feature/src/main/javadoc/README.txt new file mode 100644 index 0000000..831da7e --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api.feature/src/main/javadoc/README.txt @@ -0,0 +1 @@ +Resource folder for javadoc resources.
\ No newline at end of file diff --git a/org.eclipse.osbp.osgi.hybrid.api.feature/src/overview.html b/org.eclipse.osbp.osgi.hybrid.api.feature/src/overview.html new file mode 100644 index 0000000..414051f --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api.feature/src/overview.html @@ -0,0 +1,11 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>OSBP Tools Graphical Entity</title> +</head> +<body> +<p>The <strong>OSBP Hyprid API </strong>contains the functionality needed to integrate OSBP into the existing Compex Commerce client.</p> + +<p> </p> +</body> +</html> diff --git a/org.eclipse.osbp.osgi.hybrid.api/.project b/org.eclipse.osbp.osgi.hybrid.api/.project new file mode 100644 index 0000000..76494ac --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/.project @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>org.eclipse.osbp.osgi.hybrid.api</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.xtext.ui.shared.xtextBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.ManifestBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.SchemaBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.ds.core.builder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.babel.editor.rbeBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.m2e.core.maven2Builder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.sonarlint.eclipse.core.sonarlintBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.xtext.ui.shared.xtextNature</nature> + <nature>org.eclipse.m2e.core.maven2Nature</nature> + <nature>org.eclipse.pde.PluginNature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + <nature>org.eclipse.babel.editor.rbeNature</nature> + </natures> +</projectDescription> diff --git a/org.eclipse.osbp.osgi.hybrid.api/LICENSE.txt b/org.eclipse.osbp.osgi.hybrid.api/LICENSE.txt new file mode 100644 index 0000000..ff42ad4 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/LICENSE.txt @@ -0,0 +1,161 @@ +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.
\ No newline at end of file diff --git a/org.eclipse.osbp.osgi.hybrid.api/META-INF/MANIFEST.MF b/org.eclipse.osbp.osgi.hybrid.api/META-INF/MANIFEST.MF new file mode 100644 index 0000000..89f7a1f --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/META-INF/MANIFEST.MF @@ -0,0 +1,53 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: org.eclipse.osbp.osgi.hybrid.api +Bundle-SymbolicName: org.eclipse.osbp.osgi.hybrid.api;singleton:=true +Bundle-Version: 0.9.0.qualifier +Bundle-Vendor: Eclipse OSBP +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Require-Bundle: org.slf4j.api;bundle-version="1.7.2", + org.apache.log4j, + com.vaadin.server;bundle-version="[7.5.7,7.7.0)", + javax.inject;bundle-version="1.0.0", + javax.annotation;bundle-version="[1.1.0,1.2.0)", + org.apache.commons.codec, + org.eclipse.e4.core.contexts, + org.eclipse.e4.core.services, + org.eclipse.e4.ui.model.workbench, + org.eclipse.e4.ui.workbench, + org.eclipse.osgi.services, + org.eclipse.core.databinding, + org.eclipse.core.runtime, + org.eclipse.core.databinding.beans, + org.apache.httpcomponents.httpcore, + org.apache.httpcomponents.httpclient, + org.jsoup, + org.eclipse.osbp.runtime.web.vaadin.databinding;bundle-version="[0.9.0,0.10.0)", + refresher.osgi;bundle-version="[1.2.3.7,1.2.4)", + org.eclipse.osbp.preferences;bundle-version="[0.9.0,0.10.0)", + org.eclipse.osbp.webserver.messagequeue;bundle-version="[0.9.0,0.10.0)", + org.eclipse.osbp.persistence;bundle-version="[0.9.0,0.10.0)", + org.eclipse.osbp.utils;bundle-version="[0.9.0,0.10.0)", + org.eclipse.osbp.runtime.common;bundle-version="[0.9.0,0.10.0)", + org.eclipse.osbp.dsl.dto.lib;bundle-version="[0.9.0,0.10.0)", + org.eclipse.osbp.gitinfo;bundle-version="[0.9.0,0.10.0)" +Export-Package: org.eclipse.osbp.osgi.hybrid.api;version="0.9.0" +Import-Package: javax.jms;version="1.1.0", + org.apache.commons.lang3, + org.eclipse.e4.core.di.annotations, + org.eclipse.e4.core.di.extensions, + org.eclipse.emf.common.notify, + org.eclipse.emf.ecore, + org.eclipse.emf.ecore.util, + org.eclipse.osbp.bpm.api;version="0.9.0", + org.eclipse.osbp.dsl.common.datatypes;version="0.9.0", + org.eclipse.osbp.ecview.extension.api;version="0.9.0", + org.eclipse.osbp.ecview.extension.model;version="0.9.0", + org.eclipse.osbp.ecview.extension.strategy;version="0.9.0", + org.eclipse.osbp.eventbroker;version="0.9.0", + org.eclipse.osbp.ui.api.themes;version="0.9.0", + org.eclipse.osbp.ui.api.useraccess, + org.osgi.service.event;version="1.3.0" +Bundle-Activator: org.eclipse.osbp.osgi.hybrid.api.Activator +Service-Component: OSGI-INF/*.xml +Bundle-ActivationPolicy: lazy diff --git a/org.eclipse.osbp.osgi.hybrid.api/OSGI-INF/Authentication.xml b/org.eclipse.osbp.osgi.hybrid.api/OSGI-INF/Authentication.xml new file mode 100644 index 0000000..dcc2b68 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/OSGI-INF/Authentication.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.osbp.osgi.hybrid.api.UserAccessService"> + <implementation class="org.eclipse.osbp.osgi.hybrid.api.HybridServiceBinder"/> + <reference bind="bindUserAccessService" cardinality="1..1" interface="org.eclipse.osbp.ui.api.useraccess.IUserAccessService" name="IUserAccessService" policy="dynamic" unbind="unbindUserAccessService"/> +</scr:component> diff --git a/org.eclipse.osbp.osgi.hybrid.api/OSGI-INF/PresentationRenderer.xml b/org.eclipse.osbp.osgi.hybrid.api/OSGI-INF/PresentationRenderer.xml new file mode 100644 index 0000000..4f569e4 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/OSGI-INF/PresentationRenderer.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.osbp.osgi.hybrid.api.PresentationRenderer"> + <implementation class="org.eclipse.osbp.osgi.hybrid.api.HybridServiceBinder"/> + <reference bind="bindPresentationRenderer" cardinality="1..1" interface="org.eclipse.osbp.osgi.hybrid.api.IPresentationRenderer" policy="static" name="IPresentationRenderer" unbind="unbindPresentationRenderer"/> +</scr:component> diff --git a/org.eclipse.osbp.osgi.hybrid.api/about.html b/org.eclipse.osbp.osgi.hybrid.api/about.html new file mode 100644 index 0000000..64c0598 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/about.html @@ -0,0 +1,28 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/> +<title>About</title> +</head> +<body lang="EN-US"> +<h2>About This Content</h2> + +<p>June 1, 2016</p> +<h3>License</h3> + +<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise +indicated below, the Content is provided to you under the terms and conditions of the +Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available +at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>. +For purposes of the EPL, "Program" will mean the Content.</p> + +<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is +being redistributed by another party ("Redistributor") and different terms and conditions may +apply to your use of any object code in the Content. Check the Redistributor's license that was +provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise +indicated below, the terms and conditions of the EPL still apply to any source code in the Content +and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p> + +</body> +</html>
\ No newline at end of file diff --git a/org.eclipse.osbp.osgi.hybrid.api/about.ini b/org.eclipse.osbp.osgi.hybrid.api/about.ini new file mode 100644 index 0000000..7df671f --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/about.ini @@ -0,0 +1,17 @@ +# about.ini +# contains information about a feature +# java.io.Properties file (ISO 8859-1 with "\" escapes) +# "%key" are externalized strings defined in about.properties +# This file does not need to be translated. + +# Property "aboutText" contains blurb for "About" dialog (translated) +aboutText=%featureText + +# Property "featureImage" contains path to feature image (32x32) +featureImage= + +# Property "appName" contains name of the application (translated) +appName=%featureName + +# Property "welcomePage" contains path to welcome page (special XML-based format) +welcomePage= diff --git a/org.eclipse.osbp.osgi.hybrid.api/about.mappings b/org.eclipse.osbp.osgi.hybrid.api/about.mappings new file mode 100644 index 0000000..4511a0a --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/about.mappings @@ -0,0 +1,6 @@ +# about.mappings +# contains fill-ins for about.properties +# java.io.Properties file (ISO 8859-1 with "\" escapes) +# This file does not need to be translated. + +0=qualifier diff --git a/org.eclipse.osbp.osgi.hybrid.api/about.properties b/org.eclipse.osbp.osgi.hybrid.api/about.properties new file mode 100644 index 0000000..4df5c48 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/about.properties @@ -0,0 +1,26 @@ +# +# Copyright (c) 2012, 2016 - Loetz GmbH&Co.KG (Heidelberg) +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +# +# Contributors: +# Christophe Loetz (Loetz GmbH&Co.KG) - initial API and implementation +# + +# NLS_MESSAGEFORMAT_VAR + +featureName=org.eclipse.osbp.osgi.hybrid.api + +################ blurb property #################################### +featureText=\ +Copyright (c) 2012-2016 - Loetz GmbH&Co.KG \n\ +All rights reserved. This program and the accompanying materials\n\ +are made available under the terms of the Eclipse Public License v1.0\n\ +which accompanies this distribution, and is available at\n\ +http://www.eclipse.org/legal/epl-v10.html\n\ +\n\ +Contributors:\n\ + Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation\n +################ end of blurb property #################################### diff --git a/org.eclipse.osbp.osgi.hybrid.api/build.properties b/org.eclipse.osbp.osgi.hybrid.api/build.properties new file mode 100644 index 0000000..72a2fec --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/build.properties @@ -0,0 +1,14 @@ +source.. = src/ +output.. = target/classes/ +bin.includes = about.properties, about.mappings, about.ini, about.html, META-INF/,\ + .,\ + OSGI-INF/,\ + .classpath,\ + .project,\ + .settings/,\ + license.html,\ + LICENSE.txt,\ + epl-v10.html +src.includes = about.properties, about.mappings, about.ini, about.html, license.html,\ + LICENSE.txt,\ + epl-v10.html diff --git a/org.eclipse.osbp.osgi.hybrid.api/epl-v10.html b/org.eclipse.osbp.osgi.hybrid.api/epl-v10.html new file mode 100644 index 0000000..b398acc --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/epl-v10.html @@ -0,0 +1,259 @@ +<!--?xml version="1.0" encoding="ISO-8859-1" ?--> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"><head> +<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> +<title>Eclipse Public License - Version 1.0</title> +<style type="text/css"> + body { + size: 8.5in 11.0in; + margin: 0.25in 0.5in 0.25in 0.5in; + tab-interval: 0.5in; + } + p { + margin-left: auto; + margin-top: 0.5em; + margin-bottom: 0.5em; + } + p.list { + margin-left: 0.5in; + margin-top: 0.05em; + margin-bottom: 0.05em; + } + </style> + +</head> + +<body lang="EN-US"> + +<h2>Eclipse Public License - v 1.0</h2> + +<p>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.</p> + +<p><b>1. DEFINITIONS</b></p> + +<p>"Contribution" means:</p> + +<p class="list">a) in the case of the initial Contributor, the initial +code and documentation distributed under this Agreement, and</p> +<p class="list">b) in the case of each subsequent Contributor:</p> +<p class="list">i) changes to the Program, and</p> +<p class="list">ii) additions to the Program;</p> +<p class="list">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.</p> + +<p>"Contributor" means any person or entity that distributes +the Program.</p> + +<p>"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.</p> + +<p>"Program" means the Contributions distributed in accordance +with this Agreement.</p> + +<p>"Recipient" means anyone who receives the Program under +this Agreement, including all Contributors.</p> + +<p><b>2. GRANT OF RIGHTS</b></p> + +<p class="list">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.</p> + +<p class="list">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.</p> + +<p class="list">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.</p> + +<p class="list">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.</p> + +<p><b>3. REQUIREMENTS</b></p> + +<p>A Contributor may choose to distribute the Program in object code +form under its own license agreement, provided that:</p> + +<p class="list">a) it complies with the terms and conditions of this +Agreement; and</p> + +<p class="list">b) its license agreement:</p> + +<p class="list">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;</p> + +<p class="list">ii) effectively excludes on behalf of all Contributors +all liability for damages, including direct, indirect, special, +incidental and consequential damages, such as lost profits;</p> + +<p class="list">iii) states that any provisions which differ from this +Agreement are offered by that Contributor alone and not by any other +party; and</p> + +<p class="list">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.</p> + +<p>When the Program is made available in source code form:</p> + +<p class="list">a) it must be made available under this Agreement; and</p> + +<p class="list">b) a copy of this Agreement must be included with each +copy of the Program.</p> + +<p>Contributors may not remove or alter any copyright notices contained +within the Program.</p> + +<p>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.</p> + +<p><b>4. COMMERCIAL DISTRIBUTION</b></p> + +<p>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.</p> + +<p>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.</p> + +<p><b>5. NO WARRANTY</b></p> + +<p>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.</p> + +<p><b>6. DISCLAIMER OF LIABILITY</b></p> + +<p>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.</p> + +<p><b>7. GENERAL</b></p> + +<p>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.</p> + +<p>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.</p> + +<p>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.</p> + +<p>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.</p> + +<p>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.</p> + + + +</body></html>
\ No newline at end of file diff --git a/org.eclipse.osbp.osgi.hybrid.api/license.html b/org.eclipse.osbp.osgi.hybrid.api/license.html new file mode 100644 index 0000000..6e579a5 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/license.html @@ -0,0 +1,164 @@ +<!--?xml version="1.0" encoding="ISO-8859-1" ?--> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"><head> +<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> +<title>Eclipse Foundation Software User Agreement</title> +</head> + +<body lang="EN-US"> +<h2>Eclipse Foundation Software User Agreement</h2> +<p>February 1, 2011</p> + +<h3>Usage Of Content</h3> + +<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS + (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND + CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE + OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR + NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND + CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p> + +<h3>Applicable Licenses</h3> + +<p>Unless otherwise indicated, all Content made available by the Eclipse + Foundation is provided to you under the terms and conditions of the +Eclipse Public License Version 1.0 + ("EPL"). A copy of the EPL is provided with this Content and is also + available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>. + For purposes of the EPL, "Program" will mean the Content.</p> + +<p>Content includes, but is not limited to, source code, object code, +documentation and other files maintained in the Eclipse Foundation +source code + repository ("Repository") in software modules ("Modules") and made +available as downloadable archives ("Downloads").</p> + +<ul> + <li>Content may be structured and packaged into modules to +facilitate delivering, extending, and upgrading the Content. Typical +modules may include plug-ins ("Plug-ins"), plug-in fragments +("Fragments"), and features ("Features").</li> + <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</li> + <li>A Feature is a bundle of one or more Plug-ins and/or +Fragments and associated material. Each Feature may be packaged as a +sub-directory in a directory named "features". Within a Feature, files +named "feature.xml" may contain a list of the names and version numbers +of the Plug-ins + and/or Fragments associated with that Feature.</li> + <li>Features may also include other Features ("Included +Features"). Within a Feature, files named "feature.xml" may contain a +list of the names and version numbers of Included Features.</li> +</ul> + +<p>The terms and conditions governing Plug-ins and Fragments should be +contained in files named "about.html" ("Abouts"). The terms and +conditions governing Features and +Included Features should be contained in files named "license.html" +("Feature Licenses"). Abouts and Feature Licenses may be located in any + directory of a Download or Module +including, but not limited to the following locations:</p> + +<ul> + <li>The top-level (root) directory</li> + <li>Plug-in and Fragment directories</li> + <li>Inside Plug-ins and Fragments packaged as JARs</li> + <li>Sub-directories of the directory named "src" of certain Plug-ins</li> + <li>Feature directories</li> +</ul> + +<p>Note: if a Feature made available by the Eclipse Foundation is +installed using the Provisioning Technology (as defined below), you must + agree to a license ("Feature Update License") during the +installation process. If the Feature contains Included Features, the +Feature Update License should either provide you with the terms and +conditions governing the Included Features or +inform you where you can locate them. Feature Update Licenses may be +found in the "license" property of files named "feature.properties" +found within a Feature. +Such Abouts, Feature Licenses, and Feature Update Licenses contain the +terms and conditions (or references to such terms and conditions) that +govern your use of the associated Content in +that directory.</p> + +<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER +TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. + SOME OF THESE +OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p> + +<ul> + <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li> + <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li> + <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li> + <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li> + <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li> + <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li> +</ul> + +<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND +CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, +or Feature Update License is provided, please +contact the Eclipse Foundation to determine what terms and conditions +govern that particular Content.</p> + + +<h3>Use of Provisioning Technology</h3> + +<p>The Eclipse Foundation makes available provisioning software, +examples of which include, but are not limited to, p2 and the Eclipse + Update Manager ("Provisioning Technology") for the purpose of +allowing users to install software, documentation, information and/or + other materials (collectively "Installable Software"). This +capability is provided with the intent of allowing such users to + install, extend and update Eclipse-based products. Information about +packaging Installable Software is available at <a href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a> + ("Specification").</p> + +<p>You may use Provisioning Technology to allow other parties to install + Installable Software. You shall be responsible for enabling the + applicable license agreements relating to the Installable Software to + be presented to, and accepted by, the users of the Provisioning +Technology + in accordance with the Specification. By using Provisioning +Technology in such a manner and making it available in accordance with +the + Specification, you further acknowledge your agreement to, and the +acquisition of all necessary rights to permit the following:</p> + +<ol> + <li>A series of actions may occur ("Provisioning Process") in +which a user may execute the Provisioning Technology + on a machine ("Target Machine") with the intent of installing, +extending or updating the functionality of an Eclipse-based + product.</li> + <li>During the Provisioning Process, the Provisioning Technology +may cause third party Installable Software or a portion thereof to be + accessed and copied to the Target Machine.</li> + <li>Pursuant to the Specification, you will provide to the user +the terms and conditions that govern the use of the Installable + Software ("Installable Software Agreement") and such Installable +Software Agreement shall be accessed from the Target + Machine in accordance with the Specification. Such Installable +Software Agreement must inform the user of the terms and conditions that + govern + the Installable Software and must solicit acceptance by the end +user in the manner prescribed in such Installable Software Agreement. +Upon such + indication of agreement by the user, the provisioning Technology +will complete installation of the Installable Software.</li> +</ol> + +<h3>Cryptography</h3> + +<p>Content may contain encryption software. The country in which you are + currently may have restrictions on the import, possession, and use, +and/or re-export to + another country, of encryption software. BEFORE using any encryption +software, please check the country's laws, regulations and policies +concerning the import, + possession, or use, and re-export of encryption software, to see if +this is permitted.</p> + +<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p> + + +</body></html>
\ No newline at end of file diff --git a/org.eclipse.osbp.osgi.hybrid.api/pom.xml b/org.eclipse.osbp.osgi.hybrid.api/pom.xml new file mode 100644 index 0000000..c9c648e --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/pom.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--#======================================================================= --> +<!--# Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) --> +<!--# All rights reserved. This program and the accompanying materials --> +<!--# are made available under the terms of the Eclipse Public License v1.0 --> +<!--# which accompanies this distribution, and is available at --> +<!--# http://www.eclipse.org/legal/epl-v10.html --> +<!--# --> +<!--# Contributors: --> +<!--# Christophe Loetz (Loetz GmbH&Co.KG) - initial API and implementation --> +<!--#======================================================================= --> + +<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.eclipse.osbp.osgi.hybrid.api</groupId> + <artifactId>org.eclipse.osbp.osgi.hybrid.api.aggregator</artifactId> + <version>0.9.0-SNAPSHOT</version> + <relativePath>..</relativePath> + </parent> + <artifactId>org.eclipse.osbp.osgi.hybrid.api</artifactId> + <packaging>eclipse-plugin</packaging> +</project> diff --git a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/AbstractHybridVaaclipseView.java b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/AbstractHybridVaaclipseView.java new file mode 100644 index 0000000..56e7016 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/AbstractHybridVaaclipseView.java @@ -0,0 +1,557 @@ +/** + * + * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation + */ +package org.eclipse.osbp.osgi.hybrid.api; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.inject.Inject; + +import org.apache.commons.lang3.StringUtils; +import org.eclipse.e4.core.contexts.IEclipseContext; +import org.eclipse.e4.core.di.extensions.EventUtils; +import org.eclipse.e4.core.services.events.IEventBroker; +import org.eclipse.e4.ui.model.application.MApplication; +import org.eclipse.e4.ui.model.application.ui.MUIElement; +import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective; +import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.e4.ui.workbench.modeling.EModelService; +import org.eclipse.e4.ui.workbench.modeling.EPartService; +import org.eclipse.e4.ui.workbench.modeling.IPartListener; +import org.eclipse.osbp.bpm.api.IBlipBPMConstants; +import org.eclipse.osbp.dsl.common.datatypes.IDto; +import org.eclipse.osbp.eventbroker.EventBrokerMsg; +import org.eclipse.osbp.persistence.IPersistenceService; +import org.eclipse.osbp.runtime.web.vaadin.databinding.VaadinObservables; +import org.eclipse.osbp.ui.api.themes.IThemeResourceService; +import org.eclipse.osbp.ui.api.themes.IThemeResourceService.ThemeResourceType; +import org.eclipse.osbp.ui.api.useraccess.AbstractAuthorization.Permission; +import org.eclipse.osbp.ui.api.useraccess.AbstractAuthorization.PermissionResult; +import org.eclipse.osbp.ui.api.useraccess.AbstractPosition; +import org.eclipse.osbp.ui.api.useraccess.IPermissionList; +import org.eclipse.osbp.utils.common.IEntityIdModificationListenerView; +import org.eclipse.osbp.webserver.messagequeue.ECXMqMessageAttribute; +import org.eclipse.osbp.webserver.messagequeue.ECXMqMessageEvent; +import org.osgi.service.event.Event; +import org.osgi.service.event.EventHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.vaadin.server.VaadinRequest; +import com.vaadin.ui.AbstractOrderedLayout; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; + +public abstract class AbstractHybridVaaclipseView implements IHybridVaadinVaaclipseListener, IPartListener, IEntityIdModificationListenerView { + + @Inject + IEventBroker eventBroker; + + @Inject + protected IPersistenceService persistenceService; + + // + // @Inject + // private AbstractBlipBPMFunctionProvider taskProvider; + // + // @Inject + // protected IBPMTaskClient taskClient; + // + // private String workloadDtoFqn; + // private IDto initialWorkloadDto; + // private Class<?> operativeDtoClass; + // private List<IDto> initialOperativeDtos; + + private static final Logger LOGGER = LoggerFactory.getLogger(AbstractHybridVaaclipseView.class); + + public static enum RenderMode { + SYNCHRONOUSLY, ASYNCHRONOUSLY + } + + private final IEclipseContext fEclipseContext; + private final MApplication fE4App; + private final VerticalLayout fParent; + private boolean fViewInitialized; + protected final EventHandler fModifiedEntityIdsListener; + private Map<String, Set<Object>> fListeningForEntityIdsModifications = new HashMap<>(); + + private RenderMode renderMode = RenderMode.ASYNCHRONOUSLY; + private boolean firstTime = true; + private int pollingInterval = 2000; + + private RecursiveFocusBlurListener fRecursiveFocusBlurListener; + + /** + * <b><i><u>Warning:</u> never use initializing class attributes in the definition!<br> + * Due to Java specific internals the overriden method createView() will be called before that initializing will be done!<br> + * Instead put any initializing inside the overriden method createView()!</i></b> + * + * @param parent + * @param context + * @param app + */ + public AbstractHybridVaaclipseView(final VerticalLayout parent, final IEclipseContext context, final MApplication app) { + fE4App = app; + fEclipseContext = context; + fViewInitialized = false; + fParent = parent; + fModifiedEntityIdsListener = new EventHandler() { + + @Override + public void handleEvent(Event event) { + Object data = event.getProperty(EventUtils.DATA); + // --- only if data contains an event broker message --- + if (data instanceof EventBrokerMsg) { + EventBrokerMsg eventBrokerMsg = (EventBrokerMsg) data; + // eventBrokerMsg.getInt() == 1 means INSERT and no id check is required + // otherwise it is an UPDATE and a id check is mandatory + if (eventBrokerMsg.getInt() == 1) { + refreshViewDueToModifiedEntityId(eventBrokerMsg.getName(), eventBrokerMsg.getId()); + } else { + checkOnModifiedEntityId(eventBrokerMsg, true); + } + } + } + }; + fRecursiveFocusBlurListener = RecursiveFocusBlurListener.attachFor(fParent); + } + + @PostConstruct + public void initView() { + preInit(); + VaadinObservables.getRealm(UI.getCurrent()); + UI.getCurrent().setPollInterval(pollingInterval); + createView(fParent); + postInit(null); + renderData(true); + } + + public void promptSecurityMessage(String message, AbstractOrderedLayout layout) { + layout.removeAllComponents(); + FormLayout area = new FormLayout(); + layout.addComponent(area); + + Label msg = new Label(message); + msg.setPrimaryStyleName("osbp"); + msg.setStyleName("osbpSecurityPrompt"); + if (getThemeResourceService() != null) { + msg.setIcon(getThemeResourceService().getThemeResource("locksview.gif", ThemeResourceType.IMAGE)); + } + else { + LOGGER.error("themeResourceService not set!"); + } + area.addComponent(msg); + } + + private String beautifyEntityName(String entityName) { + return StringUtils.strip(entityName.replace('.', '/'), "/").toLowerCase(); + } + + private Object beautifyEntityId(Object id) { + if (id instanceof String) { + id = ((String) id).trim(); + try { + Double.parseDouble((String) id); + // --- if it's a double --- + id = StringUtils.removeEnd((String) id, "0"); + id = StringUtils.removeEnd((String) id, "."); + } catch (Exception e) { + // NOTHING CAN BE DONE + } + } + return id; + } + + @Override + public void resetListeningForEntityIdsModifications() { + fListeningForEntityIdsModifications = null; + } + + public boolean broadcastEntityIdModified(String packageName, String entityName, String id) { + if (eventBroker != null) { + return eventBroker.send(EventBrokerMsg.REFRESH_VIEW + EventBrokerMsg.getEntityIdModifiedCategory(packageName, entityName), new EventBrokerMsg(id, entityName)); + } else { + return false; + } + } + + @Override + public boolean checkOnModifiedEntityId(EventBrokerMsg message, boolean doRefresh) { + return checkOnModifiedEntityId(message.getName(), message.getId(), doRefresh); + } + + @Override + public boolean checkOnModifiedEntityId(String entityName, Object id, boolean doRefresh) { + // --- check if the entity sent is known --- + entityName = beautifyEntityName(entityName); + id = beautifyEntityId(id); + Set<Object> ids = fListeningForEntityIdsModifications.get(entityName); + if (ids instanceof Set) { + // --- if the id for that entity is known --- + if (ids.contains(id)) { + // --- force refresh of the report --- + if (doRefresh) { + refreshViewDueToModifiedEntityId(entityName, id); + } + return true; + } + } + return false; + } + + @Override + public void refreshViewDueToModifiedEntityId(String entity, Object id) { + addEntityIdToModifyListener(entity, id); + } + + @Override + public void addEntityIdToModifyListener(String entityName, Object id) { + // --- build the entity map if necessary --- + if (fListeningForEntityIdsModifications == null) { + fListeningForEntityIdsModifications = new HashMap<>(); + } + entityName = beautifyEntityName(entityName); + Set<Object> ids = fListeningForEntityIdsModifications.get(entityName); + // --- build the ids set if necessary --- + if (ids == null) { + ids = new HashSet<>(); + fListeningForEntityIdsModifications.put(entityName, ids); + } + // --- put the primary key --- + ids.add(beautifyEntityId(id)); + } + + @Override + public void removeEntityIdFromModifyListener(String entityName, Object id) { + // --- build the entity map if necessary --- + if (fListeningForEntityIdsModifications != null) { + Set<Object> ids = fListeningForEntityIdsModifications.get(beautifyEntityName(entityName)); + // --- build the ids set if necessary --- + if (ids != null) { + // --- put the primary key --- + ids.remove(id); + } + } + } + + public final MApplication getApplication() { + return fE4App; + } + + public final VerticalLayout getParent() { + return fParent; + } + + public final IEclipseContext getContext() { + return fEclipseContext; + } + + public final MPart getPart() { + return (MPart) fEclipseContext.get(MPart.class); + } + + public final String getProcessWorkloadDtoFqn() { + return (String) getTransientDataVariable(IBlipBPMConstants.VARIABLE_PROCESS_WORKLOAD_DTO_FQN); + } + + public final IDto getProcessInitialWorkloadDto() { + return (IDto) getTransientDataVariable(IBlipBPMConstants.VARIABLE_PROCESS_WORKLOAD_DTO); + } + + public final Class<?> getTaskOperativeDtoClass() { + return (Class<?>) getTransientDataVariable(IBlipBPMConstants.VARIABLE_TASK_OPERATIVE_DTO_CLASS); + } + + public final String getTaskOperativeDtoFqn() { + return (String) getTransientDataVariable(IBlipBPMConstants.VARIABLE_TASK_OPERATIVE_DTO_FQN); + } + + public final List<IDto> getTaskInitialOperativeDtos() { + return (List<IDto>) getTransientDataVariable(IBlipBPMConstants.VARIABLE_TASK_OPERATIVE_DTOS); + } + + public final Object getTransientDataVariable(String variable) { + MPerspective perspective = getPerspective(); + if (perspective != null) { + Map<String, Object> data = perspective.getTransientData(); + if (data != null) { + return data.get(variable); + } + } + return null; + } + + public final MPerspective getPerspective() { + MUIElement step = getPart(); + while ((step != null) && !(step instanceof MPerspective)) { + step = step.getParent(); + } + return (MPerspective) step; + } + + public final IPersistenceService getPersistenceService() { + return (IPersistenceService) fEclipseContext.get(IPersistenceService.class); + } + + protected final boolean isViewInitialized() { + return fViewInitialized; + } + + /** + * <b><i><u>Warning:</u> put any initializing inside the your overriden method createView()!<br> + * Due to Java specific internals the overriden method createView() will be called before that initializing will be done!</i></b> + * + * @param parent + */ + abstract protected void createView(final VerticalLayout parent); + + abstract protected void createComponents(); + + // renderData is used for components that are not fully embedded in vaadin's connector structure + // and must be repainted when parent window resizes + // but can also be used to make component rendering asynchronously from view creation + public void renderData() { + LOGGER.debug("renderData not firsttime"); + renderData(false); + } + + public void renderData(boolean firstTime) { + // the first time we only want to be triggered by the initial createView process, not by changeLocale + if (this.firstTime) { + if (!firstTime) { + LOGGER.debug("renderData ignored because not firsttime"); + return; + } else { + this.firstTime = false; + } + } + if (UI.getCurrent() == null) { + LOGGER.debug("renderData has no current ui"); + return; + } + if (renderMode == RenderMode.SYNCHRONOUSLY) { + LOGGER.debug("render synchronously"); + UI.getCurrent().accessSynchronously(new Runnable() { + @Override + public void run() { + createComponents(); + } + }); + } else { + LOGGER.debug("render asynchronously"); + UI.getCurrent().access(new Runnable() { + @Override + public void run() { + createComponents(); + } + }); + } + } + + private IThemeResourceService getThemeResourceService() { + if (fEclipseContext.containsKey(IThemeResourceService.class)) { + return fEclipseContext.get(IThemeResourceService.class); + } + return null; + } + + private EPartService getPartService() { + if (fEclipseContext.containsKey(EPartService.class)) { + return fEclipseContext.get(EPartService.class); + } + return null; + } + + protected void preInit() { + getPartService().addPartListener(this); + HybridVaadinVaaclipseConnector.instance(fEclipseContext).addListener(this); + HybridVaadinVaaclipseConnector.instance(fEclipseContext).setE4Application(fE4App); + } + + @PreDestroy + public void preDestroy() { + fRecursiveFocusBlurListener.detach(); + HybridVaadinVaaclipseConnector.instance(fEclipseContext).removeListener(this); + fListeningForEntityIdsModifications = null; + } + + /** + * You <b>must call this at the end of the overridden init()</b> + */ + protected final void postInit(VaadinRequest request) { + HybridVaadinVaaclipseConnector.instance(fEclipseContext).postInit(request); + fViewInitialized = true; + if (isAuthenticated()) { + setAuthenticated(isAuthenticated()); + } + } + + /** + * React in the application according to <code>authenticated</code> + * + * @param authenticated + * true if the user is authenticated now! + */ + public void setAuthenticated(boolean authenticated) { + // now send the list of perspectives + HybridVaadinVaaclipseConnector.instance(fEclipseContext).updatePerspectiveList(); + } + + protected final boolean isAuthenticated() { + return HybridVaadinVaaclipseConnector.instance(fEclipseContext).isAuthenticated(); + } + + protected final IDto getAuthenticatedUser() { + return HybridVaadinVaaclipseConnector.instance(fEclipseContext).getUser(); + } + + protected final AbstractPosition getAuthenticatedPosition() { + return HybridVaadinVaaclipseConnector.instance(fEclipseContext).getPosition(); + } + + protected final Collection<String> getAuthenticatedRoles() { + return HybridVaadinVaaclipseConnector.instance(fEclipseContext).getRoles(); + } + + protected final IPermissionList getAuthenticatedPermissions() { + return HybridVaadinVaaclipseConnector.instance(fEclipseContext).getPermissions(); + } + + protected final PermissionResult isAuthenticatedPermitted(Permission permission) { + return HybridVaadinVaaclipseConnector.instance(fEclipseContext).isPermitted(permission); + } + + protected final Set<String> getAllUsers() { + return HybridVaadinVaaclipseConnector.instance(fEclipseContext).getAllUsers(); + } + + /** + * Try to authenticate with the credentials given!<br> + * {@link #setAuthenticated(boolean)} will explicit be called! + * + * @param portalId + * @param userName + * @param password + * @return true if the user was authenticated successful + */ + // protected boolean tryToAuthenticate(String portalId, String userName, String password) { + // return HybridVaadinVaaclipseConnector.instance().tryToAuthenticate(portalId, userName, password); + // } + + /** + * Logout from the Shiro API and send a LOGOUT event via ActiveMQ + */ + protected void logout() { + HybridVaadinVaaclipseConnector.instance(fEclipseContext).logout(); + } + + /** + * handle any message received via ActiveMQ + * + * @param event + * @param body + */ + @Override + public final boolean onMessage(ECXMqMessageEvent event, Map<ECXMqMessageAttribute, Object> body) { + boolean retcode = false; + switch (event) { + // !!! handled by connector ... + case TRY_AUTHENTICATE: + case DISPOSE: + case LOGOUT: + break; + // ... handled by connector !!! + case FOCUS_PERSPECTIVE: + retcode = HybridVaadinVaaclipseConnector.instance(fEclipseContext).onFocusPerspective(body.get(ECXMqMessageAttribute.PERSPECTIVE_ID).toString()); + break; + case REQUEST_ICON: + retcode = HybridVaadinVaaclipseConnector.instance(fEclipseContext).requestIcon(body.get(ECXMqMessageAttribute.PERSPECTIVE_ID).toString()); + break; + default: + break; + } + return retcode; + } + + @Override + public void partActivated(MPart part) { + HybridVaadinVaaclipseConnector.instance(fEclipseContext).activatePartStateRefresher(part); + MPerspective active = HybridVaadinVaaclipseConnector.findCurrentPerspectiveFor(part == null ? getPartService().getActivePart() : part); + if (active instanceof MPerspective) { + HybridVaadinVaaclipseConnector.instance(fEclipseContext).updatePerspectiveList(); + HybridVaadinVaaclipseConnector.instance(fEclipseContext).updateFocusPerspective(active.getElementId()); + } else if ((part != null || getPartService().getActivePart() != null)) { + LOGGER.debug("part activated:" + (part == null ? "<null>" : part.getElementId() + " '" + part.getLabel() + "'")); + List<MPerspective> existing = HybridVaadinVaaclipseConnector.instance(fEclipseContext).findPerspectives(); + for (MPerspective perspective : existing) { + LOGGER.debug(" perspective:" + perspective.getElementId() + " '" + perspective.getLabel() + "'"); + } + LOGGER.debug(" COULD NOT find the corresponding perspective :-("); + } + } + + @Override + public void partBroughtToTop(MPart part) { + HybridVaadinVaaclipseConnector.instance(fEclipseContext).activatePartStateRefresher(part); + } + + @Override + public void partDeactivated(MPart part) { + } // NOP + + @Override + public void partHidden(MPart part) { + } // NOP + + @Override + public void partVisible(MPart part) { + } // NOP + + /** + * Try to authenticate with the credentials given!<br> + * {@link #setAuthenticated(boolean)} will explicit be called! + * + * @param portalId + * @param userName + * @param password + * @return true if the user was authenticated successful + */ + protected boolean tryToAuthenticate(String portalId, String userName, String password) { + return HybridVaadinVaaclipseConnector.instance(fEclipseContext).tryToAuthenticate(portalId, userName, password); + } + + public RenderMode getRenderMode() { + return renderMode; + } + + public void setRenderMode(RenderMode renderMode) { + this.renderMode = renderMode; + } + + public int getPollingInterval() { + return pollingInterval; + } + + public void setPollingInterval(int pollingInterval) { + this.pollingInterval = pollingInterval; + } + +} diff --git a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/AbstractHybridVaadinUI.java b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/AbstractHybridVaadinUI.java new file mode 100644 index 0000000..9660df2 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/AbstractHybridVaadinUI.java @@ -0,0 +1,102 @@ +/** + * + * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation + */ +package org.eclipse.osbp.osgi.hybrid.api; + +import java.util.Map; + +import com.vaadin.server.Extension; +import com.vaadin.server.VaadinRequest; +import com.vaadin.ui.UI; + +import org.eclipse.osbp.ui.api.useraccess.IUserAccessService; +import org.eclipse.osbp.webserver.messagequeue.ECXMqMessageAttribute; +import org.eclipse.osbp.webserver.messagequeue.ECXMqMessageEvent; + +/** + * This abstract class has to be used as extended class in all Vaadin applications, which need + * Shiro Authentication support and/or CCNG Hybrid support! + * Just extend this class and add any extending functionality! + */ +@SuppressWarnings("serial") +abstract public class AbstractHybridVaadinUI extends UI implements IHybridVaadinVaaclipseListener { + + private HybridVaadinVaaclipseConnector fConnector; + + protected IUserAccessService getUserAccessService() { + return fConnector.getUserAccessService(); + } + + /** + * You <b>must call this at the start of the overriden init()</b> + */ + protected final Extension preInit(VaadinRequest request) { + fConnector = HybridVaadinVaaclipseConnector.instance(null); + fConnector.addListener(this); + return null; // fConnector.createRefresher(); + } + + /** + * You <b>must call this at the end of the overriden init()</b> + */ + protected final void postInit(VaadinRequest request) { + fConnector.postInit(request); + } + + /** + * React in the application according to <code>authenticated</code> + * @param authenticated true if the user is authenticated now! + */ + public void setAuthenticated(boolean authenticated) { + fConnector.setAuthenticated(authenticated); + } + + /** + * Try to authenticate with the credentials given!<br> + * {@link #setAuthenticated(boolean)} will explicit be called! + * @param portalId + * @param userName + * @param password + * @return true if the user was authenticated successful + */ + protected boolean tryToAuthenticate(String portalId, String userName, String password) { + return fConnector.tryToAuthenticate(portalId, userName, password); + } + + /** + * Logout from the Shiro API and send a LOGOUT event via ActiveMQ + */ + protected void logout() { + fConnector.logout(); + } + + /** + * handle any message received via ActiveMQ + * @param event + * @param body + */ + @Override + public final boolean onMessage(ECXMqMessageEvent event, Map<ECXMqMessageAttribute, Object> body) { + boolean retcode = false; + switch (event) { + // !!! handled by connector ... + case TRY_AUTHENTICATE: + case DISPOSE: + case LOGOUT: + break; + // ... handled by connector !!! + default: + break; + } + return false; + } +} diff --git a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/Activator.java b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/Activator.java new file mode 100644 index 0000000..1f1052c --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/Activator.java @@ -0,0 +1,54 @@ +/** + * + * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation + */ +package org.eclipse.osbp.osgi.hybrid.api; + +import org.eclipse.core.runtime.Plugin; +import org.eclipse.osbp.gitinfo.Loginfo; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class Activator extends Plugin implements BundleActivator { + + private static BundleContext context; + private static final Logger LOGGER = LoggerFactory.getLogger("activator"); + + public static BundleContext getContext() { + return context; + } + + /* + * (non-Javadoc) + * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext bundleContext) throws Exception { + super.start(bundleContext); + Activator.context = bundleContext; + Loginfo li = new Loginfo(); + li.print( Activator.class.getCanonicalName(), Activator.class.getClassLoader()); + LOGGER.info(Activator.class.getCanonicalName()+": started"); + } + + /* + * (non-Javadoc) + * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext bundleContext) throws Exception { + super.stop(bundleContext); + Activator.context = null; + LOGGER.info(Activator.class.getCanonicalName()+": stopped"); + } + +} diff --git a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridCredentials.java b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridCredentials.java new file mode 100644 index 0000000..402a84c --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridCredentials.java @@ -0,0 +1,48 @@ +/** + * + * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation + */ +package org.eclipse.osbp.osgi.hybrid.api; + +import java.io.Serializable; +import java.net.URI; +import java.util.List; + +import org.apache.http.NameValuePair; +import org.apache.http.client.utils.URLEncodedUtils; + +import com.vaadin.server.Page; +import com.vaadin.ui.UI; + +public class HybridCredentials { + + private final String portalId; + private final String userName; + private final String password; + + protected HybridCredentials(String portalId, String userName, String password) { + this.portalId = portalId; + this.userName = userName; + this.password = password; + } + + public String getPortalId() { + return portalId; + } + + public String getUserName() { + return userName; + } + + public String getPassword() { + return password; + } +} diff --git a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridPartStateRefresher.java b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridPartStateRefresher.java new file mode 100644 index 0000000..fb7394e --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridPartStateRefresher.java @@ -0,0 +1,43 @@ +/** + * + * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation + */ +package org.eclipse.osbp.osgi.hybrid.api; + +import com.github.wolfie.refresher.Refresher; + +import org.eclipse.osbp.preferences.ProductConfiguration; + +public class HybridPartStateRefresher extends Refresher { + + private static final long serialVersionUID = 2627881764074882845L; + private boolean fActive; + private final int fIntervalActive; + private final int fIntervalInactive; + + public HybridPartStateRefresher(RefreshListener listener) { + fIntervalActive = ProductConfiguration.getHybridRefresherMilliSecsActive(); + fIntervalInactive = ProductConfiguration.getHybridRefresherMilliSecsInactive(); + addListener(listener); + setActive(true); + } + + public void setActive(boolean active) { + if (fActive != active) { + fActive = active; + setRefreshInterval(fActive ? fIntervalActive : fIntervalInactive); + } + } + + public boolean isActive() { + return fActive; + } +} diff --git a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridServiceBinder.java b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridServiceBinder.java new file mode 100644 index 0000000..8110c7c --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridServiceBinder.java @@ -0,0 +1,69 @@ +/** + * + * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation + */ +package org.eclipse.osbp.osgi.hybrid.api; + +import java.util.HashSet; +import java.util.Set; + +import org.eclipse.e4.ui.model.application.ui.MElementContainer; +import org.eclipse.e4.ui.model.application.ui.MUIElement; +import org.eclipse.e4.ui.model.application.ui.advanced.MPerspectiveStack; +import org.eclipse.osbp.ui.api.useraccess.IUserAccessService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HybridServiceBinder { + + private static final Set<IPresentationRenderer> sPresentationRenderers = new HashSet<>(); + private final static Logger log = LoggerFactory.getLogger("servicebinder"); + private static IUserAccessService userAccessService; + + + public static void processContents(MPerspectiveStack perspectiveStack, MElementContainer<MUIElement> perspectiveStackElement) { + for (IPresentationRenderer presentationRenderer : sPresentationRenderers) { + presentationRenderer.processContents(perspectiveStack, perspectiveStackElement); + break; + } + } + + /** + * @param presentationRenderer declarative service loaded + */ + public static void bindPresentationRenderer(IPresentationRenderer presentationRenderer) { + log.debug(HybridServiceBinder.class.getCanonicalName()+": "+presentationRenderer.getClass().getCanonicalName()+" bound"); + sPresentationRenderers.add(presentationRenderer); + } + + /** + * @param presentationRenderer declarative service unloaded + */ + public static void unbindPresentationRenderer(IPresentationRenderer presentationRenderer) { + log.debug(HybridServiceBinder.class.getCanonicalName()+": "+presentationRenderer.getClass().getCanonicalName()+" unbound"); + sPresentationRenderers.remove(presentationRenderer); + } + + public static IUserAccessService getUserAccessService() { + return userAccessService; + } + + public synchronized void bindUserAccessService(final IUserAccessService userAccessService) { + this.userAccessService = userAccessService; + log.debug("HybridAuthenticationService bound"); + } + + public synchronized void unbindUserAccessService(final IUserAccessService userAccessService) { + this.userAccessService = null; + log.debug("HybridAuthenticationService unbound"); + } + +} diff --git a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridVaadinVaaclipseConnector.java b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridVaadinVaaclipseConnector.java new file mode 100644 index 0000000..35eebf8 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridVaadinVaaclipseConnector.java @@ -0,0 +1,922 @@ +/** + * + * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation + */ +package org.eclipse.osbp.osgi.hybrid.api; + +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.net.URI; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Queue; +import java.util.Set; +import java.util.UUID; + +import javax.imageio.ImageIO; + +import org.apache.commons.codec.binary.Hex; +import org.apache.http.NameValuePair; +import org.apache.http.client.utils.URLEncodedUtils; +import org.eclipse.e4.core.contexts.IEclipseContext; +import org.eclipse.e4.ui.model.application.MApplication; +import org.eclipse.e4.ui.model.application.ui.MUIElement; +import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective; +import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.e4.ui.workbench.modeling.EModelService; +import org.eclipse.e4.ui.workbench.modeling.EPartService; +import org.eclipse.osbp.dsl.common.datatypes.IDto; +import org.eclipse.osbp.osgi.hybrid.api.IEventForNextRefresh.FocusPerspective; +import org.eclipse.osbp.osgi.hybrid.api.IEventForNextRefresh.TryToAuthenticate; +import org.eclipse.osbp.preferences.ProductConfiguration; +import org.eclipse.osbp.ui.api.themes.IThemeResourceService; +import org.eclipse.osbp.ui.api.useraccess.AbstractAuthorization.Permission; +import org.eclipse.osbp.ui.api.useraccess.AbstractAuthorization.PermissionResult; +import org.eclipse.osbp.ui.api.useraccess.AbstractPosition; +import org.eclipse.osbp.ui.api.useraccess.IPermissionList; +import org.eclipse.osbp.ui.api.useraccess.IUserAccessService; +import org.eclipse.osbp.utils.session.VaadinSessionAttributes; +import org.eclipse.osbp.webserver.messagequeue.CXMqConsumer; +import org.eclipse.osbp.webserver.messagequeue.CXMqMessagePerspectiveData; +import org.eclipse.osbp.webserver.messagequeue.ECXMqMessageAttribute; +import org.eclipse.osbp.webserver.messagequeue.ECXMqMessageEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.wolfie.refresher.Refresher; +import com.github.wolfie.refresher.Refresher.RefreshListener; +import com.vaadin.server.AbstractClientConnector; +import com.vaadin.server.Extension; +import com.vaadin.server.Page; +import com.vaadin.server.VaadinRequest; +import com.vaadin.ui.UI; + +public class HybridVaadinVaaclipseConnector implements RefreshListener, IHybridVaadinVaaclipseListener { + + private static final long serialVersionUID = 7239729235615118954L; + private static final Logger LOGGER = LoggerFactory.getLogger(HybridVaadinVaaclipseConnector.class); + + /** + * @param element to search the containing perspective + * @return the perspective + */ + public static MPerspective findCurrentPerspectiveFor(MUIElement element) { + MPerspective perspective = null; + if (element != null) { + if (element instanceof MPerspective) { + perspective = (MPerspective) element; + } + else { + if (element.getCurSharedRef() != null) { + perspective = findCurrentPerspectiveFor(element.getCurSharedRef()); + } + if ((perspective == null) && (element.getParent() != null)) { + perspective = findCurrentPerspectiveFor(element.getParent()); + } + } + } + return perspective; + } + + private final IEclipseContext fEclipseContext; + private MApplication fE4Application; + private String fLastFocusPerspectiveId = ""; + private Queue<Map<String,Object>> fLastListOfPerspectives = new LinkedList<Map<String,Object>>(); + private Queue<IEventForNextRefresh> fEventsForNextRefresh = null; + private HybridPartStateRefresher fPartStateRefresher = null; + private MPart fLastActivePart; + private AbstractClientConnector fLastExtensionHolder; + private boolean fPostInitForSessionHandled; + private boolean fPostInitForAuthenticationHandled; + private String fMqBrokerHost; + private int fMqBrokerPort; + private CXMqConsumer fMqConsumer; + protected String fSessionId; + private Set<IHybridVaadinVaaclipseListener> fListeners = new HashSet<IHybridVaadinVaaclipseListener>(); + + private IThemeResourceService getThemeResourceService() { + if (fEclipseContext.containsKey(IThemeResourceService.class)) { + return fEclipseContext.get(IThemeResourceService.class); + } + return null; + } + + private EPartService getPartService() { + if (fEclipseContext.containsKey(EPartService.class)) { + return fEclipseContext.get(EPartService.class); + } + return null; + } + + private EModelService getModelService() { + if (fEclipseContext.containsKey(EModelService.class)) { + return fEclipseContext.get(EModelService.class); + } + return null; + } + + /** + * Send message via ActiveMQ + * @param event + * @param args + * @see CXMqConsumer#sendMessage(ECXMqMessageEvent, Object...) + */ + public void sendMessage(ECXMqMessageEvent event, Object... args) { + if (fMqConsumer == null) { + LOGGER.error("Messagequeue consumer is null"); + } + else { + fMqConsumer.sendMessage(event, args); + } + } + + /** + * @return true if a refresher is already added to the one-and-only TrimmedWindowContent + */ + public boolean isTrimmedWindowContent() { + return isTrimmedWindowContent(fLastExtensionHolder); + } + + /** + * @param component to be checked + * @return true if the component is of instance TrimmedWindowContent + */ + public static boolean isTrimmedWindowContent(AbstractClientConnector component) { + return ((component != null) && "org.eclipse.osbp.vaaclipse.presentation.widgets.TrimmedWindowContent".equals(component.getClass().getCanonicalName())); + } + + @Override + public void refresh(Refresher source) { + // --- if not yet on TrimmedWindowContent --- + if (!isTrimmedWindowContent()) { + // --- re-active a part state refresher --- + activatePartStateRefresher(); + } + // --- handle all events received via ActiveMq --- + while (!fEventsForNextRefresh.isEmpty()) { + IEventForNextRefresh event = fEventsForNextRefresh.poll(); + if (event instanceof TryToAuthenticate) { + TryToAuthenticate tryToAuthenticate = (TryToAuthenticate) event; + tryToAuthenticate(tryToAuthenticate.getPortalId(), tryToAuthenticate.getUserName(), tryToAuthenticate.getPassword()); + } + if (event instanceof FocusPerspective) { + FocusPerspective focusPerspective = (FocusPerspective) event; + String perspectiveId = focusPerspective.getSwitchingPerspective(); + switchPerspective(perspectiveId); + } + } + } + + /** + * Try to load the icon for the perspective and send it via ActiveMq back to the requester + * @param perspectiveId the perspective whose icon is requested + * @return always true, because the corresponding request has always been answered + */ + public boolean requestIcon(String perspectiveId) { + MPerspective perspective = findPerspective(perspectiveId); + if (perspective != null) { + String iconURI = perspective.getIconURI(); + String iconSerialized = null; // get the icon from resource; + if (getThemeResourceService() != null) { + try { + InputStream stream = getThemeResourceService().getThemeResourceInputStream(iconURI); + String[] tokens = iconURI.split("\\."); + String extension = tokens[tokens.length-1]; + BufferedImage originalImage = ImageIO.read(stream); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ImageIO.write(originalImage, extension, baos); + baos.flush(); + byte[] imageInByte = baos.toByteArray(); + baos.close(); + iconSerialized = new String(Hex.encodeHex(imageInByte)); + // byte[] h = Hex.decodeHex(iconSerialized.toCharArray()); + } + catch (Exception e) { + LOGGER.error(e.getLocalizedMessage()); + } + } + else { + LOGGER.error("themeResourceService not set!"); + } + if (iconSerialized != null) { + sendMessage(ECXMqMessageEvent.GET_ICON, + ECXMqMessageAttribute.PERSPECTIVE_ID, perspectiveId, + ECXMqMessageAttribute.ICON_URI, iconURI, + ECXMqMessageAttribute.ICON_SERIALIZED, iconSerialized + ); + } + } + return true; + } + + /** + * Try to bring the perspective to focus + * @param perspectiveId + * @return true if it was possible, false otherwise + */ + public boolean onFocusPerspective(String perspectiveId) { + boolean retcode = false; + // --- if this perspective has already the focus --- + if (fLastFocusPerspectiveId.equals(perspectiveId)) { + retcode = true; + } + // --- if no event queue is existing --- + else if (fEventsForNextRefresh == null) { + retcode = switchPerspective(perspectiveId); + } + // --- otherwise put it into the event queue to be handled inside the refresh method --- + else { + fEventsForNextRefresh.add(new FocusPerspective(perspectiveId)); + retcode = true; + } + return retcode; + } + + /** + * Try to bring the perspective to focus + * @param perspectiveId + * @return + */ + private boolean switchPerspective(String perspectiveId) { + boolean retcode = false; + // --- if this perspective hasn't already the focus --- + if (!fLastFocusPerspectiveId.equals(perspectiveId)) { + MPerspective perspective = findPerspective(perspectiveId); + // --- if the perspective exists --- + if (perspective != null) { + try { + /* ??? + // @see PerspectiveStackRenderer.processContents() + MElementContainer<MUIElement> perspectiveStackElement = perspective.getParent(); + MPerspectiveStack perspectiveStack = (MPerspectiveStack)((MElementContainer<?>) perspectiveStackElement); + perspectiveStack.setSelectedElement(perspective); + HybridServiceBinder.processContents(perspectiveStack, perspectiveStackElement); + // for (MWindow window : perspective.getWindows()) { + // partService.bringToTop(window); + // partService.activate(window); + // } + partService.switchPerspective(perspective); + ??? */ + getModelService().bringToTop(perspective); + fLastFocusPerspectiveId = perspectiveId; + retcode = true; + } + catch (Exception e) {} // NOP + } + } + return retcode; + } + + /** + * @param modelService + * @param elementId + * @return the perspective found for elementId + */ + private MPerspective findPerspective(String elementId) { + List<MPerspective> found = getModelService().findElements(fE4Application, elementId, MPerspective.class, null); + if ((found != null) && (found.size() == 1)) { + return found.get(0); + } + else { + return null; + } + } + + /** + * @return the perspective found for elementId + */ + public List<MPerspective> findPerspectives() { + return (getModelService().findElements(fE4Application, null, MPerspective.class, null)); + } + + /** + * @return the connector instance for the current session + */ + public static HybridVaadinVaaclipseConnector instance(IEclipseContext eclipseContext) { + HybridVaadinVaaclipseConnector instance = VaadinSessionAttributes.get(HybridVaadinVaaclipseConnector.class); + if (instance == null) { + instance = new HybridVaadinVaaclipseConnector(eclipseContext); + VaadinSessionAttributes.set(HybridVaadinVaaclipseConnector.class, instance); + } + return instance; + } + + /** + * Dispose the connector instance from the current session + */ + public static void dispose() { + VaadinSessionAttributes.remove(HybridVaadinVaaclipseConnector.class); + } + + public HybridVaadinVaaclipseConnector(IEclipseContext eclipseContext) { + fEclipseContext = eclipseContext; + fPostInitForSessionHandled = false; + fPostInitForAuthenticationHandled = false; + // --- get the adress of the Active Message Queue Broker --- + fMqBrokerHost = ProductConfiguration.getActiveMqBrokerServerName(); + fMqBrokerPort = ProductConfiguration.getActiveMqBrokerServerPort(); + } + + /** + * @return true if a refresher exists + */ + protected boolean refresherExisting() { + return (fPartStateRefresher != null); + } + + /** + * re-create a refresher if it is needed and not yet added to a TrimmedWindowContent + */ + protected void activatePartStateRefresher() { + if ((fMqConsumer != null) && !isTrimmedWindowContent() && (fLastActivePart != null)) { + activatePartStateRefresher(fLastActivePart); + } + } + + /** + * (re-)create a refresher for the MPart and not yet added to a TrimmedWindowContent + * @param part + */ + protected void activatePartStateRefresher(MPart part) { + fLastActivePart = part; + // --- create the event queue if it doesn't exists yet --- + if (fEventsForNextRefresh == null) { + fEventsForNextRefresh = new LinkedList<IEventForNextRefresh>(); + } + // --- no refresher if not connected to any hybrid --- + if (fMqConsumer == null) { + return; + } + // --- no re-create refresher if it is already set on a TrimmedWindowContent --- + if (isTrimmedWindowContent()) { + return; + } + if (part != null) { + Object object = part.getObject(); + // --- get the view connected to the MPart --- + if (object instanceof AbstractHybridVaaclipseView) { + AbstractHybridVaaclipseView view = (AbstractHybridVaaclipseView) object; + // --- get the parent component --- + AbstractClientConnector parent = view.getParent(); + Method addExtension = null; + AbstractClientConnector extensionHolder = null; + try { + // --- traverse the parents to get the topmost extension holder --- + while ((parent != null) && (parent.getParent() != null)) { + try { + // --- check each parent for ... --- + for (Class cls = parent.getClass(); cls != null; cls = cls.getSuperclass()) { + try { + // --- ... each extended class ... --- + if (cls.getDeclaredMethod("addExtension", Extension.class) != null) { + // --- if it has a method addExtension(Extension) --- + extensionHolder = parent; + addExtension = cls.getDeclaredMethod("addExtension", Extension.class); + break; + } + } + catch (Exception e) {} // NOP + } + } + catch (Exception e) {} // NOP + // --- the parent --- + parent = (AbstractClientConnector) parent.getParent(); + // --- if this instance is a TrimmedWindowContent itself --- + if (HybridVaadinVaaclipseConnector.isTrimmedWindowContent(extensionHolder)) { + break; + } + } + // --- if a possible extension holder was found --- + if (extensionHolder != null) { + Collection<Extension> extensions = extensionHolder.getExtensions(); + for (Extension extension : extensions) { + // --- if it already has a refresher --- + if (extension instanceof HybridPartStateRefresher) { + return; + } + } + if (addExtension != null) { + // --- enable the accessability of the method --- + addExtension.setAccessible(true); + // --- generate a new refresher; they can't be moved to another parent --- + fPartStateRefresher = new HybridPartStateRefresher(this); + addExtension.invoke(extensionHolder, new Object[] { fPartStateRefresher }); + // --- remember the last active extension holder --- + fLastExtensionHolder = extensionHolder; + } + } + } + catch (Exception e) {} // NOP + } + } + } + + public void setE4Application(MApplication e4Application) { + fE4Application = e4Application; + } + + public IUserAccessService getUserAccessService() { + return HybridServiceBinder.getUserAccessService(); + } + + public void addListener(IHybridVaadinVaaclipseListener listener) { + if (!fListeners.contains(listener)) { + fListeners.add(listener); + // --- inform the listener if the session is already authenticated --- + listener.setAuthenticated(isAuthenticated()); + } + } + + public void removeListener(IHybridVaadinVaaclipseListener listener) { + fListeners.remove(listener); + } + + public HybridCredentials getCredentials(boolean forceCheckForCredentials) { + HybridCredentials credentials = null; + // --- do it only once per session --- + if (forceCheckForCredentials || !fPostInitForAuthenticationHandled) { + fPostInitForAuthenticationHandled = true; + + UI ui = UI.getCurrent(); + if (ui != null) { + Page page = ui.getPage(); + if (page != null) { + String developmentCredentialsParam = null; + + // --- get the starting URI --- + URI uri = page.getLocation(); + // --- extract all parameters --- + List<NameValuePair> params = URLEncodedUtils.parse(uri, "UTF-8"); + + for (NameValuePair param : params) { + // --- if - in development mode - credentials are given --- + if ("OSBEE_HYBRID_DEVELOPMENT_PASSWORD_NONE_CRYPTED".equals(param.getName())) { + developmentCredentialsParam = param.getValue(); + } + } + if (developmentCredentialsParam != null) { + try { + String[] token = developmentCredentialsParam.split("@", 3); + credentials = new HybridCredentials(token[0], token[1], token[2]); + } + catch (Exception e) { + } + } + } + } + } + return credentials; + } + + /** + * You <b>must call this at the end of the overriden init()</b> + */ + public final void postInit(VaadinRequest request) { + // --- do it only once per session --- + if (!fPostInitForSessionHandled) { + fPostInitForSessionHandled = true; + + Page page = UI.getCurrent().getPage(); + if (page != null) { + String requestParam = null; + + // --- get the starting URI --- + URI uri = page.getLocation(); + // --- extract all parameters --- + List<NameValuePair> params = URLEncodedUtils.parse(uri, "UTF-8"); + + for (NameValuePair param : params) { + // --- if the parameter request was used --- + if ("request".equals(param.getName())) { + requestParam = param.getValue(); + } + else { + LOGGER.debug(param.getName() + " : " + param.getValue()); + } + } + + // --- if request, then only request --- + if (requestParam != null) { + if (requestParam.startsWith("tcp://")) { + try { + String[] mqBrokerInfo = requestParam.replace("tcp://", "").split("\\|")[0].split(":"); + if (mqBrokerInfo.length == 2) { + fMqBrokerHost = mqBrokerInfo[0]; + fMqBrokerPort = Integer.parseInt(mqBrokerInfo[1]); + } + } + catch (Exception e) {} + } + // --- connect to the ActiveMQ and try to connect to the corresponding queuename --- + fMqConsumer = new CXMqConsumer( + fMqBrokerHost, fMqBrokerPort, + requestParam, + UUID.randomUUID().toString(), + this, + null + ); + // TODO this should help out to wait long enough until the authentication is done + // TODO there should be definitely a better wait for that!!!! + // TODO see {@link #onMessage(ECXMqMessageEvent, Map<ECXMqMessageAttribute, Object>)} + // ???? try { + // ???? Thread.sleep(5000); + // ???? } catch (InterruptedException e) { + // ???? e.printStackTrace(); + // ???? } + } + else { + try { + HybridCredentials credentials = getCredentials(false); + if (credentials != null) { + tryToAuthenticate(credentials.getPortalId(), credentials.getUserName(), credentials.getPassword()); + } + } + catch (Exception e) { + LOGGER.error(e.getLocalizedMessage()); + } + } + } + } + } + + + + /** + * React in the application according to <code>authenticated</code> + * @param authenticated true if the user is authenticated now! + */ + @Deprecated + public void setAuthenticated(boolean authenticated) { + // @TODO to be overwritten + } + + /** + * @return true if the actual session is authenticated + */ + public boolean isAuthenticated() { + if (HybridServiceBinder.getUserAccessService() == null) { + return false; + } + else { + return HybridServiceBinder.getUserAccessService().isAuthenticated(); + } + } + + /** + * @return the user instance for the authenticated session, otherwise null + */ + public IDto getUser() { + if (HybridServiceBinder.getUserAccessService() == null) { + return null; + } + else { + return HybridServiceBinder.getUserAccessService().getUser(); + } + } + + /** + * @return the position instance for the authenticated session, otherwise null + */ + public AbstractPosition getPosition() { + if (HybridServiceBinder.getUserAccessService() == null) { + return null; + } + else { + return HybridServiceBinder.getUserAccessService().getPosition(); + } + } + + /** + * @return the collection of roles for the authenticated session, otherwise null + */ + public Collection<String> getRoles() { + if (HybridServiceBinder.getUserAccessService() == null) { + return null; + } + else { + return HybridServiceBinder.getUserAccessService().getRoles(); + } + } + + /** + * @return the permission list for the authenticated session, otherwise null + */ + public IPermissionList getPermissions() { + if (HybridServiceBinder.getUserAccessService() == null) { + return null; + } + else { + return HybridServiceBinder.getUserAccessService().getPermissions(); + } + } + + /** + * @param permission the permission to be checked + * @return true if the permission is permitted for the actual session + */ + public PermissionResult isPermitted(Permission permission) { + if (HybridServiceBinder.getUserAccessService() == null) { + return null; + } + else { + return HybridServiceBinder.getUserAccessService().isPermitted(permission); + } + } + + /** + * @return the list of all usernames; null will be returned if the session is not authenticated + */ + public Set<String> getAllUsers() { + if (!isAuthenticated()) { + return null; + } + else { + return HybridServiceBinder.getUserAccessService().getAllUsers(); + } + } + + /** + * @param username name of the user + * @return the user instance for the username; null will be returned if the session is not authenticated + */ + public IDto findUserAccount(String username) { + if (!isAuthenticated()) { + return null; + } + else { + return HybridServiceBinder.getUserAccessService().findUserAccount(username); + } + } + + /** + * @param position to be checked + * @return the list of usernames connected to the position; null will be returned if the session is not authenticated + */ + public Set<String> findUsersForPosition(AbstractPosition position) { + if (!isAuthenticated()) { + return null; + } + else { + return findUsersForPosition(position.getName()); + } + } + + /** + * @param orgNode name of the position to be checked + * @return the list of usernames connected to the position; null will be returned if the session is not authenticated + */ + public Set<String> findUsersForPosition(String orgNode) { + if (!isAuthenticated()) { + return null; + } + else { + return HybridServiceBinder.getUserAccessService().findUsersForPosition(orgNode); + } + } + + /** + * @return the list of all position instances; null will be returned if the session is not authenticated + */ + public Set<AbstractPosition> getAllPositions() { + if (!isAuthenticated()) { + return null; + } + else { + return HybridServiceBinder.getUserAccessService().getAllPositions(); + } + } + + /** + * @param username name of the user + * @return the position instances for the user; null will be returned if the session is not authenticated + */ + public AbstractPosition findPositionForUser(String username) { + if (!isAuthenticated()) { + return null; + } + else { + return HybridServiceBinder.getUserAccessService().findPositionForUser(username); + } + } + + /** + * @param username name of the user + * @return the list of roles for the user; null will be returned if the session is not authenticated + */ + public Collection<String> findRolesForUser(String username) { + if (!isAuthenticated()) { + return null; + } + else { + return HybridServiceBinder.getUserAccessService().findRolesForUser(username); + } + } + + /** + * @param username name of the user + * @return the permission list for the user; null will be returned if the session is not authenticated + */ + public IPermissionList findPermissionsForUser(String username) { + if (!isAuthenticated()) { + return null; + } + else { + return HybridServiceBinder.getUserAccessService().findPermissionsForUser(username); + } + } + + /** + * Try to authenticate with the credentials given!<br> + * {@link #setAuthenticated(boolean)} will explicit be called! + * @param portalId + * @param userName + * @param password + * @return true if the user was authenticated successful + */ + boolean tryToAuthenticate(String portalId, String userName, String password) { + boolean authenticated = isAuthenticated(); + if (!authenticated) { + try { + authenticated = HybridServiceBinder.getUserAccessService().authenticate(portalId, userName, password); + } + catch (Exception e) { + LOGGER.error(e.getLocalizedMessage()); + } + for (IHybridVaadinVaaclipseListener listener : fListeners) { + listener.setAuthenticated(authenticated); + } + } + return authenticated; + } + + /** + * Logout from the Shiro API and send a LOGOUT event via ActiveMQ + */ + protected void logout() { + if (HybridServiceBinder.getUserAccessService() == null) { + } + else { + HybridServiceBinder.getUserAccessService().logout(); + } + if (fMqConsumer != null) { + fMqConsumer.sendMessage(ECXMqMessageEvent.LOGOUT); + } + for (IHybridVaadinVaaclipseListener listener : fListeners) { + listener.setAuthenticated(false); + } + dispose(); + } + + /** + * Inform the hybrid client about the now focussed perspective + * @param perspectiveId + */ + public final void updateFocusPerspective(String perspectiveId) { + if (fMqConsumer != null) { + // --- only if the focussed perspective has changed --- + if (!fLastFocusPerspectiveId.equals(perspectiveId)) { + fMqConsumer.sendMessage(ECXMqMessageEvent.FOCUS_PERSPECTIVE, ECXMqMessageAttribute.PERSPECTIVE_ID, perspectiveId); + } + fLastFocusPerspectiveId = perspectiveId; + } + } + + /** + * @param q1 + * @param q2 + * @return true if both queues have identical content + */ + private final boolean compare(Queue<Map<String,Object>> q1, Queue<Map<String,Object>> q2) { + try { + if (q1 == q2) { + return true; + } + if (q1.size() != q2.size()) { + return false; + } + else { + Object[] a1 = q1.toArray(); + Object[] a2 = q2.toArray(); + for (int i=0; i<q1.size(); i++) { + if (!a1[i].equals(a2[i])) { + return false; + } + } + } + return true; + } + catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + /** + * Inform the hybrid client about all available perspectives + * @param perspectiveId + */ + public final void updatePerspectiveList() { + if ((fMqConsumer != null) && (fE4Application != null)) { + // --- get the perspectives --- + List<MPerspective> perspectives = findPerspectives(); + Queue<Map<String,Object>> queue = new LinkedList<Map<String,Object>>(); + // --- if no perspectives available --- + if ((perspectives == null) || perspectives.isEmpty()) { + fMqConsumer.sendMessage(ECXMqMessageEvent.LIST_OF_PERSPECTIVES); + } + // --- otherwise --- + else { + for (MPerspective perspective : perspectives) { + // --- only rememer visible perspectives --- + if (perspective.isVisible() && perspective.isToBeRendered()) { + CXMqMessagePerspectiveData data = new CXMqMessagePerspectiveData( + perspective.getElementId(), + perspective.getLabel(), + perspective.getIconURI()); + queue.offer(data.getMap()); + } + } + } + // --- only if the queue of perspectives has changed --- + if (!compare(queue, fLastListOfPerspectives)) { + fLastListOfPerspectives = new LinkedList<Map<String,Object>>(queue); + fMqConsumer.sendMessage(ECXMqMessageEvent.LIST_OF_PERSPECTIVES, ECXMqMessageAttribute.PERSPECTIVE_ID, queue); + } + // --- now inform about the actual focussed perspective --- + MPerspective active = findCurrentPerspectiveFor(getPartService().getActivePart()); + if (active instanceof MPerspective) { + updateFocusPerspective (active.getElementId()); + } + } + } + + /** + * call a legacy program via hybrid client + * @param legacyProgramCall + */ + public final void callLegacyProgram(String legacyProgramCall) { + if (fMqConsumer != null) { + fMqConsumer.callLegacyProgram(legacyProgramCall); + } + } + + /** + * handle any message received via ActiveMQ + * @param event + * @param body + */ + @Override + public final boolean onMessage(ECXMqMessageEvent event, Map<ECXMqMessageAttribute, Object> body) { + boolean retcode = false; + switch (event) { + case TRY_AUTHENTICATE: + // --- try to authenticate with the credentials received --- + if (fEventsForNextRefresh == null) { + tryToAuthenticate( + body.get(ECXMqMessageAttribute.PORTAL_ID).toString(), + body.get(ECXMqMessageAttribute.USERNAME).toString(), + body.get(ECXMqMessageAttribute.PASSWORD).toString() + ); + } + else { + fEventsForNextRefresh.add(new TryToAuthenticate( + body.get(ECXMqMessageAttribute.PORTAL_ID).toString(), + body.get(ECXMqMessageAttribute.USERNAME).toString(), + body.get(ECXMqMessageAttribute.PASSWORD).toString() + )); + } + // TODO maybe after that the sleep could be stopped? + // TODO see {@link #postInit(VaadinRequest)} + retcode = true; + break; + case DISPOSE: + case LOGOUT: + // --- logout triggered through the event --- + logout(); + retcode = true; + break; + default: + for (IHybridVaadinVaaclipseListener listener : fListeners) { + if (listener.onMessage(event, body)) { + retcode = true; + break; + } + } + break; + } + return retcode; + } +} diff --git a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/IEventForNextRefresh.java b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/IEventForNextRefresh.java new file mode 100644 index 0000000..aec1173 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/IEventForNextRefresh.java @@ -0,0 +1,56 @@ +/** + * + * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation + */ +package org.eclipse.osbp.osgi.hybrid.api; + +import org.eclipse.e4.ui.workbench.modeling.EModelService; +import org.eclipse.e4.ui.workbench.modeling.EPartService; + +public interface IEventForNextRefresh { + + public class TryToAuthenticate implements IEventForNextRefresh { + private final String fPortalId; + private final String fUserName; + private final String fPassword; + + protected TryToAuthenticate(String portalId, String userName, String password) { + fPortalId = portalId; + fUserName = userName; + fPassword = password; + } + + public String getPortalId() { + return fPortalId; + } + + public String getUserName() { + return fUserName; + } + + public String getPassword() { + return fPassword; + } + } + + public final class FocusPerspective implements IEventForNextRefresh { + private final String fSwitchingPerspective; + + protected FocusPerspective(String elementId) { + fSwitchingPerspective = elementId; + } + + public String getSwitchingPerspective() { + return fSwitchingPerspective; + } + } + +} diff --git a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/IHybridVaadinVaaclipseListener.java b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/IHybridVaadinVaaclipseListener.java new file mode 100644 index 0000000..d61f7f7 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/IHybridVaadinVaaclipseListener.java @@ -0,0 +1,19 @@ +/** + * + * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation + */ +package org.eclipse.osbp.osgi.hybrid.api; + +import org.eclipse.osbp.webserver.messagequeue.ICXMqMessageListener; + +public interface IHybridVaadinVaaclipseListener extends ICXMqMessageListener { + void setAuthenticated(boolean authenticated); +} diff --git a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/IPresentationRenderer.java b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/IPresentationRenderer.java new file mode 100644 index 0000000..6e28612 --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/IPresentationRenderer.java @@ -0,0 +1,21 @@ +/** + * + * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation + */ +package org.eclipse.osbp.osgi.hybrid.api; + +import org.eclipse.e4.ui.model.application.ui.MElementContainer; +import org.eclipse.e4.ui.model.application.ui.MUIElement; +import org.eclipse.e4.ui.model.application.ui.advanced.MPerspectiveStack; + +public interface IPresentationRenderer { + void processContents(MPerspectiveStack perspectiveStack, MElementContainer<MUIElement> perspectiveStackElement); +} diff --git a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/RecursiveFocusBlurListener.java b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/RecursiveFocusBlurListener.java new file mode 100644 index 0000000..fe236af --- /dev/null +++ b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/RecursiveFocusBlurListener.java @@ -0,0 +1,313 @@ +/** + * + * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation + */ +package org.eclipse.osbp.osgi.hybrid.api; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.vaadin.event.FieldEvents.BlurEvent; +import com.vaadin.event.FieldEvents.BlurListener; +import com.vaadin.event.FieldEvents.BlurNotifier; +import com.vaadin.event.FieldEvents.FocusEvent; +import com.vaadin.event.FieldEvents.FocusListener; +import com.vaadin.event.FieldEvents.FocusNotifier; +import com.vaadin.server.AbstractClientConnector; +import com.vaadin.ui.AbstractComponent; +import com.vaadin.ui.AbstractComponentContainer; +import com.vaadin.ui.AbstractLayout; +import com.vaadin.ui.Component; +import com.vaadin.ui.HasComponents; +import com.vaadin.ui.HasComponents.ComponentAttachDetachNotifier; +import com.vaadin.ui.HasComponents.ComponentAttachEvent; +import com.vaadin.ui.HasComponents.ComponentAttachListener; +import com.vaadin.ui.HasComponents.ComponentDetachEvent; +import com.vaadin.ui.HasComponents.ComponentDetachListener; + +import org.eclipse.osbp.utils.theme.EnumCssClass; + + +public class RecursiveFocusBlurListener implements ComponentAttachListener, ComponentDetachListener { + + private static final Logger LOGGER = LoggerFactory.getLogger(RecursiveFocusBlurListener.class); + private AbstractComponentContainer fParent; + + protected RecursiveFocusBlurListener(AbstractComponentContainer container) { + fParent = container; + } + + public static RecursiveFocusBlurListener attachFor(AbstractComponentContainer container) { + RecursiveFocusBlurListener listener = new RecursiveFocusBlurListener(container); + listener.recursiveAddComponentAttachDetachListener(container); + listener.recursiveAddFocusBlurListener(container); + return listener; + } + + public void detach() { + recursiveRemoveComponentAttachDetachListener(fParent); + recursiveRemoveFocusBlurListener(fParent); + } + + private FocusListener fFocusListener = new FocusListener() { + @Override + public void focus(FocusEvent event) { + if (event.getComponent() instanceof AbstractComponent) { + AbstractComponent component = (AbstractComponent) event.getComponent(); + recursiveFocus((AbstractComponent)event.getComponent()); + } + } + }; + + private void recursiveFocus(AbstractComponent component) { + if (component != null) { + component.addStyleName(EnumCssClass.HAS_FOCUS.styleName()); + if (!component.equals(fParent) && (component.getParent() instanceof AbstractComponent)) { + recursiveFocus((AbstractComponent)component.getParent()); + } + } + } + + private BlurListener fBlurListener = new BlurListener() { + @Override + public void blur(BlurEvent event) { + if (event.getComponent() instanceof AbstractComponent) { + AbstractComponent component = (AbstractComponent) event.getComponent(); + recursiveBlur((AbstractComponent)event.getComponent()); + } + } + }; + + private void recursiveBlur(AbstractComponent component) { + if (component != null) { + component.removeStyleName(EnumCssClass.HAS_FOCUS.styleName()); + if (!component.equals(fParent) && (component.getParent() instanceof AbstractComponent)) { + recursiveBlur((AbstractComponent)component.getParent()); + } + } + } + + private static final long serialVersionUID = 3497317619845108761L; + + @Override + public void componentAttachedToContainer(ComponentAttachEvent event) { + if (event.getAttachedComponent() instanceof ComponentAttachDetachNotifier) { + recursiveAddComponentAttachDetachListener((ComponentAttachDetachNotifier)event.getAttachedComponent()); + } + if (event.getAttachedComponent() instanceof AbstractClientConnector) { + recursiveAddFocusBlurListener((AbstractClientConnector)event.getAttachedComponent()); + } + } + + @Override + public void componentDetachedFromContainer(ComponentDetachEvent event) { + if (event.getDetachedComponent() instanceof ComponentAttachDetachNotifier) { + recursiveRemoveComponentAttachDetachListener((ComponentAttachDetachNotifier)event.getDetachedComponent()); + } + if (event.getDetachedComponent() instanceof AbstractComponent) { + recursiveRemoveFocusBlurListener((AbstractComponent)event.getDetachedComponent()); + } + } + + private void recursiveAddComponentAttachDetachListener(ComponentAttachDetachNotifier container) { + AbstractComponent ccontainer = (AbstractComponent) container; + //ccontainer.setImmediate(true); + Collection<?> attachListeners = ccontainer.getListeners(ComponentAttachEvent.class); + if (!attachListeners.contains(this)) { + container.addComponentAttachListener(this); + } + Collection<?> detachListeners = ccontainer.getListeners(ComponentDetachEvent.class); + if (!detachListeners.contains(this)) { + container.addComponentAttachListener(this); + } + if (container instanceof HasComponents) { + Iterator<Component> iterator = ((HasComponents)container).iterator(); + while (iterator.hasNext()) { + Component component = iterator.next(); + if (component instanceof ComponentAttachDetachNotifier) { + recursiveAddComponentAttachDetachListener((ComponentAttachDetachNotifier)component); + } + } + } + } + + private void recursiveRemoveComponentAttachDetachListener(ComponentAttachDetachNotifier container) { + container.removeComponentAttachListener(this); + container.removeComponentAttachListener(this); + if (container instanceof HasComponents) { + Iterator<Component> iterator = ((HasComponents)container).iterator(); + while (iterator.hasNext()) { + Component component = iterator.next(); + if (component instanceof AbstractComponentContainer) { + recursiveRemoveComponentAttachDetachListener((AbstractComponentContainer)component); + } + } + } + } + + private Map<Class<?>,Method> fAddFocusListenerMethods = new HashMap<>(); + private Map<Class<?>,Method> fRemoveFocusListenerMethods = new HashMap<>(); + private Map<Class<?>,Method> fAddBlurListenerMethods = new HashMap<>(); + private Map<Class<?>,Method> fRemoveBlurListenerMethods = new HashMap<>(); + + private static Set<String> fFocusListenerLogList = new HashSet<>(); + private static Set<String> fBlurListenerLogList = new HashSet<>(); + + private void addFocusListener(AbstractClientConnector component) { + Method addFocusListenerMethod = fAddFocusListenerMethods.get(component.getClass()); + if (addFocusListenerMethod == null) { + try { + addFocusListenerMethod = component.getClass().getDeclaredMethod("addFocusListener", FocusListener.class); + if (addFocusListenerMethod != null) { + fAddFocusListenerMethods.put(component.getClass(), addFocusListenerMethod); + Method removeFocusListenerMethod = component.getClass().getDeclaredMethod("removeFocusListener", FocusListener.class); + if (removeFocusListenerMethod != null) { + fRemoveFocusListenerMethods.put(component.getClass(), removeFocusListenerMethod); + } + } + } + catch (NoSuchMethodException | SecurityException e) { + } + } + String className = component.getClass().getCanonicalName(); + if (fFocusListenerLogList.contains(className)) { + className = null; + } + else { + fFocusListenerLogList.add(className); + } + if (addFocusListenerMethod != null) { + try { + addFocusListenerMethod.invoke(component, new Object[] {fFocusListener}); + } + catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + if ((className != null) && LOGGER.isWarnEnabled()) { LOGGER.warn("focuL: "+className+" could not invoke "+e.getLocalizedMessage()); } + } + } + else { + if (!(component instanceof AbstractLayout)) { + if ((className != null) && LOGGER.isWarnEnabled()) { LOGGER.warn("focuL: "+className+" DOESN'T IMPLEMENT FocusNotifier"); } + } + } + } + + private void addBlurListener(AbstractClientConnector component) { + Method addBlurListenerMethod = fAddBlurListenerMethods.get(component.getClass()); + if (addBlurListenerMethod == null) { + try { + addBlurListenerMethod = component.getClass().getDeclaredMethod("addBlurListener", BlurListener.class); + if (addBlurListenerMethod != null) { + fAddBlurListenerMethods.put(component.getClass(), addBlurListenerMethod); + Method removeBlurListenerMethod = component.getClass().getDeclaredMethod("removeBlurListener", BlurListener.class); + if (removeBlurListenerMethod != null) { + fRemoveBlurListenerMethods.put(component.getClass(), removeBlurListenerMethod); + } + } + } + catch (NoSuchMethodException | SecurityException e) { + } + } + String className = component.getClass().getCanonicalName(); + if (fBlurListenerLogList.contains(className)) { + className = null; + } + else { + fBlurListenerLogList.add(className); + } + if (addBlurListenerMethod != null) { + try { + addBlurListenerMethod.invoke(component, new Object[] {fBlurListener}); + } + catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + if ((className != null) && LOGGER.isWarnEnabled()) { LOGGER.warn("blurL: "+className+" could not invoke "+e.getLocalizedMessage()); } + } + } + else { + if (!(component instanceof AbstractLayout)) { + if ((className != null) && LOGGER.isWarnEnabled()) { LOGGER.warn("blurL: "+className+" DOESN'T IMPLEMENT BlurNotifier"); } + } + } + } + + private void recursiveAddFocusBlurListener(AbstractClientConnector component) { + Collection<?> focusListeners = ((AbstractClientConnector)component).getListeners(FocusEvent.class); + if (!focusListeners.contains(fFocusListener)) { + if (component instanceof FocusNotifier) { + ((FocusNotifier) component).addFocusListener(fFocusListener); + } + else { + addFocusListener(component); + } + if (component instanceof BlurNotifier) { + ((BlurNotifier) component).addBlurListener(fBlurListener); + } + else { + addBlurListener(component); + } + } + if (component instanceof AbstractComponentContainer) { + Iterator<Component> iterator = ((AbstractComponentContainer)component).iterator(); + while (iterator.hasNext()) { + Component child = iterator.next(); + if (component instanceof AbstractClientConnector) { + recursiveAddFocusBlurListener((AbstractClientConnector)child); + } + } + } + } + + private void recursiveRemoveFocusBlurListener(AbstractClientConnector component) { + if (component instanceof FocusNotifier) { + ((FocusNotifier) component).removeFocusListener(fFocusListener); + } + else { + Method removeFocusListenerMethod = fRemoveFocusListenerMethods.get(component.getClass()); + if (removeFocusListenerMethod != null) { + try { + removeFocusListenerMethod.invoke(component, new Object[] {fFocusListener}); + } + catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + } + } + } + if (component instanceof BlurNotifier) { + ((BlurNotifier) component).removeBlurListener(fBlurListener); + } + else { + Method removeBlurListenerMethod = fRemoveBlurListenerMethods.get(component.getClass()); + if (removeBlurListenerMethod != null) { + try { + removeBlurListenerMethod.invoke(component, new Object[] {fBlurListener}); + } + catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + } + } + } + if (component instanceof HasComponents) { + Iterator<Component> iterator = ((HasComponents)component).iterator(); + while (iterator.hasNext()) { + Component child = iterator.next(); + if (component instanceof AbstractComponent) { + recursiveRemoveFocusBlurListener((AbstractComponent)child); + } + } + } + } +} @@ -0,0 +1,109 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--#======================================================================= --> +<!--# Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany). --> +<!--# All rights reserved. This program and the accompanying materials --> +<!--# are made available under the terms of the Eclipse Public License v1.0 --> +<!--# which accompanies this distribution, and is available at --> +<!--# http://www.eclipse.org/legal/epl-v10.html --> +<!--# --> +<!--# Contributors: --> +<!--# Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation API and implementation --> +<!--#======================================================================= --> +<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.eclipse.osbp.releng.maven</groupId> + <artifactId>org.eclipse.osbp.releng.maven.parent.tycho</artifactId> + <version>0.9.0-SNAPSHOT</version> + <relativePath/> + </parent> + + <groupId>org.eclipse.osbp.osgi.hybrid.api</groupId> + <artifactId>org.eclipse.osbp.osgi.hybrid.api.aggregator</artifactId> + <version>0.9.0-SNAPSHOT</version> + <packaging>pom</packaging> + + <url>${osbp.site.repository.url}</url> + <scm> + <url>${osbp.scm.url}</url> + <connection>${osbp.scm.connection}</connection> + <developerConnection>${osbp.scm.connection.dev}</developerConnection> + <tag>HEAD</tag> + </scm> + <distributionManagement> + <site> + <id>gh-pages</id> + <name>OSBP GitHub Pages</name> + <url>${distribution.site.url}</url> + </site> + </distributionManagement> + + <properties> + <osbp.gitrepo.name>${project.groupId}</osbp.gitrepo.name> + </properties> + + <modules> + <module>org.eclipse.osbp.osgi.hybrid.api</module> + <module>org.eclipse.osbp.osgi.hybrid.api.feature</module> + <!-- <module>org.eclipse.osbp.osgi.hybrid.api.p2</module> --> + </modules> + + <profiles> + <profile> + <id>build.p2</id> + <activation> + <property> + <name>osbp.build.p2</name> + </property> + </activation> + <modules> + <!-- <module>org.eclipse.osbp.osgi.hybrid.api.p2</module> --> + </modules> + </profile> + </profiles> + <build> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <configuration> + <skip>true</skip> + </configuration> + </plugin> + <plugin> + <groupId>org.eclipse.tycho</groupId> + <artifactId>target-platform-configuration</artifactId> + <version>${tycho-version}</version> + <configuration> + <resolver>p2</resolver> + <pomDependencies>consider</pomDependencies> + <environments> + <environment> + <os>win32</os> + <ws>win32</ws> + <arch>x86_64</arch> + </environment> + <environment> + <os>linux</os> + <ws>gtk</ws> + <arch>x86</arch> + </environment> + <environment> + <os>linux</os> + <ws>gtk</ws> + <arch>x86_64</arch> + </environment> + <environment> + <os>macosx</os> + <ws>cocoa</ws> + <arch>x86_64</arch> + </environment> + </environments> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> +</project> |