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.EntityAdapterExc;
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);
124 MirGlobal.localizer().dataModel().adapterModel().makeEntityAdapter("language",
125 new ModuleLanguage().languageForCode(configuration.getString("Mir.Localizer.Admin.ArticlePreviewLanguage"))));
127 catch (EntityAdapterExc e) {
128 throw new MirLocalizerFailure("Can't create entity adapter", e);
130 catch (ModuleExc e) {
131 throw new MirLocalizerFailure("Can't find language", e);
133 aContext.put("pathprefix", configuration.getString("Mir.Localizer.Admin.ArticlePreviewLanguage"));
136 new BundleGeneratorFunction(
138 MirGlobal.getBundleFactory().getBundle(
139 "etc/bundles/producer",
141 configuration.getString("Mir.Localizer.Admin.ArticlePreviewLanguage") }) }));
144 if (previewPages.containsKey(aPreviewPage)) {
146 return MirGlobal.localizer().generators().makeAdminGeneratorLibrary().makeGenerator((String) previewPages.get(aPreviewPage));
148 catch (GeneratorExc e) {
149 throw new MirLocalizerFailure(e);
153 throw new MirLocalizerExc("Unknown preview: " + aPreviewPage);
158 public List getPreviewPages(EntityAdapter anArticle) throws MirLocalizerExc{
159 return Collections.unmodifiableList(previewPageNames);
163 public String makePasswordDigest(String aPassword) {
167 public void initializeArticle(Map anArticle) {
168 anArticle.put("is_published", "0");
169 anArticle.put("date", StringUtil.date2webdbDate(new GregorianCalendar()));
172 public List simpleCommentOperations() {
173 return Collections.unmodifiableList(simpleCommentOperations);
176 public List simpleArticleOperations() {
177 return Collections.unmodifiableList(simpleArticleOperations);
180 public MirSimpleEntityOperation simpleArticleOperationForName(String aName) {
181 return (MirSimpleEntityOperation) simpleArticleOperationsMap.get(aName);
184 public MirSimpleEntityOperation simpleCommentOperationForName(String aName) {
185 return (MirSimpleEntityOperation) simpleCommentOperationsMap.get(aName);
188 public void removeSimpleArticleOperation(String aName) {
189 simpleArticleOperations.remove(simpleArticleOperationsMap.get(aName));
190 simpleArticleOperationsMap.remove(aName);
193 public void addSimpleArticleOperation(MirSimpleEntityOperation anOperation) {
194 removeSimpleArticleOperation(anOperation.getName());
195 simpleArticleOperationsMap.put(anOperation.getName(), anOperation);
196 simpleArticleOperations.add(anOperation);
199 public void removeSimpleCommentOperation(String aName) {
200 simpleCommentOperations.remove(simpleCommentOperationsMap.get(aName));
201 simpleCommentOperationsMap.remove(aName);
204 public void addSimpleCommentOperation(MirSimpleEntityOperation anOperation) {
205 removeSimpleCommentOperation(anOperation.getName());
206 simpleCommentOperationsMap.put(anOperation.getName(), anOperation);
207 simpleCommentOperations.add(anOperation);
210 protected abstract static class EntityModifyingOperation implements MirSimpleEntityOperation {
212 private boolean logOperation;
214 protected EntityModifyingOperation(String aName, boolean aLogOperation) {
216 logOperation = aLogOperation;
219 public String getName() {
223 public boolean isAvailable(EntityAdapter anEntity) {
225 Entity entity = anEntity.getEntity();
226 return isAvailable(entity);
228 catch (Throwable t) {
233 public void perform(EntityAdapter aUser, EntityAdapter anEntity) throws MirLocalizerExc, MirLocalizerFailure {
234 Entity entity = anEntity.getEntity();
236 performModification(aUser, entity);
240 StringBuffer line = new StringBuffer();
242 line.append(DateTimeFunctions.advancedDateFormat(
243 MirGlobal.config().getString("Mir.DefaultDateTimeFormat"),
244 (new GregorianCalendar()).getTime(),
245 MirGlobal.config().getString("Mir.DefaultTimezone")));
248 line.append(aUser.get("login"));
250 line.append("unknown");
253 line.append(getName());
254 EntityUtility.appendLineToField(entity, "comment", line.toString());
256 catch (Throwable t) {
257 logger.error("Error while trying to log an article operation: " + t.toString());
263 catch (Throwable t) {
264 throw new MirLocalizerFailure(t);
268 protected abstract boolean isAvailable(Entity anEntity) throws StorageObjectFailure ;
269 protected abstract void performModification(EntityAdapter aUser, Entity anEntity) throws MirLocalizerExc, MirLocalizerFailure ;
272 public static abstract class CommentModifyingOperation extends EntityModifyingOperation {
273 public CommentModifyingOperation(String aName, boolean aLogOperation) {
274 super(aName, aLogOperation);
277 public CommentModifyingOperation(String aName) {
281 protected boolean isAvailable(Entity anEntity) throws StorageObjectFailure {
282 return anEntity instanceof EntityComment && isAvailable((EntityComment) anEntity);
285 protected void performModification(EntityAdapter aUser, Entity anEntity) throws StorageObjectFailure {
286 performModification(aUser, (EntityComment) anEntity);
287 DatabaseContent.getInstance().setUnproduced("id="+anEntity.getFieldValue("to_media"));
290 protected abstract boolean isAvailable(EntityComment aComment) throws StorageObjectFailure ;
291 protected abstract void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure ;
294 public static abstract class ArticleModifyingOperation extends EntityModifyingOperation {
295 public ArticleModifyingOperation(String aName, boolean aLogOperation) {
296 super(aName, aLogOperation);
299 protected boolean isAvailable(Entity anEntity) throws StorageObjectFailure {
300 return anEntity instanceof EntityContent && isAvailable((EntityContent) anEntity);
303 protected void performModification(EntityAdapter aUser, Entity anEntity) throws StorageObjectFailure {
304 performModification(aUser, (EntityContent) anEntity);
305 anEntity.setFieldValue("is_produced", "0");
308 protected abstract boolean isAvailable(EntityContent anArticle) throws StorageObjectFailure ;
309 protected abstract void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure ;
312 protected static class SetCommentFieldOperation extends CommentModifyingOperation {
313 private String field;
314 private String value;
316 public SetCommentFieldOperation(String aName, String aField, String aValue) {
323 protected boolean isAvailable(EntityComment aComment) {
327 protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {
328 aComment.setFieldValue(field, value);
332 protected static class SetCommentFieldsOperation extends CommentModifyingOperation {
335 public SetCommentFieldsOperation(String aName, String aFields[], String aValues[]) {
338 values = new HashMap();
340 for (int i=0; i<aFields.length; i++)
341 values.put(aFields[i], aValues[i]);
344 protected boolean isAvailable(EntityComment aComment) {
348 protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {
349 Iterator i = values.entrySet().iterator();
351 while (i.hasNext()) {
352 Map.Entry entry = (Map.Entry) i.next();
353 aComment.setFieldValue((String) entry.getKey(), (String) entry.getValue());
359 protected static class ModifyCommentFieldOperation extends CommentModifyingOperation {
360 private String field;
361 private String value;
363 public ModifyCommentFieldOperation(String aName, String aField, String aValue) {
370 protected boolean isAvailable(EntityComment aComment) {
371 return aComment.getFieldValue(field) == null || !aComment.getFieldValue(field).equals(value);
374 protected void performModification(EntityAdapter aUser, EntityComment aComment) throws StorageObjectFailure {
375 aComment.setFieldValue(field, value);
379 protected static class SetArticleFieldOperation extends ArticleModifyingOperation {
380 private String field;
381 private String value;
383 public SetArticleFieldOperation(String aName, String aField, String aValue, boolean aLogOperation) {
384 super(aName, aLogOperation);
390 protected boolean isAvailable(EntityContent anArticle) {
394 protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {
395 anArticle.setFieldValue(field, value);
399 protected static class ModifyArticleFieldOperation extends ArticleModifyingOperation {
400 private String field;
401 private String value;
403 public ModifyArticleFieldOperation(String aName, String aField, String aValue, boolean aLogOperation) {
404 super(aName, aLogOperation);
410 protected boolean isAvailable(EntityContent anArticle) {
411 return anArticle.getFieldValue(field) == null || !anArticle.getFieldValue(field).equals(value);
414 protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {
415 anArticle.setFieldValue(field, value);
419 protected static class ChangeArticleFieldOperation extends ArticleModifyingOperation {
420 private String field;
421 private Set oldValues;
422 private String newValue;
424 public ChangeArticleFieldOperation(String aName, String aField, String anOldValues[], String aNewValue, boolean aLogOperation) {
425 super(aName, aLogOperation);
428 newValue = aNewValue;
429 oldValues = new HashSet(Arrays.asList(anOldValues));
431 public ChangeArticleFieldOperation(String aName, String aField, String anOldValue, String aNewValue, boolean aLogOperation) {
432 this(aName, aField, new String[] {anOldValue}, aNewValue, aLogOperation);
435 protected boolean isAvailable(EntityContent anArticle) {
436 return anArticle.getFieldValue(field) != null && oldValues.contains(anArticle.getFieldValue(field));
439 protected void performModification(EntityAdapter aUser, EntityContent anArticle) throws StorageObjectFailure {
440 anArticle.setFieldValue(field, newValue);