001/*
002 *  Copyright 2010 Anyware Services
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package org.ametys.plugins.forms.workflow;
017
018import java.io.IOException;
019import java.util.Map;
020
021import javax.jcr.Node;
022import javax.jcr.RepositoryException;
023import javax.jcr.lock.Lock;
024import javax.jcr.lock.LockManager;
025
026import org.apache.avalon.framework.service.ServiceException;
027import org.apache.avalon.framework.service.ServiceManager;
028import org.xml.sax.SAXException;
029
030import org.ametys.cms.repository.Content;
031import org.ametys.cms.repository.WorkflowAwareContent;
032import org.ametys.cms.workflow.AbstractContentWorkflowComponent;
033import org.ametys.core.user.UserIdentity;
034import org.ametys.plugins.forms.FormManager;
035import org.ametys.plugins.repository.AmetysRepositoryException;
036import org.ametys.plugins.repository.RepositoryConstants;
037import org.ametys.plugins.repository.jcr.JCRAmetysObject;
038import org.ametys.plugins.repository.lock.LockHelper;
039import org.ametys.plugins.repository.lock.LockableAmetysObject;
040
041import com.opensymphony.module.propertyset.PropertySet;
042import com.opensymphony.workflow.FunctionProvider;
043import com.opensymphony.workflow.WorkflowException;
044
045/**
046 * Post function handling form data after creating and editing it.
047 */
048public class FormEditionFunction extends AbstractContentWorkflowComponent implements FunctionProvider
049{
050    /** Form properties manager. */
051    protected FormManager _formManager;
052    
053    @Override
054    public void service(ServiceManager manager) throws ServiceException
055    {
056        super.service(manager);
057        _formManager = (FormManager) manager.lookup(FormManager.ROLE);
058    }
059    
060    @Override
061    public void execute(Map transientVars, Map args, PropertySet ps) throws WorkflowException
062    {
063        _logger.info("Performing form processing workflow function");
064        
065        // Retrieve current content
066        WorkflowAwareContent content = getContent(transientVars);
067        UserIdentity user = getUser(transientVars);
068
069        try
070        {
071            LockableAmetysObject lockableContent = (LockableAmetysObject) content;
072            if (lockableContent.isLocked() && !LockHelper.isLockOwner(lockableContent, user))
073            {
074                throw new WorkflowException("User '" + user + "' try to save content '" + content.getName() + "' but it is locked by another user");
075            }
076            
077            _checkLock (content);
078            _formManager.processContentForms(content);
079        }
080        catch (RepositoryException e)
081        {
082            throw new WorkflowException("Unable to check lock for content " + content.getName() + "", e);
083        }
084        catch (AmetysRepositoryException e)
085        {
086            throw new WorkflowException("Unable to edit content " + content.getName() + " from the repository", e);
087        }
088        catch (SAXException e)
089        {
090            _logger.error("An exception occured while parsing the form", e);
091        }
092        catch (IOException e)
093        {
094            _logger.error("An exception occured while parsing the form", e);
095        }
096    }
097    
098    private void _checkLock(Content content) throws RepositoryException
099    {
100        if (content instanceof JCRAmetysObject)
101        {
102            Node node = ((JCRAmetysObject) content).getNode();
103         
104            if (node.isLocked())
105            {
106                LockManager lockManager = node.getSession().getWorkspace().getLockManager();
107                Lock lock = lockManager.getLock(node.getPath());
108                Node lockHolder = lock.getNode();
109                
110                lockManager.addLockToken(lockHolder.getProperty(RepositoryConstants.METADATA_LOCKTOKEN).getString());
111            }
112        }
113    }
114    
115}