/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/calendar/trunk/calendar-tool/tool/src/java/org/sakaiproject/calendar/tool/CalendarAction.java $ * $Id: CalendarAction.java 132147 2013-12-03 17:08:43Z ottenhoff@longsight.com $ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009 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.calendar.tool; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.text.DateFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.TimeZone; import java.util.Vector; import java.util.Map.Entry; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.alias.api.Alias; import org.sakaiproject.alias.cover.AliasService; import org.sakaiproject.authz.api.PermissionsHelper; import org.sakaiproject.authz.cover.SecurityService; import org.sakaiproject.calendar.api.Calendar; import org.sakaiproject.calendar.api.CalendarEdit; import org.sakaiproject.calendar.api.CalendarEvent; import org.sakaiproject.calendar.api.CalendarEventEdit; import org.sakaiproject.calendar.api.CalendarEventVector; import org.sakaiproject.calendar.api.ExternalSubscription; import org.sakaiproject.calendar.api.RecurrenceRule; import org.sakaiproject.calendar.cover.CalendarImporterService; import org.sakaiproject.calendar.cover.CalendarService; import org.sakaiproject.calendar.cover.ExternalCalendarSubscriptionService; import org.sakaiproject.calendar.tool.CalendarActionState.LocalEvent; import org.sakaiproject.cheftool.Context; import org.sakaiproject.cheftool.JetspeedRunData; import org.sakaiproject.cheftool.RunData; import org.sakaiproject.cheftool.VelocityPortlet; import org.sakaiproject.cheftool.VelocityPortletStateAction; import org.sakaiproject.cheftool.api.Menu; import org.sakaiproject.cheftool.api.MenuItem; import org.sakaiproject.cheftool.menu.MenuEntry; import org.sakaiproject.cheftool.menu.MenuImpl; import org.sakaiproject.component.cover.ComponentManager; import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.content.api.ContentHostingService; import org.sakaiproject.content.api.FilePickerHelper; import org.sakaiproject.content.cover.ContentTypeImageService; import org.sakaiproject.entity.api.Reference; import org.sakaiproject.entity.cover.EntityManager; import org.sakaiproject.entitybroker.EntityBroker; import org.sakaiproject.entitybroker.entityprovider.extension.ActionReturn; import org.sakaiproject.entitybroker.EntityReference; import org.sakaiproject.event.api.EventTrackingService; import org.sakaiproject.event.api.SessionState; import org.sakaiproject.exception.IdInvalidException; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.exception.IdUsedException; import org.sakaiproject.exception.ImportException; import org.sakaiproject.exception.InUseException; import org.sakaiproject.exception.PermissionException; import org.sakaiproject.site.api.Group; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.api.ToolConfiguration; import org.sakaiproject.site.cover.SiteService; import org.sakaiproject.time.api.Time; import org.sakaiproject.time.api.TimeBreakdown; import org.sakaiproject.time.api.TimeRange; import org.sakaiproject.time.cover.TimeService; import org.sakaiproject.tool.api.Placement; import org.sakaiproject.tool.cover.SessionManager; import org.sakaiproject.tool.cover.ToolManager; import org.sakaiproject.user.api.UserNotDefinedException; import org.sakaiproject.user.cover.UserDirectoryService; import org.sakaiproject.util.CalendarChannelReferenceMaker; import org.sakaiproject.util.CalendarReferenceToChannelConverter; import org.sakaiproject.util.CalendarUtil; import org.sakaiproject.util.EntryProvider; import org.sakaiproject.util.FileItem; import org.sakaiproject.util.FormattedText; import org.sakaiproject.util.MergedList; import org.sakaiproject.util.MergedListEntryProviderFixedListWrapper; import org.sakaiproject.util.ParameterParser; import org.sakaiproject.util.ResourceLoader; import org.sakaiproject.util.Validator; /** * The schedule tool. */ public class CalendarAction extends VelocityPortletStateAction { /** * */ private static final long serialVersionUID = -8571818334710261359L; /** Our logger. */ private static Log M_log = LogFactory.getLog(CalendarAction.class); /** Resource bundle using current language locale */ private static ResourceLoader rb = new ResourceLoader("calendar"); // configuration properties (initialized in initState() Properties configProps = null; private static final String ALERT_MSG_KEY = "alertMessage"; private static final String CONFIRM_IMPORT_WIZARD_STATE = "CONFIRM_IMPORT"; private static final String WIZARD_IMPORT_FILE = "importFile"; private static final String GENERIC_SELECT_FILE_IMPORT_WIZARD_STATE = "GENERIC_SELECT_FILE"; private static final String OTHER_SELECT_FILE_IMPORT_WIZARD_STATE = "OTHER_SELECT_FILE"; private static final String ICAL_SELECT_FILE_IMPORT_WIZARD_STATE = "ICAL_SELECT_FILE"; private static final String WIZARD_IMPORT_TYPE = "importType"; private static final String SELECT_TYPE_IMPORT_WIZARD_STATE = "SELECT_TYPE"; private static final String IMPORT_WIZARD_SELECT_TYPE_STATE = SELECT_TYPE_IMPORT_WIZARD_STATE; private static final String STATE_SCHEDULE_IMPORT = "scheduleImport"; private static final String CALENDAR_INIT_PARAMETER = "calendar"; private static final int HOURS_PER_DAY = 24; private static final int NUMBER_HOURS_PER_PAGE_FOR_WEEK_VIEW = 10; private static final int FIRST_PAGE_START_HOUR = 0; private static final int SECOND_PAGE_START_HOUR = 8; private static final int THIRD_PAGE_START_HOUR = 14; private static final String STATE_YEAR = "calYear"; private static final String STATE_MONTH = "calMonth"; private static final String STATE_DAY = "calDay"; private static final String STATE_REVISE = "revise"; private static final String STATE_SET_FREQUENCY = "setFrequency"; private static final String FREQUENCY_SELECT = "frequencySelect"; private static final String TEMP_FREQ_SELECT = "tempFrequencySelect"; private static final String FREQ_ONCE = "once"; private static final String DEFAULT_FREQ = FREQ_ONCE; private static final String SSTATE__RECURRING_RULE = "rule"; private static final String STATE_BEFORE_SET_RECURRENCE = "state_before_set_recurrence"; private final static String TIME_FILTER_OPTION_VAR = "timeFilterOption"; private final static String TIME_FILTER_SETTING_CUSTOM_START_DATE_VAR = "customStartDate"; private final static String TIME_FILTER_SETTING_CUSTOM_END_DATE_VAR = "customEndDate"; private final static String TIME_FILTER_SETTING_CUSTOM_START_YEAR = "customStartYear"; private final static String TIME_FILTER_SETTING_CUSTOM_END_YEAR = "customEndYear"; private final static String TIME_FILTER_SETTING_CUSTOM_START_MONTH = "customStartMonth"; private final static String TIME_FILTER_SETTING_CUSTOM_END_MONTH = "customEndMonth"; private final static String TIME_FILTER_SETTING_CUSTOM_START_DAY = "customStartDay"; private final static String TIME_FILTER_SETTING_CUSTOM_END_DAY = "customEndDay"; private static final String FORM_ALIAS = "alias"; private static final String FORM_ICAL_ENABLE = "icalEnable"; /** The attachments from assignment */ private static final String ATTACHMENTS = "Assignment.attachments"; /** state selected view */ private static final String STATE_SELECTED_VIEW = "state_selected_view"; /** DELIMITER used to separate the list of custom fields for this calendar. */ private final static String ADDFIELDS_DELIMITER = "_,_"; protected final static String STATE_INITED = "calendar.state.inited"; /** for sorting in list view */ private static final String STATE_DATE_SORT_DSC = "dateSortedDsc"; // for group/section awareness private final static String STATE_SCHEDULE_TO = "scheduleTo"; private final static String STATE_SCHEDULE_TO_GROUPS = "scheduleToGroups"; private static final String STATE_SELECTED_GROUPS_FILTER = "groups_filters"; private ContentHostingService contentHostingService; private EntityBroker entityBroker; // tbd fix shared definition from org.sakaiproject.assignment.api.AssignmentEntityProvider private final static String ASSN_ENTITY_ID = "assignment"; private final static String ASSN_ENTITY_ACTION = "deepLink"; private final static String ASSN_ENTITY_PREFIX = EntityReference.SEPARATOR+ASSN_ENTITY_ID+EntityReference.SEPARATOR+ASSN_ENTITY_ACTION+EntityReference.SEPARATOR; private NumberFormat monthFormat = null; /** * Converts a string that is used to store additional attribute fields to an array of strings. */ private String[] fieldStringToArray(String addfields_str, String delimiter) { String [] fields = addfields_str.split(delimiter); List destStringList = new ArrayList(); // Don't copy empty fields. for ( int i=0; i < fields.length; i++) { if ( fields[i].length() > 0 ) { destStringList.add(fields[i]); } } return (String[]) destStringList.toArray(new String[destStringList.size()]); } /** * Enable or disable the observer * @param enable if true, the observer is enabled, if false, it is disabled */ protected void enableObserver(SessionState sstate, boolean enable) { if (enable) { enableObservers(sstate); } else { disableObservers(sstate); } } // myYear class public class MyYear { private MyMonth[][] yearArray; private int year; private MyMonth m; public MyYear() { yearArray = new MyMonth[4][3]; m = null; year = 0; } public void setMonth(MyMonth m, int x, int y) { yearArray[x][y] = m; } public MyMonth getMonth(int x, int y) { m = yearArray[x][y]; return (m); } public void setYear(int y) { year = y; } public int getYear() { return year; } }// myYear class // my week public class MyWeek { private MyDate[] week; private int weekOfMonth; public MyWeek() { week = new MyDate[7]; weekOfMonth = 0; } public void setWeek(int i, MyDate date) { week[i] = date; } public MyDate getWeek(int i) { return week[i]; } public String getWeekRange() { String range = null; range = week[0].getTodayDate() + " "+ "-" + " " + week[6].getTodayDate(); return range; } public void setWeekOfMonth(int w) { weekOfMonth = w; } public int getWeekOfMonth() { return weekOfMonth+1; } } // myMonth class public class MyMonth { private MyDate[][] monthArray; private MyDate result; private String monthName; private int month; private int row; private int numberOfDaysInMonth; public MyMonth() { result = null; monthArray = new MyDate[6][7]; month = 0; row = 0; numberOfDaysInMonth=0; } public void setRow(int r) { row = r; } public int getRow() { return row; } public void setNumberOfDaysInMonth(int daysInMonth) { numberOfDaysInMonth = daysInMonth; } public int getNumberOfDaysInMonth() { return numberOfDaysInMonth; } public void setDay(MyDate d,int x, int y) { monthArray[x][y] = d; } public MyDate getDay(int x,int y) { result = monthArray[x][y]; return (result); } public void setMonthName(String name) { monthName = name; } public String getMonthName() { return monthName; } public void setMonth(int m) { month = m; } public int getMonth() { return month; } }// myMonth // myDay class public class MyDay { private String m_data; // data will have the days in the month private String m_attachment_data; // data need to be displayed and attached, currently // this si a string and it can be any structure in the future. private int m_flag; // 0 if it is not a current date , 1 if it is a current date private int day; private int year; private int month; private String dayName; // name for each day private String todayDate; public MyDay() { m_data = ""; m_flag = 0; m_attachment_data = ""; day = 0; dayName = ""; todayDate = ""; } public void setDay(int d) { day = d; } public int getDay() { return day; } public void setFlag(int flag) { m_flag = flag; } public void setData(String data) { m_data = data; } public int getFlag() { return m_flag; } public String getData() { return(m_data); } public void setAttachment(String data) { m_attachment_data = data; } public String getAttachment() { return(m_attachment_data); } public void setDayName(String dname) { dayName = dname; } public String getDayName() { return dayName; } public void setTodayDate(String date) { todayDate = date; } public String getTodayDate() { return todayDate; } public void setYear(int y) { year = y; } public int getYear() { return year; } public void setMonth(int m) { month = m; } public int getMonth() { return month; } }// myDay class public class EventClass { private String displayName; private long firstTime; private String eventId; public EventClass() { displayName = ""; firstTime = 0; } public void setDisplayName(String name) { displayName = name; } public void setFirstTime(long time) { firstTime = time; } public String getDisplayName() { return displayName; } public long getfirstTime() { return firstTime; } public void setId(String id) { eventId = id; } public String getId() { return eventId; } } public class EventDisplayClass { private CalendarEvent calendareventobj; private boolean eventConflict; private int eventPosition; public EventDisplayClass() { eventConflict = false; calendareventobj = null; eventPosition = 0; } public void setEvent(CalendarEvent ce, boolean eventconf, int pos) { eventConflict = eventconf; calendareventobj = ce; eventPosition = pos; } public void setFlag(boolean conflict) { eventConflict = conflict; } public void setPosition(int position) { eventPosition = position; } public int getPosition() { return eventPosition; } public CalendarEvent getEvent() { return calendareventobj; } public boolean getFlag() { return eventConflict; } } public class MyDate { private MyDay day = null; private MyMonth month = null; private MyYear year = null; private String dayName = ""; private Iterator iteratorObj = null; private int flag = -1; private Vector eVector; public MyDate() { day = new MyDay(); month = new MyMonth(); year = new MyYear(); } public void setTodayDate(int m, int d, int y) { day.setDay(d); month.setMonth(m); year.setYear(y); } public void setNumberOfDaysInMonth(int daysInMonth) { month.setNumberOfDaysInMonth(daysInMonth); } public int getNumberOfDaysInMonth() { return month.getNumberOfDaysInMonth(); } public String getTodayDate() { DateFormat f = DateFormat.getDateInstance(DateFormat.SHORT); return f.format(new Date(year.getYear(), month.getMonth(), day.getDay())); } public void setFlag(int i) { flag = i; } public int getFlag() { return flag; } public void setDayName(String name) { dayName = name; } public void setNameOfMonth(String name) { month.setMonthName(name); } public String getDayName() { return dayName; } public int getDay() { return day.getDay(); } public int getMonth() { return month.getMonth(); } public String getNameOfMonth() { return month.getMonthName(); } public int getYear() { return year.getYear(); } public void setEventBerWeek(Vector eventVector) { eVector = eventVector; } public void setEventBerDay(Vector eventVector) { eVector = eventVector; } public Vector getEventsBerDay(int index) { Vector dayVector = new Vector(); if (eVector != null) dayVector = (Vector)eVector.get(index); if (dayVector == null) dayVector = new Vector(); return dayVector; } public Vector getEventsBerWeek(int index) { Vector dayVector = new Vector(); if (eVector != null) dayVector = (Vector)eVector.get(index); if (dayVector == null) dayVector = new Vector(); return dayVector; } public void setEvents(Iterator t) { iteratorObj = t; } public Vector getEvents() { Vector vectorObj = new Vector(); int i = 0; if (iteratorObj!=null) { while(iteratorObj.hasNext()) { vectorObj.add(i,iteratorObj.next()); i++; } } return vectorObj; } } public class Helper { private int numberOfActivity =0; public int getduration(long x, int b) { Long l = Long.valueOf(x); int v = l.intValue()/3600000; return v; } public int getFractionIn(long x,int b) { Long ll = Long.valueOf(x); int y = (ll.intValue()-(b*3600000)); int m = (y/60000); return m; } public CalendarEvent getActivity(Vector mm) { int size = mm.size(); numberOfActivity = size; CalendarEvent activityEvent,event=null; if(size>0) { activityEvent = (CalendarEvent)mm.elementAt(0); long temp = activityEvent.getRange().duration(); for(int i =0; i<size;i++) { activityEvent = (CalendarEvent)mm.elementAt(i); if(temp<activityEvent.getRange().duration()) { temp = activityEvent.getRange().duration(); event = activityEvent; } } } else event = null; return event; } public int getNumberOfActivity() { return numberOfActivity; } public int getInt(long x) { Long temp = Long.valueOf(x); return(temp.intValue()); } } /** * An inner class that can be initiated to perform text formatting */ public class CalendarFormattedText { // constructor public CalendarFormattedText() { } /** * Use of FormattedText object's trimFormattedText function. * @param formattedText The formatted text to trim * @param maxNumOfChars The maximum number of displayed characters in the returned trimmed formatted text. * @return String A String to hold the trimmed formatted text */ public String trimFormattedText(String formattedText, int maxNumOfChars) { StringBuilder sb = new StringBuilder(); FormattedText.trimFormattedText(formattedText, maxNumOfChars, sb); return sb.toString(); } } /** * Given a current date via the calendarUtil paramter, returns a TimeRange for the week. */ public TimeRange getWeekTimeRange( CalendarUtil calendarUtil) { int dayofweek = 0; dayofweek = calendarUtil.getDay_Of_Week(true)-1; int tempCurrentYear = calendarUtil.getYear(); int tempCurrentMonth = calendarUtil.getMonthInteger(); int tempCurrentDay = calendarUtil.getDayOfMonth(); calendarUtil.setPrevDate(dayofweek); Time startTime = TimeService.newTimeLocal(calendarUtil.getYear(),calendarUtil.getMonthInteger(),calendarUtil.getDayOfMonth(),00,00,00,000); calendarUtil.setDay(tempCurrentYear,tempCurrentMonth,tempCurrentDay); dayofweek = calendarUtil.getDay_Of_Week(true); if (dayofweek< 7) { for(int i = dayofweek; i<=6;i++) { calendarUtil.nextDate(); } } Time endTime = TimeService.newTimeLocal(calendarUtil.getYear(),calendarUtil.getMonthInteger(),calendarUtil.getDayOfMonth(),23,59,59,000); return TimeService.newTimeRange(startTime,endTime,true,true); } // etWeekTimeRange /** * Given a current date via the calendarUtil paramter, returns a TimeRange for the month. */ public TimeRange getMonthTimeRange(CalendarUtil calendarUtil) { int dayofweek = 0; calendarUtil.setDay(calendarUtil.getYear(), calendarUtil.getMonthInteger(), 1); int numberOfCurrentDays = calendarUtil.getNumberOfDays(); int tempCurrentMonth = calendarUtil.getMonthInteger(); int tempCurrentYear = calendarUtil.getYear(); // get the index of the first day in the month int firstDay_of_Month = calendarUtil.getDay_Of_Week(true) - 1; // Construct the time range to get all the days in the current month plus the days in the first week in the previous month and // the days in the last week from the last month // get the days in the first week that exists in the prev month calendarUtil.setPrevDate(firstDay_of_Month); Time startTime = TimeService.newTimeLocal(calendarUtil.getYear(),calendarUtil.getMonthInteger(),calendarUtil.getDayOfMonth(),00,00,00,000); // set the date object to the current month and last day in the current month calendarUtil.setDay(tempCurrentYear,tempCurrentMonth,numberOfCurrentDays); // get the index of the last day in the current month dayofweek = calendarUtil.getDay_Of_Week(true); // move the date object to the last day in the last week of the current month , this day will be one of those days in the // following month if (dayofweek < 7) { for(int i = dayofweek; i<=6;i++) { calendarUtil.nextDate(); } } Time endTime = TimeService.newTimeLocal(calendarUtil.getYear(),calendarUtil.getMonthInteger(),calendarUtil.getDayOfMonth(),23,59,59,000); return TimeService.newTimeRange(startTime,endTime,true,true); } /** * Given a current date in the year, month, and day parameters, returns a TimeRange for the day. */ public TimeRange getDayTimeRange( int year, int month, int day) { Time startTime = TimeService.newTimeLocal(year,month,day,00,00,00,000); Time endTime = TimeService.newTimeLocal(year,month,day,23,59,59,000); return TimeService.newTimeRange(startTime,endTime,true,true); } /** * This class controls the page that allows the user to customize which * calendars will be merged with the current group. */ public class MergePage { private final String mergeScheduleButtonHandler = "doMerge"; // Name used in the velocity template for the list of merged/non-merged calendars private final String mergedCalendarsCollection = "mergedCalendarsCollection"; public MergePage() { super(); } /** * Build the context for showing merged view */ public void buildContext( VelocityPortlet portlet, Context context, RunData runData, CalendarActionState state, SessionState sstate) { // load all calendar channels (either primary or merged calendars) MergedList calendarList = loadChannels( state.getPrimaryCalendarReference(), portlet.getPortletConfig().getInitParameter(PORTLET_CONFIG_PARM_MERGED_CALENDARS), new EntryProvider() ); // Place this object in the context so that the velocity template // can get at it. context.put(mergedCalendarsCollection, calendarList); context.put("tlang",rb); context.put("config",configProps); sstate.setAttribute( CalendarAction.SSTATE_ATTRIBUTE_MERGED_CALENDARS, calendarList); } /** * Action is used when the docancel is requested when the user click on cancel in the new view */ public void doCancel( RunData data, Context context, CalendarActionState state, SessionState sstate) { // Go back to whatever state we were in beforehand. state.setReturnState(state.getPrevState()); // cancel the options, release the site lock, cleanup cancelOptions(); // Clear the previous state so that we don't get confused elsewhere. state.setPrevState(""); sstate.removeAttribute(STATE_MODE); enableObserver(sstate, true); } // doCancel /** * Handle the "Merge" button on the toolbar */ public void doMerge( RunData runData, Context context, CalendarActionState state, SessionState sstate) { // TODO: really? // get a lock on the site and setup for options work doOptions(runData, context); // if we didn't end up in options mode, bail out if (!MODE_OPTIONS.equals(sstate.getAttribute(STATE_MODE))) return; // Disable the observer enableObserver(sstate, false); // Save the previous state so that we can get to it after we're done with the options mode. // if the previous state is Description, we need to remember one more step back // coz there is a back link in description view if ((state.getState()).equalsIgnoreCase("description")) { state.setPrevState(state.getReturnState() + "!!!fromDescription"); } else { state.setPrevState(state.getState()); } state.setState(CalendarAction.STATE_MERGE_CALENDARS); } // doMerge /** * Handles the user clicking on the save button on the page to specify which * calendars will be merged into the present schedule. */ public void doUpdate( RunData runData, Context context, CalendarActionState state, SessionState sstate) { // Get the merged calendar list out of our session state MergedList mergedCalendarList = (MergedList) sstate.getAttribute( CalendarAction.SSTATE_ATTRIBUTE_MERGED_CALENDARS); if (mergedCalendarList != null) { // Get the information from the run data and load it into // our calendar list that we have in the session state. mergedCalendarList.loadFromRunData(runData.getParameters()); } // update the tool config Placement placement = ToolManager.getCurrentPlacement(); // myWorkspace is special (a null mergedCalendar list defaults to all channels), // so we add the primary calendar here to indicate no other channels are wanted if (mergedCalendarList != null && isOnWorkspaceTab()) { String channelRef = mergedCalendarList.getDelimitedChannelReferenceString(); if (StringUtils.trimToNull(channelRef) == null ) channelRef = state.getPrimaryCalendarReference(); placement.getPlacementConfig().setProperty( PORTLET_CONFIG_PARM_MERGED_CALENDARS, channelRef ); } // Otherwise, just set the list as specified else if (mergedCalendarList != null && !isOnWorkspaceTab()) { placement.getPlacementConfig().setProperty( PORTLET_CONFIG_PARM_MERGED_CALENDARS, mergedCalendarList.getDelimitedChannelReferenceString()); } // handle the case of no merge calendars else { placement.getPlacementConfig().remove(PORTLET_CONFIG_PARM_MERGED_CALENDARS); } // commit the change saveOptions(); // Turn the observer back on. enableObserver(sstate, true); // Go back to whatever state we were in beforehand. state.setReturnState(state.getPrevState()); // Clear the previous state so that we don't get confused elsewhere. state.setPrevState(""); sstate.removeAttribute(STATE_MODE); } // doUpdate /* (non-Javadoc) * @see org.chefproject.actions.schedulePages.SchedulePage#getMenuHandlerID() */ public String getButtonHandlerID() { return mergeScheduleButtonHandler; } /* (non-Javadoc) * @see org.chefproject.actions.schedulePages.SchedulePage#getMenuText() */ public String getButtonText() { return rb.getString("java.merge"); } } /** * This class controls the page that allows the user to add arbitrary * attributes to the attribute list for the primary calendar that * corresponds to the current group. */ public class CustomizeCalendarPage { //This is the session attribute name to store init and current addFields list // Name used in the velocity template for the list of calendar addFields private final static String ADDFIELDS_CALENDARS_COLLECTION = "addFieldsCalendarsCollection"; private final static String ADDFIELDS_CALENDARS_COLLECTION_ISEMPTY = "addFieldsCalendarsCollectionIsEmpty"; private final static String OPTIONS_BUTTON_HANDLER = "doCustomize"; public CustomizeCalendarPage() { super(); } /** * Build the context for addfields calendar (Options menu) */ public void buildContext( VelocityPortlet portlet, Context context, RunData runData, CalendarActionState state, SessionState sstate) { String[] addFieldsCalendarArray = null; // Get a list of current calendar addFields. This is a comma-delimited list. if (sstate.getAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDFIELDS_PAGE).toString().equals(CalendarAction.PAGE_MAIN)) //when the 'Options' button click { //when the 'Options' button click Calendar calendarObj = null; String calId = state.getPrimaryCalendarReference(); try { calendarObj = CalendarService.getCalendar(calId); } catch (IdUnusedException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.thereis")); M_log.warn(".buildCustomizeContext(): " + e); return; } catch (PermissionException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.youdont")); M_log.warn(".buildCustomizeContext(): " + e); return; } // Get a current list of add fields. This is a comma-delimited string. String addfieldsCalendars = calendarObj.getEventFields(); if (addfieldsCalendars != null) { addFieldsCalendarArray = fieldStringToArray( addfieldsCalendars, ADDFIELDS_DELIMITER); } sstate.setAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDFIELDS_CALENDARS_INIT, addfieldsCalendars); sstate.setAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDFIELDS_CALENDARS, addfieldsCalendars); context.put("delFields", (List)sstate.getAttribute(CalendarAction.SSTATE_ATTRIBUTE_DELFIELDS)); sstate.removeAttribute(CalendarAction.SSTATE_ATTRIBUTE_DELFIELDS); sstate.setAttribute(CalendarAction.SSTATE_ATTRIBUTE_DELFIELDS_CONFIRM, "N"); state.setDelfieldAlertOff(true); } else //after the 'Options' button click { String addFieldsCollection = (String) sstate.getAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDFIELDS_CALENDARS); if (addFieldsCollection != null) addFieldsCalendarArray = fieldStringToArray(addFieldsCollection, ADDFIELDS_DELIMITER); } // Place this object in the context so that the velocity template // can get at it. context.put(ADDFIELDS_CALENDARS_COLLECTION, addFieldsCalendarArray); context.put("tlang",rb); context.put("config",configProps); if (addFieldsCalendarArray == null) context.put(ADDFIELDS_CALENDARS_COLLECTION_ISEMPTY, Boolean.valueOf(true)); else context.put(ADDFIELDS_CALENDARS_COLLECTION_ISEMPTY, Boolean.valueOf(false)); } //buildCustomizeCalendarContext /** * Handles the click on the page to add a field to events that will * be added to the calendar. Changes aren't complete until the user * commits changes with a save. */ public void doAddfield( RunData runData, Context context, CalendarActionState state, SessionState sstate) { String addFields = (String) sstate.getAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDFIELDS_CALENDARS); String [] addFieldsCalendarList = null; if (addFields != null) addFieldsCalendarList = fieldStringToArray(addFields,ADDFIELDS_DELIMITER); // Go back to whatever state we were in beforehand. state.setReturnState(state.getPrevState()); enableObserver(sstate, true); String addField = ""; addField = runData.getParameters().getString("textfield").trim(); String dupAddfield = "N"; //prevent entry of some characters (can cause problem) addField = addField.replaceAll(" "," "); addField = addField.replaceAll("'",""); addField = addField.replaceAll("\"",""); if (addField.length()==0) { addAlert(sstate, rb.getString("java.alert.youneed")); } else { if (addFieldsCalendarList != null) { for (int i=0; i < addFieldsCalendarList.length; i++) { if (addField.toUpperCase().equals(addFieldsCalendarList[i].toUpperCase())) { addAlert(sstate, rb.getString("java.alert.theadd")); dupAddfield = "Y"; i = addFieldsCalendarList.length + 1; } } if (dupAddfield.equals("N")) addFieldsCalendarList = fieldStringToArray(addFields+ADDFIELDS_DELIMITER+addField, ADDFIELDS_DELIMITER); } else { String [] initString = new String[1]; initString[0] = addField; addFieldsCalendarList = initString; } if (dupAddfield.equals("N")) { if (addFields != null) addFields = addFields + ADDFIELDS_DELIMITER + addField; else addFields = addField; sstate.setAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDFIELDS_CALENDARS, addFields); } } sstate.setAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDFIELDS_PAGE, CalendarAction.PAGE_ADDFIELDS); } /** * Handles a click on the cancel button in the page that allows the * user to add/remove events to/from events that will be added to * the calendar. */ public void doCancel( RunData data, Context context, CalendarActionState state, SessionState sstate) { // Go back to whatever state we were in beforehand. state.setReturnState(state.getPrevState()); sstate.setAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDFIELDS_CALENDARS, sstate.getAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDFIELDS_CALENDARS_INIT)); sstate.setAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDFIELDS_PAGE, CalendarAction.PAGE_MAIN); enableObserver(sstate, true); } // doCancel /** * This initiates the page where the user can add/remove additional * properties to/from events that will be added to the calendar. */ public void doCustomize( RunData runData, Context context, CalendarActionState state, SessionState sstate) { // Disable the observer enableObserver(sstate, false); // Save the previous state so that we can get to it after we're done with the options mode. // if the previous state is Description, we need to remember one more step back // coz there is a back link in description view if ((state.getState()).equalsIgnoreCase("description")) { state.setPrevState(state.getReturnState() + "!!!fromDescription"); } else { state.setPrevState(state.getState()); } state.setState(CalendarAction.STATE_CUSTOMIZE_CALENDAR); } /** * Handles the click on the page to remove a field from events in the * calendar. Changes aren't complete until the user commits changes * with a save. */ public void doDeletefield( RunData runData, Context context, CalendarActionState state, SessionState sstate) { ParameterParser params = runData.getParameters(); String addFields = (String) sstate.getAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDFIELDS_CALENDARS); String [] addFieldsCalendarList = null, newAddFieldsCalendarList = null; List delFields = new Vector(); int nextNewFieldsIndex = 0; if (addFields != null) { addFieldsCalendarList = fieldStringToArray(addFields,ADDFIELDS_DELIMITER); // The longest the new array can possibly be is the current size of the list. newAddFieldsCalendarList = new String[addFieldsCalendarList.length]; for (int i=0; i< addFieldsCalendarList.length; i++) { String fieldName = params.getString(addFieldsCalendarList[i]); // If a value is present, then that means that the user has checked // the box for the field to be removed. Don't add it to the // new list of field names. If it is not present, then add it // to the new list of field names. if ( fieldName == null || fieldName.length() == 0 ) { newAddFieldsCalendarList[nextNewFieldsIndex++] = addFieldsCalendarList[i]; } else { sstate.setAttribute(CalendarAction.SSTATE_ATTRIBUTE_DELFIELDS_CONFIRM, "Y"); delFields.add(addFieldsCalendarList[i]); } } addFields = arrayToString(newAddFieldsCalendarList, ADDFIELDS_DELIMITER); } // Go back to whatever state we were in beforehand. state.setReturnState(state.getPrevState()); enableObserver(sstate, true); sstate.setAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDFIELDS_CALENDARS, addFields); sstate.setAttribute(CalendarAction.SSTATE_ATTRIBUTE_DELFIELDS, delFields); sstate.setAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDFIELDS_PAGE, CalendarAction.PAGE_ADDFIELDS); } /** * Handles the user clicking on the save button on the page to add or * remove additional attributes for all calendar events. */ public void doUpdate( RunData runData, Context context, CalendarActionState state, SessionState sstate) { if (sstate.getAttribute(CalendarAction.SSTATE_ATTRIBUTE_DELFIELDS_CONFIRM).equals("Y") && state.getDelfieldAlertOff() ) { String errorCode = rb.getString("java.alert.areyou"); List delFields = (List) sstate.getAttribute(SSTATE_ATTRIBUTE_DELFIELDS); errorCode = errorCode.concat((String)(delFields.get(0))); for(int i=1; i<delFields.size(); i++) { errorCode = errorCode.concat(", " + (String)(delFields.get(i))); } errorCode = errorCode.concat(rb.getString("java.alert.ifyes")); addAlert(sstate, errorCode); state.setDelfieldAlertOff(false); } else { state.setDelfieldAlertOff(true); String addfields = (String) sstate.getAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDFIELDS_CALENDARS); while (addfields.startsWith(ADDFIELDS_DELIMITER)) { addfields = addfields.substring(ADDFIELDS_DELIMITER.length()); } String calId = state.getPrimaryCalendarReference(); try { CalendarEdit edit = CalendarService.editCalendar(calId); edit.setEventFields(addfields); CalendarService.commitCalendar(edit); } catch (IdUnusedException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.thereisno")); M_log.debug(".doUpdate customize calendar IdUnusedException"+e); return; } catch (PermissionException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.youdonthave")); M_log.debug(".doUpdate customize calendar "+e); return; } catch (InUseException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.someone")); M_log.debug(".doUpdate() for CustomizeCalendar: " + e); return; } sstate.setAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDFIELDS_CALENDARS, addfields); sstate.setAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDFIELDS_PAGE, CalendarAction.PAGE_MAIN); } // Go back to whatever state we were in beforehand. state.setReturnState(state.getPrevState()); enableObserver(sstate, true); } // doUpdate /* (non-Javadoc) * @see org.chefproject.actions.schedulePages.SchedulePage#getMenuHandlerID() */ public String getButtonHandlerID() { return OPTIONS_BUTTON_HANDLER; } /* (non-Javadoc) * @see org.chefproject.actions.schedulePages.SchedulePage#getMenuText() */ public String getButtonText() { return rb.getString("java.fields"); } /** * Loads additional fields information from the calendar object passed * as a parameter and loads them into the context object for the Velocity * template. */ public void loadAdditionalFieldsIntoContextFromCalendar( Calendar calendarObj, Context context) { // Get a current list of add fields. This is a ADDFIELDS_DELIMITER string. String addfieldsCalendars = calendarObj.getEventFields(); String[] addfieldsCalendarArray = null; if (addfieldsCalendars != null) { addfieldsCalendarArray = fieldStringToArray( addfieldsCalendars, ADDFIELDS_DELIMITER); } // Place this object in the context so that the velocity template // can get at it. context.put(ADDFIELDS_CALENDARS_COLLECTION, addfieldsCalendarArray); context.put("tlang",rb); context.put("config",configProps); if (addfieldsCalendarArray == null) context.put(ADDFIELDS_CALENDARS_COLLECTION_ISEMPTY, Boolean.valueOf(true)); else context.put(ADDFIELDS_CALENDARS_COLLECTION_ISEMPTY, Boolean.valueOf(false)); } /** * Loads additional fields from the run data into a provided map object. */ public void loadAdditionalFieldsMapFromRunData( RunData rundata, Map addfieldsMap, Calendar calendarObj) { String addfields_str = calendarObj.getEventFields(); if ( addfields_str != null && addfields_str.trim().length() != 0) { String [] addfields = fieldStringToArray(addfields_str, ADDFIELDS_DELIMITER); String eachfield; for (int i=0; i < addfields.length; i++) { eachfield = addfields[i]; addfieldsMap.put(eachfield, rundata.getParameters().getString(eachfield)); } } } } /** * This class controls the page that allows the user to configure * external calendar subscriptions. */ public class CalendarSubscriptionsPage { private final String institutionalSubscriptionsCollection = "institutionalSubscriptionsCollection"; private final String institutionalSubscriptionsAvailable = "institutionalSubscriptionsAvailable"; private final String userSubscriptionsCollection = "userSubscriptionsCollection"; private final String REF_DELIMITER = ExternalCalendarSubscriptionService.SUBS_REF_DELIMITER; private final String NAME_DELIMITER = ExternalCalendarSubscriptionService.SUBS_NAME_DELIMITER; public CalendarSubscriptionsPage() { super(); } /** * Build the context */ public void buildContext(VelocityPortlet portlet, Context context, RunData runData, CalendarActionState state, SessionState sstate) { String channel = state.getPrimaryCalendarReference(); Set<ExternalSubscription> availableSubscriptions = ExternalCalendarSubscriptionService .getAvailableInstitutionalSubscriptionsForChannel(channel); Set<ExternalSubscription> subscribedByUser = ExternalCalendarSubscriptionService .getSubscriptionsForChannel(channel, false); // Institutional subscriptions List<SubscriptionWrapper> institutionalSubscriptions = new ArrayList<SubscriptionWrapper>(); for (ExternalSubscription available : availableSubscriptions) { boolean selected = false; for (ExternalSubscription subscribed : subscribedByUser) { if (subscribed.getReference().equals(available.getReference())) { selected = true; break; } } if (available.isInstitutional()) institutionalSubscriptions.add(new SubscriptionWrapper(available, selected)); } // User subscriptions List<SubscriptionWrapper> userSubscriptions = (List<SubscriptionWrapper>) sstate .getAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDSUBSCRIPTIONS); if (userSubscriptions == null) { userSubscriptions = new ArrayList<SubscriptionWrapper>(); for (ExternalSubscription subscribed : subscribedByUser) { if (!subscribed.isInstitutional()) { userSubscriptions.add(new SubscriptionWrapper(subscribed, true)); } } } // Sort collections by name Collections.sort(institutionalSubscriptions); Collections.sort(userSubscriptions); // Place in context so that the velocity template can get at it. context.put("tlang", rb); context.put(institutionalSubscriptionsAvailable, !institutionalSubscriptions .isEmpty()); context.put(institutionalSubscriptionsCollection, institutionalSubscriptions); context.put(userSubscriptionsCollection, userSubscriptions); sstate.setAttribute(SSTATE_ATTRIBUTE_SUBSCRIPTIONS, institutionalSubscriptions); sstate.setAttribute(SSTATE_ATTRIBUTE_ADDSUBSCRIPTIONS, userSubscriptions); } /** * Action is used when the doCancel is requested when the user click on * cancel */ public void doCancel(RunData data, Context context, CalendarActionState state, SessionState sstate) { // Go back to whatever state we were in beforehand. state.setReturnState(state.getPrevState()); // cancel the options, release the site lock, cleanup cancelOptions(); // Clear the previous state so that we don't get confused elsewhere. state.setPrevState(""); sstate.removeAttribute(STATE_MODE); sstate.removeAttribute(SSTATE_ATTRIBUTE_SUBSCRIPTIONS); sstate.removeAttribute(SSTATE_ATTRIBUTE_ADDSUBSCRIPTIONS); enableObserver(sstate, true); } // doCancel /** * Action is used when the doAddSubscription is requested */ public void doAddSubscription(RunData runData, Context context, CalendarActionState state, SessionState sstate) { List<SubscriptionWrapper> addSubscriptions = (List<SubscriptionWrapper>) sstate .getAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDSUBSCRIPTIONS); // Go back to whatever state we were in beforehand. state.setReturnState(state.getPrevState()); enableObserver(sstate, true); String calendarName = runData.getParameters().getString("calendarName") .trim(); String calendarUrl = runData.getParameters().getString("calendarUrl").trim(); calendarUrl = calendarUrl.replaceAll("webcals://", "https://"); calendarUrl = calendarUrl.replaceAll("webcal://", "http://"); if (calendarName.length() == 0) { addAlert(sstate, rb.getString("java.alert.subsnameempty")); } else if (calendarUrl.length() == 0) { addAlert(sstate, rb.getString("java.alert.subsurlempty")); } else if(!FormattedText.validateURL(calendarUrl)) { addAlert(sstate,rb.getString("java.alert.subsurlinvalid")); } else { String contextId = EntityManager.newReference( state.getPrimaryCalendarReference()).getContext(); String id = ExternalCalendarSubscriptionService .getIdFromSubscriptionUrl(calendarUrl); String ref = ExternalCalendarSubscriptionService .calendarSubscriptionReference(contextId, id); addSubscriptions.add(new SubscriptionWrapper(calendarName, ref, true)); // Sort collections by name Collections.sort(addSubscriptions); sstate.setAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDSUBSCRIPTIONS, addSubscriptions); } } // doAddSubscription /** * Handle the "Subscriptions" button on the toolbar */ public void doSubscriptions(RunData runData, Context context, CalendarActionState state, SessionState sstate) { doOptions(runData, context); // if we didn't end up in options mode, bail out if (!MODE_OPTIONS.equals(sstate.getAttribute(STATE_MODE))) return; // Disable the observer enableObserver(sstate, false); // Save the previous state so that we can get to it after we're done // with the options mode. // state.setPrevState(state.getState()); // Save the previous state so that we can get to it after we're done // with the options mode. // if the previous state is Description, we need to remember one // more step back // coz there is a back link in description view if ((state.getState()).equalsIgnoreCase("description")) { state.setPrevState(state.getReturnState() + "!!!fromDescription"); } else { state.setPrevState(state.getState()); } state.setState(CalendarAction.STATE_CALENDAR_SUBSCRIPTIONS); } // doSubscriptions /** * Handles the user clicking on the save button on the page to specify * which calendars will be merged into the present schedule. */ public void doUpdate(RunData runData, Context context, CalendarActionState state, SessionState sstate) { List<SubscriptionWrapper> calendarSubscriptions = (List<SubscriptionWrapper>) sstate .getAttribute(SSTATE_ATTRIBUTE_SUBSCRIPTIONS); List<SubscriptionWrapper> addSubscriptions = (List<SubscriptionWrapper>) sstate .getAttribute(CalendarAction.SSTATE_ATTRIBUTE_ADDSUBSCRIPTIONS); List<String> subscriptionTC = new LinkedList<String>(); ParameterParser params = runData.getParameters(); // Institutional Calendars if (calendarSubscriptions != null) { for (SubscriptionWrapper subs : calendarSubscriptions) { if (params.getString(subs.getReference()) != null) { String name = subs.getDisplayName(); if (name == null || name.equals("")) name = subs.getUrl(); subscriptionTC.add(subs.getReference()); } } } // Other Calendars if (addSubscriptions != null) { for (SubscriptionWrapper add : addSubscriptions) { if (params.getString(add.getReference()) != null) { String name = add.getDisplayName(); if (name == null || name.equals("")) name = add.getUrl(); subscriptionTC.add(add.getReference() + NAME_DELIMITER + add.getDisplayName()); } } } // Update the tool config Placement placement = ToolManager.getCurrentPlacement(); if (placement != null) { Properties config = placement.getPlacementConfig(); if (config != null) { boolean first = true; StringBuffer propValue = new StringBuffer(); for (String ref : subscriptionTC) { if (!first) propValue.append(REF_DELIMITER); first = false; propValue.append(ref); } config.setProperty( ExternalCalendarSubscriptionService.TC_PROP_SUBCRIPTIONS, propValue.toString()); // commit the change saveOptions(); } } // Turn the observer back on. enableObserver(sstate, true); // Go back to whatever state we were in beforehand. state.setReturnState(state.getPrevState()); // Clear the previous state so that we don't get confused elsewhere. state.setPrevState(""); sstate.removeAttribute(STATE_MODE); sstate.removeAttribute(SSTATE_ATTRIBUTE_SUBSCRIPTIONS); sstate.removeAttribute(SSTATE_ATTRIBUTE_ADDSUBSCRIPTIONS); } // doUpdate public class SubscriptionWrapper implements Comparable<SubscriptionWrapper> { private String reference; private String url; private String displayName; private boolean isInstitutional; private boolean isSelected; public SubscriptionWrapper() { } public SubscriptionWrapper(ExternalSubscription subscription, boolean selected) { this.reference = subscription.getReference(); this.url = subscription.getSubscriptionUrl(); this.displayName = subscription.getSubscriptionName(); this.isInstitutional = subscription.isInstitutional(); this.isSelected = selected; } public SubscriptionWrapper(String calendarName, String ref, boolean selected) { Reference _reference = EntityManager.newReference(ref); this.reference = ref; // this.id = _reference.getId(); this.url = ExternalCalendarSubscriptionService .getSubscriptionUrlFromId(_reference.getId()); this.displayName = calendarName; this.isInstitutional = ExternalCalendarSubscriptionService .isInstitutionalCalendar(ref); this.isSelected = selected; } public String getReference() { return reference; } public void setReference(String ref) { this.reference = ref; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getDisplayName() { return displayName; } public void setDisplayName(String displayName) { this.displayName = displayName; } public boolean isInstitutional() { return isInstitutional; } public void setInstitutional(boolean isInstitutional) { this.isInstitutional = isInstitutional; } public boolean isSelected() { return isSelected; } public void setSelected(boolean isSelected) { this.isSelected = isSelected; } public int compareTo(SubscriptionWrapper sub) { if(this.getDisplayName() == null || sub.getDisplayName() == null) return this.getUrl().compareTo(sub.getUrl()); else return this.getDisplayName().compareTo(sub.getDisplayName()); } } } /** * Utility class to figure out permissions for a calendar object. */ static public class CalendarPermissions { /** * Priate constructor, doesn't allow instances of this object. */ private CalendarPermissions() { super(); } /** * Returns true if the primary and selected calendar are the same, but not null. */ static boolean verifyPrimarySelectedMatch(String primaryCalendarReference, String selectedCalendarReference) { // // Both primary and secondary calendar ids must be specified. // These must also match to be able to delete an event // if ( primaryCalendarReference == null || selectedCalendarReference == null || !primaryCalendarReference.equals(selectedCalendarReference) ) { return false; } else { return true; } } /** * Utility routint to get the calendar for a given calendar id. */ static private Calendar getTheCalendar(String calendarReference) { Calendar calendarObj = null; try { calendarObj = CalendarService.getCalendar(calendarReference); if (calendarObj == null) { // If the calendar isn't there, try adding it. CalendarService.commitCalendar( CalendarService.addCalendar(calendarReference)); calendarObj = CalendarService.getCalendar(calendarReference); } } catch (IdUnusedException e) { M_log.debug("CalendarPermissions.getTheCalendar(): ",e); } catch (PermissionException e) { M_log.debug("CalendarPermissions.getTheCalendar(): " + e); } catch (IdUsedException e) { M_log.debug("CalendarPermissions.getTheCalendar(): " + e); } catch (IdInvalidException e) { M_log.debug("CalendarPermissions.getTheCalendar(): " + e); } return calendarObj; } /** * Returns true if the current user can see the events in a calendar. */ static public boolean allowViewEvents(String calendarReference) { Calendar calendarObj = getTheCalendar(calendarReference); if (calendarObj == null) { return false; } else { return calendarObj.allowGetEvents(); } } /** * Returns true if the current user is allowed to delete events on the calendar id * passed in as the selectedCalendarReference parameter. The selected calendar must match * the primary calendar for this function to return true. * @param primaryCalendarReference calendar id for the default channel * @param selectedCalendarReference calendar id for the event the user has just selected */ public static boolean allowDeleteEvent(String primaryCalendarReference, String selectedCalendarReference, String eventId) { // // Both primary and secondary calendar ids must be specified. // These must also match to be able to delete an event // if ( !verifyPrimarySelectedMatch(primaryCalendarReference, selectedCalendarReference) ) { return false; } Calendar calendarObj = getTheCalendar(primaryCalendarReference); if (calendarObj == null) { return false; } else { CalendarEvent event = null; try { event = calendarObj.getEvent(eventId); } catch (IdUnusedException e) { M_log.debug("CalendarPermissions.canDeleteEvent(): " + e); } catch (PermissionException e) { M_log.debug("CalendarPermissions.canDeleteEvent(): " + e); } if (event == null) { return false; } else { return calendarObj.allowRemoveEvent(event); } } } /** * Returns true if the current user is allowed to revise events on the calendar id * passed in as the selectedCalendarReference parameter. The selected calendar must match * the primary calendar for this function to return true. * @param primaryCalendarReference calendar id for the default channel * @param selectedCalendarReference calendar reference for the event the user has just selected */ static public boolean allowReviseEvents(String primaryCalendarReference, String selectedCalendarReference, String eventId) { // // Both primary and secondary calendar ids must be specified. // These must also match to be able to delete an event // if ( !verifyPrimarySelectedMatch(primaryCalendarReference, selectedCalendarReference) ) { return false; } Calendar calendarObj = getTheCalendar(primaryCalendarReference); if (calendarObj == null) { return false; } else { return calendarObj.allowEditEvent(eventId); } } /** * Returns true if the current user is allowed to create events on the calendar id * passed in as the selectedCalendarReference parameter. The selected calendar must match * the primary calendar for this function to return true. * @param primaryCalendarReference calendar reference for the default channel * @param selectedCalendarReference calendar reference for the event the user has just selected */ static public boolean allowCreateEvents(String primaryCalendarReference, String selectedCalendarReference) { // %%% Note: disabling this check as the allow create events should ONLY be on the primary, // we don't care about the selected -ggolden /* // // The primary and selected calendar ids must match, unless the selected calendar // is null or empty. // if ( selectedCalendarReference != null && selectedCalendarReference.length() > 0 && !verifyPrimarySelectedMatch(primaryCalendarReference, selectedCalendarReference) ) { return false; } */ Calendar calendarObj = getTheCalendar(primaryCalendarReference); if (calendarObj == null) { return false; } else { return calendarObj.allowAddEvent(); } } /** * Returns true if the user is allowed to merge events from different calendars * within the default channel. */ static public boolean allowMergeCalendars(String calendarReference) { return CalendarService.allowMergeCalendar(calendarReference); } /** * Returns true if the use is allowed to modify properties of the calendar itself, * and not just the events within the calendar. */ static public boolean allowModifyCalendarProperties(String calendarReference) { return CalendarService.allowEditCalendar(calendarReference); } /** * Returns true if the use is allowed to import (and export) events * into the calendar. */ static public boolean allowImport(String calendarReference) { return CalendarService.allowImportCalendar(calendarReference); } /** * Returns true if the user is allowed to subscribe external calendars * into the calendar. */ static public boolean allowSubscribe(String calendarReference) { return CalendarService.allowSubscribeCalendar(calendarReference); } } private final static String SSTATE_ATTRIBUTE_ADDFIELDS_PAGE = "addfieldsPage"; private final static String SSTATE_ATTRIBUTE_ADDFIELDS_CALENDARS_INIT = "addfieldsInit"; private final static String SSTATE_ATTRIBUTE_ADDFIELDS_CALENDARS = "addfields"; private final static String SSTATE_ATTRIBUTE_DELFIELDS = "delFields"; private final static String SSTATE_ATTRIBUTE_DELFIELDS_CONFIRM = "delfieldsConfirm"; private final static String SSTATE_ATTRIBUTE_SUBSCRIPTIONS_SERVICE = "calendarSubscriptionsService"; private final static String SSTATE_ATTRIBUTE_SUBSCRIPTIONS = "calendarSubscriptions"; private final static String SSTATE_ATTRIBUTE_ADDSUBSCRIPTIONS = "addCalendarSubscriptions"; private final static String STATE_NEW = "new"; private static final String EVENT_REFERENCE_PARAMETER = "eventReference"; private static final String EVENT_CONTEXT_VAR = "event"; private static final String NO_EVENT_FLAG_CONTEXT_VAR = "noEvent"; // // These are variables used in the context for communication between this // action class and the Velocity template. // // False/true string values are used in the context variables in a number of places. private static final String FALSE_STRING = "false"; private static final String TRUE_STRING = "true"; // This is the property name in the portlet config for the list of calendars // that are not merged. private final static String PORTLET_CONFIG_PARM_MERGED_CALENDARS = "mergedCalendarReferences"; // default calendar view property private final static String PORTLET_CONFIG_DEFAULT_VIEW = "defaultCalendarView"; private final static String PAGE_MAIN = "main"; private final static String PAGE_ADDFIELDS = "addFields"; /** The flag name and value in state to indicate an update to the portlet is needed. */ private final static String SSTATE_ATTRIBUTE_MERGED_CALENDARS = "mergedCalendars"; // String constants for user interface states private final static String STATE_MERGE_CALENDARS = "mergeCalendars"; private final static String STATE_CALENDAR_SUBSCRIPTIONS = "calendarSubscriptions"; private final static String STATE_CUSTOMIZE_CALENDAR = "customizeCalendar"; // for detailed event view navigator private final static String STATE_PREV_ACT = "toPrevActivity"; private final static String STATE_NEXT_ACT = "toNextActivity"; private final static String STATE_CURRENT_ACT = "toCurrentActivity"; private final static String STATE_EVENTS_LIST ="eventIds"; private final static String STATE_NAV_DIRECTION = "navigationDirection"; private MergePage mergedCalendarPage = new MergePage(); private CustomizeCalendarPage customizeCalendarPage = new CustomizeCalendarPage(); private CalendarSubscriptionsPage calendarSubscriptionsPage = new CalendarSubscriptionsPage(); /** * See if the current tab is the workspace tab (i.e. user site) * @return true if we are currently on the "My Workspace" tab. */ private static boolean isOnWorkspaceTab() { return SiteService.isUserSite(ToolManager.getCurrentPlacement().getContext()); } protected Class getStateClass() { return CalendarActionState.class; } // getStateClass /** ** loadChannels -- load specified primaryCalendarReference ** or merged calendars if initMergeList is defined **/ private MergedList loadChannels( String primaryCalendarReference, String initMergeList, MergedList.EntryProvider entryProvider ) { MergedList mergedCalendarList = new MergedList(); String[] channelArray = null; // Figure out the list of channel references that we'll be using. // MyWorkspace is special: if not superuser, and not otherwise defined, get all channels if ( isOnWorkspaceTab() && !SecurityService.isSuperUser() && initMergeList == null ) channelArray = mergedCalendarList.getAllPermittedChannels(new CalendarChannelReferenceMaker()); else channelArray = mergedCalendarList.getChannelReferenceArrayFromDelimitedString( primaryCalendarReference, initMergeList ); if (entryProvider == null ) { entryProvider = new MergedListEntryProviderFixedListWrapper( new EntryProvider(), primaryCalendarReference, channelArray, new CalendarReferenceToChannelConverter()); } mergedCalendarList.loadChannelsFromDelimitedString( isOnWorkspaceTab(), false, entryProvider, StringUtils.trimToEmpty(SessionManager.getCurrentSessionUserId()), channelArray, SecurityService.isSuperUser(), ToolManager.getCurrentPlacement().getContext()); return mergedCalendarList; } /** * Gets an array of all the calendars whose events we can access. */ private List getCalendarReferenceList(VelocityPortlet portlet, String primaryCalendarReference, boolean isOnWorkspaceTab) { // load all calendar channels (either primary or merged calendars) MergedList mergedCalendarList = loadChannels( primaryCalendarReference, portlet.getPortletConfig().getInitParameter(PORTLET_CONFIG_PARM_MERGED_CALENDARS), null ); // add external calendar subscriptions List referenceList = mergedCalendarList.getReferenceList(); Set subscriptionRefList = ExternalCalendarSubscriptionService.getCalendarSubscriptionChannelsForChannels( primaryCalendarReference, referenceList); referenceList.addAll(subscriptionRefList); return referenceList; } /** * Gets the session state from the Jetspeed RunData */ static private SessionState getSessionState(RunData runData) { // access the portlet element id to find our state String peid = ((JetspeedRunData)runData).getJs_peid(); return ((JetspeedRunData)runData).getPortletSessionState(peid); } public String buildMainPanelContext( VelocityPortlet portlet, Context context, RunData runData, SessionState sstate) { CalendarActionState state = (CalendarActionState)getState(portlet, runData, CalendarActionState.class); String template = (String)getContext(runData).get("template"); // get current state (view); if not set use tool default or default to week view String stateName = state.getState(); if (stateName == null) { stateName = portlet.getPortletConfig().getInitParameter(PORTLET_CONFIG_DEFAULT_VIEW); if (stateName == null) stateName = ServerConfigurationService.getString("calendar.default.view", "week"); state.setState(stateName); } if ( stateName.equals(STATE_SCHEDULE_IMPORT) ) { buildImportContext(portlet, context, runData, state, getSessionState(runData)); } else if ( stateName.equals(STATE_MERGE_CALENDARS) ) { // build the context to display the options panel mergedCalendarPage.buildContext(portlet, context, runData, state, getSessionState(runData)); } else if ( stateName.equals(STATE_CALENDAR_SUBSCRIPTIONS) ) { // build the context to display the options panel calendarSubscriptionsPage.buildContext(portlet, context, runData, state, getSessionState(runData)); } else if ( stateName.equals(STATE_CUSTOMIZE_CALENDAR) ) { // build the context to display the options panel //needed to track when user clicks 'Save' or 'Cancel' String sstatepage = ""; Object statepageAttribute = sstate.getAttribute(SSTATE_ATTRIBUTE_ADDFIELDS_PAGE); if ( statepageAttribute != null ) { sstatepage = statepageAttribute.toString(); } if (!sstatepage.equals(PAGE_ADDFIELDS)) { sstate.setAttribute(SSTATE_ATTRIBUTE_ADDFIELDS_PAGE, PAGE_MAIN); } customizeCalendarPage.buildContext(portlet, context, runData, state, getSessionState(runData)); } else if ((stateName.equals("revise"))|| (stateName.equals("goToReviseCalendar"))) { // build the context for the normal view show buildReviseContext(portlet, context, runData, state); } else if (stateName.equals("description")) { // build the context for the basic step of adding file buildDescriptionContext(portlet, context, runData, state); } else if (stateName.equals("year")) { // build the context for the advanced step of adding file buildYearContext(portlet, context, runData, state); } else if (stateName.equals("month")) { // build the context for the basic step of adding folder buildMonthContext(portlet, context, runData, state); } else if (stateName.equals("day")) { // build the context for the basic step of adding simple text buildDayContext(portlet, context, runData, state); } else if (stateName.equals("week")) { // build the context for the basic step of delete confirm page buildWeekContext(portlet, context, runData, state); } else if (stateName.equals("new")) { // build the context to display the property list buildNewContext(portlet, context, runData, state); } else if (stateName.equals("icalEx")) { buildIcalExportPanelContext(portlet, context, runData, state); } else if (stateName.equals("delete")) { // build the context to display the property list buildDeleteContext(portlet, context, runData, state); } else if (stateName.equals("list")) { // build the context to display the list view buildListContext(portlet, context, runData, state); } else if (stateName.equals(STATE_SET_FREQUENCY)) { buildFrequencyContext(portlet, context, runData, state); } if (stateName.equals("description") || stateName.equals("year") || stateName.equals("month") || stateName.equals("day") || stateName.equals("week") || stateName.equals("list") ) { // SAK-23566 capture the view calendar events EventTrackingService ets = (EventTrackingService) ComponentManager.get(EventTrackingService.class); String calendarRef = state.getPrimaryCalendarReference(); if (ets != null && calendarRef != null) { // need to cleanup the cal references which look like /calendar/calendar/4ea74c4d-3f9e-4c32-b03f-15e7915e6051/main String eventRef = StringUtils.replace(calendarRef, "/main", "/"+stateName); String calendarEventId = state.getCalendarEventId(); if (StringUtils.isNotBlank(calendarEventId)) { eventRef += "/"+calendarEventId; } ets.post(ets.newEvent("calendar.read", eventRef, false)); } } TimeZone timeZone = TimeService.getLocalTimeZone(); context.put("timezone", timeZone.getDisplayName(timeZone.inDaylightTime(new Date()), TimeZone.SHORT) ); //the AM/PM strings context.put("amString", CalendarUtil.getLocalAMString()); context.put("pmString", CalendarUtil.getLocalPMString()); // group realted variables context.put("siteAccess", CalendarEvent.EventAccess.SITE); context.put("groupAccess", CalendarEvent.EventAccess.GROUPED); context.put("message", state.getState()); context.put("state", state.getKey()); context.put("tlang",rb); context.put("config",configProps); context.put("dateFormat", getDateFormatString()); context.put("timeFormat", getTimeFormatString()); return template; } // buildMainPanelContext private void buildImportContext(VelocityPortlet portlet, Context context, RunData runData, CalendarActionState state, SessionState state2) { // Place this object in the context so that the velocity template // can get at it. // Start at the beginning if nothing is set yet. if ( state.getImportWizardState() == null ) { state.setImportWizardState(IMPORT_WIZARD_SELECT_TYPE_STATE); } // (optional) ical.experimental import context.put("icalEnable", ServerConfigurationService.getString("ical.experimental")); // Set whatever the current wizard state is. context.put("importWizardState", state.getImportWizardState()); context.put("tlang",rb); context.put("config",configProps); // Set the imported events into the context. context.put("wizardImportedEvents", state.getWizardImportedEvents()); String calId = state.getPrimaryCalendarReference(); try { Calendar calendarObj = CalendarService.getCalendar(calId); String scheduleTo = (String)state2.getAttribute(STATE_SCHEDULE_TO); if (scheduleTo != null && scheduleTo.length() != 0) { context.put("scheduleTo", scheduleTo); } else { if (calendarObj.allowAddEvent()) { // default to make site selection context.put("scheduleTo", "site"); } else if (calendarObj.getGroupsAllowAddEvent().size() > 0) { // to group otherwise context.put("scheduleTo", "groups"); } } Collection groups = calendarObj.getGroupsAllowAddEvent(); if (groups.size() > 0) { context.put("groups", groups); } } catch(IdUnusedException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.thereis")); M_log.debug(".buildImportContext(): " + e); } catch (PermissionException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.youdont")); M_log.debug(".buildImportContext(): " + e); } } /** * Addes the primary calendar reference (this site's default calendar) * to the calendar action state object. */ private void setPrimaryCalendarReferenceInState(VelocityPortlet portlet, CalendarActionState state) { String calendarReference = state.getPrimaryCalendarReference(); if (calendarReference == null) { calendarReference = StringUtils.trimToNull(portlet.getPortletConfig().getInitParameter(CALENDAR_INIT_PARAMETER)); if (calendarReference == null) { // form a reference to the default calendar for this request's site calendarReference = CalendarService.calendarReference(ToolManager.getCurrentPlacement().getContext(), SiteService.MAIN_CONTAINER); state.setPrimaryCalendarReference(calendarReference); } } } /** * Build the context for editing the frequency */ protected void buildFrequencyContext(VelocityPortlet portlet, Context context, RunData runData, CalendarActionState state) { String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); // under 3 conditions, we get into this page // 1st, brand new event, no freq or rule set up, coming from revise page // 2nd, exisitng event, coming from revise page // 3rd, new event, stay in this page after changing frequency by calling js function onchange() // 4th, existing event, stay in this page after changing frequency by calling js function onchange() // sstate attribute TEMP_FREQ_SELECT is one of the flags // if this attribute is not null, means changeFrequency() is called thru onchange(). // Then rule is another flag, if rule is null, means new event // Combination of these 2 flags should cover all the conditions RecurrenceRule rule = (RecurrenceRule) sstate.getAttribute(CalendarAction.SSTATE__RECURRING_RULE); // defaultly set frequency to be once // if there is a saved state frequency attribute, replace the default one String freq = CalendarAction.DEFAULT_FREQ; if (sstate.getAttribute(TEMP_FREQ_SELECT) != null) { freq = (String)sstate.getAttribute(TEMP_FREQ_SELECT); if (rule != null) context.put("rule", rule); sstate.removeAttribute(TEMP_FREQ_SELECT); } else { if (rule != null) { freq = rule.getFrequency(); context.put("rule", rule); } } context.put("freq", freq); context.put("tlang",rb); context.put("config",configProps); // get the data the user just input in the preview new/revise page context.put("savedData",state.getNewData()); context.put("realDate", TimeService.newTime()); if (DEFAULT_FREQ.equals(freq)) { LocalEvent savedData = state.getNewData(); Time m_time = TimeService.newTimeLocal(savedData.getYearInt(), savedData.getMonth(), savedData.getDay(), 0, 0, 0, 0); context.put("freqOnceDate", m_time.toStringLocalDate()); } } // buildFrequencyContext /** * Build the context for showing revise view */ protected void buildReviseContext(VelocityPortlet portlet, Context context, RunData runData, CalendarActionState state) { // to get the content Type Image Service context.put("contentTypeImageService", ContentTypeImageService.getInstance()); context.put("tlang",rb); context.put("config",configProps); Calendar calendarObj = null; CalendarEvent calEvent = null; CalendarUtil calObj= new CalendarUtil(); //null; MyDate dateObj1 = null; dateObj1 = new MyDate(); boolean getEventsFlag = false; List attachments = state.getAttachments(); String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); int stateYear = b.getYear(); int stateMonth = b.getMonth(); int stateDay = b.getDay(); if ((sstate.getAttribute(STATE_YEAR) != null) && (sstate.getAttribute(STATE_MONTH) != null) && (sstate.getAttribute(STATE_DAY) != null)) { stateYear = ((Integer)sstate.getAttribute(STATE_YEAR)).intValue(); stateMonth = ((Integer)sstate.getAttribute(STATE_MONTH)).intValue(); stateDay = ((Integer)sstate.getAttribute(STATE_DAY)).intValue(); } calObj.setDay(stateYear, stateMonth, stateDay); dateObj1.setTodayDate(calObj.getMonthInteger(),calObj.getDayOfMonth(),calObj.getYear()); String calId = state.getPrimaryCalendarReference(); if( state.getIsNewCalendar() == false) { if (CalendarService.allowGetCalendar(calId)== false) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.younotallow")); return; } else { try { calendarObj = CalendarService.getCalendar(calId); if(calendarObj.allowGetEvent(state.getCalendarEventId())) { calEvent = calendarObj.getEvent(state.getCalendarEventId()); getEventsFlag = true; context.put("selectedGroupRefsCollection", calEvent.getGroups()); // all the groups the user is allowed to do remove from context.put("allowedRemoveGroups", calendarObj.getGroupsAllowRemoveEvent(calEvent.isUserOwner())); } else getEventsFlag = false; // Add any additional fields in the calendar. customizeCalendarPage.loadAdditionalFieldsIntoContextFromCalendar( calendarObj, context); context.put("tlang",rb); context.put("config",configProps); context.put("calEventFlag","true"); context.put("new", "false"); // if from the metadata view of announcement, the message is already the system resource if ( state.getState().equals("goToReviseCalendar") ) { context.put("backToRevise", "false"); } // if from the attachments editing view or preview view of announcement else if (state.getState().equals("revise")) { context.put("backToRevise", "true"); } //Vector attachments = state.getAttachments(); if ( attachments != null ) { context.put("attachments", attachments); } else { context.put("attachNull", "true"); } context.put("fromAttachmentFlag",state.getfromAttachmentFlag()); } catch(IdUnusedException e) { context.put(ALERT_MSG_KEY, rb.getString("java.alert.therenoactv")); M_log.debug(".buildReviseContext(): " + e); return; } catch (PermissionException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.younotperm")); M_log.debug(".buildReviseContext(): " + e); return; } } } else { // if this a new annoucement, get the subject and body from temparory record context.put("new", "true"); context.put("tlang",rb); context.put("config",configProps); context.put("attachments", attachments); context.put("fromAttachmentFlag",state.getfromAttachmentFlag()); } // Output for recurring events // for an existing event // if the saved recurring rule equals to string FREQ_ONCE, set it as not recurring // if there is a saved recurring rule in sstate, display it // otherwise, output the event's rule instead if ((((String) sstate.getAttribute(FREQUENCY_SELECT)) != null) && (((String) sstate.getAttribute(FREQUENCY_SELECT)).equals(FREQ_ONCE))) { context.put("rule", null); } else { RecurrenceRule rule = (RecurrenceRule) sstate.getAttribute(CalendarAction.SSTATE__RECURRING_RULE); if (rule == null) { rule = calEvent.getRecurrenceRule(); } else context.put("rule", rule); if (rule != null) { context.put("freq", rule.getFrequencyDescription()); } // if (rule != null) } //if ((String) sstate.getAttribute(FREQUENCY_SELECT).equals(FREQ_ONCE)) try { calendarObj = CalendarService.getCalendar(calId); String scheduleTo = (String)sstate.getAttribute(STATE_SCHEDULE_TO); if (scheduleTo != null && scheduleTo.length() != 0) { context.put("scheduleTo", scheduleTo); } else { if (calendarObj.allowAddCalendarEvent()) { // default to make site selection context.put("scheduleTo", "site"); } else if (calendarObj.getGroupsAllowAddEvent().size() > 0) { // to group otherwise context.put("scheduleTo", "groups"); } } Collection groups = calendarObj.getGroupsAllowAddEvent(); // add to these any groups that the message already has calEvent = calendarObj.getEvent(state.getCalendarEventId()); if (calEvent != null) { Collection otherGroups = calEvent.getGroupObjects(); for (Iterator i = otherGroups.iterator(); i.hasNext();) { Group g = (Group) i.next(); if (!groups.contains(g)) { groups.add(g); } } } if (groups.size() > 0) { context.put("groups", groups); } } catch(IdUnusedException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.thereis")); M_log.debug(".buildNewContext(): " + e); return; } catch (PermissionException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.youdont")); M_log.debug(".buildNewContext(): " + e); return; } context.put("tlang",rb); context.put("config",configProps); context.put("event", calEvent); context.put("helper",new Helper()); context.put("message","revise"); context.put("savedData",state.getNewData()); context.put("getEventsFlag", Boolean.valueOf(getEventsFlag)); if(state.getIsNewCalendar()==true) context.put("vmtype","new"); else context.put("vmtype","revise"); context.put("service", contentHostingService); // output the real time context.put("realDate", TimeService.newTime()); } // buildReviseContext /** * Build the context for showing description for events */ protected void buildDescriptionContext(VelocityPortlet portlet, Context context, RunData runData, CalendarActionState state) { // to get the content Type Image Service context.put("contentTypeImageService", ContentTypeImageService.getInstance()); context.put("tlang",rb); context.put("config",configProps); context.put("Context", ToolManager.getCurrentPlacement().getContext()); context.put("CalendarService", CalendarService.getInstance()); context.put("SiteService", SiteService.getInstance()); Calendar calendarObj = null; CalendarEvent calEvent = null; MyDate dateObj1 = null; dateObj1 = new MyDate(); String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); navigatorContextControl(portlet, context, runData, (String)sstate.getAttribute(STATE_NAV_DIRECTION)); boolean prevAct = sstate.getAttribute(STATE_PREV_ACT) != null; boolean nextAct = sstate.getAttribute(STATE_NEXT_ACT) != null; context.put("prevAct", Boolean.valueOf(prevAct)); context.put("nextAct", Boolean.valueOf(nextAct)); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); int stateYear = b.getYear(); int stateMonth = b.getMonth(); int stateDay = b.getDay(); if ((sstate.getAttribute(STATE_YEAR) != null) && (sstate.getAttribute(STATE_MONTH) != null) && (sstate.getAttribute(STATE_DAY) != null)) { stateYear = ((Integer)sstate.getAttribute(STATE_YEAR)).intValue(); stateMonth = ((Integer)sstate.getAttribute(STATE_MONTH)).intValue(); stateDay = ((Integer)sstate.getAttribute(STATE_DAY)).intValue(); } CalendarUtil calObj= new CalendarUtil(); calObj.setDay(stateYear, stateMonth, stateDay); // get the today date in month/day/year format dateObj1.setTodayDate(calObj.getMonthInteger(),calObj.getDayOfMonth(),calObj.getYear()); // get the event id from the CalendarService. // send the event to the vm String ce = state.getCalendarEventId(); String selectedCalendarReference = state.getSelectedCalendarReference(); if ( !CalendarPermissions.allowViewEvents(selectedCalendarReference) ) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.younotallow")); M_log.debug("here in buildDescription not showing event"); return; } else { try { calendarObj = CalendarService.getCalendar(selectedCalendarReference); calEvent = calendarObj.getEvent(ce); // Add any additional fields in the calendar. customizeCalendarPage.loadAdditionalFieldsIntoContextFromCalendar( calendarObj, context); context.put(EVENT_CONTEXT_VAR, calEvent); context.put("tlang",rb); context.put("config",configProps); // Get the attachments from assignment tool for viewing String assignmentId = calEvent.getField(CalendarUtil.NEW_ASSIGNMENT_DUEDATE_CALENDAR_ASSIGNMENT_ID); if (assignmentId != null && assignmentId.length() > 0) { // pass in the assignment reference to get the assignment data we need Map<String, Object> assignData = new HashMap<String, Object>(); StringBuilder entityId = new StringBuilder( ASSN_ENTITY_PREFIX ); entityId.append( (CalendarService.getCalendar(calEvent.getCalendarReference())).getContext() ); entityId.append( EntityReference.SEPARATOR ); entityId.append( assignmentId ); ActionReturn ret = entityBroker.executeCustomAction(entityId.toString(), ASSN_ENTITY_ACTION, null, null); if (ret != null && ret.getEntityData() != null) { Object returnData = ret.getEntityData().getData(); assignData = (Map<String, Object>)returnData; } context.put("assignmenturl", (String) assignData.get("assignmentUrl")); context.put("assignmentTitle", (String) assignData.get("assignmentTitle")); } String ownerId = calEvent.getCreator(); if ( ownerId != null && ! ownerId.equals("") ) // if the user not defined, assigned the owner_name as "" try { String ownerName = UserDirectoryService.getUser( ownerId ).getDisplayName(); context.put("owner_name", ownerName); } catch (UserNotDefinedException e) { context.put("owner_name", ""); } String siteName = calEvent.getSiteName(); if ( siteName != null ) context.put("site_name", siteName ); RecurrenceRule rule = calEvent.getRecurrenceRule(); // for a brand new event, there is no saved recurring rule if (rule != null) { context.put("freq", rule.getFrequencyDescription()); context.put("rule", rule); } // show all the groups in this calendar that user has get event in Collection groups = calendarObj.getGroupsAllowGetEvent(); if (groups != null) { context.put("groupRange", calEvent.getGroupRangeForDisplay(calendarObj)); } } catch (IdUnusedException e) { M_log.debug(".buildDescriptionContext(): " + e); context.put(NO_EVENT_FLAG_CONTEXT_VAR, TRUE_STRING); } catch (PermissionException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.younotpermadd")); M_log.debug(".buildDescriptionContext(): " + e); return; } } buildMenu( portlet, context, runData, state, CalendarPermissions.allowCreateEvents( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference()), CalendarPermissions.allowDeleteEvent( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference(), state.getCalendarEventId()), CalendarPermissions.allowReviseEvents( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference(), state.getCalendarEventId()), CalendarPermissions.allowMergeCalendars( state.getPrimaryCalendarReference()), CalendarPermissions.allowModifyCalendarProperties( state.getPrimaryCalendarReference()), CalendarPermissions.allowImport( state.getPrimaryCalendarReference()), CalendarPermissions.allowSubscribe( state.getPrimaryCalendarReference())); context.put( "allowDelete", Boolean.valueOf(CalendarPermissions.allowDeleteEvent( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference(), state.getCalendarEventId()))); context.put( "allowRevise", Boolean.valueOf(CalendarPermissions.allowReviseEvents( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference(), state.getCalendarEventId()))); } // buildDescriptionContext /** * Build the context for showing Year view */ protected void buildYearContext(VelocityPortlet portlet, Context context, RunData runData, CalendarActionState state) { CalendarUtil calObj= new CalendarUtil(); MyYear yearObj = null; MyMonth monthObj1, monthObj2 = null; MyDay dayObj = null; MyDate dateObj1 = null; boolean allowed = false; CalendarEventVector CalendarEventVectorObj = null; // new objects of myYear, myMonth, myDay, myWeek classes yearObj = new MyYear(); monthObj1 = new MyMonth(); dayObj = new MyDay(); dateObj1 = new MyDate(); int month = 1; int col = 3; int row = 4; String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); int stateYear = b.getYear(); int stateMonth = b.getMonth(); int stateDay = b.getDay(); if ((sstate.getAttribute(STATE_YEAR) != null) && (sstate.getAttribute(STATE_MONTH) != null) && (sstate.getAttribute(STATE_DAY) != null)) { stateYear = ((Integer)sstate.getAttribute(STATE_YEAR)).intValue(); stateMonth = ((Integer)sstate.getAttribute(STATE_MONTH)).intValue(); stateDay = ((Integer)sstate.getAttribute(STATE_DAY)).intValue(); } calObj.setDay(stateYear, stateMonth, stateDay); dateObj1.setTodayDate(calObj.getMonthInteger(),calObj.getDayOfMonth(),calObj.getYear()); yearObj.setYear(calObj.getYear()); monthObj1.setMonth(calObj.getMonthInteger()); dayObj.setDay(calObj.getDayOfMonth()); if (CalendarService.allowGetCalendar(state.getPrimaryCalendarReference())== false) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.younotallowsee")); } else { try { allowed = CalendarService.getCalendar(state.getPrimaryCalendarReference()).allowAddEvent(); } catch(IdUnusedException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.therenoactv")); M_log.debug(".buildYearContext(): " + e); } catch (PermissionException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.younotperm")); M_log.debug(".buildYearContext(): " + e); } } for(int r = 0; r<row; r++) { for (int c = 0; c<col;c++) { monthObj2 = new MyMonth(); calObj.setDay(dateObj1.getYear(),month,1); CalendarEventVectorObj = CalendarService.getEvents( getCalendarReferenceList( portlet, state.getPrimaryCalendarReference(), isOnWorkspaceTab()), getMonthTimeRange(calObj)); calObj.setDay(dateObj1.getYear(),dateObj1.getMonth(),dateObj1.getDay()); monthObj2 = calMonth(month, calObj,state,CalendarEventVectorObj); month++; yearObj.setMonth(monthObj2,r,c); } } calObj.setDay(dateObj1.getYear(),dateObj1.getMonth(),dateObj1.getDay()); context.put("tlang",rb); context.put("config",configProps); context.put("yearArray",yearObj); SimpleDateFormat formatter = new SimpleDateFormat(rb.getString("viewy.date_format"), rb.getLocale()); context.put("year", formatter.format(calObj.getTime())); context.put("date",dateObj1); state.setState("year"); buildMenu( portlet, context, runData, state, CalendarPermissions.allowCreateEvents( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference()), CalendarPermissions.allowDeleteEvent( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference(), state.getCalendarEventId()), CalendarPermissions.allowReviseEvents( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference(), state.getCalendarEventId()), CalendarPermissions.allowMergeCalendars( state.getPrimaryCalendarReference()), CalendarPermissions.allowModifyCalendarProperties( state.getPrimaryCalendarReference()), CalendarPermissions.allowImport( state.getPrimaryCalendarReference()), CalendarPermissions.allowSubscribe( state.getPrimaryCalendarReference())); // added by zqian for toolbar context.put("allow_new", Boolean.valueOf(allowed)); context.put("allow_delete", Boolean.valueOf(false)); context.put("allow_revise", Boolean.valueOf(false)); context.put("tlang",rb); context.put("config",configProps); context.put(Menu.CONTEXT_ACTION, "CalendarAction"); context.put("selectedView", rb.getString("java.byyear")); context.put("dayOfWeekNames", calObj.getCalendarDaysOfWeekNames(false)); } // buildYearContext /** * Build the context for showing month view */ protected void buildMonthContext(VelocityPortlet portlet, Context context, RunData runData, CalendarActionState state) { MyMonth monthObj2 = null; MyDate dateObj1 = null; CalendarEventVector CalendarEventVectorObj = null; dateObj1 = new MyDate(); // read calendar object saved in state object String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); int stateYear = b.getYear(); int stateMonth = b.getMonth(); int stateDay = b.getDay(); if ((sstate.getAttribute(STATE_YEAR) != null) && (sstate.getAttribute(STATE_MONTH) != null) && (sstate.getAttribute(STATE_DAY) != null)) { stateYear = ((Integer)sstate.getAttribute(STATE_YEAR)).intValue(); stateMonth = ((Integer)sstate.getAttribute(STATE_MONTH)).intValue(); stateDay = ((Integer)sstate.getAttribute(STATE_DAY)).intValue(); } CalendarUtil calObj = new CalendarUtil(); calObj.setDay(stateYear, stateMonth, stateDay); dateObj1.setTodayDate(calObj.getMonthInteger(),calObj.getDayOfMonth(),calObj.getYear()); // fill this month object with all days avilable for this month if (CalendarService.allowGetCalendar(state.getPrimaryCalendarReference())== false) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.younotallow")); return; } CalendarEventVectorObj = CalendarService.getEvents( getCalendarReferenceList( portlet, state.getPrimaryCalendarReference(), isOnWorkspaceTab()), getMonthTimeRange(calObj)); calObj.setDay(dateObj1.getYear(),dateObj1.getMonth(),dateObj1.getDay()); monthObj2 = calMonth(calObj.getMonthInteger(), calObj,state, CalendarEventVectorObj); calObj.setDay(dateObj1.getYear(),dateObj1.getMonth(),dateObj1.getDay()); // retrieve the information from day, month and year to calObj again since calObj changed during the process of CalMonth(). SimpleDateFormat formatter = new SimpleDateFormat(rb.getString("viewm.date_format"), rb.getLocale()); context.put("viewingDate", formatter.format(calObj.getTime())); context.put("monthArray",monthObj2); context.put("tlang",rb); context.put("config",configProps); int row = 5; context.put("row",Integer.valueOf(row)); context.put("date",dateObj1); context.put("realDate", TimeService.newTime()); buildMenu( portlet, context, runData, state, CalendarPermissions.allowCreateEvents( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference()), CalendarPermissions.allowDeleteEvent( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference(), state.getCalendarEventId()), CalendarPermissions.allowReviseEvents( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference(), state.getCalendarEventId()), CalendarPermissions.allowMergeCalendars( state.getPrimaryCalendarReference()), CalendarPermissions.allowModifyCalendarProperties( state.getPrimaryCalendarReference()), CalendarPermissions.allowImport( state.getPrimaryCalendarReference()), CalendarPermissions.allowSubscribe( state.getPrimaryCalendarReference())); state.setState("month"); context.put("selectedView", rb.getString("java.bymonth")); context.put("dayOfWeekNames", calObj.getCalendarDaysOfWeekNames(false)); } // buildMonthContext protected Vector getNewEvents(int year, int month, int day, CalendarActionState state, RunData rundata, int time, int numberofcycles,Context context,CalendarEventVector CalendarEventVectorObj) { boolean firstTime = true; Vector events = new Vector(); Time timeObj = TimeService.newTimeLocal(year,month,day,time,00,00,000); long duration = ((30*60)*(1000)); Time updatedTime = TimeService.newTime(timeObj.getTime()+ duration); /*** include the start time ***/ TimeRange timeRangeObj = TimeService.newTimeRange(timeObj,updatedTime,true,false); for (int range = 0; range <=numberofcycles;range++) { Iterator calEvent = null; calEvent = CalendarEventVectorObj.getEvents(timeRangeObj); Vector vectorObj = new Vector(); EventDisplayClass eventDisplayObj; Vector newVectorObj = null; boolean swapflag=true; EventDisplayClass eventdisplayobj = null; if (calEvent.hasNext()) { int i = 0; while (calEvent.hasNext()) { eventdisplayobj = new EventDisplayClass(); eventdisplayobj.setEvent((CalendarEvent)calEvent.next(),false,i); vectorObj.add(i,eventdisplayobj); i++; } // while if(firstTime) { events.add(range,vectorObj); firstTime = false; } else { while(swapflag == true) { swapflag=false; for(int mm = 0; mm<events.size();mm++) { int eom, mv =0; Vector evectorObj = (Vector)events.elementAt(mm); if(evectorObj.isEmpty()==false) { for(eom = 0; eom<evectorObj.size();eom++) { if(!"".equals(evectorObj.elementAt(eom))) { String eomId = (((EventDisplayClass)evectorObj.elementAt(eom)).getEvent()).getId(); newVectorObj = new Vector(); for(mv = 0; mv<vectorObj.size();mv++) { if(!"".equals(vectorObj.elementAt(mv))) { String vectorId = (((EventDisplayClass)vectorObj.elementAt(mv)).getEvent()).getId(); if (vectorId.equals(eomId)) { eventDisplayObj = (EventDisplayClass)vectorObj.elementAt(mv); eventDisplayObj.setFlag(true); if (mv != eom) { swapflag = true; vectorObj.removeElementAt(mv); for(int x = 0 ; x<eom;x++) { if(vectorObj.isEmpty()==false) { newVectorObj.add(x,vectorObj.elementAt(0)); vectorObj.removeElementAt(0); } else { newVectorObj.add(x,""); } }// for newVectorObj.add(eom, eventDisplayObj); int neweom = eom; neweom = neweom+1; while(vectorObj.isEmpty()==false) { newVectorObj.add(neweom,vectorObj.elementAt(0)); vectorObj.removeElementAt(0); neweom++; } for(int vv =0;vv<newVectorObj.size();vv++) { vectorObj.add(vv,newVectorObj.elementAt(vv)); } } // if } // if } // if } //for } // if } // for } // if } // for } // while events.add(range,vectorObj); } // if - else firstTime timeRangeObj.shiftForward(1800000); } else { events.add(range,vectorObj); timeRangeObj.shiftForward(1800000); } } // for return events; } // getNewEvents /** * Build the context for showing day view */ protected void buildDayContext(VelocityPortlet portlet, Context context, RunData runData, CalendarActionState state) { Calendar calendarObj = null; boolean allowed = false; MyDate dateObj1 = null; CalendarEventVector CalendarEventVectorObj = null; String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); int stateYear = b.getYear(); int stateMonth = b.getMonth(); int stateDay = b.getDay(); context.put("todayYear", Integer.valueOf(stateYear)); context.put("todayMonth", Integer.valueOf(stateMonth)); context.put("todayDay", Integer.valueOf(stateDay)); if ((sstate.getAttribute(STATE_YEAR) != null) && (sstate.getAttribute(STATE_MONTH) != null) && (sstate.getAttribute(STATE_DAY) != null)) { stateYear = ((Integer)sstate.getAttribute(STATE_YEAR)).intValue(); stateMonth = ((Integer)sstate.getAttribute(STATE_MONTH)).intValue(); stateDay = ((Integer)sstate.getAttribute(STATE_DAY)).intValue(); } CalendarUtil calObj = new CalendarUtil(); calObj.setDay(stateYear, stateMonth, stateDay); // new objects of myYear, myMonth, myDay, myWeek classes dateObj1 = new MyDate(); dateObj1.setTodayDate(calObj.getMonthInteger(),calObj.getDayOfMonth(),calObj.getYear()); int year = dateObj1.getYear(); int month = dateObj1.getMonth(); int day = dateObj1.getDay(); Vector eventVector = new Vector(); String calId = state.getPrimaryCalendarReference(); if (CalendarService.allowGetCalendar(calId)== false) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.younotallow")); return; } else { try { calendarObj = CalendarService.getCalendar(calId); allowed = calendarObj.allowAddEvent(); CalendarEventVectorObj = CalendarService.getEvents( getCalendarReferenceList( portlet, state.getPrimaryCalendarReference(), isOnWorkspaceTab()), getDayTimeRange(year, month, day)); String currentPage = state.getCurrentPage(); // if coming from clicking the the day number in month view, year view or list view // select the time slot first, go to the slot containing earliest event on that day if (state.getPrevState() != null) { if ( (state.getPrevState()).equalsIgnoreCase("list") || (state.getPrevState()).equalsIgnoreCase("month") || (state.getPrevState()).equalsIgnoreCase("year")) { CalendarEventVector vec = null; Time timeObj = TimeService.newTimeLocal(year,month,day,FIRST_PAGE_START_HOUR,00,00,000); Time timeObj2 = TimeService.newTimeLocal(year,month,day,7,59,59,000); TimeRange timeRangeObj = TimeService.newTimeRange(timeObj,timeObj2); vec = CalendarService.getEvents(getCalendarReferenceList(portlet, state.getPrimaryCalendarReference(),isOnWorkspaceTab()), timeRangeObj); if (vec.size() > 0) currentPage = "first"; else { timeObj = TimeService.newTimeLocal(year,month,day,SECOND_PAGE_START_HOUR,00,00,000); timeObj2 = TimeService.newTimeLocal(year,month,day,17,59,59,000); timeRangeObj = TimeService.newTimeRange(timeObj,timeObj2); vec = CalendarService.getEvents(getCalendarReferenceList(portlet, state.getPrimaryCalendarReference(),isOnWorkspaceTab()), timeRangeObj); if (vec.size() > 0) currentPage = "second"; else { timeObj = TimeService.newTimeLocal(year,month,day,THIRD_PAGE_START_HOUR,00,00,000); timeObj2 = TimeService.newTimeLocal(year,month,day,23,59,59,000); timeRangeObj = TimeService.newTimeRange(timeObj,timeObj2); vec = CalendarService.getEvents(getCalendarReferenceList(portlet, state.getPrimaryCalendarReference(),isOnWorkspaceTab()), timeRangeObj); if (vec.size() > 0) currentPage = "third"; else currentPage = "second"; } } state.setCurrentPage(currentPage); } } if(currentPage.equals("third")) { eventVector = getNewEvents(year,month,day, state, runData,THIRD_PAGE_START_HOUR,19,context,CalendarEventVectorObj); } else if (currentPage.equals("second")) { eventVector = getNewEvents(year,month,day, state, runData,SECOND_PAGE_START_HOUR,19,context,CalendarEventVectorObj); } else { eventVector = getNewEvents(year,month,day, state, runData,FIRST_PAGE_START_HOUR,19,context,CalendarEventVectorObj); } dateObj1.setEventBerDay(eventVector); } catch(IdUnusedException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.therenoactv")); M_log.debug(".buildDayContext(): " + e); return; } catch (PermissionException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.younotperm")); M_log.debug(".buildDayContext(): " + e); return; } } context.put("nameOfMonth",calendarUtilGetMonth(calObj.getMonthInteger())); context.put("monthInt", Integer.valueOf(calObj.getMonthInteger())); context.put("firstpage","true"); context.put("secondpage","false"); context.put("page",state.getCurrentPage()); context.put("date",dateObj1); context.put("helper",new Helper()); context.put("calObj", calObj); context.put("tlang",rb); context.put("config",configProps); state.setState("day"); context.put("message", state.getState()); DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL, new ResourceLoader().getLocale()); try{ context.put("today",formatter.format(calObj.getTime())); }catch(Exception e){ context.put("today", calObj.getTodayDate()); } state.setPrevState(""); buildMenu( portlet, context, runData, state, CalendarPermissions.allowCreateEvents( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference()), CalendarPermissions.allowDeleteEvent( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference(), state.getCalendarEventId()), CalendarPermissions.allowReviseEvents( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference(), state.getCalendarEventId()), CalendarPermissions.allowMergeCalendars( state.getPrimaryCalendarReference()), CalendarPermissions.allowModifyCalendarProperties( state.getPrimaryCalendarReference()), CalendarPermissions.allowImport( state.getPrimaryCalendarReference()), CalendarPermissions.allowSubscribe( state.getPrimaryCalendarReference())); context.put("permissionallowed",Boolean.valueOf(allowed)); context.put("tlang",rb); context.put("config",configProps); context.put("selectedView", rb.getString("java.byday")); context.put("dayName", calendarUtilGetDay(calObj.getDay_Of_Week(false))); } // buildDayContext /** * Build the context for showing week view */ protected void buildWeekContext(VelocityPortlet portlet, Context context, RunData runData, CalendarActionState state) { Calendar calendarObj = null; //Time st,et = null; //CalendarUtil calObj= null; MyYear yearObj = null; MyMonth monthObj1 = null; MyWeek weekObj =null; MyDay dayObj = null; MyDate dateObj1, dateObj2 = null; int dayofweek = 0; // new objects of myYear, myMonth, myDay, myWeek classes yearObj = new MyYear(); monthObj1 = new MyMonth(); weekObj = new MyWeek(); dayObj = new MyDay(); dateObj1 = new MyDate(); CalendarEventVector CalendarEventVectorObj = null; //calObj = state.getCalObj(); String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); int stateYear = b.getYear(); int stateMonth = b.getMonth(); int stateDay = b.getDay(); if ((sstate.getAttribute(STATE_YEAR) != null) && (sstate.getAttribute(STATE_MONTH) != null) && (sstate.getAttribute(STATE_DAY) != null)) { stateYear = ((Integer)sstate.getAttribute(STATE_YEAR)).intValue(); stateMonth = ((Integer)sstate.getAttribute(STATE_MONTH)).intValue(); stateDay = ((Integer)sstate.getAttribute(STATE_DAY)).intValue(); } CalendarUtil calObj = new CalendarUtil(); calObj.setDay(stateYear, stateMonth, stateDay); int iii =0; dateObj1.setTodayDate(calObj.getMonthInteger(),calObj.getDayOfMonth(),calObj.getYear()); yearObj.setYear(calObj.getYear()); monthObj1.setMonth(calObj.getMonthInteger()); dayObj.setDay(calObj.getDayOfMonth()); String calId = state.getPrimaryCalendarReference(); // this loop will move the calendar to the begining of the week if (CalendarService.allowGetCalendar(calId)== false) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.younotallow")); return; } else { try { calendarObj = CalendarService.getCalendar(calId); } catch(IdUnusedException e) { try { CalendarService.commitCalendar(CalendarService.addCalendar(calId)); calendarObj = CalendarService.getCalendar(calId); } catch (Exception err) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.therenoactv")); M_log.debug(".buildWeekContext(): " + err); return; } } catch (PermissionException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.younotperm")); M_log.debug(".buildWeekContext(): " + e); return; } } if (calendarObj.allowGetEvents() == true) { CalendarEventVectorObj = CalendarService.getEvents( getCalendarReferenceList( portlet, state.getPrimaryCalendarReference(), isOnWorkspaceTab()), getWeekTimeRange(calObj)); } else { CalendarEventVectorObj = new CalendarEventVector(); } calObj.setDay(dateObj1.getYear(),dateObj1.getMonth(),dateObj1.getDay()); dayofweek = calObj.getDay_Of_Week(true); calObj.setPrevDate(dayofweek-1); dayofweek = calObj.getDay_Of_Week(true); Time[] pageStartTime = new Time[7]; Time[] pageEndTime = new Time[7]; for(int i = 7; i>=dayofweek; i--) { Vector eventVector = new Vector(); Vector eventVector1; dateObj2 = new MyDate(); dateObj2.setTodayDate(calObj.getMonthInteger(),calObj.getDayOfMonth(),calObj.getYear()); dateObj2.setDayName(calendarUtilGetDay(calObj.getDay_Of_Week(false))); dateObj2.setNameOfMonth(calendarUtilGetMonth(calObj.getMonthInteger())); if (calObj.getDayOfMonth() == dayObj.getDay()) dateObj2.setFlag(1); if(state.getCurrentPage().equals("third")) { eventVector1 = new Vector(); // JS -- the third page starts at 2PM(14 o'clock), and lasts 20 half-hour eventVector = getNewEvents(calObj.getYear(),calObj.getMonthInteger(),calObj.getDayOfMonth(), state, runData,THIRD_PAGE_START_HOUR,19,context,CalendarEventVectorObj); for(int index = 0;index<eventVector1.size();index++) { eventVector.add(eventVector.size(),eventVector1.get(index)); } // Reminder: weekview vm is using 0..6 pageStartTime[i-1] = TimeService.newTimeLocal(calObj.getYear(),calObj.getMonthInteger(),calObj.getDayOfMonth(), THIRD_PAGE_START_HOUR, 0, 0, 0); pageEndTime[i-1] = TimeService.newTimeLocal(calObj.getYear(),calObj.getMonthInteger(),calObj.getDayOfMonth(), 23, 59, 0, 0); } else if (state.getCurrentPage().equals("second")) { eventVector = getNewEvents(calObj.getYear(),calObj.getMonthInteger(),calObj.getDayOfMonth(), state, runData,SECOND_PAGE_START_HOUR,19,context,CalendarEventVectorObj); // Reminder: weekview vm is using 0..6 pageStartTime[i-1] = TimeService.newTimeLocal(calObj.getYear(),calObj.getMonthInteger(),calObj.getDayOfMonth(), SECOND_PAGE_START_HOUR, 0, 0, 0); pageEndTime[i-1] = TimeService.newTimeLocal(calObj.getYear(),calObj.getMonthInteger(),calObj.getDayOfMonth(), 17, 59, 0, 0); } else { eventVector1 = new Vector(); // JS -- the first page starts at 12AM(0 o'clock), and lasts 20 half-hour eventVector1 = getNewEvents(calObj.getYear(),calObj.getMonthInteger(),calObj.getDayOfMonth(), state, runData, FIRST_PAGE_START_HOUR,19,context,CalendarEventVectorObj); for(int index = 0;index<eventVector1.size();index++) { eventVector.insertElementAt(eventVector1.get(index),index); } // Reminder: weekview vm is using 0..6 pageStartTime[i-1] = TimeService.newTimeLocal(calObj.getYear(),calObj.getMonthInteger(),calObj.getDayOfMonth(), 0, 0, 0, 0); pageEndTime[i-1] = TimeService.newTimeLocal(calObj.getYear(),calObj.getMonthInteger(),calObj.getDayOfMonth(), 9, 59, 0, 0); } dateObj2.setEventBerWeek(eventVector); weekObj.setWeek(7-i,dateObj2); // the purpose of this if condition is to check if we reached day 7 if yes do not // call next day. if (i > dayofweek) calObj.nextDate(); } calObj.setDay(yearObj.getYear(),monthObj1.getMonth(),dayObj.getDay()); context.put("week", weekObj); context.put("helper",new Helper()); context.put("date",dateObj1); context.put("page",state.getCurrentPage()); state.setState("week"); context.put("tlang",rb); context.put("config",configProps); context.put("message",state.getState()); DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL, new ResourceLoader().getLocale()); formatter.setTimeZone(TimeService.getLocalTimeZone()); try{ context.put("beginWeek", formatter.format(calObj.getPrevTime(calObj.getDay_Of_Week(true)-1))); }catch(Exception e){ context.put("beginWeek", calObj.getTodayDate()); } try{ calObj.setNextWeek(); context.put("endWeek",formatter.format(calObj.getPrevTime(1))); }catch(Exception e){ context.put("endWeek", calObj.getTodayDate()); } buildMenu( portlet, context, runData, state, CalendarPermissions.allowCreateEvents( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference()), CalendarPermissions.allowDeleteEvent( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference(), state.getCalendarEventId()), CalendarPermissions.allowReviseEvents( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference(), state.getCalendarEventId()), CalendarPermissions.allowMergeCalendars( state.getPrimaryCalendarReference()), CalendarPermissions.allowModifyCalendarProperties( state.getPrimaryCalendarReference()), CalendarPermissions.allowImport( state.getPrimaryCalendarReference()), CalendarPermissions.allowSubscribe( state.getPrimaryCalendarReference())); calObj.setDay(yearObj.getYear(),monthObj1.getMonth(),dayObj.getDay()); context.put("realDate", TimeService.newTime()); context.put("tlang",rb); context.put("config",configProps); Vector vec = new Vector(); context.put("vec", vec); Vector conflictVec = new Vector(); context.put("conflictVec", conflictVec); Vector calVec = new Vector(); context.put("calVec", calVec); HashMap hm = new HashMap(); context.put("hm", hm); Integer intObj = Integer.valueOf(0); context.put("intObj", intObj); context.put("pageStartTime", pageStartTime); context.put("pageEndTime", pageEndTime); context.put("selectedView", rb.getString("java.byweek")); context.put("dayOfWeekNames", calObj.getCalendarDaysOfWeekNames(false)); } // buildWeekContext /** * Build the context for showing New view */ protected void buildNewContext(VelocityPortlet portlet, Context context, RunData runData, CalendarActionState state) { context.put("tlang",rb); context.put("config",configProps); // to get the content Type Image Service context.put("contentTypeImageService", ContentTypeImageService.getInstance()); MyDate dateObj1 = new MyDate(); CalendarUtil calObj= new CalendarUtil(); // set real today's date as default Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); calObj.setDay(b.getYear(), b.getMonth(), b.getDay()); dateObj1.setTodayDate(calObj.getMonthInteger(),calObj.getDayOfMonth(),calObj.getYear()); // get the event id from the CalendarService. // send the event to the vm dateObj1.setNumberOfDaysInMonth(calObj.getNumberOfDays()); List attachments = state.getAttachments(); context.put("attachments",attachments); String calId = state.getPrimaryCalendarReference(); Calendar calendarObj = null; try { calendarObj = CalendarService.getCalendar(calId); Collection groups = calendarObj.getGroupsAllowAddEvent(); String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); String scheduleTo = (String)sstate.getAttribute(STATE_SCHEDULE_TO); if (scheduleTo != null && scheduleTo.length() != 0) { context.put("scheduleTo", scheduleTo); } else { if (calendarObj.allowAddCalendarEvent()) { // default to make site selection context.put("scheduleTo", "site"); } else if (groups.size() > 0) { // to group otherwise context.put("scheduleTo", "groups"); } } if (groups.size() > 0) { List schToGroups = (List)(sstate.getAttribute(STATE_SCHEDULE_TO_GROUPS)); context.put("scheduleToGroups", schToGroups); context.put("groups", groups); } } catch(IdUnusedException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.thereis")); M_log.debug(".buildNewContext(): " + e); return; } catch (PermissionException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.youdont")); M_log.debug(".buildNewContext(): " + e); return; } // Add any additional fields in the calendar. customizeCalendarPage.loadAdditionalFieldsIntoContextFromCalendar( calendarObj, context); // Output for recurring events String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); // if the saved recurring rule equals to string FREQ_ONCE, set it as not recurring // if there is a saved recurring rule in sstate, display it RecurrenceRule rule = (RecurrenceRule) sstate.getAttribute(CalendarAction.SSTATE__RECURRING_RULE); if (rule != null) { context.put("freq", rule.getFrequencyDescription()); context.put("rule", rule); } context.put("date",dateObj1); context.put("savedData",state.getNewData()); context.put("helper",new Helper()); context.put("realDate", TimeService.newTime()); } // buildNewContext /** * Setup for iCal Export. */ public String buildIcalExportPanelContext(VelocityPortlet portlet, Context context, RunData rundata, CalendarActionState state) { String calId = state.getPrimaryCalendarReference(); Calendar calendarObj = null; try { calendarObj = CalendarService.getCalendar(calId); } catch ( Exception e ) { M_log.debug(".buildIcalExportPanelContext: " + e); } context.put("tlang", rb); context.put("config",configProps); // provide form names context.put("form-alias", FORM_ALIAS); context.put("form-ical-enable", FORM_ICAL_ENABLE); context.put("form-submit", BUTTON + "doIcalExport"); context.put("form-cancel", BUTTON + "doCancel"); if ( calendarObj != null ) { List aliasList = AliasService.getAliases( calendarObj.getReference() ); if ( ! aliasList.isEmpty() ) { String alias[] = ((Alias)aliasList.get(0)).getId().split("\\."); context.put("alias", alias[0] ); } } context.put("serverName", ServerConfigurationService.getServerName()); // Add iCal Export URL Reference calendarRef = EntityManager.newReference(calId); String icalUrl = ServerConfigurationService.getAccessUrl() + CalendarService.calendarICalReference(calendarRef); context.put("icalUrl", icalUrl ); boolean exportAllowed = CalendarPermissions.allowImport( calId ); context.put("allow_export", String.valueOf(exportAllowed) ); boolean exportEnabled = CalendarService.getExportEnabled(calId); context.put("enable_export", String.valueOf(exportEnabled) ); // pick the "export" template based on the standard template name String template = (String) getContext(rundata).get("template"); return template + "_icalexport"; } // buildIcalExportPanelContext /** * Build the context for showing delete view */ protected void buildDeleteContext(VelocityPortlet portlet, Context context, RunData runData, CalendarActionState state) { context.put("tlang",rb); context.put("config",configProps); // to get the content Type Image Service context.put("contentTypeImageService", ContentTypeImageService.getInstance()); Calendar calendarObj = null; CalendarEvent calEvent = null; // get the event id from the CalendarService. // send the event to the vm String calId = state.getPrimaryCalendarReference(); String calendarEventObj = state.getCalendarEventId(); try { calendarObj = CalendarService.getCalendar(calId); calEvent = calendarObj.getEvent(calendarEventObj); RecurrenceRule rule = calEvent.getRecurrenceRule(); // for a brand new event, there is no saved recurring rule if (rule != null) { context.put("freq", rule.getFrequencyDescription()); context.put("rule", rule); } context.put("message","delete"); context.put("event",calEvent); // show all the groups in this calendar that user has get event in Collection groups = calendarObj.getGroupsAllowGetEvent(); if (groups != null) { context.put("groupRange", calEvent.getGroupRangeForDisplay(calendarObj)); } } catch (IdUnusedException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.noexist")); M_log.debug(".buildDeleteContext(): " + e); } catch (PermissionException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.youcreate")); M_log.debug(".buildDeleteContext(): " + e); } } // buildDeleteContext /** * calculate the days in the month and there events if any * @param month is int * @param m_calObj is object of calendar */ public MyMonth calMonth(int month, CalendarUtil m_calObj, CalendarActionState state, CalendarEventVector CalendarEventVectorObj) { int numberOfDays = 0; int firstDay_of_Month = 0; boolean start = true; MyMonth monthObj = null; MyDate dateObj = null; Iterator eventList = null; Time startTime = null; Time endTime = null; TimeRange timeRange = null; // new objects of myYear, myMonth, myDay, myWeek classes. monthObj = new MyMonth(); // set the calendar to the begining of the month m_calObj.setDay(m_calObj.getYear(), month, 1); numberOfDays = m_calObj.getNumberOfDays(); // get the index of the first day in the month firstDay_of_Month = m_calObj.getDay_Of_Week(true) - 1; // get the index of the day monthObj.setMonthName(calendarUtilGetMonth(m_calObj.getMonthInteger())); // get the index of first day (-1) to display (may be in previous month) m_calObj.setPrevDate(firstDay_of_Month+1); for(int weekInMonth = 0; weekInMonth < 1; weekInMonth++) { // got the seven days in the first week of the month do.. for(int dayInWeek = 0; dayInWeek < 7; dayInWeek++) { dateObj = new MyDate(); m_calObj.nextDate(); // check if reach the first day of the month. if ((dayInWeek == firstDay_of_Month) || (start == false)) { // check if the current day of the month has been match, if yes set the flag to highlight the day in the // user interface. if ((m_calObj.getDayOfMonth() == state.getcurrentDay()) && (state.getcurrentMonth()== m_calObj.getMonthInteger()) && (state.getcurrentYear() == m_calObj.getYear())) { dateObj.setFlag(1); } // Each monthObj contains dayObjs for the number of the days in the month. dateObj.setTodayDate(m_calObj.getMonthInteger(),m_calObj.getDayOfMonth(),m_calObj.getYear()); startTime = TimeService.newTimeLocal(m_calObj.getYear(),m_calObj.getMonthInteger(),m_calObj.getDayOfMonth(),00,00,00,001); endTime = TimeService.newTimeLocal(m_calObj.getYear(),m_calObj.getMonthInteger(),m_calObj.getDayOfMonth(),23,59,00,000); eventList = CalendarEventVectorObj.getEvents(TimeService.newTimeRange(startTime,endTime,true,true)); dateObj.setEvents(eventList); // keep iterator of events in the dateObj numberOfDays--; monthObj.setDay(dateObj,weekInMonth,dayInWeek); start = false; } else if (start == true) { // fill empty spaces for the first days in the first week in the month before reach the first day of the month dateObj.setTodayDate(m_calObj.getMonthInteger(),m_calObj.getDayOfMonth(),m_calObj.getYear()); startTime = TimeService.newTimeLocal(m_calObj.getYear(),m_calObj.getMonthInteger(),m_calObj.getDayOfMonth(),00,00,00,001); endTime = TimeService.newTimeLocal(m_calObj.getYear(),m_calObj.getMonthInteger(),m_calObj.getDayOfMonth(),23,59,00,000); timeRange = TimeService.newTimeRange(startTime,endTime,true,true); eventList = CalendarEventVectorObj.getEvents(timeRange); dateObj.setEvents(eventList); monthObj.setDay(dateObj,weekInMonth,dayInWeek); dateObj.setFlag(0); }// end else }// end for m }// end for i // Construct the weeks left in the month and save it in the monthObj. // row is the max number of rows in the month., Col is equal to 7 which is the max number of col in the month. for(int row = 1; row<6; row++) { // Col is equal to 7 which is the max number of col in tin he month. for(int col = 0; col<7; col++) { if (numberOfDays != 0) { dateObj = new MyDate(); m_calObj.nextDate(); if ((m_calObj.getDayOfMonth() == state.getcurrentDay()) && (state.getcurrentMonth()== m_calObj.getMonthInteger()) && (state.getcurrentYear() == m_calObj.getYear())) dateObj.setFlag(1); dateObj.setTodayDate(m_calObj.getMonthInteger(),m_calObj.getDayOfMonth(),m_calObj.getYear()); startTime = TimeService.newTimeLocal(m_calObj.getYear(),m_calObj.getMonthInteger(),m_calObj.getDayOfMonth(),00,00,00,001); endTime = TimeService.newTimeLocal(m_calObj.getYear(),m_calObj.getMonthInteger(),m_calObj.getDayOfMonth(),23,59,00,000); timeRange = TimeService.newTimeRange(startTime,endTime,true,true); eventList = CalendarEventVectorObj.getEvents(timeRange); dateObj.setEvents(eventList); numberOfDays--; monthObj.setDay(dateObj,row,col); monthObj.setRow(row); } else // if it is not the end of week , complete the week wih days from next month. { if ((m_calObj.getDay_Of_Week(true))== 7) // if end of week, exit the loop { row = 7; col = SECOND_PAGE_START_HOUR; } else // if it is not the end of week, complete with days from next month { dateObj = new MyDate(); m_calObj.nextDate(); dateObj.setTodayDate(m_calObj.getMonthInteger(),m_calObj.getDayOfMonth(),m_calObj.getYear()); startTime = TimeService.newTimeLocal(m_calObj.getYear(),m_calObj.getMonthInteger(),m_calObj.getDayOfMonth(),00,00,00,001); endTime = TimeService.newTimeLocal(m_calObj.getYear(),m_calObj.getMonthInteger(),m_calObj.getDayOfMonth(),23,59,00,000); timeRange = TimeService.newTimeRange(startTime,endTime,true,true); eventList = CalendarEventVectorObj.getEvents(timeRange); dateObj.setEvents(eventList); monthObj.setDay(dateObj,row,col); monthObj.setRow(row); dateObj.setFlag(0); } } }// end for }// end for return monthObj; } public void doAttachments(RunData rundata, Context context) { // get into helper mode with this helper tool startHelper(rundata.getRequest(), "sakai.filepicker"); // setup the parameters for the helper SessionState state = ((JetspeedRunData) rundata).getPortletSessionState(((JetspeedRunData) rundata).getJs_peid()); CalendarActionState State = (CalendarActionState)getState( context, rundata, CalendarActionState.class ); int houri; // put a the real attachments into the stats - let the helper update it directly if the user chooses to save their attachment editing. List attachments = State.getAttachments(); state.setAttribute(FilePickerHelper.FILE_PICKER_ATTACHMENTS, attachments); String hour = ""; hour = rundata.getParameters().getString("startHour"); String title =""; title = rundata.getParameters().getString("activitytitle"); String minute = ""; minute = rundata.getParameters().getString("startMinute"); String dhour = ""; dhour = rundata.getParameters().getString("duHour"); String dminute = ""; dminute = rundata.getParameters().getString("duMinute"); String description = ""; description = rundata.getParameters().getString("description"); description = processFormattedTextFromBrowser(state, description); String month = ""; month = rundata.getParameters().getString("month"); String day = ""; day = rundata.getParameters().getString("day"); String year = ""; year = rundata.getParameters().getString("yearSelect"); String timeType = ""; timeType = rundata.getParameters().getString("startAmpm"); String type = ""; type = rundata.getParameters().getString("eventType"); String location = ""; location = rundata.getParameters().getString("location"); readEventGroupForm(rundata, context); // read the recurrence modification intention String intentionStr = rundata.getParameters().getString("intention"); if (intentionStr == null) intentionStr = ""; Calendar calendarObj = null; String calId = State.getPrimaryCalendarReference(); try { calendarObj = CalendarService.getCalendar(calId); } catch(IdUnusedException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.thereis")); M_log.debug(".buildCustomizeContext(): " + e); return; } catch (PermissionException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.youdont")); M_log.debug(".buildCustomizeContext(): " + e); return; } Map addfieldsMap = new HashMap(); // Add any additional fields in the calendar. customizeCalendarPage. loadAdditionalFieldsMapFromRunData(rundata, addfieldsMap, calendarObj); if (timeType.equals("pm")) { if (Integer.parseInt(hour)>11) houri = Integer.parseInt(hour); else houri = Integer.parseInt(hour)+12; } else if (timeType.equals("am") && Integer.parseInt(hour)==12) { houri = 24; } else { houri = Integer.parseInt(hour); } State.clearData(); State.setNewData(State.getPrimaryCalendarReference(), title,description,Integer.parseInt(month),Integer.parseInt(day),year,houri,Integer.parseInt(minute),Integer.parseInt(dhour),Integer.parseInt(dminute),type,timeType,location, addfieldsMap, intentionStr); // **************** changed for the new attachment editor ************************** } // doAttachments /** * Action is used when doMonth requested in the menu */ public void doMonth(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); state.setState("month"); } // doMonth /** * Action is used when doDescription is requested when the user click on an event */ public void doDescription(RunData data, Context context) { CalendarEvent calendarEventObj = null; Calendar calendarObj = null; CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); // "crack" the reference (a.k.a dereference, i.e. make a Reference) // and get the event id and calendar reference Reference ref = EntityManager.newReference(data.getParameters().getString(EVENT_REFERENCE_PARAMETER)); String eventId = ref.getId(); String calId = null; if(CalendarService.REF_TYPE_EVENT_SUBSCRIPTION.equals(ref.getSubType())) calId = CalendarService.calendarSubscriptionReference(ref.getContext(), ref.getContainer()); else calId = CalendarService.calendarReference(ref.getContext(), ref.getContainer()); // %%% get the event object from the reference new Reference(data.getParameters().getString(EVENT_REFERENCE_PARAMETER)).getResource() -ggolden try { calendarObj = CalendarService.getCalendar(calId); try { calendarEventObj = calendarObj.getEvent(eventId); TimeBreakdown b = calendarEventObj.getRange().firstTime().breakdownLocal(); sstate.setAttribute(STATE_YEAR, Integer.valueOf(b.getYear())); sstate.setAttribute(STATE_MONTH, Integer.valueOf(b.getMonth())); sstate.setAttribute(STATE_DAY, Integer.valueOf(b.getDay())); sstate.setAttribute(STATE_NAV_DIRECTION, STATE_CURRENT_ACT); } catch (IdUnusedException err) { // if this event doesn't exist, let user not go to the detail view // set the state recorded ID as null // show the alert message M_log.debug(".IdUnusedException " + err); state.setCalendarEventId("", ""); String errorCode = rb.getString("java.error"); addAlert(sstate, errorCode); return; } catch (PermissionException err) { addAlert(sstate, rb.getString("java.alert.youcreate")); M_log.debug(".PermissionException " + err); return; } } catch (IdUnusedException e) { addAlert(sstate, rb.getString("java.alert.noexist")); return; } catch (PermissionException e) { addAlert(sstate, rb.getString("java.alert.youcreate")); return; } // store the state coming from, like day view, week view, month view or list view String returnState = state.getState(); state.setPrevState(returnState); state.setReturnState(returnState); state.setState("description"); state.setAttachments(null); state.setCalendarEventId(calId, eventId); } // doDescription /** * Action is used when doGomonth requested in the year/list view */ public void doGomonth(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); int stateYear = b.getYear(); int stateMonth = b.getMonth(); int stateDay = b.getDay(); if ((sstate.getAttribute(STATE_YEAR) != null) && (sstate.getAttribute(STATE_MONTH) != null) && (sstate.getAttribute(STATE_DAY) != null)) { stateYear = ((Integer)sstate.getAttribute(STATE_YEAR)).intValue(); stateMonth = ((Integer)sstate.getAttribute(STATE_MONTH)).intValue(); stateDay = ((Integer)sstate.getAttribute(STATE_DAY)).intValue(); } CalendarUtil m_calObj = new CalendarUtil(); m_calObj.setDay(stateYear, stateMonth, stateDay); String month = ""; month = data.getParameters().getString("month"); m_calObj.setMonth(Integer.parseInt(month)); // if this function is called from list view // the value of year must be caught also int yearInt = m_calObj.getYear(); String currentState = state.getState(); if (currentState.equalsIgnoreCase("list")) { String year = ""; year = data.getParameters().getString("year"); yearInt = Integer.parseInt(year); } m_calObj.setDay(yearInt, m_calObj.getMonthInteger(), m_calObj.getDayOfMonth()); sstate.setAttribute(STATE_YEAR, Integer.valueOf(yearInt)); sstate.setAttribute(STATE_MONTH, Integer.valueOf(m_calObj.getMonthInteger())); sstate.setAttribute(STATE_DAY, Integer.valueOf(m_calObj.getDayOfMonth())); state.setState("month"); } // doGomonth /** * Action is used when doGoyear requested in the list view */ public void doGoyear(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); int stateYear = b.getYear(); int stateMonth = b.getMonth(); int stateDay = b.getDay(); if ((sstate.getAttribute(STATE_YEAR) != null) && (sstate.getAttribute(STATE_MONTH) != null) && (sstate.getAttribute(STATE_DAY) != null)) { stateYear = ((Integer)sstate.getAttribute(STATE_YEAR)).intValue(); stateMonth = ((Integer)sstate.getAttribute(STATE_MONTH)).intValue(); stateDay = ((Integer)sstate.getAttribute(STATE_DAY)).intValue(); } CalendarUtil m_calObj = new CalendarUtil(); CalendarUtil calObj = new CalendarUtil(); calObj.setDay(stateYear, stateMonth, stateDay); m_calObj.setDay(stateYear, stateMonth, stateDay); // catch the year value from the list view int yearInt = m_calObj.getYear(); String currentState = state.getState(); if (currentState.equalsIgnoreCase("list")) { String year = ""; year = data.getParameters().getString("year"); yearInt = Integer.parseInt(year); } m_calObj.setDay(yearInt, m_calObj.getMonthInteger(), m_calObj.getDayOfMonth()); sstate.setAttribute(STATE_YEAR, Integer.valueOf(yearInt)); sstate.setAttribute(STATE_MONTH, Integer.valueOf(m_calObj.getMonthInteger())); sstate.setAttribute(STATE_DAY, Integer.valueOf(m_calObj.getDayOfMonth())); state.setState("year"); } // doGoyear /** * Action is used when doOk is requested when user click on Back button */ public void doOk(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); // return to the state coming from String returnState = state.getReturnState(); state.setState(returnState); } /** * Action is used when the user click on the doRevise in the menu */ public void doRevise(RunData data, Context context) { CalendarEvent calendarEventObj = null; Calendar calendarObj = null; CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); String calId = state.getPrimaryCalendarReference(); state.setPrevState(state.getState()); state.setState("goToReviseCalendar"); state.setIsNewCalendar(false); state.setfromAttachmentFlag("false"); sstate.setAttribute(FREQUENCY_SELECT, null); sstate.setAttribute(CalendarAction.SSTATE__RECURRING_RULE, null); state.clearData(); try { calendarObj = CalendarService.getCalendar(calId); try { String eventId = state.getCalendarEventId(); // get the edit object, and lock the event for the furthur revise CalendarEventEdit edit = calendarObj.getEditEvent(eventId, org.sakaiproject.calendar.api.CalendarService.EVENT_MODIFY_CALENDAR); state.setEdit(edit); state.setPrimaryCalendarEdit(edit); calendarEventObj = calendarObj.getEvent(eventId); state.setAttachments(calendarEventObj.getAttachments()); } catch (IdUnusedException err) { // if this event doesn't exist, let user stay in activity view // set the state recorded ID as null // show the alert message // reset the menu button display, no revise/delete M_log.debug(".IdUnusedException " + err); state.setState("description"); state.setCalendarEventId("", ""); String errorCode = rb.getString("java.alert.event"); addAlert(sstate, errorCode); } catch (PermissionException err) { M_log.debug(".PermissionException " + err); } catch (InUseException err) { M_log.debug(".InUseException " + err); state.setState("description"); String errorCode = rb.getString("java.alert.eventbeing"); addAlert(sstate, errorCode); } } catch (IdUnusedException e) { addAlert(sstate, rb.getString("java.alert.noexist")); } catch (PermissionException e) { addAlert(sstate, rb.getString("java.alert.youcreate")); } } // doRevise /** * Handle the "continue" button on the schedule import wizard. */ public void doScheduleContinue(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); if ( SELECT_TYPE_IMPORT_WIZARD_STATE.equals(state.getImportWizardState()) ) { // If the type is Outlook or MeetingMaker, the next state is // the "other" file select mode where we just select a file without // all of the extra info on the generic import page. String importType = data.getParameters ().getString(WIZARD_IMPORT_TYPE); if ( CalendarImporterService.OUTLOOK_IMPORT.equals(importType) || CalendarImporterService.MEETINGMAKER_IMPORT.equals(importType) || CalendarImporterService.ICALENDAR_IMPORT.equals(importType)) { if (CalendarImporterService.OUTLOOK_IMPORT.equals(importType)) { state.setImportWizardType(CalendarImporterService.OUTLOOK_IMPORT); state.setImportWizardState(OTHER_SELECT_FILE_IMPORT_WIZARD_STATE); } else if (CalendarImporterService.MEETINGMAKER_IMPORT.equals(importType)) { state.setImportWizardType(CalendarImporterService.MEETINGMAKER_IMPORT); state.setImportWizardState(OTHER_SELECT_FILE_IMPORT_WIZARD_STATE); } else { state.setImportWizardType(CalendarImporterService.ICALENDAR_IMPORT); state.setImportWizardState(ICAL_SELECT_FILE_IMPORT_WIZARD_STATE); } } else { // Remember the type we're importing state.setImportWizardType(CalendarImporterService.CSV_IMPORT); state.setImportWizardState(GENERIC_SELECT_FILE_IMPORT_WIZARD_STATE); } } else if ( GENERIC_SELECT_FILE_IMPORT_WIZARD_STATE.equals(state.getImportWizardState()) ) { boolean importSucceeded = false; // Do the import and send us to the confirm page FileItem importFile = data.getParameters().getFileItem(WIZARD_IMPORT_FILE); try { Map columnMap = CalendarImporterService.getDefaultColumnMap(CalendarImporterService.CSV_IMPORT); String [] addFieldsCalendarArray = getCustomFieldsArray(state, sstate); if ( addFieldsCalendarArray != null ) { // Add all custom columns. Assume that there will be no // name collisions. (Maybe a marginal assumption.) for ( int i=0; i < addFieldsCalendarArray.length; i++) { columnMap.put( addFieldsCalendarArray[i], addFieldsCalendarArray[i]); } } state.setWizardImportedEvents( CalendarImporterService.doImport( CalendarImporterService.CSV_IMPORT, new ByteArrayInputStream(importFile.get()), columnMap, addFieldsCalendarArray)); importSucceeded = true; } catch (ImportException e) { addAlert(sstate, e.getMessage()); } if ( importSucceeded ) { // If all is well, go on to the confirmation page. state.setImportWizardState(CONFIRM_IMPORT_WIZARD_STATE); } else { // If there are errors, send us back to the file selection page. state.setImportWizardState(GENERIC_SELECT_FILE_IMPORT_WIZARD_STATE); } } else if ( OTHER_SELECT_FILE_IMPORT_WIZARD_STATE.equals(state.getImportWizardState()) || ICAL_SELECT_FILE_IMPORT_WIZARD_STATE.equals(state.getImportWizardState()) ) { boolean importSucceeded = false; // Do the import and send us to the confirm page FileItem importFile = data.getParameters().getFileItem(WIZARD_IMPORT_FILE); String [] addFieldsCalendarArray = getCustomFieldsArray(state, sstate); try { state.setWizardImportedEvents( CalendarImporterService.doImport( state.getImportWizardType(), new ByteArrayInputStream(importFile.get()), null, addFieldsCalendarArray)); importSucceeded = true; } catch (ImportException e) { addAlert(sstate, e.getMessage()); } if ( importSucceeded ) { // If all is well, go on to the confirmation page. state.setImportWizardState(CONFIRM_IMPORT_WIZARD_STATE); } else { // If there are errors, send us back to the file selection page. state.setImportWizardState(OTHER_SELECT_FILE_IMPORT_WIZARD_STATE); } } else if ( CONFIRM_IMPORT_WIZARD_STATE.equals(state.getImportWizardState()) ) { // If there are errors, send us back to Either // the OTHER_SELECT_FILE or GENERIC_SELECT_FILE states. // Otherwise, we're done. List wizardCandidateEventList = state.getWizardImportedEvents(); // for group awareness - read user selection readEventGroupForm(data, context); String scheduleTo = (String)sstate.getAttribute(STATE_SCHEDULE_TO); Collection groupChoice = (Collection) sstate.getAttribute(STATE_SCHEDULE_TO_GROUPS); if ( scheduleTo != null && ( scheduleTo.equals("site") || (scheduleTo.equals("groups") && groupChoice!=null && groupChoice.size()>0) ) ) { for ( int i =0; i < wizardCandidateEventList.size(); i++ ) { // The line numbers are one-based. String selectionName = "eventSelected" + (i+1); String selectdValue = data.getParameters().getString(selectionName); if ( TRUE_STRING.equals(selectdValue) ) { // Add the events String calId = state.getPrimaryCalendarReference(); try { Calendar calendarObj = CalendarService.getCalendar(calId); CalendarEvent event = (CalendarEvent) wizardCandidateEventList.get(i); CalendarEventEdit newEvent = calendarObj.addEvent(); state.setEdit(newEvent); if ( event.getDescriptionFormatted() != null ) { newEvent.setDescriptionFormatted( event.getDescriptionFormatted() ); } // Range must be present at this point, so don't check for null. newEvent.setRange(event.getRange()); if ( event.getDisplayName() != null ) { newEvent.setDisplayName(event.getDisplayName()); } // The type must have either been set or defaulted by this point. newEvent.setType(event.getType()); if ( event.getLocation() != null ) { newEvent.setLocation(event.getLocation()); } if ( event.getRecurrenceRule() != null ) { newEvent.setRecurrenceRule(event.getRecurrenceRule()); } String [] customFields = getCustomFieldsArray(state, sstate); // Set the creator newEvent.setCreator(); // Copy any custom fields. if ( customFields != null ) { for ( int j = 0; j < customFields.length; j++ ) { newEvent.setField(customFields[j], event.getField(customFields[j])); } } // group awareness try { // for site event if (scheduleTo.equals("site")) { newEvent.clearGroupAccess(); } // for grouped event else if (scheduleTo.equals("groups")) { Site site = SiteService.getSite(calendarObj.getContext()); // make a collection of Group objects from the collection of group ref strings Collection groups = new Vector(); for (Iterator iGroups = groupChoice.iterator(); iGroups.hasNext();) { String groupRef = (String) iGroups.next(); groups.add(site.getGroup(groupRef)); } newEvent.setGroupAccess(groups, true); } } catch (Exception e) { M_log.warn("doScheduleContinue: " + e); } calendarObj.commitEvent(newEvent); state.setEdit(null); } catch (IdUnusedException e) { addAlert(sstate, e.getMessage()); M_log.debug(".doScheduleContinue(): " + e); break; } catch (PermissionException e) { addAlert(sstate, e.getMessage()); M_log.debug(".doScheduleContinue(): " + e); break; } } } // Cancel wizard mode. doCancelImportWizard(data, context); } else { addAlert(sstate, rb.getString("java.alert.youchoosegroup")); } } } /** * Get an array of custom field names (if any) */ private String[] getCustomFieldsArray( CalendarActionState state, SessionState sstate) { Calendar calendarObj = null; try { calendarObj = CalendarService.getCalendar( state.getPrimaryCalendarReference()); } catch (IdUnusedException e1) { // Ignore } catch (PermissionException e) { addAlert(sstate, e.getMessage()); } // Get a current list of add fields. This is a comma-delimited string. String[] addFieldsCalendarArray = null; if ( calendarObj != null ) { String addfieldsCalendars = calendarObj.getEventFields(); if (addfieldsCalendars != null) { addFieldsCalendarArray = fieldStringToArray( addfieldsCalendars, ADDFIELDS_DELIMITER); } } return addFieldsCalendarArray; } /** * Handle the back button on the schedule import wizard */ public void doScheduleBack(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); if (GENERIC_SELECT_FILE_IMPORT_WIZARD_STATE.equals(state.getImportWizardState()) || OTHER_SELECT_FILE_IMPORT_WIZARD_STATE.equals(state.getImportWizardState())) { state.setImportWizardState(SELECT_TYPE_IMPORT_WIZARD_STATE); } else if (CONFIRM_IMPORT_WIZARD_STATE.equals(state.getImportWizardState())) { if (CalendarImporterService.OUTLOOK_IMPORT.equals(state.getImportWizardType()) || CalendarImporterService.MEETINGMAKER_IMPORT.equals(state.getImportWizardType())) { state.setImportWizardState(OTHER_SELECT_FILE_IMPORT_WIZARD_STATE); } else if (CalendarImporterService.ICALENDAR_IMPORT.equals(state.getImportWizardType())) { state.setImportWizardState(ICAL_SELECT_FILE_IMPORT_WIZARD_STATE); } else { state.setImportWizardState(GENERIC_SELECT_FILE_IMPORT_WIZARD_STATE); } } } /** * Called when the user cancels the import wizard. */ public void doCancelImportWizard(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); // Get rid of any events state.setWizardImportedEvents(null); // Make sure that we start the wizard at the beginning. state.setImportWizardState(null); // Return to the previous state. state.setState(state.getPrevState()); } /** * Action is used when the docancel is requested when the user click on cancel in the new view */ public void doCancel(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); Calendar calendarObj = null; String currentState = state.getState(); String returnState = state.getReturnState(); if (currentState.equals(STATE_NEW)) { // no need to release the lock. // clear the saved recurring rule and the selected frequency sstate.setAttribute(CalendarAction.SSTATE__RECURRING_RULE, null); sstate.setAttribute(FREQUENCY_SELECT, null); } else if (currentState.equals(STATE_CUSTOMIZE_CALENDAR)) { customizeCalendarPage.doCancel(data, context, state, getSessionState(data)); returnState=state.getPrevState(); if (returnState.endsWith("!!!fromDescription")) { state.setReturnState(returnState.substring(0, returnState.indexOf("!!!fromDescription"))); returnState = "description"; } } else if (currentState.equals(STATE_CALENDAR_SUBSCRIPTIONS)) { calendarSubscriptionsPage.doCancel(data, context, state, getSessionState(data)); //returnState=state.getPrevState(); returnState=state.getReturnState(); if (returnState.endsWith("!!!fromDescription")) { state.setReturnState(returnState.substring(0, returnState.indexOf("!!!fromDescription"))); returnState = "description"; } } else if (currentState.equals(STATE_MERGE_CALENDARS)) { mergedCalendarPage.doCancel(data, context, state, getSessionState(data)); returnState=state.getReturnState(); if (returnState.endsWith("!!!fromDescription")) { state.setReturnState(returnState.substring(0, returnState.indexOf("!!!fromDescription"))); returnState = "description"; } } else // in revise view, state name varies if ((currentState.equals("revise"))|| (currentState.equals("goToReviseCalendar"))) { String calId = state.getPrimaryCalendarReference(); if (state.getPrimaryCalendarEdit() != null) { try { calendarObj = CalendarService.getCalendar(calId); // the event is locked, now we need to release the lock calendarObj.cancelEvent(state.getPrimaryCalendarEdit()); state.setPrimaryCalendarEdit(null); state.setEdit(null); } catch (IdUnusedException e) { addAlert(sstate, rb.getString("java.alert.noexist")); } catch (PermissionException e) { addAlert(sstate, rb.getString("java.alert.youcreate")); } } // clear the saved recurring rule and the selected frequency sstate.setAttribute(CalendarAction.SSTATE__RECURRING_RULE, null); sstate.setAttribute(FREQUENCY_SELECT, null); } else if (currentState.equals(STATE_SET_FREQUENCY))// cancel at frequency editing page { returnState = (String)sstate.getAttribute(STATE_BEFORE_SET_RECURRENCE); } state.setState(returnState); state.setAttachments(null); } // doCancel /** * Action is used when the doBack is called when the user click on the back on the EventActivity view */ public void doBack(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); Calendar calendarObj = null; String calId = state.getPrimaryCalendarReference(); try { calendarObj = CalendarService.getCalendar(calId); // the event is locked, now we need to release the lock calendarObj.cancelEvent(state.getPrimaryCalendarEdit()); state.setPrimaryCalendarEdit(null); state.setEdit(null); } catch (IdUnusedException e) { addAlert(sstate, rb.getString("java.alert.noexist")); } catch (PermissionException e) { addAlert(sstate, rb.getString("java.alert.youcreate")); } String returnState = state.getReturnState(); state.setState(returnState); } // doBack /** * Action is used when the doDelete is called when the user click on delete in menu */ public void doDelete(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); CalendarEvent calendarEventObj = null; Calendar calendarObj = null; String calId = state.getPrimaryCalendarReference(); try { calendarObj = CalendarService.getCalendar(calId); try { String eventId = state.getCalendarEventId(); // get the edit object, and lock the event for the furthur revise CalendarEventEdit edit = calendarObj.getEditEvent(eventId, org.sakaiproject.calendar.api.CalendarService.EVENT_REMOVE_CALENDAR); state.setEdit(edit); state.setPrimaryCalendarEdit(edit); calendarEventObj = calendarObj.getEvent(eventId); state.setAttachments(calendarEventObj.getAttachments()); // after deletion, it needs to go back to previous page // if coming from description, it won't go back to description // but the state one step ealier String returnState = state.getState(); if (!returnState.equals("description")) { state.setReturnState(returnState); } state.setState("delete"); } catch (IdUnusedException err) { // if this event doesn't exist, let user stay in activity view // set the state recorded ID as null // show the alert message // reset the menu button display, no revise/delete M_log.debug(".IdUnusedException " + err); state.setState("description"); state.setCalendarEventId("", ""); String errorCode = rb.getString("java.alert.event"); addAlert(sstate, errorCode); } catch (PermissionException err) { M_log.debug(".PermissionException " + err); } catch (InUseException err) { M_log.debug(".InUseException delete" + err); state.setState("description"); String errorCode = rb.getString("java.alert.eventbeing"); addAlert(sstate, errorCode); } } catch (IdUnusedException e) { addAlert(sstate, rb.getString("java.alert.noexist")); } catch (PermissionException e) { addAlert(sstate, rb.getString("java.alert.youcreate")); } } // doDelete /** * Action is used when the doConfirm is called when the user click on confirm to delete event in the delete view. */ public void doConfirm(RunData data, Context context) { Calendar calendarObj = null; CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); // read the intention field String intentionStr = data.getParameters().getString("intention"); int intention = CalendarService.MOD_NA; if ("t".equals(intentionStr)) intention = CalendarService.MOD_THIS; String calId = state.getPrimaryCalendarReference(); try { calendarObj = CalendarService.getCalendar(calId); CalendarEventEdit edit = state.getPrimaryCalendarEdit(); calendarObj.removeEvent(edit, intention); state.setPrimaryCalendarEdit(null); } catch (IdUnusedException e) { addAlert(sstate, rb.getString("java.alert.noexist")); M_log.debug(".doConfirm(): " + e); } catch (PermissionException e) { addAlert(sstate, rb.getString("java.alert.youcreate")); M_log.debug(".doConfirm(): " + e); } String returnState = state.getReturnState(); state.setState(returnState); } // doConfirm public void doView (RunData data, Context context) { SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); String viewMode = data.getParameters ().getString("view"); if (viewMode.equalsIgnoreCase(rb.getString("java.byday"))) { doMenueday(data, context); } else if (viewMode.equalsIgnoreCase(rb.getString("java.byweek"))) { doWeek(data, context); } else if (viewMode.equalsIgnoreCase(rb.getString("java.bymonth"))) { doMonth(data, context); } else if (viewMode.equalsIgnoreCase(rb.getString("java.byyear"))) { doYear(data, context); } else if (viewMode.equalsIgnoreCase(rb.getString("java.listeve"))) { doList(data, context); } state.setAttribute(STATE_SELECTED_VIEW, viewMode); } // doView /** * Action doYear is requested when the user click on Year on menu */ public void doYear(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); state.setState("year"); } // doYear /** * Action doWeek is requested when the user click on the week item in then menu */ public void doWeek(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); state.setState("week"); } // doWeek /** * Action doDay is requested when the user click on the day item in the menue */ public void doDay(RunData data, Context context) { String year = null; year = data.getParameters().getString("year"); String month = null; month = data.getParameters().getString("month"); String day = null; day = data.getParameters().getString("day"); CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); sstate.setAttribute(STATE_YEAR, Integer.valueOf(Integer.parseInt(year))); sstate.setAttribute(STATE_MONTH, Integer.valueOf(Integer.parseInt(month))); sstate.setAttribute(STATE_DAY, Integer.valueOf(Integer.parseInt(day))); state.setPrevState(state.getState()); // remember the coming state from Month, Year or List state.setState("day"); } // doDay /** * Action doToday is requested when the user click on "Go to today" button */ public void doToday(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); CalendarUtil m_calObj = new CalendarUtil(); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); m_calObj.setDay(b.getYear(), b.getMonth(), b.getDay()); sstate.setAttribute(STATE_YEAR, Integer.valueOf(b.getYear())); sstate.setAttribute(STATE_MONTH, Integer.valueOf(b.getMonth())); sstate.setAttribute(STATE_DAY, Integer.valueOf(b.getDay())); state.setState("day"); //for dropdown menu display purpose sstate.setAttribute(STATE_SELECTED_VIEW, rb.getString("java.byday")); } // doToday /** * Action doCustomDate is requested when the user specifies a start/end date * to filter the list view. */ public void doCustomdate(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); String sY = data.getParameters().getString(TIME_FILTER_SETTING_CUSTOM_START_YEAR); String sM = data.getParameters().getString(TIME_FILTER_SETTING_CUSTOM_START_MONTH); String sD = data.getParameters().getString(TIME_FILTER_SETTING_CUSTOM_START_DAY); String eY = data.getParameters().getString(TIME_FILTER_SETTING_CUSTOM_END_YEAR); String eM = data.getParameters().getString(TIME_FILTER_SETTING_CUSTOM_END_MONTH); String eD = data.getParameters().getString(TIME_FILTER_SETTING_CUSTOM_END_DAY); if (sM.length() == 1) sM = "0"+sM; if (eM.length() == 1) eM = "0"+eM; if (sD.length() == 1) sD = "0"+sD; if (eD.length() == 1) eD = "0"+eD; sY = sY.substring(2); eY = eY.substring(2); String startingDateStr = sM + "/" + sD + "/" + sY; String endingDateStr = eM + "/" + eD + "/" + eY; // Pass in a buffer for a possible error message. StringBuilder errorMessage = new StringBuilder(); // Try to simultaneously set the start/end dates. // If that doesn't work, add an error message. if ( !state.getCalendarFilter().setStartAndEndListViewDates(startingDateStr, endingDateStr, errorMessage) ) { addAlert(sstate, errorMessage.toString()); } } // doCustomdate /** * Action doFilter is requested when the user clicks on the list box * to select a filtering mode for the list view. */ public void doFilter(RunData data, Context context) { CalendarActionState state = (CalendarActionState) getState(context, data, CalendarActionState.class); state.getCalendarFilter().setListViewFilterMode( data.getParameters().getString(TIME_FILTER_OPTION_VAR)); } // doFilter /** * Action is requestd when the user select day from the menu avilable in some views. */ public void doMenueday(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); state.setState("day"); } // doMenueday /** * Action is requsted when the user select day from menu in Activityevent view. */ public void doActivityday(RunData data, Context context) { CalendarEvent ce = null; Calendar calendarObj = null; CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); CalendarUtil m_calObj = new CalendarUtil(); String id = state.getCalendarEventId(); String calId = state.getPrimaryCalendarReference(); try { calendarObj = CalendarService.getCalendar(calId); ce = calendarObj.getEvent(id); } catch (IdUnusedException e) { addAlert(sstate, rb.getString("java.alert.noexist")); M_log.warn(".doActivityday(): " + e); return; } catch (PermissionException e) { addAlert(sstate, rb.getString("java.alert.youcreate")); M_log.warn(".doActivityday(): " + e); return; } TimeRange tr = ce.getRange(); Time t = tr.firstTime(); TimeBreakdown b = t.breakdownLocal(); m_calObj.setDay(b.getYear(),b.getMonth(),b.getDay()) ; sstate.setAttribute(STATE_YEAR, Integer.valueOf(b.getYear())); sstate.setAttribute(STATE_MONTH, Integer.valueOf(b.getMonth())); sstate.setAttribute(STATE_DAY, Integer.valueOf(b.getDay())); state.setState("day"); } // doActivityDay /** * Action doNext is called when the user click on next button to move to next day, next week, next month or next year. */ public void doNext(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); String currentstate = state.getState(); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); int stateYear = b.getYear(); int stateMonth = b.getMonth(); int stateDay = b.getDay(); if ((sstate.getAttribute(STATE_YEAR) != null) && (sstate.getAttribute(STATE_MONTH) != null) && (sstate.getAttribute(STATE_DAY) != null)) { stateYear = ((Integer)sstate.getAttribute(STATE_YEAR)).intValue(); stateMonth = ((Integer)sstate.getAttribute(STATE_MONTH)).intValue(); stateDay = ((Integer)sstate.getAttribute(STATE_DAY)).intValue(); } CalendarUtil m_calObj = new CalendarUtil(); m_calObj.setDay(stateYear, stateMonth, stateDay); if (currentstate.equals("month")) { m_calObj.getNextMonth(); } if (currentstate.equals("year")) { m_calObj.setNextYear(); } if (currentstate.equals("day")) { String date = m_calObj.getNextDate(); state.setnextDate(date); } if (currentstate.equals("week")) { m_calObj.setNextWeek(); } sstate.setAttribute(STATE_YEAR, Integer.valueOf(m_calObj.getYear())); sstate.setAttribute(STATE_MONTH, Integer.valueOf(m_calObj.getMonthInteger())); sstate.setAttribute(STATE_DAY, Integer.valueOf(m_calObj.getDayOfMonth())); } // doNext /** * Action doNextday is called when the user click on "Tomorrow" link in day view */ public void doNextday(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); String currentstate = state.getState(); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); int stateYear = b.getYear(); int stateMonth = b.getMonth(); int stateDay = b.getDay(); if ((sstate.getAttribute(STATE_YEAR) != null) && (sstate.getAttribute(STATE_MONTH) != null) && (sstate.getAttribute(STATE_DAY) != null)) { stateYear = ((Integer)sstate.getAttribute(STATE_YEAR)).intValue(); stateMonth = ((Integer)sstate.getAttribute(STATE_MONTH)).intValue(); stateDay = ((Integer)sstate.getAttribute(STATE_DAY)).intValue(); } CalendarUtil m_calObj = new CalendarUtil(); //null; m_calObj.setDay(stateYear, stateMonth, stateDay); if (currentstate.equals("day")) { String date = m_calObj.getNextDate(); state.setnextDate(date); sstate.setAttribute(STATE_YEAR, Integer.valueOf(m_calObj.getYear())); sstate.setAttribute(STATE_MONTH, Integer.valueOf(m_calObj.getMonthInteger())); sstate.setAttribute(STATE_DAY, Integer.valueOf(m_calObj.getDayOfMonth())); // if this function is called thru "tomorrow" link // the default page has to be changed to "first" state.setCurrentPage("first"); } } // doNextday /** * Action doPrev is requested when the user click on the prev button to move into pre day, month, year, or week. */ public void doPrev(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); int stateYear = b.getYear(); int stateMonth = b.getMonth(); int stateDay = b.getDay(); if ((sstate.getAttribute(STATE_YEAR) != null) && (sstate.getAttribute(STATE_MONTH) != null) && (sstate.getAttribute(STATE_DAY) != null)) { stateYear = ((Integer)sstate.getAttribute(STATE_YEAR)).intValue(); stateMonth = ((Integer)sstate.getAttribute(STATE_MONTH)).intValue(); stateDay = ((Integer)sstate.getAttribute(STATE_DAY)).intValue(); } CalendarUtil m_calObj = new CalendarUtil(); m_calObj.setDay(stateYear, stateMonth, stateDay); String currentstate = state.getState(); if (currentstate.equals("month")) { m_calObj.getPrevMonth(); } if (currentstate.equals("year")) { m_calObj.setPrevYear(); } if (currentstate.equals("day")) { String date = m_calObj.getPrevDate(); state.setprevDate(date); } if (currentstate.equals("week")) { m_calObj.setPrevWeek(); } sstate.setAttribute(STATE_YEAR, Integer.valueOf(m_calObj.getYear())); sstate.setAttribute(STATE_MONTH, Integer.valueOf(m_calObj.getMonthInteger())); sstate.setAttribute(STATE_DAY, Integer.valueOf(m_calObj.getDayOfMonth())); } // doPrev /** * Action doPreday is called when the user click on "Yesterday" link in day view */ public void doPreday(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); String currentstate = state.getState(); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); int stateYear = b.getYear(); int stateMonth = b.getMonth(); int stateDay = b.getDay(); if ((sstate.getAttribute(STATE_YEAR) != null) && (sstate.getAttribute(STATE_MONTH) != null) && (sstate.getAttribute(STATE_DAY) != null)) { stateYear = ((Integer)sstate.getAttribute(STATE_YEAR)).intValue(); stateMonth = ((Integer)sstate.getAttribute(STATE_MONTH)).intValue(); stateDay = ((Integer)sstate.getAttribute(STATE_DAY)).intValue(); } CalendarUtil m_calObj = new CalendarUtil(); //null; m_calObj.setDay(stateYear, stateMonth, stateDay); if (currentstate.equals("day")) { String date = m_calObj.getPrevDate(); sstate.setAttribute(STATE_YEAR, Integer.valueOf(m_calObj.getYear())); sstate.setAttribute(STATE_MONTH, Integer.valueOf(m_calObj.getMonthInteger())); sstate.setAttribute(STATE_DAY, Integer.valueOf(m_calObj.getDayOfMonth())); state.setprevDate(date); // if this function is called thru "Yesterday" link, it goes the last page of yesterday // the default page has to be changed to "third" state.setCurrentPage("third"); } } // doPreday /** * Enter the schedule import wizard */ public void doImport(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); sstate.removeAttribute(STATE_SCHEDULE_TO); sstate.removeAttribute(STATE_SCHEDULE_TO_GROUPS); // Remember the state prior to entering the wizard. state.setPrevState(state.getState()); // Enter wizard mode. state.setState(STATE_SCHEDULE_IMPORT); } // doImport /** * Action doIcalExportName acts on a "Export" request */ public void doIcalExportName(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); sstate.removeAttribute(STATE_SCHEDULE_TO); sstate.removeAttribute(STATE_SCHEDULE_TO_GROUPS); // store the state coming from String returnState = state.getState(); if ( ! returnState.equals("description") ) { state.setReturnState(returnState); } state.clearData(); state.setAttachments(null); state.setPrevState(state.getState()); state.setState("icalEx"); } // doIcalExportName /** * Action doIcalExport acts on a "Submit" request in the icalexport form */ public void doIcalExport(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); String enable = StringUtils.trimToNull(data.getParameters().getString(FORM_ICAL_ENABLE)); String alias = StringUtils.trimToNull(data.getParameters().getString(FORM_ALIAS)); // this will verify that no invalid characters are used if ( ! Validator.escapeResourceName(alias).equals(alias) ) { addAlert(sstate, rb.getString("java.alert.invalidname")); return; } String calId = state.getPrimaryCalendarReference(); Calendar calendarObj = null; boolean oldExportEnabled = CalendarService.getExportEnabled(calId); try { calendarObj = CalendarService.getCalendar(calId); List aliasList = AliasService.getAliases( calendarObj.getReference() ); String oldAlias = null; if ( ! aliasList.isEmpty() ) { String aliasSplit[] = ((Alias)aliasList.get(0)).getId().split("\\."); oldAlias = aliasSplit[0]; } // Add the desired alias (if changed) if ( alias != null && (oldAlias == null || !oldAlias.equals(alias)) ) { // first, clear any alias set to this calendar AliasService.removeTargetAliases(calendarObj.getReference()); alias += ".ics"; AliasService.setAlias(alias, calendarObj.getReference()); } } catch (IdUnusedException ie) { addAlert(sstate, rb.getString("java.alert.noexist")); M_log.debug(".doIcalExport() Other: " + ie); return; } catch (IdUsedException ue) { addAlert(sstate, rb.getString("java.alert.dupalias")); return; } catch (PermissionException pe) { addAlert(sstate, rb.getString("java.alert.youdont")); return; } catch (IdInvalidException e) { addAlert(sstate, rb.getString("java.alert.unknown")); M_log.debug(".doIcalExport() Other: " + e); return; } // enable/disable export (if changed) if ( enable != null && !oldExportEnabled ) CalendarService.setExportEnabled( calId, true ); else if ( enable == null && oldExportEnabled ) CalendarService.setExportEnabled( calId, false ); String returnState = state.getReturnState(); state.setState(returnState); } // doIcalExport public void doNew(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); //clean group awareness state info sstate.removeAttribute(STATE_SCHEDULE_TO); sstate.removeAttribute(STATE_SCHEDULE_TO_GROUPS); // store the state coming from String returnState = state.getState(); if ( ! returnState.equals("description") ) { state.setReturnState(returnState); } state.clearData(); state.setAttachments(null); state.setPrevState(state.getState()); state.setState("new"); state.setCalendarEventId("", ""); state.setIsNewCalendar(true); state.setIsPastAlertOff(true); sstate.setAttribute(FREQUENCY_SELECT, null); sstate.setAttribute(CalendarAction.SSTATE__RECURRING_RULE, null); } // doNew /** * Read user inputs in announcement form * @param data * @param checkForm need to check form data or not */ protected void readEventGroupForm(RunData rundata, Context context) { String peid = ((JetspeedRunData) rundata).getJs_peid(); SessionState state = ((JetspeedRunData) rundata).getPortletSessionState(peid); String scheduleTo = rundata.getParameters().getString("scheduleTo"); state.setAttribute(STATE_SCHEDULE_TO, scheduleTo); if (scheduleTo.equals("groups")) { String[] groupChoice = rundata.getParameters().getStrings("selectedGroups"); if (groupChoice != null) { state.setAttribute(STATE_SCHEDULE_TO_GROUPS, new ArrayList(Arrays.asList(groupChoice))); } if (groupChoice== null || groupChoice.length == 0) { state.removeAttribute(STATE_SCHEDULE_TO_GROUPS); } } else { state.removeAttribute(STATE_SCHEDULE_TO_GROUPS); } } // readEventGroupForm /** * Action doAdd is requested when the user click on the add in the new view to add an event into a calendar. */ public void doAdd(RunData runData, Context context) { CalendarUtil m_calObj = new CalendarUtil();// null; Calendar calendarObj = null; int houri; CalendarActionState state = (CalendarActionState)getState(context, runData, CalendarActionState.class); String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); int stateYear = b.getYear(); int stateMonth = b.getMonth(); int stateDay = b.getDay(); if ((sstate.getAttribute(STATE_YEAR) != null) && (sstate.getAttribute(STATE_MONTH) != null) && (sstate.getAttribute(STATE_DAY) != null)) { stateYear = ((Integer)sstate.getAttribute(STATE_YEAR)).intValue(); stateMonth = ((Integer)sstate.getAttribute(STATE_MONTH)).intValue(); stateDay = ((Integer)sstate.getAttribute(STATE_DAY)).intValue(); } m_calObj.setDay(stateYear, stateMonth, stateDay); String hour = ""; hour = runData.getParameters().getString("startHour"); String title =""; title = runData.getParameters().getString("activitytitle"); String minute = ""; minute = runData.getParameters().getString("startMinute"); String dhour = ""; dhour = runData.getParameters().getString("duHour"); String dminute = ""; dminute = runData.getParameters().getString("duMinute"); String description = ""; description = runData.getParameters().getString("description"); description = processFormattedTextFromBrowser(sstate, description); String month = ""; month = runData.getParameters().getString("month"); String day = ""; day = runData.getParameters().getString("day"); String year = ""; year = runData.getParameters().getString("yearSelect"); String timeType = ""; timeType = runData.getParameters().getString("startAmpm"); String type = ""; type = runData.getParameters().getString("eventType"); String location = ""; location = runData.getParameters().getString("location"); String calId = state.getPrimaryCalendarReference(); try { calendarObj = CalendarService.getCalendar(calId); } catch(IdUnusedException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.thereisno")); M_log.debug(".doAdd(): " + e); return; } catch (PermissionException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.youdont")); M_log.debug(".doAdd(): " + e); return; } // for section awareness - read user selection readEventGroupForm(runData, context); Map addfieldsMap = new HashMap(); // Add any additional fields in the calendar. customizeCalendarPage.loadAdditionalFieldsMapFromRunData(runData, addfieldsMap, calendarObj); if (timeType.equals("pm")) { if (Integer.parseInt(hour)>11) houri = Integer.parseInt(hour); else houri = Integer.parseInt(hour)+12; } else if (timeType.equals("am") && Integer.parseInt(hour)==12) { // set 12 AM as the beginning of one day houri = 0; } else { houri = Integer.parseInt(hour); } Time now_time = TimeService.newTime(); Time event_startTime = TimeService.newTimeLocal(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day), houri, Integer.parseInt(minute), 0, 0); // conditions for an new event: // 1st, frequency not touched, no save state rule or state freq (0, 0) // --> non-recurring, no alert needed (0) // 2st, frequency revised, there is a state-saved rule, and state-saved freq exists (1, 1) // --> no matter if the start has been modified, compare the ending and starting date, show alert if needed (1) // 3th, frequency revised, the state saved rule is null, but state-saved freq exists (0, 1) // --> non-recurring, no alert needed (0) // so the only possiblityto show the alert is under condistion 2. boolean earlierEnding = false; String freq = ""; if ((( freq = (String) sstate.getAttribute(FREQUENCY_SELECT))!= null) && (!(freq.equals(FREQ_ONCE)))) { RecurrenceRule rule = (RecurrenceRule) sstate.getAttribute(CalendarAction.SSTATE__RECURRING_RULE); if (rule != null) { Time startingTime = TimeService.newTimeLocal(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day),houri,Integer.parseInt(minute),00,000); Time endingTime = rule.getUntil(); if ((endingTime != null) && endingTime.before(startingTime)) earlierEnding = true; } // if (rule != null) } // if state saved freq is not null, and it not equals "once" String intentionStr = ""; // there is no recurrence modification intention for new event String scheduleTo = (String)sstate.getAttribute(STATE_SCHEDULE_TO); Collection groupChoice = (Collection) sstate.getAttribute(STATE_SCHEDULE_TO_GROUPS); if(title.length()==0) { String errorCode = rb.getString("java.pleasetitle"); addAlert(sstate, errorCode); state.setNewData(state.getPrimaryCalendarReference(), title,description,Integer.parseInt(month),Integer.parseInt(day),year,houri,Integer.parseInt(minute),Integer.parseInt(dhour),Integer.parseInt(dminute),type,timeType,location, addfieldsMap, intentionStr); state.setState("new"); } else if(hour.equals("100") || minute.equals("100")) { String errorCode = rb.getString("java.pleasetime"); addAlert(sstate, errorCode); state.setNewData(state.getPrimaryCalendarReference(), title,description,Integer.parseInt(month),Integer.parseInt(day),year,houri,Integer.parseInt(minute),Integer.parseInt(dhour),Integer.parseInt(dminute),type,timeType,location, addfieldsMap, intentionStr); state.setState("new"); } else if( earlierEnding ) // if ending date is earlier than the starting date, show alert { addAlert(sstate, rb.getString("java.theend") ); state.setNewData(calId, title,description,Integer.parseInt(month),Integer.parseInt(day),year,houri,Integer.parseInt(minute),Integer.parseInt(dhour),Integer.parseInt(dminute),type,timeType,location, addfieldsMap, intentionStr); state.setState("new"); } else if( event_startTime.before(now_time) && state.getIsPastAlertOff() ) { // IsPastAlertOff // true: no alert shown -> then show the alert, set false; // false: Alert shown, if user click ADD - doAdd again -> accept it, set true, set alert empty; String errorCode = rb.getString("java.alert.past"); addAlert(sstate, errorCode); state.setNewData(state.getPrimaryCalendarReference(), title,description,Integer.parseInt(month),Integer.parseInt(day),year,houri,Integer.parseInt(minute),Integer.parseInt(dhour),Integer.parseInt(dminute),type,timeType,location, addfieldsMap, intentionStr); state.setState("new"); state.setIsPastAlertOff(false); } else if (!Validator.checkDate(Integer.parseInt(day), Integer.parseInt(month), Integer.parseInt(year))) { addAlert(sstate, rb.getString("date.invalid")); state.setNewData(state.getPrimaryCalendarReference(), title,description,Integer.parseInt(month),Integer.parseInt(day),year,houri,Integer.parseInt(minute),Integer.parseInt(dhour),Integer.parseInt(dminute),type,timeType,location, addfieldsMap, intentionStr); state.setState("new"); } else if (scheduleTo.equals("groups") && ((groupChoice == null) || (groupChoice.size() == 0))) { state.setNewData(state.getPrimaryCalendarReference(), title,description,Integer.parseInt(month),Integer.parseInt(day),year,houri,Integer.parseInt(minute),Integer.parseInt(dhour),Integer.parseInt(dminute),type,timeType,location, addfieldsMap, intentionStr); state.setState("new"); addAlert(sstate, rb.getString("java.alert.youchoosegroup")); } else { try { calendarObj = CalendarService.getCalendar(calId); Time timeObj = TimeService.newTimeLocal(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day),houri,Integer.parseInt(minute),00,000); long du = (((Integer.parseInt(dhour) * 60)*60)*1000) + ((Integer.parseInt(dminute)*60)*(1000)); Time endTime = TimeService.newTime(timeObj.getTime() + du); boolean includeEndTime = false; if (du==0) { includeEndTime = true; } TimeRange range = TimeService.newTimeRange(timeObj, endTime, true, includeEndTime); List attachments = state.getAttachments(); // prepare to create the event Collection groups = new Vector(); CalendarEvent.EventAccess access = CalendarEvent.EventAccess.GROUPED; if (scheduleTo.equals("site")) access = CalendarEvent.EventAccess.SITE; if (access == CalendarEvent.EventAccess.GROUPED) { // make a collection of Group objects from the collection of group ref strings Site site = SiteService.getSite(calendarObj.getContext()); for (Iterator iGroups = groupChoice.iterator(); iGroups.hasNext();) { String groupRef = (String) iGroups.next(); groups.add(site.getGroup(groupRef)); } } // create the event = must create it with grouping / access to start with CalendarEvent event = calendarObj.addEvent(range, title, "", type, location, access, groups, attachments); // edit it further CalendarEventEdit edit = calendarObj.getEditEvent(event.getId(), org.sakaiproject.calendar.api.CalendarService.EVENT_ADD_CALENDAR); edit.setDescriptionFormatted(description); edit.setCreator(); String timeZone = TimeService.getLocalTimeZone().getID(); // we obtain the time zone where the event is created // and save it as an event's property // it is necessary to generate re-occurring events correctly edit.setField("createdInTimeZone",timeZone); setFields(edit, addfieldsMap); RecurrenceRule rule = (RecurrenceRule) sstate.getAttribute(CalendarAction.SSTATE__RECURRING_RULE); // for a brand new event, there is no saved recurring rule if (rule != null) edit.setRecurrenceRule(rule); else edit.setRecurrenceRule(null); // save it calendarObj.commitEvent(edit); state.setEdit(null); state.setIsNewCalendar(false); m_calObj.setDay(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day)); sstate.setAttribute(STATE_YEAR, Integer.valueOf(m_calObj.getYear())); sstate.setAttribute(STATE_MONTH, Integer.valueOf(m_calObj.getMonthInteger())); sstate.setAttribute(STATE_DAY, Integer.valueOf(m_calObj.getDayOfMonth())); // clear the saved recurring rule and the selected frequency sstate.setAttribute(CalendarAction.SSTATE__RECURRING_RULE, null); sstate.setAttribute(FREQUENCY_SELECT, null); // set the return state to be the state before new/revise String returnState = state.getReturnState(); if (returnState != null) { state.setState(returnState); } else { state.setState("week"); } // if going back to week/day view, we need to know which slot to go // -- the slot containing the starting time of the new added event if (state.getState().equals("week")||state.getState().equals("day")) { Time timeObj_p1 = TimeService.newTimeLocal(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day),FIRST_PAGE_START_HOUR,00,00,000); Time timeObj_p2 = TimeService.newTimeLocal(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day),SECOND_PAGE_START_HOUR,00,00,000); Time timeObj_p3 = TimeService.newTimeLocal(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day),THIRD_PAGE_START_HOUR,00,00,000); if (timeObj.after(timeObj_p2) && timeObj.before(timeObj_p3)) state.setCurrentPage("second"); else if (timeObj.before(timeObj_p2)) state.setCurrentPage("first"); else if (timeObj.after(timeObj_p3)) state.setCurrentPage("third"); } // clean state sstate.removeAttribute(STATE_SCHEDULE_TO); sstate.removeAttribute(STATE_SCHEDULE_TO_GROUPS); } catch (IdUnusedException e) { addAlert(sstate, rb.getString("java.alert.noexist")); M_log.debug(".doAdd(): " + e); } catch (PermissionException e) { addAlert(sstate, rb.getString("java.alert.youcreate")); M_log.debug(".doAdd(): " + e); } catch (InUseException e) { addAlert(sstate, rb.getString("java.alert.noexist")); M_log.debug(".doAdd(): " + e); } } // elseif } // doAdd /** * Action doUpdateGroupView is requested when the user click on the Update button on the list view. */ public void doUpdateGroupView(RunData runData, Context context) { readEventGroupForm(runData, context); //stay at the list view } /** * Action doUpdate is requested when the user click on the save button on the revise screen. */ public void doUpdate(RunData runData, Context context) { CalendarActionState state = (CalendarActionState)getState(context, runData, CalendarActionState.class); String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); CalendarUtil m_calObj= new CalendarUtil(); // read the intention field String intentionStr = runData.getParameters().getString("intention"); int intention = CalendarService.MOD_NA; if ("t".equals(intentionStr)) intention = CalendarService.MOD_THIS; // See if we're in the "options" state. if (state.getState().equalsIgnoreCase(STATE_MERGE_CALENDARS)) { mergedCalendarPage.doUpdate(runData, context, state, getSessionState(runData)); // ReturnState was set up above. Switch states now. String returnState = state.getReturnState(); if (returnState.endsWith("!!!fromDescription")) { state.setReturnState(returnState.substring(0, returnState.indexOf("!!!fromDescription"))); state.setState("description"); } else { state.setReturnState(""); state.setState(returnState); } } else if (state.getState().equalsIgnoreCase(STATE_CALENDAR_SUBSCRIPTIONS)) { calendarSubscriptionsPage.doUpdate(runData, context, state, getSessionState(runData)); // ReturnState was set up above. Switch states now. String returnState = state.getReturnState(); if (returnState.endsWith("!!!fromDescription")) { state.setReturnState(returnState.substring(0, returnState.indexOf("!!!fromDescription"))); state.setState("description"); } else { state.setReturnState(""); state.setState(returnState); } } else if (state.getState().equalsIgnoreCase(STATE_CUSTOMIZE_CALENDAR)) { customizeCalendarPage.doDeletefield( runData, context, state, getSessionState(runData)); customizeCalendarPage.doUpdate(runData, context, state, getSessionState(runData)); if (!state.getDelfieldAlertOff()) { state.setState(CalendarAction.STATE_CUSTOMIZE_CALENDAR); } else { // ReturnState was set up above. Switch states now. String returnState = state.getReturnState(); if (returnState.endsWith("!!!fromDescription")) { state.setReturnState(returnState.substring(0, returnState.indexOf("!!!fromDescription"))); state.setState("description"); } else { state.setReturnState(""); state.setState(returnState); } } // if (!state.getDelfieldAlertOff()) } else { int houri; Calendar calendarObj = null; String hour = ""; hour = runData.getParameters().getString("startHour"); String title = ""; title = runData.getParameters().getString("activitytitle"); String minute = ""; minute = runData.getParameters().getString("startMinute"); String dhour = ""; dhour = runData.getParameters().getString("duHour"); String dminute = ""; dminute = runData.getParameters().getString("duMinute"); String description = ""; description = runData.getParameters().getString("description"); description = processFormattedTextFromBrowser(sstate, description); String month = ""; month = runData.getParameters().getString("month"); String day = ""; day = runData.getParameters().getString("day"); String year = ""; year = runData.getParameters().getString("yearSelect"); String timeType = ""; timeType = runData.getParameters().getString("startAmpm"); String type = ""; type = runData.getParameters().getString("eventType"); String location = ""; location = runData.getParameters().getString("location"); String calId = state.getPrimaryCalendarReference(); try { calendarObj = CalendarService.getCalendar(calId); } catch (IdUnusedException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.theresisno")); M_log.debug(".doUpdate() Other: " + e); return; } catch (PermissionException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.youdont")); M_log.debug(".doUpdate() Other: " + e); return; } // for group/section awareness readEventGroupForm(runData, context); String scheduleTo = (String)sstate.getAttribute(STATE_SCHEDULE_TO); Collection groupChoice = (Collection) sstate.getAttribute(STATE_SCHEDULE_TO_GROUPS); Map addfieldsMap = new HashMap(); // Add any additional fields in the calendar. customizeCalendarPage.loadAdditionalFieldsMapFromRunData(runData, addfieldsMap, calendarObj); if (timeType.equals("pm")) { if (Integer.parseInt(hour)>11) houri = Integer.parseInt(hour); else houri = Integer.parseInt(hour)+12; } else if (timeType.equals("am") && Integer.parseInt(hour)==12) { houri = 0; } else { houri = Integer.parseInt(hour); } // conditions for an existing event: (if recurring event, if state-saved-rule exists, if state-saved-freq exists) // 1st, an existing recurring one, just revised without frequency change, no save state rule or state freq (1, 0, 0) // --> the starting time might has been modified, compare the ending and starting date, show alert if needed (1) // 2st, and existing non-recurring one, just revised, no save state rule or state freq (0, 0, 0) // --> non-recurring, no alert needed (0) // 3rd, an existing recurring one, frequency revised, there is a state-saved rule, and state-saved freq exists (1, 1, 1) // --> no matter if the start has been modified, compare the ending and starting date, show alert if needed (1) // 4th, an existing recurring one, changed to non-recurring, the state saved rule is null, but state-saved freq exists (1, 0, 1) // --> non-recurring, no alert needed (0) // 5th, an existing non-recurring one, changed but kept as non-recurring, the state-saved rule is null, but state-saved freq exists (1, 0, 1) // --> non-recurring, no alert needed (0) // 6th, an existing recurring one, changed only the starting time, showed alert for ealier ending time, // so the only possiblity to show the alert is under condistion 1 & 3: recurring one stays as recurring boolean earlierEnding = false; CalendarEventEdit edit = state.getPrimaryCalendarEdit(); if (edit != null) { RecurrenceRule editRule = edit.getRecurrenceRule(); if ( editRule != null) { String freq = (String) sstate.getAttribute(FREQUENCY_SELECT); RecurrenceRule rule = (RecurrenceRule) sstate.getAttribute(CalendarAction.SSTATE__RECURRING_RULE); boolean comparisonNeeded = false; if ((freq == null) && (rule == null)) { // condition 1: recurring without frequency touched, but the starting might change rule = editRule; comparisonNeeded = true; } else if ((freq != null) && (!(freq.equals(FREQ_ONCE)))) { // condition 3: recurring with frequency changed, and stays at recurring comparisonNeeded = true; } if (comparisonNeeded) // if under condition 1 or 3 { if (rule != null) { Time startingTime = TimeService.newTimeLocal(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day),houri,Integer.parseInt(minute),00,000); Time endingTime = rule.getUntil(); if ((endingTime != null) && endingTime.before(startingTime)) earlierEnding = true; } // if (editRule != null) } // if (comparisonNeeded) // if under condition 1 or 3 } // if (calEvent.getRecurrenceRule() != null) } // if (edit != null) if(title.length()==0) { String errorCode = rb.getString("java.pleasetitle"); addAlert(sstate, errorCode); state.setNewData(calId, title,description,Integer.parseInt(month),Integer.parseInt(day),year,houri,Integer.parseInt(minute),Integer.parseInt(dhour),Integer.parseInt(dminute),type,timeType,location, addfieldsMap, intentionStr); state.setState("revise"); } /* else if(hour.equals("0") && minute.equals("0")) { String errorCode = "Please enter a time"; addAlert(sstate, errorCode); state.setNewData(calId, title,description,Integer.parseInt(month),Integer.parseInt(day),year,houri,Integer.parseInt(minute),Integer.parseInt(dhour),Integer.parseInt(dminute),type,timeType,location, addfieldsMap); state.setState("revise"); } */ else if( earlierEnding ) // if ending date is earlier than the starting date, show alert { addAlert(sstate, rb.getString("java.theend") ); state.setNewData(calId, title,description,Integer.parseInt(month),Integer.parseInt(day),year,houri,Integer.parseInt(minute),Integer.parseInt(dhour),Integer.parseInt(dminute),type,timeType,location, addfieldsMap, intentionStr); state.setState("revise"); } else if (!Validator.checkDate(Integer.parseInt(day), Integer.parseInt(month), Integer.parseInt(year))) { addAlert(sstate, rb.getString("date.invalid")); state.setNewData(calId, title,description,Integer.parseInt(month),Integer.parseInt(day),year,houri,Integer.parseInt(minute),Integer.parseInt(dhour),Integer.parseInt(dminute),type,timeType,location, addfieldsMap, intentionStr); state.setState("revise"); } else if (scheduleTo.equals("groups") && ((groupChoice == null) || (groupChoice.size() == 0))) { state.setNewData(state.getPrimaryCalendarReference(), title,description,Integer.parseInt(month),Integer.parseInt(day),year,houri,Integer.parseInt(minute),Integer.parseInt(dhour),Integer.parseInt(dminute),type,timeType,location, addfieldsMap, intentionStr); state.setState("revise"); addAlert(sstate, rb.getString("java.alert.youchoosegroup")); } else { try { calendarObj = CalendarService.getCalendar(calId); Time timeObj = TimeService.newTimeLocal(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day),houri,Integer.parseInt(minute),00,000); long du = (((Integer.parseInt(dhour) * 60)*60)*1000) + ((Integer.parseInt(dminute)*60)*(1000)); Time endTime = TimeService.newTime(timeObj.getTime() + du); boolean includeEndTime = false; TimeRange range = null; if (du==0) { range = TimeService.newTimeRange(timeObj); } else { range = TimeService.newTimeRange(timeObj, endTime, true, includeEndTime); } List attachments = state.getAttachments(); if (edit != null) { edit.setRange(range); edit.setDescriptionFormatted(description); edit.setDisplayName(title); edit.setType(type); edit.setLocation(location); setFields(edit, addfieldsMap); edit.replaceAttachments(attachments); RecurrenceRule rule = (RecurrenceRule) sstate.getAttribute(CalendarAction.SSTATE__RECURRING_RULE); // conditions: // 1st, an existing recurring one, just revised, no save state rule or state freq (0, 0) // --> let edit rule untouched // 2st, and existing non-recurring one, just revised, no save state rule or state freq (0, 0) // --> let edit rule untouched // 3rd, an existing recurring one, frequency revised, there is a state-saved rule, and state-saved freq exists (1, 1) // --> replace the edit rule with state-saved rule // 4th, and existing recurring one, changed to non-recurring, the state saved rule is null, but state-saved freq exists (0, 1) // --> replace the edit rule with state-saved rule // 5th, and existing non-recurring one, changed but kept as non-recurring, the state-saved rule is null, but state-saved freq exists (0, 1) // --> replace the edit rule with state-saved rule // so if the state-saved freq exists, replace the event rule String freq = (String) sstate.getAttribute(FREQUENCY_SELECT); if (sstate.getAttribute(FREQUENCY_SELECT) != null) { edit.setRecurrenceRule(rule); } // section awareness try { // for site event if (scheduleTo.equals("site")) { edit.clearGroupAccess(); } // for grouped event else if (scheduleTo.equals("groups")) { Site site = SiteService.getSite(calendarObj.getContext()); // make a collection of Group objects from the collection of group ref strings Collection groups = new Vector(); for (Iterator iGroups = groupChoice.iterator(); iGroups.hasNext();) { String groupRef = (String) iGroups.next(); groups.add(site.getGroup(groupRef)); } edit.setGroupAccess(groups, edit.isUserOwner()); } } catch (Exception e) { M_log.warn("doUpdate", e); } calendarObj.commitEvent(edit, intention); state.setPrimaryCalendarEdit(null); state.setEdit(null); state.setIsNewCalendar(false); } // if (edit != null) m_calObj.setDay(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day)); sstate.setAttribute(STATE_YEAR, Integer.valueOf(m_calObj.getYear())); sstate.setAttribute(STATE_MONTH, Integer.valueOf(m_calObj.getMonthInteger())); sstate.setAttribute(STATE_DAY, Integer.valueOf(m_calObj.getDayOfMonth())); // clear the saved recurring rule and the selected frequency sstate.setAttribute(CalendarAction.SSTATE__RECURRING_RULE, null); sstate.setAttribute(FREQUENCY_SELECT, null); // set the return state as the one before new/revise String returnState = state.getReturnState(); if (returnState != null) { state.setState(returnState); } else { state.setState("week"); } // clean state sstate.removeAttribute(STATE_SCHEDULE_TO); sstate.removeAttribute(STATE_SCHEDULE_TO_GROUPS); } catch (IdUnusedException e) { addAlert(sstate, rb.getString("java.alert.noexist")); M_log.debug(".doUpdate(): " + e); } catch (PermissionException e) { addAlert(sstate, rb.getString("java.alert.youcreate")); M_log.debug(".doUpdate(): " + e); } // try-catch } // if(title.length()==0) } // if (state.getState().equalsIgnoreCase(STATE_CUSTOMIZE_CALENDAR)) } // doUpdate public void doDeletefield(RunData runData, Context context) { CalendarActionState state = (CalendarActionState)getState(context, runData, CalendarActionState.class); customizeCalendarPage.doDeletefield( runData, context, state, getSessionState(runData)); } /** * Handle the button click to add a field to the list of optional attributes. */ public void doAddfield(RunData runData, Context context) { CalendarActionState state = (CalendarActionState)getState(context, runData, CalendarActionState.class); customizeCalendarPage.doAddfield( runData, context, state, getSessionState(runData)); } public void doAddSubscription(RunData runData, Context context) { CalendarActionState state = (CalendarActionState)getState(context, runData, CalendarActionState.class); calendarSubscriptionsPage.doAddSubscription( runData, context, state, getSessionState(runData)); } /** * Action doNpagew is requested when the user click on the next arrow to move to the next page in the week view. */ public void doNpagew(RunData runData, Context context) { CalendarActionState state = (CalendarActionState)getState(context, runData, CalendarActionState.class); if(state.getCurrentPage().equals("third")) state.setCurrentPage("first"); else if(state.getCurrentPage().equals("second")) state.setCurrentPage("third"); else if(state.getCurrentPage().equals("first")) state.setCurrentPage("second"); state.setState("week"); } /** * Action doPpagew is requested when the user click on the previous arrow to move to the previous page in week view. */ public void doPpagew(RunData runData, Context context) { CalendarActionState state = (CalendarActionState)getState(context, runData, CalendarActionState.class); if(state.getCurrentPage().equals("first")) state.setCurrentPage("third"); else if (state.getCurrentPage().equals("third")) state.setCurrentPage("second"); else if (state.getCurrentPage().equals("second")) state.setCurrentPage("first"); state.setState("week"); } /** * Action doDpagen is requested when the user click on the next arrow to move to the next page in day view. */ public void doDpagen(RunData runData, Context context) { CalendarActionState state = (CalendarActionState)getState(context, runData, CalendarActionState.class); if(state.getCurrentPage().equals("third")) state.setCurrentPage("first"); else if(state.getCurrentPage().equals("second")) state.setCurrentPage("third"); else if(state.getCurrentPage().equals("first")) state.setCurrentPage("second"); state.setState("day"); } /** * Action doDpagep is requested when the user click on the upper arrow to move to the previous page in day view. */ public void doDpagep(RunData runData, Context context) { CalendarActionState state = (CalendarActionState)getState(context, runData, CalendarActionState.class); if(state.getCurrentPage().equals("first")) state.setCurrentPage("third"); else if (state.getCurrentPage().equals("third")) state.setCurrentPage("second"); else if (state.getCurrentPage().equals("second")) state.setCurrentPage("first"); state.setState("day"); } // doDpagep /** * Action doPrev_activity is requested when the user navigates to the previous message in the detailed view. */ public void doPrev_activity(RunData runData, Context context) { String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); sstate.setAttribute(STATE_NAV_DIRECTION, STATE_PREV_ACT); } //doPrev_activity /** * Action doNext_activity is requested when the user navigates to the previous message in the detailed view. */ public void doNext_activity(RunData runData, Context context) { String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); sstate.setAttribute(STATE_NAV_DIRECTION, STATE_NEXT_ACT); } // doNext_activity /* * detailNavigatorControl will handle the goNext/goPrev buttons in detailed view, * as well as figure out the prev/next message if available */ private void navigatorContextControl(VelocityPortlet portlet, Context context, RunData runData, String direction) { String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); CalendarActionState state = (CalendarActionState)getState(context, runData, CalendarActionState.class); String eventId = state.getCalendarEventId(); List events = prepEventList(portlet, context, runData); int index = -1; int size = events.size(); for (int i=0; i<size; i++) { CalendarEvent e = (CalendarEvent) events.get(i); if (e.getId().equals(eventId)) index = i; } // navigate to the previous activity if (STATE_PREV_ACT.equals(direction) && index > 0) { CalendarEvent ce = (CalendarEvent) events.get(--index); Reference ref = EntityManager.newReference(ce.getReference()); eventId = ref.getId(); String calId = null; if(CalendarService.REF_TYPE_EVENT_SUBSCRIPTION.equals(ref.getSubType())) calId = CalendarService.calendarSubscriptionReference(ref.getContext(), ref.getContainer()); else calId = CalendarService.calendarReference(ref.getContext(), ref.getContainer()); state.setCalendarEventId(calId, eventId); state.setAttachments(null); } // navigate to the next activity else if (STATE_NEXT_ACT.equals(direction) && index < size-1) { CalendarEvent ce = (CalendarEvent) events.get(++index); Reference ref = EntityManager.newReference(ce.getReference()); eventId = ref.getId(); String calId = null; if(CalendarService.REF_TYPE_EVENT_SUBSCRIPTION.equals(ref.getSubType())) calId = CalendarService.calendarSubscriptionReference(ref.getContext(), ref.getContainer()); else calId = CalendarService.calendarReference(ref.getContext(), ref.getContainer()); state.setCalendarEventId(calId, eventId); state.setAttachments(null); } if (index > 0) sstate.setAttribute(STATE_PREV_ACT, ""); else sstate.removeAttribute(STATE_PREV_ACT); if(index < size-1) sstate.setAttribute(STATE_NEXT_ACT, ""); else sstate.removeAttribute(STATE_NEXT_ACT); sstate.setAttribute(STATE_NAV_DIRECTION, STATE_CURRENT_ACT); } // navigatorControl private CalendarEventVector prepEventList(VelocityPortlet portlet, Context context, RunData runData) { String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); CalendarActionState state = (CalendarActionState)getState(context, runData, CalendarActionState.class); TimeRange fullTimeRange = TimeService.newTimeRange( TimeService.newTimeLocal( CalendarFilter.LIST_VIEW_STARTING_YEAR, 1, 1, 0, 0, 0, 0), TimeService.newTimeLocal( CalendarFilter.LIST_VIEW_ENDING_YEAR, 12, 31, 23, 59, 59, 999)); // We need to get events from all calendars for the full time range. CalendarEventVector masterEventVectorObj = CalendarService.getEvents( getCalendarReferenceList( portlet, state.getPrimaryCalendarReference(), isOnWorkspaceTab()), fullTimeRange); sstate.setAttribute(STATE_EVENTS_LIST, masterEventVectorObj); return masterEventVectorObj; } // eventList /** * Action is to parse the function calls **/ public void doParse(RunData data, Context context) { ParameterParser params = data.getParameters(); String source = params.getString("source"); if (source.equalsIgnoreCase("new")) { // create new event doNew(data, context); } else if (source.equalsIgnoreCase("revise")) { // revise an event doRevise(data, context); } else if (source.equalsIgnoreCase("delete")) { // delete event doDelete(data, context); } else if (source.equalsIgnoreCase("byday")) { // view by day doMenueday(data, context); } else if (source.equalsIgnoreCase("byweek")) { // view by week doWeek(data, context); } else if (source.equalsIgnoreCase("bymonth")) { // view by month doMonth(data, context); } else if (source.equalsIgnoreCase("byyear")) { // view by year doYear(data, context); } else if (source.equalsIgnoreCase("prev")) { // go previous doPrev(data, context); } else if (source.equalsIgnoreCase("next")) { // go next doNext(data, context); } else if (source.equalsIgnoreCase("bylist")) { // view by list doList(data, context); } } // doParse /** * Action doList is requested when the user click on the list in the toolbar */ public void doList(RunData data, Context context) { CalendarActionState state = (CalendarActionState)getState(context, data, CalendarActionState.class); String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); int stateYear = b.getYear(); int stateMonth = b.getMonth(); int stateDay = b.getDay(); if ((sstate.getAttribute(STATE_YEAR) != null) && (sstate.getAttribute(STATE_MONTH) != null) && (sstate.getAttribute(STATE_DAY) != null)) { stateYear = ((Integer)sstate.getAttribute(STATE_YEAR)).intValue(); stateMonth = ((Integer)sstate.getAttribute(STATE_MONTH)).intValue(); stateDay = ((Integer)sstate.getAttribute(STATE_DAY)).intValue(); } String sM; String eM; String sD; String eD; String sY; String eY; CalendarUtil calObj = new CalendarUtil(); calObj.setDay(stateYear, stateMonth, stateDay); String prevState = state.getState().toString(); if (prevState.equals("day")) { sY = Integer.valueOf(calObj.getYear()).toString(); sM = Integer.valueOf(calObj.getMonthInteger()).toString(); sD = Integer.valueOf(calObj.getDayOfMonth()).toString(); eY = Integer.valueOf(calObj.getYear()).toString(); eM = Integer.valueOf(calObj.getMonthInteger()).toString(); eD = Integer.valueOf(calObj.getDayOfMonth()).toString(); } else if (prevState.equals("week")) { int dayofweek = calObj.getDay_Of_Week(true); calObj.setPrevDate(dayofweek-1); sY = Integer.valueOf(calObj.getYear()).toString(); sM = Integer.valueOf(calObj.getMonthInteger()).toString(); sD = Integer.valueOf(calObj.getDayOfMonth()).toString(); for(int i = 0; i<6; i++) { calObj.getNextDate(); } eY = Integer.valueOf(calObj.getYear()).toString(); eM = Integer.valueOf(calObj.getMonthInteger()).toString(); eD = Integer.valueOf(calObj.getDayOfMonth()).toString(); } else if (prevState.equals("month")) { sY = Integer.valueOf(calObj.getYear()).toString(); sM = Integer.valueOf(calObj.getMonthInteger()).toString(); sD = String.valueOf("1"); calObj.setDay(stateYear, stateMonth, 1); GregorianCalendar cal = new GregorianCalendar(calObj.getYear(), calObj.getMonthInteger()-1, 1); int daysInMonth = cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH); for (int i=1; i<daysInMonth; i++) calObj.getNextDate(); eY = Integer.valueOf(calObj.getYear()).toString(); eM = Integer.valueOf(calObj.getMonthInteger()).toString(); eD = Integer.valueOf(calObj.getDayOfMonth()).toString(); } else { // for other conditions: show the current year sY = Integer.valueOf(stateYear).toString(); sM = "1"; sD = "1"; eY = Integer.valueOf(stateYear).toString(); eM = "12"; eD = "31"; } if (sM.length() == 1) sM = "0"+sM; if (eM.length() == 1) eM = "0"+eM; if (sD.length() == 1) sD = "0"+sD; if (eD.length() == 1) eD = "0"+eD; sY = sY.substring(2); eY = eY.substring(2); String startingDateStr = sM + "/" + sD + "/" + sY; String endingDateStr = eM + "/" + eD + "/" + eY; state.getCalendarFilter().setListViewFilterMode(CalendarFilter.SHOW_CUSTOM_RANGE); sstate.removeAttribute(STATE_SCHEDULE_TO); sstate.removeAttribute(STATE_SCHEDULE_TO_GROUPS); // Pass in a buffer for a possible error message. StringBuilder errorMessage = new StringBuilder(); // Try to simultaneously set the start/end dates. // If that doesn't work, add an error message. if ( !state.getCalendarFilter().setStartAndEndListViewDates(startingDateStr, endingDateStr, errorMessage) ) { addAlert(sstate, errorMessage.toString()); } state.setState("list"); } // doList /** * Action doSort_by_date_toggle is requested when the user click on the sorting icon in the list view */ public void doSort_by_date_toggle(RunData data, Context context) { String peid = ((JetspeedRunData)data).getJs_peid(); SessionState sstate = ((JetspeedRunData)data).getPortletSessionState(peid); boolean dateDsc = sstate.getAttribute(STATE_DATE_SORT_DSC) != null; if (dateDsc) sstate.removeAttribute(STATE_DATE_SORT_DSC); else sstate.setAttribute(STATE_DATE_SORT_DSC, ""); } // doSort_by_date_toggle /** * Handle a request from the "merge" page to merge calendars from other groups into this group's Schedule display. */ public void doMerge(RunData runData, Context context) { CalendarActionState state = (CalendarActionState)getState(context, runData, CalendarActionState.class); mergedCalendarPage.doMerge( runData, context, state, getSessionState(runData)); } // doMerge /** * Handle a request from the "subscriptions" page to subscribe calendars. */ public void doSubscriptions(RunData runData, Context context) { CalendarActionState state = (CalendarActionState)getState(context, runData, CalendarActionState.class); calendarSubscriptionsPage.doSubscriptions( runData, context, state, getSessionState(runData)); } // doMerge /** * Handle a request to set options. */ public void doCustomize(RunData runData, Context context) { CalendarActionState state = (CalendarActionState) getState(context, runData, CalendarActionState.class); customizeCalendarPage.doCustomize( runData, context, state, getSessionState(runData)); } /** * Build the context for showing list view */ protected void buildListContext(VelocityPortlet portlet, Context context, RunData runData, CalendarActionState state) { // to get the content Type Image Service context.put("contentTypeImageService", ContentTypeImageService.getInstance()); context.put("tlang",rb); context.put("config",configProps); MyMonth monthObj2 = null; MyDate dateObj1 = new MyDate(); CalendarEventVector calendarEventVectorObj = null; boolean allowed = false; LinkedHashMap yearMap = new LinkedHashMap(); // Initialize month format object if ( monthFormat == null ) { monthFormat = NumberFormat.getInstance(new ResourceLoader().getLocale()); monthFormat.setMinimumIntegerDigits(2); } String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); int stateYear = b.getYear(); int stateMonth = b.getMonth(); int stateDay = b.getDay(); if ((sstate.getAttribute(STATE_YEAR) != null) && (sstate.getAttribute(STATE_MONTH) != null) && (sstate.getAttribute(STATE_DAY) != null)) { stateYear = ((Integer)sstate.getAttribute(STATE_YEAR)).intValue(); stateMonth = ((Integer)sstate.getAttribute(STATE_MONTH)).intValue(); stateDay = ((Integer)sstate.getAttribute(STATE_DAY)).intValue(); } // Set up list filtering information in the context. context.put(TIME_FILTER_OPTION_VAR, state.getCalendarFilter().getListViewFilterMode()); // // Fill in the custom dates // String sDate; // starting date String eDate; // ending date java.util.Calendar userCal = java.util.Calendar.getInstance(); context.put("ddStartYear", Integer.valueOf(userCal.get(java.util.Calendar.YEAR) - 3)); context.put("ddEndYear", Integer.valueOf(userCal.get(java.util.Calendar.YEAR) + 4)); String sM; String eM; String sD; String eD; String sY; String eY; if (state.getCalendarFilter().isCustomListViewDates() ) { sDate = state.getCalendarFilter().getStartingListViewDateString(); eDate = state.getCalendarFilter().getEndingListViewDateString(); sM = sDate.substring(0, 2); eM = eDate.substring(0, 2); sD = sDate.substring(3, 5); eD = eDate.substring(3, 5); sY = "20" + sDate.substring(6); eY = "20" + eDate.substring(6); } else { //default to current week CalendarUtil calObj = new CalendarUtil(); calObj.setDay(stateYear, stateMonth, stateDay); TimeRange weekRange = getWeekTimeRange( calObj ); sD = String.valueOf( weekRange.firstTime().breakdownLocal().getDay() ); sY = String.valueOf( weekRange.firstTime().breakdownLocal().getYear() ); sM = monthFormat.format( weekRange.firstTime().breakdownLocal().getMonth() ); eD = String.valueOf( weekRange.lastTime().breakdownLocal().getDay() ); eY = String.valueOf( weekRange.lastTime().breakdownLocal().getYear() ); eM = monthFormat.format( weekRange.lastTime().breakdownLocal().getMonth() ); } context.put(TIME_FILTER_SETTING_CUSTOM_START_YEAR, Integer.valueOf(sY)); context.put(TIME_FILTER_SETTING_CUSTOM_END_YEAR, Integer.valueOf(eY)); context.put(TIME_FILTER_SETTING_CUSTOM_START_MONTH, Integer.valueOf(sM)); context.put(TIME_FILTER_SETTING_CUSTOM_END_MONTH, Integer.valueOf(eM)); context.put(TIME_FILTER_SETTING_CUSTOM_START_DAY, Integer.valueOf(sD)); context.put(TIME_FILTER_SETTING_CUSTOM_END_DAY, Integer.valueOf(eD)); CalendarUtil calObj= new CalendarUtil(); calObj.setDay(stateYear, stateMonth, stateDay); dateObj1.setTodayDate(calObj.getMonthInteger(),calObj.getDayOfMonth(),calObj.getYear()); // fill this month object with all days avilable for this month if (CalendarService.allowGetCalendar(state.getPrimaryCalendarReference())== false) { allowed = false; context.put(ALERT_MSG_KEY,rb.getString("java.alert.younotallow")); calendarEventVectorObj = new CalendarEventVector(); } else { try { allowed = CalendarService.getCalendar(state.getPrimaryCalendarReference()).allowAddEvent(); } catch(IdUnusedException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.therenoactv")); M_log.debug(".buildMonthContext(): " + e); } catch (PermissionException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.younotperm")); M_log.debug(".buildMonthContext(): " + e); } } int yearInt, monthInt, dayInt=1; TimeRange fullTimeRange = TimeService.newTimeRange( TimeService.newTimeLocal( CalendarFilter.LIST_VIEW_STARTING_YEAR, 1, 1, 0, 0, 0, 0), TimeService.newTimeLocal( CalendarFilter.LIST_VIEW_ENDING_YEAR, 12, 31, 23, 59, 59, 999)); // We need to get events from all calendars for the full time range. CalendarEventVector masterEventVectorObj = CalendarService.getEvents( getCalendarReferenceList( portlet, state.getPrimaryCalendarReference(), isOnWorkspaceTab()), fullTimeRange); // groups awareness - filtering String calId = state.getPrimaryCalendarReference(); String scheduleTo = (String)sstate.getAttribute(STATE_SCHEDULE_TO); try { Calendar calendarObj = CalendarService.getCalendar(calId); context.put("cal", calendarObj); if (scheduleTo != null && scheduleTo.length() != 0) { context.put("scheduleTo", scheduleTo); } else { if (calendarObj.allowGetEvents()) { // default to make site selection context.put("scheduleTo", "site"); } else if (calendarObj.getGroupsAllowGetEvent().size() > 0) { // to group otherwise context.put("scheduleTo", "groups"); } } Collection groups = calendarObj.getGroupsAllowGetEvent(); if (groups.size() > 0) { context.put("groups", groups); } List schToGroups = (List)(sstate.getAttribute(STATE_SCHEDULE_TO_GROUPS)); context.put("scheduleToGroups", schToGroups); CalendarEventVector newEventVectorObj = new CalendarEventVector(); newEventVectorObj.addAll(masterEventVectorObj); for (Iterator i = masterEventVectorObj.iterator(); i.hasNext();) { CalendarEvent e = (CalendarEvent)(i.next()); String origSiteId = (CalendarService.getCalendar(e.getCalendarReference())).getContext(); if (!origSiteId.equals(ToolManager.getCurrentPlacement().getContext())) { context.put("fromColExist", Boolean.TRUE); } if ((schToGroups != null) && (schToGroups.size()>0)) { boolean eventInGroup = false; for (Iterator j = schToGroups.iterator(); j.hasNext();) { String groupRangeForDisplay = e.getGroupRangeForDisplay(calendarObj); String groupId = j.next().toString(); Site site = SiteService.getSite(calendarObj.getContext()); Group group = site.getGroup(groupId); if (groupRangeForDisplay.equals("")||groupRangeForDisplay.equals("site")) eventInGroup = true; if (groupRangeForDisplay.indexOf(group.getTitle()) != -1) eventInGroup = true; } if ( ! eventInGroup ) newEventVectorObj.remove(e); } } if ((schToGroups != null) && (schToGroups.size()>0)) { masterEventVectorObj.clear(); masterEventVectorObj.addAll(newEventVectorObj); } } catch(IdUnusedException e) { M_log.debug(".buildListContext(): " + e); } catch (PermissionException e) { M_log.debug(".buildListContext(): " + e); } boolean dateDsc = sstate.getAttribute(STATE_DATE_SORT_DSC) != null; context.put("currentDateSortAsc", Boolean.valueOf(!dateDsc)); if (!dateDsc) { for (yearInt = CalendarFilter.LIST_VIEW_STARTING_YEAR; yearInt <= CalendarFilter.LIST_VIEW_ENDING_YEAR; yearInt++) { Vector arrayOfMonths = new Vector(20); for(monthInt = 1; monthInt <13; monthInt++) { CalendarUtil AcalObj = new CalendarUtil(); monthObj2 = new MyMonth(); AcalObj.setDay(yearInt, monthInt, dayInt); dateObj1.setTodayDate(AcalObj.getMonthInteger(),AcalObj.getDayOfMonth(),AcalObj.getYear()); // Get the events for the particular month from the // master list of events. calendarEventVectorObj = new CalendarEventVector( state.getCalendarFilter().filterEvents( masterEventVectorObj.getEvents( getMonthTimeRange((CalendarUtil) AcalObj)))); if (!calendarEventVectorObj.isEmpty()) { AcalObj.setDay(dateObj1.getYear(),dateObj1.getMonth(),dateObj1.getDay()); monthObj2 = calMonth(monthInt, (CalendarUtil)AcalObj, state, calendarEventVectorObj); AcalObj.setDay(dateObj1.getYear(),dateObj1.getMonth(),dateObj1.getDay()); if (!calendarEventVectorObj.isEmpty()) arrayOfMonths.addElement(monthObj2); } } if (!arrayOfMonths.isEmpty()) yearMap.put(Integer.valueOf(yearInt), arrayOfMonths.iterator()); } } else { for (yearInt = CalendarFilter.LIST_VIEW_ENDING_YEAR; yearInt >= CalendarFilter.LIST_VIEW_STARTING_YEAR; yearInt--) { Vector arrayOfMonths = new Vector(20); for(monthInt = 12; monthInt >=1; monthInt--) { CalendarUtil AcalObj = new CalendarUtil(); monthObj2 = new MyMonth(); AcalObj.setDay(yearInt, monthInt, dayInt); dateObj1.setTodayDate(AcalObj.getMonthInteger(),AcalObj.getDayOfMonth(),AcalObj.getYear()); // Get the events for the particular month from the // master list of events. calendarEventVectorObj = new CalendarEventVector( state.getCalendarFilter().filterEvents( masterEventVectorObj.getEvents( getMonthTimeRange((CalendarUtil) AcalObj)))); if (!calendarEventVectorObj.isEmpty()) { AcalObj.setDay(dateObj1.getYear(),dateObj1.getMonth(),dateObj1.getDay()); monthObj2 = calMonth(monthInt, (CalendarUtil)AcalObj, state, calendarEventVectorObj); AcalObj.setDay(dateObj1.getYear(),dateObj1.getMonth(),dateObj1.getDay()); if (!calendarEventVectorObj.isEmpty()) arrayOfMonths.addElement(monthObj2); } } if (!arrayOfMonths.isEmpty()) yearMap.put(Integer.valueOf(yearInt), arrayOfMonths.iterator()); } } context.put("yearMap", yearMap); int row = 5; context.put("row",Integer.valueOf(row)); calObj.setDay(stateYear, stateMonth, stateDay); // using session state stored year-month-day to replace saving calObj sstate.setAttribute(STATE_YEAR, Integer.valueOf(stateYear)); sstate.setAttribute(STATE_MONTH, Integer.valueOf(stateMonth)); sstate.setAttribute(STATE_DAY, Integer.valueOf(stateDay)); state.setState("list"); context.put("date",dateObj1); // output CalendarService and SiteService context.put("CalendarService", CalendarService.getInstance()); context.put("SiteService", SiteService.getInstance()); context.put("Context", ToolManager.getCurrentPlacement().getContext()); buildMenu( portlet, context, runData, state, CalendarPermissions.allowCreateEvents( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference()), CalendarPermissions.allowDeleteEvent( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference(), state.getCalendarEventId()), CalendarPermissions.allowReviseEvents( state.getPrimaryCalendarReference(), state.getSelectedCalendarReference(), state.getCalendarEventId()), CalendarPermissions.allowMergeCalendars( state.getPrimaryCalendarReference()), CalendarPermissions.allowModifyCalendarProperties( state.getPrimaryCalendarReference()), CalendarPermissions.allowImport( state.getPrimaryCalendarReference()), CalendarPermissions.allowSubscribe( state.getPrimaryCalendarReference())); // added by zqian for toolbar context.put("allow_new", Boolean.valueOf(allowed)); context.put("allow_delete", Boolean.valueOf(false)); context.put("allow_revise", Boolean.valueOf(false)); context.put("realDate", TimeService.newTime()); context.put("selectedView", rb.getString("java.listeve")); context.put("tlang",rb); context.put("config",configProps); context.put("calendarFormattedText", new CalendarFormattedText()); } // buildListContext private void buildPrintMenu( VelocityPortlet portlet, RunData runData, CalendarActionState state, Menu bar_print ) { String stateName = state.getState(); if (stateName.equals("month") || stateName.equals("day") || stateName.equals("week") || stateName.equals("list")) { int printType = CalendarService.UNKNOWN_VIEW; String timeRangeString = ""; TimeRange dailyStartTime = null; int startHour = 0, startMinute = 0; int endHour = 0, endMinute = 0; int endSeconds = 0, endMSeconds = 0; // // Depending what page we are on, there will be // a different time of the day on which we start. // if (state.getCurrentPage().equals("first")) { startHour = FIRST_PAGE_START_HOUR; endHour = startHour + NUMBER_HOURS_PER_PAGE_FOR_WEEK_VIEW; } else if (state.getCurrentPage().equals("second")) { startHour = SECOND_PAGE_START_HOUR; endHour = startHour + NUMBER_HOURS_PER_PAGE_FOR_WEEK_VIEW; } else if (state.getCurrentPage().equals("third")) { startHour = THIRD_PAGE_START_HOUR; endHour = startHour + NUMBER_HOURS_PER_PAGE_FOR_WEEK_VIEW; } else { startHour = 0; endHour = startHour + HOURS_PER_DAY; } // If we go over twenty-four hours, stop at the end of the day. if ( endHour >= HOURS_PER_DAY ) { endHour = 23; endMinute = 59; endSeconds = 59; endMSeconds = 999; } dailyStartTime = TimeService.newTimeRange( TimeService.newTimeLocal( state.getcurrentYear(), state.getcurrentMonth(), state.getcurrentDay(), startHour, startMinute, 00, 000), TimeService.newTimeLocal( state.getcurrentYear(), state.getcurrentMonth(), state.getcurrentDay(), endHour, endMinute, endSeconds, endMSeconds)); String peid = ((JetspeedRunData)runData).getJs_peid(); SessionState sstate = ((JetspeedRunData)runData).getPortletSessionState(peid); Time m_time = TimeService.newTime(); TimeBreakdown b = m_time.breakdownLocal(); int stateYear = b.getYear(); int stateMonth = b.getMonth(); int stateDay = b.getDay(); if ((sstate.getAttribute(STATE_YEAR) != null) && (sstate.getAttribute(STATE_MONTH) != null) && (sstate.getAttribute(STATE_DAY) != null)) { stateYear = ((Integer)sstate.getAttribute(STATE_YEAR)).intValue(); stateMonth = ((Integer)sstate.getAttribute(STATE_MONTH)).intValue(); stateDay = ((Integer)sstate.getAttribute(STATE_DAY)).intValue(); } CalendarUtil calObj = new CalendarUtil(); calObj.setDay(stateYear, stateMonth, stateDay); if (stateName.equals("month")) { printType = CalendarService.MONTH_VIEW; timeRangeString = getMonthTimeRange(calObj).toString(); } else if (stateName.equals("day")) { printType = CalendarService.DAY_VIEW; timeRangeString = getDayTimeRange( calObj.getYear(), calObj.getMonthInteger(), calObj.getDayOfMonth()) .toString(); } else if (stateName.equals("week")) { printType = CalendarService.WEEK_VIEW; timeRangeString = getWeekTimeRange(calObj).toString(); } else if (stateName.equals("list")) { printType = CalendarService.LIST_VIEW; timeRangeString = TimeService .newTimeRange( state.getCalendarFilter().getListViewStartingTime(), state.getCalendarFilter().getListViewEndingTime()) .toString(); } // set the actual list of calendars into the user's session: List calRefList = getCalendarReferenceList( portlet, state.getPrimaryCalendarReference(), isOnWorkspaceTab()); SessionManager.getCurrentSession().setAttribute(CalendarService.SESSION_CALENDAR_LIST,calRefList); Reference calendarRef = EntityManager.newReference(state.getPrimaryCalendarReference()); // Add PDF print menu option String accessPointUrl = ServerConfigurationService.getAccessUrl() + CalendarService.calendarPdfReference(calendarRef.getContext(), calendarRef.getId(), printType, timeRangeString, UserDirectoryService.getCurrentUser().getDisplayName(), dailyStartTime); bar_print.add(new MenuEntry(rb.getString("java.print"), "").setUrl(accessPointUrl)); } } /** * Build the menu. */ private void buildMenu( VelocityPortlet portlet, Context context, RunData runData, CalendarActionState state, boolean allow_new, boolean allow_delete, boolean allow_revise, boolean allow_merge_calendars, boolean allow_modify_calendar_properties, boolean allow_import_export, boolean allow_subscribe) { Menu bar = new MenuImpl(portlet, runData, "CalendarAction"); String status = state.getState(); if ((status.equals("day")) ||(status.equals("week")) ||(status.equals("month")) ||(status.equals("year")) ||(status.equals("list"))) { allow_revise = false; allow_delete = false; } bar.add( new MenuEntry(rb.getString("java.new"), null, allow_new, MenuItem.CHECKED_NA, "doNew") ); // // See if we are allowed to merge items. // bar.add( new MenuEntry(mergedCalendarPage.getButtonText(), null, allow_merge_calendars, MenuItem.CHECKED_NA, mergedCalendarPage.getButtonHandlerID()) ); // See if we are allowed to import items. if ( allow_import_export ) { bar.add( new MenuEntry(rb.getString("java.import"), null, allow_new, MenuItem.CHECKED_NA, "doImport") ); } // See if we are allowed to export items. String calId = state.getPrimaryCalendarReference(); if ( (allow_import_export || CalendarService.getExportEnabled(calId)) && ServerConfigurationService.getBoolean("ical.experimental",false)) { bar.add( new MenuEntry(rb.getString("java.export"), null, allow_new, MenuItem.CHECKED_NA, "doIcalExportName") ); } // See if we are allowed to configure external calendar subscriptions if ( allow_subscribe && ServerConfigurationService.getBoolean(ExternalCalendarSubscriptionService.SAK_PROP_EXTSUBSCRIPTIONS_ENABLED,false)) { bar.add( new MenuEntry(rb.getString("java.subscriptions"), null, allow_subscribe, MenuItem.CHECKED_NA, "doSubscriptions") ); } //2nd menu bar for the PDF print only Menu bar_print = new MenuImpl(portlet, runData, "CalendarAction"); buildPrintMenu( portlet, runData, state, bar_print ); if (SiteService.allowUpdateSite(ToolManager.getCurrentPlacement().getContext())) { bar_print.add( new MenuEntry(rb.getString("java.default_view"), "doDefaultview") ); } bar.add( new MenuEntry(customizeCalendarPage.getButtonText(), null, allow_modify_calendar_properties, MenuItem.CHECKED_NA, customizeCalendarPage.getButtonHandlerID()) ); // add permissions, if allowed //SAK-21684 don't show in myworkspace site unless super user. String currentSiteId = ToolManager.getCurrentPlacement().getContext(); if (SecurityService.isSuperUser() || (SiteService.allowUpdateSite(currentSiteId) && !SiteService.isUserSite(currentSiteId))) { bar.add( new MenuEntry(rb.getString("java.permissions"), "doPermissions") ); } // Set menu state attribute SessionState stateForMenus = ((JetspeedRunData)runData).getPortletSessionState(portlet.getID()); stateForMenus.setAttribute(MenuItem.STATE_MENU, bar); context.put("tlang",rb); context.put("config",configProps); context.put(Menu.CONTEXT_MENU, bar); context.put("menu_PDF", bar_print); context.put(Menu.CONTEXT_ACTION, "CalendarAction"); } // buildMenu /** * Align the edit's fields with these values. * @param edit The CalendarEventEdit. * @param values The map of name-value pairs. */ private void setFields(CalendarEventEdit edit, Map values) { Set<Entry<String, String>> keys = values.entrySet(); for (Iterator<Entry<String, String>> it = keys.iterator(); it.hasNext(); ) { Entry entry = it.next(); String name = (String)entry.getKey() ; String value = (String) entry.getValue(); edit.setField(name, value); } } // setFields /** Set current calendar view as tool default **/ public void doDefaultview( RunData rundata, Context context ) { CalendarActionState state = (CalendarActionState)getState(context, rundata, CalendarActionState.class); SessionState sstate = ((JetspeedRunData) rundata).getPortletSessionState(((JetspeedRunData) rundata).getJs_peid()); String view = state.getState(); Placement placement = ToolManager.getCurrentPlacement(); placement.getPlacementConfig().setProperty( PORTLET_CONFIG_DEFAULT_VIEW, view ); saveOptions(); addAlert(sstate, rb.getString("java.alert.default_view")); } /** * Fire up the permissions editor */ public void doPermissions(RunData data, Context context) { // get into helper mode with this helper tool startHelper(data.getRequest(), "sakai.permissions.helper"); // setup the parameters for the helper SessionState state = ((JetspeedRunData) data).getPortletSessionState(((JetspeedRunData) data).getJs_peid()); CalendarActionState cstate = (CalendarActionState) getState(context, data, CalendarActionState.class); String calendarRefStr = cstate.getPrimaryCalendarReference(); Reference calendarRef = EntityManager.newReference(calendarRefStr); String siteRef = SiteService.siteReference(calendarRef.getContext()); // setup for editing the permissions of the site for this tool, using the roles of this site, too state.setAttribute(PermissionsHelper.TARGET_REF, siteRef); // ... with this description state.setAttribute(PermissionsHelper.DESCRIPTION, rb.getString("java.set") + SiteService.getSiteDisplay(calendarRef.getContext())); // ... showing only locks that are prpefixed with this state.setAttribute(PermissionsHelper.PREFIX, "calendar."); // ... pass the resource loader object ResourceLoader pRb = new ResourceLoader("permissions"); HashMap<String, String> pRbValues = new HashMap<String, String>(); for (Iterator<Entry<String, String>> iKeys = pRb.entrySet().iterator();iKeys.hasNext();) { Entry entry = iKeys.next(); String key = (String)entry.getKey(); pRbValues.put(key, (String)entry.getValue()); } state.setAttribute("permissionDescriptions", pRbValues); String groupAware = ToolManager.getCurrentTool().getRegisteredConfig().getProperty("groupAware"); state.setAttribute("groupAware", groupAware != null?Boolean.valueOf(groupAware):Boolean.FALSE); state.removeAttribute("menu"); //Menu not required in the permission view } /** * Action doFrequency is requested when "set Frequency" button is clicked in new/revise page */ public void doEditfrequency(RunData rundata, Context context) { CalendarActionState state = (CalendarActionState)getState(context, rundata, CalendarActionState.class); String peid = ((JetspeedRunData)rundata).getJs_peid(); SessionState sstate = ((JetspeedRunData)rundata).getPortletSessionState(peid); String calId = ""; Calendar calendarObj = null; String eventId = state.getCalendarEventId(); try { calId = state.getPrimaryCalendarReference(); calendarObj = CalendarService.getCalendar(calId); String freq = (String) sstate.getAttribute(FREQUENCY_SELECT); // conditions when the doEditfrequency is called: // 1. new/existing event, in create-new/revise page first time: freq is null. // It has been set to null in both doNew & doRevise. // Make sure to re-set the freq in this step. // 2. new/existing event, back from cancel/save-frequency-setting page: freq is sth, because when // the first time doEditfrequency is called, there is a freq set up already // condition 1 - if ((freq == null)||(freq.equals(""))) { // if a new event if ((eventId == null)||(eventId.equals(""))) { // set the frequency to be default "once", rule to be null sstate.setAttribute(FREQUENCY_SELECT, DEFAULT_FREQ); sstate.setAttribute(CalendarAction.SSTATE__RECURRING_RULE, null); } else { // exiting event try { if(calendarObj.allowGetEvents()) { CalendarEvent event = calendarObj.getEvent(eventId); RecurrenceRule rule = event.getRecurrenceRule(); if (rule == null) { // not recurring, i.e., frequency is once sstate.setAttribute(FREQUENCY_SELECT, DEFAULT_FREQ); sstate.setAttribute(CalendarAction.SSTATE__RECURRING_RULE, null); } else { sstate.setAttribute(CalendarAction.SSTATE__RECURRING_RULE, rule); sstate.setAttribute(FREQUENCY_SELECT, rule.getFrequencyDescription()); } // if (rule==null) } // if allowGetEvents } // try catch(IdUnusedException e) { M_log.debug(".doEditfrequency() + calendarObj.getEvent(): " + e); } // try-cath } // if ((eventId == null)||(eventId.equals("")) } else { // condition 2, state freq is set, and state rule is set already } } // try catch(IdUnusedException e) { M_log.debug(".doEditfrequency() + CalendarService.getCalendar(): " + e); } catch (PermissionException e) { M_log.debug(".doEditfrequency() + CalendarService.getCalendar(): " + e); } int houri; String hour = ""; hour = rundata.getParameters().getString("startHour"); String title =""; title = rundata.getParameters().getString("activitytitle"); String minute = ""; minute = rundata.getParameters().getString("startMinute"); String dhour = ""; dhour = rundata.getParameters().getString("duHour"); String dminute = ""; dminute = rundata.getParameters().getString("duMinute"); String description = ""; description = rundata.getParameters().getString("description"); description = processFormattedTextFromBrowser(sstate, description); String month = ""; month = rundata.getParameters().getString("month"); String day = ""; day = rundata.getParameters().getString("day"); String year = ""; year = rundata.getParameters().getString("yearSelect"); String timeType = ""; timeType = rundata.getParameters().getString("startAmpm"); String type = ""; type = rundata.getParameters().getString("eventType"); String location = ""; location = rundata.getParameters().getString("location"); readEventGroupForm(rundata, context); // read the recurrence modification intention String intentionStr = rundata.getParameters().getString("intention"); if (intentionStr == null) intentionStr = ""; try { calendarObj = CalendarService.getCalendar(calId); Map addfieldsMap = new HashMap(); // Add any additional fields in the calendar. customizeCalendarPage.loadAdditionalFieldsMapFromRunData(rundata, addfieldsMap, calendarObj); if (timeType.equals("pm")) { if (Integer.parseInt(hour)>11) houri = Integer.parseInt(hour); else houri = Integer.parseInt(hour)+12; } else if (timeType.equals("am") && Integer.parseInt(hour)==12) { houri = 24; } else { houri = Integer.parseInt(hour); } state.clearData(); state.setNewData(state.getPrimaryCalendarReference(), title,description,Integer.parseInt(month),Integer.parseInt(day),year,houri,Integer.parseInt(minute),Integer.parseInt(dhour),Integer.parseInt(dminute),type,timeType,location, addfieldsMap, intentionStr); } catch(IdUnusedException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.thereis")); M_log.debug(".doEditfrequency(): " + e); } catch (PermissionException e) { context.put(ALERT_MSG_KEY,rb.getString("java.alert.youdont")); M_log.debug(".doEditfrequency(): " + e); } sstate.setAttribute(STATE_BEFORE_SET_RECURRENCE, state.getState()); state.setState(STATE_SET_FREQUENCY); } // doEditfrequency /** * Action doChangefrequency is requested when the user changes the selected frequency at the frequency setting page */ public void doChangefrequency(RunData rundata, Context context) { CalendarActionState state = (CalendarActionState)getState(context, rundata, CalendarActionState.class); String freqSelect = rundata.getParameters().getString(FREQUENCY_SELECT); String peid = ((JetspeedRunData)rundata).getJs_peid(); SessionState sstate = ((JetspeedRunData)rundata).getPortletSessionState(peid); sstate.setAttribute(FREQUENCY_SELECT, freqSelect); //TEMP_FREQ_SELECT only works for the onchange javascript function when user changes the frequency selection // and will be discarded when buildFrequecyContext has caught its value sstate.setAttribute(TEMP_FREQ_SELECT, freqSelect); state.setState(STATE_SET_FREQUENCY); } // doChangefrequency /** * Action doSavefrequency is requested when the user click on the "Save" button in the frequency setting page */ public void doSavefrequency(RunData rundata, Context context) { CalendarActionState state = (CalendarActionState)getState(context, rundata, CalendarActionState.class); String peid = ((JetspeedRunData)rundata).getJs_peid(); SessionState sstate = ((JetspeedRunData)rundata).getPortletSessionState(peid); String returnState = (String)sstate.getAttribute(STATE_BEFORE_SET_RECURRENCE); // if by any chance, the returnState is not available, // then reset it as either "new" or "revise". // For new event, the id is null or empty string if ((returnState == null)||(returnState.equals(""))) { String eventId = state.getCalendarEventId(); if ((eventId == null) || (eventId.equals(""))) returnState = "new"; else returnState = "revise"; } state.setState(returnState); // get the current frequency setting the user has selected - daily, weekly, or etc. String freq = (String) rundata.getParameters().getString(FREQUENCY_SELECT); if ((freq == null)||(freq.equals(FREQ_ONCE))) { sstate.setAttribute(CalendarAction.SSTATE__RECURRING_RULE, null); sstate.setAttribute(FREQUENCY_SELECT, FREQ_ONCE); } else { sstate.setAttribute(FREQUENCY_SELECT, freq); String interval = rundata.getParameters().getString("interval"); int intInterval = Integer.parseInt(interval); RecurrenceRule rule = null; String CountOrTill = rundata.getParameters().getString("CountOrTill"); if (CountOrTill.equals("Never")) { rule = CalendarService.newRecurrence(freq, intInterval); } else if (CountOrTill.equals("Till")) { String endMonth = rundata.getParameters().getString("endMonth"); String endDay = rundata.getParameters().getString("endDay"); String endYear = rundata.getParameters().getString("endYear"); int intEndMonth = Integer.parseInt(endMonth); int intEndDay = Integer.parseInt(endDay); int intEndYear = Integer.parseInt(endYear); //construct time object from individual ints, Local Time values Time endTime = TimeService.newTimeLocal(intEndYear, intEndMonth, intEndDay, 23, 59, 59, 999); rule = CalendarService.newRecurrence(freq, intInterval, endTime); } else if (CountOrTill.equals("Count")) { String count = rundata.getParameters().getString("count"); int intCount = Integer.parseInt(count); rule = CalendarService.newRecurrence(freq, intInterval, intCount); } sstate.setAttribute(CalendarAction.SSTATE__RECURRING_RULE, rule); } } // doSavefrequency /** * Populate the state object, if needed. */ protected void initState(SessionState state, VelocityPortlet portlet, JetspeedRunData rundata) { super.initState(state, portlet, rundata); if (contentHostingService == null) { contentHostingService = (ContentHostingService) ComponentManager.get("org.sakaiproject.content.api.ContentHostingService"); } if (entityBroker == null) { entityBroker = (EntityBroker) ComponentManager.get("org.sakaiproject.entitybroker.EntityBroker"); } // retrieve the state from state object CalendarActionState calState = (CalendarActionState)getState( portlet, rundata, CalendarActionState.class ); setPrimaryCalendarReferenceInState(portlet, calState); // setup the observer to notify our main panel if (state.getAttribute(STATE_INITED) == null) { state.setAttribute(STATE_INITED,STATE_INITED); // load all calendar channels (either primary or merged calendars) MergedList mergedCalendarList = loadChannels( calState.getPrimaryCalendarReference(), portlet.getPortletConfig().getInitParameter(PORTLET_CONFIG_PARM_MERGED_CALENDARS), null ); } // Initialize configuration properties InputStream inConfig = null; try { if ( configProps == null ) { configProps = new Properties(); inConfig = this.getClass().getResourceAsStream("calendar.config"); configProps.load(inConfig); } } catch ( IOException e ) { M_log.warn("unable to load calendar.config: " + e); } finally { if(inConfig != null) { try { inConfig.close(); } catch(IOException e1) { M_log.warn("I(O error occurred while closing 'inConfig' inputstream", e1); } } } } // initState /** * Takes an array of tokens and converts into separator-separated string. * * @param String[] The array of strings input. * @param String The string separator. * @return String A string containing tokens separated by seperator. */ protected String arrayToString(String[] array, String separators) { StringBuilder sb = new StringBuilder(""); String empty = ""; if (array == null) return empty; if (separators == null) separators = ","; for (int ix=0; ix < array.length; ix++) { if (array[ix] != null && !array[ix].equals("")) { sb.append(array[ix] + separators); } } String str = sb.toString(); if (!str.equals("")) { str = str.substring(0, (str.length() - separators.length())); } return str; } /** * Processes formatted text that is coming back from the browser * (from the formatted text editing widget). * @param state Used to pass in any user-visible alerts or errors when processing the text * @param strFromBrowser The string from the browser * @return The formatted text */ private String processFormattedTextFromBrowser(SessionState state, String strFromBrowser) { StringBuilder alertMsg = new StringBuilder(); try { String text = FormattedText.processFormattedText(strFromBrowser, alertMsg); if (alertMsg.length() > 0) addAlert(state, alertMsg.toString()); return text; } catch (Exception e) { M_log.warn(" ", e); return strFromBrowser; } } /** * Access the current month as a string. * @return the current month as a string. */ public String calendarUtilGetMonth(int l_month) { // get the index for the month. Note, the index is increased by 1, u need to deduct 1 first String[] months = new String [] { rb.getString("jan"),rb.getString("feb"),rb.getString("mar"), rb.getString("apr"), rb.getString("may"), rb.getString("jun"), rb.getString("jul"), rb.getString("aug"), rb.getString("sep"), rb.getString("oct"), rb.getString("nov"), rb.getString("dec") }; if (l_month >12) { return rb.getString("java.thismonth"); } return months[l_month-1]; } // getMonth /** * Get the name of the day. * @return the name of the day. */ private String calendarUtilGetDay(int dayofweek) { String[] l_ndays = new String[] {rb.getString("day.sunday"),rb.getString("day.monday"), rb.getString("day.tuesday"),rb.getString("day.wednesday"),rb.getString("day.thursday") ,rb.getString("day.friday"),rb.getString("day.saturday")}; if ( dayofweek > 7 ) { dayofweek = 1; } else if ( dayofweek <=0 ) { dayofweek = 7; } return l_ndays[dayofweek - 1]; } // calendarUtilGetDay } // CalendarAction