/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/presence/trunk/presence-tool/tool/src/java/org/sakaiproject/presence/tool/PresenceToolAction.java $
* $Id: PresenceToolAction.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.presence.tool;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.sakaiproject.authz.cover.SecurityService;
import org.sakaiproject.cheftool.Context;
import org.sakaiproject.cheftool.JetspeedRunData;
import org.sakaiproject.cheftool.RunData;
import org.sakaiproject.cheftool.VelocityPortlet;
import org.sakaiproject.cheftool.VelocityPortletPaneledAction;
import org.sakaiproject.cheftool.api.Menu;
import org.sakaiproject.cheftool.menu.MenuDivider;
import org.sakaiproject.cheftool.menu.MenuEntry;
import org.sakaiproject.cheftool.menu.MenuImpl;
import org.sakaiproject.event.api.SessionState;
import org.sakaiproject.event.api.UsageSession;
import org.sakaiproject.event.cover.UsageSessionService;
import org.sakaiproject.presence.cover.PresenceService;
import org.sakaiproject.tool.api.Placement;
import org.sakaiproject.tool.cover.ToolManager;
import org.sakaiproject.util.PresenceObservingCourier;
import org.sakaiproject.util.ResourceLoader;
/**
* <p>
* PresenceToolAction is the presence display tool showing everyone everywhere.
* </p>
*/
public class PresenceToolAction extends VelocityPortletPaneledAction
{
private static final long serialVersionUID = 1L;
/** Resource bundle using current language locale */
private static ResourceLoader rb = new ResourceLoader("admin");
/** The display modes. */
protected static final String STATE_DISPLAY_MODE = "display_mode";
protected static final String MODE_LOCATIONS = "locations";
protected static final String MODE_SESSIONS = "sessions";
protected static final String MODE_SERVERS = "servers";
/**
* Populate the state object, if needed.
*/
protected void initState(SessionState state, VelocityPortlet portlet, JetspeedRunData rundata)
{
super.initState(state, portlet, rundata);
// setup the observer to notify our main panel
if (state.getAttribute(STATE_OBSERVER) == null)
{
// get the current tool placement
Placement placement = ToolManager.getCurrentPlacement();
// location is just placement
String location = placement.getId();
// setup the observer to watch for all presence, disabled so we start in manual mode
PresenceObservingCourier courier = new PresenceObservingCourier(location);
courier.setResourcePattern(null);
courier.disable();
state.setAttribute(STATE_OBSERVER, courier);
// init the display mode
state.setAttribute(STATE_DISPLAY_MODE, MODE_SERVERS);
}
} // initState
/**
* build the context for the Main (List) panel
*
* @return (optional) template name for this panel
*/
@SuppressWarnings("unchecked")
public String buildMainPanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state)
{
context.put("tlang", rb);
// if not logged in as the super user, we won't do anything
if (!SecurityService.isSuperUser())
{
return (String) getContext(rundata).get("template") + "_noaccess";
}
String template = (String) getContext(rundata).get("template");
if (!SecurityService.isSuperUser())
{
addAlert(state, rb.getString("presence.import"));
return template;
}
// inform the observing courier that we just updated the page...
// if there are pending requests to do so they can be cleared
PresenceObservingCourier observer = (PresenceObservingCourier) state.getAttribute(STATE_OBSERVER);
observer.justDelivered();
// build the menu
Menu bar = new MenuImpl();
bar.add(new MenuEntry(rb.getString("presence.locations"), "doLocations"));
bar.add(new MenuEntry(rb.getString("presence.sessions"), "doSessions"));
bar.add(new MenuEntry(rb.getString("presence.servers"), "doServers"));
bar.add(new MenuDivider());
bar.add(new MenuEntry((observer.getEnabled() ? rb.getString("presence.manualref") : rb.getString("presence.autoref")),
"doAuto"));
if (!observer.getEnabled())
{
bar.add(new MenuEntry(rb.getString("presence.ref"), "doRefresh"));
}
context.put(Menu.CONTEXT_MENU, bar);
// for locations list mode
if (MODE_LOCATIONS.equals(state.getAttribute(STATE_DISPLAY_MODE)))
{
template += "-List";
// get the list of all presence locations
List<String> locations = PresenceService.getLocations();
context.put("locations", locations);
context.put("service", PresenceService.getInstance());
}
// for sessions display mode
else if (MODE_SESSIONS.equals(state.getAttribute(STATE_DISPLAY_MODE)))
{
template += ".sessions-List";
// get sessions by server (keys are already sorted by server)
Map<String,List<UsageSession>> sessionsByServer = UsageSessionService.getOpenSessionsByServer();
context.put("servers", sessionsByServer);
List<String> serverList = new Vector<String>();
serverList.addAll(sessionsByServer.keySet());
context.put("serverList", serverList);
int count = 0;
for (List<UsageSession> sessions : sessionsByServer.values())
{
count += sessions.size();
}
context.put("total", Integer.valueOf(count));
}
// for servers display mode
else if (MODE_SERVERS.equals(state.getAttribute(STATE_DISPLAY_MODE)))
{
template += ".servers-List";
// get the set of all servers with current presence
Map<String,List<UsageSession>> servers = UsageSessionService.getOpenSessionsByServer();
context.put("servers", servers);
List<String> serverList = new Vector<String>();
serverList.addAll(servers.keySet());
Collections.sort(serverList);
context.put("serverList", serverList);
int count = 0;
for (List<UsageSession> sessions : servers.values())
{
count += sessions.size();
}
context.put("total", Integer.valueOf(count));
}
// the url for the online courier, using a 30 second refresh
setVmCourier(rundata.getRequest(), 30);
return template;
} // buildMainPanelContext
/**
* Switch to locations mode
*/
public void doLocations(RunData data, Context context)
{
// access the portlet element id to find our state
String peid = ((JetspeedRunData) data).getJs_peid();
SessionState state = ((JetspeedRunData) data).getPortletSessionState(peid);
// go to remove confirm mode
state.setAttribute(STATE_DISPLAY_MODE, MODE_LOCATIONS);
} // doLocations
/**
* Switch to sessions mode
*/
public void doSessions(RunData data, Context context)
{
// access the portlet element id to find our state
String peid = ((JetspeedRunData) data).getJs_peid();
SessionState state = ((JetspeedRunData) data).getPortletSessionState(peid);
// go to remove confirm mode
state.setAttribute(STATE_DISPLAY_MODE, MODE_SESSIONS);
} // doSessions
/**
* Switch to servers mode
*/
public void doServers(RunData data, Context context)
{
// access the portlet element id to find our state
String peid = ((JetspeedRunData) data).getJs_peid();
SessionState state = ((JetspeedRunData) data).getPortletSessionState(peid);
// go to remove confirm mode
state.setAttribute(STATE_DISPLAY_MODE, MODE_SERVERS);
} // doServers
/**
* Toggle auto-update
*/
public void doAuto(RunData data, Context context)
{
// access the portlet element id to find our state
String peid = ((JetspeedRunData) data).getJs_peid();
SessionState state = ((JetspeedRunData) data).getPortletSessionState(peid);
// get the observer
PresenceObservingCourier observer = (PresenceObservingCourier) state.getAttribute(STATE_OBSERVER);
boolean enabled = observer.getEnabled();
if (enabled)
{
observer.disable();
}
else
{
observer.enable();
}
} // doAuto
/**
* The action for when the user want's an update
*/
public void doRefresh(RunData data, Context context)
{
} // doRefresh
} // PresenceToolAction