/**
* $URL: https://source.sakaiproject.org/svn/sitestats/trunk/sitestats-impl/src/java/org/sakaiproject/sitestats/impl/event/EntityBrokerEventRegistry.java $
* $Id: EntityBrokerEventRegistry.java 105078 2012-02-24 23:00:38Z ottenhoff@longsight.com $
*
* Copyright (c) 2006-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.sitestats.impl.event;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Observable;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.entity.api.ResourceProperties;
import org.sakaiproject.entitybroker.entityprovider.EntityProviderManager;
import org.sakaiproject.entitybroker.entityprovider.capabilities.Statisticable;
import org.sakaiproject.entitybroker.entityprovider.extension.EntityProviderListener;
import org.sakaiproject.memory.api.Cache;
import org.sakaiproject.memory.api.MemoryService;
import org.sakaiproject.sitestats.api.event.EventInfo;
import org.sakaiproject.sitestats.api.event.EventRegistry;
import org.sakaiproject.sitestats.api.event.EventRegistryService;
import org.sakaiproject.sitestats.api.event.ToolInfo;
import org.sakaiproject.tool.api.SessionManager;
import org.sakaiproject.user.api.Preferences;
import org.sakaiproject.user.api.PreferencesService;
import org.sakaiproject.util.ResourceLoader;
public class EntityBrokerEventRegistry extends Observable implements EventRegistry, EntityProviderListener<Statisticable> {
private static Log LOG = LogFactory.getLog(EntityBrokerEventRegistry.class);
private static final String CACHENAME = EntityBrokerEventRegistry.class.getName();
/** Event Registry members */
private List<ToolInfo> eventRegistry = new ArrayList<ToolInfo>();
private Map<String, String> eventIdToEPPrefix = new HashMap<String, String>();
/** Caching */
private Cache eventNamesCache = null;
/** Sakai Services */
private SessionManager M_sm;
private PreferencesService M_ps;
private EntityProviderManager M_epm;
private MemoryService M_ms;
// ################################################################
// Spring methods
// ################################################################
public void setSessionManager(SessionManager sessionManager) {
this.M_sm = sessionManager;
}
public void setPreferencesService(PreferencesService preferencesService) {
this.M_ps = preferencesService;
}
public void setEntityProviderManager(EntityProviderManager entityProviderManager) {
this.M_epm = entityProviderManager;
}
public void setMemoryService(MemoryService memoryService) {
this.M_ms = memoryService;
}
public void init() {
LOG.info("init()");
// configure cache
eventNamesCache = M_ms.newCache(CACHENAME);
// register EntityBrokerListener
M_epm.registerListener(this, true);
}
// ################################################################
// Event Registry methods
// ################################################################
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.event.EventRegistry#getEventRegistry()
*/
public List<ToolInfo> getEventRegistry() {
LOG.debug("getEventRegistry(): #tools implementing Statisticable = "+eventRegistry.size());
return eventRegistry;
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.event.EventRegistry#isEventRegistryExpired()
*/
public boolean isEventRegistryExpired() {
return hasChanged();
}
/* (non-Javadoc)
* @see org.sakaiproject.sitestats.api.event.EventRegistry#getEventName(java.lang.String)
*/
public String getEventName(String eventId) {
Locale currentUserLocale = getCurrentUserLocale();
EventLocaleKey key = new EventLocaleKey(eventId, currentUserLocale.toString());
if(eventNamesCache.containsKey(key)) {
return (String) eventNamesCache.get(key);
}else{
String eventName = null;
try{
eventNamesCache.holdEvents();
String prefix = eventIdToEPPrefix.get(eventId);
Statisticable s = M_epm.getProviderByPrefixAndCapability(prefix, Statisticable.class);
Map<String, String> eventIdNamesMap = s.getEventNames(currentUserLocale);
if(eventIdNamesMap != null) {
for(String thisEventId : eventIdNamesMap.keySet()) {
EventLocaleKey thisCacheKey = new EventLocaleKey(thisEventId, currentUserLocale.toString());
String thisEventName = eventIdNamesMap.get(thisEventId);
eventNamesCache.put(thisCacheKey, thisEventName);
if(thisEventId.equals(eventId)) {
eventName = thisEventName;
}
}
LOG.debug("Cached event names for EB prefix '"+prefix+"', locale: "+currentUserLocale);
}
}catch(Exception e) {
eventName = null;
}finally{
eventNamesCache.processEvents();
}
return eventName;
}
}
// ################################################################
// EntityProviderListener methods
// ################################################################
public Class<Statisticable> getCapabilityFilter() {
return Statisticable.class;
}
public String getPrefixFilter() {
return null;
}
public void run(Statisticable provider) {
LOG.info("Statisticable capability registered with prefix: " + provider.getEntityPrefix());
processStatisticableProvider(provider);
}
private void processStatisticableProvider(Statisticable provider) {
String entityPrefix = provider.getEntityPrefix();
String entityToolId = provider.getAssociatedToolId();
String[] entityEventIds = provider.getEventKeys();
// Build tool for Event Registry (List<ToolInfo>)
ToolInfo tool = new ToolInfo(entityToolId);
tool.setSelected(true);
for(String eventId : entityEventIds) {
EventInfo event = new EventInfo(eventId);
event.setSelected(true);
// Add to eventID -> entityProfider_prefix mapping
eventIdToEPPrefix.put(eventId, entityPrefix);
tool.addEvent(event);
}
eventRegistry.add(tool);
// Set expired flag on EventRegistry to true
setChanged();
notifyObservers(EventRegistryService.NOTIF_EVENT_REGISTRY_EXPIRED);
}
// ################################################################
// Utility Methods
// ################################################################
/**
* Return current user locale.
* @return user's Locale object
*/
private Locale getCurrentUserLocale() {
Locale loc = null;
try{
// check if locale is requested for specific user
String userId = M_sm.getCurrentSessionUserId();
if(userId != null){
Preferences prefs = M_ps.getPreferences(userId);
ResourceProperties locProps = prefs.getProperties(ResourceLoader.APPLICATION_ID);
String localeString = locProps.getProperty(ResourceLoader.LOCALE_KEY);
// Parse user locale preference if set
if(localeString != null){
String[] locValues = localeString.split("_");
if(locValues.length > 1)
// language, country
loc = new Locale(locValues[0], locValues[1]);
else if(locValues.length == 1)
// language
loc = new Locale(locValues[0]);
}
if(loc == null)
loc = Locale.getDefault();
}else{
loc = (Locale) M_sm.getCurrentSession().getAttribute(ResourceLoader.LOCALE_KEY + M_sm.getCurrentSessionUserId());
}
}catch(NullPointerException e){
loc = Locale.getDefault();
}
return loc;
}
// ################################################################
// Utility Classes
// ################################################################
public static class EventLocaleKey {
String eventId = "";
String locale = "";
public EventLocaleKey(String eventId, String locale) {
this.eventId = eventId;
this.locale = locale;
}
public String getEventId() {
return eventId;
}
public void setEventId(String eventId) {
this.eventId = eventId;
}
public String getLocale() {
return locale;
}
public void setLocale(String locale) {
this.locale = locale;
}
@Override
public String toString() {
StringBuilder buff = new StringBuilder();
buff.append("[");
buff.append(getEventId());
buff.append(", ");
buff.append(getLocale());
buff.append("]");
return buff.toString();
}
@Override
public int hashCode() {
return getEventId().hashCode() + getLocale().hashCode();
}
@Override
public boolean equals(Object obj) {
if(obj == null || !(obj instanceof EventLocaleKey)) {
return false;
}
EventLocaleKey o = (EventLocaleKey) obj;
if(o.getEventId().equals(getEventId())
&& o.getLocale().equals(o.getLocale())) {
return true;
}
return false;
}
}
}