LivePortalManagerServiceImpl.java
/*
* Copyright (C) 2003-2008 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.services.wcm.portal.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.PathNotFoundException;
import javax.jcr.Session;
import javax.jcr.query.Query;
import javax.jcr.query.QueryResult;
import org.exoplatform.portal.config.model.PortalConfig;
import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.core.ExtendedNode;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.jcr.ext.common.SessionProvider;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.wcm.core.NodeLocation;
import org.exoplatform.services.wcm.core.WCMConfigurationService;
import org.exoplatform.services.wcm.core.WebSchemaConfigService;
import org.exoplatform.services.wcm.portal.LivePortalManagerService;
import org.picocontainer.Startable;
/*
* Created by The eXo Platform SAS
* @author : Hoa.Pham
* hoa.pham@exoplatform.com
* Jun 19, 2008
*/
/**
* The Class LivePortalManagerServiceImpl.
*/
public class LivePortalManagerServiceImpl implements LivePortalManagerService, Startable {
private final String PORTAL_FOLDER = "exo:portalFolder";
private static final Log LOG = ExoLogger.getLogger(LivePortalManagerServiceImpl.class.getName());
private ConcurrentHashMap<String, String> livePortalPaths = new ConcurrentHashMap<String, String>();
private RepositoryService repositoryService;
private WCMConfigurationService wcmConfigService;
/**
* Instantiates a new live portal manager service impl.
*
* @param webSchemaConfigService the web schema config service
* @param wcmConfigurationService the wcm config service
* @param repositoryService the repository service
*/
public LivePortalManagerServiceImpl(
WebSchemaConfigService webSchemaConfigService,
WCMConfigurationService wcmConfigurationService,
RepositoryService repositoryService) {
this.wcmConfigService = wcmConfigurationService;
this.repositoryService = repositoryService;
}
/*
* (non-Javadoc)
* @see
* org.exoplatform.services.wcm.portal.LivePortalManagerService#getLivePortal
* (java.lang.String, org.exoplatform.services.jcr.ext.common.SessionProvider)
*/
public final Node getLivePortal(final SessionProvider sessionProvider, final String portalName) throws Exception {
String currentRepository = repositoryService.getCurrentRepository().getConfiguration().getName();
return getLivePortal(sessionProvider, currentRepository, portalName);
}
/*
* (non-Javadoc)
* @see
* org.exoplatform.services.wcm.portal.LivePortalManagerService#getLivePortals
* (org.exoplatform.services.jcr.ext.common.SessionProvider)
*/
public final List<Node> getLivePortals(final SessionProvider sessionProvider) throws Exception {
String currentRepository = repositoryService.getCurrentRepository().getConfiguration().getName();
return getLivePortals(sessionProvider, currentRepository);
}
/*
* (non-Javadoc)
* @seeorg.exoplatform.services.wcm.portal.LivePortalManagerService#
* getLiveSharedPortal
* (org.exoplatform.services.jcr.ext.common.SessionProvider)
*/
public final Node getLiveSharedPortal(final SessionProvider sessionProvider) throws Exception {
String currentRepository = repositoryService.getCurrentRepository().getConfiguration().getName();
return getLiveSharedPortal(sessionProvider, currentRepository);
}
/*
* (non-Javadoc)
* @see
* org.exoplatform.services.wcm.portal.LivePortalManagerService#getLivePortal
* (java.lang.String, java.lang.String,
* org.exoplatform.services.jcr.ext.common.SessionProvider)
*/
public final Node getLivePortal(final SessionProvider sessionProvider,
final String repository,
final String portalName) throws Exception {
Node portalsStorage = getLivePortalsStorage(sessionProvider);
return portalsStorage.getNode(portalName);
}
/*
* (non-Javadoc)
* @see
* org.exoplatform.services.wcm.portal.LivePortalManagerService#getLivePortals
* (java.lang.String, org.exoplatform.services.jcr.ext.common.SessionProvider)
*/
public final List<Node> getLivePortals(final SessionProvider sessionProvider, final String repository) throws Exception {
List<Node> list = new ArrayList<Node>();
Node portalsStorage = getLivePortalsStorage(sessionProvider);
for (NodeIterator iterator = portalsStorage.getNodes(); iterator.hasNext(); ) {
Node node = iterator.nextNode();
if (node.isNodeType(PORTAL_FOLDER)) {
list.add(node);
}
}
return list;
}
/*
* (non-Javadoc)
* @seeorg.exoplatform.services.wcm.portal.LivePortalManagerService#
* getLiveSharedPortal(java.lang.String,
* org.exoplatform.services.jcr.ext.common.SessionProvider)
*/
public final Node getLiveSharedPortal(final SessionProvider sessionProvider,
final String repository) throws Exception {
Node portalsStorage = getLivePortalsStorage(sessionProvider);
String sharePortalName = wcmConfigService.getSharedPortalName();
try {
return portalsStorage.getNode(sharePortalName);
} catch (PathNotFoundException e) {
return null;
}
}
private Node getLivePortalsStorage(final SessionProvider sessionProvider) throws Exception {
NodeLocation locationEntry = wcmConfigService.getLivePortalsLocation();
String workspace = locationEntry.getWorkspace();
String portalsStoragePath = locationEntry.getPath();
ManageableRepository manageableRepository = repositoryService.getCurrentRepository();
Session session = sessionProvider.getSession(workspace, manageableRepository);
return (Node)session.getItem(portalsStoragePath);
}
/*
* (non-Javadoc)
* @see
* org.exoplatform.services.wcm.portal.LivePortalManagerService#addLivePortal
* (org.exoplatform.portal.config.model.PortalConfig,
* org.exoplatform.services.jcr.ext.common.SessionProvider)
*/
public final void addLivePortal(final SessionProvider sessionProvider, final PortalConfig portalConfig)
throws Exception {
Node livePortalsStorage = getLivePortalsStorage(sessionProvider) ;
String portalName = portalConfig.getName();
if(livePortalsStorage.hasNode(portalName)) {
return;
}
ExtendedNode newPortal = (ExtendedNode)livePortalsStorage.addNode(portalName,PORTAL_FOLDER);
if (!newPortal.isNodeType("exo:owneable"))
newPortal.addMixin("exo:owneable");
if(newPortal.canAddMixin("metadata:siteMetadata")) {
newPortal.addMixin("metadata:siteMetadata");
newPortal.setProperty("siteTitle",portalName);
newPortal.setProperty("keywords",portalName);
newPortal.setProperty("robots","index,follow");
}
if(newPortal.canAddMixin("dc:elementSet")) {
newPortal.addMixin("dc:elementSet");
}
//Need set some other property for the portal node from portal config like access permission ..
newPortal.getSession().save();
//put sharedPortal path to the map at the first time when run this method
if(livePortalPaths.size() == 0) {
String sharedPortalName = wcmConfigService.getSharedPortalName();
NodeLocation nodeLocation = wcmConfigService.getLivePortalsLocation();
livePortalPaths.put(sharedPortalName,nodeLocation.getPath() + "/"+ sharedPortalName);
}
livePortalPaths.put(portalName,newPortal.getPath());
}
/*
* (non-Javadoc)
* @see
* org.exoplatform.services.wcm.portal.LivePortalManagerService#removeLivePortal
* (org.exoplatform.portal.config.model.PortalConfig,
* org.exoplatform.services.jcr.ext.common.SessionProvider)
*/
public void removeLivePortal(final SessionProvider sessionProvider, final PortalConfig portalConfig)
throws Exception {
//Remove site content folder for the portal in this version
//for next version, we will move it to backup ws
Node node = getLivePortal(sessionProvider, portalConfig.getName());
Session session = node.getSession();
node.remove();
session.save();
livePortalPaths.remove(portalConfig.getName());
}
/* (non-Javadoc)
* @see org.exoplatform.services.wcm.portal.LivePortalManagerService#getLivePortalsPath()
*/
public Collection<String> getLivePortalsPath() throws Exception {
return livePortalPaths.values();
}
public String getPortalNameByPath(String portalPath) throws Exception {
Set<String> keys = livePortalPaths.keySet();
for(String portalName: keys.toArray(new String[keys.size()])) {
if(livePortalPaths.get(portalName).equalsIgnoreCase(portalPath)) {
return portalName;
}
}
return null;
}
public Node getLivePortalByChild(Node childNode) throws Exception {
for(String portalPath: livePortalPaths.values()) {
if(childNode.getPath().startsWith(portalPath)) {
return (Node)childNode.getSession().getItem(portalPath);
}
}
return null;
}
public void start() {
if (LOG.isInfoEnabled()) {
LOG.info("Start LivePortalManagementService....");
}
SessionProvider sessionProvider = null;
Session session = null;
try {
sessionProvider = SessionProvider.createSystemProvider();
ManageableRepository repository = repositoryService.getCurrentRepository();
NodeLocation nodeLocation = wcmConfigService.getLivePortalsLocation();
session = sessionProvider.getSession(nodeLocation.getWorkspace(),repository);
String statement = "select * from exo:portalFolder where jcr:path like '" + nodeLocation.getPath() + "/%'";
Query query = session.getWorkspace().getQueryManager().createQuery(statement,Query.SQL);
QueryResult result = query.execute();
for(NodeIterator iterator = result.getNodes(); iterator.hasNext();) {
Node portalNode = iterator.nextNode();
livePortalPaths.putIfAbsent(portalNode.getName(),portalNode.getPath());
}
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error("Error when starting LivePortalManagerService: ", e);
}
} finally {
sessionProvider.close();
}
}
public void stop() {
}
public String getPortalPathByName(String portalName) throws Exception {
return livePortalPaths.get(portalName);
}
}