fixed / clean ups
[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 java.util.HashMap;\r
33 import java.util.Iterator;\r
34 import java.util.List;\r
35 import java.util.Map;\r
36 import java.util.Vector;\r
37 \r
38 import mir.config.MirPropertiesConfiguration;\r
39 import mir.entity.Entity;\r
40 import mir.entity.adapter.EntityAdapter;\r
41 import mir.entity.adapter.EntityAdapterDefinition;\r
42 import mir.entity.adapter.EntityAdapterModel;\r
43 import mir.log.LoggerWrapper;\r
44 import mir.media.MediaHandler;\r
45 import mir.misc.NumberUtils;\r
46 import mir.util.ParameterExpander;\r
47 import mir.util.RewindableIterator;\r
48 import mir.util.StructuredContentParser;\r
49 import mircoders.entity.EntityUploadedMedia;\r
50 import mircoders.global.MirGlobal;\r
51 import mircoders.localizer.MirAdminInterfaceLocalizer;\r
52 import mircoders.localizer.MirDataModelLocalizer;\r
53 import mircoders.localizer.MirLocalizerExc;\r
54 import mircoders.localizer.MirLocalizerFailure;\r
55 import mircoders.media.MediaHelper;\r
56 import mircoders.module.ModuleContent;\r
57 import mircoders.storage.DatabaseArticleType;\r
58 import mircoders.storage.DatabaseAudio;\r
59 import mircoders.storage.DatabaseBreaking;\r
60 import mircoders.storage.DatabaseComment;\r
61 import mircoders.storage.DatabaseCommentStatus;\r
62 import mircoders.storage.DatabaseContent;\r
63 import mircoders.storage.DatabaseContentToMedia;\r
64 import mircoders.storage.DatabaseContentToTopics;\r
65 import mircoders.storage.DatabaseImageType;\r
66 import mircoders.storage.DatabaseImages;\r
67 import mircoders.storage.DatabaseLanguage;\r
68 import mircoders.storage.DatabaseMediaType;\r
69 import mircoders.storage.DatabaseMediafolder;\r
70 import mircoders.storage.DatabaseMessages;\r
71 import mircoders.storage.DatabaseOther;\r
72 import mircoders.storage.DatabaseTopics;\r
73 import mircoders.storage.DatabaseUploadedMedia;\r
74 import mircoders.storage.DatabaseUsers;\r
75 import mircoders.storage.DatabaseVideo;\r
76 \r
77 public class MirBasicDataModelLocalizer implements MirDataModelLocalizer {\r
78   protected LoggerWrapper logger;\r
79   protected MirPropertiesConfiguration configuration;\r
80 \r
81   public MirBasicDataModelLocalizer() throws MirLocalizerFailure, MirLocalizerExc {\r
82     logger = new LoggerWrapper("Localizer.DataModel");\r
83 \r
84     try {\r
85       configuration = MirPropertiesConfiguration.instance();\r
86     }\r
87     catch (Throwable e) {\r
88       throw new MirLocalizerFailure("Can't get configuration: " + e.getMessage(), e);\r
89     }\r
90   }\r
91 \r
92   protected void constructContentAdapterDefinition(EntityAdapterDefinition anEntityAdapterDefinition) throws MirLocalizerFailure, MirLocalizerExc {\r
93     try {\r
94       anEntityAdapterDefinition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
95       anEntityAdapterDefinition.addDBDateField("changedate", "webdb_lastchange", configuration.getString("Mir.DefaultTimezone"));\r
96       anEntityAdapterDefinition.addMirDateField("date", "date", configuration.getString("Mir.DefaultTimezone"));\r
97 \r
98       anEntityAdapterDefinition.addCalculatedField("lockinguser", new ContentToUserField("to_locking_user"));\r
99       anEntityAdapterDefinition.addCalculatedField("is_locked", new ContentToIsLockedField());\r
100 \r
101       anEntityAdapterDefinition.addCalculatedField("to_topics", new ContentToTopicsField());\r
102       anEntityAdapterDefinition.addCalculatedField("to_comments", new ContentToCommentsField());\r
103       anEntityAdapterDefinition.addCalculatedField("language", new ContentToLanguageField());\r
104 \r
105       anEntityAdapterDefinition.addCalculatedField("commentcount", new ContentCommentCountField(" and is_published='1'"));\r
106       anEntityAdapterDefinition.addCalculatedField("fullcommentcount", new ContentCommentCountField(""));\r
107 \r
108 \r
109       anEntityAdapterDefinition.addCalculatedField("mediacount", new ContentMediaCountField("uploaded_media", true));\r
110       anEntityAdapterDefinition.addCalculatedField("fullmediacount", new ContentMediaCountField("uploaded_media", false));\r
111 \r
112       anEntityAdapterDefinition.addCalculatedField("to_uploaded_media", new ContentToMediaField( "uploadedMedia" ));\r
113       anEntityAdapterDefinition.addCalculatedField("to_media_images",  new ContentToMediaField( "image" ));\r
114       anEntityAdapterDefinition.addCalculatedField("to_media_audio", new ContentToMediaField( "audio" ));\r
115       anEntityAdapterDefinition.addCalculatedField("to_media_video", new ContentToMediaField( "video" ));\r
116       anEntityAdapterDefinition.addCalculatedField("to_media_other", new ContentToMediaField( "otherMedia" ));\r
117       anEntityAdapterDefinition.addCalculatedField("to_all_uploaded_media", new ContentToMediaField( "uploadedMedia", false));\r
118       anEntityAdapterDefinition.addCalculatedField("to_all_media_images",  new ContentToMediaField( "image", false));\r
119       anEntityAdapterDefinition.addCalculatedField("to_all_media_audio", new ContentToMediaField( "audio", false));\r
120       anEntityAdapterDefinition.addCalculatedField("to_all_media_video", new ContentToMediaField( "video", false));\r
121       anEntityAdapterDefinition.addCalculatedField("to_all_media_other", new ContentToMediaField( "otherMedia", false));\r
122       anEntityAdapterDefinition.addCalculatedField("to_media_icon", new ContentToIconField());\r
123 \r
124       anEntityAdapterDefinition.addCalculatedField("article_type", new ContentToArticleTypeField());\r
125 \r
126       anEntityAdapterDefinition.addCalculatedField("description_parsed", new FilteredField("description"));\r
127       anEntityAdapterDefinition.addCalculatedField("content_data_parsed", new FilteredField("content_data"));\r
128 \r
129       anEntityAdapterDefinition.addCalculatedField("children", new ContentToChildrenField());\r
130       anEntityAdapterDefinition.addCalculatedField("parent", new ContentToParentField());\r
131 \r
132       anEntityAdapterDefinition.addCalculatedField("publicurl", new ExpandedField(configuration.getString("Article.PublicUrl")));\r
133 \r
134       anEntityAdapterDefinition.addCalculatedField("operations",\r
135           new EntityToSimpleOperationsField(MirGlobal.localizer().adminInterface().simpleArticleOperations()));\r
136     }\r
137     catch (Throwable t) {\r
138       throw new MirLocalizerFailure(t.getMessage(), t);\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       definition = new EntityAdapterDefinition();\r
226       definition.addCalculatedField("mediafolder", new MediaToMediaFolderField());\r
227       definition.addCalculatedField("human_readable_size", new HumanReadableSizeField("value"));\r
228       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
229       definition.addCalculatedField("info", new MediaToMediaInfoField());\r
230       definition.addCalculatedField("big_icon", new MediaToBigIconField());\r
231       result.addMapping( "otherMedia", DatabaseOther.getInstance(), definition);\r
232 \r
233 \r
234       result.addMapping( "mediaFolder", DatabaseMediafolder.getInstance(), new EntityAdapterDefinition());\r
235       result.addMapping( "imageType", DatabaseImageType.getInstance(), new EntityAdapterDefinition());\r
236       result.addMapping( "language", DatabaseLanguage.getInstance(), new EntityAdapterDefinition());\r
237       result.addMapping( "mediaType", DatabaseMediaType.getInstance(), new EntityAdapterDefinition());\r
238       result.addMapping( "topic", DatabaseTopics.getInstance(), new EntityAdapterDefinition());\r
239 \r
240       definition = new EntityAdapterDefinition();\r
241       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
242       definition.addDBDateField("lastlogindate", "lastlogin", configuration.getString("Mir.DefaultTimezone"));\r
243       definition.addCalculatedField("structuredProfile", new StructuredContentField("profile"));\r
244       result.addMapping( "user", DatabaseUsers.getInstance(), definition);\r
245 \r
246       result.addMapping( "otherMedia", DatabaseOther.getInstance(), new EntityAdapterDefinition());\r
247 \r
248       result.addMapping( "content_x_topic", DatabaseContentToTopics.getInstance(), new EntityAdapterDefinition());\r
249 \r
250     }\r
251     catch (Throwable t) {\r
252       throw new MirLocalizerFailure(t.getMessage(), t);\r
253     }\r
254 \r
255     return result;\r
256   }\r
257 \r
258   protected class CommentToContentField implements EntityAdapterDefinition.CalculatedField {\r
259     public Object getValue(EntityAdapter anEntityAdapter) {\r
260       try {\r
261         return anEntityAdapter.getToOneRelation(\r
262                     "id="+anEntityAdapter.get("to_media"),\r
263                     "id",\r
264                     "content" );\r
265       }\r
266       catch (Throwable t) {\r
267         throw new RuntimeException(t.getMessage());\r
268       }\r
269     }\r
270   }\r
271 \r
272   protected class CommentToStatusField implements EntityAdapterDefinition.CalculatedField {\r
273     public Object getValue(EntityAdapter anEntityAdapter) {\r
274       try {\r
275         return anEntityAdapter.getToOneRelation(\r
276                     "id="+anEntityAdapter.get("to_comment_status"),\r
277                     "id",\r
278                     "commentStatus" );\r
279       }\r
280       catch (Throwable t) {\r
281         throw new RuntimeException(t.getMessage());\r
282       }\r
283     }\r
284   }\r
285 \r
286   protected class EntityToSimpleOperationsField implements EntityAdapterDefinition.CalculatedField {\r
287     private List operations;\r
288 \r
289     public EntityToSimpleOperationsField(List anOperations) {\r
290       operations = anOperations;\r
291     }\r
292 \r
293     public Object getValue(EntityAdapter anEntityAdapter) {\r
294       try {\r
295         Iterator i = operations.iterator();\r
296         List availableOperations = new Vector();\r
297 \r
298         while (i.hasNext()) {\r
299           MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation =\r
300             (MirAdminInterfaceLocalizer.MirSimpleEntityOperation) i.next();\r
301 \r
302           if (operation.isAvailable(anEntityAdapter)) {\r
303             availableOperations.add(operation.getName());\r
304           }\r
305         };\r
306 \r
307         return availableOperations;\r
308       }\r
309       catch (Throwable t) {\r
310         throw new RuntimeException(t.getMessage());\r
311       }\r
312     }\r
313   }\r
314 \r
315   protected class FilteredField implements EntityAdapterDefinition.CalculatedField {\r
316     private String fieldName;\r
317 \r
318     public FilteredField(String aFieldName) {\r
319       fieldName = aFieldName;\r
320     }\r
321 \r
322     public Object getValue(EntityAdapter anEntityAdapter) {\r
323       try {\r
324         if (anEntityAdapter.get("is_html")!=null && anEntityAdapter.get("is_html").equals("1")) {\r
325           return MirGlobal.localizer().producerAssistant().filterHTMLText((String) anEntityAdapter.get(fieldName));\r
326         }\r
327         else {\r
328           return MirGlobal.localizer().producerAssistant().filterNonHTMLText((String) anEntityAdapter.get(fieldName));\r
329         }\r
330       }\r
331       catch (Throwable t) {\r
332         throw new RuntimeException(t.getMessage());\r
333       }\r
334     }\r
335   }\r
336 \r
337   protected class StructuredContentField implements EntityAdapterDefinition.CalculatedField {\r
338     private String expression;\r
339 \r
340     public StructuredContentField(String anExpression) {\r
341       expression = anExpression;\r
342     }\r
343 \r
344     public Object getValue(EntityAdapter anEntityAdapter) {\r
345       try {\r
346         return StructuredContentParser.parse(ParameterExpander.evaluateStringExpression(anEntityAdapter, expression));\r
347       }\r
348       catch (Throwable t) {\r
349         throw new RuntimeException(t.getMessage());\r
350       }\r
351     }\r
352   }\r
353 \r
354   protected class ExpandedField implements EntityAdapterDefinition.CalculatedField {\r
355     private String expression;\r
356 \r
357     public ExpandedField(String anExpression) {\r
358       expression = anExpression;\r
359     }\r
360 \r
361     public Object getValue(EntityAdapter anEntityAdapter) {\r
362       try {\r
363         return ParameterExpander.expandExpression(anEntityAdapter, expression);\r
364       }\r
365       catch (Throwable t) {\r
366         throw new RuntimeException(t.getMessage());\r
367       }\r
368     }\r
369   }\r
370 \r
371   protected class EvaluatedField implements EntityAdapterDefinition.CalculatedField {\r
372     private String expression;\r
373 \r
374     public EvaluatedField(String anExpression) {\r
375       expression = anExpression;\r
376     }\r
377 \r
378     public Object getValue(EntityAdapter anEntityAdapter) {\r
379       try {\r
380         return ParameterExpander.evaluateExpression(anEntityAdapter, expression);\r
381       }\r
382       catch (Throwable t) {\r
383         throw new RuntimeException(t.getMessage());\r
384       }\r
385     }\r
386   }\r
387 \r
388   protected class ContentToParentField implements EntityAdapterDefinition.CalculatedField {\r
389     public Object getValue(EntityAdapter anEntityAdapter) {\r
390       try {\r
391         logger.debug("ContentToParentField.getFieldValue");\r
392         return anEntityAdapter.getToOneRelation(\r
393                     "id="+anEntityAdapter.get("to_content"),\r
394                     "id",\r
395                     "content" );\r
396       }\r
397       catch (Throwable t) {\r
398         throw new RuntimeException(t.getMessage());\r
399       }\r
400     }\r
401   }\r
402 \r
403   protected class ContentToChildrenField implements EntityAdapterDefinition.CalculatedField {\r
404     public Object getValue(EntityAdapter anEntityAdapter) {\r
405       try {\r
406         return anEntityAdapter.getRelation(\r
407                     "to_content="+anEntityAdapter.get("id"),\r
408                     "id",\r
409                     "content" );\r
410       }\r
411       catch (Throwable t) {\r
412         throw new RuntimeException(t.getMessage());\r
413       }\r
414     }\r
415   }\r
416 \r
417   protected class ContentToLanguageField implements EntityAdapterDefinition.CalculatedField {\r
418     public Object getValue(EntityAdapter anEntityAdapter) {\r
419       try {\r
420         return anEntityAdapter.getToOneRelation(\r
421                     "id="+anEntityAdapter.get("to_language"),\r
422                     "id",\r
423                     "language" );\r
424       }\r
425       catch (Throwable t) {\r
426         throw new RuntimeException(t.getMessage());\r
427       }\r
428     }\r
429   }\r
430 \r
431   protected class ContentToArticleTypeField implements EntityAdapterDefinition.CalculatedField {\r
432     public Object getValue(EntityAdapter anEntityAdapter) {\r
433       try {\r
434         return anEntityAdapter.getToOneRelation(\r
435                     "id="+anEntityAdapter.get("to_article_type"),\r
436                     "id",\r
437                     "articleType" );\r
438       }\r
439       catch (Throwable t) {\r
440         throw new RuntimeException(t.getMessage());\r
441       }\r
442     }\r
443   }\r
444 \r
445   protected class MediaToMediaFolderField implements EntityAdapterDefinition.CalculatedField {\r
446     public Object getValue(EntityAdapter anEntityAdapter) {\r
447       try {\r
448         return anEntityAdapter.getToOneRelation(\r
449                     "id="+anEntityAdapter.get("to_media_folder"),\r
450                     "id",\r
451                     "mediaFolder" );\r
452       }\r
453       catch (Throwable t) {\r
454         throw new RuntimeException(t.getMessage());\r
455       }\r
456     }\r
457   }\r
458 \r
459   public static class MediaInfo {\r
460     private MediaHandler mediaHandler;\r
461 \r
462     public MediaInfo(MediaHandler aHandler) {\r
463       mediaHandler = aHandler;\r
464     }\r
465     public String getBigIcon() {\r
466       if (mediaHandler == null)\r
467         return "bla";\r
468       else\r
469         return mediaHandler.getBigIconName();\r
470     }\r
471 \r
472     public String getSmallIcon() {\r
473       if (mediaHandler == null)\r
474         return "bla";\r
475       else\r
476         return mediaHandler.getTinyIconName();\r
477     }\r
478 \r
479     public String getMediaType() {\r
480       return "";\r
481     }\r
482   }\r
483 \r
484   protected class MediaToMediaInfoField implements EntityAdapterDefinition.CalculatedField {\r
485     public Object getValue(EntityAdapter anEntityAdapter) {\r
486       try {\r
487         MediaHandler mediaHandler = MediaHelper.getHandler(((EntityUploadedMedia) anEntityAdapter.getEntity()).getMediaType());\r
488 \r
489         return new MediaInfo(mediaHandler);\r
490       }\r
491       catch (Throwable t) {\r
492         throw new RuntimeException(t.getMessage());\r
493       }\r
494     }\r
495   }\r
496 \r
497   protected class MediaToBigIconField implements EntityAdapterDefinition.CalculatedField {\r
498     public Object getValue(EntityAdapter anEntityAdapter) {\r
499       try {\r
500         return MediaHelper.getHandler(((EntityUploadedMedia) anEntityAdapter.getEntity()).getMediaType()).getBigIconName();\r
501       }\r
502       catch (Throwable t) {\r
503         throw new RuntimeException(t.getMessage());\r
504       }\r
505     }\r
506   }\r
507 \r
508   protected class ContentToCommentsField implements EntityAdapterDefinition.CalculatedField {\r
509     private String extracondition;\r
510     private String order;\r
511 \r
512     public ContentToCommentsField() {\r
513       this ( " and is_published='1'", "webdb_create");\r
514     }\r
515 \r
516     public ContentToCommentsField(String anExtraCondition, String anOrder) {\r
517       order = anOrder;\r
518       extracondition = anExtraCondition;\r
519     }\r
520 \r
521     public Object getValue(EntityAdapter anEntityAdapter) {\r
522       try {\r
523         return anEntityAdapter.getRelation(\r
524                     "to_media="+anEntityAdapter.get("id")+" " + extracondition,\r
525                     order,\r
526                     "comment" );\r
527       }\r
528       catch (Throwable t) {\r
529         throw new RuntimeException(t.getMessage());\r
530       }\r
531     }\r
532   }\r
533 \r
534   protected class ContentToTopicsField implements EntityAdapterDefinition.CalculatedField {\r
535     private String topicCondition;\r
536     private String topicOrder;\r
537 \r
538     public ContentToTopicsField() {\r
539       this(null);\r
540     }\r
541 \r
542     public ContentToTopicsField(String aTopicCondition) {\r
543       this(aTopicCondition, "title");\r
544     }\r
545 \r
546     public ContentToTopicsField(String aTopicCondition, String aTopicOrder) {\r
547       topicCondition = aTopicCondition;\r
548       topicOrder = aTopicOrder;\r
549     }\r
550 \r
551     public Object getValue(EntityAdapter anEntityAdapter) {\r
552       try {\r
553 \r
554         Vector extraTable = new Vector();\r
555         extraTable.add("content_x_topic cxt");\r
556         String condition = "cxt.content_id="+anEntityAdapter.get("id")+\r
557           " and cxt.topic_id=t.id";\r
558 \r
559         if (topicCondition!=null && topicCondition.length()>0)\r
560           condition = "(" + topicCondition + ") and " + condition;\r
561 \r
562         return anEntityAdapter.getComplexRelation("t", extraTable,\r
563                     condition, topicOrder, "topic" );\r
564       }\r
565       catch (Throwable t) {\r
566         throw new RuntimeException(t.getMessage());\r
567       }\r
568     }\r
569   }\r
570 \r
571   protected class ContentToMediaField implements EntityAdapterDefinition.CalculatedField {\r
572     private String definition;\r
573     private boolean published;\r
574 \r
575     public ContentToMediaField(String aDefinition, boolean anOnlyPublished) {\r
576       definition = aDefinition;\r
577       published = anOnlyPublished;\r
578     }\r
579 \r
580     public ContentToMediaField(String aDefinition) {\r
581       this(aDefinition, true);\r
582     }\r
583 \r
584     public Object getValue(EntityAdapter anEntityAdapter) {\r
585       try {\r
586         String condition = "cxm.content_id="+ anEntityAdapter.get("id") +\r
587           " and cxm.media_id = m.id";\r
588         if (published)\r
589           condition = "is_published='t' and " + condition;\r
590 \r
591         List extraTables = new Vector();\r
592         extraTables.add("content_x_media cxm");\r
593 \r
594         return anEntityAdapter.getComplexRelation("m", extraTables, condition, "id", definition);\r
595       }\r
596       catch (Throwable t) {\r
597         throw new RuntimeException(t.getMessage());\r
598       }\r
599     }\r
600   }\r
601 \r
602   protected class CommentToMediaField implements EntityAdapterDefinition.CalculatedField {\r
603     private String definition;\r
604     private boolean published;\r
605 \r
606     public CommentToMediaField(String aDefinition, boolean anOnlyPublished) {\r
607       definition = aDefinition;\r
608       published = anOnlyPublished;\r
609     }\r
610 \r
611     public CommentToMediaField(String aDefinition) {\r
612       this(aDefinition, true);\r
613     }\r
614 \r
615     public Object getValue(EntityAdapter anEntityAdapter) {\r
616       try {\r
617 \r
618         String condition = "cxm.comment_id="+ anEntityAdapter.get("id") +\r
619                   " and cxm.media_id = m.id";\r
620         if (published)\r
621            condition = "is_published='t' and " + condition;\r
622 \r
623         List extraTables = new Vector();\r
624         extraTables.add("comment_x_media cxm");\r
625         return anEntityAdapter.getComplexRelation("m", extraTables, condition, "id", definition);\r
626 \r
627       }\r
628       catch (Throwable t) {\r
629         throw new RuntimeException(t.getMessage());\r
630       }\r
631     }\r
632   }\r
633 \r
634   protected class ContentToIconField implements EntityAdapterDefinition.CalculatedField {\r
635     public Object getValue(EntityAdapter anEntityAdapter) {\r
636       EntityAdapter media;\r
637       Entity mediaType;\r
638       RewindableIterator iterator;\r
639       Map result;\r
640       MediaHandler mediaHandler;\r
641       String tinyIcon;\r
642       String iconAlt;\r
643 \r
644       try {\r
645         iterator = (RewindableIterator) (anEntityAdapter.get("to_uploaded_media"));\r
646         iterator.rewind();\r
647 \r
648         tinyIcon = MirGlobal.config().getString("Producer.Icon.TinyText");\r
649         iconAlt = "Text";\r
650 \r
651         if (iterator.hasNext()) {\r
652           media = (EntityAdapter) iterator.next();\r
653 \r
654           mediaType = ((EntityUploadedMedia) (media.getEntity())).getMediaType();\r
655           mediaHandler = MediaHelper.getHandler( mediaType );\r
656 \r
657           tinyIcon = mediaHandler.getTinyIconName();\r
658           iconAlt = mediaHandler.getIconAltName();\r
659         }\r
660       }\r
661       catch (Throwable t) {\r
662         logger.error("ContentToIconField: " +t.getMessage());\r
663         throw new RuntimeException(t.getMessage());\r
664       }\r
665 \r
666       result = new HashMap();\r
667       result.put("tiny_icon", MirGlobal.config().getString("Producer.ImageRoot") + "/" + tinyIcon);\r
668       result.put("icon_alt", iconAlt);\r
669 \r
670       return result;\r
671     }\r
672   }\r
673 \r
674   protected class ContentCommentCountField implements EntityAdapterDefinition.CalculatedField {\r
675     private String extraCondition;\r
676 \r
677     public ContentCommentCountField(String anExtraCondition) {\r
678       super();\r
679 \r
680       extraCondition = anExtraCondition;\r
681     }\r
682 \r
683     public Object getValue(EntityAdapter anEntityAdapter) {\r
684       try {\r
685         return Integer.toString(\r
686             DatabaseComment.getInstance().getSize(\r
687                   "to_media="+anEntityAdapter.get("id")+" " + extraCondition));\r
688       }\r
689       catch (Throwable t) {\r
690         throw new RuntimeException(t.getMessage());\r
691       }\r
692     }\r
693   }\r
694 \r
695   protected class HumanReadableSizeField implements EntityAdapterDefinition.CalculatedField {\r
696       private String fieldName;\r
697 \r
698       public HumanReadableSizeField(String aFieldName) {\r
699         fieldName= aFieldName;\r
700       }\r
701 \r
702       public Object getValue(EntityAdapter anEntityAdapter) {\r
703         try {\r
704           String size = (String) anEntityAdapter.get(fieldName);\r
705           if (size!=null)\r
706             return NumberUtils.humanReadableSize(Double.parseDouble(size));\r
707           else\r
708             return "";\r
709         }\r
710         catch (Throwable t) {\r
711           throw new RuntimeException(t.getMessage());\r
712         }\r
713       }\r
714     }\r
715 \r
716 \r
717   protected class ContentMediaCountField implements EntityAdapterDefinition.CalculatedField {\r
718     private String table;\r
719     private boolean published;\r
720 \r
721     public ContentMediaCountField(String aTable, boolean anOnlyPublished) {\r
722       table = aTable;\r
723       published = anOnlyPublished;\r
724     }\r
725 \r
726     public ContentMediaCountField(String aTable) {\r
727       this(aTable, true);\r
728     }\r
729 \r
730     public Object getValue(EntityAdapter anEntityAdapter) {\r
731       try {\r
732         Vector extraTable = new Vector();\r
733         extraTable.add(table+" m");\r
734         String selectSql = "cxm.media_id=m.id and cxm.content_id="+\r
735           anEntityAdapter.get("id");\r
736         if (published)\r
737           selectSql+= " and m.is_published='t'";\r
738 \r
739         return Integer.toString(\r
740             DatabaseContentToMedia.getInstance().getSize(\r
741               "cxm", extraTable, selectSql));\r
742       }\r
743       catch (Throwable t) {\r
744         throw new RuntimeException(t.getMessage());\r
745       }\r
746     }\r
747   }\r
748 \r
749   protected class ContentToUserField implements EntityAdapterDefinition.CalculatedField {\r
750     private String fieldName;\r
751 \r
752     public ContentToUserField(String aFieldName) {\r
753       fieldName = aFieldName;\r
754     }\r
755 \r
756     public Object getValue(EntityAdapter anEntityAdapter) {\r
757       try {\r
758         return anEntityAdapter.getToOneRelation(\r
759             "id=" + anEntityAdapter.get(fieldName),\r
760             "id",\r
761             "user");\r
762       }\r
763       catch (Throwable t) {\r
764         throw new RuntimeException(t.getMessage());\r
765       }\r
766     }\r
767   }\r
768 \r
769   protected class ContentToIsLockedField implements EntityAdapterDefinition.CalculatedField {\r
770     private ModuleContent contentModule;\r
771 \r
772     public ContentToIsLockedField() {\r
773       contentModule = new ModuleContent(DatabaseContent.getInstance());\r
774     }\r
775 \r
776     public Object getValue(EntityAdapter anEntityAdapter) {\r
777       try {\r
778         return new Boolean(contentModule.queryArticleLock(anEntityAdapter.getEntity().getId())!=null);\r
779       }\r
780       catch (Throwable t) {\r
781         throw new RuntimeException(t.getMessage());\r
782       }\r
783     }\r
784   }\r
785 }\r