1 /* 2 * Copyright (c) 2002-2022, City of Paris 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright notice 10 * and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright notice 13 * and the following disclaimer in the documentation and/or other materials 14 * provided with the distribution. 15 * 16 * 3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its 17 * contributors may be used to endorse or promote products derived from 18 * this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE 24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 * 32 * License 1.0 33 */ 34 package fr.paris.lutece.portal.service.resource; 35 36 import fr.paris.lutece.portal.service.spring.SpringContextService; 37 38 import java.util.HashMap; 39 import java.util.Map; 40 import java.util.Map.Entry; 41 42 /** 43 * Class to notify listeners of actions performed on resources. Listeners keep at least track of the number of actions performed over a given resource. 44 */ 45 public final class ExtendableResourceActionHit 46 { 47 /** 48 * Download action 49 */ 50 public static final String ACTION_DOWNLOAD = "download"; 51 52 /** 53 * Creation action 54 */ 55 public static final String ACTION_CREATION = "creation"; 56 57 /** 58 * Update action 59 */ 60 public static final String ACTION_UPDATE = "update"; 61 62 /** 63 * Archive action 64 */ 65 public static final String ACTION_ARCHIVE = "archive"; 66 67 /** 68 * Delete action 69 */ 70 public static final String ACTION_DELETE = "delete"; 71 private static ExtendableResourceActionHitableResourceActionHit.html#ExtendableResourceActionHit">ExtendableResourceActionHit _instance = new ExtendableResourceActionHit( ); 72 73 /** 74 * Private constructor 75 */ 76 private ExtendableResourceActionHit( ) 77 { 78 } 79 80 /** 81 * Get the service instance 82 * 83 * @return The instance of the service 84 */ 85 public static ExtendableResourceActionHit getInstance( ) 86 { 87 return _instance; 88 } 89 90 /** 91 * Get the total number of hit associated to a given action name and resource type 92 * 93 * @param strActionName 94 * The name of the action to get the number of hit of 95 * @param strExtendableResourceType 96 * The resource type to get the hit of 97 * @return The number of hit, or 0 if this action has no hit for this resource type 98 */ 99 public int getActionHit( String strActionName, String strExtendableResourceType ) 100 { 101 int nResult = 0; 102 103 for ( IExtendableResourceActionHitListener listener : SpringContextService.getBeansOfType( IExtendableResourceActionHitListener.class ) ) 104 { 105 nResult += listener.getActionHit( strActionName, strExtendableResourceType ); 106 } 107 108 return nResult; 109 } 110 111 /** 112 * Get the list of action names associated with a number of hit for a given resource 113 * 114 * @param strExtendableResourceId 115 * The id of the resource 116 * @param strExtendableResourceType 117 * The type of the resource 118 * @return A map containing associations between action names and hit number 119 */ 120 public Map<String, Integer> getResourceHit( String strExtendableResourceId, String strExtendableResourceType ) 121 { 122 Map<String, Integer> mapActionHit = new HashMap<>( ); 123 124 for ( IExtendableResourceActionHitListener listener : SpringContextService.getBeansOfType( IExtendableResourceActionHitListener.class ) ) 125 { 126 for ( Entry<String, Integer> entry : listener.getResourceHit( strExtendableResourceId, strExtendableResourceType ).entrySet( ) ) 127 { 128 if ( mapActionHit.containsKey( entry.getKey( ) ) ) 129 { 130 mapActionHit.put( entry.getKey( ), mapActionHit.get( entry.getKey( ) ) + entry.getValue( ) ); 131 } 132 else 133 { 134 mapActionHit.put( entry.getKey( ), entry.getValue( ) ); 135 } 136 } 137 } 138 139 return mapActionHit; 140 } 141 142 /** 143 * Get the number of hit associated with a resource and an action name 144 * 145 * @param strExtendableResourceId 146 * The id of the resource 147 * @param strExtendableResourceType 148 * The type of the resource 149 * @param strActionName 150 * The name of the action 151 * @return The number of hit, or 0 if the resource has no hit for this action 152 */ 153 public int getResourceActionHit( String strExtendableResourceId, String strExtendableResourceType, String strActionName ) 154 { 155 int nResult = 0; 156 157 for ( IExtendableResourceActionHitListener listener : SpringContextService.getBeansOfType( IExtendableResourceActionHitListener.class ) ) 158 { 159 nResult += listener.getResourceActionHit( strExtendableResourceId, strExtendableResourceType, strActionName ); 160 } 161 162 return nResult; 163 } 164 165 /** 166 * Notify every listeners that an action has been performed on a resource 167 * 168 * @param strExtendableResourceId 169 * The id of the resource the action was performed on 170 * @param strExtendableResourceType 171 * The type of the resource the action was performed on 172 * @param strActionName 173 * The name of the action that was performed on the resource. Action names can be any strings, but the class {@link ExtendableResourceActionHit} 174 * exposes standard action names. 175 */ 176 public void notifyActionOnResource( String strExtendableResourceId, String strExtendableResourceType, String strActionName ) 177 { 178 for ( IExtendableResourceActionHitListener listener : SpringContextService.getBeansOfType( IExtendableResourceActionHitListener.class ) ) 179 { 180 listener.notifyActionOnResource( strExtendableResourceId, strExtendableResourceType, strActionName ); 181 } 182 } 183 }