001/*
002 *  Copyright 2016 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;
017
018import java.util.ArrayList;
019import java.util.HashMap;
020import java.util.List;
021import java.util.Map;
022
023import javax.jcr.ItemNotFoundException;
024import javax.jcr.Node;
025import javax.jcr.PathNotFoundException;
026
027import org.apache.avalon.framework.parameters.Parameters;
028import org.apache.avalon.framework.service.ServiceException;
029import org.apache.avalon.framework.service.ServiceManager;
030import org.apache.cocoon.ProcessingException;
031import org.apache.cocoon.acting.ServiceableAction;
032import org.apache.cocoon.environment.ObjectModelHelper;
033import org.apache.cocoon.environment.Redirector;
034import org.apache.cocoon.environment.Request;
035import org.apache.cocoon.environment.SourceResolver;
036
037import org.ametys.core.cocoon.JSonReader;
038import org.ametys.core.user.User;
039import org.ametys.core.user.UserManager;
040import org.ametys.plugins.forms.jcr.FormPropertiesManager;
041import org.ametys.plugins.forms.table.FormTableManager;
042
043/**
044 * Generator listing all of the forms that are no longer referenced by any content
045 */
046public class GetOrphanFormsAction extends ServiceableAction
047{
048    /** Component gathering methods to query forms in JCR */
049    private FormPropertiesManager _formPropertiesManager;
050    
051    /** Component gathering methods to manipulate SQL forms */
052    private FormTableManager _formTableManager;
053    
054    /** The users manager. */
055    private UserManager _userManager;
056
057    @Override
058    public void service(ServiceManager serviceManager) throws ServiceException
059    {
060        _formPropertiesManager = (FormPropertiesManager) serviceManager.lookup(FormPropertiesManager.ROLE);
061        _formTableManager = (FormTableManager) serviceManager.lookup(FormTableManager.ROLE);
062        _userManager = (UserManager) serviceManager.lookup(UserManager.ROLE);
063    }
064    
065    @Override
066    public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception
067    {
068        Map<String, Object> result = new HashMap<> ();
069        try
070        {
071            String formId = null;
072            Form form = null;
073            
074            List<String> tableNames = _formTableManager.getTableNames();
075            
076            List<Map<String, Object>> tableList = new ArrayList<> ();
077            for (String tableName : tableNames)
078            {
079                Map<String, Object> table = new HashMap<> ();
080                
081                formId = tableName.substring(FormTableManager.TABLE_PREFIX.length()); 
082                form = _formPropertiesManager.getForm(formId);
083                if (form == null)
084                {
085                    Node frozenContentNode = _formPropertiesManager.getMostRecentFormFrozenContent(formId);
086                    if (frozenContentNode != null)
087                    {
088                        String contentUUId = frozenContentNode.getProperty("jcr:frozenUuid").getString();
089                        String title = frozenContentNode.getProperty("ametys:title").getString();
090                        
091                        table.put("contentTitle", title);
092                        
093                        if (frozenContentNode.hasProperty("ametys:site"))
094                        {
095                            table.put("siteName", frozenContentNode.getProperty("ametys:site").getString());
096                        }
097                        
098                        try
099                        {
100                            Node contributorNode = frozenContentNode.getNode("ametys:contributor");
101                            
102                            String contributorLogin = contributorNode.getProperty("ametys:login").getString();
103                            User user = _userManager.getUser(contributorNode.getProperty("ametys:population").getString(), contributorNode.getProperty("ametys:login").getString());
104                            table.put("lastContributor", user != null ? user.getFullName() : contributorLogin);
105                        }
106                        catch (PathNotFoundException e)
107                        {
108                            // For legacy purposes: orphan forms since a 3.x version
109                            String contributorLogin = frozenContentNode.getProperty("ametys:contributor").getString();
110                            table.put("lastContributor", contributorLogin);
111                        }
112                        
113                        
114                        boolean stillExists = true;
115                        try
116                        {
117                            frozenContentNode.getSession().getNodeByIdentifier(contentUUId);
118                        }
119                        catch (ItemNotFoundException e)
120                        {
121                            stillExists = false;
122                        }
123                        
124                        table.put("stillExists", stillExists);
125                    }
126                
127                    // Table attrs
128                    table.put("name", tableName);
129                    table.put("total", Integer.toString(_formTableManager.getTotalSubmissions(formId)));
130                    tableList.add(table);
131                }
132            }
133            result.put("tables", tableList);
134        }
135        catch (Exception e)
136        {
137            throw new ProcessingException("An error occurred while retrieving the orphan forms.", e);
138        }
139        
140        
141        Request request = ObjectModelHelper.getRequest(objectModel);
142        request.setAttribute(JSonReader.OBJECT_TO_READ, result);
143        return EMPTY_MAP;
144    }
145}