├── src
└── main
│ ├── resources
│ ├── com
│ │ └── applatix
│ │ │ └── jenkins
│ │ │ └── applatixplugin
│ │ │ └── ApplatixPlugin
│ │ │ ├── help-axPassword.html
│ │ │ ├── help-axUsername.html
│ │ │ ├── help-axServiceTemplateBranch.html
│ │ │ ├── help-axServiceTemplateRepository.html
│ │ │ ├── help-axUrl.html
│ │ │ ├── help-axServiceTemplateParameters.html
│ │ │ └── config.jelly
│ └── index.jelly
│ └── java
│ └── com
│ └── applatix
│ └── jenkins
│ └── applatixplugin
│ ├── LoggingHelper.java
│ ├── ApplatixHelper.java
│ └── ApplatixPlugin.java
├── README.md
├── pom.xml
├── LICENSE
└── applatix.iml
/src/main/resources/com/applatix/jenkins/applatixplugin/ApplatixPlugin/help-axPassword.html:
--------------------------------------------------------------------------------
1 |
2 | Applatix credential: password
3 |
4 |
--------------------------------------------------------------------------------
/src/main/resources/com/applatix/jenkins/applatixplugin/ApplatixPlugin/help-axUsername.html:
--------------------------------------------------------------------------------
1 |
2 | Applatix credential: username
3 |
4 |
--------------------------------------------------------------------------------
/src/main/resources/index.jelly:
--------------------------------------------------------------------------------
1 |
2 |
3 | This plugin allows you to run jobs on Applatix system
4 |
5 |
--------------------------------------------------------------------------------
/src/main/resources/com/applatix/jenkins/applatixplugin/ApplatixPlugin/help-axServiceTemplateBranch.html:
--------------------------------------------------------------------------------
1 |
2 | The branch where your Service Template is.
3 |
4 |
--------------------------------------------------------------------------------
/src/main/resources/com/applatix/jenkins/applatixplugin/ApplatixPlugin/help-axServiceTemplateRepository.html:
--------------------------------------------------------------------------------
1 |
2 | The repository where your Service Template is.
3 |
4 |
--------------------------------------------------------------------------------
/src/main/resources/com/applatix/jenkins/applatixplugin/ApplatixPlugin/help-axUrl.html:
--------------------------------------------------------------------------------
1 |
2 | The URL of Applatix system. For example:
3 | https://applatix.yourcompany.com
4 |
5 |
--------------------------------------------------------------------------------
/src/main/resources/com/applatix/jenkins/applatixplugin/ApplatixPlugin/help-axServiceTemplateParameters.html:
--------------------------------------------------------------------------------
1 |
2 | The parameters of your Service Template at Applatix system.
3 | It is optional.
4 | It is in JSON format, for example:
5 |
6 | {"service": "service_name",
7 | "iterations": 3
8 | }
9 |
10 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## Applatix Plugin for Jenkins
2 |
3 | ### General
4 | The Applatix plugin integrates Applatix with Jenkins to launch container-native workflows in public cloud.
5 | For more information please visit the [Applatix Plugin - Jenkins Wiki](http://wiki.jenkins-ci.org/display/JENKINS/Applatix+Plugin)
6 |
7 | ### How to Contribute
8 | Applatix welcomes community contribution through pull requests.
9 |
10 | #### Important:
11 | The plugin code is stored in github repository:
12 | https://github.com/jenkinsci/applatix-plugin
13 |
14 | Please make sure to submit pull requests to Applatix only.
15 |
16 | ### How to build the plugin code
17 | To build the plugin, please use Maven with JDK 8 and run:
18 | ```console
19 | > mvn clean install
20 | ```
21 | ### License
22 | This plugin is licensed under Apache 2.0. See the LICENSE file for more information.
23 |
--------------------------------------------------------------------------------
/src/main/java/com/applatix/jenkins/applatixplugin/LoggingHelper.java:
--------------------------------------------------------------------------------
1 | package com.applatix.jenkins.applatixplugin;
2 |
3 | import hudson.model.TaskListener;
4 |
5 | public class LoggingHelper {
6 |
7 | public static void log(final TaskListener listener, String message) {
8 | log(listener, message, null);
9 | }
10 |
11 | public static void log(final TaskListener listener, String message, String secondary) {
12 | String completeMessage;
13 | if(secondary == null || secondary.isEmpty()) {
14 | completeMessage = "[Applatix Plugin] " + message;
15 | } else {
16 | completeMessage = "[Applatix Plugin] " + message + "\n> " + secondary;
17 | }
18 |
19 | if(listener == null) {
20 | System.out.println(message);
21 | } else {
22 | listener.getLogger().println(completeMessage);
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/resources/com/applatix/jenkins/applatixplugin/ApplatixPlugin/config.jelly:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
34 |
35 |
36 |
37 | | ${%Key} |
38 |
39 |
40 | |
41 | ${%Value} |
42 |
43 |
44 | |
45 | |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 4.0.0
4 |
5 |
6 | org.jenkins-ci.plugins
7 | plugin
8 | 2.11
9 |
10 | com.applatix.jenkins
11 | applatix
12 | 1.2-SNAPSHOT
13 | hpi
14 |
15 |
16 | 1.625.3
17 | 7
18 | 2.13
19 |
20 |
21 | Applatix
22 | Integrates Applatix System to Jenkins
23 | https://wiki.jenkins-ci.org/display/JENKINS/Applatix+Plugin
24 |
25 |
26 |
27 | edlee2121
28 | Ed Lee
29 | elee@applatix.com
30 |
31 |
32 |
33 |
34 |
35 | Apache License, Version 2.0
36 | http://www.apache.org/licenses/LICENSE-2.0.txt
37 | repo
38 |
39 |
40 |
41 |
42 |
43 | scm:git:git://github.com/jenkinsci/applatix-plugin.git
44 | scm:git:git@github.com:jenkinsci/applatix-plugin.git
45 | http://github.com/jenkinsci/applatix-plugin
46 | applatix-1.0
47 |
48 |
49 |
50 |
51 | repo.jenkins-ci.org
52 | https://repo.jenkins-ci.org/public/
53 |
54 |
55 |
56 |
57 | repo.jenkins-ci.org
58 | https://repo.jenkins-ci.org/public/
59 |
60 |
61 |
62 |
63 |
64 | org.apache.httpcomponents
65 | httpclient
66 | 4.3.6
67 |
68 |
69 | org.apache.httpcomponents
70 | httpasyncclient
71 | 4.0.2
72 |
73 |
74 | org.apache.httpcomponents
75 | httpmime
76 | 4.3.6
77 |
78 |
79 | org.json
80 | json
81 | 20140107
82 |
83 |
84 | com.mashape.unirest
85 | unirest-java
86 | 1.4.9
87 |
88 |
89 |
90 | org.jenkins-ci
91 | symbol-annotation
92 | 1.1
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
--------------------------------------------------------------------------------
/src/main/java/com/applatix/jenkins/applatixplugin/ApplatixHelper.java:
--------------------------------------------------------------------------------
1 | package com.applatix.jenkins.applatixplugin;
2 |
3 | import com.mashape.unirest.http.HttpResponse;
4 | import com.mashape.unirest.http.JsonNode;
5 | import com.mashape.unirest.http.Unirest;
6 | import hudson.model.TaskListener;
7 | import java.lang.Exception;
8 | import java.lang.String;
9 | import java.util.Map;
10 | import javax.net.ssl.SSLContext;
11 | import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
12 | import org.apache.http.conn.ssl.SSLContexts;
13 | import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
14 | import org.apache.http.impl.client.HttpClients;
15 | import org.apache.http.impl.client.CloseableHttpClient;
16 | import org.json.JSONArray;
17 | import org.json.JSONObject;
18 |
19 | public class ApplatixHelper {
20 |
21 | private String axUrl;
22 | private String axUsername;
23 | private String axPassword;
24 | private TaskListener listener;
25 |
26 | private static final String version = "v1";
27 | private static final String loginPath = "/" + version + "/auth/login";
28 | private static final String templatesPath = "/" + version + "/templates";
29 | private static final String servicesPath = "/" + version + "/services";
30 |
31 | public ApplatixHelper(String axUrl, String axUsername, String axPassword, TaskListener listener) {
32 | this.axUrl = axUrl;
33 | this.axUsername = axUsername;
34 | this.axPassword = axPassword;
35 | this.listener = listener;
36 |
37 | try {
38 | SSLContext sslcontext = SSLContexts.custom().
39 | loadTrustMaterial(null, new TrustSelfSignedStrategy()).
40 | build();
41 | SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,
42 | SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
43 | CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
44 | Unirest.setHttpClient(httpclient);
45 | } catch (Exception e) {
46 | LoggingHelper.log(this.listener, e.getMessage());
47 | throw new RuntimeException(e);
48 | }
49 |
50 | try {
51 | login();
52 | } catch (Exception e) {
53 | LoggingHelper.log(this.listener, "Fail to login Applatix system, please check your credential.");
54 | LoggingHelper.log(this.listener, e.getMessage());
55 | throw new RuntimeException(e);
56 | }
57 | }
58 |
59 | public void login() {
60 | JSONObject credential = new JSONObject();
61 | try {
62 | credential.put("username", this.axUsername);
63 | credential.put("password", this.axPassword);
64 | }
65 | catch (org.json.JSONException e) {
66 | throw new Error("Fail to parse credential");
67 | }
68 |
69 | try {
70 | HttpResponse loginResponse = Unirest.post(this.axUrl + loginPath)
71 | .body(credential)
72 | .asJson();
73 | if (loginResponse.getStatus() > 200 || loginResponse.getStatus() < 200) {
74 | throw new Exception(loginResponse.getBody().toString());
75 | }
76 | } catch (Exception e) {
77 | LoggingHelper.log(this.listener, e.getMessage());
78 | throw new RuntimeException(e);
79 | }
80 | }
81 |
82 | public String getServiceTemplateId(String repo, String branch, String serviceTemplateName) {
83 | try {
84 | HttpResponse getServiceTemplateResponse = Unirest.get(this.axUrl + templatesPath)
85 | .header("accept", "application/json")
86 | .queryString("repo", repo)
87 | .queryString("branch", branch)
88 | .queryString("name", serviceTemplateName)
89 | .asJson();
90 | JSONArray serviceTemplates = getServiceTemplateResponse.getBody().getObject().getJSONArray("data");
91 | if (serviceTemplates == null) {
92 | throw new Exception("No service template " + serviceTemplateName + " found.");
93 | } else {
94 | return serviceTemplates.getJSONObject(0).getString("id");
95 | }
96 | } catch (Exception e) {
97 | LoggingHelper.log(this.listener, e.getMessage());
98 | throw new RuntimeException(e);
99 | }
100 | }
101 |
102 | public String createService(String id, Map parameters) {
103 | JSONObject serviceBody = new JSONObject();
104 | JSONObject parametersJson = new JSONObject();
105 | for(Map.Entry entry: parameters.entrySet()) {
106 | try {
107 | parametersJson.put(entry.getKey(), entry.getValue());
108 | }
109 | catch (org.json.JSONException e) {
110 | throw new Error("Fail to parse the parameters");
111 | }
112 | }
113 |
114 | try {
115 | serviceBody.put("template_id", id);
116 | serviceBody.put("parameters", parametersJson);
117 | LoggingHelper.log(this.listener, "Service Request: " + serviceBody.toString());
118 | } catch (Exception e) {
119 | LoggingHelper.log(this.listener, e.getMessage());
120 | throw new RuntimeException(e);
121 | }
122 |
123 | try {
124 | HttpResponse createServiceResponse = Unirest.post(this.axUrl + servicesPath)
125 | .header("accept", "application/json")
126 | .body(serviceBody)
127 | .asJson();
128 | if (createServiceResponse.getStatus() >= 300 || createServiceResponse.getStatus() < 200) {
129 | throw new Exception(createServiceResponse.getBody().toString());
130 | } else {
131 | String serviceId = createServiceResponse.getBody().getObject().getString("id");
132 | return serviceId;
133 | }
134 | } catch (Exception e) {
135 | LoggingHelper.log(this.listener, e.getMessage());
136 | throw new RuntimeException(e);
137 | }
138 | }
139 |
140 | public int getServiceStatus(String serviceId) {
141 | try {
142 | HttpResponse getServiceStatusResponse = Unirest.get(this.axUrl + servicesPath + "/" + serviceId)
143 | .header("accept", "application/json")
144 | .asJson();
145 | if (getServiceStatusResponse.getStatus() >= 300 || getServiceStatusResponse.getStatus() < 200) {
146 | LoggingHelper.log(this.listener, "Could not find the task");
147 | throw new Exception(getServiceStatusResponse.getBody().toString());
148 | } else {
149 | return getServiceStatusResponse.getBody().getObject().getInt("status");
150 | }
151 | } catch (Exception e) {
152 | LoggingHelper.log(this.listener, e.getMessage());
153 | throw new RuntimeException(e);
154 | }
155 | }
156 | }
157 |
--------------------------------------------------------------------------------
/src/main/java/com/applatix/jenkins/applatixplugin/ApplatixPlugin.java:
--------------------------------------------------------------------------------
1 | package com.applatix.jenkins.applatixplugin;
2 |
3 | import hudson.Launcher;
4 | import hudson.Extension;
5 | import hudson.FilePath;
6 | import hudson.model.*;
7 | import hudson.tasks.Builder;
8 | import hudson.tasks.BuildStepDescriptor;
9 | import java.io.IOException;
10 | import java.util.HashMap;
11 | import java.util.List;
12 | import java.util.Map;
13 | import jenkins.tasks.SimpleBuildStep;
14 | import net.sf.json.JSONObject;
15 | import org.jenkinsci.Symbol;
16 | import org.kohsuke.stapler.DataBoundConstructor;
17 | import org.kohsuke.stapler.StaplerRequest;
18 |
19 |
20 | public class ApplatixPlugin extends Builder implements SimpleBuildStep {
21 | private final String axUrl;
22 | private final String axUsername;
23 | private final String axPassword;
24 | private final String axServiceTemplateName;
25 | private final String axServiceTemplateRepository;
26 | private final String axServiceTemplateBranch;
27 | private final List axServiceTemplateParameters;
28 |
29 | public static final String configuredImproperlyError = "Applatix configured improperly in project settings \n";
30 |
31 | public String getAxUrl() { return axUrl; }
32 | public String getAxUsername() { return axUsername; }
33 | public String getAxPassword() { return axPassword; }
34 | public String getAxServiceTemplateName() { return axServiceTemplateName; }
35 | public String getAxServiceTemplateRepository() { return axServiceTemplateRepository; }
36 | public String getAxServiceTemplateBranch() { return axServiceTemplateBranch; }
37 | public List getAxServiceTemplateParameters() { return axServiceTemplateParameters; }
38 |
39 | @DataBoundConstructor
40 | public ApplatixPlugin(String axUrl, String axUsername, String axPassword, String axServiceTemplateName,
41 | String axServiceTemplateRepository, String axServiceTemplateBranch,
42 | List axServiceTemplateParameters) throws InterruptedException, IOException {
43 | this.axUrl = axUrl;
44 | this.axUsername = axUsername;
45 | this.axPassword = axPassword;
46 | this.axServiceTemplateName = axServiceTemplateName;
47 | this.axServiceTemplateRepository = axServiceTemplateRepository;
48 | this.axServiceTemplateBranch = axServiceTemplateBranch;
49 | this.axServiceTemplateParameters = axServiceTemplateParameters;
50 | }
51 |
52 | @Override
53 | public void perform(Run,?> build, FilePath workspace, Launcher launcher, TaskListener listener) throws InterruptedException, IOException {
54 | Map parameters = new HashMap();
55 | parameters.put("session.repo", this.axServiceTemplateRepository);
56 | parameters.put("session.commit", this.axServiceTemplateBranch);
57 | if (this.axServiceTemplateParameters != null) {
58 | for (KeyValuePair para : this.axServiceTemplateParameters) {
59 | parameters.put(para.key, para.value);
60 | }
61 | }
62 | LoggingHelper.log(listener, "Service Template: " + this.axServiceTemplateName);
63 | final ApplatixHelper axHelper;
64 | try {
65 | axHelper = new ApplatixHelper(this.axUrl, this.axUsername, this.axPassword, listener);
66 | } catch (Exception e) {
67 | LoggingHelper.log(listener, configuredImproperlyError, e.getMessage());
68 | build.setResult(Result.FAILURE);
69 | return;
70 | }
71 |
72 | final String serviceId;
73 | try {
74 | String serviceTemplateId = axHelper.getServiceTemplateId(this.axServiceTemplateRepository,
75 | this.axServiceTemplateBranch, this.axServiceTemplateName);
76 | if (serviceTemplateId == null) {
77 | LoggingHelper.log(listener, "Could not get service template " + this.axServiceTemplateName);
78 | build.setResult(Result.FAILURE);
79 | return;
80 | }
81 | LoggingHelper.log(listener, "Service Template ID: " + serviceTemplateId);
82 | serviceId = axHelper.createService(serviceTemplateId, parameters);
83 | if (serviceId == null) {
84 | LoggingHelper.log(listener, "Fail to start a task on Applatix");
85 | build.setResult(Result.FAILURE);
86 | return;
87 | } else {
88 | LoggingHelper.log(listener, "Task starts ...");
89 | }
90 | } catch (Exception e) {
91 | LoggingHelper.log(listener, e.getMessage());
92 | build.setResult(Result.FAILURE);
93 | return;
94 | }
95 | LoggingHelper.log(listener, "The task URL on Applatix:");
96 | LoggingHelper.log(listener, this.axUrl + "/app/jobs/job-details/" + serviceId);
97 |
98 | do {
99 | Thread.sleep(5000L);
100 | } while(axHelper.getServiceStatus(serviceId) == 1 || axHelper.getServiceStatus(serviceId) == 2 || axHelper.getServiceStatus(serviceId) == 255);
101 |
102 | int serviceStatusInt = axHelper.getServiceStatus(serviceId);
103 | LoggingHelper.log(listener, "Task Complete");
104 | if (serviceStatusInt == 0) {
105 | return;
106 | } else {
107 | build.setResult(Result.FAILURE);
108 | return;
109 | }
110 | }
111 |
112 | /**
113 | * Represents parameters key/value entries defined by users in their jobs.
114 | */
115 | public static class KeyValuePair implements Cloneable {
116 |
117 | private final String key;
118 | private final String value;
119 |
120 | @DataBoundConstructor
121 | public KeyValuePair(String key, String value) {
122 | this.key = key;
123 | this.value = value;
124 | }
125 |
126 | @Override
127 | public Object clone() {
128 | try {
129 | return super.clone();
130 | }
131 | catch (CloneNotSupportedException e) {
132 | throw new Error("Something impossible just happened");
133 | }
134 | }
135 |
136 | @Override
137 | public boolean equals(Object obj) {
138 | if(obj == null) {
139 | return false;
140 | }
141 | if(getClass() != obj.getClass()) {
142 | return false;
143 | }
144 | final KeyValuePair other = (KeyValuePair) obj;
145 | if((this.key == null) ? (other.key != null) : !this.key.equals(other.key)) {
146 | return false;
147 | }
148 | return true;
149 | }
150 |
151 | public String getKey() {
152 | return key;
153 | }
154 |
155 | public String getValue() {
156 | return value;
157 | }
158 |
159 | @Override
160 | public int hashCode() {
161 | int hash = 3;
162 | hash = 67 * hash + (this.key != null ? this.key.hashCode() : 0);
163 | return hash;
164 | }
165 | }
166 |
167 | // Overridden for better type safety.
168 | @Override
169 | public DescriptorImpl getDescriptor() {
170 | return (DescriptorImpl) super.getDescriptor();
171 | }
172 |
173 | /**
174 | * Descriptor for ApplatixPlugin. Used as a singleton.
175 | * The class is marked as public so that it can be accessed from views.
176 | */
177 | @Symbol("applatix")
178 | @Extension
179 | public static final class DescriptorImpl extends BuildStepDescriptor {
180 |
181 | public DescriptorImpl() {
182 | load();
183 | }
184 |
185 | public boolean isApplicable(Class extends AbstractProject> aClass) {
186 | // Indicates that this builder can be used with all kinds of project types
187 | return true;
188 | }
189 |
190 | @Override
191 | public boolean configure(StaplerRequest req, JSONObject formData) throws FormException {
192 | // To persist global configuration information,
193 | // set that to properties and call save().
194 |
195 | req.bindJSON(this, formData);
196 | save();
197 |
198 | return super.configure(req,formData);
199 | }
200 |
201 | public String getDisplayName() {
202 | return "Applatix System Integration";
203 | }
204 | }
205 | }
206 |
207 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 |
2 | Apache License
3 | Version 2.0, January 2004
4 | http://www.apache.org/licenses/
5 |
6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7 |
8 | 1. Definitions.
9 |
10 | "License" shall mean the terms and conditions for use, reproduction,
11 | and distribution as defined by Sections 1 through 9 of this document.
12 |
13 | "Licensor" shall mean the copyright owner or entity authorized by
14 | the copyright owner that is granting the License.
15 |
16 | "Legal Entity" shall mean the union of the acting entity and all
17 | other entities that control, are controlled by, or are under common
18 | control with that entity. For the purposes of this definition,
19 | "control" means (i) the power, direct or indirect, to cause the
20 | direction or management of such entity, whether by contract or
21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
22 | outstanding shares, or (iii) beneficial ownership of such entity.
23 |
24 | "You" (or "Your") shall mean an individual or Legal Entity
25 | exercising permissions granted by this License.
26 |
27 | "Source" form shall mean the preferred form for making modifications,
28 | including but not limited to software source code, documentation
29 | source, and configuration files.
30 |
31 | "Object" form shall mean any form resulting from mechanical
32 | transformation or translation of a Source form, including but
33 | not limited to compiled object code, generated documentation,
34 | and conversions to other media types.
35 |
36 | "Work" shall mean the work of authorship, whether in Source or
37 | Object form, made available under the License, as indicated by a
38 | copyright notice that is included in or attached to the work
39 | (an example is provided in the Appendix below).
40 |
41 | "Derivative Works" shall mean any work, whether in Source or Object
42 | form, that is based on (or derived from) the Work and for which the
43 | editorial revisions, annotations, elaborations, or other modifications
44 | represent, as a whole, an original work of authorship. For the purposes
45 | of this License, Derivative Works shall not include works that remain
46 | separable from, or merely link (or bind by name) to the interfaces of,
47 | the Work and Derivative Works thereof.
48 |
49 | "Contribution" shall mean any work of authorship, including
50 | the original version of the Work and any modifications or additions
51 | to that Work or Derivative Works thereof, that is intentionally
52 | submitted to Licensor for inclusion in the Work by the copyright owner
53 | or by an individual or Legal Entity authorized to submit on behalf of
54 | the copyright owner. For the purposes of this definition, "submitted"
55 | means any form of electronic, verbal, or written communication sent
56 | to the Licensor or its representatives, including but not limited to
57 | communication on electronic mailing lists, source code control systems,
58 | and issue tracking systems that are managed by, or on behalf of, the
59 | Licensor for the purpose of discussing and improving the Work, but
60 | excluding communication that is conspicuously marked or otherwise
61 | designated in writing by the copyright owner as "Not a Contribution."
62 |
63 | "Contributor" shall mean Licensor and any individual or Legal Entity
64 | on behalf of whom a Contribution has been received by Licensor and
65 | subsequently incorporated within the Work.
66 |
67 | 2. Grant of Copyright License. Subject to the terms and conditions of
68 | this License, each Contributor hereby grants to You a perpetual,
69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70 | copyright license to reproduce, prepare Derivative Works of,
71 | publicly display, publicly perform, sublicense, and distribute the
72 | Work and such Derivative Works in Source or Object form.
73 |
74 | 3. Grant of Patent License. Subject to the terms and conditions of
75 | this License, each Contributor hereby grants to You a perpetual,
76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77 | (except as stated in this section) patent license to make, have made,
78 | use, offer to sell, sell, import, and otherwise transfer the Work,
79 | where such license applies only to those patent claims licensable
80 | by such Contributor that are necessarily infringed by their
81 | Contribution(s) alone or by combination of their Contribution(s)
82 | with the Work to which such Contribution(s) was submitted. If You
83 | institute patent litigation against any entity (including a
84 | cross-claim or counterclaim in a lawsuit) alleging that the Work
85 | or a Contribution incorporated within the Work constitutes direct
86 | or contributory patent infringement, then any patent licenses
87 | granted to You under this License for that Work shall terminate
88 | as of the date such litigation is filed.
89 |
90 | 4. Redistribution. You may reproduce and distribute copies of the
91 | Work or Derivative Works thereof in any medium, with or without
92 | modifications, and in Source or Object form, provided that You
93 | meet the following conditions:
94 |
95 | (a) You must give any other recipients of the Work or
96 | Derivative Works a copy of this License; and
97 |
98 | (b) You must cause any modified files to carry prominent notices
99 | stating that You changed the files; and
100 |
101 | (c) You must retain, in the Source form of any Derivative Works
102 | that You distribute, all copyright, patent, trademark, and
103 | attribution notices from the Source form of the Work,
104 | excluding those notices that do not pertain to any part of
105 | the Derivative Works; and
106 |
107 | (d) If the Work includes a "NOTICE" text file as part of its
108 | distribution, then any Derivative Works that You distribute must
109 | include a readable copy of the attribution notices contained
110 | within such NOTICE file, excluding those notices that do not
111 | pertain to any part of the Derivative Works, in at least one
112 | of the following places: within a NOTICE text file distributed
113 | as part of the Derivative Works; within the Source form or
114 | documentation, if provided along with the Derivative Works; or,
115 | within a display generated by the Derivative Works, if and
116 | wherever such third-party notices normally appear. The contents
117 | of the NOTICE file are for informational purposes only and
118 | do not modify the License. You may add Your own attribution
119 | notices within Derivative Works that You distribute, alongside
120 | or as an addendum to the NOTICE text from the Work, provided
121 | that such additional attribution notices cannot be construed
122 | as modifying the License.
123 |
124 | You may add Your own copyright statement to Your modifications and
125 | may provide additional or different license terms and conditions
126 | for use, reproduction, or distribution of Your modifications, or
127 | for any such Derivative Works as a whole, provided Your use,
128 | reproduction, and distribution of the Work otherwise complies with
129 | the conditions stated in this License.
130 |
131 | 5. Submission of Contributions. Unless You explicitly state otherwise,
132 | any Contribution intentionally submitted for inclusion in the Work
133 | by You to the Licensor shall be under the terms and conditions of
134 | this License, without any additional terms or conditions.
135 | Notwithstanding the above, nothing herein shall supersede or modify
136 | the terms of any separate license agreement you may have executed
137 | with Licensor regarding such Contributions.
138 |
139 | 6. Trademarks. This License does not grant permission to use the trade
140 | names, trademarks, service marks, or product names of the Licensor,
141 | except as required for reasonable and customary use in describing the
142 | origin of the Work and reproducing the content of the NOTICE file.
143 |
144 | 7. Disclaimer of Warranty. Unless required by applicable law or
145 | agreed to in writing, Licensor provides the Work (and each
146 | Contributor provides its Contributions) on an "AS IS" BASIS,
147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148 | implied, including, without limitation, any warranties or conditions
149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150 | PARTICULAR PURPOSE. You are solely responsible for determining the
151 | appropriateness of using or redistributing the Work and assume any
152 | risks associated with Your exercise of permissions under this License.
153 |
154 | 8. Limitation of Liability. In no event and under no legal theory,
155 | whether in tort (including negligence), contract, or otherwise,
156 | unless required by applicable law (such as deliberate and grossly
157 | negligent acts) or agreed to in writing, shall any Contributor be
158 | liable to You for damages, including any direct, indirect, special,
159 | incidental, or consequential damages of any character arising as a
160 | result of this License or out of the use or inability to use the
161 | Work (including but not limited to damages for loss of goodwill,
162 | work stoppage, computer failure or malfunction, or any and all
163 | other commercial damages or losses), even if such Contributor
164 | has been advised of the possibility of such damages.
165 |
166 | 9. Accepting Warranty or Additional Liability. While redistributing
167 | the Work or Derivative Works thereof, You may choose to offer,
168 | and charge a fee for, acceptance of support, warranty, indemnity,
169 | or other liability obligations and/or rights consistent with this
170 | License. However, in accepting such obligations, You may act only
171 | on Your own behalf and on Your sole responsibility, not on behalf
172 | of any other Contributor, and only if You agree to indemnify,
173 | defend, and hold each Contributor harmless for any liability
174 | incurred by, or claims asserted against, such Contributor by reason
175 | of your accepting any such warranty or additional liability.
176 |
177 | END OF TERMS AND CONDITIONS
178 |
179 | APPENDIX: How to apply the Apache License to your work.
180 |
181 | To apply the Apache License to your work, attach the following
182 | boilerplate notice, with the fields enclosed by brackets "[]"
183 | replaced with your own identifying information. (Don't include
184 | the brackets!) The text should be enclosed in the appropriate
185 | comment syntax for the file format. We also recommend that a
186 | file or class name and description of purpose be included on the
187 | same "printed page" as the copyright notice for easier
188 | identification within third-party archives.
189 |
190 | Copyright [Applatix]
191 |
192 | Licensed under the Apache License, Version 2.0 (the "License");
193 | you may not use this file except in compliance with the License.
194 | You may obtain a copy of the License at
195 |
196 | http://www.apache.org/licenses/LICENSE-2.0
197 |
198 | Unless required by applicable law or agreed to in writing, software
199 | distributed under the License is distributed on an "AS IS" BASIS,
200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201 | See the License for the specific language governing permissions and
202 | limitations under the License.
203 |
--------------------------------------------------------------------------------
/applatix.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
--------------------------------------------------------------------------------