/**********************************************************************************
* $URL:https://source.sakaiproject.org/svn/osp/trunk/common/api-impl/src/java/org/theospi/portfolio/worksite/mgt/impl/SiteEventListener.java $
* $Id:SiteEventListener.java 9134 2006-05-08 20:28:42Z chmaurer@iupui.edu $
***********************************************************************************
*
* Copyright (c) 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.osedu.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.theospi.portfolio.worksite.mgt.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.component.api.ComponentManager;
import org.sakaiproject.entity.api.EntityManager;
import org.sakaiproject.entity.api.Reference;
import org.sakaiproject.event.api.Event;
import org.sakaiproject.event.cover.EventTrackingService;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.site.api.Site;
import org.sakaiproject.site.api.SitePage;
import org.sakaiproject.site.api.ToolConfiguration;
import org.sakaiproject.site.cover.SiteService;
import org.sakaiproject.tool.api.Tool;
import org.sakaiproject.tool.cover.ToolManager;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.theospi.portfolio.shared.model.OspException;
import org.theospi.portfolio.worksite.intf.ToolEventListener;
import org.theospi.portfolio.worksite.model.SiteTool;
import java.util.*;
public class SiteEventListener extends HibernateDaoSupport implements Observer {
protected final transient Log logger = LogFactory.getLog(getClass());
public final static String LISTENER_PROPERTY_TAG = "theospi.toolListenerId";
private ComponentManager componentManager;
private EntityManager entityManager;
private List siteHelperTools = new ArrayList();
/**
* 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.
*
* @param o the observable object.
* @param arg an argument passed to the <code>notifyObservers</code>
* method.
*/
public void update(Observable o, Object arg) {
if (arg instanceof Event) {
processEvent((Event)arg, o);
}
}
protected void processEvent(Event event, Observable arg) {
if (event.getEvent().equals(SiteService.SECURE_ADD_SITE) ||
event.getEvent().equals(SiteService.SECURE_UPDATE_SITE)) {
// check out the update
try {
Reference ref = getEntityManager().newReference(event.getResource());
Site site = SiteService.getSite(ref.getId());
processSite(site);
if (event.getEvent().equals(SiteService.SECURE_UPDATE_SITE)) {
processUpdate(site);
}
} catch (IdUnusedException e) {
logger.error("error getting site object", e);
throw new OspException(e);
}
}
else if (event.getEvent().equals(SiteService.SECURE_REMOVE_SITE)) {
removeAll(getEntityManager().newReference(event.getResource()));
}
}
protected void processUpdate(Site site) {
Collection siteTools = getSiteTools(site.getId());
for (Iterator i=siteTools.iterator();i.hasNext();) {
SiteTool tool = (SiteTool)i.next();
ToolConfiguration toolConfig = SiteService.findTool(tool.getToolId());
if (toolConfig == null) {
removeTool(tool);
}
}
}
protected void removeTool(SiteTool tool) {
ToolEventListener listener = (ToolEventListener) getComponentManager().get(tool.getListenerId());
listener.toolRemoved(tool);
getHibernateTemplate().delete(tool);
}
protected void removeAll(Reference reference) {
Collection siteTools = getSiteTools(reference.getId());
for (Iterator i=siteTools.iterator();i.hasNext();) {
SiteTool tool = (SiteTool)i.next();
removeTool(tool);
}
}
protected void processSite(Site site) {
List pages = site.getPages();
for (Iterator i=getSiteHelperTools().iterator(); i.hasNext();) {
String toolId = (String)i.next();
Tool toolPlacement = ToolManager.getTool(toolId);
if (toolPlacement != null) {
String listenerId =
toolPlacement.getRegisteredConfig().getProperty(LISTENER_PROPERTY_TAG);
if (listenerId != null) {
ToolEventListener listener = (ToolEventListener) getComponentManager().get(listenerId);
if (listener != null) {
listener.helperSiteChanged(site);
}
}
}
}
for (Iterator i=pages.iterator();i.hasNext();) {
processPage((SitePage)i.next());
}
}
protected void processPage(SitePage sitePage) {
List tools = sitePage.getTools();
for (Iterator i=tools.iterator();i.hasNext();) {
processTool((ToolConfiguration)i.next());
}
}
protected void processTool(ToolConfiguration toolConfiguration) {
String listenerId =
toolConfiguration.getConfig().getProperty(LISTENER_PROPERTY_TAG);
if (listenerId != null) {
storeTool(toolConfiguration);
ToolEventListener listener = (ToolEventListener) getComponentManager().get(listenerId);
if (listener != null) {
listener.toolSiteChanged(toolConfiguration);
}
}
}
public void init() {
EventTrackingService.addObserver(this);
}
protected void storeTool(ToolConfiguration toolConfiguration) {
SiteTool tool = new SiteTool();
tool.setSiteId(toolConfiguration.getContainingPage().getContainingSite().getId());
tool.setToolId(toolConfiguration.getId());
if (getSiteTool(tool.getSiteId(), tool.getToolId()).size() > 0) {
return;
}
tool.setListenerId(toolConfiguration.getConfig().getProperty(LISTENER_PROPERTY_TAG));
getHibernateTemplate().saveOrUpdate(tool);
}
protected Collection getSiteTool(String siteId, String toolId) {
return getHibernateTemplate().findByNamedQuery("bySiteAndTool",
new Object[]{siteId, toolId});
}
protected Collection getSiteTools(String siteId) {
return getHibernateTemplate().findByNamedQuery("bySite", siteId);
}
public ComponentManager getComponentManager() {
return org.sakaiproject.component.cover.ComponentManager.getInstance();
}
public EntityManager getEntityManager() {
return entityManager;
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
public List getSiteHelperTools() {
return siteHelperTools;
}
public void setSiteHelperTools(List siteHelperTools) {
this.siteHelperTools = siteHelperTools;
}
}