package org.ecgine.gradle;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.ecgine.gradle.extensions.EcgineExtension;
import org.gradle.api.DefaultTask;
import org.gradle.api.GradleException;
import org.gradle.api.tasks.TaskAction;
import org.json.JSONArray;
import org.json.JSONObject;
/**
*
* create EBundle for each dev-bundle,Calculate all dependencies,Create
* PackageVersion,if fail then Create Package and again Create PackageVersion.
*
* @author lingarao
*
*/
public class EcgineDeployTask extends DefaultTask {
private static final String VERSION = "version";
private static final String PACKAGE_NAME_SPACE = "namespace";
private static final String NAME = "name";
private static final String CATEGORY = "category";
private static final String VERTICALS = "verticals";
private static final String BUNDLES = "bundles";
private static final String BUNLDE_TYPE = "bundletype";
// STATUS'S OF PACKAGE VERSION CREATION
private static final int SUCESS = 1;
private static final int PACKAGE_NOT_FOUND = 2;
private static final int FAILED = 3;
@TaskAction
public void deploy() throws Exception {
EcgineExtension ext = (EcgineExtension) getProject().getExtensions().getByName(EcgineExtension.NAME);
HttpClient client = ext.getHttpClient();
Set<EManifest> projects = EcgineUtils.getAllProjects(getProject(), m -> !m.isUnknown());
Set<Bundle> bundles = EcgineUtils.getBundles(projects, getProject());
projects.forEach(m -> {
try {
createEbundle(client, ext, m);
} catch (Exception e) {
throw new GradleException(e.getMessage(), e);
}
bundles.add(new Bundle(m.getSymbolicName(), m.getVersion(), m.getEcgineBundleType()));
});
createPackageVersion(client, ext, bundles);
}
private void createEbundle(HttpClient client, EcgineExtension ext, EManifest p) throws Exception {
HttpPost post = new HttpPost(ext.getUploadBundleUrl());
post.addHeader("apikey", ext.getApiKey());
post.removeHeaders("content-type");
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
File file = p.getJar();
if (!file.exists()) {
throw new GradleException("Run build before deploy");
}
builder.addBinaryBody("upfile", file, ContentType.DEFAULT_BINARY, file.getName());
JSONObject json = new JSONObject();
json.put("multiple", false);
builder.addPart("info", new StringBody(json.toString(), ContentType.APPLICATION_JSON));
post.setEntity(builder.build());
HttpResponse response = client.execute(post);
HttpEntity entity = response.getEntity();
EntityUtils.consume(entity);
}
private void createPackageVersion(HttpClient client, EcgineExtension ext, Set<Bundle> bundles) throws Exception {
HttpPost request = new HttpPost(ext.getCreatePackageVersionUrl());
request.addHeader("apikey", ext.getApiKey());
// preparing body
JSONObject body = new JSONObject();
body.put(PACKAGE_NAME_SPACE, ext.getPkg().getNamespace());
body.put(VERSION, ext.getPkg().getVersion());
JSONArray bundlesArray = new JSONArray();
body.put(BUNDLES, bundlesArray);
bundles.forEach(b -> {
JSONObject bundle = new JSONObject();
bundle.put(NAME, b.getName());
bundle.put(VERSION, b.getVersion());
bundle.put(BUNLDE_TYPE, b.getType().name().toLowerCase());
bundlesArray.put(bundle);
});
request.setEntity(new StringEntity(body.toString()));
HttpResponse response = client.execute(request);
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
EntityUtils.consume(response.getEntity());
throw new GradleException("StatusCode:" + response.getStatusLine().getStatusCode() + " URL:"
+ ext.getCreatePackageVersionUrl());
}
JSONObject result = new JSONObject(IOUtils.toString(response.getEntity().getContent()));
switch (result.getInt("code")) {
case PACKAGE_NOT_FOUND:
createPackage(client, ext);
createPackageVersion(client, ext, bundles);
break;
case FAILED:
System.err.println("Unable to create PackageVersion");
throw new GradleException(result.getString("message"));
case SUCESS:
}
}
private void createPackage(HttpClient client, EcgineExtension ext) throws Exception {
System.out.println("Creating Package...");
HttpPost request = new HttpPost(ext.getCreatePackageUrl());
request.addHeader("apikey", ext.getApiKey());
List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
urlParameters.add(new BasicNameValuePair(NAME, ext.getPkg().getName()));
urlParameters.add(new BasicNameValuePair(PACKAGE_NAME_SPACE, ext.getPkg().getNamespace()));
urlParameters.add(new BasicNameValuePair(CATEGORY, ext.getPkg().getCategory()));
urlParameters.add(new BasicNameValuePair(VERTICALS, ext.getPkg().getVerticals()));
request.setEntity(new UrlEncodedFormEntity(urlParameters));
HttpResponse response = client.execute(request);
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
EntityUtils.consume(response.getEntity());
throw new GradleException(
"StatusCode:" + response.getStatusLine().getStatusCode() + " URL:" + ext.getCreatePackageUrl());
}
JSONObject result = new JSONObject(IOUtils.toString(response.getEntity().getContent()));
if (result.getInt("code") != SUCESS) {
System.err.println("Unable to create package");
throw new GradleException(result.getString("message"));
}
}
}