admin activity logger added
[mir.git] / source / mircoders / global / MirGlobal.java
1 /*\r
2  * Copyright (C) 2001, 2002 The Mir-coders group\r
3  *\r
4  * This file is part of Mir.\r
5  *\r
6  * Mir is free software; you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation; either version 2 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * Mir is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with Mir; if not, write to the Free Software\r
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
19  *\r
20  * In addition, as a special exception, The Mir-coders gives permission to link\r
21  * the code of this program with  any library licensed under the Apache Software License,\r
22  * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library\r
23  * (or with modified versions of the above that use the same license as the above),\r
24  * and distribute linked combinations including the two.  You must obey the\r
25  * GNU General Public License in all respects for all of the code used other than\r
26  * the above mentioned libraries.  If you modify this file, you may extend this\r
27  * exception to your version of the file, but you are not obligated to do so.\r
28  * If you do not wish to do so, delete this exception statement from your version.\r
29  */\r
30 \r
31 package mircoders.global;\r
32 \r
33 import java.util.HashMap;\r
34 import java.util.Iterator;\r
35 import java.util.List;\r
36 import java.util.Map;\r
37 import java.util.Vector;\r
38 \r
39 import mir.config.MirPropertiesConfiguration;\r
40 import mir.config.MirPropertiesConfiguration.PropertiesConfigExc;\r
41 import mir.log.LoggerWrapper;\r
42 import mir.misc.ConfigException;\r
43 import mircoders.accesscontrol.AccessControl;\r
44 import mircoders.entity.EntityComment;\r
45 import mircoders.entity.EntityContent;\r
46 import mircoders.entity.EntityUsers;\r
47 import mircoders.localizer.MirAdminInterfaceLocalizer;\r
48 import mircoders.localizer.MirCachingLocalizerDecorator;\r
49 import mircoders.localizer.MirLocalizer;\r
50 \r
51 public class MirGlobal {\r
52   static private MirPropertiesConfiguration configuration;\r
53   static private MirLocalizer localizer;\r
54   static private ProducerEngine producerEngine;\r
55   static private Abuse abuse;\r
56   static private MRUCache mruCache;\r
57   static private AccessControl accessControl;\r
58   static private Map articleOperations;\r
59   static private Map commentOperations;\r
60   static private Map loggedInUsers = new HashMap();\r
61   static private LoggerWrapper logger = new LoggerWrapper("Global");\r
62   static private LoggerWrapper adminUsageLogger = new LoggerWrapper("AdminUsage");\r
63 \r
64   public synchronized static MirLocalizer localizer() {\r
65     String localizerClassName;\r
66     Class localizerClass;\r
67 \r
68     if (localizer == null ) {\r
69       localizerClassName = config().getString("Mir.Localizer", "mirlocal.localizer.basic.MirBasicLocalizer");\r
70 \r
71       try {\r
72         localizerClass = Class.forName(localizerClassName);\r
73       }\r
74       catch (Throwable t) {\r
75         throw new ConfigException("localizer class '" + localizerClassName + "' not found: " + t.toString());\r
76       }\r
77 \r
78       if (!(MirLocalizer.class.isAssignableFrom(localizerClass)))\r
79         throw new ConfigException("localizer class '" + localizerClassName + "' is not assignable from MirLocalizer");\r
80 \r
81       try {\r
82         localizer = new MirCachingLocalizerDecorator((MirLocalizer) localizerClass.newInstance());\r
83       }\r
84       catch (Throwable t) {\r
85         throw new ConfigException("localizer class '" + localizerClassName + "' cannot be instantiated: " + t.toString());\r
86       }\r
87     }\r
88 \r
89     return localizer;\r
90   }\r
91 \r
92   public static Abuse abuse() {\r
93     if (abuse==null) {\r
94       synchronized(MirGlobal.class) {\r
95         if (abuse==null)\r
96           abuse = new Abuse();\r
97       }\r
98     }\r
99 \r
100     return abuse;\r
101   }\r
102 \r
103   public static MirPropertiesConfiguration config() {\r
104     try {\r
105       return MirPropertiesConfiguration.instance();\r
106     }\r
107     catch (PropertiesConfigExc e) {\r
108       throw new RuntimeException(e.getMessage());\r
109     }\r
110   }\r
111 \r
112   public static ProducerEngine producerEngine() {\r
113     if (producerEngine == null) {\r
114       producerEngine = new ProducerEngine();\r
115     }\r
116 \r
117     return producerEngine;\r
118   }\r
119 \r
120   public static MRUCache mruCache() {\r
121     synchronized(MirGlobal.class) {\r
122       if (mruCache == null) {\r
123         mruCache = new MRUCache();\r
124       }\r
125       return mruCache;\r
126     }\r
127   }\r
128 \r
129   public static synchronized AccessControl accessControl() {\r
130     if (accessControl == null) {\r
131       accessControl=new AccessControl();\r
132     }\r
133 \r
134     return accessControl;\r
135   }\r
136 \r
137   public static void performArticleOperation(EntityUsers aUser, EntityContent  anArticle, String anOperation) {\r
138     MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation = getArticleOperationForName(anOperation);\r
139 \r
140     try {\r
141       if (operation!=null)\r
142         operation.perform(\r
143             localizer().dataModel().adapterModel().makeEntityAdapter("user", aUser),\r
144             localizer().dataModel().adapterModel().makeEntityAdapter("content", anArticle));\r
145     }\r
146     catch (Throwable t) {\r
147       throw new RuntimeException(t.toString());\r
148     }\r
149   }\r
150 \r
151   public static void performCommentOperation(EntityUsers aUser, EntityComment  aComment, String anOperation) {\r
152     MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation = getCommentOperationForName(anOperation);\r
153 \r
154     try {\r
155       if (operation!=null)\r
156         operation.perform(\r
157             localizer().dataModel().adapterModel().makeEntityAdapter("user", aUser),\r
158             localizer().dataModel().adapterModel().makeEntityAdapter("comment", aComment));\r
159     }\r
160     catch (Throwable t) {\r
161       throw new RuntimeException(t.toString());\r
162     }\r
163   }\r
164 \r
165   private synchronized static MirAdminInterfaceLocalizer.MirSimpleEntityOperation getArticleOperationForName(String aName) {\r
166     try {\r
167       if (articleOperations == null) {\r
168         articleOperations = new HashMap();\r
169         Iterator i = localizer().adminInterface().simpleArticleOperations().iterator();\r
170         while (i.hasNext()) {\r
171           MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation = (MirAdminInterfaceLocalizer.MirSimpleEntityOperation) i.next();\r
172           articleOperations.put(operation.getName(), operation);\r
173         }\r
174       }\r
175 \r
176       return (MirAdminInterfaceLocalizer.MirSimpleEntityOperation) articleOperations.get(aName);\r
177     }\r
178     catch (Throwable t) {\r
179       throw new RuntimeException(t.toString());\r
180     }\r
181   }\r
182 \r
183   private synchronized static MirAdminInterfaceLocalizer.MirSimpleEntityOperation getCommentOperationForName(String aName) {\r
184     try {\r
185       if (commentOperations == null) {\r
186         commentOperations = new HashMap();\r
187         Iterator i = localizer().adminInterface().simpleCommentOperations().iterator();\r
188         while (i.hasNext()) {\r
189           MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation = (MirAdminInterfaceLocalizer.MirSimpleEntityOperation) i.next();\r
190           commentOperations.put(operation.getName(), operation);\r
191         }\r
192       }\r
193 \r
194       return (MirAdminInterfaceLocalizer.MirSimpleEntityOperation) commentOperations.get(aName);\r
195     }\r
196     catch (Throwable t) {\r
197       throw new RuntimeException(t.toString());\r
198     }\r
199   }\r
200 \r
201 \r
202   public static List getLoggedInUsers() {\r
203     List result = new Vector();\r
204 \r
205     synchronized (loggedInUsers) {\r
206       Iterator i = loggedInUsers.entrySet().iterator();\r
207 \r
208       while (i.hasNext()) {\r
209         Map.Entry entry = (Map.Entry) i.next();\r
210 \r
211         Map item = new HashMap();\r
212         item.put("name", entry.getKey());\r
213         item.put("count", entry.getValue());\r
214         result.add(item);\r
215       }\r
216     }\r
217 \r
218     return result;\r
219   }\r
220 \r
221   public static void registerLogin(String aName) {\r
222     modifyLoggedInCount(aName, 1);\r
223   }\r
224 \r
225   public static void registerLogout(String aName) {\r
226     modifyLoggedInCount(aName, -1);\r
227   }\r
228 \r
229   private static void modifyLoggedInCount(String aName, int aModifier) {\r
230     synchronized (loggedInUsers) {\r
231       Integer count = (Integer) loggedInUsers.get(aName);\r
232       if (count==null)\r
233         count = new Integer(0);\r
234 \r
235       if (count.intValue()+aModifier<=0) {\r
236         loggedInUsers.remove(aName);\r
237       }\r
238       else {\r
239         loggedInUsers.put(aName, new Integer(count.intValue() + aModifier));\r
240       }\r
241     }\r
242   }\r
243 \r
244   public static void logAdminUsage(EntityUsers aUser, String anObject, String aDescription) {\r
245     try {\r
246       String user = "unknown (" + aUser.toString() +")";\r
247       if (aUser!=null)\r
248         user = aUser.getValue("login");\r
249       adminUsageLogger.info(user + " | " + anObject + " | " + aDescription);\r
250     }\r
251     catch (Throwable t) {\r
252       logger.error("Error while logging admin usage ("+aUser.toString()+", "+aDescription+"): " +t.toString());\r
253     }\r
254   }\r
255 }\r
256 \r
257 \r