View Javadoc
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 }