/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/presence/trunk/presence-util/util/src/java/org/sakaiproject/util/PresenceObservingCourier.java $
* $Id: PresenceObservingCourier.java 105079 2012-02-24 23:08:11Z ottenhoff@longsight.com $
***********************************************************************************
*
* Copyright (c) 2003, 2004, 2005, 2006, 2008 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package org.sakaiproject.util;
import java.util.Observable;
import org.sakaiproject.event.api.Event;
import org.sakaiproject.presence.cover.PresenceService;
import org.sakaiproject.component.cover.ServerConfigurationService;
/**
* <p>
* PresenceObservingCourier is an EventObservingCourier which watches for only presence service events at a particular location, and delivers a direct refresh delivery.
* </p>
*/
public class PresenceObservingCourier extends EventObservingCourier
{
/**
* This variant, watches presense changes at the specified location, and sends the notifications to
* that same location. The elementID is null so the main window is refreshed when the notification
* is received.
*
* @param location
* The location under observation *and* the location for the delivery of the events.
*/
public PresenceObservingCourier(String location)
{
super(location, null, PresenceService.presenceReference(location));
}
/**
* This variant watches changes in a window and sends change notifications to the same window.
* In the case where there are multiple iframes in the tool, elementID sends notification to
* the frame specified by elementId.
*
* @param location
* The location under observation *and* the location for the delivery of the events.
* @param elementId
* The html element to refresh. If this is null the main window is refreshed.
*/
public PresenceObservingCourier(String location, String elementId)
{
super(location, elementId, PresenceService.presenceReference(location));
}
/**
* This variant watches changes in one window (watchLocation) and sends the notifications to a different
* window (location)..
*
* @param location
* The location which will receive the notifications.
* @param elementId
* The html element to refresh. If this is null, the main window is refreshed.
* @param watchLocation
* The location being observed.
*/
public PresenceObservingCourier(String location, String elementId, String watchLocation)
{
super(location, elementId, PresenceService.presenceReference(watchLocation));
}
/**
* Check to see if we want to process or ignore this update.
*
* @param arg
* The arg from the update.
* @return true to continue, false to quit.
*/
public boolean check(Object arg)
{
// arg is Event
if (!(arg instanceof Event)) return false;
Event event = (Event) arg;
String key = event.getResource();
// reject non presence events
String function = event.getEvent();
if (!(function.equals(PresenceService.EVENT_PRESENCE) || function.equals(PresenceService.EVENT_ABSENCE))) return false;
// look for matches to the pattern
if (m_resourcePattern != null)
{
if (!key.equals(m_resourcePattern)) return false;
}
return true;
}
/**
* 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)
{
// ignore changes when not enabled
if (!getEnabled())
{
return;
}
if (!check(arg)) return;
boolean inFrame = ServerConfigurationService.getBoolean("display.users.present.iframe", false);
if ( inFrame )
{
if (m_elementId == null)
{
m_courierService.deliver(new DirectRefreshDelivery(getDeliveryId()));
}
else
{
m_courierService.deliver(new DirectRefreshDelivery(getDeliveryId(), m_elementId));
}
}
else
{
String updatePresence = "try { updatePresence(); } catch(err) { }";
m_courierService.deliver(new TestDelivery(getDeliveryId(), m_elementId, updatePresence));
}
}
}