/* * Copyright (C) 2011 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.portal.mop.navigation; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.observation.Event; import javax.jcr.observation.EventIterator; import javax.jcr.observation.EventListener; import javax.jcr.observation.ObservationManager; import org.exoplatform.portal.mop.SiteType; /** * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> */ class InvalidationBridge { /** . */ private final DataCache cache; /** . */ private ObservationManager mgr; /** . */ private final EventListenerImpl portalBridge; /** . */ private final EventListenerImpl groupBridge; /** . */ private final EventListenerImpl userBridge; public InvalidationBridge(DataCache cache) { this.cache = cache; this.portalBridge = new EventListenerImpl("mop:portalsites", SiteType.PORTAL); this.groupBridge = new EventListenerImpl("mop:groupsites", SiteType.GROUP); this.userBridge = new EventListenerImpl("mop:usersites", SiteType.USER); } void start(Session session) throws RepositoryException { mgr = session.getWorkspace().getObservationManager(); // portalBridge.register(mgr); groupBridge.register(mgr); userBridge.register(mgr); } void stop() { portalBridge.unregister(); groupBridge.unregister(); userBridge.unregister(); } private class EventListenerImpl implements EventListener { /** . */ private final String nodeType; /** . */ private final SiteType type; /** . */ private ObservationManager mgr; private EventListenerImpl(String nodeType, SiteType type) { this.nodeType = nodeType; this.type = type; } void register(ObservationManager mgr) throws RepositoryException { mgr.addEventListener(this, Event.NODE_REMOVED, "/", true, null, new String[] { nodeType }, false); // this.mgr = mgr; } void unregister() { if (mgr != null) { try { mgr.removeEventListener(this); } catch (RepositoryException ignore) { } } } public void onEvent(EventIterator events) { // We clear the cache when a site is removed in order to remove all the related navigations cache.clear(); } } }