/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/syllabus/trunk/syllabus-impl/src/java/org/sakaiproject/component/app/syllabus/SyllabusManagerImpl.java $
* $Id: SyllabusManagerImpl.java 129426 2013-09-06 19:58:44Z holladay@longsight.com $
***********************************************************************************
*
* Copyright (c) 2003, 2004, 2005, 2006, 2008 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package org.sakaiproject.component.app.syllabus;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;
import java.util.TreeSet;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;
import org.sakaiproject.api.app.syllabus.SyllabusAttachment;
import org.sakaiproject.api.app.syllabus.SyllabusData;
import org.sakaiproject.api.app.syllabus.SyllabusItem;
import org.sakaiproject.api.app.syllabus.SyllabusManager;
import org.sakaiproject.calendar.api.Calendar;
import org.sakaiproject.calendar.api.CalendarEvent;
import org.sakaiproject.calendar.api.CalendarEventEdit;
import org.sakaiproject.calendar.api.CalendarService;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.sakaiproject.content.api.ContentHostingService;
import org.sakaiproject.content.api.ContentResource;
import org.sakaiproject.entity.api.Reference;
import org.sakaiproject.entity.api.ResourceProperties;
import org.sakaiproject.entity.api.EntityManager;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.exception.InUseException;
import org.sakaiproject.exception.PermissionException;
import org.sakaiproject.exception.TypeException;
import org.sakaiproject.site.api.Group;
import org.sakaiproject.site.api.SiteService;
import org.sakaiproject.time.api.Time;
import org.sakaiproject.time.api.TimeRange;
import org.sakaiproject.time.api.TimeService;
import org.sakaiproject.user.cover.UserDirectoryService;
import org.sakaiproject.user.api.Preferences;
import org.sakaiproject.user.api.PreferencesService;
import org.sakaiproject.user.api.User;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* SyllabusManagerImpl provides convenience functions to query the database
*
* @author <a href="mailto:jlannan@iupui.edu">Jarrod Lannan </a>
* @version $Id:
*/
public class SyllabusManagerImpl extends HibernateDaoSupport implements SyllabusManager
{
private ContentHostingService contentHostingService;
private CalendarService calendarService;
private PreferencesService preferencesService;
private TimeService timeService;
private EntityManager entityManager;
private static final String QUERY_BY_USERID_AND_CONTEXTID = "findSyllabusItemByUserAndContextIds";
private static final String QUERY_BY_CONTEXTID = "findSyllabusItemByContextId";
private static final String QUERY_LARGEST_POSITION = "findLargestSyllabusPosition";
private static final String USER_ID = "userId";
private static final String CONTEXT_ID = "contextId";
private static final String SURROGATE_KEY = "surrogateKey";
private static final String VIEW = "view";
private static final String SYLLABI = "syllabi";
private static final String FOREIGN_KEY = "foreignKey";
private static final String QUERY_BY_SYLLABUSDATAID = "findSyllabusDataByDataIds";
private static final String DATA_KEY = "syllabusId";
private static final String SYLLABUS_DATA_ID = "syllabusId";
private static final String ATTACHMENTS = "attachments";
public void setContentHostingService(ContentHostingService contentHostingService) {
this.contentHostingService = contentHostingService;
}
/**
* createSyllabusItem creates a new SyllabusItem
* @param userId
* @param contextId
* @param redirectURL
*
*/
public SyllabusItem createSyllabusItem(String userId, String contextId,
String redirectURL)
{
if (userId == null || contextId == null)
{
throw new IllegalArgumentException("Null Argument");
}
else
{
// construct a new SyllabusItem
SyllabusItem item = new SyllabusItemImpl(userId, contextId, redirectURL);
saveSyllabusItem(item);
return item;
}
}
/**
* getSyllabiForSyllabusItem returns the collection of syllabi
* @param syllabusItem
*/
public Set getSyllabiForSyllabusItem(final SyllabusItem syllabusItem)
{
if (syllabusItem == null)
{
throw new IllegalArgumentException("Null Argument");
}
else
{
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
// get syllabi in an eager fetch mode
Criteria crit = session.createCriteria(SyllabusItemImpl.class)
.add(Expression.eq(SURROGATE_KEY, syllabusItem.getSurrogateKey()))
.setFetchMode(SYLLABI, FetchMode.EAGER);
SyllabusItem syllabusItem = (SyllabusItem) crit.uniqueResult();
if (syllabusItem != null){
return syllabusItem.getSyllabi();
}
return new TreeSet();
}
};
return (Set) getHibernateTemplate().execute(hcb);
}
}
/**
* createSyllabusData creates a persistent SyllabusData object
* @param title
* @param position
* @param assetId
* @param view
* @param status
* @param emailNotification
*/
public SyllabusData createSyllabusDataObject(String title, Integer position,
String asset, String view, String status, String emailNotification,
Date startDate, Date endDate, boolean linkCalendar, String calendarEventIdStartDate,
String calendarEventIdEndDate)
{
if (position == null)
{
throw new IllegalArgumentException("Null Argument");
}
else
{
// construct a new SyllabusData persistent object
SyllabusData data = new SyllabusDataImpl();
data.setTitle(title);
data.setPosition(position);
data.setAsset(asset);
data.setView(view);
data.setStatus(status);
data.setEmailNotification(emailNotification);
data.setStartDate(startDate);
data.setEndDate(endDate);
data.setLinkCalendar(linkCalendar);
data.setCalendarEventIdStartDate(calendarEventIdStartDate);
data.setCalendarEventIdEndDate(calendarEventIdEndDate);
saveSyllabus(data, false);
return data;
}
}
public SyllabusData createSyllabusDataObject(String title, Integer position,
String asset, String view, String status, String emailNotification,
Date startDate, Date endDate, boolean linkCalendar, String calendarEventIdStartDate,
String calendarEventIdEndDate, SyllabusItem syllabusItem)
{
if (position == null)
{
throw new IllegalArgumentException("Null Argument");
}
else
{
// construct a new SyllabusData persistent object
SyllabusData data = new SyllabusDataImpl();
data.setTitle(title);
data.setPosition(position);
data.setAsset(asset);
data.setView(view);
data.setStatus(status);
data.setEmailNotification(emailNotification);
data.setStartDate(startDate);
data.setEndDate(endDate);
data.setLinkCalendar(linkCalendar);
data.setSyllabusItem(syllabusItem);
data.setCalendarEventIdStartDate(calendarEventIdStartDate);
data.setCalendarEventIdEndDate(calendarEventIdEndDate);
saveSyllabus(data);
return data;
}
}
/**
* removes a syllabus data object (on form cancel action)
* @see org.sakaiproject.api.app.syllabus.SyllabusManager#removeSyllabusDataObject(org.sakaiproject.api.app.syllabus.SyllabusData)
*/
public void removeSyllabusDataObject(SyllabusData o)
{
getHibernateTemplate().delete(o);
}
/**
* swapSyllabusDataPositions swaps positions for two SyllabusData objects
* @param syllabusItem
* @param d1
* @param d2
*/
public void swapSyllabusDataPositions(final SyllabusItem syllabusItem, final SyllabusData d1, final SyllabusData d2)
{
if (syllabusItem == null || d1 == null || d2 == null)
{
throw new IllegalArgumentException("Null Argument");
}
else
{
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
// load objects from hibernate
SyllabusData data1 = (SyllabusData) session.get(SyllabusDataImpl.class, d1.getSyllabusId());
SyllabusData data2 = (SyllabusData) session.get(SyllabusDataImpl.class, d2.getSyllabusId());
Integer temp = data1.getPosition();
data1.setPosition(data2.getPosition());
data2.setPosition(temp);
return null;
}
};
getHibernateTemplate().execute(hcb);
}
}
public void updateSyllabudDataPosition(final SyllabusData d, final Integer position){
if(d == null || position == null){
throw new IllegalArgumentException("Null Argument");
}else{
d.setPosition(position);
getHibernateTemplate().update(d);
}
}
/**
* findLargestSyllabusPosition finds the largest syllabus data position for an item
* @param syllabusItem
*/
public Integer findLargestSyllabusPosition(final SyllabusItem syllabusItem)
{
if (syllabusItem == null)
{
throw new IllegalArgumentException("Null Argument");
}
else
{
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
Query q = session.getNamedQuery(QUERY_LARGEST_POSITION);
q.setParameter(FOREIGN_KEY, syllabusItem.getSurrogateKey(), Hibernate.LONG);
Integer position = (Integer) q.uniqueResult();
if (position == null){
return new Integer(0);
}
else{
return position;
}
}
};
return (Integer) getHibernateTemplate().execute(hcb);
}
}
/**
* getSyllabusItemByContextId finds a SyllabusItem
* @param contextId
* @return SyllabusItem
*
*/
public SyllabusItem getSyllabusItemByContextId(final String contextId)
{
if (contextId == null)
{
throw new IllegalArgumentException("Null Argument");
}
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
Query q = session.getNamedQuery(QUERY_BY_CONTEXTID);
q.setParameter(CONTEXT_ID, contextId, Hibernate.STRING);
return q.uniqueResult();
}
};
return (SyllabusItem) getHibernateTemplate().execute(hcb);
}
@SuppressWarnings("unchecked")
public Set<SyllabusData> findPublicSyllabusData() {
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
Criteria crit = session.createCriteria(SyllabusDataImpl.class)
.add(Expression.eq(VIEW, "yes"))
.setFetchMode(ATTACHMENTS, FetchMode.EAGER);
return crit.list();
}
};
return new HashSet<SyllabusData>(getHibernateTemplate().executeFind(hcb));
}
@SuppressWarnings("unchecked")
private Set<SyllabusData> findPublicSyllabusDataWithCalendarEvent(final long syllabusId) {
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
Criteria crit = session.createCriteria(SyllabusDataImpl.class)
.add(Expression.eq("syllabusItem.surrogateKey", syllabusId))
.add(Expression.eq("status", "posted"))
.add(Expression.eq("linkCalendar", true));
return crit.list();
}
};
return new HashSet<SyllabusData>(getHibernateTemplate().executeFind(hcb));
}
/**
* getSyllabusItemByUserAndContextIds finds a SyllabusItem
* @param userId
* @param contextId
* @return SyllabusItem
*
*/
public SyllabusItem getSyllabusItemByUserAndContextIds(final String userId, final String contextId)
{
if (userId == null || contextId == null)
{
throw new IllegalArgumentException("Null Argument");
}
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
Query q = session.getNamedQuery(QUERY_BY_USERID_AND_CONTEXTID);
q.setParameter(USER_ID, userId, Hibernate.STRING);
q.setParameter(CONTEXT_ID, contextId, Hibernate.STRING);
return q.uniqueResult();
}
};
return (SyllabusItem) getHibernateTemplate().execute(hcb);
}
/**
* addSyllabusToSyllabusItem adds a SyllabusData object to syllabi collection
* @param syllabusItem
* @param syllabusData
* @return Set
*/
public void addSyllabusToSyllabusItem(final SyllabusItem syllabusItem, final SyllabusData syllabusData)
{
addSyllabusToSyllabusItem(syllabusItem, syllabusData, true);
}
public void addSyllabusToSyllabusItem(final SyllabusItem syllabusItem, final SyllabusData syllabusData, boolean updateCalendar){
if (syllabusItem == null || syllabusData == null)
{
throw new IllegalArgumentException("Null Argument");
}
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
SyllabusItem returnedItem = (SyllabusItem) session.get(SyllabusItemImpl.class, syllabusItem.getSurrogateKey());
if (returnedItem != null){
returnedItem.getSyllabi().add(syllabusData);
session.save(returnedItem);
}
return null;
}
};
getHibernateTemplate().execute(hcb);
updateSyllabusAttachmentsViewState(syllabusData);
syllabusData.setSyllabusItem(syllabusItem);
if(updateCalendar){
boolean modified = updateCalendarSettings(syllabusData);
if(modified){
getHibernateTemplate().saveOrUpdate(syllabusData);
}
}
}
/**
* removeSyllabusToSyllabusItem loads many side of the relationship
* @param syllabusItem
* @param syllabusData
* @return Set
*/
public void removeSyllabusFromSyllabusItem(final SyllabusItem syllabusItem, final SyllabusData syllabusData)
{
if (syllabusItem == null || syllabusData == null)
{
throw new IllegalArgumentException("Null Argument");
}
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
SyllabusItem returnedItem = (SyllabusItem) session.get(SyllabusItemImpl.class, syllabusItem.getSurrogateKey());
if (returnedItem != null){
returnedItem.getSyllabi().remove(syllabusData);
session.saveOrUpdate(returnedItem);
}
return null;
}
};
getHibernateTemplate().execute(hcb);
}
/**
* Make sure all attachments associated with a syllabus
* are marked by the Content Hosting Service with appropriate
* public (true/false) permissions.
*
* @param syllabusData the SyllabusData object to check for publicness
*/
public void updateSyllabusAttachmentsViewState(final SyllabusData syllabusData)
{
boolean publicView = "yes".equalsIgnoreCase(syllabusData.getView());
Set<?> attachments = syllabusData.getAttachments();
for (Object a: attachments) {
SyllabusAttachment attach = (SyllabusAttachment)a;
contentHostingService.setPubView(attach.getAttachmentId(), publicView);
}
}
/**
* Make sure this attachmentis marked by the Content Hosting Service
* with the appropriate public (true/false) permissions.
*
* @param syllabusData the SyllabusData object to check for publicness
* @param attach the SyllabusAttachment object to update
*/
private void updateSyllabusAttachmentViewState(final SyllabusData syllabusData, final SyllabusAttachment attach)
{
boolean publicView = "yes".equalsIgnoreCase(syllabusData.getView());
contentHostingService.setPubView(attach.getAttachmentId(), publicView);
}
/**
* saveSyllabusItem persists a SyllabusItem
* @param item
*/
public void saveSyllabusItem(SyllabusItem item)
{
getHibernateTemplate().saveOrUpdate(item);
}
/**
* saveSyllabus persists a SyllabusData object
* @param item
*/
public void saveSyllabus(SyllabusData data)
{
saveSyllabus(data, true);
}
public void saveSyllabus(SyllabusData data, boolean updateCalendar){
if(updateCalendar){
//calendar check
updateCalendarSettings(data);
}
getHibernateTemplate().saveOrUpdate(data);
if(updateCalendar){
updateSyllabusAttachmentsViewState(data);
//update calendar attachments
if(data.getAttachments() != null && data.getAttachments().size() > 0){
if(data.getCalendarEventIdStartDate() != null
&& !"".equals(data.getCalendarEventIdStartDate())){
addCalendarAttachments(data.getSyllabusItem().getContextId(), data.getCalendarEventIdStartDate(), new ArrayList(data.getAttachments()));
}
if(data.getCalendarEventIdEndDate() != null
&& !"".equals(data.getCalendarEventIdEndDate())){
addCalendarAttachments(data.getSyllabusItem().getContextId(), data.getCalendarEventIdEndDate(), new ArrayList(data.getAttachments()));
}
}
}
}
public SyllabusData getSyllabusData(final String dataId)
{
if (dataId == null)
{
throw new IllegalArgumentException("Null Argument");
}
else
{
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
Long longObj = new Long(dataId);
SyllabusData returnedData = (SyllabusData) session.get(SyllabusDataImpl.class, longObj);
return returnedData;
}
};
return (SyllabusData) getHibernateTemplate().execute(hcb);
}
}
public SyllabusItem getSyllabusItem(final Long itemId)
{
if (itemId == null)
{
throw new IllegalArgumentException("Null Argument");
}
else
{
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
SyllabusItem returnedData = (SyllabusItem) session.get(SyllabusItemImpl.class, itemId);
return returnedData;
}
};
return (SyllabusItem) getHibernateTemplate().execute(hcb);
}
}
public SyllabusAttachment createSyllabusAttachmentObject(String attachId, String name)
{
try
{
SyllabusAttachment attach = new SyllabusAttachmentImpl();
attach.setAttachmentId(attachId);
attach.setName(name);
ContentResource cr = contentHostingService.getResource(attachId);
attach.setSize((Long.valueOf(cr.getContentLength())).toString());
User creator = UserDirectoryService.getUser(cr.getProperties().getProperty(cr.getProperties().getNamePropCreator()));
attach.setCreatedBy(creator.getDisplayName());
User modifier = UserDirectoryService.getUser(cr.getProperties().getProperty(cr.getProperties().getNamePropModifiedBy()));
attach.setLastModifiedBy(modifier.getDisplayName());
attach.setType(cr.getContentType());
String tempString = cr.getUrl();
String surl = ServerConfigurationService.getServerUrl();
tempString = tempString.indexOf(surl) > 0 ? tempString : tempString.substring(surl.length());
String newString = new String();
char[] oneChar = new char[1];
for(int i=0; i<tempString.length(); i++)
{
if(tempString.charAt(i) != ' ')
{
oneChar[0] = tempString.charAt(i);
String concatString = new String(oneChar);
newString = newString.concat(concatString);
}
else
{
newString = newString.concat("%20");
}
}
//tempString.replaceAll(" ", "%20");
attach.setUrl(newString);
saveSyllabusAttachment(attach);
return attach;
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
public void saveSyllabusAttachment(SyllabusAttachment attach)
{
getHibernateTemplate().saveOrUpdate(attach);
}
public void addSyllabusAttachToSyllabusData(final SyllabusData syllabusData, final SyllabusAttachment syllabusAttach)
{
if (syllabusData == null || syllabusAttach == null)
{
throw new IllegalArgumentException("Null Argument");
}
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
SyllabusData returnedData = (SyllabusData) session.get(SyllabusDataImpl.class, syllabusData.getSyllabusId());
if (returnedData != null){
returnedData.getAttachments().add(syllabusAttach);
session.save(returnedData);
}
return null;
}
};
getHibernateTemplate().execute(hcb);
updateSyllabusAttachmentViewState(syllabusData, syllabusAttach);
}
public void removeSyllabusAttachmentObject(SyllabusAttachment o)
{
getHibernateTemplate().delete(o);
}
public void removeSyllabusAttachSyllabusData(final SyllabusData syllabusData, final SyllabusAttachment syllabusAttach)
{
if (syllabusData == null || syllabusAttach == null)
{
throw new IllegalArgumentException("Null Argument");
}
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
SyllabusData returnedData = (SyllabusData) session.get(SyllabusDataImpl.class, syllabusData.getSyllabusId());
if (returnedData != null){
returnedData.getAttachments().remove(syllabusAttach);
session.saveOrUpdate(returnedData);
}
return null;
}
};
getHibernateTemplate().execute(hcb);
}
public Set getSyllabusAttachmentsForSyllabusData(final SyllabusData syllabusData)
{
if (syllabusData == null)
{
throw new IllegalArgumentException("Null Argument");
}
else
{
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
Criteria crit = session.createCriteria(SyllabusDataImpl.class)
.add(Expression.eq(SYLLABUS_DATA_ID, syllabusData.getSyllabusId()))
.setFetchMode(ATTACHMENTS, FetchMode.EAGER);
SyllabusData syllabusData = (SyllabusData) crit.uniqueResult();
if (syllabusData != null){
return syllabusData.getAttachments();
}
return new TreeSet();
}
};
return (Set) getHibernateTemplate().execute(hcb);
}
}
public SyllabusAttachment getSyllabusAttachment(final String syllabusAttachId)
{
if (syllabusAttachId == null)
{
throw new IllegalArgumentException("Null Argument");
}
else
{
HibernateCallback hcb = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
Long longObj = new Long(syllabusAttachId);
SyllabusAttachment returnedAttach = (SyllabusAttachment) session.get(SyllabusAttachmentImpl.class, longObj);
return returnedAttach;
}
};
return (SyllabusAttachment) getHibernateTemplate().execute(hcb);
}
}
public CalendarService getCalendarService() {
return calendarService;
}
public void setCalendarService(CalendarService calendarService) {
this.calendarService = calendarService;
}
public void removeCalendarEvent(String siteId, String eventId){
try{
String calendarId = calendarReference(siteId, SiteService.MAIN_CONTAINER);
Calendar calendar = getCalendar(calendarId);
if(calendar != null && eventId != null && !"".equals(eventId)){
try{
CalendarEvent calendarEvent = calendar.getEvent(eventId);
calendar.removeEvent(calendar.getEditEvent(calendarEvent.getId(), CalendarService.EVENT_REMOVE_CALENDAR));
}catch (PermissionException e)
{
//log.warn(e);
}
catch (InUseException e)
{
//log.warn(e);
}
catch (IdUnusedException e)
{
//log.warn(e);
}
}
}catch (IdUnusedException e)
{
//log.warn(e);
}catch (PermissionException e)
{
//log.warn(e);
}
}
private boolean isOnSameDay(Date startDate, Date endDate){
if(startDate != null && endDate != null){
//check that the two dates are on the same day
java.util.Calendar cal1 = java.util.Calendar.getInstance();
java.util.Calendar cal2 = java.util.Calendar.getInstance();
cal1.setTime(startDate);
cal2.setTime(endDate);
boolean sameDay = cal1.get(java.util.Calendar.YEAR) == cal2.get(java.util.Calendar.YEAR) &&
cal1.get(java.util.Calendar.DAY_OF_YEAR) == cal2.get(java.util.Calendar.DAY_OF_YEAR);
if(sameDay){
return true;
}
}
return false;
}
public boolean addCalendarEvent(SyllabusData data){
boolean changed = false;
String calendarId = calendarReference(data.getSyllabusItem().getContextId(), SiteService.MAIN_CONTAINER);
try {
Calendar calendar = getCalendar(calendarId);
if(calendar != null){
TimeRange timeRangeStart = null;
TimeRange timeRangeEnd = null;
if(data.getStartDate() != null && data.getEndDate() != null && isOnSameDay(data.getStartDate(), data.getEndDate())){
Time sTime = timeService.newTime(data.getStartDate().getTime());
Time eTime = timeService.newTime(data.getEndDate().getTime());
timeRangeStart = timeService.newTimeRange(sTime, eTime);
}else{
if(data.getStartDate() != null){
Time sTime = timeService.newTime(data.getStartDate().getTime());
timeRangeStart = timeService.newTimeRange(sTime);
}
if(data.getEndDate() != null){
Time sTime = timeService.newTime(data.getEndDate().getTime());
timeRangeEnd = timeService.newTimeRange(sTime);
}
}
List<Reference> attachments = entityManager.newReferenceList();
//Start Date Event (or both if on the same day)
if(timeRangeStart != null){
CalendarEvent.EventAccess eAccess = CalendarEvent.EventAccess.SITE;
// add event to calendar
CalendarEvent event = calendar.addEvent(timeRangeStart,
data.getTitle(),
data.getAsset(),
"Activity",
"",
eAccess,
null,
attachments);
// now add the linkage to the assignment on the calendar side
if (event.getId() != null) {
// add the assignmentId to the calendar object
CalendarEventEdit edit = calendar.getEditEvent(event.getId(), CalendarService.EVENT_ADD_CALENDAR);
edit.setDescriptionFormatted(data.getAsset());
calendar.commitEvent(edit);
data.setCalendarEventIdStartDate(event.getId());
changed = true;
}
}
//End Date Event
if(timeRangeEnd != null){
CalendarEvent.EventAccess eAccess = CalendarEvent.EventAccess.SITE;
// add event to calendar
CalendarEvent event = calendar.addEvent(timeRangeEnd,
data.getTitle(),
data.getAsset(),
"Deadline",
"",
eAccess,
null,
attachments);
// now add the linkage to the assignment on the calendar side
if (event.getId() != null) {
// add the assignmentId to the calendar object
CalendarEventEdit edit = calendar.getEditEvent(event.getId(), CalendarService.EVENT_ADD_CALENDAR);
edit.setDescriptionFormatted(data.getAsset());
calendar.commitEvent(edit);
data.setCalendarEventIdEndDate(event.getId());
changed = true;
}
}
}
} catch (IdUnusedException e) {
//log.warn(e);
} catch (InUseException e) {
//log.warn(e);
}catch (PermissionException e){
//log.warn(e);
}
return changed;
}
public void addCalendarAttachments(String siteId, String calendarEventId, List<SyllabusAttachment> attachments){
if(attachments != null){
String calendarId = calendarReference(siteId, SiteService.MAIN_CONTAINER);
Calendar calendar;
try {
calendar = getCalendar(calendarId);
if(calendar != null){
CalendarEventEdit event = calendar.getEditEvent(calendarEventId, CalendarService.EVENT_ADD_CALENDAR);
if(event != null){
for(SyllabusAttachment attachment : attachments){
ContentResource cr;
try {
cr = contentHostingService.getResource(attachment.getAttachmentId());
if(cr != null){
Reference ref = entityManager.newReference(cr.getReference());
event.addAttachment(ref);
}
} catch (TypeException e) {
}
}
calendar.commitEvent(event);
}
}
} catch (IdUnusedException e) {
} catch (PermissionException e) {
} catch (InUseException e) {
}
}
}
public void removeCalendarAttachments(String siteId, String calendarEventId, SyllabusAttachment attachment){
String calendarId = calendarReference(siteId, SiteService.MAIN_CONTAINER);
Calendar calendar;
try {
calendar = getCalendar(calendarId);
if(calendar != null){
CalendarEventEdit event = calendar.getEditEvent(calendarEventId, CalendarService.EVENT_ADD_CALENDAR);
if(event != null){
for(Reference ref : event.getAttachments()){
if(ref.getId().equals(attachment.getAttachmentId())){
event.removeAttachment(ref);
break;
}
}
calendar.commitEvent(event);
}
}
} catch (IdUnusedException e) {
} catch (PermissionException e) {
} catch (InUseException e) {
}
}
public String calendarReference(String siteId, String container){
return calendarService.calendarReference(siteId, container);
}
public Calendar getCalendar(String ref) throws IdUnusedException, PermissionException {
return calendarService.getCalendar(ref);
}
public void updateAllCalendarEvents(long syllabusId){
for(SyllabusData data : findPublicSyllabusDataWithCalendarEvent(syllabusId)){
boolean updated = updateCalendarSettings(data);
if(updated){
getHibernateTemplate().saveOrUpdate(data);
}
if(data.getAttachments() != null && data.getAttachments().size() > 0){
if(data.getCalendarEventIdStartDate() != null
&& !"".equals(data.getCalendarEventIdStartDate())){
addCalendarAttachments(data.getSyllabusItem().getContextId(), data.getCalendarEventIdStartDate(), new ArrayList(data.getAttachments()));
}
if(data.getCalendarEventIdEndDate() != null
&& !"".equals(data.getCalendarEventIdEndDate())){
addCalendarAttachments(data.getSyllabusItem().getContextId(), data.getCalendarEventIdEndDate(), new ArrayList(data.getAttachments()));
}
}
}
}
public boolean removeCalendarEvents(SyllabusData data){
boolean updated = false;
//Remove Start Date Calendar Event
if (data.getCalendarEventIdStartDate() != null) {
// first remove any existing calendar event
try {
String calendarDueDateEventId = data.getCalendarEventIdStartDate();
if (calendarDueDateEventId != null) {
removeCalendarEvent(data.getSyllabusItem().getContextId(),
calendarDueDateEventId);
}
} catch (Exception e) {
// user could have manually removed the calendar event
}
data.setCalendarEventIdStartDate(null);
updated = true;
}
//Remove End Date Calendar Event
if (data.getCalendarEventIdEndDate() != null) {
// first remove any existing calendar event
try {
String calendarDueDateEventId = data.getCalendarEventIdEndDate();
if (calendarDueDateEventId != null) {
removeCalendarEvent(data.getSyllabusItem().getContextId(),
calendarDueDateEventId);
}
} catch (Exception e) {
// user could have manually removed the calendar event
}
data.setCalendarEventIdEndDate(null);
updated = true;
}
return updated;
}
private boolean updateCalendarSettings(SyllabusData data){
boolean updated = false;
//calendar check
updated = removeCalendarEvents(data);
if (data.isLinkCalendar()
&& !SyllabusData.ITEM_DRAFT.equals(data.getStatus())
&& (data.getSyllabusItem().getRedirectURL() == null
|| data.getSyllabusItem().getRedirectURL().isEmpty())
&& (data.getStartDate() != null || data.getEndDate() != null)) {
// ok, let's post this to the calendar
boolean changed = addCalendarEvent(data);
if(changed){
updated = true;
}
}
return updated;
}
/* public SyllabusAttachment creatSyllabusAttachmentResource(String attachId, String name)
{
SyllabusAttachment attach = new SyllabusAttachmentImpl();
attach.setAttachmentId(attachId);
attach.setName(name);
return attach;
}*/
public PreferencesService getPreferencesService() {
return preferencesService;
}
public void setPreferencesService(PreferencesService preferencesService) {
this.preferencesService = preferencesService;
}
public TimeService getTimeService() {
return timeService;
}
public void setTimeService(TimeService timeService) {
this.timeService = timeService;
}
public EntityManager getEntityManager() {
return entityManager;
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
}