Java tutorial
/********************************************************************************** * $URL$ * $Id$ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.sakaiproject.announcement.tool; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Observable; import java.util.Properties; import java.util.Set; import java.util.Vector; import org.apache.commons.lang.StringUtils; import org.sakaiproject.announcement.api.AnnouncementMessageEdit; import org.sakaiproject.cheftool.ControllerState; import org.sakaiproject.entity.cover.EntityManager; import org.sakaiproject.site.api.Site; import org.sakaiproject.time.api.Time; import org.sakaiproject.tool.api.SessionBindingEvent; import org.sakaiproject.tool.api.SessionBindingListener; import org.sakaiproject.tool.api.Tool; import org.sakaiproject.tool.cover.ToolManager; import org.sakaiproject.util.ParameterParser; import org.sakaiproject.util.ResourceLoader; import org.sakaiproject.component.cover.ServerConfigurationService; /** * <p> * AnnouncementActionState is the state object for the AnnouncementAction tool. This object listens for changes on the announcement, and requests a UI delivery when changes occur. * </p> */ public class AnnouncementActionState extends ControllerState implements SessionBindingListener { /** Resource bundle using current language locale */ private static ResourceLoader rb = new ResourceLoader("announcement"); public static int DEFAULT_DISPLAY_NUMBER_OPTION = 100; public static int DEFAULT_DAYS_IN_PAST_OPTION = 30; /** * Holds the display options for the Announcements tool */ static public class DisplayOptions { private static final String varNameEnforceNumberOfCharsPerAnnouncementLimit = "limitNumberOfCharsPerAnnouncement"; private static final String varNameEnforceNumberOfAnnouncementsLimit = "limitNumberOfAnnouncements"; private static final String varNameEnforceNumberOfDaysInPastLimit = "limitNumberOfDaysInPast"; private static final String varNameShowAnnouncementBody = "showAnnouncementBody"; private static final String varNameShowAllColumns = "showAllColumns"; private static final String varNameNumberOfDaysInPast = "days"; private static final String varNameNumberOfAnnouncements = "items"; private static final String varNameNumberCharsPerAnnouncement = "length"; private static final String varNameShowOnlyOptionsButton = "showOnlyOptionsButton"; private static final String VarNameDisplaySelection = "displaySelection"; private static final String ANNOUNCEMENT_TOOL_ID = "sakai.announcements"; boolean showAllColumns = true; boolean showAnnouncementBody = false; int numberOfDaysInThePast = 365; boolean enforceNumberOfDaysInThePastLimit; int numberOfAnnouncements = DEFAULT_DISPLAY_NUMBER_OPTION; boolean enforceNumberOfAnnouncementsLimit; int numberOfCharsPerAnnouncement = Integer.MAX_VALUE; boolean enforceNumberOfCharsPerAnnouncement; boolean showOnlyOptionsButton = false; /** * Default constructor */ public DisplayOptions() { } /** * Gets the number of announcements that we will show (if the limit is enabled). */ public int getNumberOfAnnouncements() { return numberOfAnnouncements; } /** * Gets the number of characters that we will show in an announcement (if the limit is enabled). */ public int getNumberOfCharsPerAnnouncement() { return numberOfCharsPerAnnouncement; } /** * Gets the number of days in the past for which we will show announcments (if the limit is enabled). */ public int getNumberOfDaysInThePast() { return numberOfDaysInThePast; } /** * Gets whether or not we should show the announcement body. */ public boolean isShowAnnouncementBody() { return showAnnouncementBody; } /** * Gets whether or not we should show all the columns associated with the announcement. */ public boolean isShowAllColumns() { return showAllColumns; } /** * Sets the limit on the number of announcements to show (if the limit is enabled). */ public void setNumberOfAnnouncements(int i) { // Force the setting to be greater than or equal to zero since // a negative value doesn't make sense. numberOfAnnouncements = Math.max(i, 0); } /** * Sets the number of characters to show per announcement (if the limit is enabled). */ public void setNumberOfCharsPerAnnouncement(int i) { // Force the setting to be greater than or equal to zero since // a negative value doesn't make sense. numberOfCharsPerAnnouncement = Math.max(i, 0); } /** * Sets the number of days in the past for which we will show announcments (if the limit is enabled). */ public void setNumberOfDaysInThePast(int i) { // Force the setting to be greater than or equal to zero since // a negative value doesn't make sense. numberOfDaysInThePast = Math.max(i, 0); } /** * Sets whether or not we should show the announcement body. */ public void setShowAnnouncementBody(boolean b) { showAnnouncementBody = b; } /** * Sets whether or not we should show all the columns associated with the announcement. */ public void setShowAllColumns(boolean b) { showAllColumns = b; } /** * Returns true if we should limit the number of announcments shown. */ public boolean isEnforceNumberOfAnnouncementsLimit() { return enforceNumberOfAnnouncementsLimit; } /** * Returns true if we should limit the number of characters per announcement. */ public boolean isEnforceNumberOfCharsPerAnnouncement() { return enforceNumberOfCharsPerAnnouncement; } /** * Returns true if we should limit the announcements displayed based on the number of days in the past on which the occurred. */ public boolean isEnforceNumberOfDaysInThePastLimit() { return enforceNumberOfDaysInThePastLimit; } /** * Sets whether or not we should limit the number of announcements displayed. */ public void setEnforceNumberOfAnnouncementsLimit(boolean b) { enforceNumberOfAnnouncementsLimit = b; } /** * Sets whether or not we should limit the number of chars per announcement. */ public void setEnforceNumberOfCharsPerAnnouncement(boolean b) { enforceNumberOfCharsPerAnnouncement = b; } /** * Sets whether or not we shoud limit the announcements displayed based on the number of days in the past on which they occurred. */ public void setEnforceNumberOfDaysInThePastLimit(boolean b) { enforceNumberOfDaysInThePastLimit = b; } /** * Utility routine used to get an integer named value from a map or supply a default value if none is found. */ private int getIntegerParameter(Map<?, ?> params, String paramName, int defaultValue) { int value = defaultValue; String intValString = (String) params.get(paramName); if (StringUtils.trimToNull(intValString) != null) { try { value = Integer.parseInt(intValString); } catch (NumberFormatException e) { value = defaultValue; } } else { value = defaultValue; } return value; } /** * Utility routine used to get an boolean named value from a map or supply a default value if none is found. */ boolean getBooleanParameter(Map<?, ?> params, String paramName, boolean defaultValue) { String booleanValString = (String) params.get(paramName); if (StringUtils.trimToNull(booleanValString) != null) { return Boolean.valueOf(booleanValString).booleanValue(); } else { return defaultValue; } } /** * Loads properties from a map into our object. */ public void loadProperties(Map<?, ?> params) { setShowAllColumns(getBooleanParameter(params, varNameShowAllColumns, showAllColumns)); setShowAnnouncementBody(getBooleanParameter(params, varNameShowAnnouncementBody, showAnnouncementBody)); setShowOnlyOptionsButton( getBooleanParameter(params, varNameShowOnlyOptionsButton, showOnlyOptionsButton)); if (params.get(varNameNumberOfDaysInPast) != null) { setNumberOfDaysInThePast( getIntegerParameter(params, varNameNumberOfDaysInPast, numberOfDaysInThePast)); setEnforceNumberOfDaysInThePastLimit(true); } else { setEnforceNumberOfDaysInThePastLimit(false); } if (params.get(varNameNumberOfAnnouncements) != null) { setNumberOfAnnouncements( getIntegerParameter(params, varNameNumberOfAnnouncements, numberOfAnnouncements)); setEnforceNumberOfAnnouncementsLimit(true); } else { setEnforceNumberOfAnnouncementsLimit(false); } if (params.get(varNameNumberCharsPerAnnouncement) != null) { setNumberOfCharsPerAnnouncement(getIntegerParameter(params, varNameNumberCharsPerAnnouncement, numberOfCharsPerAnnouncement)); setEnforceNumberOfCharsPerAnnouncement(true); } else { setEnforceNumberOfCharsPerAnnouncement(false); } } /** * Loads properties from a ParameterParser object (usually gotten from a user's page submission). */ public void loadProperties(ParameterParser parameters) { Tool tool = ToolManager.getCurrentTool(); if (tool.getId().equals(ANNOUNCEMENT_TOOL_ID)) { String VarNameDisplaySelection = parameters.getString("VarNameDisplaySelection"); if (VarNameDisplaySelection.equals("sortable")) { setShowAllColumns(true); setShowAnnouncementBody(false); setNumberOfCharsPerAnnouncement(numberOfCharsPerAnnouncement); setEnforceNumberOfCharsPerAnnouncement(false); } else if (VarNameDisplaySelection.equals("sortableWithBody")) { setShowAllColumns(true); setShowAnnouncementBody(true); setNumberOfCharsPerAnnouncement(numberOfCharsPerAnnouncement); setEnforceNumberOfCharsPerAnnouncement(false); } else if (VarNameDisplaySelection.equals("list")) { setShowAllColumns(false); setShowAnnouncementBody(true); String varNameNumberChars = parameters.getString("changeChars"); if (varNameNumberChars.equals(rb.getString("custom.shofir"))) { setNumberOfCharsPerAnnouncement(53); setEnforceNumberOfCharsPerAnnouncement(true); } else if (varNameNumberChars.equals(rb.getString("custom.shofirtwo"))) { setNumberOfCharsPerAnnouncement(103); setEnforceNumberOfCharsPerAnnouncement(true); } else if (varNameNumberChars.equals(rb.getString("custom.shoall"))) { setNumberOfCharsPerAnnouncement(numberOfCharsPerAnnouncement); setEnforceNumberOfCharsPerAnnouncement(false); } } } else { setShowAllColumns(parameters.getBoolean(varNameShowAllColumns)); setShowAnnouncementBody(parameters.getBoolean(varNameShowAnnouncementBody)); String varNameNumberChars = parameters.getString("changeChars"); if (varNameNumberChars.equals(rb.getString("custom.shofir"))) { setNumberOfCharsPerAnnouncement(53); setEnforceNumberOfCharsPerAnnouncement(true); } else if (varNameNumberChars.equals(rb.getString("custom.shofirtwo"))) { setNumberOfCharsPerAnnouncement(103); setEnforceNumberOfCharsPerAnnouncement(true); } else if (varNameNumberChars.equals(rb.getString("custom.shoall"))) { setNumberOfCharsPerAnnouncement(numberOfCharsPerAnnouncement); setEnforceNumberOfCharsPerAnnouncement(false); } } // if this parameter has been defined, use its value to replace the current setting // otherwise, leave alone the current setting if (parameters.get(varNameShowOnlyOptionsButton) != null) { setShowOnlyOptionsButton(parameters.getBoolean(varNameShowOnlyOptionsButton)); } setNumberOfDaysInThePast(parameters.getInt(varNameNumberOfDaysInPast, DEFAULT_DAYS_IN_PAST_OPTION)); setEnforceNumberOfDaysInThePastLimit( StringUtils.trimToNull(parameters.get(varNameNumberOfDaysInPast)) != null); setNumberOfAnnouncements( parameters.getInt(varNameNumberOfAnnouncements, DEFAULT_DISPLAY_NUMBER_OPTION)); setEnforceNumberOfAnnouncementsLimit( StringUtils.trimToNull(parameters.get(varNameNumberOfAnnouncements)) != null); // setNumberOfCharsPerAnnouncement(parameters.getInt(varNameNumberCharsPerAnnouncement, numberOfCharsPerAnnouncement)); // setEnforceNumberOfCharsPerAnnouncement(StringUtils.trimToNull(parameters.get(varNameNumberCharsPerAnnouncement)) != null); } /** * Saves the properties in this object to a ResourcePropertiesEdit object. */ public void saveProperties(Properties resEdit) { resEdit.setProperty(varNameShowAllColumns, Boolean.toString(showAllColumns)); resEdit.setProperty(varNameShowAnnouncementBody, Boolean.toString(showAnnouncementBody)); resEdit.setProperty(varNameShowOnlyOptionsButton, Boolean.toString(showOnlyOptionsButton)); if (isEnforceNumberOfDaysInThePastLimit()) { resEdit.setProperty(varNameNumberOfDaysInPast, Integer.toString(numberOfDaysInThePast)); } else { // Since the absence of a property means that there are no limits, remove the // property from the resEdit object, in case it is already present. resEdit.remove(varNameNumberOfDaysInPast); } if (this.isEnforceNumberOfAnnouncementsLimit()) { resEdit.setProperty(varNameNumberOfAnnouncements, Integer.toString(numberOfAnnouncements)); } else { // Since the absence of a property means that there are no limits, remove the // property from the resEdit object, in case it is already present. resEdit.remove(varNameNumberOfAnnouncements); } if (this.isEnforceNumberOfCharsPerAnnouncement()) { resEdit.setProperty(varNameNumberCharsPerAnnouncement, Integer.toString(numberOfCharsPerAnnouncement)); } else { // Since the absence of a property means that there are no limits, remove the // property from the resEdit object, in case it is already present. resEdit.remove(varNameNumberCharsPerAnnouncement); } } /** * Gets a variable name for use in Velocity scripts to name input fields, etc. */ public static String getVarNameEnforceNumberOfAnnouncementsLimit() { return varNameEnforceNumberOfAnnouncementsLimit; } /** * Gets a variable name for use in Velocity scripts to name input fields, etc. */ public static String getVarNameEnforceNumberOfDaysInPastLimit() { return varNameEnforceNumberOfDaysInPastLimit; } /** * Gets a variable name for use in Velocity scripts to name input fields, etc. */ public static String getVarNameNumberCharsPerAnnouncement() { return varNameNumberCharsPerAnnouncement; } /** * Gets a variable name for use in Velocity scripts to name input fields, etc. */ public static String getVarNameNumberOfAnnouncements() { return varNameNumberOfAnnouncements; } /** * Gets a variable name for use in Velocity scripts to name input fields, etc. */ public static String getVarNameEnforceNumberOfCharsPerAnnouncementLimit() { return varNameEnforceNumberOfCharsPerAnnouncementLimit; } /** * Gets a variable name for use in Velocity scripts to name input fields, etc. */ public static String getVarNameNumberOfDaysInPast() { return varNameNumberOfDaysInPast; } /** * Gets a variable name for use in Velocity scripts to name input fields, etc. */ public static String getVarNameShowAllColumns() { return varNameShowAllColumns; } /** * Gets a variable name for use in Velocity scripts to name input fields, etc. */ public static String getVarNameShowAnnouncementBody() { return varNameShowAnnouncementBody; } public boolean isShowOnlyOptionsButton() { return showOnlyOptionsButton; } public void setShowOnlyOptionsButton(boolean b) { showOnlyOptionsButton = b; } } /** Creates new AnnouncementActionState */ public AnnouncementActionState() { init(); } // constructor /** * Release any resources and restore the object to initial conditions to be reused. */ public void recycle() { super.recycle(); } // recycle /** * Init to startup values */ protected void init() { super.init(); } // init private Site m_editSite; // the announcement channel id private String m_channelId = null; // the announecement message id // private String m_messageId = null; // the announecement message reference private String m_messageReference = null; // parameter for announcement status: true - new created; false - already existing private boolean m_isNewAnn = true; // the template index: the main list screen - true; other screen - false private boolean m_isListVM = true; // the list of messages to be deleted private Vector m_delete_messages = new Vector(); // collection ID // private String m_collectionId = null; // vm status private String m_status = null; // temporary attachment list - never set to null! private List m_attachments = EntityManager.newReferenceList(); // temporary selected attachment list private Vector m_selectedAttachments = new Vector(); // temporary added attachments private Vector m_moreAttachments = new Vector(); // temporary attachments only for attachment editing private Vector m_tempAttachments = new Vector(); // temporary moreAttachments only for attachment editing private Vector m_tempMoreAttachments = new Vector(); // temporary storage for new announcement subject private String m_tempSubject; // temporary storage for new announcement body private String m_tempBody; // temporary storage for new announcement release date private Time m_releaseDate = null; // temporary storage for new announcement retract date private Time m_retractDate = null; // temporary storage for announcement hidden private Boolean m_hidden = null; // temporary storage for announce to selection private String m_tempAnnounceTo; // temporary storage for announce to groups selection private Collection m_tempAnnounceToGroups; // temporary storage for local file inputStream, contentType and display name private HashMap m_fileProperties = new HashMap(); // temporary storage for attachment properties: title, description, and copyright private HashMap m_attachProperties = new HashMap(); // storage for home collection Id private String m_homeCollectionId; // storage for home Collection Display ame private String m_homeCollectionDisplayName; // ********* for sorting ********* // the current sorted by property name private String m_currentSortedBy = "message_order"; // the current sort sequence: ture - acscending/false - descending private boolean m_currentSortAsc = false; // ********* for sorting ********* private DisplayOptions m_displayOptions; /** * Get */ public String getTempSubject() { return m_tempSubject; } // getTempSubject() /** * Get */ public String getTempBody() { return m_tempBody; } // getTempBody() /** * Get */ public String getTempAnnounceTo() { return m_tempAnnounceTo; } // getTempAnnounceTo() /** * set */ public void setTempAnnounceTo(String tempAnnounceTo) { // if there's a change if (tempAnnounceTo == null || !tempAnnounceTo.equals(m_tempAnnounceTo)) { // remember the new m_tempAnnounceTo = tempAnnounceTo; } } // setTempAnnounceTo() /** * Get */ public Collection getTempAnnounceToGroups() { return m_tempAnnounceToGroups; } // getTempAnnounceToGroups() /** * set */ public void setTempAnnounceToGroups(Collection tempAnnounceToGroups) { m_tempAnnounceToGroups = tempAnnounceToGroups; } // setTempAnnounceTo() /** * Get */ public void setTempSubject(String tempSubject) { // if there's a change if (!tempSubject.equals(m_tempSubject)) { // remember the new m_tempSubject = tempSubject; } } // setTempSubject() /** * Get */ public void setTempBody(String tempBody) { if (!tempBody.equals(m_tempBody)) { // remember the new m_tempBody = tempBody; } } // setTempBody() public void setTempReleaseDate(Time tempDate) { if (tempDate != m_releaseDate) { //remember the new m_releaseDate = tempDate; } } // setTempReleaseDate() public Time getTempReleaseDate() { return m_releaseDate; } // getTempReleaseDate() public void setTempRetractDate(Time tempDate) { if (tempDate != m_retractDate) { // remember the new m_retractDate = tempDate; } } // setTempRetractDate() public Time getTempRetractDate() { return m_retractDate; } // getTempRetractDate() public Boolean getTempHidden() { return m_hidden; } public void setTempHidden(Boolean hidden) { if (hidden != m_hidden) { m_hidden = hidden; } } /** * Get the channel id of current state * * @return The current channel id */ public String getChannelId() { return m_channelId; } // getChannelId /** * Set the chat channel id to listen to. * * @param channel * The chat channel id to listen to. */ public void setChannelId(String channelId) { // if there's a change if (!channelId.equals(m_channelId)) { // remember the new m_channelId = channelId; } } // setChannelId // /** // * Get the collectionId of current state // * @return The current collectionId // */ // public String getCollectionId() // { // return m_collectionId; // // } // getCollectionId // // // /** // * Set the chat collectionId to listen to. // * @param collectionId The collectionId. // */ // public void setCollectionId(String collectionId) // { // // if there's a change // if (collectionId != m_collectionId) // { // // remember the new // m_collectionId = collectionId; // } // // } // setCollectionId /** * Get the the file properties for uploading * * @return The current collectionId */ public Vector getFileProperties(String key) { Set m_filePropertiesSet = m_fileProperties.entrySet(); Iterator i = m_filePropertiesSet.iterator(); while (i.hasNext()) { Map.Entry me = (Map.Entry) i.next(); if ((me.getKey()).equals(key)) return (Vector) me.getValue(); } return null; } // getFileProperties /** * Set the fileProperties * * @param key * The key for map class, which is the absolute local path of file * @param properties * The Vector which stores the inputStream, contentType, fileName of the file in order */ public void setFileProperties(String key, Vector properties) { m_fileProperties.put(key, properties); } // setFileProperties /** * Get the attachment properties * * @return The property based on the given key */ public Vector getAttachProperties(String key) { Set m_attachPropertiesSet = m_attachProperties.entrySet(); Iterator i = m_attachPropertiesSet.iterator(); while (i.hasNext()) { Map.Entry me = (Map.Entry) i.next(); if ((me.getKey()).equals(key)) return (Vector) me.getValue(); } return null; } // getAttachProperties /** * Set the attachProperties * * @param key * The key for map class, which is the absolute local path of file * @param properties * The Vector which stores the attachment properties: title, description, and copyright in order */ public void setAttachProperties(String key, Vector properties) { m_attachProperties.put(key, properties); } // setAttachProperties /** * Get the status of preview: true - view new created; false - view revised existed * * @return The current status */ public boolean getIsNewAnnouncement() { return m_isNewAnn; } // gsetIsNewAnnouncement /** * Set the status of preview: true - view new created; false - view revised existed * * @param preview_status * The status of preview: true - view new created; false - view revised existed */ public void setIsNewAnnouncement(boolean isNewAnn) { // if there's a change if (isNewAnn != m_isNewAnn) { // remember the new m_isNewAnn = isNewAnn; } } // setIsNewAnnouncement /** * Get the current vm: true - in main list view; false - in other view * * @return The boolean to show whether in main list view */ public boolean getIsListVM() { return m_isListVM; } // getIsListVM /** * Set the current vm: true - in main list view; false - in other view * * @param m_isListVM: * true - in main list view; false - in other view */ public void setIsListVM(boolean isListVM) { m_isListVM = isListVM; } // setIsListVM /** * Get */ public Vector getDelete_messages() { return m_delete_messages; } // getDelete_messages /** * Set */ public void setDeleteMessages(Vector delete_messages) { // if there's a change if (delete_messages != null) { m_delete_messages = (Vector) delete_messages.clone(); } else { m_delete_messages = null; } // remember the new } // setDelete_messages private AnnouncementMessageEdit m_edit; /** * Get edit The edit object */ public void setEdit(AnnouncementMessageEdit edit) { m_edit = edit; } /** * Get edit object * * @return m_edit The edit object */ public AnnouncementMessageEdit getEdit() { return m_edit; } /** * Get */ public List getAttachments() { return m_attachments; } // getAttachment /** * Set */ public void setAttachments(List attachments) { if (attachments != null) { m_attachments = EntityManager.newReferenceList(attachments); } else { m_attachments.clear(); } // remember the new } // setAttachments /** * Get */ public Vector getSelectedAttachments() { return m_selectedAttachments; } // getSelectedAttachment /** * Set */ public void setSelectedAttachments(Vector selectedAttachments) { // if there's a change if (selectedAttachments != null) { m_selectedAttachments = (Vector) selectedAttachments.clone(); } else { m_selectedAttachments = null; } // remember the new } // setSelectedAttachments /** * Get */ public Vector getMoreAttachments() { return m_moreAttachments; } // getMoreAttachment /** * Set */ public void setMoreAttachments(Vector moreAttachments) { // if there's a change if (moreAttachments != null) { m_moreAttachments = (Vector) moreAttachments.clone(); } else { m_moreAttachments = null; } // remember the new } // setMoreAttachments /** * Get */ public Vector getTempAttachments() { return m_tempAttachments; } // getTempAttachments /** * Set */ public void setTempAttachments(Vector tempAttachments) { // if there's a change if (tempAttachments != null) { m_tempAttachments = (Vector) tempAttachments.clone(); } else { m_tempAttachments = null; } // remember the new } // setTempAttachments /** * Get */ public Vector getTempMoreAttachments() { return m_tempMoreAttachments; } // getTempMoreAttachments() /** * Set */ public void setTempMoreAttachments(Vector tempMoreAttachments) { // if there's a change if (tempMoreAttachments != null) { m_tempMoreAttachments = (Vector) tempMoreAttachments.clone(); } else { m_tempMoreAttachments = null; } // remember the new } // setTempMoreAttachments() /********************************************************************************************************************************************************************************************************************************************************** * Observer implementation *********************************************************************************************************************************************************************************************************************************************************/ /** * This method is called whenever the observed object is changed. An application calls an <tt>Observable</tt> object's <code>notifyObservers</code> method to have all the object's observers notified of the change. default implementation is to * cause the courier service to deliver to the interface controlled by my controller. Extensions can override. * * @param o * the observable object. * @param arg * an argument passed to the <code>notifyObservers</code> method. */ public void update(Observable o, Object arg) { // // deliver to the control panel of the portlet // CourierService.deliver(getSetId(), getId()/* %%%, ChatListAction.CONTROL_PANEL */); } /** * Get the status to be * * @return The status to be */ public String getStatus() { return m_status; } /** * Set the status to be * * @param status * The status to be */ public void setStatus(String status) { if (status != null) { // if there's a change if (!status.equals(m_status)) { // remember the new m_status = status; } } } // ********* for sorting ********* /** * set the current sorted by property name * * @param name * The sorted by property name */ protected void setCurrentSortedBy(String name) { m_currentSortedBy = name; } // setCurrentSortedBy /** * get the current sorted by property name * * @return "true" if the property is sorted ascendingly; "false" if the property is sorted descendingly */ protected String getCurrentSortedBy() { return m_currentSortedBy; } // getSortCurrentSortedBy /** * set the current sort property * * @param asc * "true" if the property is sorted ascendingly; "false" if the property is sorted descendingly */ protected void setCurrentSortAsc(boolean asc) { m_currentSortAsc = asc; } // setCurrentSortAsc /** * get the current sort property * * @return "true" if the property is sorted ascendingly; "false" if the property is sorted descendingly */ protected boolean getCurrentSortAsc() { return m_currentSortAsc; } // getCurrentSortAsc // ********* for sorting ********* /** * Returns the currently selected message reference. */ public String getMessageReference() { return m_messageReference; } /** * Sets the currently selected message reference. */ public void setMessageReference(String string) { m_messageReference = string; } public Site getEditSite() { return m_editSite; } public void setEditSite(Site site) { m_editSite = site; } public DisplayOptions getDisplayOptions() { return m_displayOptions; } public void setDisplayOptions(DisplayOptions options) { m_displayOptions = options; } /********************************************************************************************************************************************************************************************************************************************************** * SessionBindingListener implementation *********************************************************************************************************************************************************************************************************************************************************/ public void valueBound(SessionBindingEvent event) { } public void valueUnbound(SessionBindingEvent event) { // pass it on to my edits if ((m_editSite != null) && (m_editSite instanceof SessionBindingListener)) { ((SessionBindingListener) m_editSite).valueUnbound(event); } if ((m_edit != null) && (m_edit instanceof SessionBindingListener)) { ((SessionBindingListener) m_edit).valueUnbound(event); } } }