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