/** * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at the * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Initial code contributed and copyrighted by<br> * frentix GmbH, http://www.frentix.com * <p> */ package org.olat.modules.gotomeeting.restapi; import java.util.List; import java.util.Locale; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.modules.gotomeeting.GoToMeeting; import org.olat.modules.gotomeeting.GoToMeetingManager; import org.olat.modules.gotomeeting.GoToOrganizer; import org.olat.modules.gotomeeting.model.GoToError; import org.olat.modules.gotomeeting.model.GoToErrors; import org.olat.modules.gotomeeting.model.GoToType; import org.olat.modules.gotomeeting.ui.GoToMeetingRunController; import org.olat.repository.RepositoryEntry; import org.springframework.beans.factory.annotation.Autowired; /** * * Initial date: 24.03.2016<br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ public class GoToTrainingWebService { private static final OLog log = Tracing.createLoggerFor(GoToTrainingWebService.class); private final String subIdentifier; private final RepositoryEntry entry; @Autowired private GoToMeetingManager meetingManager; public GoToTrainingWebService(RepositoryEntry entry, String subIdentifier) { this.entry = entry; this.subIdentifier = subIdentifier; } /** * returns the list of booking of the resource. * * @response.representation.200.qname {http://www.example.com}goToTrainingVO * @response.representation.200.mediaType application/xml, application/json * @response.representation.200.doc This is the list of all training of a resource * @response.representation.200.example {@link org.olat.modules.gotomeeting.restapi.Examples#SAMPLE_GoToTrainingVO} * @return The list of trainings */ @GET @Path("trainings") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getTrainings() { try { List<GoToMeeting> meetings = meetingManager.getMeetings(GoToType.training, entry, subIdentifier, null); GoToTrainingVO[] bookingVos = new GoToTrainingVO[meetings.size()]; int count = 0; for(GoToMeeting meeting:meetings) { bookingVos[count++] = new GoToTrainingVO(meeting); } return Response.ok(bookingVos).build(); } catch (Exception e) { log.error("", e); return handleUnexpectedException(); } } /** * Return the created or updated training * * @response.representation.200.qname {http://www.example.com}goToTrainingVO * @response.representation.200.mediaType application/xml, application/json * @response.representation.200.doc Created a training * @response.representation.200.example {@link org.olat.modules.gotomeeting.restapi.Examples#SAMPLE_GoToTrainingVO} * @return The list of vitero booking */ @PUT @Path("trainings") @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response createTraining(GoToTrainingVO training) { return saveTraining(training); } /** * Return the created or updated training * * @response.representation.200.qname {http://www.example.com}goToTrainingVO * @response.representation.200.mediaType application/xml, application/json * @response.representation.200.doc The created booking * @response.representation.200.example {@link org.olat.modules.gotomeeting.restapi.Examples#SAMPLE_GoToTrainingVO} * @return The list of vitero booking */ @POST @Path("trainings") @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response updateTraining(GoToTrainingVO training) { return saveTraining(training); } private Response saveTraining(GoToTrainingVO training) { try { GoToMeeting meeting = null; GoToError error = new GoToError(); if(training.getKey() == null) { boolean organizerFound = false; List<GoToOrganizer> organizers = meetingManager.getSystemOrganizers(); for(GoToOrganizer organizer:organizers) { boolean available = meetingManager.checkOrganizerAvailability(organizer, training.getStart(), training.getEnd()); if(available) { meeting = meetingManager.scheduleTraining(organizer, training.getName(), training.getExternalId(), "-", training.getStart(), training.getEnd(), entry, subIdentifier, null, error); organizerFound = true; if(!error.hasError()) { break; } } } if(!organizerFound) { error.setError(GoToErrors.OrganizerOverlap); } } else { meeting = meetingManager.getMeetingByExternalId(training.getExternalId()); if(meeting == null) { List<GoToOrganizer> organizers = meetingManager.getSystemOrganizers(); for(GoToOrganizer organizer:organizers) { meeting = meetingManager.scheduleTraining(organizer, training.getName(), training.getExternalId(), "-", training.getStart(), training.getEnd(), entry, subIdentifier, null, error); if(!error.hasError()) { break; } } } else { meetingManager.updateTraining(meeting, training.getName(), "-", training.getStart(), training.getEnd(), error); } } Response response; if(error.hasError()) { response = handleGoToTrainingError(error); } else if (meeting == null){ response = handleUnexpectedException(); } else { response = Response.ok(new GoToTrainingVO(meeting)).build(); } return response; } catch (Exception e) { log.error("", e); return handleUnexpectedException(); } } /** * Delete the training * * @response.representation.200.doc The training is deleted * @return Nothing */ @DELETE @Path("/trainings/{trainingKey}") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response deleteTraining(@PathParam("trainingKey") Long trainingKey) { try { GoToMeeting meeting = meetingManager.getMeetingByKey(trainingKey); if(meeting == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } else if(meetingManager.delete(meeting)) { return Response.ok().build(); } else { return Response.serverError().status(500).build(); } } catch (Exception e) { log.error("", e); return handleUnexpectedException(); } } private Response handleGoToTrainingError(GoToError error) { return Response.serverError().entity(goToErrorVO(error)).status(500).build(); } private GoToErrorVO goToErrorVO(GoToError error) { String msg = ""; if(error.getError() != null) { msg = Util.createPackageTranslator(GoToMeetingRunController.class, Locale.ENGLISH) .translate(error.getError().i18nKey()); } if(!StringHelper.containsNonWhitespace(msg) || msg.length() > 1024) { msg = error.getDescription(); } return new GoToErrorVO(error, msg); } private Response handleUnexpectedException() { GoToError status = new GoToError(GoToErrors.Unkown); GoToErrorVO error = new GoToErrorVO(status, "GoToTraining server returned an unexpected error"); return Response.serverError().entity(error).status(Status.INTERNAL_SERVER_ERROR).build(); } }