/* * 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.actions.activation; import java.util.Map; import javax.jcr.Node; import javax.jcr.Property; import javax.jcr.Session; import javax.jcr.Value; import org.exoplatform.services.cms.actions.ActionPlugin; import org.exoplatform.services.cms.actions.ActionServiceContainer; import org.exoplatform.services.cms.actions.impl.ScriptActionPlugin; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.security.Identity; import org.exoplatform.services.security.IdentityConstants; import org.exoplatform.services.security.IdentityRegistry; import org.exoplatform.services.security.MembershipEntry; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; /** * Created by The eXo Platform SAS * Author : Pham Xuan Hoa * hoa.pham@exoplatform.com * Dec 21, 2006 */ public class ScriptActionActivationJob implements Job { final private static String COUNTER_PROP = "exo:counter" ; private static final Log LOG = ExoLogger.getLogger(ScriptActionActivationJob.class.getName()); public void execute(JobExecutionContext context) throws JobExecutionException { RepositoryService repositoryService = WCMCoreUtils.getService(RepositoryService.class); ActionServiceContainer actionServiceContainer = WCMCoreUtils.getService(ActionServiceContainer.class); IdentityRegistry identityRegistry = WCMCoreUtils.getService(IdentityRegistry.class); ActionPlugin scriptActionService = actionServiceContainer.getActionPlugin(ScriptActionPlugin.ACTION_TYPE) ; Session jcrSession = null; Node actionNode = null ; JobDataMap jdatamap = context.getJobDetail().getJobDataMap() ; String userId = jdatamap.getString("initiator") ; String srcWorkspace = jdatamap.getString("srcWorkspace") ; String srcPath = jdatamap.getString("srcPath") ; String actionName = jdatamap.getString("actionName") ; String executable = jdatamap.getString("executable") ; Map variables = jdatamap.getWrappedMap() ; try { jcrSession = repositoryService.getCurrentRepository().getSystemSession(srcWorkspace); Node node = (Node) jcrSession.getItem(srcPath); actionNode = actionServiceContainer.getAction(node, actionName); Property rolesProp = actionNode.getProperty("exo:roles"); Value[] roles = rolesProp.getValues(); boolean hasPermission = checkExcetuteable(userId, roles, identityRegistry); if (!hasPermission) { jcrSession.logout(); return; } scriptActionService.activateAction(userId, executable, variables); int currentCounter = (int)actionNode.getProperty(COUNTER_PROP).getValue().getLong() ; actionNode.setProperty(COUNTER_PROP,currentCounter +1) ; actionNode.save() ; jcrSession.save() ; } catch (Exception e) { if (LOG.isErrorEnabled()) { LOG.error("Unexpected error", e); } } finally { if(jcrSession != null) jcrSession.logout(); } } private boolean checkExcetuteable(String userId,Value[] roles, IdentityRegistry identityRegistry) throws Exception { if(IdentityConstants.SYSTEM.equalsIgnoreCase(userId)) { return true ; } Identity identity = identityRegistry.getIdentity(userId); if(identity == null) { return false ; } for (int i = 0; i < roles.length; i++) { String role = roles[i].getString(); if("*".equalsIgnoreCase(role)) return true ; MembershipEntry membershipEntry = MembershipEntry.parse(role) ; if(identity.isMemberOf(membershipEntry)) { return true ; } } return false ; } }