support for translations + lots of misc. fixes
[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 the com.oreilly.servlet library, any library\r
22  * licensed under the Apache Software License, The Sun (tm) Java Advanced\r
23  * Imaging library (JAI), The Sun JIMI library (or with modified versions of\r
24  * the above that use the same license as the above), and distribute linked\r
25  * combinations including the two.  You must obey the GNU General Public\r
26  * License in all respects for all of the code used other than the above\r
27  * mentioned libraries.  If you modify this file, you may extend this exception\r
28  * to your version of the file, but you are not obligated to do so.  If you do\r
29  * not wish to do so, delete this exception statement from your version.\r
30  */\r
31 \r
32 package mircoders.localizer.basic;\r
33 \r
34 import java.text.SimpleDateFormat;\r
35 import java.util.GregorianCalendar;\r
36 import java.util.HashMap;\r
37 import java.util.List;\r
38 import java.util.Map;\r
39 import java.util.Vector;\r
40 \r
41 import mir.entity.Entity;\r
42 import mir.entity.adapter.EntityAdapter;\r
43 import mir.storage.StorageObjectFailure;\r
44 import mir.misc.StringUtil;\r
45 import mir.util.StringRoutines;\r
46 import mircoders.entity.EntityComment;\r
47 import mircoders.entity.EntityContent;\r
48 import mircoders.localizer.MirAdminInterfaceLocalizer;\r
49 import mircoders.localizer.MirLocalizerExc;\r
50 import mircoders.localizer.MirLocalizerFailure;\r
51 import mircoders.storage.DatabaseContent;\r
52 \r
53 \r
54 public class MirBasicAdminInterfaceLocalizer implements MirAdminInterfaceLocalizer {\r
55   private Vector simpleCommentOperations;\r
56   private Vector simpleArticleOperations;\r
57   private Map simpleCommentOperationsMap;\r
58   private Map simpleArticleOperationsMap;\r
59   private static SimpleDateFormat dateFormatter = new SimpleDateFormat("dd.MM.yyyy HH:mm");\r
60 \r
61   public MirBasicAdminInterfaceLocalizer() throws MirLocalizerFailure, MirLocalizerExc {\r
62     simpleCommentOperations = new Vector();\r
63     simpleArticleOperations = new Vector();\r
64     simpleCommentOperationsMap = new HashMap();\r
65     simpleArticleOperationsMap = new HashMap();\r
66 \r
67     addSimpleArticleOperation(new ChangeArticleFieldOperation("newswire", "to_article_type", "0", "1", false));\r
68     addSimpleArticleOperation(new ModifyArticleFieldOperation("unhide", "is_published", "1", false));\r
69     addSimpleArticleOperation(new ModifyArticleFieldOperation("hide", "is_published", "0", false));\r
70 \r
71     addSimpleCommentOperation(new ModifyCommentFieldOperation("unhide", "is_published", "1"));\r
72     addSimpleCommentOperation(new ModifyCommentFieldOperation("hide", "is_published", "0"));\r
73   }\r
74 \r
75   public void initializeArticle(Map anArticle) {\r
76     anArticle.put("is_published", "0");\r
77     anArticle.put("date", StringUtil.date2webdbDate(new GregorianCalendar()));\r
78   };\r
79 \r
80   public List simpleCommentOperations() {\r
81     return simpleCommentOperations;\r
82   };\r
83 \r
84   public List simpleArticleOperations() {\r
85     return simpleArticleOperations;\r
86   };\r
87 \r
88   public MirSimpleEntityOperation simpleArticleOperationForName(String aName) {\r
89     return (MirSimpleEntityOperation) simpleArticleOperationsMap.get(aName);\r
90   };\r
91 \r
92   public MirSimpleEntityOperation simpleCommentOperationForName(String aName) {\r
93     return (MirSimpleEntityOperation) simpleCommentOperationsMap.get(aName);\r
94   };\r
95 \r
96   public void removeSimpleArticleOperation(String aName) {\r
97     simpleArticleOperations.remove(simpleArticleOperationsMap.get(aName));\r
98     simpleArticleOperationsMap.remove(aName);\r
99   }\r
100 \r
101   public void addSimpleArticleOperation(MirSimpleEntityOperation anOperation) {\r
102     removeSimpleArticleOperation(anOperation.getName());\r
103     simpleArticleOperationsMap.put(anOperation.getName(), anOperation);\r
104     simpleArticleOperations.add(anOperation);\r
105   }\r
106 \r
107   public void removeSimpleCommentOperation(String aName) {\r
108     simpleCommentOperations.remove(simpleCommentOperationsMap.get(aName));\r
109     simpleCommentOperationsMap.remove(aName);\r
110   }\r
111 \r
112   public void addSimpleCommentOperation(MirSimpleEntityOperation anOperation) {\r
113     removeSimpleCommentOperation(anOperation.getName());\r
114     simpleCommentOperationsMap.put(anOperation.getName(), anOperation);\r
115     simpleCommentOperations.add(anOperation);\r
116   }\r
117 \r
118   protected abstract static class EntityModifyingOperation implements MirSimpleEntityOperation {\r
119     private String name;\r
120 \r
121     protected EntityModifyingOperation(String aName) {\r
122       name = aName;\r
123     }\r
124 \r
125     public String getName() {\r
126       return name;\r
127     };\r
128 \r
129     public boolean isAvailable(EntityAdapter anEntity) {\r
130       try {\r
131         Entity entity = anEntity.getEntity();\r
132         return isAvailable(entity);\r
133       }\r
134       catch (Throwable t) {\r
135         return false;\r
136       }\r
137     };\r
138 \r
139     public void perform(EntityAdapter aUser, EntityAdapter anEntity) {\r
140       Entity entity = anEntity.getEntity();\r
141       try {\r
142         performModification(aUser, entity);\r
143         entity.update();\r
144       }\r
145       catch (Throwable t) {\r
146       }\r
147     };\r
148 \r
149     protected abstract boolean isAvailable(Entity anEntity) throws StorageObjectFailure ;\r
150     protected abstract void performModification(EntityAdapter aUser, Entity anEntity) throws StorageObjectFailure ;\r
151   }\r
152 \r
153   public static abstract class CommentModifyingOperation extends EntityModifyingOperation {\r
154     public CommentModifyingOperation(String aName) {\r
155       super(aName);\r
156     }\r
157 \r
158     protected boolean isAvailable(Entity anEntity) throws StorageObjectFailure {\r
159       return anEntity instanceof EntityComment && isAvailable((EntityComment) anEntity);\r
160     }\r
161 \r
162     protected void performModification(EntityAdapter aUser, Entity anEntity) throws StorageObjectFailure {\r
163       performModification(aUser, (EntityComment) anEntity);\r
164       DatabaseContent.getInstance().setUnproduced("id="+anEntity.getValue("to_media"));\r
165     };\r
166 \r
167     protected abstract boolean isAvailable(EntityComment aComment) throws StorageObjectFailure ;\r
168     protected abstract void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure ;\r
169   }\r
170 \r
171   public static abstract class ArticleModifyingOperation extends EntityModifyingOperation {\r
172     private boolean logOperation;\r
173 \r
174     public ArticleModifyingOperation(String aName, boolean aLogOperation) {\r
175       super(aName);\r
176 \r
177       logOperation = aLogOperation;\r
178     }\r
179 \r
180     protected boolean isAvailable(Entity anEntity) throws StorageObjectFailure {\r
181       return anEntity instanceof EntityContent && isAvailable((EntityContent) anEntity);\r
182     }\r
183 \r
184     protected void performModification(EntityAdapter aUser, Entity anEntity) throws StorageObjectFailure {\r
185       performModification(aUser, (EntityContent) anEntity);\r
186       anEntity.setValueForProperty("is_produced", "0");\r
187 \r
188       if (logOperation) {\r
189         StringBuffer comment = new StringBuffer();\r
190         try {\r
191           comment.append(StringRoutines.interpretAsString(anEntity.getValue("comment")));\r
192         }\r
193         catch (Throwable t) {\r
194         }\r
195         if (comment.length()>0 && comment.charAt(comment.length()-1)!='\n') {\r
196           comment.append('\n');\r
197         }\r
198         comment.append(dateFormatter.format((new GregorianCalendar()).getTime()));\r
199         comment.append(" ");\r
200         try {\r
201           comment.append(StringRoutines.interpretAsString(aUser.get("login")));\r
202         }\r
203         catch (Throwable t) {\r
204         }\r
205         comment.append(" ");\r
206         comment.append(getName());\r
207         anEntity.setValueForProperty("comment", comment.toString());\r
208       }\r
209     };\r
210 \r
211     protected abstract boolean isAvailable(EntityContent anArticle) throws StorageObjectFailure ;\r
212     protected abstract void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure ;\r
213   }\r
214 \r
215   protected static class SetCommentFieldOperation extends CommentModifyingOperation {\r
216     private String field;\r
217     private String value;\r
218 \r
219     public SetCommentFieldOperation(String aName, String aField, String aValue) {\r
220       super(aName);\r
221 \r
222       field = aField;\r
223       value = aValue;\r
224     }\r
225 \r
226     protected boolean isAvailable(EntityComment aComment) {\r
227       return true;\r
228     }\r
229 \r
230     protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {\r
231       aComment.setValueForProperty(field, value);\r
232     }\r
233   }\r
234 \r
235   protected static class ModifyCommentFieldOperation extends CommentModifyingOperation {\r
236     private String field;\r
237     private String value;\r
238 \r
239     public ModifyCommentFieldOperation(String aName, String aField, String aValue) {\r
240       super(aName);\r
241 \r
242       field = aField;\r
243       value = aValue;\r
244     }\r
245 \r
246     protected boolean isAvailable(EntityComment aComment) {\r
247       return aComment.getValue(field) == null || !aComment.getValue(field).equals(value);\r
248     }\r
249 \r
250     protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {\r
251       aComment.setValueForProperty(field, value);\r
252     }\r
253   }\r
254 \r
255   protected static class SetArticleFieldOperation extends ArticleModifyingOperation {\r
256     private String field;\r
257     private String value;\r
258 \r
259     public SetArticleFieldOperation(String aName, String aField, String aValue, boolean aLogOperation) {\r
260       super(aName, aLogOperation);\r
261 \r
262       field = aField;\r
263       value = aValue;\r
264     }\r
265 \r
266     protected boolean isAvailable(EntityContent anArticle) {\r
267       return true;\r
268     }\r
269 \r
270     protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {\r
271       anArticle.setValueForProperty(field, value);\r
272     }\r
273   }\r
274 \r
275   protected static class ModifyArticleFieldOperation extends ArticleModifyingOperation {\r
276     private String field;\r
277     private String value;\r
278 \r
279     public ModifyArticleFieldOperation(String aName, String aField, String aValue, boolean aLogOperation) {\r
280       super(aName, aLogOperation);\r
281 \r
282       field = aField;\r
283       value = aValue;\r
284     }\r
285 \r
286     protected boolean isAvailable(EntityContent anArticle) {\r
287       return anArticle.getValue(field) == null || !anArticle.getValue(field).equals(value);\r
288     }\r
289 \r
290     protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {\r
291       anArticle.setValueForProperty(field, value);\r
292     }\r
293   }\r
294 \r
295   protected static class ChangeArticleFieldOperation extends ArticleModifyingOperation {\r
296     private String field;\r
297     private String oldValue;\r
298     private String newValue;\r
299 \r
300     public ChangeArticleFieldOperation(String aName, String aField, String anOldValue, String aNewValue, boolean aLogOperation) {\r
301       super(aName, aLogOperation);\r
302 \r
303       field = aField;\r
304       newValue = aNewValue;\r
305       oldValue = anOldValue;\r
306     }\r
307 \r
308     protected boolean isAvailable(EntityContent anArticle) {\r
309       return anArticle.getValue(field) != null && anArticle.getValue(field).equals(oldValue);\r
310     }\r
311 \r
312     protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {\r
313       anArticle.setValueForProperty(field, newValue);\r
314     }\r
315   }\r
316 }\r