/* * Copyright (C) 2010 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 static org.exoplatform.portal.mop.Utils.siteType; import java.util.List; import javax.jcr.RepositoryException; import javax.jcr.Session; import org.chromattic.api.UndeclaredRepositoryException; import org.exoplatform.portal.mop.EventType; import org.exoplatform.portal.mop.SiteKey; import org.exoplatform.portal.mop.SiteType; import org.exoplatform.portal.pom.config.POMSessionManager; import org.exoplatform.services.cache.CacheService; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.core.ManageableRepository; import org.exoplatform.services.listener.ListenerService; import org.gatein.common.logging.Logger; import org.gatein.common.logging.LoggerFactory; import org.gatein.mop.api.workspace.ObjectType; import org.gatein.mop.api.workspace.Site; import org.picocontainer.Startable; /** * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> * @version $Revision$ */ public class NavigationServiceWrapper implements NavigationService, Startable { /** . */ private static final Logger log = LoggerFactory.getLogger(NavigationServiceWrapper.class); /** . */ private final NavigationServiceImpl service; /** . */ private final ListenerService listenerService; /** . */ private final POMSessionManager manager; /** . */ private final RepositoryService repositoryService; /** . */ private final InvalidationBridge bridge; public NavigationServiceWrapper(RepositoryService repositoryService, POMSessionManager manager, ListenerService listenerService) { SimpleDataCache cache = new SimpleDataCache(); // this.repositoryService = repositoryService; this.manager = manager; this.service = new NavigationServiceImpl(manager, cache); this.listenerService = listenerService; this.bridge = new InvalidationBridge(cache); } public NavigationServiceWrapper(RepositoryService repositoryService, POMSessionManager manager, ListenerService listenerService, CacheService cacheService) { ExoDataCache cache = new ExoDataCache(cacheService); // this.repositoryService = repositoryService; this.manager = manager; this.service = new NavigationServiceImpl(manager, cache); this.listenerService = listenerService; this.bridge = new InvalidationBridge(cache); } public NavigationContext loadNavigation(SiteKey key) { return service.loadNavigation(key); } @Override public List<NavigationContext> loadNavigations(SiteType type) throws NullPointerException, NavigationServiceException { return service.loadNavigations(type); } public void saveNavigation(NavigationContext navigation) throws NullPointerException, NavigationServiceException { boolean created = navigation.data == null; // service.saveNavigation(navigation); // if (created) { notify(EventType.NAVIGATION_CREATED, navigation.key); } else { notify(EventType.NAVIGATION_UPDATED, navigation.key); } } public boolean destroyNavigation(NavigationContext navigation) throws NullPointerException, NavigationServiceException { boolean destroyed = service.destroyNavigation(navigation); // if (destroyed) { notify(EventType.NAVIGATION_DESTROYED, navigation.key); } // return destroyed; } public <N> NodeContext<N> loadNode(NodeModel<N> model, NavigationContext navigation, Scope scope, NodeChangeListener<NodeContext<N>> listener) { return service.loadNode(model, navigation, scope, listener); } public <N> void saveNode(NodeContext<N> context, NodeChangeListener<NodeContext<N>> listener) throws NavigationServiceException { service.saveNode(context, listener); org.gatein.mop.api.workspace.Navigation nav = service.manager.getSession().findObjectById(ObjectType.NAVIGATION, context.data.id); Site site = nav.getSite(); SiteKey key = new SiteKey(siteType(site.getObjectType()), site.getName()); notify(EventType.NAVIGATION_UPDATED, key); } public <N> void updateNode(NodeContext<N> context, Scope scope, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, NavigationServiceException { service.updateNode(context, scope, listener); } public <N> void rebaseNode(NodeContext<N> context, Scope scope, NodeChangeListener<NodeContext<N>> listener) throws NullPointerException, NavigationServiceException { service.rebaseNode(context, scope, listener); } private void notify(String name, SiteKey key) { try { listenerService.broadcast(name, this, key); } catch (Exception e) { log.error("Error when delivering notification " + name + " for navigation " + key, e); } } public void start() { Session session = null; try { String workspaceName = manager.getLifeCycle().getWorkspaceName(); ManageableRepository repo = repositoryService.getCurrentRepository(); session = repo.getSystemSession(workspaceName); bridge.start(session); } catch (RepositoryException e) { throw new UndeclaredRepositoryException(e); } finally { if (session != null) { session.logout(); } } } public void stop() { bridge.stop(); } }