/**
* <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.manager;
import java.util.Date;
import java.util.List;
import javax.persistence.TemporalType;
import javax.persistence.TypedQuery;
import org.olat.core.commons.persistence.DB;
import org.olat.core.util.StringHelper;
import org.olat.group.BusinessGroup;
import org.olat.group.BusinessGroupRef;
import org.olat.modules.gotomeeting.GoToMeeting;
import org.olat.modules.gotomeeting.GoToOrganizer;
import org.olat.modules.gotomeeting.model.GoToMeetingImpl;
import org.olat.modules.gotomeeting.model.GoToType;
import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryEntryRef;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
*
* Initial date: 21.03.2016<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
@Service
public class GoToMeetingDAO {
@Autowired
private DB dbInstance;
public GoToMeeting createTraining(String name, String externalId, String description,
String meetingKey, Date start, Date end, GoToOrganizer organizer,
RepositoryEntry resourceOwner, String subIdentifier, BusinessGroup businessGroup) {
GoToMeetingImpl meeting = new GoToMeetingImpl();
meeting.setCreationDate(new Date());
meeting.setLastModified(meeting.getCreationDate());
meeting.setGoToType(GoToType.training);
meeting.setName(name);
meeting.setExternalId(externalId);
meeting.setDescription(description);
meeting.setStartDate(start);
meeting.setEndDate(end);
meeting.setMeetingKey(meetingKey);
meeting.setOrganizer(organizer);
meeting.setEntry(resourceOwner);
meeting.setSubIdent(subIdentifier);
meeting.setBusinessGroup(businessGroup);
dbInstance.getCurrentEntityManager().persist(meeting);
return meeting;
}
public GoToMeeting loadMeetingByKey(Long key) {
String q = "select meeting from gotomeeting meeting inner join fetch meeting.organizer organizer where meeting.key=:meetingKey";
List<GoToMeeting> meetings = dbInstance.getCurrentEntityManager()
.createQuery(q, GoToMeeting.class)
.setParameter("meetingKey", key)
.getResultList();
return meetings == null || meetings.isEmpty() ? null : meetings.get(0);
}
public GoToMeeting loadMeetingByExternalId(String externalId) {
String q = "select meeting from gotomeeting meeting inner join fetch meeting.organizer organizer where meeting.externalId=:externalId";
List<GoToMeeting> meetings = dbInstance.getCurrentEntityManager()
.createQuery(q, GoToMeeting.class)
.setParameter("externalId", externalId)
.getResultList();
return meetings == null || meetings.isEmpty() ? null : meetings.get(0);
}
public int countMeetingsOrganizedBy(GoToOrganizer organizer) {
String q = "select count(meeting.key) from gotomeeting meeting where meeting.organizer.key=:organizerKey";
List<Number> counts = dbInstance.getCurrentEntityManager()
.createQuery(q, Number.class)
.setParameter("organizerKey", organizer.getKey())
.getResultList();
return counts == null || counts.isEmpty() || counts.get(0) == null ? 0 : counts.get(0).intValue();
}
public List<GoToMeeting> getMeetings() {
StringBuilder sb = new StringBuilder(512);
sb.append("select meeting from gotomeeting meeting")
.append(" inner join fetch meeting.organizer organizer")
.append(" left join fetch meeting.entry entry")
.append(" left join fetch meeting.businessGroup bGroup");
return dbInstance.getCurrentEntityManager()
.createQuery(sb.toString(), GoToMeeting.class)
.getResultList();
}
public List<GoToMeeting> getMeetings(GoToType type, RepositoryEntryRef entry, String subIdent, BusinessGroupRef businessGroup) {
StringBuilder sb = new StringBuilder(512);
sb.append("select meeting from gotomeeting meeting inner join fetch meeting.organizer organizer where meeting.type=:type");
if(entry != null) {
sb.append(" and meeting.entry.key=:entryKey");
}
if(StringHelper.containsNonWhitespace(subIdent)) {
sb.append(" and meeting.subIdent=:subIdent");
}
if(businessGroup != null) {
sb.append(" and meeting.businessGroup.key=:groupKey");
}
TypedQuery<GoToMeeting> query = dbInstance.getCurrentEntityManager()
.createQuery(sb.toString(), GoToMeeting.class)
.setParameter("type", type.name());
if(entry != null) {
query.setParameter("entryKey", entry.getKey());
}
if(StringHelper.containsNonWhitespace(subIdent)) {
query.setParameter("subIdent", subIdent);
}
if(businessGroup != null) {
query.setParameter("groupKey", businessGroup.getKey());
}
return query.getResultList();
}
public List<GoToMeeting> getMeetingsOverlap(GoToType type, GoToOrganizer organizer, Date start, Date end) {
StringBuilder sb = new StringBuilder();
sb.append("select meeting from gotomeeting meeting")
.append(" inner join meeting.organizer organizer on organizer.key=:organizerKey")
.append(" where meeting.type=:type")
.append(" and ((meeting.startDate<=:start and meeting.endDate>=:start)")
.append(" or (meeting.startDate<=:end and meeting.endDate>=:end)")
.append(" or (meeting.startDate>=:start and meeting.endDate<=:end))");
List<GoToMeeting> meetings = dbInstance.getCurrentEntityManager()
.createQuery(sb.toString(), GoToMeeting.class)
.setParameter("organizerKey", organizer.getKey())
.setParameter("type", type.name())
.setParameter("start", start, TemporalType.TIMESTAMP)
.setParameter("end", end, TemporalType.TIMESTAMP)
.getResultList();
return meetings;
}
public GoToMeeting update(GoToMeeting meeting) {
((GoToMeetingImpl)meeting).setLastModified(new Date());
return dbInstance.getCurrentEntityManager().merge(meeting);
}
public int delete(GoToMeeting meeting) {
//delete registrants
String d1 = "delete from gotoregistrant as registrant where registrant.meeting.key=:meetingKey";
int deletedRows = dbInstance.getCurrentEntityManager()
.createQuery(d1)
.setParameter("meetingKey", meeting.getKey())
.executeUpdate();
String d2 = "delete from gotomeeting as meeting where meeting.key=:meetingKey";
deletedRows += dbInstance.getCurrentEntityManager()
.createQuery(d2)
.setParameter("meetingKey", meeting.getKey())
.executeUpdate();
return deletedRows;
}
}