/** {@inheritDoc} */ public synchronized Result createConference(String creator, String mucRoomName) { Conference conference = conferenceMap.get(mucRoomName); if (conference == null) { // Create new conference try { ApiResult result = api.createNewConference(creator, mucRoomName); if (result.getError() == null) { conference = result.getConference(); conferenceMap.put(mucRoomName, conference); } else if (result.getStatusCode() == 409 && result.getError().getConflictId() != null) { Number conflictId = result.getError().getConflictId(); // Conference already exists(check if we have it locally) conference = findConferenceForId(conflictId); logger.info("Conference '" + mucRoomName + "' already " + "allocated, id: " + conflictId); // do GET conflict conference if (conference == null) { ApiResult getResult = api.getConference(conflictId); if (getResult.getConference() != null) { conference = getResult.getConference(); // Fill full room name as it is not transferred // over REST API conference.setMucRoomName(mucRoomName); conferenceMap.put(mucRoomName, conference); } else { logger.error("API error: " + result); return new Result(RESULT_INTERNAL_ERROR, result.getError().getMessage()); } } } else { // Other error logger.error("API error: " + result); return new Result(RESULT_INTERNAL_ERROR, result.getError().getMessage()); } } catch (FaultTolerantRESTRequest.RetryExhaustedException e) { logger.error(e, e); return new Result(RESULT_INTERNAL_ERROR, e.getMessage()); } catch (UnsupportedEncodingException e) { logger.error(e, e); return new Result(RESULT_INTERNAL_ERROR, e.getMessage()); } } // Verify owner == creator if (creator.equals(conference.getOwner())) { return new Result(RESULT_OK); } else { logger.error( "Room " + mucRoomName + ", conflict : " + creator + " != " + conference.getOwner()); return new Result(RESULT_CONFLICT); } }
/** * Finds conference for given ID assigned by the reservation system. * * @param id identifier of the conference to find. * @return <tt>Conference</tt> for given <tt>id</tt> or <tt>null</tt> if not found. */ private Conference findConferenceForId(Number id) { for (Conference conference : conferenceMap.values()) { if (conference.getId().equals(id)) { return conference; } } return null; }
/** Deletes conference for given <tt>mucRoomName</tt> through the API. */ Result deleteConference(String mucRoomName) { Conference conference = conferenceMap.get(mucRoomName); if (conference != null) { // Delete conference Number id = conference.getId(); int result = deleteConference(id); if (result == RESULT_OK) { conferenceMap.remove(mucRoomName); } else { // Other error return new Result(result); } } return new Result(RESULT_OK); }
/** * Implements in order to listen for ended conferences and remove them from the reservation * system. * * <p>{@inheritDoc} */ @Override public synchronized void onFocusDestroyed(String roomName) { // roomName = MucUtil.extractName(roomName); // Focus destroyed Conference conference = conferenceMap.get(roomName); if (conference == null) { logger.info("Conference " + roomName + " already destroyed"); return; } Result result = deleteConference(roomName); if (result.getCode() == RESULT_OK) { logger.info("Deleted conference from the reservation system: " + roomName); } else { logger.error("Failed to delete room: " + roomName + ", error code: " + result); } }