package org.ecgine.gradle;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.io.Console;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.SwingUtilities;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URLEncodedUtils;
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.JSONObject;
public class EcgineLoginTask extends DefaultTask {
@TaskAction
public void login() throws Exception {
String args = (String) getProject().getProperties().get("emailId");
if (args == null) {
throw new GradleException("Please provide ecgine credentials. -PemailId=EMAILID");
}
String password = (String) getProject().getProperties().get("password");
if (password == null) {
password = readPwd();
}
String apiKey = getApiKey(args, password);
System.out.println("Successfully got the apikey: " + apiKey);
File gradleproperties = new File("gradle.properties");
if (!gradleproperties.exists()) {
gradleproperties.createNewFile();
}
Properties properties = new Properties();
properties.load(new FileInputStream(gradleproperties));
properties.put("ecgine.apikey", apiKey);
properties.store(new FileWriter(gradleproperties), "added apikey");
System.out.println("added apikey in gradle.properties file");
}
private String readPwd() {
Console console = System.console();
if (console != null) {
char[] readPassword = console.readPassword("\nPlease enter password :");
return new String(readPassword);
}
final JPasswordField jpf = new JPasswordField();
JOptionPane jop = new JOptionPane(jpf, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
JDialog dialog = jop.createDialog("Password:");
dialog.addComponentListener(new ComponentAdapter() {
@Override
public void componentShown(ComponentEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
jpf.requestFocusInWindow();
}
});
}
});
dialog.setVisible(true);
int result = (Integer) jop.getValue();
dialog.dispose();
char[] password = null;
if (result == JOptionPane.OK_OPTION) {
password = jpf.getPassword();
}
if (password != null) {
return new String(password);
}
return "";
}
private String getApiKey(String username, String pwd) {
EcgineExtension ext = (EcgineExtension) getProject().getExtensions().getByName(EcgineExtension.NAME);
try {
String url = ext.getLoginUrl();
System.out.println("Getting API key: " + url);
List<NameValuePair> params = new LinkedList<NameValuePair>();
params.add(new BasicNameValuePair("email", username));
params.add(new BasicNameValuePair("password", pwd));
HttpClient client = ext.getHttpClient();
HttpGet request = new HttpGet(url + "?" + URLEncodedUtils.format(params, "utf-8"));
HttpResponse response = client.execute(request);
int code = response.getStatusLine().getStatusCode();
if (code != 200) {
EntityUtils.consume(response.getEntity());
throw new GradleException("StatusCode:" + code + " URL:" + url);
}
String json = EntityUtils.toString(response.getEntity());
JSONObject result = new JSONObject(json);
if (result.getInt("code") == 1) {
return result.getString("message");
} else {
throw new GradleException("Request failed:" + result.getString("message"));
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}