Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRalf Mollik2017-08-28 15:34:39 +0000
committerRalf Mollik2017-08-28 15:34:39 +0000
commitaa4009a4efbfa7055d83e67710d4b99efd6794c7 (patch)
tree172ebe60bf0e0bacc9753388f94d0209ef8fd577
downloadorg.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>
-rw-r--r--.project22
-rw-r--r--about.html28
-rw-r--r--jenkins.build.config.xml31
-rw-r--r--notice.html107
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api.feature/.project34
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api.feature/LICENSE.txt161
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api.feature/build.properties2
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api.feature/epl-v10.html259
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api.feature/feature.properties169
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api.feature/feature.xml38
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api.feature/license.html164
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api.feature/pom.xml82
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api.feature/src/main/javadoc/README.txt1
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api.feature/src/overview.html11
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/.project56
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/LICENSE.txt161
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/META-INF/MANIFEST.MF53
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/OSGI-INF/Authentication.xml5
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/OSGI-INF/PresentationRenderer.xml5
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/about.html28
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/about.ini17
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/about.mappings6
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/about.properties26
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/build.properties14
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/epl-v10.html259
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/license.html164
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/pom.xml23
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/AbstractHybridVaaclipseView.java557
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/AbstractHybridVaadinUI.java102
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/Activator.java54
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridCredentials.java48
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridPartStateRefresher.java43
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridServiceBinder.java69
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridVaadinVaaclipseConnector.java922
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/IEventForNextRefresh.java56
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/IHybridVaadinVaaclipseListener.java19
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/IPresentationRenderer.java21
-rw-r--r--org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/RecursiveFocusBlurListener.java313
-rw-r--r--pom.xml109
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 (&quot;Content&quot;). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;). 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, &quot;Program&quot; 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 (&quot;Redistributor&quot;) 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 &quot;CONTENT&quot;). 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
+ (&quot;EPL&quot;). 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, &quot;Program&quot; 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 (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</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 (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</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 &quot;features&quot;. Within a Feature, files named &quot;feature.xml&quot; 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 (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; 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 &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;). 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 &quot;src&quot; 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 (&quot;Feature Update License&quot;) 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 &quot;license&quot; property of files named &quot;feature.properties&quot; 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 (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+ other materials (collectively &quot;Installable Software&quot;). 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>
+ (&quot;Specification&quot;).</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 (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+ on a machine (&quot;Target Machine&quot;) 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 (&quot;Installable Software Agreement&quot;) 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&#8482; 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&nbsp;Hyprid API&nbsp;</strong>contains the functionality needed to integrate OSBP into the existing Compex Commerce client.</p>
+
+<p>&nbsp;</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 (&quot;Content&quot;). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;). 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, &quot;Program&quot; 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 (&quot;Redistributor&quot;) 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&#8482; 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);
+ }
+ }
+ }
+ }
+}
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..4f81cc7
--- /dev/null
+++ b/pom.xml
@@ -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>

Back to the top