4a41049f3c87a420959f5570ca8feafa50a9e14f
[mir.git] / source / mircoders / localizer / basic / MirBasicDataModelLocalizer.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  any library licensed under the Apache Software License,\r
22  * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library\r
23  * (or with modified versions of the above that use the same license as the above),\r
24  * and distribute linked combinations including the two.  You must obey the\r
25  * GNU General Public License in all respects for all of the code used other than\r
26  * the above mentioned libraries.  If you modify this file, you may extend this\r
27  * exception to your version of the file, but you are not obligated to do so.\r
28  * If you do not wish to do so, delete this exception statement from your version.\r
29  */\r
30 package mircoders.localizer.basic;\r
31 \r
32 import mir.config.MirPropertiesConfiguration;\r
33 import mir.entity.Entity;\r
34 import mir.entity.adapter.EntityAdapter;\r
35 import mir.entity.adapter.EntityAdapterDefinition;\r
36 import mir.entity.adapter.EntityAdapterModel;\r
37 import mir.generator.Generator;\r
38 import mir.generator.GeneratorExc;\r
39 import mir.generator.GeneratorFailure;\r
40 import mir.log.LoggerWrapper;\r
41 import mir.media.MediaHandler;\r
42 import mir.misc.NumberUtils;\r
43 import mir.util.JDBCStringRoutines;\r
44 import mir.util.ParameterExpander;\r
45 import mir.util.RewindableIterator;\r
46 import mir.util.StructuredContentParser;\r
47 import mircoders.entity.EntityUploadedMedia;\r
48 import mircoders.global.MirGlobal;\r
49 import mircoders.localizer.MirAdminInterfaceLocalizer;\r
50 import mircoders.localizer.MirDataModelLocalizer;\r
51 import mircoders.localizer.MirLocalizerExc;\r
52 import mircoders.localizer.MirLocalizerFailure;\r
53 import mircoders.media.MediaHelper;\r
54 import mircoders.module.ModuleContent;\r
55 import mircoders.module.ModuleLanguage;\r
56 import mircoders.storage.*;\r
57 import multex.Failure;\r
58 \r
59 import java.util.*;\r
60 \r
61 public class MirBasicDataModelLocalizer implements MirDataModelLocalizer {\r
62   protected LoggerWrapper logger = new LoggerWrapper("Localizer.DataModel");\r
63   protected MirPropertiesConfiguration configuration = MirPropertiesConfiguration.instance();\r
64   protected ModuleLanguage languageModule = new ModuleLanguage();\r
65 \r
66   protected void constructContentAdapterDefinition(EntityAdapterDefinition anEntityAdapterDefinition) throws MirLocalizerFailure, MirLocalizerExc {\r
67     try {\r
68       anEntityAdapterDefinition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
69       anEntityAdapterDefinition.addDBDateField("changedate", "webdb_lastchange", configuration.getString("Mir.DefaultTimezone"));\r
70       anEntityAdapterDefinition.addMirDateField("date", "date", configuration.getString("Mir.DefaultTimezone"));\r
71 \r
72       anEntityAdapterDefinition.addCalculatedField("lockinguser", new ContentToUserField("to_locking_user"));\r
73       anEntityAdapterDefinition.addCalculatedField("is_locked", new ContentToIsLockedField());\r
74 \r
75       anEntityAdapterDefinition.addCalculatedField("to_topics", new ContentToTopicsField());\r
76       anEntityAdapterDefinition.addCalculatedField("to_comments", new ContentToCommentsField());\r
77       anEntityAdapterDefinition.addCalculatedField("language", new ContentToLanguageField());\r
78 \r
79       anEntityAdapterDefinition.addCalculatedField("commentcount", new ContentCommentCountField(" and is_published='1'"));\r
80       anEntityAdapterDefinition.addCalculatedField("fullcommentcount", new ContentCommentCountField(""));\r
81 \r
82 \r
83       anEntityAdapterDefinition.addCalculatedField("mediacount", new ContentMediaCountField("uploaded_media", true));\r
84       anEntityAdapterDefinition.addCalculatedField("fullmediacount", new ContentMediaCountField("uploaded_media", false));\r
85 \r
86       anEntityAdapterDefinition.addCalculatedField("to_uploaded_media", new ContentToMediaField( "uploadedMedia" ));\r
87       anEntityAdapterDefinition.addCalculatedField("to_media_images",  new ContentToMediaField( "image" ));\r
88       anEntityAdapterDefinition.addCalculatedField("to_media_audio", new ContentToMediaField( "audio" ));\r
89       anEntityAdapterDefinition.addCalculatedField("to_media_video", new ContentToMediaField( "video" ));\r
90       anEntityAdapterDefinition.addCalculatedField("to_media_other", new ContentToMediaField( "otherMedia" ));\r
91 \r
92       anEntityAdapterDefinition.addCalculatedField("firstImage",  new ContentToFirstMediaField( "image" ));\r
93       anEntityAdapterDefinition.addCalculatedField("firstAudio", new ContentToFirstMediaField( "audio" ));\r
94       anEntityAdapterDefinition.addCalculatedField("firstVideo", new ContentToFirstMediaField( "video" ));\r
95       anEntityAdapterDefinition.addCalculatedField("firstOther", new ContentToFirstMediaField( "otherMedia" ));\r
96 \r
97       anEntityAdapterDefinition.addCalculatedField("to_all_uploaded_media", new ContentToMediaField( "uploadedMedia", false));\r
98       anEntityAdapterDefinition.addCalculatedField("to_all_media_images",  new ContentToMediaField( "image", false));\r
99       anEntityAdapterDefinition.addCalculatedField("to_all_media_audio", new ContentToMediaField( "audio", false));\r
100       anEntityAdapterDefinition.addCalculatedField("to_all_media_video", new ContentToMediaField( "video", false));\r
101       anEntityAdapterDefinition.addCalculatedField("to_all_media_other", new ContentToMediaField( "otherMedia", false));\r
102       anEntityAdapterDefinition.addCalculatedField("to_media_icon", new ContentToIconField());\r
103 \r
104       anEntityAdapterDefinition.addCalculatedField("article_type", new ContentToArticleTypeField());\r
105 \r
106       anEntityAdapterDefinition.addCalculatedField("description_parsed", new FilteredField("description"));\r
107       anEntityAdapterDefinition.addCalculatedField("content_data_parsed", new FilteredField("content_data"));\r
108 \r
109       anEntityAdapterDefinition.addCalculatedField("children", new ContentToChildrenField());\r
110       anEntityAdapterDefinition.addCalculatedField("parent", new ContentToParentField());\r
111 \r
112       anEntityAdapterDefinition.addCalculatedField("publicurl", new ExpandedField(configuration.getString("Article.PublicUrl")));\r
113 \r
114       anEntityAdapterDefinition.addCalculatedField("operations",\r
115           new EntityToSimpleOperationsField(MirGlobal.localizer().adminInterface().simpleArticleOperations()));\r
116       \r
117       anEntityAdapterDefinition.addCalculatedField("languagename", new ContentToLanguageNameField());\r
118 \r
119       anEntityAdapterDefinition.addCalculatedField("is_original", new ContentIsOriginalField());\r
120       anEntityAdapterDefinition.addCalculatedField("to_original", new ContentToOriginalField());\r
121       anEntityAdapterDefinition.addCalculatedField("to_translations", new ContentToTranslationsField());\r
122       anEntityAdapterDefinition.addCalculatedField("to_translation", new ContentToTranslationField());\r
123 \r
124       anEntityAdapterDefinition.addCalculatedField("previews", new EntityAdapterDefinition.CalculatedField() {\r
125         public Object getValue(EntityAdapter anEntityAdapter) {\r
126           try {\r
127             return MirGlobal.localizer().adminInterface().getPreviewPages(anEntityAdapter);\r
128           }\r
129           catch (MirLocalizerExc e) {\r
130             throw new Failure("Cannot get previews for article", e);\r
131           }\r
132         }\r
133       });\r
134     }\r
135     catch (Throwable t) {\r
136       throw new MirLocalizerFailure(t.getMessage(), t);\r
137     }\r
138   }\r
139 \r
140 \r
141 \r
142   protected void constructCommentAdapterDefinition(EntityAdapterDefinition anEntityAdapterDefinition) throws MirLocalizerFailure {\r
143     try {\r
144       anEntityAdapterDefinition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
145       anEntityAdapterDefinition.addCalculatedField("to_content", new CommentToContentField());\r
146       anEntityAdapterDefinition.addCalculatedField("status", new CommentToStatusField());\r
147 \r
148       anEntityAdapterDefinition.addCalculatedField("to_uploaded_media", new CommentToMediaField( "uploadedMedia" ));\r
149       anEntityAdapterDefinition.addCalculatedField("to_media_images",  new CommentToMediaField( "image" ));\r
150       anEntityAdapterDefinition.addCalculatedField("to_media_audio", new CommentToMediaField( "audio" ));\r
151       anEntityAdapterDefinition.addCalculatedField("to_media_video", new CommentToMediaField( "video" ));\r
152       anEntityAdapterDefinition.addCalculatedField("to_media_other", new CommentToMediaField( "otherMedia" ));\r
153       anEntityAdapterDefinition.addCalculatedField("to_all_uploaded_media", new CommentToMediaField( "uploadedMedia", false));\r
154       anEntityAdapterDefinition.addCalculatedField("to_all_media_images",  new CommentToMediaField( "image", false));\r
155       anEntityAdapterDefinition.addCalculatedField("to_all_media_audio", new CommentToMediaField( "audio", false));\r
156       anEntityAdapterDefinition.addCalculatedField("to_all_media_video", new CommentToMediaField( "video", false));\r
157       anEntityAdapterDefinition.addCalculatedField("to_all_media_other", new CommentToMediaField( "otherMedia", false));\r
158 \r
159       anEntityAdapterDefinition.addCalculatedField("publicurl", new ExpandedField(configuration.getString("Comment.PublicUrl")));\r
160 \r
161       anEntityAdapterDefinition.addCalculatedField("description_parsed", new FilteredField("description"));\r
162       anEntityAdapterDefinition.addCalculatedField("operations",\r
163           new EntityToSimpleOperationsField(MirGlobal.localizer().adminInterface().simpleCommentOperations()));\r
164     }\r
165     catch (Throwable t) {\r
166       throw new MirLocalizerFailure(t.getMessage(), t);\r
167     }\r
168   }\r
169 \r
170   public EntityAdapterModel adapterModel() throws MirLocalizerFailure, MirLocalizerExc {\r
171     EntityAdapterModel result = new EntityAdapterModel();\r
172 \r
173     try {\r
174       EntityAdapterDefinition definition;\r
175 \r
176       definition = new EntityAdapterDefinition();\r
177       constructContentAdapterDefinition( definition );\r
178       result.addMapping( "content", DatabaseContent.getInstance(), definition);\r
179 \r
180       definition = new EntityAdapterDefinition();\r
181       constructCommentAdapterDefinition( definition );\r
182       result.addMapping( "comment", DatabaseComment.getInstance(), definition);\r
183       result.addMapping( "commentStatus", DatabaseCommentStatus.getInstance(), new EntityAdapterDefinition());\r
184 \r
185       result.addMapping( "articleType", DatabaseArticleType.getInstance(), new EntityAdapterDefinition());\r
186 \r
187       result.addMapping( "mediaType", DatabaseMediaType.getInstance(), new EntityAdapterDefinition());\r
188 \r
189 \r
190       definition = new EntityAdapterDefinition();\r
191       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
192       result.addMapping( "breakingNews", DatabaseBreaking.getInstance(), definition);\r
193 \r
194       definition = new EntityAdapterDefinition();\r
195       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
196       result.addMapping( "internalMessage", DatabaseMessages.getInstance(), definition);\r
197 \r
198       definition = new EntityAdapterDefinition();\r
199       definition.addCalculatedField("mediafolder", new MediaToMediaFolderField());\r
200       definition.addCalculatedField("human_readable_size", new HumanReadableSizeField("value"));\r
201       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
202       definition.addCalculatedField("info", new MediaToMediaInfoField());\r
203       result.addMapping( "uploadedMedia", DatabaseUploadedMedia.getInstance(), definition);\r
204       definition = new EntityAdapterDefinition();\r
205       definition.addCalculatedField("mediafolder", new MediaToMediaFolderField());\r
206       definition.addCalculatedField("human_readable_size", new HumanReadableSizeField("value"));\r
207       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
208       definition.addCalculatedField("info", new MediaToMediaInfoField());\r
209       definition.addCalculatedField("big_icon", new MediaToBigIconField());\r
210       result.addMapping( "image", DatabaseImages.getInstance(), definition);\r
211       definition = new EntityAdapterDefinition();\r
212       definition.addCalculatedField("mediafolder", new MediaToMediaFolderField());\r
213       definition.addCalculatedField("human_readable_size", new HumanReadableSizeField("value"));\r
214       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
215       definition.addCalculatedField("info", new MediaToMediaInfoField());\r
216       definition.addCalculatedField("big_icon", new MediaToBigIconField());\r
217       result.addMapping( "audio", DatabaseAudio.getInstance(), definition);\r
218       definition = new EntityAdapterDefinition();\r
219       definition.addCalculatedField("mediafolder", new MediaToMediaFolderField());\r
220       definition.addCalculatedField("human_readable_size", new HumanReadableSizeField("value"));\r
221       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
222       definition.addCalculatedField("info", new MediaToMediaInfoField());\r
223       definition.addCalculatedField("big_icon", new MediaToBigIconField());\r
224       result.addMapping( "video", DatabaseVideo.getInstance(), definition);\r
225 \r
226       definition = new EntityAdapterDefinition();\r
227       definition.addCalculatedField("mediafolder", new MediaToMediaFolderField());\r
228       definition.addCalculatedField("human_readable_size", new HumanReadableSizeField("value"));\r
229       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
230       definition.addCalculatedField("info", new MediaToMediaInfoField());\r
231       definition.addCalculatedField("big_icon", new MediaToBigIconField());\r
232       result.addMapping( "otherMedia", DatabaseOther.getInstance(), definition);\r
233 \r
234 \r
235       result.addMapping( "mediaFolder", DatabaseMediafolder.getInstance(), new EntityAdapterDefinition());\r
236       result.addMapping( "imageType", DatabaseImageType.getInstance(), new EntityAdapterDefinition());\r
237       result.addMapping( "language", DatabaseLanguage.getInstance(), new EntityAdapterDefinition());\r
238       result.addMapping( "mediaType", DatabaseMediaType.getInstance(), new EntityAdapterDefinition());\r
239       result.addMapping( "topic", DatabaseTopics.getInstance(), new EntityAdapterDefinition());\r
240 \r
241       definition = new EntityAdapterDefinition();\r
242       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
243       definition.addDBDateField("lastlogindate", "lastlogin", configuration.getString("Mir.DefaultTimezone"));\r
244       definition.addCalculatedField("structuredProfile", new StructuredContentField("profile"));\r
245       result.addMapping( "user", DatabaseUsers.getInstance(), definition);\r
246 \r
247       result.addMapping( "content_x_topic", DatabaseContentToTopics.getInstance(), new EntityAdapterDefinition());\r
248 \r
249     }\r
250     catch (Throwable t) {\r
251       throw new MirLocalizerFailure(t.getMessage(), t);\r
252     }\r
253 \r
254     return result;\r
255   }\r
256 \r
257   protected class CommentToContentField implements EntityAdapterDefinition.CalculatedField {\r
258     public Object getValue(EntityAdapter anEntityAdapter) {\r
259       try {\r
260         return anEntityAdapter.getToOneRelation(\r
261                     "id="+anEntityAdapter.get("to_media"),\r
262                     "id",\r
263                     "content" );\r
264       }\r
265       catch (Throwable t) {\r
266         throw new RuntimeException(t.getMessage());\r
267       }\r
268     }\r
269   }\r
270 \r
271   protected class CommentToStatusField implements EntityAdapterDefinition.CalculatedField {\r
272     public Object getValue(EntityAdapter anEntityAdapter) {\r
273       try {\r
274         return anEntityAdapter.getToOneRelation(\r
275                     "id="+anEntityAdapter.get("to_comment_status"),\r
276                     "id",\r
277                     "commentStatus" );\r
278       }\r
279       catch (Throwable t) {\r
280         throw new RuntimeException(t.getMessage());\r
281       }\r
282     }\r
283   }\r
284 \r
285   protected class EntityToSimpleOperationsField implements EntityAdapterDefinition.CalculatedField {\r
286     private List operations;\r
287 \r
288     public EntityToSimpleOperationsField(List anOperations) {\r
289       operations = anOperations;\r
290     }\r
291 \r
292     public Object getValue(EntityAdapter anEntityAdapter) {\r
293       try {\r
294         Iterator i = operations.iterator();\r
295         List availableOperations = new Vector();\r
296 \r
297         while (i.hasNext()) {\r
298           MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation =\r
299             (MirAdminInterfaceLocalizer.MirSimpleEntityOperation) i.next();\r
300 \r
301           if (operation.isAvailable(anEntityAdapter)) {\r
302             availableOperations.add(operation.getName());\r
303           }\r
304         };\r
305 \r
306         return availableOperations;\r
307       }\r
308       catch (Throwable t) {\r
309         throw new RuntimeException(t.getMessage());\r
310       }\r
311     }\r
312   }\r
313 \r
314   protected class FilteredField implements EntityAdapterDefinition.CalculatedField {\r
315     private String fieldName;\r
316 \r
317     public FilteredField(String aFieldName) {\r
318       fieldName = aFieldName;\r
319     }\r
320 \r
321     public Object getValue(EntityAdapter anEntityAdapter) {\r
322       try {\r
323         if (anEntityAdapter.get("is_html")!=null && anEntityAdapter.get("is_html").equals("1")) {\r
324           return MirGlobal.localizer().producerAssistant().filterHTMLText((String) anEntityAdapter.get(fieldName));\r
325         }\r
326         else {\r
327           return MirGlobal.localizer().producerAssistant().filterNonHTMLText((String) anEntityAdapter.get(fieldName));\r
328         }\r
329       }\r
330       catch (Throwable t) {\r
331         throw new RuntimeException(t.getMessage());\r
332       }\r
333     }\r
334   }\r
335 \r
336   protected class StructuredContentField implements EntityAdapterDefinition.CalculatedField {\r
337     private String expression;\r
338 \r
339     public StructuredContentField(String anExpression) {\r
340       expression = anExpression;\r
341     }\r
342 \r
343     public Object getValue(EntityAdapter anEntityAdapter) {\r
344       try {\r
345         return StructuredContentParser.parse(ParameterExpander.evaluateStringExpression(anEntityAdapter, expression));\r
346       }\r
347       catch (Throwable t) {\r
348         throw new RuntimeException(t.getMessage());\r
349       }\r
350     }\r
351   }\r
352 \r
353   protected class ExpandedField implements EntityAdapterDefinition.CalculatedField {\r
354     private String expression;\r
355 \r
356     public ExpandedField(String anExpression) {\r
357       expression = anExpression;\r
358     }\r
359 \r
360     public Object getValue(EntityAdapter anEntityAdapter) {\r
361       try {\r
362         return ParameterExpander.expandExpression(anEntityAdapter, expression);\r
363       }\r
364       catch (Throwable t) {\r
365         throw new RuntimeException(t.getMessage());\r
366       }\r
367     }\r
368   }\r
369 \r
370   protected class EvaluatedField implements EntityAdapterDefinition.CalculatedField {\r
371     private String expression;\r
372 \r
373     public EvaluatedField(String anExpression) {\r
374       expression = anExpression;\r
375     }\r
376 \r
377     public Object getValue(EntityAdapter anEntityAdapter) {\r
378       try {\r
379         return ParameterExpander.evaluateExpression(anEntityAdapter, expression);\r
380       }\r
381       catch (Throwable t) {\r
382         throw new RuntimeException(t.getMessage());\r
383       }\r
384     }\r
385   }\r
386 \r
387   protected class ContentToParentField implements EntityAdapterDefinition.CalculatedField {\r
388     public Object getValue(EntityAdapter anEntityAdapter) {\r
389       try {\r
390         logger.debug("ContentToParentField.getFieldValue");\r
391         return anEntityAdapter.getToOneRelation(\r
392                     "id="+anEntityAdapter.get("to_content"),\r
393                     "id",\r
394                     "content" );\r
395       }\r
396       catch (Throwable t) {\r
397         throw new RuntimeException(t.getMessage());\r
398       }\r
399     }\r
400   }\r
401 \r
402   protected class ContentToChildrenField implements EntityAdapterDefinition.CalculatedField {\r
403     public Object getValue(EntityAdapter anEntityAdapter) {\r
404       try {\r
405         return anEntityAdapter.getRelation(\r
406                     "to_content="+anEntityAdapter.get("id"),\r
407                     "id",\r
408                     "content" );\r
409       }\r
410       catch (Throwable t) {\r
411         throw new RuntimeException(t.getMessage());\r
412       }\r
413     }\r
414   }\r
415 \r
416   protected class ContentToLanguageField implements EntityAdapterDefinition.CalculatedField {\r
417     public Object getValue(EntityAdapter anEntityAdapter) {\r
418       try {\r
419         return anEntityAdapter.getToOneRelation(\r
420                     "id="+anEntityAdapter.get("to_language"),\r
421                     "id",\r
422                     "language" );\r
423       }\r
424       catch (Throwable t) {\r
425         throw new RuntimeException(t.getMessage());\r
426       }\r
427     }\r
428   }\r
429 \r
430   protected class ContentToArticleTypeField implements EntityAdapterDefinition.CalculatedField {\r
431     public Object getValue(EntityAdapter anEntityAdapter) {\r
432       try {\r
433         return anEntityAdapter.getToOneRelation(\r
434                     "id="+anEntityAdapter.get("to_article_type"),\r
435                     "id",\r
436                     "articleType" );\r
437       }\r
438       catch (Throwable t) {\r
439         throw new RuntimeException(t.getMessage());\r
440       }\r
441     }\r
442   }\r
443 \r
444   protected class MediaToMediaFolderField implements EntityAdapterDefinition.CalculatedField {\r
445     public Object getValue(EntityAdapter anEntityAdapter) {\r
446       try {\r
447         return anEntityAdapter.getToOneRelation(\r
448                     "id="+anEntityAdapter.get("to_media_folder"),\r
449                     "id",\r
450                     "mediaFolder" );\r
451       }\r
452       catch (Throwable t) {\r
453         throw new RuntimeException(t.getMessage());\r
454       }\r
455     }\r
456   }\r
457 \r
458   public static class MediaInfo {\r
459     private MediaHandler mediaHandler;\r
460 \r
461     public MediaInfo(MediaHandler aHandler) {\r
462       mediaHandler = aHandler;\r
463     }\r
464     public String getBigIcon() {\r
465       if (mediaHandler == null)\r
466         return "bla";\r
467       else\r
468         return mediaHandler.getBigIconName();\r
469     }\r
470 \r
471     public String getSmallIcon() {\r
472       if (mediaHandler == null)\r
473         return "bla";\r
474       else\r
475         return mediaHandler.getTinyIconName();\r
476     }\r
477 \r
478     public String getMediaType() {\r
479       return "";\r
480     }\r
481   }\r
482 \r
483   protected class MediaToMediaInfoField implements EntityAdapterDefinition.CalculatedField {\r
484     public Object getValue(EntityAdapter anEntityAdapter) {\r
485       try {\r
486         MediaHandler mediaHandler = MediaHelper.getHandler(((EntityUploadedMedia) anEntityAdapter.getEntity()).getMediaType());\r
487 \r
488         return new MediaInfo(mediaHandler);\r
489       }\r
490       catch (Throwable t) {\r
491         throw new RuntimeException(t.getMessage());\r
492       }\r
493     }\r
494   }\r
495 \r
496   protected class MediaToBigIconField implements EntityAdapterDefinition.CalculatedField {\r
497     public Object getValue(EntityAdapter anEntityAdapter) {\r
498       try {\r
499         return MediaHelper.getHandler(((EntityUploadedMedia) anEntityAdapter.getEntity()).getMediaType()).getBigIconName();\r
500       }\r
501       catch (Throwable t) {\r
502         throw new RuntimeException(t.getMessage());\r
503       }\r
504     }\r
505   }\r
506 \r
507   protected class ContentToCommentsField implements EntityAdapterDefinition.CalculatedField {\r
508     private String extracondition;\r
509     private String order;\r
510 \r
511     public ContentToCommentsField() {\r
512       this ( " and is_published='1'", "webdb_create");\r
513     }\r
514 \r
515     public ContentToCommentsField(String anExtraCondition, String anOrder) {\r
516       order = anOrder;\r
517       extracondition = anExtraCondition;\r
518     }\r
519 \r
520     public Object getValue(EntityAdapter anEntityAdapter) {\r
521       try {\r
522         return anEntityAdapter.getRelation(\r
523                     "to_media="+anEntityAdapter.get("id")+" " + extracondition,\r
524                     order,\r
525                     "comment" );\r
526       }\r
527       catch (Throwable t) {\r
528         throw new RuntimeException(t.getMessage());\r
529       }\r
530     }\r
531   }\r
532 \r
533   protected class ContentToTopicsField implements EntityAdapterDefinition.CalculatedField {\r
534     private String topicCondition;\r
535     private String topicOrder;\r
536 \r
537     public ContentToTopicsField() {\r
538       this(null);\r
539     }\r
540 \r
541     public ContentToTopicsField(String aTopicCondition) {\r
542       this(aTopicCondition, "title");\r
543     }\r
544 \r
545     public ContentToTopicsField(String aTopicCondition, String aTopicOrder) {\r
546       topicCondition = aTopicCondition;\r
547       topicOrder = aTopicOrder;\r
548     }\r
549 \r
550     public Object getValue(EntityAdapter anEntityAdapter) {\r
551       try {\r
552 \r
553         Vector extraTable = new Vector();\r
554         extraTable.add("content_x_topic cxt");\r
555         String condition = "cxt.content_id="+anEntityAdapter.get("id")+\r
556           " and cxt.topic_id=t.id";\r
557 \r
558         if (topicCondition!=null && topicCondition.length()>0)\r
559           condition = "(" + topicCondition + ") and " + condition;\r
560 \r
561         return anEntityAdapter.getComplexRelation("t", extraTable,\r
562                     condition, topicOrder, "topic" );\r
563       }\r
564       catch (Throwable t) {\r
565         throw new RuntimeException(t.getMessage());\r
566       }\r
567     }\r
568   }\r
569 \r
570   protected class ContentToMediaField implements EntityAdapterDefinition.CalculatedField {\r
571     private String definition;\r
572     private boolean published;\r
573 \r
574     public ContentToMediaField(String aDefinition, boolean anOnlyPublished) {\r
575       definition = aDefinition;\r
576       published = anOnlyPublished;\r
577     }\r
578 \r
579     public ContentToMediaField(String aDefinition) {\r
580       this(aDefinition, true);\r
581     }\r
582 \r
583     public Object getValue(EntityAdapter anEntityAdapter) {\r
584       try {\r
585         String condition = "cxm.content_id="+ anEntityAdapter.get("id") +\r
586           " and cxm.media_id = m.id";\r
587         if (published)\r
588           condition = "is_published='t' and " + condition;\r
589 \r
590         List extraTables = new Vector();\r
591         extraTables.add("content_x_media cxm");\r
592 \r
593         return anEntityAdapter.getComplexRelation("m", extraTables, condition, "id", definition);\r
594       }\r
595       catch (Throwable t) {\r
596         throw new RuntimeException(t.getMessage());\r
597       }\r
598     }\r
599   }\r
600 \r
601   protected class ContentToFirstMediaField implements EntityAdapterDefinition.CalculatedField {\r
602     private String definition;\r
603     private boolean published;\r
604 \r
605     public ContentToFirstMediaField(String aDefinition, boolean anOnlyPublished) {\r
606       definition = aDefinition;\r
607       published = anOnlyPublished;\r
608     }\r
609 \r
610     public ContentToFirstMediaField(String aDefinition) {\r
611       this(aDefinition, true);\r
612     }\r
613 \r
614     public Object getValue(EntityAdapter anEntityAdapter) {\r
615       try {\r
616         String condition = "cxm.content_id="+ anEntityAdapter.get("id") +\r
617           " and cxm.media_id = m.id";\r
618         if (published)\r
619           condition = "is_published='t' and " + condition;\r
620 \r
621         List extraTables = new Vector();\r
622         extraTables.add("content_x_media cxm");\r
623 \r
624         return anEntityAdapter.getComplexToOneRelation("m", extraTables, condition, "id", definition);\r
625       }\r
626       catch (Throwable t) {\r
627         throw new RuntimeException(t.getMessage());\r
628       }\r
629     }\r
630   }\r
631 \r
632   protected class CommentToMediaField implements EntityAdapterDefinition.CalculatedField {\r
633     private String definition;\r
634     private boolean published;\r
635 \r
636     public CommentToMediaField(String aDefinition, boolean anOnlyPublished) {\r
637       definition = aDefinition;\r
638       published = anOnlyPublished;\r
639     }\r
640 \r
641     public CommentToMediaField(String aDefinition) {\r
642       this(aDefinition, true);\r
643     }\r
644 \r
645     public Object getValue(EntityAdapter anEntityAdapter) {\r
646       try {\r
647 \r
648         String condition = "cxm.comment_id="+ anEntityAdapter.get("id") +\r
649                   " and cxm.media_id = m.id";\r
650         if (published)\r
651            condition = "is_published='t' and " + condition;\r
652 \r
653         List extraTables = new Vector();\r
654         extraTables.add("comment_x_media cxm");\r
655         return anEntityAdapter.getComplexRelation("m", extraTables, condition, "id", definition);\r
656 \r
657       }\r
658       catch (Throwable t) {\r
659         throw new RuntimeException(t.getMessage());\r
660       }\r
661     }\r
662   }\r
663 \r
664   protected class ContentToIconField implements EntityAdapterDefinition.CalculatedField {\r
665     public Object getValue(EntityAdapter anEntityAdapter) {\r
666       EntityAdapter media;\r
667       Entity mediaType;\r
668       RewindableIterator iterator;\r
669       Map result;\r
670       MediaHandler mediaHandler;\r
671       String tinyIcon;\r
672       String iconAlt;\r
673 \r
674       try {\r
675         iterator = (RewindableIterator) (anEntityAdapter.get("to_uploaded_media"));\r
676         iterator.rewind();\r
677 \r
678         tinyIcon = MirGlobal.config().getString("Producer.Icon.TinyText");\r
679         iconAlt = "Text";\r
680 \r
681         if (iterator.hasNext()) {\r
682           media = (EntityAdapter) iterator.next();\r
683 \r
684           mediaType = ((EntityUploadedMedia) (media.getEntity())).getMediaType();\r
685           mediaHandler = MediaHelper.getHandler( mediaType );\r
686 \r
687           tinyIcon = mediaHandler.getTinyIconName();\r
688           iconAlt = mediaHandler.getIconAltName();\r
689         }\r
690       }\r
691       catch (Throwable t) {\r
692         logger.error("ContentToIconField: " +t.getMessage());\r
693         throw new RuntimeException(t.getMessage());\r
694       }\r
695 \r
696       result = new HashMap();\r
697       result.put("tiny_icon", MirGlobal.config().getString("Producer.ImageRoot") + "/" + tinyIcon);\r
698       result.put("icon_alt", iconAlt);\r
699 \r
700       return result;\r
701     }\r
702   }\r
703 \r
704   protected class ContentCommentCountField implements EntityAdapterDefinition.CalculatedField {\r
705     private String extraCondition;\r
706 \r
707     public ContentCommentCountField(String anExtraCondition) {\r
708       super();\r
709 \r
710       extraCondition = anExtraCondition;\r
711     }\r
712 \r
713     public Object getValue(EntityAdapter anEntityAdapter) {\r
714       try {\r
715         return Integer.toString(\r
716             DatabaseComment.getInstance().getSize(\r
717                   "to_media="+anEntityAdapter.get("id")+" " + extraCondition));\r
718       }\r
719       catch (Throwable t) {\r
720         throw new RuntimeException(t.getMessage());\r
721       }\r
722     }\r
723   }\r
724 \r
725   protected class HumanReadableSizeField implements EntityAdapterDefinition.CalculatedField {\r
726       private String fieldName;\r
727 \r
728       public HumanReadableSizeField(String aFieldName) {\r
729         fieldName= aFieldName;\r
730       }\r
731 \r
732       public Object getValue(EntityAdapter anEntityAdapter) {\r
733         try {\r
734           String size = (String) anEntityAdapter.get(fieldName);\r
735           if (size!=null)\r
736             return NumberUtils.humanReadableSize(Double.parseDouble(size));\r
737           else\r
738             return "";\r
739         }\r
740         catch (Throwable t) {\r
741           throw new RuntimeException(t.getMessage());\r
742         }\r
743       }\r
744     }\r
745 \r
746 \r
747   protected class ContentMediaCountField implements EntityAdapterDefinition.CalculatedField {\r
748     private String table;\r
749     private boolean published;\r
750 \r
751     public ContentMediaCountField(String aTable, boolean anOnlyPublished) {\r
752       table = aTable;\r
753       published = anOnlyPublished;\r
754     }\r
755 \r
756     public ContentMediaCountField(String aTable) {\r
757       this(aTable, true);\r
758     }\r
759 \r
760     public Object getValue(EntityAdapter anEntityAdapter) {\r
761       try {\r
762         Vector extraTable = new Vector();\r
763         extraTable.add(table+" m");\r
764         String selectSql = "cxm.media_id=m.id and cxm.content_id="+\r
765           anEntityAdapter.get("id");\r
766         if (published)\r
767           selectSql+= " and m.is_published='t'";\r
768 \r
769         return Integer.toString(\r
770             DatabaseContentToMedia.getInstance().getSize(\r
771               "cxm", extraTable, selectSql));\r
772       }\r
773       catch (Throwable t) {\r
774         throw new RuntimeException(t.getMessage());\r
775       }\r
776     }\r
777   }\r
778 \r
779   protected class ContentToUserField implements EntityAdapterDefinition.CalculatedField {\r
780     private String fieldName;\r
781 \r
782     public ContentToUserField(String aFieldName) {\r
783       fieldName = aFieldName;\r
784     }\r
785 \r
786     public Object getValue(EntityAdapter anEntityAdapter) {\r
787       try {\r
788         return anEntityAdapter.getToOneRelation(\r
789             "id=" + anEntityAdapter.get(fieldName),\r
790             "id",\r
791             "user");\r
792       }\r
793       catch (Throwable t) {\r
794         throw new RuntimeException(t.getMessage());\r
795       }\r
796     }\r
797   }\r
798 \r
799   protected class ContentToIsLockedField implements EntityAdapterDefinition.CalculatedField {\r
800     private ModuleContent contentModule;\r
801 \r
802     public ContentToIsLockedField() {\r
803       contentModule = new ModuleContent();\r
804     }\r
805 \r
806     public Object getValue(EntityAdapter anEntityAdapter) {\r
807       try {\r
808         return new Boolean(contentModule.queryArticleLock(anEntityAdapter.getEntity().getId())!=null);\r
809       }\r
810       catch (Throwable t) {\r
811         throw new RuntimeException(t.getMessage());\r
812       }\r
813     }\r
814   }\r
815     protected class ContentIsOriginalField implements EntityAdapterDefinition.CalculatedField {\r
816     public Object getValue(EntityAdapter anEntityAdapter) throws MirLocalizerFailure {\r
817       try {\r
818 \r
819         //ML: add check on article type\r
820         boolean result = (anEntityAdapter.get("parent")==null);\r
821 \r
822         return new Boolean(result);\r
823       }\r
824       catch (Throwable t) {\r
825         throw new MirLocalizerFailure(t);\r
826       }\r
827     }\r
828   }\r
829 \r
830   protected class ContentToOriginalField implements EntityAdapterDefinition.CalculatedField {\r
831     public Object getValue(EntityAdapter anEntityAdapter) throws MirLocalizerFailure {\r
832       try {\r
833         if (anEntityAdapter.get("parent")!=null)\r
834           return anEntityAdapter.get("parent");\r
835         else\r
836           return anEntityAdapter;\r
837       }\r
838       catch (Throwable t) {\r
839         throw new MirLocalizerFailure(t);\r
840       }\r
841     }\r
842   }\r
843 \r
844   protected class ContentToTranslationsField implements EntityAdapterDefinition.CalculatedField {\r
845     public Object getValue(EntityAdapter anEntityAdapter) {\r
846       try {\r
847         return anEntityAdapter.getRelation(\r
848                     "is_published='t' and to_content="+anEntityAdapter.get("id"),\r
849                     "id",\r
850                     "content" );\r
851       }\r
852       catch (Throwable t) {\r
853         throw new RuntimeException(t.getMessage());\r
854       }\r
855     }\r
856   }\r
857 \r
858   protected class ContentToLanguageNameField implements EntityAdapterDefinition.CalculatedField {\r
859     public Object getValue(EntityAdapter anEntityAdapter) throws MirLocalizerFailure {\r
860       try {\r
861         String result = "";\r
862         EntityAdapter language = (EntityAdapter) anEntityAdapter.get("language");\r
863         if (language != null) {\r
864           if (language.get("code").equals("ot")) {\r
865             result = ((String) anEntityAdapter.get("subtitle")).trim();\r
866             if (result == null || result.equals(""))\r
867               result = (String) language.get("name");\r
868           } else {\r
869             result = (String) language.get("name");\r
870           }\r
871         }\r
872 \r
873         return result;\r
874       }\r
875       catch (Throwable t) {\r
876         throw new MirLocalizerFailure(t);\r
877       }\r
878     }\r
879   }\r
880 \r
881   protected class ContentToTranslationFunction implements Generator.Function {\r
882     private EntityAdapter target;\r
883     private String targetId;\r
884     private String targetLanguageId;\r
885 \r
886     public ContentToTranslationFunction(EntityAdapter aTarget) {\r
887       target = aTarget;\r
888       targetId = (String) target.get("id");\r
889       targetLanguageId = (String) target.get("to_language");\r
890     }\r
891 \r
892     public Object perform(List aParameters) throws GeneratorExc, GeneratorFailure {\r
893       if (aParameters.size()!=1 || !(aParameters.get(0) instanceof String))\r
894         throw new GeneratorExc("1 string parameter expected");\r
895 \r
896       try {\r
897         String language = (String) aParameters.get(0);\r
898         String languageId = languageModule.languageIdForCode(language);\r
899         Object result = null;\r
900 \r
901         if (languageId != null && !targetLanguageId.equals(languageId)) {\r
902           result = target.getToOneRelation(\r
903               "is_published='t' and to_content=" + targetId + " and to_language='" + JDBCStringRoutines.escapeStringLiteral(languageId) + "'",\r
904               "id", "content");\r
905         }\r
906 \r
907         if (result == null)\r
908           result = target;\r
909 \r
910         return result;\r
911       }\r
912       catch (Throwable t) {\r
913         t.printStackTrace(System.out);\r
914         throw new GeneratorFailure(t);\r
915       }\r
916     }\r
917   }\r
918 \r
919   protected class ContentToTranslationField implements EntityAdapterDefinition.CalculatedField {\r
920     public Object getValue(EntityAdapter anEntityAdapter) throws MirLocalizerFailure {\r
921       try {\r
922         return new ContentToTranslationFunction((EntityAdapter) anEntityAdapter.get("to_original"));\r
923       }\r
924       catch (Throwable t) {\r
925         throw new MirLocalizerFailure(t);\r
926       }\r
927     }\r
928   }\r
929 }\r
930 \r