use of fi.otavanopisto.muikku.plugins.material.model.Material in project muikku by otavanopisto.
the class DeusNexMachinaController method importResource.
private void importResource(WorkspaceNode importRoot, WorkspaceNode parent, Resource resource, DeusNexDocument deusNexDocument, List<WorkspaceNode> createdNodes) throws DeusNexException {
WorkspaceNode node = findNode(parent, resource);
if (resource.getType() == Type.FOLDER) {
Folder folderResource = (Folder) resource;
WorkspaceFolder folder = null;
if (node instanceof WorkspaceFolder) {
folder = (WorkspaceFolder) node;
}
if (folder == null) {
folder = createFolder(parent, folderResource);
try {
setResourceWorkspaceNodeId(resource.getNo(), folder.getId());
} catch (IOException e) {
throw new DeusNexInternalException("Failed to store resourceNo lookup file", e);
}
createdNodes.add(folder);
}
for (Resource childResource : folderResource.getResources()) {
importResource(importRoot, folder, childResource, deusNexDocument, createdNodes);
}
} else {
if (node == null) {
logger.fine("importing " + resource.getPath());
Material material = createMaterial(importRoot, resource, deusNexDocument);
if (material != null) {
WorkspaceMaterialAssignmentType assignmentType = null;
if (resource instanceof Query) {
switch(((Query) resource).getQueryType()) {
case "1":
assignmentType = WorkspaceMaterialAssignmentType.EXERCISE;
break;
case "2":
assignmentType = WorkspaceMaterialAssignmentType.EVALUATED;
break;
}
} else if (material instanceof HtmlMaterial) {
assignmentType = determineEmbeddedAssignmentType((HtmlMaterial) material);
}
WorkspaceMaterial workspaceMaterial = workspaceMaterialController.createWorkspaceMaterial(parent, material, resource.getName(), assignmentType, WorkspaceMaterialCorrectAnswersDisplay.ALWAYS);
try {
setResourceWorkspaceNodeId(resource.getNo(), workspaceMaterial.getId());
} catch (IOException e) {
throw new DeusNexInternalException("Failed to store resourceNo lookup file", e);
}
if (resource instanceof ResourceContainer) {
List<Resource> childResources = ((ResourceContainer) resource).getResources();
if (childResources != null) {
for (Resource childResource : childResources) {
importResource(importRoot, workspaceMaterial, childResource, deusNexDocument, createdNodes);
}
}
}
if (resource.getHidden()) {
workspaceMaterialController.hideWorkspaceNode(workspaceMaterial);
}
createdNodes.add(workspaceMaterial);
}
} else {
logger.info(node.getPath() + " already exists, skipping");
}
}
}
use of fi.otavanopisto.muikku.plugins.material.model.Material in project muikku by otavanopisto.
the class SaveFieldAnswerWebSocketMessageHandler method handleMessage.
public void handleMessage(@Observes @MuikkuWebSocketEvent("workspace:field-answer-save") WebSocketMessageEvent event) {
// TODO: Localize error messages
WebSocketMessage webSocketMessage = event.getMessage();
ObjectMapper mapper = new ObjectMapper();
try {
SaveFieldAnswerWebSocketMessage message = mapper.readValue((String) webSocketMessage.getData(), SaveFieldAnswerWebSocketMessage.class);
Date now = new Date();
if (message.getMaterialId() == null) {
logger.log(Level.SEVERE, "Missing material id");
handleError("Missing material id", message.getEmbedId(), message.getMaterialId(), message.getFieldName(), message.getWorkspaceMaterialId(), message.getWorkspaceEntityId(), event.getTicket());
return;
}
if (message.getWorkspaceMaterialId() == null) {
logger.log(Level.SEVERE, "Missing workspace material id");
handleError("Missing workspace material id", message.getEmbedId(), message.getMaterialId(), message.getFieldName(), message.getWorkspaceMaterialId(), message.getWorkspaceEntityId(), event.getTicket());
return;
}
if (message.getUserEntityId() == null) {
logger.log(Level.SEVERE, String.format("Missing user entity id for ticket %s (field %s in workspace material %d)", event.getTicket(), message.getFieldName(), message.getWorkspaceMaterialId()));
handleError("Missing user entity id", message.getEmbedId(), message.getMaterialId(), message.getFieldName(), message.getWorkspaceMaterialId(), message.getWorkspaceEntityId(), event.getTicket());
return;
}
Material material = materialController.findMaterialById(message.getMaterialId());
if (material == null) {
logger.log(Level.SEVERE, "Could not find material");
handleError("Could not find material", message.getEmbedId(), message.getMaterialId(), message.getFieldName(), message.getWorkspaceMaterialId(), message.getWorkspaceEntityId(), event.getTicket());
return;
}
UserEntity userEntity = userEntityController.findUserEntityById(message.getUserEntityId());
if (userEntity == null) {
logger.log(Level.SEVERE, "Could not find user");
handleError("Could not find user", message.getEmbedId(), message.getMaterialId(), message.getFieldName(), message.getWorkspaceMaterialId(), message.getWorkspaceEntityId(), event.getTicket());
return;
}
WorkspaceMaterial workspaceMaterial = workspaceMaterialController.findWorkspaceMaterialById(message.getWorkspaceMaterialId());
if (workspaceMaterial == null) {
logger.log(Level.SEVERE, "Could not find workspace material");
handleError("Could not find workspace material", message.getEmbedId(), message.getMaterialId(), message.getFieldName(), message.getWorkspaceMaterialId(), message.getWorkspaceEntityId(), event.getTicket());
return;
}
if (!workspaceMaterial.getMaterialId().equals(material.getId())) {
logger.log(Level.SEVERE, "Invalid materialId or workspaceMaterialId");
handleError("Invalid materialId or workspaceMaterialId", message.getEmbedId(), message.getMaterialId(), message.getFieldName(), message.getWorkspaceMaterialId(), message.getWorkspaceEntityId(), event.getTicket());
return;
}
QueryField queryField = queryFieldController.findQueryFieldByMaterialAndName(material, message.getFieldName());
if (queryField == null) {
logger.log(Level.SEVERE, "Could not find query field");
handleError("Could not find query field", message.getEmbedId(), message.getMaterialId(), message.getFieldName(), message.getWorkspaceMaterialId(), message.getWorkspaceEntityId(), event.getTicket());
return;
}
WorkspaceMaterialField materialField = workspaceMaterialFieldController.findWorkspaceMaterialFieldByWorkspaceMaterialAndQueryFieldAndEmbedId(workspaceMaterial, queryField, message.getEmbedId());
if (materialField == null) {
materialField = workspaceMaterialFieldController.createWorkspaceMaterialField(workspaceMaterial, queryField, message.getEmbedId());
}
fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterialReply reply = workspaceMaterialReplyController.findWorkspaceMaterialReplyByWorkspaceMaterialAndUserEntity(workspaceMaterial, userEntity);
if (reply == null) {
reply = workspaceMaterialReplyController.createWorkspaceMaterialReply(workspaceMaterial, WorkspaceMaterialReplyState.ANSWERED, userEntity, 1l, now, now);
} else {
workspaceMaterialReplyController.incWorkspaceMaterialReplyTries(reply);
}
if (workspaceMaterial.getAssignmentType() == WorkspaceMaterialAssignmentType.EVALUATED) {
switch(reply.getState()) {
case PASSED:
case FAILED:
case SUBMITTED:
handleError("Assignment is already submitted thus can not be modified", message.getEmbedId(), message.getMaterialId(), message.getFieldName(), message.getWorkspaceMaterialId(), message.getWorkspaceEntityId(), event.getTicket());
return;
default:
break;
}
}
try {
workspaceMaterialFieldController.storeFieldValue(materialField, reply, message.getAnswer());
} catch (WorkspaceFieldIOException e) {
logger.log(Level.SEVERE, "Could not store field value", e);
handleError("Could not store field value", message.getEmbedId(), message.getMaterialId(), message.getFieldName(), message.getWorkspaceMaterialId(), message.getWorkspaceEntityId(), event.getTicket());
return;
}
message.setOriginTicket(event.getTicket());
String data = mapper.writeValueAsString(message);
webSocketMessenger.sendMessage("workspace:field-answer-saved", data, Arrays.asList(userEntity));
} catch (IOException e) {
logger.log(Level.SEVERE, "Failed to unmarshal SaveFieldAnswerWebSocketMessage", e);
}
}
use of fi.otavanopisto.muikku.plugins.material.model.Material in project muikku by otavanopisto.
the class WorkspaceBinaryMaterialServlet method process.
private void process(HttpServletRequest request, HttpServletResponse response, boolean serveContent) throws ServletException, IOException {
String workspaceUrl = request.getParameter("workspaceUrlName");
String materialPath = request.getParameter("workspaceMaterialUrlName");
WorkspaceEntity workspaceEntity = workspaceController.findWorkspaceEntityByUrlName(workspaceUrl);
if (workspaceEntity == null) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
WorkspaceMaterial workspaceMaterial = workspaceMaterialController.findWorkspaceMaterialByWorkspaceEntityAndPath(workspaceEntity, materialPath);
if (workspaceMaterial == null) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
Material material = workspaceMaterialController.getMaterialForWorkspaceMaterial(workspaceMaterial);
int materialSize = material instanceof BinaryMaterial ? ((BinaryMaterial) material).getContent().length : material instanceof HtmlMaterial ? ((HtmlMaterial) material).getHtml().length() : 0;
String eTag = DigestUtils.md5Hex(material.getTitle() + ':' + material.getId() + ':' + materialSize + ':' + material.getVersion());
response.setHeader("ETag", eTag);
String ifNoneMatch = request.getHeader("If-None-Match");
if (!StringUtils.equals(ifNoneMatch, eTag)) {
response.setStatus(HttpServletResponse.SC_OK);
if (material instanceof BinaryMaterial) {
BinaryMaterial binaryMaterial = (BinaryMaterial) material;
byte[] data = binaryMaterial.getContent();
// Byte range support
List<Range> ranges = new ArrayList<Range>();
String range = request.getHeader("Range");
if (range != null) {
if (!range.matches("^bytes=\\d*-\\d*(,\\d*-\\d*)*$")) {
response.setHeader("Content-Range", "bytes */" + data.length);
response.sendError(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
return;
}
for (String part : range.substring(6).split(",")) {
String startStr = StringUtils.substringBefore(part, "-");
String endStr = StringUtils.substringAfter(part, "-");
int start = NumberUtils.isDigits(startStr) ? NumberUtils.toInt(startStr) : -1;
int end = NumberUtils.isDigits(endStr) ? NumberUtils.toInt(endStr) : -1;
if (start == -1) {
start = data.length - end;
end = data.length - 1;
} else if (end == -1 || end > data.length - 1) {
end = data.length - 1;
}
if (start > end) {
response.setHeader("Content-Range", "bytes */" + data.length);
response.sendError(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
return;
}
ranges.add(new Range(start, end, data.length));
}
}
response.setHeader("Accept-Ranges", "bytes");
response.setContentType(binaryMaterial.getContentType());
try {
if (ranges.isEmpty()) {
// Entire file
if (serveContent) {
response.setHeader("Content-Length", String.valueOf(data.length));
response.getOutputStream().write(data);
}
} else if (ranges.size() == 1) {
// Single byte range
Range r = ranges.get(0);
response.setHeader("Content-Range", String.format("bytes %d-%d/%d", r.start, r.end, r.total));
response.setHeader("Content-Length", String.valueOf(r.length));
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
if (serveContent) {
response.getOutputStream().write(data, r.start, r.length);
}
} else {
// Multiple byte ranges
response.setContentType("multipart/byteranges; boundary=MULTIPART_BYTERANGES");
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
if (serveContent) {
for (Range r : ranges) {
response.getOutputStream().println();
response.getOutputStream().println("--MULTIPART_BYTERANGES");
response.getOutputStream().println(String.format("Content-Type: %s", binaryMaterial.getContentType()));
response.getOutputStream().println(String.format("Content-Range: bytes %d-%d/%d", r.start, r.end, r.total));
response.getOutputStream().write(data, r.start, r.length);
}
response.getOutputStream().println();
response.getOutputStream().println("--MULTIPART_BYTERANGES--");
}
}
} finally {
response.getOutputStream().flush();
}
} else if (material instanceof HtmlMaterial) {
HtmlMaterial htmlMaterial = (HtmlMaterial) material;
byte[] data = htmlMaterial.getHtml().getBytes("UTF-8");
response.setContentLength(data.length);
response.setContentType("text/html; charset=UTF-8");
try {
response.getOutputStream().write(data);
} finally {
response.getOutputStream().flush();
}
}
} else {
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
}
use of fi.otavanopisto.muikku.plugins.material.model.Material in project muikku by otavanopisto.
the class WorkspaceRESTService method getWorkspaceMaterialAnswers.
@GET
@Path("/workspaces/{WORKSPACEENTITYID}/materials/{WORKSPACEMATERIALID}/compositeMaterialReplies")
@RESTPermitUnimplemented
public Response getWorkspaceMaterialAnswers(@PathParam("WORKSPACEENTITYID") Long workspaceEntityId, @PathParam("WORKSPACEMATERIALID") Long workspaceMaterialId, @QueryParam("userEntityId") Long userEntityId) {
// TODO: Security
if (!sessionController.isLoggedIn()) {
return Response.status(Status.UNAUTHORIZED).entity("Not logged in").build();
}
// TODO Return everyone's answers
if (userEntityId == null) {
return Response.status(Status.NOT_IMPLEMENTED).build();
}
UserEntity userEntity = userEntityController.findUserEntityById(userEntityId);
WorkspaceMaterial workspaceMaterial = workspaceMaterialController.findWorkspaceMaterialById(workspaceMaterialId);
if (workspaceMaterial == null) {
return Response.status(Status.NOT_FOUND).entity("Workspace material could not be found").build();
}
List<WorkspaceMaterialFieldAnswer> answers = new ArrayList<>();
try {
fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterialReply reply = workspaceMaterialReplyController.findWorkspaceMaterialReplyByWorkspaceMaterialAndUserEntity(workspaceMaterial, userEntity);
if (reply != null) {
List<WorkspaceMaterialField> fields = workspaceMaterialFieldController.listWorkspaceMaterialFieldsByWorkspaceMaterial(workspaceMaterial);
for (WorkspaceMaterialField field : fields) {
String value = workspaceMaterialFieldController.retrieveFieldValue(field, reply);
Material material = field.getQueryField().getMaterial();
WorkspaceMaterialFieldAnswer answer = new WorkspaceMaterialFieldAnswer(workspaceMaterial.getId(), material.getId(), field.getEmbedId(), field.getQueryField().getName(), value);
answers.add(answer);
}
}
WorkspaceMaterialCompositeReply result = new WorkspaceMaterialCompositeReply(answers, reply != null ? reply.getState() : null, reply != null ? reply.getCreated() : null, reply != null ? reply.getLastModified() : null, reply != null ? reply.getSubmitted() : null, reply != null ? reply.getWithdrawn() : null);
return Response.ok(result).build();
} catch (WorkspaceFieldIOException e) {
return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Internal error occurred while retrieving field answers: " + e.getMessage()).build();
}
}
use of fi.otavanopisto.muikku.plugins.material.model.Material in project muikku by otavanopisto.
the class DeusNexMachinaRESTService method cleanMaterials.
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);
}
}
}
}
Aggregations