package fi.otavanopisto.muikku.plugins.dnm.rest;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateful;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import fi.otavanopisto.muikku.model.workspace.WorkspaceEntity;
import fi.otavanopisto.muikku.plugin.PluginRESTService;
import fi.otavanopisto.muikku.plugins.dnm.unembed.MaterialUnEmbedder;
import fi.otavanopisto.muikku.plugins.dnm.util.HtmlMaterialCleaner;
import fi.otavanopisto.muikku.plugins.material.model.HtmlMaterial;
import fi.otavanopisto.muikku.plugins.material.model.Material;
import fi.otavanopisto.muikku.plugins.workspace.WorkspaceMaterialController;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterial;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceNode;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceNodeType;
import fi.otavanopisto.muikku.schooldata.WorkspaceController;
import fi.otavanopisto.security.rest.RESTPermit;
@RequestScoped
@Path("/dnm")
@Stateful
@Produces("application/json")
public class DeusNexMachinaRESTService extends PluginRESTService {
private static final long serialVersionUID = -3462127616854447813L;
@Inject
private MaterialUnEmbedder materialUnembedder;
@Inject
private HtmlMaterialCleaner htmlMaterialCleaner;
@Inject
private WorkspaceMaterialController workspaceMaterialController;
@Inject
private WorkspaceController workspaceController;
@Inject
private Logger logger;
@GET
@Path("/manualunembed/{ID}")
@RESTPermit (DeusNexMachinaPermissions.UNEMBED_WORKSPACE_MATERIALS)
public Response manualUnembed(@PathParam("ID") Long workspaceEntityId, @Context Request request) {
WorkspaceEntity workspaceEntity = workspaceController.findWorkspaceEntityById(workspaceEntityId);
if (workspaceEntity != null) {
WorkspaceNode rootFolder = workspaceMaterialController.findWorkspaceRootFolderByWorkspaceEntity(workspaceEntity);
try {
materialUnembedder.unembedWorkspaceMaterials(rootFolder);
}
catch (Exception e) {
logger.log(Level.SEVERE, "Manual unembed of workspace " + workspaceEntityId + " materials failed", e);
return Response.status(Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
}
else {
return Response.status(Status.NOT_FOUND).entity("Unknown workspace " + workspaceEntityId).build();
}
return Response.status(Status.OK).entity("Workspace " + workspaceEntityId + " materials successfully unembedded").build();
}
@GET
@Path("/cleanworkspacematerials/{ID}")
@RESTPermit (DeusNexMachinaPermissions.CLEAN_WORKSPACE_MATERIALS)
public Response cleanWorkspaceMaterials(@PathParam("ID") Long workspaceEntityId, @Context Request request) {
WorkspaceEntity workspaceEntity = workspaceController.findWorkspaceEntityById(workspaceEntityId);
if (workspaceEntity != null) {
WorkspaceNode rootFolder = workspaceMaterialController.findWorkspaceRootFolderByWorkspaceEntity(workspaceEntity);
try {
List<WorkspaceNode> nodes = workspaceMaterialController.listWorkspaceNodesByParent(rootFolder);
cleanMaterials(nodes);
}
catch (Exception e) {
logger.log(Level.SEVERE, "Cleaning materials of workspace " + workspaceEntityId + " failed", e);
return Response.status(Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
}
else {
return Response.status(Status.NOT_FOUND).entity("Unknown workspace " + workspaceEntityId).build();
}
return Response.status(Status.OK).entity("Workspace " + workspaceEntityId + " materials successfully cleaned").build();
}
private void cleanMaterials(List<WorkspaceNode> nodes) {
for (WorkspaceNode node : nodes) {
if (node.getType() != WorkspaceNodeType.MATERIAL) {
cleanMaterials(workspaceMaterialController.listWorkspaceNodesByParent(node));
}
else {
WorkspaceMaterial workspaceMaterial = (WorkspaceMaterial) node;
Material material = workspaceMaterialController.getMaterialForWorkspaceMaterial(workspaceMaterial);
if ("html".equals(material.getType())) {
logger.info("Cleaning html material " + material.getId());
htmlMaterialCleaner.cleanMaterial((HtmlMaterial) material, workspaceMaterial);
}
}
}
}
}