2 * Copyright (C) 2001, 2002 The Mir-coders group
4 * This file is part of Mir.
6 * Mir is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * Mir is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with Mir; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * In addition, as a special exception, The Mir-coders gives permission to link
21 * the code of this program with any library licensed under the Apache Software License,
22 * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library
23 * (or with modified versions of the above that use the same license as the above),
24 * and distribute linked combinations including the two. You must obey the
25 * GNU General Public License in all respects for all of the code used other than
26 * the above mentioned libraries. If you modify this file, you may extend this
27 * exception to your version of the file, but you are not obligated to do so.
28 * If you do not wish to do so, delete this exception statement from your version.
31 package mircoders.localizer.basic;
33 import java.util.Arrays;
34 import java.util.GregorianCalendar;
35 import java.util.HashMap;
36 import java.util.HashSet;
37 import java.util.Iterator;
38 import java.util.List;
41 import java.util.Vector;
43 import mir.entity.Entity;
44 import mir.entity.adapter.EntityAdapter;
45 import mir.log.LoggerWrapper;
46 import mir.misc.StringUtil;
47 import mir.storage.StorageObjectFailure;
48 import mir.util.DateTimeFunctions;
49 import mir.util.EntityUtility;
50 import mircoders.entity.EntityComment;
51 import mircoders.entity.EntityContent;
52 import mircoders.global.MirGlobal;
53 import mircoders.localizer.MirAdminInterfaceLocalizer;
54 import mircoders.localizer.MirLocalizerExc;
55 import mircoders.localizer.MirLocalizerFailure;
56 import mircoders.storage.DatabaseContent;
59 public class MirBasicAdminInterfaceLocalizer implements MirAdminInterfaceLocalizer {
60 private Vector simpleCommentOperations;
61 private Vector simpleArticleOperations;
62 private Map simpleCommentOperationsMap;
63 private Map simpleArticleOperationsMap;
64 protected static LoggerWrapper logger = new LoggerWrapper("Localizer.AdminInterface");;
66 public MirBasicAdminInterfaceLocalizer() throws MirLocalizerFailure, MirLocalizerExc {
68 simpleCommentOperations = new Vector();
69 simpleArticleOperations = new Vector();
70 simpleCommentOperationsMap = new HashMap();
71 simpleArticleOperationsMap = new HashMap();
73 addSimpleArticleOperation(new ChangeArticleFieldOperation("newswire", "to_article_type", "0", "1", false));
74 addSimpleArticleOperation(new ModifyArticleFieldOperation("unhide", "is_published", "1", false));
75 addSimpleArticleOperation(new ModifyArticleFieldOperation("hide", "is_published", "0", false));
77 addSimpleCommentOperation(new ModifyCommentFieldOperation("unhide", "is_published", "1"));
78 addSimpleCommentOperation(new ModifyCommentFieldOperation("hide", "is_published", "0"));
81 public String getAdminPageGenerator(String aPage, Map aTemplateData, EntityAdapter aUser, String aDefault) {
85 public String makePasswordDigest(String aPassword) {
89 public void initializeArticle(Map anArticle) {
90 anArticle.put("is_published", "0");
91 anArticle.put("date", StringUtil.date2webdbDate(new GregorianCalendar()));
94 public List simpleCommentOperations() {
95 return simpleCommentOperations;
98 public List simpleArticleOperations() {
99 return simpleArticleOperations;
102 public MirSimpleEntityOperation simpleArticleOperationForName(String aName) {
103 return (MirSimpleEntityOperation) simpleArticleOperationsMap.get(aName);
106 public MirSimpleEntityOperation simpleCommentOperationForName(String aName) {
107 return (MirSimpleEntityOperation) simpleCommentOperationsMap.get(aName);
110 public void removeSimpleArticleOperation(String aName) {
111 simpleArticleOperations.remove(simpleArticleOperationsMap.get(aName));
112 simpleArticleOperationsMap.remove(aName);
115 public void addSimpleArticleOperation(MirSimpleEntityOperation anOperation) {
116 removeSimpleArticleOperation(anOperation.getName());
117 simpleArticleOperationsMap.put(anOperation.getName(), anOperation);
118 simpleArticleOperations.add(anOperation);
121 public void removeSimpleCommentOperation(String aName) {
122 simpleCommentOperations.remove(simpleCommentOperationsMap.get(aName));
123 simpleCommentOperationsMap.remove(aName);
126 public void addSimpleCommentOperation(MirSimpleEntityOperation anOperation) {
127 removeSimpleCommentOperation(anOperation.getName());
128 simpleCommentOperationsMap.put(anOperation.getName(), anOperation);
129 simpleCommentOperations.add(anOperation);
132 protected abstract static class EntityModifyingOperation implements MirSimpleEntityOperation {
134 private boolean logOperation;
136 protected EntityModifyingOperation(String aName, boolean aLogOperation) {
138 logOperation = aLogOperation;
141 public String getName() {
145 public boolean isAvailable(EntityAdapter anEntity) {
147 Entity entity = anEntity.getEntity();
148 return isAvailable(entity);
150 catch (Throwable t) {
155 public void perform(EntityAdapter aUser, EntityAdapter anEntity) throws MirLocalizerExc, MirLocalizerFailure {
156 Entity entity = anEntity.getEntity();
158 performModification(aUser, entity);
162 StringBuffer line = new StringBuffer();
164 line.append(DateTimeFunctions.advancedDateFormat(
165 MirGlobal.config().getString("Mir.DefaultDateTimeFormat"),
166 (new GregorianCalendar()).getTime(),
167 MirGlobal.config().getString("Mir.DefaultTimezone")));
170 line.append(aUser.get("login"));
172 line.append("unknown");
175 line.append(getName());
176 EntityUtility.appendLineToField(entity, "comment", line.toString());
178 catch (Throwable t) {
179 logger.error("Error while trying to log an article operation: " + t.toString());
185 catch (Throwable t) {
186 throw new MirLocalizerFailure(t);
190 protected abstract boolean isAvailable(Entity anEntity) throws StorageObjectFailure ;
191 protected abstract void performModification(EntityAdapter aUser, Entity anEntity) throws MirLocalizerExc, MirLocalizerFailure ;
194 public static abstract class CommentModifyingOperation extends EntityModifyingOperation {
195 public CommentModifyingOperation(String aName, boolean aLogOperation) {
196 super(aName, aLogOperation);
199 public CommentModifyingOperation(String aName) {
203 protected boolean isAvailable(Entity anEntity) throws StorageObjectFailure {
204 return anEntity instanceof EntityComment && isAvailable((EntityComment) anEntity);
207 protected void performModification(EntityAdapter aUser, Entity anEntity) throws StorageObjectFailure {
208 performModification(aUser, (EntityComment) anEntity);
209 DatabaseContent.getInstance().setUnproduced("id="+anEntity.getFieldValue("to_media"));
212 protected abstract boolean isAvailable(EntityComment aComment) throws StorageObjectFailure ;
213 protected abstract void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure ;
216 public static abstract class ArticleModifyingOperation extends EntityModifyingOperation {
217 public ArticleModifyingOperation(String aName, boolean aLogOperation) {
218 super(aName, aLogOperation);
221 protected boolean isAvailable(Entity anEntity) throws StorageObjectFailure {
222 return anEntity instanceof EntityContent && isAvailable((EntityContent) anEntity);
225 protected void performModification(EntityAdapter aUser, Entity anEntity) throws StorageObjectFailure {
226 performModification(aUser, (EntityContent) anEntity);
227 anEntity.setFieldValue("is_produced", "0");
230 protected abstract boolean isAvailable(EntityContent anArticle) throws StorageObjectFailure ;
231 protected abstract void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure ;
234 protected static class SetCommentFieldOperation extends CommentModifyingOperation {
235 private String field;
236 private String value;
238 public SetCommentFieldOperation(String aName, String aField, String aValue) {
245 protected boolean isAvailable(EntityComment aComment) {
249 protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {
250 aComment.setFieldValue(field, value);
254 protected static class SetCommentFieldsOperation extends CommentModifyingOperation {
257 public SetCommentFieldsOperation(String aName, String aFields[], String aValues[]) throws MirLocalizerExc {
260 values = new HashMap();
262 for (int i=0; i<aFields.length; i++)
263 values.put(aFields[i], aValues[i]);
266 protected boolean isAvailable(EntityComment aComment) {
270 protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {
271 Iterator i = values.entrySet().iterator();
273 while (i.hasNext()) {
274 Map.Entry entry = (Map.Entry) i.next();
275 aComment.setFieldValue((String) entry.getKey(), (String) entry.getValue());
281 protected static class ModifyCommentFieldOperation extends CommentModifyingOperation {
282 private String field;
283 private String value;
285 public ModifyCommentFieldOperation(String aName, String aField, String aValue) {
292 protected boolean isAvailable(EntityComment aComment) {
293 return aComment.getFieldValue(field) == null || !aComment.getFieldValue(field).equals(value);
296 protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {
297 aComment.setFieldValue(field, value);
301 protected static class SetArticleFieldOperation extends ArticleModifyingOperation {
302 private String field;
303 private String value;
305 public SetArticleFieldOperation(String aName, String aField, String aValue, boolean aLogOperation) {
306 super(aName, aLogOperation);
312 protected boolean isAvailable(EntityContent anArticle) {
316 protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {
317 anArticle.setFieldValue(field, value);
321 protected static class ModifyArticleFieldOperation extends ArticleModifyingOperation {
322 private String field;
323 private String value;
325 public ModifyArticleFieldOperation(String aName, String aField, String aValue, boolean aLogOperation) {
326 super(aName, aLogOperation);
332 protected boolean isAvailable(EntityContent anArticle) {
333 return anArticle.getFieldValue(field) == null || !anArticle.getFieldValue(field).equals(value);
336 protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {
337 anArticle.setFieldValue(field, value);
341 protected static class ChangeArticleFieldOperation extends ArticleModifyingOperation {
342 private String field;
343 private Set oldValues;
344 private String newValue;
346 public ChangeArticleFieldOperation(String aName, String aField, String anOldValues[], String aNewValue, boolean aLogOperation) {
347 super(aName, aLogOperation);
350 newValue = aNewValue;
351 oldValues = new HashSet(Arrays.asList(anOldValues));
353 public ChangeArticleFieldOperation(String aName, String aField, String anOldValue, String aNewValue, boolean aLogOperation) {
354 this(aName, aField, new String[] {anOldValue}, aNewValue, aLogOperation);
357 protected boolean isAvailable(EntityContent anArticle) {
358 return anArticle.getFieldValue(field) != null && oldValues.contains(anArticle.getFieldValue(field));
361 protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {
362 anArticle.setFieldValue(field, newValue);