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 mir.bundle.Bundle;
34 import mir.config.MirPropertiesConfiguration;
35 import mir.entity.Entity;
36 import mir.entity.adapter.EntityAdapter;
37 import mir.entity.adapter.EntityAdapterFailure;
38 import mir.generator.Generator;
39 import mir.generator.GeneratorExc;
40 import mir.log.LoggerWrapper;
41 import mir.misc.StringUtil;
42 import mir.module.ModuleExc;
43 import mir.storage.StorageObjectFailure;
44 import mir.util.DateTimeFunctions;
45 import mir.util.EntityUtility;
46 import mir.util.StringRoutines;
47 import mir.util.generator.BundleGeneratorFunction;
48 import mircoders.entity.EntityComment;
49 import mircoders.entity.EntityContent;
50 import mircoders.global.MirGlobal;
51 import mircoders.localizer.MirAdminInterfaceLocalizer;
52 import mircoders.localizer.MirLocalizerExc;
53 import mircoders.localizer.MirLocalizerFailure;
54 import mircoders.module.ModuleLanguage;
55 import mircoders.storage.DatabaseContent;
60 public class MirBasicAdminInterfaceLocalizer implements MirAdminInterfaceLocalizer {
61 /** preview page name (String) -> generator name (String) */
62 private Map previewPages;
63 private List previewPageNames;
65 private List simpleCommentOperations;
66 private List simpleArticleOperations;
67 private Map simpleCommentOperationsMap;
68 private Map simpleArticleOperationsMap;
70 protected static LoggerWrapper logger = new LoggerWrapper("Localizer.AdminInterface");;
71 protected MirPropertiesConfiguration configuration = MirPropertiesConfiguration.instance();
73 public MirBasicAdminInterfaceLocalizer() throws MirLocalizerFailure {
75 simpleCommentOperations = new ArrayList();
76 simpleArticleOperations = new ArrayList();
77 simpleCommentOperationsMap = new HashMap();
78 simpleArticleOperationsMap = new HashMap();
80 previewPages = new HashMap();
81 previewPageNames = new ArrayList();
83 String[] previewConfiguration = configuration.getStringArray("Mir.Localizer.Admin.ArticlePreview");
85 for (int i = 0; i<previewConfiguration.length; i++) {
87 List parts = StringRoutines.separateString(previewConfiguration[i], "=");
88 if (parts.size() == 2) {
89 String key = ((String) parts.get(0)).trim();
90 previewPages.put(key,((String) parts.get(1)).trim());
91 previewPageNames.add(key);
94 throw new Exception("'=' expected");
98 logger.error("Error while processing preview configuration '" + previewConfiguration[i] + "': " + e.toString());
102 addSimpleArticleOperation(new ChangeArticleFieldOperation("newswire", "to_article_type", "0", "1", false));
103 addSimpleArticleOperation(new ModifyArticleFieldOperation("unhide", "is_published", "1", false));
104 addSimpleArticleOperation(new ModifyArticleFieldOperation("hide", "is_published", "0", false));
106 addSimpleCommentOperation(new ModifyCommentFieldOperation("unhide", "is_published", "1"));
107 addSimpleCommentOperation(new ModifyCommentFieldOperation("hide", "is_published", "0"));
111 public String getAdminPageGenerator(String aPage, Map aTemplateData, EntityAdapter aUser, String aDefault) throws MirLocalizerExc {
116 public Generator prepareArticlePreview(String aPreviewPage, EntityAdapter anArticle, Map aContext) throws MirLocalizerExc {
117 MirGlobal.localizer().producerAssistant().initializeGenerationValueSet(aContext);
118 aContext.put("article", anArticle);
123 MirGlobal.localizer().dataModel().adapterModel().makeEntityAdapter("language",
124 new ModuleLanguage().languageForCode(configuration.getString("Mir.Localizer.Admin.ArticlePreviewLanguage"))));
126 catch (EntityAdapterFailure e) {
127 throw new MirLocalizerFailure("Can't create entity adapter", e);
129 catch (ModuleExc e) {
130 throw new MirLocalizerFailure("Can't find language", e);
132 aContext.put("pathprefix", configuration.getString("Mir.Localizer.Admin.ArticlePreviewLanguage"));
135 new BundleGeneratorFunction(
137 MirGlobal.getBundleFactory().getBundle(
138 "etc/bundles/producer",
140 configuration.getString("Mir.Localizer.Admin.ArticlePreviewLanguage") }) }));
143 if (previewPages.containsKey(aPreviewPage)) {
145 return MirGlobal.localizer().generators().makeAdminGeneratorLibrary().makeGenerator((String) previewPages.get(aPreviewPage));
147 catch (GeneratorExc e) {
148 throw new MirLocalizerFailure(e);
152 throw new MirLocalizerExc("Unknown preview: " + aPreviewPage);
157 public List getPreviewPages(EntityAdapter anArticle) throws MirLocalizerExc{
158 return Collections.unmodifiableList(previewPageNames);
162 public String makePasswordDigest(String aPassword) {
166 public void initializeArticle(Map anArticle) {
167 anArticle.put("is_published", "0");
168 anArticle.put("date", StringUtil.date2webdbDate(new GregorianCalendar()));
171 public List simpleCommentOperations() {
172 return Collections.unmodifiableList(simpleCommentOperations);
175 public List simpleArticleOperations() {
176 return Collections.unmodifiableList(simpleArticleOperations);
179 public MirSimpleEntityOperation simpleArticleOperationForName(String aName) {
180 return (MirSimpleEntityOperation) simpleArticleOperationsMap.get(aName);
183 public MirSimpleEntityOperation simpleCommentOperationForName(String aName) {
184 return (MirSimpleEntityOperation) simpleCommentOperationsMap.get(aName);
187 public void removeSimpleArticleOperation(String aName) {
188 simpleArticleOperations.remove(simpleArticleOperationsMap.get(aName));
189 simpleArticleOperationsMap.remove(aName);
192 public void addSimpleArticleOperation(MirSimpleEntityOperation anOperation) {
193 removeSimpleArticleOperation(anOperation.getName());
194 simpleArticleOperationsMap.put(anOperation.getName(), anOperation);
195 simpleArticleOperations.add(anOperation);
198 public void removeSimpleCommentOperation(String aName) {
199 simpleCommentOperations.remove(simpleCommentOperationsMap.get(aName));
200 simpleCommentOperationsMap.remove(aName);
203 public void addSimpleCommentOperation(MirSimpleEntityOperation anOperation) {
204 removeSimpleCommentOperation(anOperation.getName());
205 simpleCommentOperationsMap.put(anOperation.getName(), anOperation);
206 simpleCommentOperations.add(anOperation);
209 protected abstract static class EntityModifyingOperation implements MirSimpleEntityOperation {
211 private boolean logOperation;
213 protected EntityModifyingOperation(String aName, boolean aLogOperation) {
215 logOperation = aLogOperation;
218 public String getName() {
222 public boolean isAvailable(EntityAdapter anEntity) {
224 Entity entity = anEntity.getEntity();
225 return isAvailable(entity);
227 catch (Throwable t) {
232 public void perform(EntityAdapter aUser, EntityAdapter anEntity) throws MirLocalizerExc, MirLocalizerFailure {
233 Entity entity = anEntity.getEntity();
235 performModification(aUser, entity);
239 StringBuffer line = new StringBuffer();
241 line.append(DateTimeFunctions.advancedDateFormat(
242 MirGlobal.config().getString("Mir.DefaultDateTimeFormat"),
243 (new GregorianCalendar()).getTime(),
244 MirGlobal.config().getString("Mir.DefaultTimezone")));
247 line.append(aUser.get("login"));
249 line.append("unknown");
252 line.append(getName());
253 EntityUtility.appendLineToField(entity, "comment", line.toString());
255 catch (Throwable t) {
256 logger.error("Error while trying to log an article operation: " + t.toString());
262 catch (Throwable t) {
263 throw new MirLocalizerFailure(t);
267 protected abstract boolean isAvailable(Entity anEntity) throws StorageObjectFailure ;
268 protected abstract void performModification(EntityAdapter aUser, Entity anEntity) throws MirLocalizerExc, MirLocalizerFailure ;
271 public static abstract class CommentModifyingOperation extends EntityModifyingOperation {
272 public CommentModifyingOperation(String aName, boolean aLogOperation) {
273 super(aName, aLogOperation);
276 public CommentModifyingOperation(String aName) {
280 protected boolean isAvailable(Entity anEntity) throws StorageObjectFailure {
281 return anEntity instanceof EntityComment && isAvailable((EntityComment) anEntity);
284 protected void performModification(EntityAdapter aUser, Entity anEntity) throws StorageObjectFailure {
285 performModification(aUser, (EntityComment) anEntity);
286 DatabaseContent.getInstance().setUnproduced("id="+anEntity.getFieldValue("to_media"));
289 protected abstract boolean isAvailable(EntityComment aComment) throws StorageObjectFailure ;
290 protected abstract void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure ;
293 public static abstract class ArticleModifyingOperation extends EntityModifyingOperation {
294 public ArticleModifyingOperation(String aName, boolean aLogOperation) {
295 super(aName, aLogOperation);
298 protected boolean isAvailable(Entity anEntity) throws StorageObjectFailure {
299 return anEntity instanceof EntityContent && isAvailable((EntityContent) anEntity);
302 protected void performModification(EntityAdapter aUser, Entity anEntity) throws StorageObjectFailure {
303 performModification(aUser, (EntityContent) anEntity);
304 anEntity.setFieldValue("is_produced", "0");
307 protected abstract boolean isAvailable(EntityContent anArticle) throws StorageObjectFailure ;
308 protected abstract void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure ;
311 protected static class SetCommentFieldOperation extends CommentModifyingOperation {
312 private String field;
313 private String value;
315 public SetCommentFieldOperation(String aName, String aField, String aValue) {
322 protected boolean isAvailable(EntityComment aComment) {
326 protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {
327 aComment.setFieldValue(field, value);
331 protected static class SetCommentFieldsOperation extends CommentModifyingOperation {
334 public SetCommentFieldsOperation(String aName, String aFields[], String aValues[]) {
337 values = new HashMap();
339 for (int i=0; i<aFields.length; i++)
340 values.put(aFields[i], aValues[i]);
343 protected boolean isAvailable(EntityComment aComment) {
347 protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {
348 Iterator i = values.entrySet().iterator();
350 while (i.hasNext()) {
351 Map.Entry entry = (Map.Entry) i.next();
352 aComment.setFieldValue((String) entry.getKey(), (String) entry.getValue());
358 protected static class ModifyCommentFieldOperation extends CommentModifyingOperation {
359 private String field;
360 private String value;
362 public ModifyCommentFieldOperation(String aName, String aField, String aValue) {
369 protected boolean isAvailable(EntityComment aComment) {
370 return aComment.getFieldValue(field) == null || !aComment.getFieldValue(field).equals(value);
373 protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {
374 aComment.setFieldValue(field, value);
378 protected static class SetArticleFieldOperation extends ArticleModifyingOperation {
379 private String field;
380 private String value;
382 public SetArticleFieldOperation(String aName, String aField, String aValue, boolean aLogOperation) {
383 super(aName, aLogOperation);
389 protected boolean isAvailable(EntityContent anArticle) {
393 protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {
394 anArticle.setFieldValue(field, value);
398 protected static class ModifyArticleFieldOperation extends ArticleModifyingOperation {
399 private String field;
400 private String value;
402 public ModifyArticleFieldOperation(String aName, String aField, String aValue, boolean aLogOperation) {
403 super(aName, aLogOperation);
409 protected boolean isAvailable(EntityContent anArticle) {
410 return anArticle.getFieldValue(field) == null || !anArticle.getFieldValue(field).equals(value);
413 protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {
414 anArticle.setFieldValue(field, value);
418 protected static class ChangeArticleFieldOperation extends ArticleModifyingOperation {
419 private String field;
420 private Set oldValues;
421 private String newValue;
423 public ChangeArticleFieldOperation(String aName, String aField, String anOldValues[], String aNewValue, boolean aLogOperation) {
424 super(aName, aLogOperation);
427 newValue = aNewValue;
428 oldValues = new HashSet(Arrays.asList(anOldValues));
430 public ChangeArticleFieldOperation(String aName, String aField, String anOldValue, String aNewValue, boolean aLogOperation) {
431 this(aName, aField, new String[] {anOldValue}, aNewValue, aLogOperation);
434 protected boolean isAvailable(EntityContent anArticle) {
435 return anArticle.getFieldValue(field) != null && oldValues.contains(anArticle.getFieldValue(field));
438 protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {
439 anArticle.setFieldValue(field, newValue);