/*
* Copyright (C) 2003-2007 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.cms.queries.impl;
import java.util.GregorianCalendar;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.Session;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import org.exoplatform.container.xml.InitParams;
import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.ext.common.SessionProvider;
import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator;
import org.exoplatform.services.organization.User;
import org.exoplatform.services.organization.UserEventListener;
import org.exoplatform.services.wcm.core.NodetypeConstant;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.gatein.common.logging.Logger;
import org.gatein.common.logging.LoggerFactory;
/**
* @author Benjamin Mestrallet benjamin.mestrallet@exoplatform.com
*/
public class NewUserListener extends UserEventListener {
private static final Logger LOG = LoggerFactory.getLogger(NewUserListener.class);
private NewUserConfig config_;
private NodeHierarchyCreator nodeHierarchyCreator_;
private RepositoryService repositoryService_ ;
private String relativePath_;
public NewUserListener(RepositoryService repositoryService,
NodeHierarchyCreator nodeHierarchyCreator,
InitParams params) throws Exception {
nodeHierarchyCreator_ = nodeHierarchyCreator;
repositoryService_ = repositoryService;
config_ = params.getObjectParamValues(NewUserConfig.class).get(0);
relativePath_ = params.getValueParam("relativePath").getValue();
}
public void preSave(User user, boolean isNew)
throws Exception {
initSystemData(user.getUserName());
}
private void initSystemData(String userName) throws Exception{
SessionProvider sessionProvider = WCMCoreUtils.getSystemSessionProvider();
Node userNode = nodeHierarchyCreator_.getUserNode(sessionProvider, userName);
if (userNode.hasNode(relativePath_)) {
Node queriesHome = userNode.getNode(relativePath_) ;
boolean userFound = false;
NewUserConfig.User templateConfig = null;
for (NewUserConfig.User userConfig : config_.getUsers()) {
String currentName = userConfig.getUserName();
if (config_.getTemplate().equals(currentName)) templateConfig = userConfig;
if (currentName.equals(userName)) {
List<NewUserConfig.Query> queries = userConfig.getQueries();
importQueries(queriesHome, queries, userNode.getSession().getWorkspace().getName());
userFound = true;
break;
}
}
if (!userFound) {
//use template conf
List<NewUserConfig.Query> queries = templateConfig.getQueries();
importQueries(queriesHome, queries);
}
} else {
LOG.debug("The userNode "+userNode.getName()+" doesn't have a child node named : "+relativePath_+". The feature 'StoredQueries' will be ignored ");
}
}
public void importQueries(Node queriesHome, List<NewUserConfig.Query> queries) throws Exception {
importQueries(queriesHome, queries, queriesHome.getSession().getWorkspace().getName());
}
public void importQueries(Node queriesHome, List<NewUserConfig.Query> queries,
String workspaceName) throws Exception {
QueryManager manager = getSession(workspaceName).getWorkspace().getQueryManager();
for (NewUserConfig.Query query:queries) {
String queryName = query.getQueryName();
String language = query.getLanguage();
String statement = query.getQuery();
Query queryNode = manager.createQuery(statement, language);
String absPath = queriesHome.getPath() + "/" + queryName;
if (queriesHome.getSession().itemExists(absPath)) {
continue;
}
Node node = queryNode.storeAsNode(absPath);
if (!node.isNodeType("exo:datetime")) {
node.addMixin("exo:datetime");
}
if (!node.isNodeType(NodetypeConstant.EXO_HIDDENABLE)) {
node.addMixin(NodetypeConstant.EXO_HIDDENABLE);
}
if (!node.isNodeType("exo:owneable")) {
node.addMixin("exo:owneable");
}
node.setProperty("exo:dateCreated",new GregorianCalendar()) ;
node.getSession().save();
}
}
private Session getSession(String workspaceName) throws Exception {
SessionProvider sessionProvider = WCMCoreUtils.getSystemSessionProvider();
return sessionProvider.getSession(workspaceName, repositoryService_.getCurrentRepository()) ;
}
}