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 mircoders.entity.EntityComment;
50 import mircoders.entity.EntityContent;
51 import mircoders.global.MirGlobal;
52 import mircoders.localizer.MirAdminInterfaceLocalizer;
53 import mircoders.localizer.MirLocalizerExc;
54 import mircoders.localizer.MirLocalizerFailure;
55 import mircoders.storage.DatabaseContent;
58 public class MirBasicAdminInterfaceLocalizer implements MirAdminInterfaceLocalizer {
59 private Vector simpleCommentOperations;
60 private Vector simpleArticleOperations;
61 private Map simpleCommentOperationsMap;
62 private Map simpleArticleOperationsMap;
63 protected static LoggerWrapper logger = new LoggerWrapper("Localizer.AdminInterface");;
65 public MirBasicAdminInterfaceLocalizer() throws MirLocalizerFailure, MirLocalizerExc {
67 simpleCommentOperations = new Vector();
68 simpleArticleOperations = new Vector();
69 simpleCommentOperationsMap = new HashMap();
70 simpleArticleOperationsMap = new HashMap();
72 addSimpleArticleOperation(new ChangeArticleFieldOperation("newswire", "to_article_type", "0", "1", false));
73 addSimpleArticleOperation(new ModifyArticleFieldOperation("unhide", "is_published", "1", false));
74 addSimpleArticleOperation(new ModifyArticleFieldOperation("hide", "is_published", "0", false));
76 addSimpleCommentOperation(new ModifyCommentFieldOperation("unhide", "is_published", "1"));
77 addSimpleCommentOperation(new ModifyCommentFieldOperation("hide", "is_published", "0"));
80 public String getAdminPageGenerator(String aPage, Map aTemplateData, EntityAdapter aUser, String aDefault) {
84 public String makePasswordDigest(String aPassword) {
88 public void initializeArticle(Map anArticle) {
89 anArticle.put("is_published", "0");
90 anArticle.put("date", StringUtil.date2webdbDate(new GregorianCalendar()));
93 public List simpleCommentOperations() {
94 return simpleCommentOperations;
97 public List simpleArticleOperations() {
98 return simpleArticleOperations;
101 public MirSimpleEntityOperation simpleArticleOperationForName(String aName) {
102 return (MirSimpleEntityOperation) simpleArticleOperationsMap.get(aName);
105 public MirSimpleEntityOperation simpleCommentOperationForName(String aName) {
106 return (MirSimpleEntityOperation) simpleCommentOperationsMap.get(aName);
109 public void removeSimpleArticleOperation(String aName) {
110 simpleArticleOperations.remove(simpleArticleOperationsMap.get(aName));
111 simpleArticleOperationsMap.remove(aName);
114 public void addSimpleArticleOperation(MirSimpleEntityOperation anOperation) {
115 removeSimpleArticleOperation(anOperation.getName());
116 simpleArticleOperationsMap.put(anOperation.getName(), anOperation);
117 simpleArticleOperations.add(anOperation);
120 public void removeSimpleCommentOperation(String aName) {
121 simpleCommentOperations.remove(simpleCommentOperationsMap.get(aName));
122 simpleCommentOperationsMap.remove(aName);
125 public void addSimpleCommentOperation(MirSimpleEntityOperation anOperation) {
126 removeSimpleCommentOperation(anOperation.getName());
127 simpleCommentOperationsMap.put(anOperation.getName(), anOperation);
128 simpleCommentOperations.add(anOperation);
131 protected abstract static class EntityModifyingOperation implements MirSimpleEntityOperation {
133 private boolean logOperation;
135 protected EntityModifyingOperation(String aName, boolean aLogOperation) {
137 logOperation = aLogOperation;
140 public String getName() {
144 public boolean isAvailable(EntityAdapter anEntity) {
146 Entity entity = anEntity.getEntity();
147 return isAvailable(entity);
149 catch (Throwable t) {
154 public void perform(EntityAdapter aUser, EntityAdapter anEntity) throws MirLocalizerExc, MirLocalizerFailure {
155 Entity entity = anEntity.getEntity();
157 performModification(aUser, entity);
161 StringBuffer line = new StringBuffer();
163 line.append(DateTimeFunctions.advancedDateFormat(
164 MirGlobal.config().getString("Mir.DefaultDateTimeFormat"),
165 (new GregorianCalendar()).getTime(),
166 MirGlobal.config().getString("Mir.DefaultTimezone")));
169 line.append(aUser.get("login"));
171 line.append("unknown");
174 line.append(getName());
175 entity.appendLineToField("comment", line.toString());
177 catch (Throwable t) {
178 logger.error("Error while trying to log an article operation: " + t.toString());
184 catch (Throwable t) {
185 throw new MirLocalizerFailure(t);
189 protected abstract boolean isAvailable(Entity anEntity) throws StorageObjectFailure ;
190 protected abstract void performModification(EntityAdapter aUser, Entity anEntity) throws MirLocalizerExc, MirLocalizerFailure ;
193 public static abstract class CommentModifyingOperation extends EntityModifyingOperation {
194 public CommentModifyingOperation(String aName, boolean aLogOperation) {
195 super(aName, aLogOperation);
198 public CommentModifyingOperation(String aName) {
202 protected boolean isAvailable(Entity anEntity) throws StorageObjectFailure {
203 return anEntity instanceof EntityComment && isAvailable((EntityComment) anEntity);
206 protected void performModification(EntityAdapter aUser, Entity anEntity) throws StorageObjectFailure {
207 performModification(aUser, (EntityComment) anEntity);
208 DatabaseContent.getInstance().setUnproduced("id="+anEntity.getValue("to_media"));
211 protected abstract boolean isAvailable(EntityComment aComment) throws StorageObjectFailure ;
212 protected abstract void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure ;
215 public static abstract class ArticleModifyingOperation extends EntityModifyingOperation {
216 public ArticleModifyingOperation(String aName, boolean aLogOperation) {
217 super(aName, aLogOperation);
220 protected boolean isAvailable(Entity anEntity) throws StorageObjectFailure {
221 return anEntity instanceof EntityContent && isAvailable((EntityContent) anEntity);
224 protected void performModification(EntityAdapter aUser, Entity anEntity) throws StorageObjectFailure {
225 performModification(aUser, (EntityContent) anEntity);
226 anEntity.setValueForProperty("is_produced", "0");
229 protected abstract boolean isAvailable(EntityContent anArticle) throws StorageObjectFailure ;
230 protected abstract void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure ;
233 protected static class SetCommentFieldOperation extends CommentModifyingOperation {
234 private String field;
235 private String value;
237 public SetCommentFieldOperation(String aName, String aField, String aValue) {
244 protected boolean isAvailable(EntityComment aComment) {
248 protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {
249 aComment.setValueForProperty(field, value);
253 protected static class SetCommentFieldsOperation extends CommentModifyingOperation {
256 public SetCommentFieldsOperation(String aName, String aFields[], String aValues[]) throws MirLocalizerExc {
259 values = new HashMap();
261 for (int i=0; i<aFields.length; i++)
262 values.put(aFields[i], aValues[i]);
265 protected boolean isAvailable(EntityComment aComment) {
269 protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {
270 Iterator i = values.entrySet().iterator();
272 while (i.hasNext()) {
273 Map.Entry entry = (Map.Entry) i.next();
274 aComment.setValueForProperty((String) entry.getKey(), (String) entry.getValue());
280 protected static class ModifyCommentFieldOperation extends CommentModifyingOperation {
281 private String field;
282 private String value;
284 public ModifyCommentFieldOperation(String aName, String aField, String aValue) {
291 protected boolean isAvailable(EntityComment aComment) {
292 return aComment.getValue(field) == null || !aComment.getValue(field).equals(value);
295 protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {
296 aComment.setValueForProperty(field, value);
300 protected static class SetArticleFieldOperation extends ArticleModifyingOperation {
301 private String field;
302 private String value;
304 public SetArticleFieldOperation(String aName, String aField, String aValue, boolean aLogOperation) {
305 super(aName, aLogOperation);
311 protected boolean isAvailable(EntityContent anArticle) {
315 protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {
316 anArticle.setValueForProperty(field, value);
320 protected static class ModifyArticleFieldOperation extends ArticleModifyingOperation {
321 private String field;
322 private String value;
324 public ModifyArticleFieldOperation(String aName, String aField, String aValue, boolean aLogOperation) {
325 super(aName, aLogOperation);
331 protected boolean isAvailable(EntityContent anArticle) {
332 return anArticle.getValue(field) == null || !anArticle.getValue(field).equals(value);
335 protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {
336 anArticle.setValueForProperty(field, value);
340 protected static class ChangeArticleFieldOperation extends ArticleModifyingOperation {
341 private String field;
342 private Set oldValues;
343 private String newValue;
345 public ChangeArticleFieldOperation(String aName, String aField, String anOldValues[], String aNewValue, boolean aLogOperation) {
346 super(aName, aLogOperation);
349 newValue = aNewValue;
350 oldValues = new HashSet(Arrays.asList(anOldValues));
352 public ChangeArticleFieldOperation(String aName, String aField, String anOldValue, String aNewValue, boolean aLogOperation) {
353 this(aName, aField, new String[] {anOldValue}, aNewValue, aLogOperation);
356 protected boolean isAvailable(EntityContent anArticle) {
357 return anArticle.getValue(field) != null && oldValues.contains(anArticle.getValue(field));
360 protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {
361 anArticle.setValueForProperty(field, newValue);