use of fi.foyt.coops.CoOpsInternalErrorException in project muikku by otavanopisto.
the class CoOpsApiImpl method filePatch.
public void filePatch(String fileId, String sessionId, Long revisionNumber, String patch, Map<String, String> properties, Map<String, Object> extensions) throws CoOpsInternalErrorException, CoOpsUsageException, CoOpsNotFoundException, CoOpsConflictException, CoOpsForbiddenException {
CoOpsSession session = coOpsSessionController.findSessionBySessionId(sessionId);
if (session == null) {
throw new CoOpsUsageException("Invalid session id");
}
CoOpsDiffAlgorithm algorithm = htmlMaterialController.findAlgorithm(session.getAlgorithm());
if (algorithm == null) {
throw new CoOpsUsageException("Algorithm is not supported by this server");
}
HtmlMaterial htmlMaterial = findFile(fileId);
Long maxRevision = htmlMaterialController.lastHtmlMaterialRevision(htmlMaterial);
if (!maxRevision.equals(revisionNumber)) {
throw new CoOpsConflictException();
}
ObjectMapper objectMapper = new ObjectMapper();
String checksum = null;
if (StringUtils.isNotBlank(patch)) {
String data = htmlMaterialController.getRevisionHtml(htmlMaterial, maxRevision);
if (data == null) {
data = "";
}
String patched = algorithm.patch(data, patch);
checksum = DigestUtils.md5Hex(patched);
}
Long patchRevisionNumber = maxRevision + 1;
HtmlMaterialRevision htmlMaterialRevision = htmlMaterialController.createRevision(htmlMaterial, sessionId, patchRevisionNumber, new Date(), patch, checksum);
if (properties != null) {
for (String key : properties.keySet()) {
String value = properties.get(key);
htmlMaterialController.createRevisionProperty(htmlMaterialRevision, key, value);
}
}
if (extensions != null) {
for (String key : extensions.keySet()) {
String value;
try {
value = objectMapper.writeValueAsString(extensions.get(key));
} catch (IOException e) {
throw new CoOpsInternalErrorException(e);
}
htmlMaterialController.createRevisionExtensionProperty(htmlMaterialRevision, key, value);
}
}
patchEvent.fire(new CoOpsPatchEvent(fileId, new Patch(sessionId, patchRevisionNumber, checksum, patch, properties, extensions)));
}
use of fi.foyt.coops.CoOpsInternalErrorException in project muikku by otavanopisto.
the class CoOpsApiImpl method fileJoin.
public Join fileJoin(String fileId, List<String> algorithms, String protocolVersion) throws CoOpsNotFoundException, CoOpsNotImplementedException, CoOpsInternalErrorException, CoOpsForbiddenException, CoOpsUsageException {
HtmlMaterial htmlMaterial = findFile(fileId);
if (!COOPS_PROTOCOL_VERSION.equals(protocolVersion)) {
throw new CoOpsNotImplementedException("Protocol version mismatch. Client is using " + protocolVersion + " and server " + COOPS_PROTOCOL_VERSION);
}
if (algorithms == null || algorithms.isEmpty()) {
throw new CoOpsInternalErrorException("Invalid request");
}
CoOpsDiffAlgorithm algorithm = htmlMaterialController.findAlgorithm(algorithms);
if (algorithm == null) {
throw new CoOpsNotImplementedException("Server and client do not have a commonly supported algorithm.");
}
Long currentRevision = htmlMaterialController.lastHtmlMaterialRevision(htmlMaterial);
String data = htmlMaterialController.getRevisionHtml(htmlMaterial, currentRevision);
if (data == null) {
data = "";
}
Map<String, String> properties = htmlMaterialController.getRevisionProperties(htmlMaterial, currentRevision);
// TODO: Extension properties...
Map<String, Object> extensions = new HashMap<>();
String sessionId = UUID.randomUUID().toString();
CoOpsSession coOpsSession = coOpsSessionController.createSession(htmlMaterial, sessionController.getLoggedUserEntity(), sessionId, currentRevision, algorithm.getName());
addSessionEventsExtension(htmlMaterial, extensions);
addWebSocketExtension(htmlMaterial, extensions, coOpsSession);
return new Join(coOpsSession.getSessionId(), coOpsSession.getAlgorithm(), coOpsSession.getJoinRevision(), data, htmlMaterial.getContentType(), properties, extensions);
}
use of fi.foyt.coops.CoOpsInternalErrorException in project muikku by otavanopisto.
the class HtmlMaterialRESTService method publishMaterial.
@POST
@Path("/{id}/publish/")
@RESTPermit(handling = Handling.INLINE, requireLoggedIn = true)
public Response publishMaterial(@PathParam("id") Long id, HtmlRestMaterialPublish entity) {
if (!sessionController.hasEnvironmentPermission(MuikkuPermissions.MANAGE_MATERIALS)) {
return Response.status(Status.FORBIDDEN).entity("Permission denied").build();
}
HtmlMaterial htmlMaterial = htmlMaterialController.findHtmlMaterialById(id);
if (htmlMaterial == null) {
return Response.status(Status.NOT_FOUND).build();
}
if (!htmlMaterial.getRevisionNumber().equals(entity.getFromRevision())) {
return Response.status(Status.CONFLICT).entity(new HtmlRestMaterialPublishError(HtmlRestMaterialPublishError.Reason.CONCURRENT_MODIFICATIONS)).build();
}
try {
File fileRevision = coOpsApi.fileGet(id.toString(), entity.getToRevision());
if (fileRevision == null) {
return Response.status(Status.NOT_FOUND).build();
}
htmlMaterialController.updateHtmlMaterialToRevision(htmlMaterial, fileRevision.getContent(), entity.getToRevision(), false, entity.getRemoveAnswers() != null ? entity.getRemoveAnswers() : false);
} catch (WorkspaceMaterialContainsAnswersExeption e) {
return Response.status(Status.CONFLICT).entity(new HtmlRestMaterialPublishError(HtmlRestMaterialPublishError.Reason.CONTAINS_ANSWERS)).build();
} catch (CoOpsNotImplementedException | CoOpsNotFoundException | CoOpsUsageException | CoOpsInternalErrorException | CoOpsForbiddenException e) {
return Response.status(Status.INTERNAL_SERVER_ERROR).build();
}
return Response.noContent().build();
}
use of fi.foyt.coops.CoOpsInternalErrorException in project muikku by otavanopisto.
the class CoOpsDocumentWebSocket method onMessage.
@OnMessage
public void onMessage(Reader messageReader, Session client, @PathParam("HTMLMATERIALID") String fileId, @PathParam("SESSIONID") String sessionId) throws IOException {
CoOpsSession session = coOpsSessionController.findSessionBySessionId(sessionId);
if (session == null) {
client.close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "Not Found"));
return;
}
if (!session.getHtmlMaterial().getId().equals(NumberUtils.createLong(fileId))) {
client.close(new CloseReason(CloseReason.CloseCodes.VIOLATED_POLICY, "Session is associated with another fileId"));
return;
}
ObjectMapper objectMapper = new ObjectMapper();
try {
PatchMessage patchMessage;
try {
patchMessage = objectMapper.readValue(messageReader, PatchMessage.class);
} catch (IOException e) {
throw new CoOpsInternalErrorException(e);
}
if (patchMessage == null) {
throw new CoOpsInternalErrorException("Could not parse message");
}
if (!patchMessage.getType().equals("patch")) {
throw new CoOpsInternalErrorException("Unknown message type: " + patchMessage.getType());
}
Patch patch = patchMessage.getData();
coOpsApi.filePatch(fileId, patch.getSessionId(), patch.getRevisionNumber(), patch.getPatch(), patch.getProperties(), patch.getExtensions());
} catch (CoOpsInternalErrorException e) {
client.close(new CloseReason(CloseReason.CloseCodes.UNEXPECTED_CONDITION, "Internal Error"));
} catch (CoOpsUsageException e) {
client.getAsyncRemote().sendText(objectMapper.writeValueAsString(new ErrorMessage("patchError", 400, e.getMessage())));
} catch (CoOpsNotFoundException e) {
client.getAsyncRemote().sendText(objectMapper.writeValueAsString(new ErrorMessage("patchError", 404, e.getMessage())));
} catch (CoOpsConflictException e) {
client.getAsyncRemote().sendText(objectMapper.writeValueAsString(new ErrorMessage("patchRejected", 409, "Conflict")));
} catch (CoOpsForbiddenException e) {
client.getAsyncRemote().sendText(objectMapper.writeValueAsString(new ErrorMessage("patchError", 500, e.getMessage())));
}
}
use of fi.foyt.coops.CoOpsInternalErrorException in project muikku by otavanopisto.
the class HtmlMaterialController method getRevisionHtml.
public String getRevisionHtml(HtmlMaterial htmlMaterial, long revision) throws CoOpsInternalErrorException {
String result = htmlMaterial.getHtml();
if (result == null) {
result = "";
}
long baselineRevision = htmlMaterial.getRevisionNumber();
CoOpsDiffAlgorithm algorithm = findAlgorithm("dmp");
if (revision < baselineRevision) {
List<HtmlMaterialRevision> revisions = htmlMaterialRevisionDAO.listByFileAndRevisionGeAndRevisonLtOrderedByRevision(htmlMaterial, revision, baselineRevision);
for (int i = revisions.size() - 1; i >= 0; i--) {
HtmlMaterialRevision patchingRevision = revisions.get(i);
try {
if (patchingRevision.getData() != null) {
result = algorithm.unpatch(result, patchingRevision.getData());
}
} catch (CoOpsConflictException e) {
throw new CoOpsInternalErrorException("Patch failed when building material revision number " + revision);
}
}
} else {
List<HtmlMaterialRevision> revisions = htmlMaterialRevisionDAO.listByFileAndRevisionGtAndRevisonLeOrderedByRevision(htmlMaterial, baselineRevision, revision);
for (HtmlMaterialRevision patchingRevision : revisions) {
try {
if (patchingRevision.getData() != null) {
result = algorithm.patch(result, patchingRevision.getData());
}
} catch (CoOpsConflictException e) {
throw new CoOpsInternalErrorException("Patch failed when building material revision number " + revision);
}
}
}
return result;
}
Aggregations