/*
* This file is part of ADDIS (Aggregate Data Drug Information System).
* ADDIS is distributed from http://drugis.org/.
* Copyright © 2009 Gert van Valkenhoef, Tommi Tervonen.
* Copyright © 2010 Gert van Valkenhoef, Tommi Tervonen, Tijs Zwinkels,
* Maarten Jacobs, Hanno Koeslag, Florin Schimbinschi, Ahmad Kamal, Daniel
* Reid.
* Copyright © 2011 Gert van Valkenhoef, Ahmad Kamal, Daniel Reid, Florin
* Schimbinschi.
* Copyright © 2012 Gert van Valkenhoef, Daniel Reid, Joël Kuiper, Wouter
* Reckman.
* Copyright © 2013 Gert van Valkenhoef, Joël Kuiper.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.drugis.addis.gui;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.ByteArrayOutputStream;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.UUID;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.impl.client.HttpClients;
import org.codehaus.jackson.map.ObjectMapper;
import org.drugis.addis.entities.DomainManager;
import org.drugis.addis.gui.builder.Addis2ExportView;
import org.drugis.addis.rdf.AddisToRdfFactory;
import org.drugis.common.beans.AbstractObservable;
import com.jgoodies.binding.PresentationModel;
@SuppressWarnings("serial")
public class Addis2ExportDialog extends JDialog {
public static class ExportInfo extends AbstractObservable {
private String name = "";
private String title = "";
private String apiKey = "";
private String server = "https://addis.drugis.org/";
private String datasetId = UUID.randomUUID().toString();
private Integer userId = null;
private boolean done = false;
private String authStatus = "";
private String status = "";
public String getName() {
return name;
}
public void setName(String newVal) {
String oldVal = this.name;
this.name = newVal;
firePropertyChange("name", oldVal, newVal);
}
public String getTitle() {
return title;
}
public void setTitle(String newVal) {
String oldVal = this.title;
this.title = newVal;
firePropertyChange("title", oldVal, newVal);
}
public String getApiKey() {
return apiKey;
}
public void setApiKey(String newVal) {
String oldVal = this.apiKey;
this.apiKey = newVal;
firePropertyChange("apiKey", oldVal, newVal);
if (!newVal.equals(oldVal)) {
this.setUserId(null);
this.setAuthStatus("");
}
}
public String getServer() {
return server;
}
public void setServer(String newVal) {
String oldVal = this.server;
this.server = newVal;
firePropertyChange("server", oldVal, newVal);
if (!newVal.equals(oldVal)) {
this.setUserId(null);
this.setAuthStatus("");
}
}
public String getDatasetId() {
return datasetId;
}
public void setDatasetId(String newVal) {
String oldVal = this.datasetId;
this.datasetId = newVal;
firePropertyChange("datasetId", oldVal, newVal);
}
public String getStatus() {
return status;
}
public void setStatus(String newVal) {
String oldVal = this.status;
this.status = newVal;
firePropertyChange("status", oldVal, newVal);
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer newVal) {
Integer oldVal = this.userId;
this.userId = newVal;
firePropertyChange("userId", oldVal, newVal);
}
public String getAuthStatus() {
return authStatus;
}
public void setAuthStatus(String newVal) {
String oldVal = this.authStatus;
this.authStatus = newVal;
firePropertyChange("authStatus", oldVal, newVal);
}
public boolean getDone() {
return done;
}
public void setDone(boolean newVal) {
boolean oldVal = this.done;
this.done = newVal;
firePropertyChange("done", oldVal, newVal);
}
}
private final class CredentialsChecker implements Runnable {
private final ExportInfo d_info;
public CredentialsChecker(ExportInfo info) {
d_info = info;
}
@Override
public void run() {
try {
d_info.setAuthStatus("Checking credentials...");
HttpGet get = new HttpGet(new URIBuilder(d_info.getServer()).setPath("/whoami").build());
get.setHeader("X-Auth-Application-Key", d_info.apiKey);
HttpResponse response = HttpClients.createDefault().execute(get);
StatusLine statusLine = response.getStatusLine();
if (statusLine.getStatusCode() == 200) {
ObjectMapper mapper = new ObjectMapper();
Map<?, ?> parsed = mapper.readValue(response.getEntity().getContent(), Map.class);
d_info.setUserId((Integer) parsed.get("id"));
d_info.setAuthStatus("Authenticated as " + parsed.get("firstName") + " " + parsed.get("lastName"));
} else {
d_info.setAuthStatus("Authentication failed: " + statusLine.getStatusCode() + " " + statusLine.getReasonPhrase());
}
} catch (Exception e) {
d_info.setAuthStatus("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
private final class Exporter implements Runnable {
private final ExportInfo d_info;
private Exporter(ExportInfo info) {
d_info = info;
}
@Override
public void run() {
try {
d_info.setStatus("Generating XML...");
ByteArrayOutputStream os = new ByteArrayOutputStream();
d_mgr.saveXMLDomain(os);
String xml = new String(os.toByteArray(), StandardCharsets.UTF_8);
d_info.setStatus("Converting to RDF...");
String rdf = AddisToRdfFactory.create().convert(xml, DATASET_URI_PREFIX + d_info.getDatasetId(), d_info.getName(), d_info.getTitle());
d_info.setStatus("Uploading RDF...");
URI writeDatasetUri = new URIBuilder(d_info.getServer())
.setPath("/users/" + d_info.getUserId() + "/datasets/" + d_info.getDatasetId())
.setParameter("commitTitle", "Exported from ADDIS 1.x")
.build();
HttpPost post = new HttpPost(writeDatasetUri);
post.setHeader("Content-Type", "text/trig");
post.setHeader("X-Auth-Application-Key", d_info.apiKey);
post.setEntity(new ByteArrayEntity(rdf.getBytes()));
HttpResponse response = HttpClients.createDefault().execute(post);
StatusLine statusLine = response.getStatusLine();
if (statusLine.getStatusCode() == 200 || statusLine.getStatusCode() == 201) {
d_info.setStatus("Export complete");
d_info.setDone(true);
} else {
d_info.setStatus("Export failed: " + statusLine.getStatusCode() + " " + statusLine.getReasonPhrase());
}
} catch (Exception e) {
d_info.setStatus("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
private DomainManager d_mgr;
private static final String DATASET_URI_PREFIX = "http://trials.drugis.org/datasets/";
public Addis2ExportDialog(JFrame parent, DomainManager mgr) {
super(parent, "Export to ADDIS 2", true);
d_mgr = mgr;
final ExportInfo info = new ExportInfo();
Addis2ExportView view = new Addis2ExportView(new PresentationModel<ExportInfo>(info), new CredentialsChecker(info), new Exporter(info));
info.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("done") && evt.getNewValue().equals(true)) {
JOptionPane.showMessageDialog(Addis2ExportDialog.this, "Dataset successfully exported to ADDIS 2");
Addis2ExportDialog.this.dispose();
}
}
});
add(view.buildPanel());
pack();
}
}