From 7ac0171879591fb8f2f3f526e5e42f9fa0d00c37 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Tue, 1 Dec 2015 08:38:06 +0100 Subject: [PATCH] CL-440: enhance the REST API for certification --- .../NewCachePersistingAssessmentManager.java | 4 +- .../certificate/CertificatesManager.java | 5 +- .../manager/CertificatesManagerImpl.java | 15 +++--- .../certificate/model/JmsCertificateWork.java | 12 ++++- .../restapi/CertificationWebService.java | 53 +++++++++++++++++-- ...ssessedIdentityCertificatesController.java | 4 +- .../ui/CertificatesWizardController.java | 4 +- .../ims/qti/editor/ChoiceItemController.java | 3 +- .../manager/CertificatesManagerTest.java | 14 ++--- .../org/olat/restapi/CertificationTest.java | 43 +++++++++++++-- .../java/org/olat/restapi/RestConnection.java | 7 +++ 11 files changed, 128 insertions(+), 36 deletions(-) diff --git a/src/main/java/org/olat/course/assessment/NewCachePersistingAssessmentManager.java b/src/main/java/org/olat/course/assessment/NewCachePersistingAssessmentManager.java index 63b41bb1ca5..ebf2473260a 100644 --- a/src/main/java/org/olat/course/assessment/NewCachePersistingAssessmentManager.java +++ b/src/main/java/org/olat/course/assessment/NewCachePersistingAssessmentManager.java @@ -52,7 +52,6 @@ import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.coordinate.SyncerCallback; import org.olat.core.util.coordinate.SyncerExecutor; import org.olat.core.util.event.GenericEventListener; -import org.olat.core.util.mail.MailerResult; import org.olat.core.util.resource.OresHelper; import org.olat.course.CourseFactory; import org.olat.course.ICourse; @@ -896,8 +895,7 @@ public class NewCachePersistingAssessmentManager extends BasicManager implements template = certificatesManager.getTemplateById(templateId); } CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, score, passed); - MailerResult result = new MailerResult(); - certificatesManager.generateCertificate(certificateInfos, courseEntry, template, result); + certificatesManager.generateCertificate(certificateInfos, courseEntry, template, true); } } diff --git a/src/main/java/org/olat/course/certificate/CertificatesManager.java b/src/main/java/org/olat/course/certificate/CertificatesManager.java index 171cf78cba6..d9d8377ca0c 100644 --- a/src/main/java/org/olat/course/certificate/CertificatesManager.java +++ b/src/main/java/org/olat/course/certificate/CertificatesManager.java @@ -30,7 +30,6 @@ import org.olat.core.commons.services.notifications.PublisherData; import org.olat.core.commons.services.notifications.SubscriptionContext; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; -import org.olat.core.util.mail.MailerResult; import org.olat.core.util.resource.OresHelper; import org.olat.core.util.vfs.VFSLeaf; import org.olat.course.ICourse; @@ -155,9 +154,9 @@ public interface CertificatesManager { public Certificate uploadStandaloneCertificate(Identity identity, Date creationDate, String courseTitle, Long resourceKey, File certificateFile); - public void generateCertificates(List<CertificateInfos> identities, RepositoryEntry entry, CertificateTemplate template, MailerResult result); + public void generateCertificates(List<CertificateInfos> identities, RepositoryEntry entry, CertificateTemplate template, boolean sendMail); - public Certificate generateCertificate(CertificateInfos identity, RepositoryEntry entry, CertificateTemplate template, MailerResult result); + public Certificate generateCertificate(CertificateInfos identity, RepositoryEntry entry, CertificateTemplate template, boolean sendMail); public void deleteCertificate(Certificate certificate); diff --git a/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java b/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java index 044c9d67c5e..7c18e9b4f64 100644 --- a/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java +++ b/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java @@ -657,10 +657,10 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList @Override public void generateCertificates(List<CertificateInfos> certificateInfos, RepositoryEntry entry, - CertificateTemplate template, MailerResult result) { + CertificateTemplate template, boolean sendMail) { int count = 0; for(CertificateInfos certificateInfo:certificateInfos) { - generateCertificate(certificateInfo, entry, template, result); + generateCertificate(certificateInfo, entry, template, sendMail); if(++count % 10 == 0) { dbInstance.commitAndCloseSession(); } @@ -706,14 +706,14 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList @Override public Certificate generateCertificate(CertificateInfos certificateInfos, RepositoryEntry entry, - CertificateTemplate template, MailerResult result) { - Certificate certificate = persistCertificate(certificateInfos, entry, template); + CertificateTemplate template, boolean sendMail) { + Certificate certificate = persistCertificate(certificateInfos, entry, template, sendMail); markPublisherNews(null, entry.getOlatResource()); return certificate; } private Certificate persistCertificate(CertificateInfos certificateInfos, RepositoryEntry entry, - CertificateTemplate template) { + CertificateTemplate template, boolean sendMail) { OLATResource resource = entry.getOlatResource(); Identity identity = certificateInfos.getAssessedIdentity(); @@ -736,7 +736,7 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList dbInstance.commit(); //send message - sendJmsCertificateFile(certificate, template, certificateInfos.getScore(), certificateInfos.getPassed()); + sendJmsCertificateFile(certificate, template, certificateInfos.getScore(), certificateInfos.getPassed(), sendMail); return certificate; } @@ -745,7 +745,7 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList return velocityEngine; } - private void sendJmsCertificateFile(Certificate certificate, CertificateTemplate template, Float score, Boolean passed) { + private void sendJmsCertificateFile(Certificate certificate, CertificateTemplate template, Float score, Boolean passed, boolean sendMail) { QueueSender sender; QueueSession session = null; try { @@ -756,6 +756,7 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList } workUnit.setPassed(passed); workUnit.setScore(score); + workUnit.setSendMail(sendMail); session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE ); ObjectMessage message = session.createObjectMessage(); diff --git a/src/main/java/org/olat/course/certificate/model/JmsCertificateWork.java b/src/main/java/org/olat/course/certificate/model/JmsCertificateWork.java index ab143554034..68475a9fea7 100644 --- a/src/main/java/org/olat/course/certificate/model/JmsCertificateWork.java +++ b/src/main/java/org/olat/course/certificate/model/JmsCertificateWork.java @@ -35,14 +35,16 @@ public class JmsCertificateWork implements Serializable { private Boolean passed; private Long templateKey; private Long certificateKey; + private boolean sendMail; public JmsCertificateWork() { // } - public JmsCertificateWork(Long certificateKey, Long templateKey, Float score, Boolean passed) { + public JmsCertificateWork(Long certificateKey, Long templateKey, Float score, Boolean passed, boolean sendMail) { this.score = score; this.passed = passed; + this.sendMail = sendMail; this.templateKey = templateKey; this.certificateKey = certificateKey; } @@ -63,6 +65,14 @@ public class JmsCertificateWork implements Serializable { this.passed = passed; } + public boolean isSendMail() { + return sendMail; + } + + public void setSendMail(boolean sendMail) { + this.sendMail = sendMail; + } + public Long getTemplateKey() { return templateKey; } diff --git a/src/main/java/org/olat/course/certificate/restapi/CertificationWebService.java b/src/main/java/org/olat/course/certificate/restapi/CertificationWebService.java index c08290a7775..e81ee18d64b 100644 --- a/src/main/java/org/olat/course/certificate/restapi/CertificationWebService.java +++ b/src/main/java/org/olat/course/certificate/restapi/CertificationWebService.java @@ -27,6 +27,7 @@ import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; import javax.ws.rs.GET; +import javax.ws.rs.HEAD; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; @@ -42,8 +43,9 @@ import javax.ws.rs.core.Response.Status; import org.olat.basesecurity.BaseSecurity; import org.olat.core.CoreSpringFactory; import org.olat.core.id.Identity; +import org.olat.core.id.OLATResourceable; import org.olat.core.util.StringHelper; -import org.olat.core.util.mail.MailerResult; +import org.olat.core.util.resource.OresHelper; import org.olat.core.util.vfs.VFSLeaf; import org.olat.course.CourseFactory; import org.olat.course.ICourse; @@ -65,6 +67,46 @@ import org.olat.restapi.support.ObjectFactory; */ @Path("repo/courses/{resourceKey}/certificates") public class CertificationWebService { + + + @HEAD + @Path("{identityKey}") + @Produces({"application/pdf"}) + public Response getCertificateInfo(@PathParam("identityKey") Long identityKey, @PathParam("resourceKey") Long resourceKey, + @Context HttpServletRequest request) { + if(!isAdmin(request)) { + return Response.serverError().status(Status.UNAUTHORIZED).build(); + } + + CertificatesManager certificatesManager = CoreSpringFactory.getImpl(CertificatesManager.class); + BaseSecurity baseSecurity = CoreSpringFactory.getImpl(BaseSecurity.class); + + Identity identity = baseSecurity.loadIdentityByKey(identityKey); + if(identity == null) { + return Response.serverError().status(Response.Status.NOT_FOUND).build(); + } + + OLATResourceable courseOres = OresHelper.createOLATResourceableInstance("CourseModule", resourceKey); + OLATResourceManager resourceManager = CoreSpringFactory.getImpl(OLATResourceManager.class); + OLATResource resource = resourceManager.findResourceable(courseOres); + if(resource == null) { + resource = resourceManager.findResourceById(resourceKey); + } + if(resource == null) { + return Response.serverError().status(Response.Status.NOT_FOUND).build(); + } + + Certificate certificate = certificatesManager.getLastCertificate(identity, resource.getKey()); + if(certificate == null) { + return Response.serverError().status(Response.Status.NOT_FOUND).build(); + } + + VFSLeaf certificateFile = certificatesManager.getCertificateLeaf(certificate); + if(certificateFile == null || !certificateFile.exists()) { + return Response.serverError().status(Response.Status.NOT_FOUND).build(); + } + return Response.ok().build(); + } /** * Return the certificate as PDF file. @@ -138,11 +180,15 @@ public class CertificationWebService { OLATResourceManager resourceManager = CoreSpringFactory.getImpl(OLATResourceManager.class); OLATResource resource = resourceManager.findResourceById(resourceKey); if(resource == null) { + resource = resourceManager.findResourceable(resourceKey, "CourseModule"); + } + + if(resource == null) { return Response.serverError().status(Response.Status.NOT_FOUND).build(); } else { CertificatesManager certificatesManager = CoreSpringFactory.getImpl(CertificatesManager.class); - ICourse course = CourseFactory.loadCourse(resource.getResourceableId()); + ICourse course = CourseFactory.loadCourse(resource); RepositoryEntry entry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); CertificateTemplate template = null; @@ -151,13 +197,12 @@ public class CertificationWebService { template = certificatesManager.getTemplateById(templateId); } - MailerResult result = new MailerResult(); CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, score, passed); if(StringHelper.containsNonWhitespace(creationDate)) { Date date = ObjectFactory.parseDate(creationDate); certificateInfos.setCreationDate(date); } - Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, template, result); + Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, template, false); if(certificate != null) { return Response.ok().build(); } diff --git a/src/main/java/org/olat/course/certificate/ui/AssessedIdentityCertificatesController.java b/src/main/java/org/olat/course/certificate/ui/AssessedIdentityCertificatesController.java index 4cc7b74868f..fe4608f029a 100644 --- a/src/main/java/org/olat/course/certificate/ui/AssessedIdentityCertificatesController.java +++ b/src/main/java/org/olat/course/certificate/ui/AssessedIdentityCertificatesController.java @@ -37,7 +37,6 @@ import org.olat.core.id.Identity; import org.olat.core.util.Formatter; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.event.GenericEventListener; -import org.olat.core.util.mail.MailerResult; import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.certificate.Certificate; @@ -211,8 +210,7 @@ public class AssessedIdentityCertificatesController extends BasicController impl Float score = scoreEval == null ? null : scoreEval.getScore(); Boolean passed = scoreEval == null ? null : scoreEval.getPassed(); CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, score, passed); - MailerResult result = new MailerResult(); - certificatesManager.generateCertificate(certificateInfos, courseEntry, template, result); + certificatesManager.generateCertificate(certificateInfos, courseEntry, template, true); loadList(); showInfo("msg.certificate.pending"); fireEvent(ureq, Event.CHANGED_EVENT); diff --git a/src/main/java/org/olat/course/certificate/ui/CertificatesWizardController.java b/src/main/java/org/olat/course/certificate/ui/CertificatesWizardController.java index 46ed0f81080..b778b2beb5e 100644 --- a/src/main/java/org/olat/course/certificate/ui/CertificatesWizardController.java +++ b/src/main/java/org/olat/course/certificate/ui/CertificatesWizardController.java @@ -34,7 +34,6 @@ import org.olat.core.gui.control.generic.wizard.StepRunnerCallback; import org.olat.core.gui.control.generic.wizard.StepsMainRunController; import org.olat.core.gui.control.generic.wizard.StepsRunContext; import org.olat.core.id.OLATResourceable; -import org.olat.core.util.mail.MailerResult; import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.assessment.AssessedIdentitiesTableDataModel; @@ -135,7 +134,6 @@ public class CertificatesWizardController extends BasicController { template = certificatesManager.getTemplateById(templateKey); } - MailerResult result = new MailerResult(); - certificatesManager.generateCertificates(assessedIdentitiesInfos, resource, template, result); + certificatesManager.generateCertificates(assessedIdentitiesInfos, resource, template, true); } } \ No newline at end of file diff --git a/src/main/java/org/olat/ims/qti/editor/ChoiceItemController.java b/src/main/java/org/olat/ims/qti/editor/ChoiceItemController.java index e6ea4c0d4c4..d9dd30b7676 100644 --- a/src/main/java/org/olat/ims/qti/editor/ChoiceItemController.java +++ b/src/main/java/org/olat/ims/qti/editor/ChoiceItemController.java @@ -129,7 +129,8 @@ public class ChoiceItemController extends BasicController implements ControllerE displayMaterialFormController(ureq, editQuestion, restrictedEdit, translate("fieldset.legend.question")); } else if (cmd.equals("editr")) { - editResponse = item.getQuestion().getResponses().get(posid); + List<Response> responses = item.getQuestion().getResponses(); + editResponse = responses.get(posid); Material responseMat = editResponse.getContent(); displayMaterialFormController(ureq, responseMat, restrictedEdit, translate("fieldset.legend.answers")); diff --git a/src/test/java/org/olat/course/certificate/manager/CertificatesManagerTest.java b/src/test/java/org/olat/course/certificate/manager/CertificatesManagerTest.java index 474bc0862d2..6a68f1cdbb1 100644 --- a/src/test/java/org/olat/course/certificate/manager/CertificatesManagerTest.java +++ b/src/test/java/org/olat/course/certificate/manager/CertificatesManagerTest.java @@ -97,7 +97,7 @@ public class CertificatesManagerTest extends OlatTestCase { dbInstance.commitAndCloseSession(); CertificateInfos certificateInfos = new CertificateInfos(identity, null, null); - Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, null); + Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, false); Assert.assertNotNull(certificate); Assert.assertNotNull(certificate.getKey()); Assert.assertNotNull(certificate.getUuid()); @@ -121,7 +121,7 @@ public class CertificatesManagerTest extends OlatTestCase { dbInstance.commitAndCloseSession(); CertificateInfos certificateInfos = new CertificateInfos(identity, 5.0f, Boolean.TRUE); - Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, null); + Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, false); Assert.assertNotNull(certificate); dbInstance.commitAndCloseSession(); @@ -161,7 +161,7 @@ public class CertificatesManagerTest extends OlatTestCase { dbInstance.commitAndCloseSession(); CertificateInfos certificateInfos = new CertificateInfos(identity, 5.0f, Boolean.TRUE); - Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, null); + Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, false); Assert.assertNotNull(certificate); dbInstance.commitAndCloseSession(); @@ -194,10 +194,10 @@ public class CertificatesManagerTest extends OlatTestCase { dbInstance.commitAndCloseSession(); CertificateInfos certificateInfos1 = new CertificateInfos(participant1, null, null); - Certificate certificate1 = certificatesManager.generateCertificate(certificateInfos1, entry, null, null); + Certificate certificate1 = certificatesManager.generateCertificate(certificateInfos1, entry, null, false); Assert.assertNotNull(certificate1); CertificateInfos certificateInfos2 = new CertificateInfos(participant2, null, null); - Certificate certificate2 = certificatesManager.generateCertificate(certificateInfos2, entry, null, null); + Certificate certificate2 = certificatesManager.generateCertificate(certificateInfos2, entry, null, false); Assert.assertNotNull(certificate2); dbInstance.commitAndCloseSession(); @@ -236,10 +236,10 @@ public class CertificatesManagerTest extends OlatTestCase { //make a certificate CertificateInfos certificateInfos1 = new CertificateInfos(participant1, null, null); - Certificate certificate1 = certificatesManager.generateCertificate(certificateInfos1, entry, null, null); + Certificate certificate1 = certificatesManager.generateCertificate(certificateInfos1, entry, null, false); Assert.assertNotNull(certificate1); CertificateInfos certificateInfos2 = new CertificateInfos(participant2, null, null); - Certificate certificate2 = certificatesManager.generateCertificate(certificateInfos2, entry, null, null); + Certificate certificate2 = certificatesManager.generateCertificate(certificateInfos2, entry, null, false); Assert.assertNotNull(certificate2); dbInstance.commitAndCloseSession(); diff --git a/src/test/java/org/olat/restapi/CertificationTest.java b/src/test/java/org/olat/restapi/CertificationTest.java index b3a5abc97ab..fd629f65ac6 100644 --- a/src/test/java/org/olat/restapi/CertificationTest.java +++ b/src/test/java/org/olat/restapi/CertificationTest.java @@ -32,6 +32,7 @@ import javax.ws.rs.core.UriBuilder; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpHead; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.entity.ContentType; @@ -42,7 +43,6 @@ import org.junit.Assert; import org.junit.Test; import org.olat.core.commons.persistence.DB; import org.olat.core.id.Identity; -import org.olat.core.util.mail.MailerResult; import org.olat.core.util.vfs.VFSLeaf; import org.olat.course.certificate.Certificate; import org.olat.course.certificate.CertificatesManager; @@ -68,7 +68,7 @@ public class CertificationTest extends OlatJerseyTestCase { @Test - public void getCertificate() throws IOException, URISyntaxException { + public void getCertificate_file() throws IOException, URISyntaxException { RestConnection conn = new RestConnection(); Assert.assertTrue(conn.login("administrator", "openolat")); @@ -76,9 +76,8 @@ public class CertificationTest extends OlatJerseyTestCase { Identity author = JunitTestHelper.createAndPersistIdentityAsAuthor("cert-2"); RepositoryEntry entry = JunitTestHelper.deployBasicCourse(author); - MailerResult result = new MailerResult(); CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, 2.0f, true); - Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, result); + Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, false); dbInstance.commitAndCloseSession(); Assert.assertNotNull(certificate); @@ -94,6 +93,42 @@ public class CertificationTest extends OlatJerseyTestCase { conn.shutdown(); } + @Test + public void getCertificate_head() throws IOException, URISyntaxException { + RestConnection conn = new RestConnection(); + Assert.assertTrue(conn.login("administrator", "openolat")); + + Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("cert-11"); + Identity unassessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("cert-12"); + Identity author = JunitTestHelper.createAndPersistIdentityAsAuthor("cert-2"); + RepositoryEntry entry = JunitTestHelper.deployBasicCourse(author); + + CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, 2.0f, true); + Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, false); + dbInstance.commitAndCloseSession(); + Assert.assertNotNull(certificate); + sleep(1000); + + URI uri = UriBuilder.fromUri(getContextURI()).path("repo").path("courses") + .path(entry.getOlatResource().getKey().toString()) + .path("certificates").path(assessedIdentity.getKey().toString()).build(); + HttpHead method = conn.createHead(uri, "application/pdf", true); + HttpResponse response = conn.execute(method); + Assert.assertEquals(200, response.getStatusLine().getStatusCode()); + EntityUtils.consume(response.getEntity()); + + //check with a stupid number + URI nonExistentUri = UriBuilder.fromUri(getContextURI()).path("repo").path("courses") + .path(entry.getOlatResource().getKey().toString()) + .path("certificates").path(unassessedIdentity.getKey().toString()).build(); + HttpHead nonExistentMethod = conn.createHead(nonExistentUri, "application/pdf", true); + HttpResponse nonExistentResponse = conn.execute(nonExistentMethod); + Assert.assertEquals(404, nonExistentResponse.getStatusLine().getStatusCode()); + EntityUtils.consume(nonExistentResponse.getEntity()); + + conn.shutdown(); + } + @Test public void generateCertificate() throws IOException, URISyntaxException { RestConnection conn = new RestConnection(); diff --git a/src/test/java/org/olat/restapi/RestConnection.java b/src/test/java/org/olat/restapi/RestConnection.java index f1133e0c420..0d12e054d20 100644 --- a/src/test/java/org/olat/restapi/RestConnection.java +++ b/src/test/java/org/olat/restapi/RestConnection.java @@ -47,6 +47,7 @@ import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpHead; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.methods.HttpRequestBase; @@ -236,6 +237,12 @@ public class RestConnection { return put; } + public HttpHead createHead(URI uri, String accept, boolean cookie) { + HttpHead head = new HttpHead(uri); + decorateHttpMessage(head,accept, "en", cookie); + return head; + } + public HttpGet createGet(URI uri, String accept, boolean cookie) { HttpGet get = new HttpGet(uri); decorateHttpMessage(get,accept, "en", cookie); -- GitLab