2 bugfixes...
[mir.git] / source / mircoders / localizer / basic / MirBasicAdminInterfaceLocalizer.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.localizer.basic;\r
32 \r
33 import java.util.Arrays;\r
34 import java.util.GregorianCalendar;\r
35 import java.util.HashMap;\r
36 import java.util.HashSet;\r
37 import java.util.Iterator;\r
38 import java.util.List;\r
39 import java.util.Map;\r
40 import java.util.Set;\r
41 import java.util.Vector;\r
42 \r
43 import mir.entity.Entity;\r
44 import mir.log.*;\r
45 import mir.entity.adapter.EntityAdapter;\r
46 import mir.misc.StringUtil;\r
47 import mir.storage.StorageObjectFailure;\r
48 import mir.util.DateTimeFunctions;\r
49 import mircoders.entity.EntityComment;\r
50 import mircoders.entity.EntityContent;\r
51 import mircoders.global.MirGlobal;\r
52 import mircoders.localizer.MirAdminInterfaceLocalizer;\r
53 import mircoders.localizer.MirAdminInterfaceLocalizer.MirSimpleEntityOperation;\r
54 import mircoders.localizer.MirLocalizerExc;\r
55 import mircoders.localizer.MirLocalizerFailure;\r
56 import mircoders.storage.DatabaseContent;\r
57 \r
58 \r
59 public class MirBasicAdminInterfaceLocalizer implements MirAdminInterfaceLocalizer {\r
60   private Vector simpleCommentOperations;\r
61   private Vector simpleArticleOperations;\r
62   private Map simpleCommentOperationsMap;\r
63   private Map simpleArticleOperationsMap;\r
64   protected static LoggerWrapper logger = new LoggerWrapper("Localizer.AdminInterface");;\r
65 \r
66   public MirBasicAdminInterfaceLocalizer() throws MirLocalizerFailure, MirLocalizerExc {\r
67 \r
68     simpleCommentOperations = new Vector();\r
69     simpleArticleOperations = new Vector();\r
70     simpleCommentOperationsMap = new HashMap();\r
71     simpleArticleOperationsMap = new HashMap();\r
72 \r
73     addSimpleArticleOperation(new ChangeArticleFieldOperation("newswire", "to_article_type", "0", "1", false));\r
74     addSimpleArticleOperation(new ModifyArticleFieldOperation("unhide", "is_published", "1", false));\r
75     addSimpleArticleOperation(new ModifyArticleFieldOperation("hide", "is_published", "0", false));\r
76 \r
77     addSimpleCommentOperation(new ModifyCommentFieldOperation("unhide", "is_published", "1"));\r
78     addSimpleCommentOperation(new ModifyCommentFieldOperation("hide", "is_published", "0"));\r
79   }\r
80 \r
81   public String makePasswordDigest(String aPassword) {\r
82     return aPassword;\r
83   }\r
84 \r
85   public void initializeArticle(Map anArticle) {\r
86     anArticle.put("is_published", "0");\r
87     anArticle.put("date", StringUtil.date2webdbDate(new GregorianCalendar()));\r
88   };\r
89 \r
90   public List simpleCommentOperations() {\r
91     return simpleCommentOperations;\r
92   };\r
93 \r
94   public List simpleArticleOperations() {\r
95     return simpleArticleOperations;\r
96   };\r
97 \r
98   public MirSimpleEntityOperation simpleArticleOperationForName(String aName) {\r
99     return (MirSimpleEntityOperation) simpleArticleOperationsMap.get(aName);\r
100   };\r
101 \r
102   public MirSimpleEntityOperation simpleCommentOperationForName(String aName) {\r
103     return (MirSimpleEntityOperation) simpleCommentOperationsMap.get(aName);\r
104   };\r
105 \r
106   public void removeSimpleArticleOperation(String aName) {\r
107     simpleArticleOperations.remove(simpleArticleOperationsMap.get(aName));\r
108     simpleArticleOperationsMap.remove(aName);\r
109   }\r
110 \r
111   public void addSimpleArticleOperation(MirSimpleEntityOperation anOperation) {\r
112     removeSimpleArticleOperation(anOperation.getName());\r
113     simpleArticleOperationsMap.put(anOperation.getName(), anOperation);\r
114     simpleArticleOperations.add(anOperation);\r
115   }\r
116 \r
117   public void removeSimpleCommentOperation(String aName) {\r
118     simpleCommentOperations.remove(simpleCommentOperationsMap.get(aName));\r
119     simpleCommentOperationsMap.remove(aName);\r
120   }\r
121 \r
122   public void addSimpleCommentOperation(MirSimpleEntityOperation anOperation) {\r
123     removeSimpleCommentOperation(anOperation.getName());\r
124     simpleCommentOperationsMap.put(anOperation.getName(), anOperation);\r
125     simpleCommentOperations.add(anOperation);\r
126   }\r
127 \r
128   protected abstract static class EntityModifyingOperation implements MirSimpleEntityOperation {\r
129     private String name;\r
130 \r
131     protected EntityModifyingOperation(String aName) {\r
132       name = aName;\r
133     }\r
134 \r
135     public String getName() {\r
136       return name;\r
137     };\r
138 \r
139     public boolean isAvailable(EntityAdapter anEntity) {\r
140       try {\r
141         Entity entity = anEntity.getEntity();\r
142         return isAvailable(entity);\r
143       }\r
144       catch (Throwable t) {\r
145         return false;\r
146       }\r
147     };\r
148 \r
149     public void perform(EntityAdapter aUser, EntityAdapter anEntity) throws MirLocalizerExc, MirLocalizerFailure {\r
150       Entity entity = anEntity.getEntity();\r
151       try {\r
152         performModification(aUser, entity);\r
153         entity.update();\r
154       }\r
155       catch (Throwable t) {\r
156         throw new MirLocalizerFailure(t);\r
157       }\r
158     };\r
159 \r
160     protected abstract boolean isAvailable(Entity anEntity) throws StorageObjectFailure ;\r
161     protected abstract void performModification(EntityAdapter aUser, Entity anEntity)  throws MirLocalizerExc, MirLocalizerFailure ;\r
162   }\r
163 \r
164   public static abstract class CommentModifyingOperation extends EntityModifyingOperation {\r
165     public CommentModifyingOperation(String aName) {\r
166       super(aName);\r
167     }\r
168 \r
169     protected boolean isAvailable(Entity anEntity) throws StorageObjectFailure {\r
170       return anEntity instanceof EntityComment && isAvailable((EntityComment) anEntity);\r
171     }\r
172 \r
173     protected void performModification(EntityAdapter aUser, Entity anEntity) throws StorageObjectFailure {\r
174       performModification(aUser, (EntityComment) anEntity);\r
175       DatabaseContent.getInstance().setUnproduced("id="+anEntity.getValue("to_media"));\r
176     };\r
177 \r
178     protected abstract boolean isAvailable(EntityComment aComment) throws StorageObjectFailure ;\r
179     protected abstract void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure ;\r
180   }\r
181 \r
182   public static abstract class ArticleModifyingOperation extends EntityModifyingOperation {\r
183     private boolean logOperation;\r
184 \r
185     public ArticleModifyingOperation(String aName, boolean aLogOperation) {\r
186       super(aName);\r
187 \r
188       logOperation = aLogOperation;\r
189     }\r
190 \r
191     protected boolean isAvailable(Entity anEntity) throws StorageObjectFailure {\r
192       return anEntity instanceof EntityContent && isAvailable((EntityContent) anEntity);\r
193     }\r
194 \r
195     protected void performModification(EntityAdapter aUser, Entity anEntity) throws StorageObjectFailure {\r
196       performModification(aUser, (EntityContent) anEntity);\r
197       anEntity.setValueForProperty("is_produced", "0");\r
198 \r
199       if (logOperation) {\r
200         try {\r
201           StringBuffer line = new StringBuffer();\r
202 \r
203           line.append(DateTimeFunctions.advancedDateFormat(\r
204               MirGlobal.config().getString("Mir.DefaultDateTimeFormat"),\r
205               (new GregorianCalendar()).getTime(),\r
206               MirGlobal.config().getString("Mir.DefaultTimezone")));\r
207           line.append(" ");\r
208           if (aUser != null)\r
209             line.append(aUser.get("login"));\r
210           else\r
211             line.append("unknown");\r
212 \r
213           line.append(" ");\r
214           line.append(getName());\r
215           ( (EntityContent) anEntity).appendToComments(line.toString());\r
216         }\r
217         catch (Throwable t) {\r
218           logger.error("Error while trying to log an article operation: " + t.toString());\r
219         }\r
220       }\r
221     };\r
222 \r
223     protected abstract boolean isAvailable(EntityContent anArticle) throws StorageObjectFailure ;\r
224     protected abstract void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure ;\r
225   }\r
226 \r
227   protected static class SetCommentFieldOperation extends CommentModifyingOperation {\r
228     private String field;\r
229     private String value;\r
230 \r
231     public SetCommentFieldOperation(String aName, String aField, String aValue) {\r
232       super(aName);\r
233 \r
234       field = aField;\r
235       value = aValue;\r
236     }\r
237 \r
238     protected boolean isAvailable(EntityComment aComment) {\r
239       return true;\r
240     }\r
241 \r
242     protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {\r
243       aComment.setValueForProperty(field, value);\r
244     }\r
245   }\r
246 \r
247   protected static class SetCommentFieldsOperation extends CommentModifyingOperation {\r
248     private Map values;\r
249 \r
250     public SetCommentFieldsOperation(String aName, String aFields[], String aValues[]) throws MirLocalizerExc {\r
251       super(aName);\r
252 \r
253       values = new HashMap();\r
254 \r
255       for (int i=0; i<aFields.length; i++)\r
256         values.put(aFields[i], aValues[i]);\r
257     }\r
258 \r
259     protected boolean isAvailable(EntityComment aComment) {\r
260       return true;\r
261     }\r
262 \r
263     protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {\r
264       Iterator i = values.entrySet().iterator();\r
265 \r
266       while (i.hasNext()) {\r
267         Map.Entry entry = (Map.Entry) i.next();\r
268         aComment.setValueForProperty((String) entry.getKey(), (String) entry.getValue());\r
269       }\r
270     }\r
271   }\r
272 \r
273 \r
274   protected static class ModifyCommentFieldOperation extends CommentModifyingOperation {\r
275     private String field;\r
276     private String value;\r
277 \r
278     public ModifyCommentFieldOperation(String aName, String aField, String aValue) {\r
279       super(aName);\r
280 \r
281       field = aField;\r
282       value = aValue;\r
283     }\r
284 \r
285     protected boolean isAvailable(EntityComment aComment) {\r
286       return aComment.getValue(field) == null || !aComment.getValue(field).equals(value);\r
287     }\r
288 \r
289     protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {\r
290       aComment.setValueForProperty(field, value);\r
291     }\r
292   }\r
293 \r
294   protected static class SetArticleFieldOperation extends ArticleModifyingOperation {\r
295     private String field;\r
296     private String value;\r
297 \r
298     public SetArticleFieldOperation(String aName, String aField, String aValue, boolean aLogOperation) {\r
299       super(aName, aLogOperation);\r
300 \r
301       field = aField;\r
302       value = aValue;\r
303     }\r
304 \r
305     protected boolean isAvailable(EntityContent anArticle) {\r
306       return true;\r
307     }\r
308 \r
309     protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {\r
310       anArticle.setValueForProperty(field, value);\r
311     }\r
312   }\r
313 \r
314   protected static class ModifyArticleFieldOperation extends ArticleModifyingOperation {\r
315     private String field;\r
316     private String value;\r
317 \r
318     public ModifyArticleFieldOperation(String aName, String aField, String aValue, boolean aLogOperation) {\r
319       super(aName, aLogOperation);\r
320 \r
321       field = aField;\r
322       value = aValue;\r
323     }\r
324 \r
325     protected boolean isAvailable(EntityContent anArticle) {\r
326       return anArticle.getValue(field) == null || !anArticle.getValue(field).equals(value);\r
327     }\r
328 \r
329     protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {\r
330       anArticle.setValueForProperty(field, value);\r
331     }\r
332   }\r
333 \r
334   protected static class ChangeArticleFieldOperation extends ArticleModifyingOperation {\r
335     private String field;\r
336     private Set oldValues;\r
337     private String newValue;\r
338 \r
339     public ChangeArticleFieldOperation(String aName, String aField, String anOldValues[], String aNewValue, boolean aLogOperation) {\r
340       super(aName, aLogOperation);\r
341 \r
342       field = aField;\r
343       newValue = aNewValue;\r
344       oldValues = new HashSet(Arrays.asList(anOldValues));\r
345     }\r
346     public ChangeArticleFieldOperation(String aName, String aField, String anOldValue, String aNewValue, boolean aLogOperation) {\r
347       this(aName, aField, new String[] {anOldValue}, aNewValue, aLogOperation);\r
348     }\r
349 \r
350     protected boolean isAvailable(EntityContent anArticle) {\r
351       return anArticle.getValue(field) != null && oldValues.contains(anArticle.getValue(field));\r
352     }\r
353 \r
354     protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {\r
355       anArticle.setValueForProperty(field, newValue);\r
356     }\r
357   }\r
358 }\r