summaryrefslogtreecommitdiffstats
path: root/winery/org.eclipse.winery.repository.client
diff options
context:
space:
mode:
Diffstat (limited to 'winery/org.eclipse.winery.repository.client')
-rw-r--r--winery/org.eclipse.winery.repository.client/.gitignore14
-rw-r--r--winery/org.eclipse.winery.repository.client/README.md5
-rw-r--r--winery/org.eclipse.winery.repository.client/about.html286
-rw-r--r--winery/org.eclipse.winery.repository.client/about_files/Apache-LICENSE-2.0.txt202
-rw-r--r--winery/org.eclipse.winery.repository.client/about_files/CDDL-v1.1.txt129
-rw-r--r--winery/org.eclipse.winery.repository.client/about_files/LICENSE-logback.txt15
-rw-r--r--winery/org.eclipse.winery.repository.client/about_files/LICENSE-slf4j-api.txt21
-rw-r--r--winery/org.eclipse.winery.repository.client/pom.xml160
-rw-r--r--winery/org.eclipse.winery.repository.client/src/main/java/META-INF/MANIFEST.MF3
-rw-r--r--winery/org.eclipse.winery.repository.client/src/main/java/org/eclipse/winery/repository/client/IWineryRepositoryClient.java56
-rw-r--r--winery/org.eclipse.winery.repository.client/src/main/java/org/eclipse/winery/repository/client/WineryRepositoryClient.java746
-rw-r--r--winery/org.eclipse.winery.repository.client/src/main/java/org/eclipse/winery/repository/client/WineryRepositoryClientFactory.java20
-rw-r--r--winery/org.eclipse.winery.repository.client/src/main/resources/TOSCA-v1.0.xsd791
-rw-r--r--winery/org.eclipse.winery.repository.client/src/test/java/META-INF/MANIFEST.MF3
-rw-r--r--winery/org.eclipse.winery.repository.client/src/test/java/org/eclipse/winery/repository/client/TestWineryRepositoryClient.java144
15 files changed, 2595 insertions, 0 deletions
diff --git a/winery/org.eclipse.winery.repository.client/.gitignore b/winery/org.eclipse.winery.repository.client/.gitignore
new file mode 100644
index 0000000..3576cf9
--- /dev/null
+++ b/winery/org.eclipse.winery.repository.client/.gitignore
@@ -0,0 +1,14 @@
+.classpath
+/.gradle
+.project
+.settings/org.eclipse.core.resources.prefs
+.settings/org.eclipse.jdt.core.prefs
+.settings/org.eclipse.m2e.core.prefs
+.settings/org.eclipse.wst.common.component
+.settings/org.eclipse.wst.common.project.facet.core.xml
+.settings/org.eclipse.wst.validation.prefs
+/.sonar
+/bin
+/build
+/src/main/resources/rebel.xml
+/target
diff --git a/winery/org.eclipse.winery.repository.client/README.md b/winery/org.eclipse.winery.repository.client/README.md
new file mode 100644
index 0000000..b530bfa
--- /dev/null
+++ b/winery/org.eclipse.winery.repository.client/README.md
@@ -0,0 +1,5 @@
+This project provides a Java client to a Winery repository.
+
+## Build fat JARs
+To build a fatJar of the repository client which also contains all the dependencies use the maven profile fatJar (i.e., run `mvn clean package -P fatJar`).
+Maven will create a JAR called `org.eclipse.winery.repository.client-*-jar-with-dependencies.jar` in `/target`. \ No newline at end of file
diff --git a/winery/org.eclipse.winery.repository.client/about.html b/winery/org.eclipse.winery.repository.client/about.html
new file mode 100644
index 0000000..9fe8131
--- /dev/null
+++ b/winery/org.eclipse.winery.repository.client/about.html
@@ -0,0 +1,286 @@
+<!DOCTYPE html>
+<html>
+<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>January 24, 2014</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&ldquo;Content&rdquo;). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+<a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License Version 1.0 (&ldquo;EPL&rdquo;)</a>
+and <a href="http://www.opensource.org/licenses/apache2.0.php">Apache License Version 2.0</a>.
+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>
+and a copy of the Apache License Version 2.0 is available at <a href="http://www.opensource.org/licenses/apache2.0.php">http://www.opensource.org/licenses/apache2.0.php</a>.
+You may elect to redistribute this code under either of these licenses.
+For purposes of the EPL, &ldquo;Program&rdquo; 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 (&ldquo;Redistributor&rdquo;) and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor&rsquo;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 and Apache License 2.0 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>
+
+<h3>Third Party Content</h3>
+
+<h4>Java Libraries</h4>
+
+<h5>Apache Commons Configuration &ndash; Version 1.9</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="http://commons.apache.org/proper/commons-configuration/">http://commons.apache.org/proper/commons-configuration/</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>Apache 2.0. A copy of the license is contained in the file <a href="about_files/Apache-LICENSE-2.0.txt" target="_blank">Apache-LICENSE-2.0.txt</a> and is also available at <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a></td>
+ </tr>
+</table>
+
+<h5>Apache Commons IO &ndash; Version 2.1</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="http://commons.apache.org/proper/commons-io/">http://commons.apache.org/proper/commons-io/</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>Apache 2.0. A copy of the license is contained in the file <a href="about_files/Apache-LICENSE-2.0.txt" target="_blank">Apache-LICENSE-2.0.txt</a> and is also available at <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a></td>
+ </tr>
+</table>
+
+<h5>Apache Commons Lang &ndash; Version 2.6</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="http://commons.apache.org/proper/commons-lang/">http://commons.apache.org/proper/commons-lang/</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>Apache 2.0. A copy of the license is contained in the file <a href="about_files/Apache-LICENSE-2.0.txt" target="_blank">Apache-LICENSE-2.0.txt</a> and is also available at <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a></td>
+ </tr>
+</table>
+
+<h5>Apache Commons Lang3 &ndash; Version 3.1</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="http://commons.apache.org/proper/commons-lang/">http://commons.apache.org/proper/commons-lang/</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>Apache 2.0. A copy of the license is contained in the file <a href="about_files/Apache-LICENSE-2.0.txt" target="_blank">Apache-LICENSE-2.0.txt</a> and is also available at <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a></td>
+ </tr>
+</table>
+
+<h5>jackson-annotations &ndash; Version 2.2.2</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="https://github.com/FasterXML/jackson-annotations">https://github.com/FasterXML/jackson-annotations</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>Apache 2.0. A copy of the license is contained in the file <a href="about_files/Apache-LICENSE-2.0.txt" target="_blank">Apache-LICENSE-2.0.txt</a> and is also available at <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a></td>
+ </tr>
+ <tr>
+ <td>Note</td>
+ <td>The license was explicitly added in version 2.2.3 and 2.3.0. See <a href="https://github.com/FasterXML/jackson-annotations/issues/14">Issue #14</a> and <a href="https://github.com/FasterXML/jackson-annotations/blob/master/src/main/resources/META-INF/LICENSE">LICENSE in the source repository</a>.</td>
+ </tr>
+</table>
+
+<h5>jackson-core &ndash; Version 2.2.2</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="https://github.com/FasterXML/jackson-core">https://github.com/FasterXML/jackson-core</a> and <a href="http://wiki.fasterxml.com/JacksonHome">http://wiki.fasterxml.com/JacksonHome</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>Apache 2.0. A copy of the license is contained in the file <a href="about_files/Apache-LICENSE-2.0.txt" target="_blank">Apache-LICENSE-2.0.txt</a> and is also available at <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a></td>
+ </tr>
+</table>
+
+<h5>jackson-databind &ndash; Version 2.2.2</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="https://github.com/FasterXML/jackson-databind">https://github.com/FasterXML/jackson-databind</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>Apache 2.0. A copy of the license is contained in the file <a href="about_files/Apache-LICENSE-2.0.txt" target="_blank">Apache-LICENSE-2.0.txt</a> and is also available at <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a></td>
+ </tr>
+</table>
+
+<h5>jackson-jaxrs-base &ndash; Version 2.2.2</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="https://github.com/FasterXML/jackson-jaxrs-providers/tree/master/base">https://github.com/FasterXML/jackson-jaxrs-providers/tree/master/base</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>Apache 2.0. A copy of the license is contained in the file <a href="about_files/Apache-LICENSE-2.0.txt" target="_blank">Apache-LICENSE-2.0.txt</a> and is also available at <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a></td>
+ </tr>
+</table>
+
+<h5>jackson-jaxrs-json-provider &ndash; Version 2.2.2</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="https://github.com/FasterXML/jackson-jaxrs-providers/tree/master/json">https://github.com/FasterXML/jackson-jaxrs-providers/tree/master/json</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>Apache 2.0. A copy of the license is contained in the file <a href="about_files/Apache-LICENSE-2.0.txt" target="_blank">Apache-LICENSE-2.0.txt</a> and is also available at <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a></td>
+ </tr>
+</table>
+
+<h5>jackson-module-jaxb-annotations &ndash; Version 2.3.0</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="https://github.com/FasterXML/jackson-module-jaxb-annotations">https://github.com/FasterXML/jackson-module-jaxb-annotations</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>Apache 2.0. A copy of the license is contained in the file <a href="about_files/Apache-LICENSE-2.0.txt" target="_blank">Apache-LICENSE-2.0.txt</a> and is also available at <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a>.
+ The license is added via the <a href="https://github.com/FasterXML/oss-parent">oss-parent</a> project.</td>
+ </tr>
+</table>
+
+<h5>Jersey Client &ndash; Version 1.17</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="http://jersey.java.net/">jersey.java.net/</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>CDDL and GPL with classpath exception (<a href="https://jersey.java.net/license.html" target="_blank">https://jersey.java.net/license.html</a>).
+ The Eclipse Foundation elects to include this software in this distribution under the CDDL license.
+ A copy of the license is available at <a href="about_files/CDDL-v1.1.txt" target="_blank">CDDL-v1.1.txt</a>.</td>
+ </tr>
+</table>
+
+<h5>Jersey Core &ndash; Version 1.17</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="http://jersey.java.net/">jersey.java.net/</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>CDDL and GPL with classpath exception. A copy of the license is available at <a href="https://jersey.java.net/license.html" target="_blank">https://jersey.java.net/license.html</a></td>
+ </tr>
+</table>
+
+<h5>JSP Standard Tag Library &ndash; Version 1.2</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="https://jstl.java.net/">https://jstl.java.net/</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>CDDL and GPL with classpath exception. A copy of the license is available at <a href="https://jstl.java.net/license.html" target="_blank">https://jstl.java.net/license.html</a></td>
+ </tr>
+</table>
+
+<h5>Logback Classic &ndash; Version 1.1.1</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="http://logback.qos.ch/">http://logback.qos.ch/</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>EPL/LGPL dual-license. A copy of the license is contained in the file <a href="about_files/LICENSE-logback.txt" target="_blank">LICENSE-logback.txt</a> and is also available at <a href="http://logback.qos.ch/license.html" target="_blank">http://logback.qos.ch/license.html</a></td>
+ </tr>
+</table>
+
+<h5>Logback Core &ndash; Version 1.1.1</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="http://logback.qos.ch/">http://logback.qos.ch/</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>EPL/LGPL dual-license. A copy of the license is contained in the file <a href="about_files/LICENSE-logback.txt" target="_blank">LICENSE-logback.txt</a> and is also available at <a href="http://logback.qos.ch/license.html" target="_blank">http://logback.qos.ch/license.html</a></td>
+ </tr>
+</table>
+
+<h5>SLF4J: slf4j-api &ndash; Version 1.7.6</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="http://www.slf4j.org/">http://www.slf4j.org/</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>MIT. A copy of the license is contained in the file <a href="about_files/LICENSE-slf4j-api.txt" target="_blank">LICENSE-slf4j-api.txt</a> and is also available at <a href="http://www.slf4j.org/license.html" target="_blank">http://www.slf4j.org/license.html</a></td>
+ </tr>
+</table>
+
+<h5>SLF4J: jcl-over-slf4j &ndash; Version 1.7.6</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="http://www.slf4j.org/legacy.html">http://www.slf4j.org/legacy.html</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>Apache 2.0. A copy of the license is contained in the file <a href="about_files/Apache-LICENSE-2.0.txt" target="_blank">Apache-LICENSE-2.0.txt</a> and is also available at <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a></td>
+ </tr>
+</table>
+
+<h5>Winery: org.eclipse.winery.common &ndash; ${project.version}</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="http://eclipse.org/winery/">http://eclipse.org/winery/</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>EPL/Apache 2.0. A copy of the licenses is contained in the files <a href="../LICENSE-ASL.txt" target="_blank">LICENSE-ASL.txt</a> and <a href="../LICENSE-EPL.txt" target="_blank">LICENSE-EPL.txt</a>. 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> and a copy of the Apache License Version 2.0 is available at <a href="http://www.opensource.org/licenses/apache2.0.php">http://www.opensource.org/licenses/apache2.0.php</a>.</td>
+ </tr>
+</table>
+
+<h5>Winery: org.eclipse.winery.model.tosca &ndash; Version 0.1.20</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="http://eclipse.org/winery/">http://eclipse.org/winery/</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>EPL/Apache 2.0. A copy of the licenses is contained in the files <a href="../LICENSE-ASL.txt" target="_blank">LICENSE-ASL.txt</a> and <a href="../LICENSE-EPL.txt" target="_blank">LICENSE-EPL.txt</a>. 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> and a copy of the Apache License Version 2.0 is available at <a href="http://www.opensource.org/licenses/apache2.0.php">http://www.opensource.org/licenses/apache2.0.php</a>.</td>
+ </tr>
+</table>
+
+<h4>XSD Files</h4>
+
+<h5>TOSCA-v1.0.xsd</h5>
+<table>
+ <tr>
+ <td>URL</td>
+ <td><a href="http://docs.oasis-open.org/tosca/TOSCA/v1.0/os/schemas/">http://docs.oasis-open.org/tosca/TOSCA/v1.0/os/schemas/</a></td>
+ </tr>
+ <tr>
+ <td>License</td>
+ <td>Copyright (c) OASIS Open 2013. All rights reserved.</td>
+ </tr>
+</table>
+
+</body>
+</html> \ No newline at end of file
diff --git a/winery/org.eclipse.winery.repository.client/about_files/Apache-LICENSE-2.0.txt b/winery/org.eclipse.winery.repository.client/about_files/Apache-LICENSE-2.0.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/winery/org.eclipse.winery.repository.client/about_files/Apache-LICENSE-2.0.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/winery/org.eclipse.winery.repository.client/about_files/CDDL-v1.1.txt b/winery/org.eclipse.winery.repository.client/about_files/CDDL-v1.1.txt
new file mode 100644
index 0000000..7cc8719
--- /dev/null
+++ b/winery/org.eclipse.winery.repository.client/about_files/CDDL-v1.1.txt
@@ -0,0 +1,129 @@
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL - Version 1.1)
+1. Definitions.
+
+ 1.1. “Contributor” means each individual or entity that creates or contributes to the creation of Modifications.
+
+ 1.2. “Contributor Version” means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor.
+
+ 1.3. “Covered Software” means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof.
+
+ 1.4. “Executable” means the Covered Software in any form other than Source Code.
+
+ 1.5. “Initial Developer” means the individual or entity that first makes Original Software available under this License.
+
+ 1.6. “Larger Work” means a work which combines Covered Software or portions thereof with code not governed by the terms of this License.
+
+ 1.7. “License” means this document.
+
+ 1.8. “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
+
+ 1.9. “Modifications” means the Source Code and Executable form of any of the following:
+
+ A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications;
+
+ B. Any new file that contains any part of the Original Software or previous Modification; or
+
+ C. Any new file that is contributed or otherwise made available under the terms of this License.
+
+ 1.10. “Original Software” means the Source Code and Executable form of computer software code that is originally released under this License.
+
+ 1.11. “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
+
+ 1.12. “Source Code” means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code.
+
+ 1.13. “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
+
+2. License Grants.
+
+ 2.1. The Initial Developer Grant.
+
+ Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
+
+ (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and
+
+ (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof).
+
+ (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License.
+
+ (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices.
+
+ 2.2. Contributor Grant.
+
+ Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
+
+ (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and
+
+ (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
+
+ (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party.
+
+ (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor.
+
+3. Distribution Obligations.
+
+ 3.1. Availability of Source Code.
+
+ Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange.
+
+ 3.2. Modifications.
+
+ The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
+
+ 3.3. Required Notices.
+
+ You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer.
+
+ 3.4. Application of Additional Terms.
+
+ You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients’ rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
+
+ 3.5. Distribution of Executable Versions.
+
+ You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient’s rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
+
+ 3.6. Larger Works.
+
+ You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software.
+
+4. Versions of the License.
+
+ 4.1. New Versions.
+
+ Oracle is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License.
+
+ 4.2. Effect of New Versions.
+
+ You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward.
+
+ 4.3. Modified Versions.
+
+ When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License.
+
+5. DISCLAIMER OF WARRANTY.
+
+COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+6. TERMINATION.
+
+ 6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
+
+ 6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as “Participant”) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant.
+
+ 6.3. If You assert a patent infringement claim against Participant alleging that the Participant Software directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license.
+
+ 6.4. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination.
+
+7. LIMITATION OF LIABILITY.
+
+UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+8. U.S. GOVERNMENT END USERS.
+
+The Covered Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” (as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and “commercial computer software documentation” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License.
+9. MISCELLANEOUS.
+
+This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction’s conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software.
+10. RESPONSIBILITY FOR CLAIMS.
+
+As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
+NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
+
+The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California. \ No newline at end of file
diff --git a/winery/org.eclipse.winery.repository.client/about_files/LICENSE-logback.txt b/winery/org.eclipse.winery.repository.client/about_files/LICENSE-logback.txt
new file mode 100644
index 0000000..b4fe24e
--- /dev/null
+++ b/winery/org.eclipse.winery.repository.client/about_files/LICENSE-logback.txt
@@ -0,0 +1,15 @@
+Logback LICENSE
+---------------
+
+Logback: the reliable, generic, fast and flexible logging framework.
+Copyright (C) 1999-2012, QOS.ch. All rights reserved.
+
+This program and the accompanying materials are dual-licensed under
+either the terms of the Eclipse Public License v1.0 as published by
+the Eclipse Foundation
+
+ or (per the licensee's choosing)
+
+under the terms of the GNU Lesser General Public License version 2.1
+as published by the Free Software Foundation.
+
diff --git a/winery/org.eclipse.winery.repository.client/about_files/LICENSE-slf4j-api.txt b/winery/org.eclipse.winery.repository.client/about_files/LICENSE-slf4j-api.txt
new file mode 100644
index 0000000..37050c9
--- /dev/null
+++ b/winery/org.eclipse.winery.repository.client/about_files/LICENSE-slf4j-api.txt
@@ -0,0 +1,21 @@
+ Copyright (c) 2004-2013 QOS.ch
+ All rights reserved.
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/winery/org.eclipse.winery.repository.client/pom.xml b/winery/org.eclipse.winery.repository.client/pom.xml
new file mode 100644
index 0000000..b6a6c91
--- /dev/null
+++ b/winery/org.eclipse.winery.repository.client/pom.xml
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*******************************************************************************
+ * Copyright (c) 2013 University of Stuttgart.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and the Apache License 2.0 which both accompany this distribution,
+ * and are available at http://www.eclipse.org/legal/epl-v10.html
+ * and http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Contributors:
+ * Tobias Unger - initial API and implementation and/or initial documentation
+ * Tobias Binz - Adds support for building fatJars (including all dependencies) and profile for fatJars
+ * Oliver Kopp - cleanup
+ *******************************************************************************/
+-->
+<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.winery</groupId>
+ <artifactId>winery</artifactId>
+ <version>0.1.37-SNAPSHOT</version>
+ </parent>
+ <artifactId>org.eclipse.winery.repository.client</artifactId>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+ <profiles>
+ <profile>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <id>default</id>
+ <properties>
+ <package.fatJar>none</package.fatJar>
+ </properties>
+ </profile>
+ <profile>
+ <id>fatJar</id>
+ <properties>
+ <package.fatJar>package</package.fatJar>
+ </properties>
+ </profile>
+ </profiles>
+ <dependencies>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>2.2.2</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
+ <version>1.1.1</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>jcl-over-slf4j</artifactId>
+ <version>1.7.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.winery</groupId>
+ <artifactId>org.eclipse.winery.model.tosca</artifactId>
+ <version>0.1.21-SNAPSHOT</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-core</artifactId>
+ <version>1.17</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.winery</groupId>
+ <artifactId>org.eclipse.winery.common</artifactId>
+ <version>0.1.37-SNAPSHOT</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
+ <version>2.2.2</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-client</artifactId>
+ <version>1.17</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-configuration</groupId>
+ <artifactId>commons-configuration</artifactId>
+ <version>1.9</version>
+ <scope>compile</scope>
+ <exclusions>
+ <exclusion>
+ <artifactId>commons-logging</artifactId>
+ <groupId>commons-logging</groupId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <!-- use jackson-jaxrs-json-provider instead of jersey-json as suggested by http://stackoverflow.com/a/17006866/873282 -->
+ <dependency>
+ <groupId>com.fasterxml.jackson.jaxrs</groupId>
+ <artifactId>jackson-jaxrs-json-provider</artifactId>
+ <version>2.2.2</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.11</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.1</version>
+ <configuration>
+ <source>1.7</source>
+ <target>1.7</target>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>2.16</version>
+ <configuration>
+ <skipTests>true</skipTests>
+ </configuration>
+ </plugin>
+ <!-- Generates an additional *-jar-with-dependencies.jar -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <version>2.4</version>
+ <configuration>
+ <descriptorRefs>
+ <descriptorRef>jar-with-dependencies</descriptorRef>
+ </descriptorRefs>
+ </configuration>
+ <executions>
+ <execution>
+ <id>assemble-all</id>
+ <phase>${package.fatJar}</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/winery/org.eclipse.winery.repository.client/src/main/java/META-INF/MANIFEST.MF b/winery/org.eclipse.winery.repository.client/src/main/java/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..254272e
--- /dev/null
+++ b/winery/org.eclipse.winery.repository.client/src/main/java/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path:
+
diff --git a/winery/org.eclipse.winery.repository.client/src/main/java/org/eclipse/winery/repository/client/IWineryRepositoryClient.java b/winery/org.eclipse.winery.repository.client/src/main/java/org/eclipse/winery/repository/client/IWineryRepositoryClient.java
new file mode 100644
index 0000000..f53aca9
--- /dev/null
+++ b/winery/org.eclipse.winery.repository.client/src/main/java/org/eclipse/winery/repository/client/IWineryRepositoryClient.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2012-2013 University of Stuttgart.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and the Apache License 2.0 which both accompany this distribution,
+ * and are available at http://www.eclipse.org/legal/epl-v10.html
+ * and http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Contributors:
+ * Oliver Kopp - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.winery.repository.client;
+
+import org.eclipse.winery.common.interfaces.IWineryRepository;
+
+public interface IWineryRepositoryClient extends IWineryRepository {
+
+ /**
+ * Adds an URI to the list of known repositories
+ *
+ * SIDE EFFECT: If currently no primary repository is defined, the given
+ * repository is used as primary repository
+ *
+ * @param uri the URI of the repository
+ */
+ void addRepository(String uri);
+
+ /**
+ * Get the currently defined primary repository
+ */
+ String getPrimaryRepository();
+
+ /**
+ * Sets the primary repository
+ *
+ * SIDE EFFECT: If the repository is not known as general repository (via
+ * addRepository), the given repository is added to the list of known
+ * repositories
+ *
+ * @param uri
+ */
+ void setPrimaryRepository(String uri);
+
+ /**
+ * Checks whether the primary repository is available to be used. Typically,
+ * this method should return "true". In case of network or server failures,
+ * the result is "false". Note that the availability may change over time
+ * and also a repository might become unavailable during querying it.
+ *
+ * This method also returns "false" if no primary repository is set. For
+ * instance, this is the case of no repository is registered at the client.
+ *
+ * @return true if the repository is reachable over network, false otherwise
+ */
+ boolean primaryRepositoryAvailable();
+}
diff --git a/winery/org.eclipse.winery.repository.client/src/main/java/org/eclipse/winery/repository/client/WineryRepositoryClient.java b/winery/org.eclipse.winery.repository.client/src/main/java/org/eclipse/winery/repository/client/WineryRepositoryClient.java
new file mode 100644
index 0000000..216c623
--- /dev/null
+++ b/winery/org.eclipse.winery.repository.client/src/main/java/org/eclipse/winery/repository/client/WineryRepositoryClient.java
@@ -0,0 +1,746 @@
+/*******************************************************************************
+ * Copyright (c) 2012-2013 University of Stuttgart.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and the Apache License 2.0 which both accompany this distribution,
+ * and are available at http://www.eclipse.org/legal/epl-v10.html
+ * and http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Contributors:
+ * Oliver Kopp - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.winery.repository.client;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.xml.XMLConstants;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+
+import org.eclipse.winery.common.Util;
+import org.eclipse.winery.common.beans.NamespaceIdOptionalName;
+import org.eclipse.winery.common.constants.MimeTypes;
+import org.eclipse.winery.common.ids.GenericId;
+import org.eclipse.winery.common.ids.IdUtil;
+import org.eclipse.winery.common.ids.definitions.TOSCAComponentId;
+import org.eclipse.winery.common.interfaces.QNameAlreadyExistsException;
+import org.eclipse.winery.common.interfaces.QNameWithName;
+import org.eclipse.winery.common.propertydefinitionkv.WinerysPropertiesDefinition;
+import org.eclipse.winery.model.tosca.TDefinitions;
+import org.eclipse.winery.model.tosca.TEntityType;
+import org.eclipse.winery.model.tosca.TExtensibleElements;
+import org.eclipse.winery.model.tosca.TTopologyTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.config.ClientConfig;
+import com.sun.jersey.api.client.config.DefaultClientConfig;
+import com.sun.jersey.client.urlconnection.HttpURLConnectionFactory;
+import com.sun.jersey.client.urlconnection.URLConnectionClientHandler;
+import com.sun.jersey.core.util.MultivaluedMapImpl;
+
+public final class WineryRepositoryClient implements IWineryRepositoryClient {
+
+ private static final Logger logger = LoggerFactory.getLogger(WineryRepositoryClient.class);
+
+ // switch off validation, currently causes more trouble than it brings
+ private static final boolean VALIDATING = false;
+
+ private final Collection<String> knownURIs = new HashSet<String>();
+ private final Collection<WebResource> repositoryResources = new HashSet<WebResource>();
+ private final Client client;
+ private final ObjectMapper mapper = new ObjectMapper();
+
+ private final Map<Class<? extends TEntityType>, Map<QName, TEntityType>> entityTypeDataCache;
+
+ private final Map<GenericId, String> nameCache;
+ private static final int MAX_NAME_CACHE_SIZE = 1000;
+
+ private String primaryRepository = null;
+ private WebResource primaryWebResource = null;
+
+ // thread-safe JAXB as inspired by https://jaxb.java.net/guide/Performance_and_thread_safety.html
+ // The other possibility: Each subclass sets JAXBContext.newInstance(theSubClass.class); in its static {} part.
+ // This seems to be more complicated than listing all subclasses in initContext
+ public final static JAXBContext context = WineryRepositoryClient.initContext();
+
+ // schema aware document builder
+ private final DocumentBuilder toscaDocumentBuilder;
+
+
+ // taken from http://stackoverflow.com/a/15253142/873282
+ private static class ConnectionFactory implements HttpURLConnectionFactory {
+
+ Proxy proxy;
+
+
+ private void initializeProxy() {
+ this.proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 8888));
+ }
+
+ @Override
+ public HttpURLConnection getHttpURLConnection(URL url) throws IOException {
+ this.initializeProxy();
+ return (HttpURLConnection) url.openConnection(this.proxy);
+ }
+ }
+
+
+ /**
+ * Creates the client without the use of any proxy
+ */
+ public WineryRepositoryClient() {
+ this(false);
+ }
+
+ /**
+ * @param useProxy if a debugging proxy should be used
+ *
+ * @throws IllegalStateException if DOM parser could not be created
+ */
+ public WineryRepositoryClient(boolean useProxy) {
+ ClientConfig clientConfig = new DefaultClientConfig();
+ clientConfig.getClasses().add(JacksonJsonProvider.class);
+ if (useProxy) {
+ URLConnectionClientHandler ch = new URLConnectionClientHandler(new ConnectionFactory());
+ this.client = new Client(ch, clientConfig);
+ } else {
+ this.client = Client.create(clientConfig);
+ }
+
+ this.entityTypeDataCache = new HashMap<>();
+ this.nameCache = new HashMap<>();
+
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setNamespaceAware(true);
+ if (WineryRepositoryClient.VALIDATING) {
+ factory.setValidating(true);
+ SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ Schema schema;
+ URL resource = this.getClass().getResource("/TOSCA-v1.0.xsd");
+ try {
+ schema = schemaFactory.newSchema(resource);
+ } catch (SAXException e) {
+ throw new IllegalStateException("Schema could not be initalized", e);
+ }
+ factory.setSchema(schema);
+ }
+ try {
+ this.toscaDocumentBuilder = factory.newDocumentBuilder();
+ } catch (ParserConfigurationException e) {
+ throw new IllegalStateException("document builder could not be initalized", e);
+ }
+ /*
+ TODO: include this somehow - in the case of VALIDATING
+
+ Does not work with TTopolgoyTemplate as this is not allowed in the root of an XML document
+ this.toscaDocumentBuilder.setErrorHandler(new ErrorHandler() {
+
+ @Override
+ public void warning(SAXParseException arg0) throws SAXException {
+ throw arg0;
+ }
+
+ @Override
+ public void fatalError(SAXParseException arg0) throws SAXException {
+ throw arg0;
+ }
+
+ @Override
+ public void error(SAXParseException arg0) throws SAXException {
+ throw arg0;
+ }
+ });
+ */
+ }
+
+ private static JAXBContext initContext() {
+ // code copied+adapted from JAXBSupport
+
+ JAXBContext context;
+ try {
+ // For winery classes, eventually the package+jaxb.index method could be better. See http://stackoverflow.com/a/3628525/873282
+ // @formatter:off
+ context = JAXBContext.newInstance(
+ TDefinitions.class,
+ WinerysPropertiesDefinition.class);
+ // @formatter:on
+ } catch (JAXBException e) {
+ WineryRepositoryClient.logger.error("Could not initialize JAXBContext", e);
+ throw new IllegalStateException(e);
+ }
+ return context;
+ }
+
+ /**
+ * Creates a marshaller
+ *
+ * @throws IllegalStateException if marshaller could not be instantiated
+ */
+ private static Marshaller createMarshaller() {
+ // code copied+adapted from JAXBSupport
+ Marshaller m;
+ try {
+ m = WineryRepositoryClient.context.createMarshaller();
+ // pretty printed output is required as the XML is sent 1:1 to the browser for editing
+ m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
+ // not possible here: m.setProperty("com.sun.xml.bind.namespacePrefixMapper", JAXBSupport.prefixMapper);
+ } catch (JAXBException e) {
+ WineryRepositoryClient.logger.error("Could not instantiate marshaller", e);
+ throw new IllegalStateException(e);
+ }
+ return m;
+ }
+
+ /**
+ * Creates a unmarshaller
+ *
+ * @throws IllegalStateException if unmarshaller could not be instantiated
+ */
+ private static Unmarshaller createUnmarshaller() {
+ Unmarshaller um;
+ try {
+ um = WineryRepositoryClient.context.createUnmarshaller();
+ } catch (JAXBException e) {
+ WineryRepositoryClient.logger.error("Could not instantiate unmarshaller", e);
+ throw new IllegalStateException(e);
+ }
+ return um;
+ }
+
+ /*** methods directly from IWineryRepositoryClient ***/
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void addRepository(String uri) {
+ if (this.knownURIs.add(uri)) {
+ // URI is not already known, add a new resource
+ WebResource wr = this.client.resource(uri);
+ this.repositoryResources.add(wr);
+ if (this.primaryRepository == null) {
+ this.primaryRepository = uri;
+ this.primaryWebResource = wr;
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getPrimaryRepository() {
+ return this.primaryRepository;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setPrimaryRepository(String uri) {
+ this.addRepository(uri);
+ // now we are sure that a web resource for the uri exists
+ this.primaryRepository = uri;
+ // Update the reference to the primaryWebResource
+ // The appropriate resource has been created via
+ // this.addRepository(uri);
+ for (WebResource wr : this.repositoryResources) {
+ if (wr.getURI().equals(uri)) {
+ this.primaryWebResource = wr;
+ break;
+ }
+ }
+ assert (this.primaryWebResource != null);
+ }
+
+ /*** methods directly from IWineryRepository ***/
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public SortedSet<String> getNamespaces() {
+ SortedSet<String> res = new TreeSet<String>();
+ for (WebResource wr : this.repositoryResources) {
+ WebResource namespacesResource = wr.path("admin").path("namespaces");
+
+ // this could be parsed using JAXB
+ // (http://jersey.java.net/nonav/documentation/latest/json.html),
+ // but we are short in time, so we do a quick hack
+ String nsList = namespacesResource.accept(MediaType.APPLICATION_JSON).get(String.class);
+ WineryRepositoryClient.logger.trace(nsList);
+ List<String> nsListList;
+ try {
+ nsListList = this.mapper.readValue(nsList, new TypeReference<List<String>>() {
+ });
+ } catch (Exception e) {
+ WineryRepositoryClient.logger.error(e.getMessage(), e);
+ continue;
+ }
+ res.addAll(nsListList);
+ }
+ return res;
+ }
+
+ /**
+ * Base method for getQNameListOfAllTypes and getAllTypes.
+ */
+ private <T extends TExtensibleElements> Map<WebResource, List<NamespaceIdOptionalName>> getWRtoNamespaceAndIdListMapOfAllTypes(String path) {
+ Map<WebResource, List<NamespaceIdOptionalName>> res = new HashMap<WebResource, List<NamespaceIdOptionalName>>();
+ for (WebResource wr : this.repositoryResources) {
+ WebResource componentListResource = wr.path(path);
+
+ // this could be parsed using JAXB
+ // (http://jersey.java.net/nonav/documentation/latest/json.html),
+ // but we are short in time, so we do a quick hack
+ // The result also contains the optional name
+ String idList = componentListResource.accept(MediaType.APPLICATION_JSON).get(String.class);
+ WineryRepositoryClient.logger.trace(idList);
+ List<NamespaceIdOptionalName> nsAndIdList;
+ try {
+ nsAndIdList = this.mapper.readValue(idList, new TypeReference<List<NamespaceIdOptionalName>>() {
+ });
+ } catch (Exception e) {
+ WineryRepositoryClient.logger.error(e.getMessage(), e);
+ continue;
+ }
+ res.put(wr, nsAndIdList);
+ }
+ return res;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getName(GenericId id) {
+ if (this.nameCache.containsKey(id)) {
+ return this.nameCache.get(id);
+ }
+
+ String name = null;
+ for (WebResource wr : this.repositoryResources) {
+ String pathFragment = IdUtil.getURLPathFragment(id);
+ WebResource resource = wr.path(pathFragment).path("name");
+ ClientResponse response = resource.accept(MediaType.TEXT_PLAIN_TYPE).get(ClientResponse.class);
+ if (response.getClientResponseStatus() == ClientResponse.Status.OK) {
+ name = response.getEntity(String.class);
+ // break loop as the first match is the final result
+ break;
+ }
+ }
+ // if all resources did not return "OK", "null" is returned
+
+ if (name != null) {
+ if (this.nameCache.size() > WineryRepositoryClient.MAX_NAME_CACHE_SIZE) {
+ // if cache grew too large, clear it.
+ this.nameCache.clear();
+ }
+ this.nameCache.put(id, name);
+ }
+
+ return name;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public <T extends TEntityType> List<QName> getQNameListOfAllTypes(Class<T> className) {
+ String path = Util.getURLpathFragmentForCollection(className);
+ Map<WebResource, List<NamespaceIdOptionalName>> wRtoNamespaceAndIdListMapOfAllTypes = this.getWRtoNamespaceAndIdListMapOfAllTypes(path);
+ Collection<List<NamespaceIdOptionalName>> namespaceAndIdListCollection = wRtoNamespaceAndIdListMapOfAllTypes.values();
+ List<QName> res = new ArrayList<QName>(namespaceAndIdListCollection.size());
+ for (List<NamespaceIdOptionalName> namespaceAndIdList : namespaceAndIdListCollection) {
+ for (NamespaceIdOptionalName namespaceAndId : namespaceAndIdList) {
+ QName qname = new QName(namespaceAndId.getNamespace(), namespaceAndId.getId());
+ res.add(qname);
+ }
+ }
+ return res;
+ }
+
+ /**
+ * Fetches java objects at a given URL
+ *
+ * @param path the path to use. E.g., "nodetypes" for node types, ...
+ * @param className the class of the expected return type. May be
+ * TDefinitions or TEntityType. TDefinitions the mode is that the
+ * import statement are recursively resolved and added to the
+ * returned Defintitions elment
+ */
+ // we convert an object to T if it T is definitions
+ // does not work without compiler error
+ @SuppressWarnings("unchecked")
+ private <T extends TExtensibleElements> Collection<T> getAllTypes(String path, Class<T> className) {
+ Map<WebResource, List<NamespaceIdOptionalName>> wRtoNamespaceAndIdListMapOfAllTypes = this.getWRtoNamespaceAndIdListMapOfAllTypes(path);
+ // now we now all QNames. We have to fetch the full content now
+
+ Collection<T> res = new LinkedList<T>();
+ for (WebResource wr : wRtoNamespaceAndIdListMapOfAllTypes.keySet()) {
+ WebResource componentListResource = wr.path(path);
+
+ // go through all ids and fetch detailed information on each
+ // type
+
+ for (NamespaceIdOptionalName nsAndId : wRtoNamespaceAndIdListMapOfAllTypes.get(wr)) {
+ TDefinitions definitions = WineryRepositoryClient.getDefinitions(componentListResource, nsAndId.getNamespace(), nsAndId.getId());
+ if (definitions == null) {
+ // try next one
+ continue;
+ }
+
+ T result;
+
+ if (TDefinitions.class.equals(className)) {
+ // mode: complete definitions
+ result = (T) definitions;
+ } else {
+ // mode: only the nested element
+ // convention: first element in list is the element we look for
+ if (definitions.getServiceTemplateOrNodeTypeOrNodeTypeImplementation().isEmpty()) {
+ result = null;
+ WineryRepositoryClient.logger.error("Type {}/{} was found, but did not return any data", nsAndId.getNamespace(), nsAndId.getId());
+ } else {
+ WineryRepositoryClient.logger.trace("Probably found valid data for {}/{}", nsAndId.getNamespace(), nsAndId.getId());
+ result = (T) definitions.getServiceTemplateOrNodeTypeOrNodeTypeImplementation().get(0);
+
+ this.cache((TEntityType) result, new QName(nsAndId.getNamespace(), nsAndId.getId()));
+ }
+ }
+
+ // TODO: if multiple repositories are used, the new element
+ // should be put "sorted" into the list. This could be done by
+ // add(parsedResult, index), where index is calculated by
+ // incrementing index as long as the current element is smaller
+ // than the element to insert.
+ if (result != null) {
+ res.add(result);
+ }
+ }
+ }
+ return res;
+ }
+
+ /**
+ * Caches the TEntityType data of a QName to avoid multiple get requests
+ *
+ * NOT thread safe
+ */
+ private void cache(TEntityType et, QName qName) {
+ Map<QName, TEntityType> map;
+ if ((map = this.entityTypeDataCache.get(et.getClass())) == null) {
+ map = new HashMap<>();
+ this.entityTypeDataCache.put(et.getClass(), map);
+ } else {
+ // quick hack to keep cache size small
+ if (map.size() > 1000) {
+ map.clear();
+ }
+ }
+ map.put(qName, et);
+ }
+
+ private static WebResource getTopologyTemplateWebResource(WebResource base, QName serviceTemplate) {
+ String nsEncoded = Util.DoubleURLencode(serviceTemplate.getNamespaceURI());
+ String idEncoded = Util.DoubleURLencode(serviceTemplate.getLocalPart());
+ WebResource res = base.path("servicetemplates").path(nsEncoded).path(idEncoded).path("topologytemplate");
+ return res;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Collection<QNameWithName> getListOfAllInstances(Class<? extends TOSCAComponentId> clazz) {
+ // inspired by getQNameListOfAllTypes
+ String path = Util.getRootPathFragment(clazz);
+ Map<WebResource, List<NamespaceIdOptionalName>> wRtoNamespaceAndIdListMapOfAllTypes = this.getWRtoNamespaceAndIdListMapOfAllTypes(path);
+ Collection<List<NamespaceIdOptionalName>> namespaceAndIdListCollection = wRtoNamespaceAndIdListMapOfAllTypes.values();
+ List<QNameWithName> res = new ArrayList<QNameWithName>(namespaceAndIdListCollection.size());
+
+ for (List<NamespaceIdOptionalName> namespaceAndIdList : namespaceAndIdListCollection) {
+ for (NamespaceIdOptionalName namespaceAndId : namespaceAndIdList) {
+ QNameWithName qn = new QNameWithName();
+ qn.qname = new QName(namespaceAndId.getNamespace(), namespaceAndId.getId());
+ qn.name = namespaceAndId.getName();
+ res.add(qn);
+ }
+ }
+ return res;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public <T extends TEntityType> Collection<T> getAllTypes(Class<T> c) {
+ String urlPathFragment = Util.getURLpathFragmentForCollection(c);
+ Collection<T> allTypes = this.getAllTypes(urlPathFragment, c);
+ return allTypes;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T extends TEntityType> T getType(QName qname, Class<T> type) {
+ T res = null;
+ if (this.entityTypeDataCache.containsKey(type)) {
+ Map<QName, TEntityType> map = this.entityTypeDataCache.get(type);
+ if (map.containsKey(qname)) {
+ res = (T) map.get(qname);
+ }
+ }
+
+ if (res == null) {
+ // not yet seen, try to fetch resource
+
+ for (WebResource wr : this.repositoryResources) {
+ String path = Util.getURLpathFragmentForCollection(type);
+
+ TDefinitions definitions = WineryRepositoryClient.getDefinitions(wr, path, qname.getNamespaceURI(), qname.getLocalPart());
+
+ if (definitions == null) {
+ // in case of an error, just try the next one
+ continue;
+ }
+
+ res = (T) definitions.getServiceTemplateOrNodeTypeOrNodeTypeImplementation().get(0);
+ this.cache(res, qname);
+ break;
+ }
+ }
+
+ return res;
+ }
+
+ /**
+ * Tries to retrieve a TDefinitions from the given resource / encoded(ns) /
+ * encoded(localPart)
+ *
+ * @return null if 404 or other error
+ */
+ private static TDefinitions getDefinitions(WebResource wr, String path, String ns, String localPart) {
+ WebResource componentListResource = wr.path(path);
+ return WineryRepositoryClient.getDefinitions(componentListResource, ns, localPart);
+ }
+
+ /**
+ * Tries to retrieve a TDefinitions from the given resource / encoded(ns) /
+ * encoded(localPart)
+ *
+ * @return null if 404 or other error
+ */
+ private static TDefinitions getDefinitions(WebResource componentListResource, String ns, String localPart) {
+ // we need double encoding as the client decodes the URL once
+ String nsEncoded = Util.DoubleURLencode(ns);
+ String idEncoded = Util.DoubleURLencode(localPart);
+
+ WebResource instanceResource = componentListResource.path(nsEncoded).path(idEncoded);
+
+ // TODO: org.eclipse.winery.repository.resources.AbstractComponentInstanceResource.getDefinitionsWithAssociatedThings() could be used to do the resolving at the server
+
+ ClientResponse response = instanceResource.accept(MimeTypes.MIMETYPE_TOSCA_DEFINITIONS).get(ClientResponse.class);
+ if (response.getStatus() != 200) {
+ // also handles 404
+ return null;
+ }
+
+ TDefinitions definitions;
+ try {
+ Unmarshaller um = WineryRepositoryClient.createUnmarshaller();
+ definitions = (TDefinitions) um.unmarshal(response.getEntityInputStream());
+ } catch (JAXBException e) {
+ WineryRepositoryClient.logger.error("Could not umarshal TDefinitions", e);
+ // try next service
+ return null;
+ }
+ return definitions;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public <T extends TEntityType> Collection<TDefinitions> getAllTypesWithAssociatedElements(Class<T> c) {
+ String urlPathFragment = Util.getURLpathFragmentForCollection(c);
+ Collection<TDefinitions> allTypes = this.getAllTypes(urlPathFragment, TDefinitions.class);
+ return allTypes;
+ }
+
+ /**
+ *
+ * @param stream the stream to parse
+ * @return null if document is invalid
+ */
+ private Document parseAndValidateTOSCAXML(InputStream stream) {
+ Document document;
+ try {
+ document = this.toscaDocumentBuilder.parse(stream);
+ } catch (SAXException | IOException e) {
+ WineryRepositoryClient.logger.debug("Could not parse TOSCA file", e);
+ return null;
+ }
+ return document;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public TTopologyTemplate getTopologyTemplate(QName serviceTemplate) {
+ // we try all repositories until the first hit
+ for (WebResource wr : this.repositoryResources) {
+ WebResource r = WineryRepositoryClient.getTopologyTemplateWebResource(wr, serviceTemplate);
+ ClientResponse response = r.accept(MediaType.TEXT_XML).get(ClientResponse.class);
+ if (response.getClientResponseStatus() == ClientResponse.Status.OK) {
+ TTopologyTemplate topologyTemplate;
+ Document doc = this.parseAndValidateTOSCAXML(response.getEntityInputStream());
+ if (doc == null) {
+ // no valid document
+ return null;
+ }
+ try {
+ topologyTemplate = WineryRepositoryClient.createUnmarshaller().unmarshal(doc.getDocumentElement(), TTopologyTemplate.class).getValue();
+ } catch (JAXBException e) {
+ WineryRepositoryClient.logger.debug("Could not parse topology, returning null", e);
+ return null;
+ }
+ // first hit: immediately stop and return result
+ return topologyTemplate;
+ }
+ }
+ // nothing found
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setTopologyTemplate(QName serviceTemplate, TTopologyTemplate topologyTemplate) throws Exception {
+ WebResource r = WineryRepositoryClient.getTopologyTemplateWebResource(this.primaryWebResource, serviceTemplate);
+ String xmlAsString = Util.getXMLAsString(TTopologyTemplate.class, topologyTemplate);
+ ClientResponse response = r.type(MediaType.TEXT_XML).put(ClientResponse.class, xmlAsString);
+ WineryRepositoryClient.logger.debug(response.toString());
+ int status = response.getStatus();
+ if ((status < 200) || (status >= 300)) {
+ throw new Exception(response.toString());
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public QName getArtifactTypeQNameForExtension(String extension) {
+ // we try all repositories until the first hit
+ for (WebResource wr : this.repositoryResources) {
+ WebResource artifactTypesResource = wr.path("artifacttypes").queryParam("extension", extension);
+ ClientResponse response = artifactTypesResource.accept(MediaType.TEXT_PLAIN).get(ClientResponse.class);
+ if (response.getClientResponseStatus() == ClientResponse.Status.OK) {
+ QName res = QName.valueOf(response.getEntity(String.class));
+ return res;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * Does NOT check for global QName uniqueness, only in the scope of all
+ * artifact templates
+ */
+ @Override
+ public void createArtifactTemplate(QName qname, QName artifactType) throws QNameAlreadyExistsException {
+ WebResource artifactTemplates = this.primaryWebResource.path("artifacttemplates");
+ MultivaluedMap<String, String> map = new MultivaluedMapImpl();
+ map.putSingle("namespace", qname.getNamespaceURI());
+ map.putSingle("name", qname.getLocalPart());
+ map.putSingle("type", artifactType.toString());
+ ClientResponse response = artifactTemplates.type(MediaType.APPLICATION_FORM_URLENCODED).accept(MediaType.TEXT_PLAIN).post(ClientResponse.class, map);
+ if (response.getClientResponseStatus() != ClientResponse.Status.CREATED) {
+ // TODO: pass ClientResponse.Status somehow
+ // TODO: more fine grained checking for error message. Not all
+ // failures are that the QName already exists
+ WineryRepositoryClient.logger.debug(String.format("Error %d when creating id %s from URI %s", response.getStatus(), qname.toString(), this.primaryWebResource.getURI().toString()));
+ throw new QNameAlreadyExistsException();
+ }
+ // no further return is made
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void createComponent(QName qname, Class<? extends TOSCAComponentId> idClass) throws QNameAlreadyExistsException {
+ WebResource resource = this.primaryWebResource.path(Util.getRootPathFragment(idClass));
+ MultivaluedMap<String, String> map = new MultivaluedMapImpl();
+ map.putSingle("namespace", qname.getNamespaceURI());
+ map.putSingle("name", qname.getLocalPart());
+ ClientResponse response = resource.type(MediaType.APPLICATION_FORM_URLENCODED).accept(MediaType.TEXT_PLAIN).post(ClientResponse.class, map);
+ if (response.getClientResponseStatus() != ClientResponse.Status.CREATED) {
+ // TODO: pass ClientResponse.Status somehow
+ // TODO: more fine grained checking for error message. Not all failures are that the QName already exists
+ WineryRepositoryClient.logger.debug(String.format("Error %d when creating id %s from URI %s", response.getStatus(), qname.toString(), this.primaryWebResource.getURI().toString()));
+ throw new QNameAlreadyExistsException();
+ }
+ // no further return is made
+ }
+
+ @Override
+ public void forceDelete(GenericId id) throws IOException {
+ String pathFragment = IdUtil.getURLPathFragment(id);
+ for (WebResource wr : this.repositoryResources) {
+ ClientResponse response = wr.path(pathFragment).delete(ClientResponse.class);
+ if ((response.getClientResponseStatus() != ClientResponse.Status.NO_CONTENT) || (response.getClientResponseStatus() != ClientResponse.Status.NOT_FOUND)) {
+ WineryRepositoryClient.logger.debug(String.format("Error %d when deleting id %s from URI %s", response.getStatus(), id.toString(), wr.getURI().toString()));
+ }
+ }
+ }
+
+ @Override
+ public boolean primaryRepositoryAvailable() {
+ if (this.primaryWebResource == null) {
+ return false;
+ }
+
+ ClientResponse response = this.primaryWebResource.get(ClientResponse.class);
+ boolean res = (response.getClientResponseStatus() == ClientResponse.Status.OK);
+ return res;
+ }
+
+}
diff --git a/winery/org.eclipse.winery.repository.client/src/main/java/org/eclipse/winery/repository/client/WineryRepositoryClientFactory.java b/winery/org.eclipse.winery.repository.client/src/main/java/org/eclipse/winery/repository/client/WineryRepositoryClientFactory.java
new file mode 100644
index 0000000..59f0166
--- /dev/null
+++ b/winery/org.eclipse.winery.repository.client/src/main/java/org/eclipse/winery/repository/client/WineryRepositoryClientFactory.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2012-2013 University of Stuttgart.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and the Apache License 2.0 which both accompany this distribution,
+ * and are available at http://www.eclipse.org/legal/epl-v10.html
+ * and http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Contributors:
+ * Oliver Kopp - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.winery.repository.client;
+
+public class WineryRepositoryClientFactory {
+
+ public static IWineryRepositoryClient getWineryRepositoryClient() {
+ return new WineryRepositoryClient();
+ }
+
+}
diff --git a/winery/org.eclipse.winery.repository.client/src/main/resources/TOSCA-v1.0.xsd b/winery/org.eclipse.winery.repository.client/src/main/resources/TOSCA-v1.0.xsd
new file mode 100644
index 0000000..8bed0e0
--- /dev/null
+++ b/winery/org.eclipse.winery.repository.client/src/main/resources/TOSCA-v1.0.xsd
@@ -0,0 +1,791 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Topology and Orchestration Specification for Cloud Applications Version 1.0
+ Committee Specification Draft 08
+ 09 May 2013
+ Copyright (c) OASIS Open 2013. All rights reserved.
+ Source: http://docs.oasis-open.org/tosca/TOSCA/v1.0/csd08/schemas/
+-->
+<xs:schema targetNamespace="http://docs.oasis-open.org/tosca/ns/2011/12" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns="http://docs.oasis-open.org/tosca/ns/2011/12" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+ <xs:element name="documentation" type="tDocumentation"/>
+ <xs:complexType name="tDocumentation" mixed="true">
+ <xs:sequence>
+ <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="source" type="xs:anyURI"/>
+ <xs:attribute ref="xml:lang"/>
+ </xs:complexType>
+ <xs:complexType name="tExtensibleElements">
+ <xs:sequence>
+ <xs:element ref="documentation" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ <xs:complexType name="tImport">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:attribute name="namespace" type="xs:anyURI"/>
+ <xs:attribute name="location" type="xs:anyURI"/>
+ <xs:attribute name="importType" type="importedURI" use="required"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:element name="Definitions">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="tDefinitions"/>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="tDefinitions">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:sequence>
+ <xs:element name="Extensions" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Extension" type="tExtension" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Import" type="tImport" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="Types" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:choice maxOccurs="unbounded">
+ <xs:element name="ServiceTemplate" type="tServiceTemplate"/>
+ <xs:element name="NodeType" type="tNodeType"/>
+ <xs:element name="NodeTypeImplementation" type="tNodeTypeImplementation"/>
+ <xs:element name="RelationshipType" type="tRelationshipType"/>
+ <xs:element name="RelationshipTypeImplementation" type="tRelationshipTypeImplementation"/>
+ <xs:element name="RequirementType" type="tRequirementType"/>
+ <xs:element name="CapabilityType" type="tCapabilityType"/>
+ <xs:element name="ArtifactType" type="tArtifactType"/>
+ <xs:element name="ArtifactTemplate" type="tArtifactTemplate"/>
+ <xs:element name="PolicyType" type="tPolicyType"/>
+ <xs:element name="PolicyTemplate" type="tPolicyTemplate"/>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:ID" use="required"/>
+ <xs:attribute name="name" type="xs:string" use="optional"/>
+ <xs:attribute name="targetNamespace" type="xs:anyURI" use="required"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tServiceTemplate">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:sequence>
+ <xs:element name="Tags" type="tTags" minOccurs="0"/>
+ <xs:element name="BoundaryDefinitions" type="tBoundaryDefinitions" minOccurs="0"/>
+ <xs:element name="TopologyTemplate" type="tTopologyTemplate"/>
+ <xs:element name="Plans" type="tPlans" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:ID" use="required"/>
+ <xs:attribute name="name" type="xs:string" use="optional"/>
+ <xs:attribute name="targetNamespace" type="xs:anyURI"/>
+ <xs:attribute name="substitutableNodeType" type="xs:QName" use="optional"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tTags">
+ <xs:sequence>
+ <xs:element name="Tag" type="tTag" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tTag">
+ <xs:attribute name="name" type="xs:string" use="required"/>
+ <xs:attribute name="value" type="xs:string" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="tBoundaryDefinitions">
+ <xs:sequence>
+ <xs:element name="Properties" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:any namespace="##other"/>
+ <xs:element name="PropertyMappings" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PropertyMapping" type="tPropertyMapping" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="PropertyConstraints" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PropertyConstraint" type="tPropertyConstraint" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Requirements" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Requirement" type="tRequirementRef" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Capabilities" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Capability" type="tCapabilityRef" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Policies" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Policy" type="tPolicy" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Interfaces" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Interface" type="tExportedInterface" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tPropertyMapping">
+ <xs:attribute name="serviceTemplatePropertyRef" type="xs:string" use="required"/>
+ <xs:attribute name="targetObjectRef" type="xs:IDREF" use="required"/>
+ <xs:attribute name="targetPropertyRef" type="xs:string" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="tRequirementRef">
+ <xs:attribute name="name" type="xs:string" use="optional"/>
+ <xs:attribute name="ref" type="xs:IDREF" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="tCapabilityRef">
+ <xs:attribute name="name" type="xs:string" use="optional"/>
+ <xs:attribute name="ref" type="xs:IDREF" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="tEntityType" abstract="true">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:sequence>
+ <xs:element name="Tags" type="tTags" minOccurs="0"/>
+ <xs:element name="DerivedFrom" minOccurs="0">
+ <xs:complexType>
+ <xs:attribute name="typeRef" type="xs:QName" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="PropertiesDefinition" minOccurs="0">
+ <xs:complexType>
+ <xs:attribute name="element" type="xs:QName"/>
+ <xs:attribute name="type" type="xs:QName"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:NCName" use="required"/>
+ <xs:attribute name="abstract" type="tBoolean" default="no"/>
+ <xs:attribute name="final" type="tBoolean" default="no"/>
+ <xs:attribute name="targetNamespace" type="xs:anyURI" use="optional"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tEntityTemplate" abstract="true">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:sequence>
+ <xs:element name="Properties" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:any namespace="##other" processContents="lax"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="PropertyConstraints" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PropertyConstraint" type="tPropertyConstraint" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:ID" use="required"/>
+ <xs:attribute name="type" type="xs:QName" use="required"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tNodeTemplate">
+ <xs:complexContent>
+ <xs:extension base="tEntityTemplate">
+ <xs:sequence>
+ <xs:element name="Requirements" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Requirement" type="tRequirement" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Capabilities" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Capability" type="tCapability" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Policies" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Policy" type="tPolicy" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="DeploymentArtifacts" type="tDeploymentArtifacts" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:string" use="optional"/>
+ <xs:attribute name="minInstances" type="xs:int" use="optional" default="1"/>
+ <xs:attribute name="maxInstances" use="optional" default="1">
+ <xs:simpleType>
+ <xs:union>
+ <xs:simpleType>
+ <xs:restriction base="xs:nonNegativeInteger">
+ <xs:pattern value="([1-9]+[0-9]*)"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="unbounded"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:union>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tTopologyTemplate">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:choice maxOccurs="unbounded">
+ <xs:element name="NodeTemplate" type="tNodeTemplate"/>
+ <xs:element name="RelationshipTemplate" type="tRelationshipTemplate"/>
+ </xs:choice>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tRelationshipType">
+ <xs:complexContent>
+ <xs:extension base="tEntityType">
+ <xs:sequence>
+ <xs:element name="InstanceStates" type="tTopologyElementInstanceStates" minOccurs="0"/>
+ <xs:element name="SourceInterfaces" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Interface" type="tInterface" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="TargetInterfaces" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Interface" type="tInterface" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ValidSource" minOccurs="0">
+ <xs:complexType>
+ <xs:attribute name="typeRef" type="xs:QName" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ValidTarget" minOccurs="0">
+ <xs:complexType>
+ <xs:attribute name="typeRef" type="xs:QName" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tRelationshipTypeImplementation">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:sequence>
+ <xs:element name="Tags" type="tTags" minOccurs="0"/>
+ <xs:element name="DerivedFrom" minOccurs="0">
+ <xs:complexType>
+ <xs:attribute name="relationshipTypeImplementationRef" type="xs:QName" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="RequiredContainerFeatures" type="tRequiredContainerFeatures" minOccurs="0"/>
+ <xs:element name="ImplementationArtifacts" type="tImplementationArtifacts" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:NCName" use="required"/>
+ <xs:attribute name="targetNamespace" type="xs:anyURI" use="optional"/>
+ <xs:attribute name="relationshipType" type="xs:QName" use="required"/>
+ <xs:attribute name="abstract" type="tBoolean" use="optional" default="no"/>
+ <xs:attribute name="final" type="tBoolean" use="optional" default="no"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tRelationshipTemplate">
+ <xs:complexContent>
+ <xs:extension base="tEntityTemplate">
+ <xs:sequence>
+ <xs:element name="SourceElement">
+ <xs:complexType>
+ <xs:attribute name="ref" type="xs:IDREF" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="TargetElement">
+ <xs:complexType>
+ <xs:attribute name="ref" type="xs:IDREF" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="RelationshipConstraints" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="RelationshipConstraint" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="constraintType" type="xs:anyURI" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:string" use="optional"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tNodeType">
+ <xs:complexContent>
+ <xs:extension base="tEntityType">
+ <xs:sequence>
+ <xs:element name="RequirementDefinitions" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="RequirementDefinition" type="tRequirementDefinition" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="CapabilityDefinitions" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="CapabilityDefinition" type="tCapabilityDefinition" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="InstanceStates" type="tTopologyElementInstanceStates" minOccurs="0"/>
+ <xs:element name="Interfaces" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Interface" type="tInterface" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tNodeTypeImplementation">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:sequence>
+ <xs:element name="Tags" type="tTags" minOccurs="0"/>
+ <xs:element name="DerivedFrom" minOccurs="0">
+ <xs:complexType>
+ <xs:attribute name="nodeTypeImplementationRef" type="xs:QName" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="RequiredContainerFeatures" type="tRequiredContainerFeatures" minOccurs="0"/>
+ <xs:element name="ImplementationArtifacts" type="tImplementationArtifacts" minOccurs="0"/>
+ <xs:element name="DeploymentArtifacts" type="tDeploymentArtifacts" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:NCName" use="required"/>
+ <xs:attribute name="targetNamespace" type="xs:anyURI" use="optional"/>
+ <xs:attribute name="nodeType" type="xs:QName" use="required"/>
+ <xs:attribute name="abstract" type="tBoolean" use="optional" default="no"/>
+ <xs:attribute name="final" type="tBoolean" use="optional" default="no"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tRequirementType">
+ <xs:complexContent>
+ <xs:extension base="tEntityType">
+ <xs:attribute name="requiredCapabilityType" type="xs:QName" use="optional"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tRequirementDefinition">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:sequence>
+ <xs:element name="Constraints" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Constraint" type="tConstraint" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:string" use="required"/>
+ <xs:attribute name="requirementType" type="xs:QName" use="required"/>
+ <xs:attribute name="lowerBound" type="xs:int" use="optional" default="1"/>
+ <xs:attribute name="upperBound" use="optional" default="1">
+ <xs:simpleType>
+ <xs:union>
+ <xs:simpleType>
+ <xs:restriction base="xs:nonNegativeInteger">
+ <xs:pattern value="([1-9]+[0-9]*)"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="unbounded"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:union>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tRequirement">
+ <xs:complexContent>
+ <xs:extension base="tEntityTemplate">
+ <xs:attribute name="name" type="xs:string" use="required"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tCapabilityType">
+ <xs:complexContent>
+ <xs:extension base="tEntityType"/>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tCapabilityDefinition">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:sequence>
+ <xs:element name="Constraints" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Constraint" type="tConstraint" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:string" use="required"/>
+ <xs:attribute name="capabilityType" type="xs:QName" use="required"/>
+ <xs:attribute name="lowerBound" type="xs:int" use="optional" default="1"/>
+ <xs:attribute name="upperBound" use="optional" default="1">
+ <xs:simpleType>
+ <xs:union>
+ <xs:simpleType>
+ <xs:restriction base="xs:nonNegativeInteger">
+ <xs:pattern value="([1-9]+[0-9]*)"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="unbounded"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:union>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tCapability">
+ <xs:complexContent>
+ <xs:extension base="tEntityTemplate">
+ <xs:attribute name="name" type="xs:string" use="required"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tArtifactType">
+ <xs:complexContent>
+ <xs:extension base="tEntityType"/>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tArtifactTemplate">
+ <xs:complexContent>
+ <xs:extension base="tEntityTemplate">
+ <xs:sequence>
+ <xs:element name="ArtifactReferences" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ArtifactReference" type="tArtifactReference" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:string" use="optional"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tDeploymentArtifacts">
+ <xs:sequence>
+ <xs:element name="DeploymentArtifact" type="tDeploymentArtifact" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tDeploymentArtifact">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:attribute name="name" type="xs:string" use="required"/>
+ <xs:attribute name="artifactType" type="xs:QName" use="required"/>
+ <xs:attribute name="artifactRef" type="xs:QName" use="optional"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tImplementationArtifacts">
+ <xs:sequence>
+ <xs:element name="ImplementationArtifact" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="tImplementationArtifact"/>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tImplementationArtifact">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:attribute name="name" type="xs:string" use="optional"/>
+ <xs:attribute name="interfaceName" type="xs:anyURI" use="optional"/>
+ <xs:attribute name="operationName" type="xs:NCName" use="optional"/>
+ <xs:attribute name="artifactType" type="xs:QName" use="required"/>
+ <xs:attribute name="artifactRef" type="xs:QName" use="optional"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tPlans">
+ <xs:sequence>
+ <xs:element name="Plan" type="tPlan" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="targetNamespace" type="xs:anyURI" use="optional"/>
+ </xs:complexType>
+ <xs:complexType name="tPlan">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:sequence>
+ <xs:element name="Precondition" type="tCondition" minOccurs="0"/>
+ <xs:element name="InputParameters" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="InputParameter" type="tParameter" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="OutputParameters" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="OutputParameter" type="tParameter" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:choice>
+ <xs:element name="PlanModel">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:any namespace="##other" processContents="lax"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="PlanModelReference">
+ <xs:complexType>
+ <xs:attribute name="reference" type="xs:anyURI" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:ID" use="required"/>
+ <xs:attribute name="name" type="xs:string" use="optional"/>
+ <xs:attribute name="planType" type="xs:anyURI" use="required"/>
+ <xs:attribute name="planLanguage" type="xs:anyURI" use="required"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tPolicyType">
+ <xs:complexContent>
+ <xs:extension base="tEntityType">
+ <xs:sequence>
+ <xs:element name="AppliesTo" type="tAppliesTo" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="policyLanguage" type="xs:anyURI" use="optional"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tPolicyTemplate">
+ <xs:complexContent>
+ <xs:extension base="tEntityTemplate">
+ <xs:attribute name="name" type="xs:string" use="optional"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tAppliesTo">
+ <xs:sequence>
+ <xs:element name="NodeTypeReference" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="typeRef" type="xs:QName" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tPolicy">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:attribute name="name" type="xs:string" use="optional"/>
+ <xs:attribute name="policyType" type="xs:QName" use="required"/>
+ <xs:attribute name="policyRef" type="xs:QName" use="optional"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tConstraint">
+ <xs:sequence>
+ <xs:any namespace="##other" processContents="lax"/>
+ </xs:sequence>
+ <xs:attribute name="constraintType" type="xs:anyURI" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="tPropertyConstraint">
+ <xs:complexContent>
+ <xs:extension base="tConstraint">
+ <xs:attribute name="property" type="xs:string" use="required"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tExtensions">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:sequence>
+ <xs:element name="Extension" type="tExtension" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tExtension">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:attribute name="namespace" type="xs:anyURI" use="required"/>
+ <xs:attribute name="mustUnderstand" type="tBoolean" use="optional" default="yes"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tParameter">
+ <xs:attribute name="name" type="xs:string" use="required"/>
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ <xs:attribute name="required" type="tBoolean" use="optional" default="yes"/>
+ </xs:complexType>
+ <xs:complexType name="tInterface">
+ <xs:sequence>
+ <xs:element name="Operation" type="tOperation" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:anyURI" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="tExportedInterface">
+ <xs:sequence>
+ <xs:element name="Operation" type="tExportedOperation" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:anyURI" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="tOperation">
+ <xs:complexContent>
+ <xs:extension base="tExtensibleElements">
+ <xs:sequence>
+ <xs:element name="InputParameters" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="InputParameter" type="tParameter" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="OutputParameters" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="OutputParameter" type="tParameter" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:NCName" use="required"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="tExportedOperation">
+ <xs:choice>
+ <xs:element name="NodeOperation">
+ <xs:complexType>
+ <xs:attribute name="nodeRef" type="xs:IDREF" use="required"/>
+ <xs:attribute name="interfaceName" type="xs:anyURI" use="required"/>
+ <xs:attribute name="operationName" type="xs:NCName" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="RelationshipOperation">
+ <xs:complexType>
+ <xs:attribute name="relationshipRef" type="xs:IDREF" use="required"/>
+ <xs:attribute name="interfaceName" type="xs:anyURI" use="required"/>
+ <xs:attribute name="operationName" type="xs:NCName" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Plan">
+ <xs:complexType>
+ <xs:attribute name="planRef" type="xs:IDREF" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:choice>
+ <xs:attribute name="name" type="xs:NCName" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="tCondition">
+ <xs:sequence>
+ <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="expressionLanguage" type="xs:anyURI" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="tTopologyElementInstanceStates">
+ <xs:sequence>
+ <xs:element name="InstanceState" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="state" type="xs:anyURI" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tArtifactReference">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="Include">
+ <xs:complexType>
+ <xs:attribute name="pattern" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Exclude">
+ <xs:complexType>
+ <xs:attribute name="pattern" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:choice>
+ <xs:attribute name="reference" type="xs:anyURI" use="required"/>
+ </xs:complexType>
+ <xs:complexType name="tRequiredContainerFeatures">
+ <xs:sequence>
+ <xs:element name="RequiredContainerFeature" type="tRequiredContainerFeature" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tRequiredContainerFeature">
+ <xs:attribute name="feature" type="xs:anyURI" use="required"/>
+ </xs:complexType>
+ <xs:simpleType name="tBoolean">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="yes"/>
+ <xs:enumeration value="no"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="importedURI">
+ <xs:restriction base="xs:anyURI"/>
+ </xs:simpleType>
+</xs:schema>
diff --git a/winery/org.eclipse.winery.repository.client/src/test/java/META-INF/MANIFEST.MF b/winery/org.eclipse.winery.repository.client/src/test/java/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..254272e
--- /dev/null
+++ b/winery/org.eclipse.winery.repository.client/src/test/java/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path:
+
diff --git a/winery/org.eclipse.winery.repository.client/src/test/java/org/eclipse/winery/repository/client/TestWineryRepositoryClient.java b/winery/org.eclipse.winery.repository.client/src/test/java/org/eclipse/winery/repository/client/TestWineryRepositoryClient.java
new file mode 100644
index 0000000..77ab588
--- /dev/null
+++ b/winery/org.eclipse.winery.repository.client/src/test/java/org/eclipse/winery/repository/client/TestWineryRepositoryClient.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2012-2013 University of Stuttgart.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and the Apache License 2.0 which both accompany this distribution,
+ * and are available at http://www.eclipse.org/legal/epl-v10.html
+ * and http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Contributors:
+ * Oliver Kopp - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.winery.repository.client;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.eclipse.winery.model.tosca.TDefinitions;
+import org.eclipse.winery.model.tosca.TEntityTemplate;
+import org.eclipse.winery.model.tosca.TNodeType;
+import org.eclipse.winery.model.tosca.TRelationshipType;
+import org.eclipse.winery.model.tosca.TTopologyTemplate;
+import org.eclipse.winery.common.ids.definitions.ArtifactTemplateId;
+import org.eclipse.winery.common.interfaces.QNameAlreadyExistsException;
+
+/**
+ * Tests client methods with a pre-configured client stored in a local static
+ * field.
+ *
+ * Client creation and multiple repositories are not tested. This should be
+ * subject to other test classes.
+ *
+ * TODO: This class expects things to be existent in the namespace "test". This
+ * should be enforced in a preload.
+ */
+@RunWith(JUnit4.class)
+public class TestWineryRepositoryClient {
+
+ // private final String repositoryURI = "http://2471.de:8080/wineydev";
+ private static final String repositoryURI = "http://localhost:8080/winery";
+
+ private static final boolean USE_PROXY = true;
+
+ private static final IWineryRepositoryClient client = new WineryRepositoryClient(TestWineryRepositoryClient.USE_PROXY);
+ static {
+ TestWineryRepositoryClient.client.addRepository(TestWineryRepositoryClient.repositoryURI);
+ }
+
+ /**
+ * The namespace to put new things in. <br />
+ * TODO: Is deleted completely after testing
+ */
+ private static final String namespaceForNewArtifacts = "http://www.example.org/test/wineryclient/";
+
+
+ @Test
+ public void getAllNodeTypes() {
+ Collection<TNodeType> allTypes = TestWineryRepositoryClient.client.getAllTypes(TNodeType.class);
+ for (TNodeType type : allTypes) {
+ Assert.assertNotNull("name is null", type.getName());
+ Assert.assertNotNull("target namespace is null", type.getTargetNamespace());
+ }
+ }
+
+ @Test
+ public void getAllRelationshipTypes() {
+ Collection<TRelationshipType> allTypes = TestWineryRepositoryClient.client.getAllTypes(TRelationshipType.class);
+ for (TRelationshipType type : allTypes) {
+ Assert.assertNotNull("name is null", type.getName());
+ Assert.assertNotNull("target namespace is null", type.getTargetNamespace());
+ }
+ }
+
+ @Test
+ public void getAllNodeTypesWithAssociatedElements() {
+ Collection<TDefinitions> allTypes = TestWineryRepositoryClient.client.getAllTypesWithAssociatedElements(TNodeType.class);
+ Assert.assertNotNull(allTypes);
+ }
+
+ @Test
+ public void getAllRelationshipTypesWithAssociatedElements() {
+ Collection<TDefinitions> allTypes = TestWineryRepositoryClient.client.getAllTypesWithAssociatedElements(TRelationshipType.class);
+ Assert.assertNotNull(allTypes);
+ }
+
+ @Test
+ public void getPropertiesOfAllNodeTypes() {
+ // TODO
+ }
+
+ @Test
+ public void getPropertiesOfAllRelationshipTypes() {
+ // TODO
+ }
+
+ @Test
+ public void getTestTopologyTemplate() {
+ QName serviceTemplate = new QName("test", "test");
+ TTopologyTemplate topologyTemplate = TestWineryRepositoryClient.client.getTopologyTemplate(serviceTemplate);
+ Assert.assertNotNull(topologyTemplate);
+ }
+
+ @Test
+ public void getPropertiesOfTestTopologyTemplate() {
+ QName serviceTemplate = new QName("test", "test");
+ TTopologyTemplate topologyTemplate = TestWineryRepositoryClient.client.getTopologyTemplate(serviceTemplate);
+ Assert.assertNotNull(topologyTemplate);
+ List<TEntityTemplate> allTemplates = topologyTemplate.getNodeTemplateOrRelationshipTemplate();
+ for (TEntityTemplate e : allTemplates) {
+ // TODO
+ }
+ }
+
+ @Test
+ public void artifactTypeForWARfiles() {
+ QName artifactType = TestWineryRepositoryClient.client.getArtifactTypeQNameForExtension("war");
+ Assert.assertNotNull("Artifact Type for .war does not exist", artifactType);
+ }
+
+ @Test
+ public void createArtifactTemplate() throws IOException, QNameAlreadyExistsException {
+ // assure that the artifact type exists
+ QName artifactTypeQName = TestWineryRepositoryClient.client.getArtifactTypeQNameForExtension("war");
+ Assert.assertNotNull("Artifact Type for .war does not exist", artifactTypeQName);
+
+ // assure that the artifact template does not yet exist
+ // one possibility is to delete the artifact template, the other
+ // possibility is to
+
+ QName artifactTemplateQName = new QName(TestWineryRepositoryClient.namespaceForNewArtifacts, "artifactTemplate");
+ ArtifactTemplateId atId = new ArtifactTemplateId(artifactTemplateQName);
+
+ // ensure that the template does not exist yet
+ TestWineryRepositoryClient.client.forceDelete(atId);
+
+ TestWineryRepositoryClient.client.createArtifactTemplate(artifactTemplateQName, artifactTypeQName);
+ }
+}