/*
* 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.api;
import edu.harvard.iq.dataverse.Dataverse;
import edu.harvard.iq.dataverse.DataverseServiceBean;
import edu.harvard.iq.dataverse.harvest.client.HarvestingClient;
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
import edu.harvard.iq.dataverse.engine.command.impl.CreateHarvestingClientCommand;
import edu.harvard.iq.dataverse.engine.command.impl.GetHarvestingClientCommand;
import edu.harvard.iq.dataverse.engine.command.impl.UpdateHarvestingClientCommand;
import edu.harvard.iq.dataverse.harvest.client.ClientHarvestRun;
import edu.harvard.iq.dataverse.harvest.client.HarvesterServiceBean;
import edu.harvard.iq.dataverse.harvest.client.HarvestingClientServiceBean;
import edu.harvard.iq.dataverse.harvest.server.OAISet;
import edu.harvard.iq.dataverse.harvest.server.OAISetServiceBean;
import edu.harvard.iq.dataverse.util.json.JsonParseException;
import javax.json.JsonObjectBuilder;
import static edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder.jsonObjectBuilder;
import java.io.IOException;
import java.io.StringReader;
import java.util.List;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.json.Json;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
/**
*
* @author Leonid Andreev
*/
@Stateless
@Path("harvest/server/oaisets")
public class HarvestingServer extends AbstractApiBean {
@EJB
OAISetServiceBean oaiSetService;
private static final Logger logger = Logger.getLogger(HarvestingServer.class.getName());
// TODO: this should be available to admin only.
@GET
@Path("")
public Response oaiSets(@QueryParam("key") String apiKey) throws IOException {
List<OAISet> oaiSets = null;
try {
oaiSets = oaiSetService.findAll();
} catch (Exception ex) {
return error(Response.Status.INTERNAL_SERVER_ERROR, "Caught an exception looking up available OAI sets; " + ex.getMessage());
}
if (oaiSets == null) {
// returning an empty list:
return ok(jsonObjectBuilder().add("oaisets", ""));
}
JsonArrayBuilder hcArr = Json.createArrayBuilder();
for (OAISet set : oaiSets) {
hcArr.add(oaiSetAsJson(set));
}
return ok(jsonObjectBuilder().add("oaisets", hcArr));
}
@GET
@Path("{specname}")
public Response oaiSet(@PathParam("specname") String spec, @QueryParam("key") String apiKey) throws IOException {
OAISet set = null;
try {
set = oaiSetService.findBySpec(spec);
} catch (Exception ex) {
logger.warning("Exception caught looking up OAI set " + spec + ": " + ex.getMessage());
return error( Response.Status.BAD_REQUEST, "Internal error: failed to look up OAI set " + spec + ".");
}
if (set == null) {
return error(Response.Status.NOT_FOUND, "OAI set " + spec + " not found.");
}
try {
return ok(oaiSetAsJson(set));
} catch (Exception ex) {
logger.warning("Unknown exception caught while trying to format OAI set " + spec + " as json: "+ex.getMessage());
return error( Response.Status.BAD_REQUEST,
"Internal error: failed to produce output for OAI set " + spec + ".");
}
}
@POST
@Path("{specname}")
public Response createOaiSet(String jsonBody, @PathParam("specname") String spec, @QueryParam("key") String apiKey) throws IOException, JsonParseException {
//try () {
StringReader rdr = new StringReader(jsonBody);
JsonObject json = Json.createReader(rdr).readObject();
OAISet set = new OAISet();
// TODO: check that it doesn't exist yet...
set.setSpec(spec);
// TODO: jsonParser().parseOaiSet(json, set);
oaiSetService.save(set);
return created( "/harvest/server/oaisets" + spec, oaiSetAsJson(set));
//} catch (JsonParseException ex) {
// return errorResponse( Response.Status.BAD_REQUEST, "Error parsing OAI set: " + ex.getMessage() );
//} catch (WrappedResponse ex) {
// return ex.getResponse();
//}
}
@PUT
@Path("{nickName}")
public Response modifyOaiSet(String jsonBody, @PathParam("specname") String spec, @QueryParam("key") String apiKey) throws IOException, JsonParseException {
// TODO:
// ...
return created("/harvest/server/oaisets" + spec, null);
}
@DELETE
@Path("{specname}")
public Response deleteOaiSet(@PathParam("specname") String spec, @QueryParam("key") String apiKey) {
OAISet set = null;
try {
set = oaiSetService.findBySpec(spec);
} catch (Exception ex) {
logger.warning("Exception caught looking up OAI set " + spec + ": " + ex.getMessage());
return error( Response.Status.BAD_REQUEST, "Internal error: failed to look up OAI set " + spec + ".");
}
if (set == null) {
return error(Response.Status.NOT_FOUND, "OAI set " + spec + " not found.");
}
try {
oaiSetService.setDeleteInProgress(set.getId());
oaiSetService.remove(set.getId());
} catch (Exception ex) {
return error( Response.Status.BAD_REQUEST, "Internal error: failed to delete OAI set " + spec + "; " + ex.getMessage());
}
return ok("OAI Set " + spec + " deleted");
}
@GET
@Path("{specname}/datasets")
public Response oaiSetListDatasets(@PathParam("specname") String spec, @QueryParam("key") String apiKey) throws IOException {
OAISet set = null;
try {
set = oaiSetService.findBySpec(spec);
} catch (Exception ex) {
logger.warning("Exception caught looking up OAI set " + spec + ": " + ex.getMessage());
return error( Response.Status.BAD_REQUEST, "Internal error: failed to look up OAI set " + spec + ".");
}
return ok("");
}
/* Auxiliary, helper methods: */
public static JsonArrayBuilder oaiSetsAsJsonArray(List<OAISet> oaiSets) {
JsonArrayBuilder hdArr = Json.createArrayBuilder();
for (OAISet set : oaiSets) {
hdArr.add(oaiSetAsJson(set));
}
return hdArr;
}
public static JsonObjectBuilder oaiSetAsJson(OAISet set) {
if (set == null) {
return null;
}
return jsonObjectBuilder().add("name", set.getName()).
add("spec", set.getSpec()).
add("description", set.getDescription()).
add("definition", set.getDefinition()).
add("version", set.getVersion());
}
}