package edu.harvard.iq.dataverse.api;
import edu.harvard.iq.dataverse.DataTagsContainer;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.json.JsonObject;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
/**
*
* @author Naomi
*/
@Stateless
@Path("datatags")
public class DataTagsAPI extends AbstractApiBean {
private static final String TAGGING_SERVER_ENDPOINT = "http://datatags.org/api/1/interviewLink";
private static final String CALLBACK_URL = "http://dvn-build.hmdc.harvard.edu/api/datatags/receiveTags/" + java.util.UUID.randomUUID().toString();
private static final String USER_REDIRECT_URL = "http://dvn-build.hmdc.harvard.edu/datatags-api-test-deposit-complete.xhtml";
private static final Map<String, DataTagsContainer> CACHE = new ConcurrentHashMap<>();
private static final Logger logger = Logger.getLogger(DataTagsAPI.class.getName());
@EJB
DataTagsContainer container;
/**
* send GET request to tagging server API for URL for user
* @return the URL at which the interview waits.
*/
public String requestInterview() {
Client client = ClientBuilder.newClient();
WebTarget endpoint = client.target(TAGGING_SERVER_ENDPOINT);
//.path("{repositoryName}").path("{callbackURL}");
JsonObject jsonInfo = endpoint.queryParam("repositoryName", "Dataverse")
.queryParam("callbackURL", CALLBACK_URL).request(MediaType.TEXT_PLAIN)
.get(JsonObject.class);
String url = jsonInfo.getJsonString("data").toString();
logger.info(url);
return url;
}
public void setCache(String key, DataTagsContainer value) {
CACHE.put(key, value);
}
public Map<String, DataTagsContainer> getCache() {
return CACHE;
}
public DataTagsContainer getContainer() {
return container;
}
public String getCallbackURL() {
return CALLBACK_URL;
}
@POST
@Path("receiveTags/{uniqueCacheId}")
public Response receiveTags(JsonObject tags, @PathParam("uniqueCacheId") String uniqueCacheId) {
// store json tags in the DataTagsContainer holding the dataset name
container.setTag(tags);
CACHE.put(uniqueCacheId, container);
// return an OK message with the redirect URL for the user to return to Dataverse through postBackTo or unacceptableDataset in DataTags
return ok( USER_REDIRECT_URL );
}
}