/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package edu.harvard.iq.dataverse;
import java.io.Closeable;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
/**
* DataCiteRESTfullClient
*
* @author luopc
*
*/
public class DataCiteRESTfullClient implements Closeable {
private static final Logger logger = Logger.getLogger(DataCiteRESTfullClient.class.getCanonicalName());
private String url;
private CloseableHttpClient httpClient;
private HttpClientContext context;
private String encoding = "utf-8";
public DataCiteRESTfullClient(String url, String username, String password) throws IOException {
this.url = url;
try {
context = HttpClientContext.create();
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(new AuthScope(null, -1),
new UsernamePasswordCredentials(username, password));
context.setCredentialsProvider(credsProvider);
httpClient = HttpClients.createDefault();
} catch (Exception ioe) {
close();
logger.log(Level.SEVERE,"Fail to init Client",ioe);
throw new RuntimeException("Fail to init Client", ioe);
}
}
public void close() throws IOException {
if (this.httpClient != null) {
httpClient.close();
}
}
/**
* getUrl
*
* @param doi
* @return
*/
public String getUrl(String doi) {
HttpGet httpGet = new HttpGet(this.url + "/doi/" + doi);
try {
HttpResponse response = httpClient.execute(httpGet,context);
String data = EntityUtils.toString(response.getEntity(), encoding);
if (response.getStatusLine().getStatusCode() != 200) {
throw new RuntimeException("Response code: " + response.getStatusLine().getStatusCode() + ", " + data);
}
return data;
} catch (IOException ioe) {
logger.log(Level.SEVERE,"IOException when get url",ioe);
throw new RuntimeException("IOException when get url", ioe);
}
}
/**
* postUrl
*
* @param doi
* @param url
* @return
*/
public String postUrl(String doi, String url) throws UnsupportedEncodingException {
HttpPost httpPost = new HttpPost(this.url + "/doi");
httpPost.setHeader("Content-Type", "text/plain;charset=UTF-8");
httpPost.setEntity(new StringEntity("doi=" + doi + "\nurl=" + url, "utf-8"));
try {
HttpResponse response = httpClient.execute(httpPost,context);
String data = EntityUtils.toString(response.getEntity(), encoding);
if (response.getStatusLine().getStatusCode() != 201) {
String errMsg = "Response code: " + response.getStatusLine().getStatusCode() + ", " + data;
logger.log(Level.SEVERE,errMsg);
throw new RuntimeException(errMsg);
}
return data;
} catch (IOException ioe) {
logger.log(Level.SEVERE,"IOException when post url");
throw new RuntimeException("IOException when post url", ioe);
}
}
/**
* getMetadata
*
* @param doi
* @return
*/
public String getMetadata(String doi) {
HttpGet httpGet = new HttpGet(this.url + "/metadata/" + doi);
httpGet.setHeader("Accept", "application/xml");
try {
HttpResponse response = httpClient.execute(httpGet,context);
String data = EntityUtils.toString(response.getEntity(), encoding);
if (response.getStatusLine().getStatusCode() != 200) {
String errMsg = "Response code: " + response.getStatusLine().getStatusCode() + ", " + data;
logger.log(Level.SEVERE, errMsg);
throw new RuntimeException(errMsg);
}
return data;
} catch (IOException ioe) {
logger.log(Level.SEVERE, "IOException when get metadata");
throw new RuntimeException("IOException when get metadata", ioe);
}
}
/**
* testDOIExists
*
* @param doi
* @return boolean true if identifier already exists on DataCite site
*/
public boolean testDOIExists(String doi) {
HttpGet httpGet = new HttpGet(this.url + "/metadata/" + doi);
httpGet.setHeader("Accept", "application/xml");
try {
HttpResponse response = httpClient.execute(httpGet,context);
if (response.getStatusLine().getStatusCode() != 200) {
return false;
}
return true;
} catch (IOException ioe) {
logger.log(Level.SEVERE, "IOException when get metadata");
throw new RuntimeException("IOException when get metadata", ioe);
}
}
/**
* postMetadata
*
* @param metadata
* @return
*/
public String postMetadata(String metadata) throws UnsupportedEncodingException {
HttpPost httpPost = new HttpPost(this.url + "/metadata");
httpPost.setHeader("Content-Type", "application/xml;charset=UTF-8");
httpPost.setEntity(new StringEntity(metadata, "utf-8"));
try {
HttpResponse response = httpClient.execute(httpPost,context);
String data = EntityUtils.toString(response.getEntity(), encoding);
if (response.getStatusLine().getStatusCode() != 201) {
String errMsg = "Response code: " + response.getStatusLine().getStatusCode() + ", " + data;
logger.log(Level.SEVERE, errMsg);
throw new RuntimeException(errMsg);
}
return data;
} catch (IOException ioe) {
logger.log(Level.SEVERE, "IOException when post metadata");
throw new RuntimeException("IOException when post metadata", ioe);
}
}
/**
* inactiveDataset
*
* @param doi
* @return
*/
public String inactiveDataset(String doi) {
HttpDelete httpDelete = new HttpDelete(this.url + "/metadata/" + doi);
try {
HttpResponse response = httpClient.execute(httpDelete,context);
String data = EntityUtils.toString(response.getEntity(), encoding);
if (response.getStatusLine().getStatusCode() != 200) {
String errMsg = "Response code: " + response.getStatusLine().getStatusCode() + ", " + data;
logger.log(Level.SEVERE, errMsg);
throw new RuntimeException(errMsg);
}
return data;
} catch (IOException ioe) {
logger.log(Level.SEVERE, "IOException when inactive dataset");
throw new RuntimeException("IOException when inactive dataset", ioe);
}
}
public static void main(String[] args) throws Exception {
String doi = "10.5072/DVN/274533";
DataCiteRESTfullClient client = new DataCiteRESTfullClient("https://mds.test.datacite.org", "DATACITE.HARVARD", "DVNapitest");
// System.out.println(client.getUrl(doi));
// System.out.println(client.getMetadata(doi));
// System.out.println(client.postMetadata(readAndClose("C:/Users/luopc/Desktop/datacite.xml", "utf-8")));
// System.out.println(client.postUrl("10.5072/000000001", "http://opendata.pku.edu.cn/dvn/dv/DAIM/faces/study/StudyPage.xhtml?globalId=hdl:TEST/10027&studyListingIndex=1_1acc4e9f23fa10b3cc0500d9eb5e"));
// client.close();
// String doi2 = "10.1/1.0003";
// SimpleRESTfullClient client2 = new SimpleRESTfullClient("https://162.105.140.119:8443/mds", "PKULIB.IR", "luopengcheng","localhost.keystore");
// System.out.println(client2.getUrl("10.1/1.0002"));
// System.out.println(client2.getUrl("10.1/1.0002"));
// System.out.println(client2.getMetadata(doi2));
// client2.postUrl("10.1/1.0003", "http://ir.pku.edu.cn");
// System.out.println(client2.postUrl("10.1/1.0008", "http://ir.pku.edu.cn"));
// System.out.println(client2.postMetadata(FileUtil.loadAsString(new File("C:/Users/luopc/Desktop/test/datacite-example-ResourceTypeGeneral_Collection-v3.0.xml"), "utf-8")));
// System.out.println(client2.getMetadata("10.1/1.0007"));
// System.out.println(client2.inactiveDataSet("10.1/1.0007"));
// client2.close();
}
// private static String readAndClose(String file, String encoding) throws IOException{
// BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),encoding));
// StringBuilder str = new StringBuilder();
// String line;
// while((line = in.readLine()) != null){
// str.append(line);
// }
// in.close();
// return str.toString();
// }
}