001: /**********************************************************************************
002: * $URL:https://source.sakaiproject.org/svn/osp/trunk/common/api-impl/src/java/org/theospi/portfolio/worksite/mgt/impl/SiteEventListener.java $
003: * $Id:SiteEventListener.java 9134 2006-05-08 20:28:42Z chmaurer@iupui.edu $
004: ***********************************************************************************
005: *
006: * Copyright (c) 2005, 2006 The Sakai Foundation.
007: *
008: * Licensed under the Educational Community License, Version 1.0 (the "License");
009: * you may not use this file except in compliance with the License.
010: * You may obtain a copy of the License at
011: *
012: * http://www.opensource.org/licenses/ecl1.php
013: *
014: * Unless required by applicable law or agreed to in writing, software
015: * distributed under the License is distributed on an "AS IS" BASIS,
016: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: * See the License for the specific language governing permissions and
018: * limitations under the License.
019: *
020: **********************************************************************************/package org.theospi.portfolio.worksite.mgt.impl;
021:
022: import org.apache.commons.logging.Log;
023: import org.apache.commons.logging.LogFactory;
024: import org.sakaiproject.component.api.ComponentManager;
025: import org.sakaiproject.entity.api.EntityManager;
026: import org.sakaiproject.entity.api.Reference;
027: import org.sakaiproject.event.api.Event;
028: import org.sakaiproject.event.cover.EventTrackingService;
029: import org.sakaiproject.exception.IdUnusedException;
030: import org.sakaiproject.site.api.Site;
031: import org.sakaiproject.site.api.SitePage;
032: import org.sakaiproject.site.api.ToolConfiguration;
033: import org.sakaiproject.site.cover.SiteService;
034: import org.sakaiproject.tool.api.Tool;
035: import org.sakaiproject.tool.cover.ToolManager;
036: import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
037: import org.theospi.portfolio.shared.model.OspException;
038: import org.theospi.portfolio.worksite.intf.ToolEventListener;
039: import org.theospi.portfolio.worksite.model.SiteTool;
040:
041: import java.util.*;
042:
043: public class SiteEventListener extends HibernateDaoSupport implements
044: Observer {
045: protected final transient Log logger = LogFactory
046: .getLog(getClass());
047:
048: public final static String LISTENER_PROPERTY_TAG = "theospi.toolListenerId";
049: private ComponentManager componentManager;
050: private EntityManager entityManager;
051:
052: private List siteHelperTools = new ArrayList();
053:
054: /**
055: * This method is called whenever the observed object is changed. An
056: * application calls an <tt>Observable</tt> object's
057: * <code>notifyObservers</code> method to have all the object's
058: * observers notified of the change.
059: *
060: * @param o the observable object.
061: * @param arg an argument passed to the <code>notifyObservers</code>
062: * method.
063: */
064: public void update(Observable o, Object arg) {
065: if (arg instanceof Event) {
066: processEvent((Event) arg, o);
067: }
068: }
069:
070: protected void processEvent(Event event, Observable arg) {
071: if (event.getEvent().equals(SiteService.SECURE_ADD_SITE)
072: || event.getEvent().equals(
073: SiteService.SECURE_UPDATE_SITE)) {
074: // check out the update
075: try {
076: Reference ref = getEntityManager().newReference(
077: event.getResource());
078: Site site = SiteService.getSite(ref.getId());
079: processSite(site);
080:
081: if (event.getEvent().equals(
082: SiteService.SECURE_UPDATE_SITE)) {
083: processUpdate(site);
084: }
085: } catch (IdUnusedException e) {
086: logger.error("error getting site object", e);
087: throw new OspException(e);
088: }
089: } else if (event.getEvent().equals(
090: SiteService.SECURE_REMOVE_SITE)) {
091: removeAll(getEntityManager().newReference(
092: event.getResource()));
093: }
094: }
095:
096: protected void processUpdate(Site site) {
097: Collection siteTools = getSiteTools(site.getId());
098:
099: for (Iterator i = siteTools.iterator(); i.hasNext();) {
100: SiteTool tool = (SiteTool) i.next();
101:
102: ToolConfiguration toolConfig = SiteService.findTool(tool
103: .getToolId());
104:
105: if (toolConfig == null) {
106: removeTool(tool);
107: }
108: }
109: }
110:
111: protected void removeTool(SiteTool tool) {
112: ToolEventListener listener = (ToolEventListener) getComponentManager()
113: .get(tool.getListenerId());
114:
115: listener.toolRemoved(tool);
116:
117: getHibernateTemplate().delete(tool);
118:
119: }
120:
121: protected void removeAll(Reference reference) {
122: Collection siteTools = getSiteTools(reference.getId());
123:
124: for (Iterator i = siteTools.iterator(); i.hasNext();) {
125: SiteTool tool = (SiteTool) i.next();
126: removeTool(tool);
127: }
128: }
129:
130: protected void processSite(Site site) {
131: List pages = site.getPages();
132:
133: for (Iterator i = getSiteHelperTools().iterator(); i.hasNext();) {
134: String toolId = (String) i.next();
135: Tool toolPlacement = ToolManager.getTool(toolId);
136: if (toolPlacement != null) {
137: String listenerId = toolPlacement.getRegisteredConfig()
138: .getProperty(LISTENER_PROPERTY_TAG);
139: if (listenerId != null) {
140: ToolEventListener listener = (ToolEventListener) getComponentManager()
141: .get(listenerId);
142:
143: if (listener != null) {
144: listener.helperSiteChanged(site);
145: }
146: }
147: }
148: }
149:
150: for (Iterator i = pages.iterator(); i.hasNext();) {
151: processPage((SitePage) i.next());
152: }
153: }
154:
155: protected void processPage(SitePage sitePage) {
156: List tools = sitePage.getTools();
157:
158: for (Iterator i = tools.iterator(); i.hasNext();) {
159: processTool((ToolConfiguration) i.next());
160: }
161: }
162:
163: protected void processTool(ToolConfiguration toolConfiguration) {
164: String listenerId = toolConfiguration.getConfig().getProperty(
165: LISTENER_PROPERTY_TAG);
166: if (listenerId != null) {
167: storeTool(toolConfiguration);
168: ToolEventListener listener = (ToolEventListener) getComponentManager()
169: .get(listenerId);
170:
171: if (listener != null) {
172: listener.toolSiteChanged(toolConfiguration);
173: }
174: }
175: }
176:
177: public void init() {
178: EventTrackingService.addObserver(this );
179: }
180:
181: protected void storeTool(ToolConfiguration toolConfiguration) {
182: SiteTool tool = new SiteTool();
183: tool.setSiteId(toolConfiguration.getContainingPage()
184: .getContainingSite().getId());
185: tool.setToolId(toolConfiguration.getId());
186:
187: if (getSiteTool(tool.getSiteId(), tool.getToolId()).size() > 0) {
188: return;
189: }
190:
191: tool.setListenerId(toolConfiguration.getConfig().getProperty(
192: LISTENER_PROPERTY_TAG));
193:
194: getHibernateTemplate().saveOrUpdate(tool);
195: }
196:
197: protected Collection getSiteTool(String siteId, String toolId) {
198: return getHibernateTemplate().findByNamedQuery("bySiteAndTool",
199: new Object[] { siteId, toolId });
200: }
201:
202: protected Collection getSiteTools(String siteId) {
203: return getHibernateTemplate()
204: .findByNamedQuery("bySite", siteId);
205: }
206:
207: public ComponentManager getComponentManager() {
208: return org.sakaiproject.component.cover.ComponentManager
209: .getInstance();
210: }
211:
212: public EntityManager getEntityManager() {
213: return entityManager;
214: }
215:
216: public void setEntityManager(EntityManager entityManager) {
217: this .entityManager = entityManager;
218: }
219:
220: public List getSiteHelperTools() {
221: return siteHelperTools;
222: }
223:
224: public void setSiteHelperTools(List siteHelperTools) {
225: this.siteHelperTools = siteHelperTools;
226: }
227: }
|