/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE file at the root of the source
* tree and available online at
*
* https://github.com/keeps/roda
*/
package org.roda.wui.api.v1;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import org.roda.core.common.UserUtility;
import org.roda.core.data.common.RodaConstants;
import org.roda.core.data.exceptions.AuthorizationDeniedException;
import org.roda.core.data.exceptions.GenericException;
import org.roda.core.data.exceptions.JobAlreadyStartedException;
import org.roda.core.data.exceptions.NotFoundException;
import org.roda.core.data.exceptions.RequestNotValidException;
import org.roda.core.data.v2.IsRODAObject;
import org.roda.core.data.v2.formats.Format;
import org.roda.core.data.v2.index.select.SelectedItems;
import org.roda.core.data.v2.index.select.SelectedItemsAll;
import org.roda.core.data.v2.index.select.SelectedItemsList;
import org.roda.core.data.v2.index.select.SelectedItemsNone;
import org.roda.core.data.v2.ip.AIP;
import org.roda.core.data.v2.ip.TransferredResource;
import org.roda.core.data.v2.ip.metadata.IndexedPreservationAgent;
import org.roda.core.data.v2.jobs.Job;
import org.roda.core.data.v2.log.LogEntry;
import org.roda.core.data.v2.log.LogEntry.LOG_ENTRY_STATE;
import org.roda.core.data.v2.notifications.Notification;
import org.roda.core.data.v2.risks.Risk;
import org.roda.core.data.v2.risks.RiskIncidence;
import org.roda.core.data.v2.user.RODAMember;
import org.roda.core.data.v2.user.User;
import org.roda.core.plugins.plugins.PluginHelper;
import org.roda.core.plugins.plugins.base.ActionLogCleanerPlugin;
import org.roda.core.plugins.plugins.reindex.ReindexAllRodaEntitiesPlugin;
import org.roda.wui.api.controllers.Jobs;
import org.roda.wui.api.v1.utils.ApiResponseMessage;
import org.roda.wui.common.ControllerAssistant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiParam;
@Api(value = ManagementTasksResource.SWAGGER_ENDPOINT)
@Path(ManagementTasksResource.ENDPOINT)
public class ManagementTasksResource {
private static final Logger LOGGER = LoggerFactory.getLogger(ManagementTasksResource.class);
public static final String ENDPOINT = "/v1/management_tasks";
public static final String SWAGGER_ENDPOINT = "v1 management tasks";
@Context
private HttpServletRequest request;
@POST
@Path("/index/reindex")
public Response executeIndexReindexTask(
@ApiParam(value = "", allowableValues = "ALL,aip,job,risk,riskincidence,preservation_agent,format,notification,actionlogs,transferred_resources,users_and_groups", defaultValue = "aip") @QueryParam("entity") String entity,
@QueryParam("params") List<String> params) throws AuthorizationDeniedException, NotFoundException {
ControllerAssistant controllerAssistant = new ControllerAssistant() {};
// get user & check permissions
User user = UserUtility.getApiUser(request);
controllerAssistant.checkGroup(user, "administrators");
return executeReindex(user, controllerAssistant, entity, params);
}
@POST
@Path("/index/actionlogclean")
public Response executeIndexActionLogCleanTask(
@ApiParam(value = "Amount of days to keep action information in the index", defaultValue = "30") @QueryParam("daysToKeep") String daysToKeep)
throws AuthorizationDeniedException {
ControllerAssistant controllerAssistant = new ControllerAssistant() {};
// get user & check permissions
User user = UserUtility.getApiUser(request);
controllerAssistant.checkGroup(user, "administrators");
return Response.ok().entity(createJobForRunningActionlogCleaner(user, daysToKeep, controllerAssistant)).build();
}
private Response executeReindex(User user, ControllerAssistant controllerAssistant, String entity,
List<String> params) throws NotFoundException {
ApiResponseMessage response = new ApiResponseMessage(ApiResponseMessage.OK, "Action done!");
if ("aip".equals(entity)) {
response = createJobToReindex(user, controllerAssistant, params, AIP.class);
} else if ("job".equals(entity)) {
response = createJobToReindex(user, controllerAssistant, params, Job.class);
} else if ("risk".equals(entity)) {
response = createJobToReindex(user, controllerAssistant, params, Risk.class);
} else if ("riskincidence".equals(entity)) {
response = createJobToReindex(user, controllerAssistant, params, RiskIncidence.class);
} else if ("format".equals(entity)) {
response = createJobToReindex(user, controllerAssistant, params, Format.class);
} else if ("notification".equals(entity)) {
response = createJobToReindex(user, controllerAssistant, params, Notification.class);
} else if ("transferred_resources".equals(entity)) {
response = createJobToReindex(user, controllerAssistant, params, TransferredResource.class);
} else if ("preservation_agent".equals(entity)) {
response = createJobToReindex(user, controllerAssistant, params, IndexedPreservationAgent.class);
} else if ("actionlogs".equals(entity)) {
response = createJobToReindex(user, controllerAssistant, params, LogEntry.class);
} else if ("users_and_groups".equals(entity)) {
response = createJobToReindex(user, controllerAssistant, params, RODAMember.class);
} else if ("ALL".equals(entity)) {
response = createJobToReindexAllRODAObjects(user, controllerAssistant);
}
return Response.ok().entity(response).build();
}
private <T extends IsRODAObject> ApiResponseMessage createJobToReindex(User user,
ControllerAssistant controllerAssistant, List<String> params, Class<T> classToCreate) throws NotFoundException {
ApiResponseMessage response = new ApiResponseMessage(ApiResponseMessage.OK, "Action done!");
SelectedItems<?> create;
if (TransferredResource.class.equals(classToCreate) || LogEntry.class.equals(classToCreate)
|| RODAMember.class.equals(classToCreate) || IndexedPreservationAgent.class.equals(classToCreate)) {
create = SelectedItemsNone.create();
} else {
if (params.isEmpty()) {
create = SelectedItemsAll.create(classToCreate);
} else {
create = SelectedItemsList.create(classToCreate, params);
}
}
Job job = new Job().setName("Management Task | Reindex '" + classToCreate.getSimpleName() + "' job")
.setSourceObjects(create).setPlugin(PluginHelper.getReindexPluginName(classToCreate));
createJobAndRegisterAction(user, controllerAssistant, response, job);
return response;
}
private ApiResponseMessage createJobToReindexAllRODAObjects(User user, ControllerAssistant controllerAssistant) {
ApiResponseMessage response = new ApiResponseMessage(ApiResponseMessage.OK, "Action done!");
Job job = new Job().setName("Management Task | Reindex 'All RODA Objects' job")
.setSourceObjects(SelectedItemsNone.create()).setPlugin(ReindexAllRodaEntitiesPlugin.class.getName());
createJobAndRegisterAction(user, controllerAssistant, response, job, "params", job.getPluginParameters());
return response;
}
private void createJobAndRegisterAction(User user, ControllerAssistant controllerAssistant,
ApiResponseMessage response, Job job, Object... params) {
boolean success = true;
try {
Job jobCreated = Jobs.createJob(user, job, true);
response.setMessage(job.getName() + " created (" + jobCreated + ")");
} catch (AuthorizationDeniedException | RequestNotValidException | NotFoundException | GenericException
| JobAlreadyStartedException e) {
LOGGER.error("Error creating {}", job.getName(), e);
success = false;
} finally {
// register action
controllerAssistant.registerAction(user, success ? LOG_ENTRY_STATE.SUCCESS : LOG_ENTRY_STATE.FAILURE, params);
}
}
private ApiResponseMessage createJobForRunningActionlogCleaner(User user, String daysToKeep,
ControllerAssistant controllerAssistant) {
ApiResponseMessage response = new ApiResponseMessage(ApiResponseMessage.OK, "Action done!");
Job job = new Job();
job.setName("Management Task | Log cleaner job").setSourceObjects(SelectedItemsNone.create())
.setPlugin(ActionLogCleanerPlugin.class.getName());
if (!daysToKeep.isEmpty()) {
Map<String, String> pluginParameters = new HashMap<>();
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_INT_VALUE, daysToKeep);
job.setPluginParameters(pluginParameters);
}
createJobAndRegisterAction(user, controllerAssistant, response, job, "params", job.getPluginParameters());
return response;
}
}