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}