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}