e5d0c7fb6b26b22aaf631840db419f8d00571015
[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.MediaHelper;\r
45 import mir.media.MirMedia;\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.storage.DatabaseArticleType;\r
56 import mircoders.storage.DatabaseAudio;\r
57 import mircoders.storage.DatabaseBreaking;\r
58 import mircoders.storage.DatabaseComment;\r
59 import mircoders.storage.DatabaseCommentStatus;\r
60 import mircoders.storage.DatabaseContent;\r
61 import mircoders.storage.DatabaseContentToMedia;\r
62 import mircoders.storage.DatabaseContentToTopics;\r
63 import mircoders.storage.DatabaseImageType;\r
64 import mircoders.storage.DatabaseImages;\r
65 import mircoders.storage.DatabaseLanguage;\r
66 import mircoders.storage.DatabaseMediaType;\r
67 import mircoders.storage.DatabaseMediafolder;\r
68 import mircoders.storage.DatabaseMessages;\r
69 import mircoders.storage.DatabaseOther;\r
70 import mircoders.storage.DatabaseTopics;\r
71 import mircoders.storage.DatabaseUploadedMedia;\r
72 import mircoders.storage.DatabaseUsers;\r
73 import mircoders.storage.DatabaseVideo;\r
74 \r
75 public class MirBasicDataModelLocalizer implements MirDataModelLocalizer {\r
76   protected LoggerWrapper logger;\r
77   protected MirPropertiesConfiguration configuration;\r
78 \r
79   public MirBasicDataModelLocalizer() throws MirLocalizerFailure, MirLocalizerExc {\r
80     logger = new LoggerWrapper("Localizer.DataModel");\r
81 \r
82     try {\r
83       configuration = MirPropertiesConfiguration.instance();\r
84     }\r
85     catch (Throwable e) {\r
86       throw new MirLocalizerFailure("Can't get configuration: " + e.getMessage(), e);\r
87     }\r
88   }\r
89 \r
90   protected void constructContentAdapterDefinition(EntityAdapterDefinition anEntityAdapterDefinition) throws MirLocalizerFailure, MirLocalizerExc {\r
91     try {\r
92       anEntityAdapterDefinition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
93       anEntityAdapterDefinition.addDBDateField("changedate", "webdb_lastchange", configuration.getString("Mir.DefaultTimezone"));\r
94       anEntityAdapterDefinition.addMirDateField("date", "date", configuration.getString("Mir.DefaultTimezone"));\r
95       anEntityAdapterDefinition.addCalculatedField("to_topics", new ContentToTopicsField());\r
96       anEntityAdapterDefinition.addCalculatedField("to_comments", new ContentToCommentsField());\r
97       anEntityAdapterDefinition.addCalculatedField("language", new ContentToLanguageField());\r
98 \r
99       anEntityAdapterDefinition.addCalculatedField("commentcount", new ContentCommentCountField(" and is_published='1'"));\r
100       anEntityAdapterDefinition.addCalculatedField("fullcommentcount", new ContentCommentCountField(""));\r
101 \r
102       anEntityAdapterDefinition.addCalculatedField("to_uploaded_media", new ContentToMediaField( "uploadedMedia" ));\r
103       anEntityAdapterDefinition.addCalculatedField("to_media_images",  new ContentToMediaField( "image" ));\r
104       anEntityAdapterDefinition.addCalculatedField("to_media_audio", new ContentToMediaField( "audio" ));\r
105       anEntityAdapterDefinition.addCalculatedField("to_media_video", new ContentToMediaField( "video" ));\r
106       anEntityAdapterDefinition.addCalculatedField("to_media_other", new ContentToMediaField( "otherMedia" ));\r
107       anEntityAdapterDefinition.addCalculatedField("to_all_uploaded_media", new ContentToMediaField( "uploadedMedia", false));\r
108       anEntityAdapterDefinition.addCalculatedField("to_all_media_images",  new ContentToMediaField( "image", false));\r
109       anEntityAdapterDefinition.addCalculatedField("to_all_media_audio", new ContentToMediaField( "audio", false));\r
110       anEntityAdapterDefinition.addCalculatedField("to_all_media_video", new ContentToMediaField( "video", false));\r
111       anEntityAdapterDefinition.addCalculatedField("to_all_media_other", new ContentToMediaField( "otherMedia", false));\r
112       anEntityAdapterDefinition.addCalculatedField("to_media_icon", new ContentToIconField());\r
113 \r
114       anEntityAdapterDefinition.addCalculatedField("article_type", new ContentToArticleTypeField());\r
115 \r
116       anEntityAdapterDefinition.addCalculatedField("description_parsed", new FilteredField("description"));\r
117       anEntityAdapterDefinition.addCalculatedField("content_data_parsed", new FilteredField("content_data"));\r
118 \r
119       anEntityAdapterDefinition.addCalculatedField("children", new ContentToChildrenField());\r
120       anEntityAdapterDefinition.addCalculatedField("parent", new ContentToParentField());\r
121 \r
122       anEntityAdapterDefinition.addCalculatedField("publicurl", new ExpandedField(configuration.getString("Article.PublicUrl")));\r
123 \r
124       anEntityAdapterDefinition.addCalculatedField("operations",\r
125           new EntityToSimpleOperationsField(MirGlobal.localizer().adminInterface().simpleArticleOperations()));\r
126     }\r
127     catch (Throwable t) {\r
128       throw new MirLocalizerFailure(t.getMessage(), t);\r
129     }\r
130   }\r
131 \r
132   protected void constructCommentAdapterDefinition(EntityAdapterDefinition anEntityAdapterDefinition) throws MirLocalizerFailure {\r
133     try {\r
134       anEntityAdapterDefinition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
135       anEntityAdapterDefinition.addCalculatedField("to_content", new CommentToContentField());\r
136       anEntityAdapterDefinition.addCalculatedField("status", new CommentToStatusField());\r
137 \r
138       anEntityAdapterDefinition.addCalculatedField("to_uploaded_media", new CommentToMediaField( "uploadedMedia" ));\r
139       anEntityAdapterDefinition.addCalculatedField("to_media_images",  new CommentToMediaField( "image" ));\r
140       anEntityAdapterDefinition.addCalculatedField("to_media_audio", new CommentToMediaField( "audio" ));\r
141       anEntityAdapterDefinition.addCalculatedField("to_media_video", new CommentToMediaField( "video" ));\r
142       anEntityAdapterDefinition.addCalculatedField("to_media_other", new CommentToMediaField( "otherMedia" ));\r
143       anEntityAdapterDefinition.addCalculatedField("to_all_uploaded_media", new CommentToMediaField( "uploadedMedia", false));\r
144       anEntityAdapterDefinition.addCalculatedField("to_all_media_images",  new CommentToMediaField( "image", false));\r
145       anEntityAdapterDefinition.addCalculatedField("to_all_media_audio", new CommentToMediaField( "audio", false));\r
146       anEntityAdapterDefinition.addCalculatedField("to_all_media_video", new CommentToMediaField( "video", false));\r
147       anEntityAdapterDefinition.addCalculatedField("to_all_media_other", new CommentToMediaField( "otherMedia", false));\r
148 \r
149       anEntityAdapterDefinition.addCalculatedField("publicurl", new ExpandedField(configuration.getString("Comment.PublicUrl")));\r
150 \r
151       anEntityAdapterDefinition.addCalculatedField("description_parsed", new FilteredField("description"));\r
152       anEntityAdapterDefinition.addCalculatedField("operations",\r
153           new EntityToSimpleOperationsField(MirGlobal.localizer().adminInterface().simpleCommentOperations()));\r
154     }\r
155     catch (Throwable t) {\r
156       throw new MirLocalizerFailure(t.getMessage(), t);\r
157     }\r
158   }\r
159 \r
160   public EntityAdapterModel adapterModel() throws MirLocalizerFailure, MirLocalizerExc {\r
161     EntityAdapterModel result = new EntityAdapterModel();\r
162 \r
163     try {\r
164       EntityAdapterDefinition definition;\r
165 \r
166       definition = new EntityAdapterDefinition();\r
167       constructContentAdapterDefinition( definition );\r
168       result.addMapping( "content", DatabaseContent.getInstance(), definition);\r
169 \r
170       definition = new EntityAdapterDefinition();\r
171       constructCommentAdapterDefinition( definition );\r
172       result.addMapping( "comment", DatabaseComment.getInstance(), definition);\r
173 \r
174       result.addMapping( "articleType", DatabaseArticleType.getInstance(), new EntityAdapterDefinition());\r
175       result.addMapping( "commentStatus", DatabaseCommentStatus.getInstance(), new EntityAdapterDefinition());\r
176 \r
177       definition = new EntityAdapterDefinition();\r
178       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
179       result.addMapping( "breakingNews", DatabaseBreaking.getInstance(), definition);\r
180 \r
181       definition = new EntityAdapterDefinition();\r
182       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
183       result.addMapping( "internalMessage", DatabaseMessages.getInstance(), definition);\r
184 \r
185       definition = new EntityAdapterDefinition();\r
186       definition.addCalculatedField("mediafolder", new MediaToMediaFolderField());\r
187       result.addMapping( "uploadedMedia", DatabaseUploadedMedia.getInstance(), definition);\r
188       definition = new EntityAdapterDefinition();\r
189       definition.addCalculatedField("mediafolder", new MediaToMediaFolderField());\r
190       result.addMapping( "image", DatabaseImages.getInstance(), definition);\r
191       definition = new EntityAdapterDefinition();\r
192       definition.addCalculatedField("mediafolder", new MediaToMediaFolderField());\r
193       result.addMapping( "audio", DatabaseAudio.getInstance(), definition);\r
194       definition = new EntityAdapterDefinition();\r
195       definition.addCalculatedField("mediafolder", new MediaToMediaFolderField());\r
196       result.addMapping( "video", DatabaseVideo.getInstance(), definition);\r
197       definition = new EntityAdapterDefinition();\r
198       definition.addCalculatedField("mediafolder", new MediaToMediaFolderField());\r
199       result.addMapping( "otherMedia", DatabaseOther.getInstance(), definition);\r
200 \r
201 \r
202       result.addMapping( "mediaFolder", DatabaseMediafolder.getInstance(), new EntityAdapterDefinition());\r
203       result.addMapping( "imageType", DatabaseImageType.getInstance(), new EntityAdapterDefinition());\r
204       result.addMapping( "language", DatabaseLanguage.getInstance(), new EntityAdapterDefinition());\r
205       result.addMapping( "mediaType", DatabaseMediaType.getInstance(), new EntityAdapterDefinition());\r
206       result.addMapping( "topic", DatabaseTopics.getInstance(), new EntityAdapterDefinition());\r
207       result.addMapping( "user", DatabaseUsers.getInstance(), new EntityAdapterDefinition());\r
208       result.addMapping( "otherMedia", DatabaseOther.getInstance(), new EntityAdapterDefinition());\r
209 \r
210       result.addMapping( "content_x_topic", DatabaseContentToTopics.getInstance(), new EntityAdapterDefinition());\r
211 \r
212     }\r
213     catch (Throwable t) {\r
214       throw new MirLocalizerFailure(t.getMessage(), t);\r
215     }\r
216 \r
217     return result;\r
218   }\r
219 \r
220   protected class CommentToContentField implements EntityAdapterDefinition.CalculatedField {\r
221     public Object getValue(EntityAdapter anEntityAdapter) {\r
222       try {\r
223         return anEntityAdapter.getToOneRelation(\r
224                     "id="+anEntityAdapter.get("to_media"),\r
225                     "id",\r
226                     "content" );\r
227       }\r
228       catch (Throwable t) {\r
229         throw new RuntimeException(t.getMessage());\r
230       }\r
231     }\r
232   }\r
233 \r
234   protected class CommentToStatusField implements EntityAdapterDefinition.CalculatedField {\r
235     public Object getValue(EntityAdapter anEntityAdapter) {\r
236       try {\r
237         return anEntityAdapter.getToOneRelation(\r
238                     "id="+anEntityAdapter.get("to_comment_status"),\r
239                     "id",\r
240                     "commentStatus" );\r
241       }\r
242       catch (Throwable t) {\r
243         throw new RuntimeException(t.getMessage());\r
244       }\r
245     }\r
246   }\r
247 \r
248   protected class EntityToSimpleOperationsField implements EntityAdapterDefinition.CalculatedField {\r
249     private List operations;\r
250 \r
251     public EntityToSimpleOperationsField(List anOperations) {\r
252       operations = anOperations;\r
253     }\r
254 \r
255     public Object getValue(EntityAdapter anEntityAdapter) {\r
256       try {\r
257         Iterator i = operations.iterator();\r
258         List availableOperations = new Vector();\r
259 \r
260         while (i.hasNext()) {\r
261           MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation =\r
262             (MirAdminInterfaceLocalizer.MirSimpleEntityOperation) i.next();\r
263 \r
264           if (operation.isAvailable(anEntityAdapter)) {\r
265             availableOperations.add(operation.getName());\r
266           }\r
267         };\r
268 \r
269         return availableOperations;\r
270       }\r
271       catch (Throwable t) {\r
272         throw new RuntimeException(t.getMessage());\r
273       }\r
274     }\r
275   }\r
276 \r
277   protected class FilteredField implements EntityAdapterDefinition.CalculatedField {\r
278     private String fieldName;\r
279 \r
280     public FilteredField(String aFieldName) {\r
281       fieldName = aFieldName;\r
282     }\r
283 \r
284     public Object getValue(EntityAdapter anEntityAdapter) {\r
285       try {\r
286         if (anEntityAdapter.get("is_html")!=null && anEntityAdapter.get("is_html").equals("1")) {\r
287           return MirGlobal.localizer().producerAssistant().filterHTMLText((String) anEntityAdapter.get(fieldName));\r
288         }\r
289         else {\r
290           return MirGlobal.localizer().producerAssistant().filterNonHTMLText((String) anEntityAdapter.get(fieldName));\r
291         }\r
292       }\r
293       catch (Throwable t) {\r
294         throw new RuntimeException(t.getMessage());\r
295       }\r
296     }\r
297   }\r
298 \r
299   protected class StructuredContentField implements EntityAdapterDefinition.CalculatedField {\r
300     private String expression;\r
301 \r
302     public StructuredContentField(String anExpression) {\r
303       expression = anExpression;\r
304     }\r
305 \r
306     public Object getValue(EntityAdapter anEntityAdapter) {\r
307       try {\r
308         return StructuredContentParser.parse(ParameterExpander.evaluateStringExpression(anEntityAdapter, expression));\r
309       }\r
310       catch (Throwable t) {\r
311         throw new RuntimeException(t.getMessage());\r
312       }\r
313     }\r
314   }\r
315 \r
316   protected class ExpandedField implements EntityAdapterDefinition.CalculatedField {\r
317     private String expression;\r
318 \r
319     public ExpandedField(String anExpression) {\r
320       expression = anExpression;\r
321     }\r
322 \r
323     public Object getValue(EntityAdapter anEntityAdapter) {\r
324       try {\r
325         return ParameterExpander.expandExpression(anEntityAdapter, expression);\r
326       }\r
327       catch (Throwable t) {\r
328         throw new RuntimeException(t.getMessage());\r
329       }\r
330     }\r
331   }\r
332 \r
333   protected class EvaluatedField implements EntityAdapterDefinition.CalculatedField {\r
334     private String expression;\r
335 \r
336     public EvaluatedField(String anExpression) {\r
337       expression = anExpression;\r
338     }\r
339 \r
340     public Object getValue(EntityAdapter anEntityAdapter) {\r
341       try {\r
342         return ParameterExpander.evaluateExpression(anEntityAdapter, expression);\r
343       }\r
344       catch (Throwable t) {\r
345         throw new RuntimeException(t.getMessage());\r
346       }\r
347     }\r
348   }\r
349 \r
350   protected class ContentToParentField implements EntityAdapterDefinition.CalculatedField {\r
351     public Object getValue(EntityAdapter anEntityAdapter) {\r
352       try {\r
353         logger.debug("ContentToParentField.getValue");\r
354         return anEntityAdapter.getToOneRelation(\r
355                     "id="+anEntityAdapter.get("to_content"),\r
356                     "id",\r
357                     "content" );\r
358       }\r
359       catch (Throwable t) {\r
360         throw new RuntimeException(t.getMessage());\r
361       }\r
362     }\r
363   }\r
364 \r
365   protected class ContentToChildrenField implements EntityAdapterDefinition.CalculatedField {\r
366     public Object getValue(EntityAdapter anEntityAdapter) {\r
367       try {\r
368         return anEntityAdapter.getRelation(\r
369                     "to_content="+anEntityAdapter.get("id"),\r
370                     "id",\r
371                     "content" );\r
372       }\r
373       catch (Throwable t) {\r
374         throw new RuntimeException(t.getMessage());\r
375       }\r
376     }\r
377   }\r
378 \r
379   protected class ContentToLanguageField implements EntityAdapterDefinition.CalculatedField {\r
380     public Object getValue(EntityAdapter anEntityAdapter) {\r
381       try {\r
382         return anEntityAdapter.getToOneRelation(\r
383                     "id="+anEntityAdapter.get("to_language"),\r
384                     "id",\r
385                     "language" );\r
386       }\r
387       catch (Throwable t) {\r
388         throw new RuntimeException(t.getMessage());\r
389       }\r
390     }\r
391   }\r
392 \r
393   protected class ContentToArticleTypeField implements EntityAdapterDefinition.CalculatedField {\r
394     public Object getValue(EntityAdapter anEntityAdapter) {\r
395       try {\r
396         return anEntityAdapter.getToOneRelation(\r
397                     "id="+anEntityAdapter.get("to_article_type"),\r
398                     "id",\r
399                     "articleType" );\r
400       }\r
401       catch (Throwable t) {\r
402         throw new RuntimeException(t.getMessage());\r
403       }\r
404     }\r
405   }\r
406 \r
407   protected class MediaToMediaFolderField implements EntityAdapterDefinition.CalculatedField {\r
408     public Object getValue(EntityAdapter anEntityAdapter) {\r
409       try {\r
410         return anEntityAdapter.getToOneRelation(\r
411                     "id="+anEntityAdapter.get("to_media_folder"),\r
412                     "id",\r
413                     "mediaFolder" );\r
414       }\r
415       catch (Throwable t) {\r
416         throw new RuntimeException(t.getMessage());\r
417       }\r
418     }\r
419   }\r
420 \r
421   protected class ContentToCommentsField implements EntityAdapterDefinition.CalculatedField {\r
422     private String extracondition;\r
423     private String order;\r
424 \r
425     public ContentToCommentsField() {\r
426       this ( " and is_published='1'", "webdb_create");\r
427     }\r
428 \r
429     public ContentToCommentsField(String anExtraCondition, String anOrder) {\r
430       order = anOrder;\r
431       extracondition = anExtraCondition;\r
432     }\r
433 \r
434     public Object getValue(EntityAdapter anEntityAdapter) {\r
435       try {\r
436         return anEntityAdapter.getRelation(\r
437                     "to_media="+anEntityAdapter.get("id")+" " + extracondition,\r
438                     order,\r
439                     "comment" );\r
440       }\r
441       catch (Throwable t) {\r
442         throw new RuntimeException(t.getMessage());\r
443       }\r
444     }\r
445   }\r
446 \r
447   protected class ContentToTopicsField implements EntityAdapterDefinition.CalculatedField {\r
448     private String topicCondition;\r
449     private String topicOrder;\r
450 \r
451     public ContentToTopicsField() {\r
452       this(null);\r
453     }\r
454 \r
455     public ContentToTopicsField(String aTopicCondition) {\r
456       this(aTopicCondition, "title");\r
457     }\r
458 \r
459     public ContentToTopicsField(String aTopicCondition, String aTopicOrder) {\r
460       topicCondition = aTopicCondition;\r
461       topicOrder = aTopicOrder;\r
462     }\r
463 \r
464     public Object getValue(EntityAdapter anEntityAdapter) {\r
465       try {\r
466         String condition = "exists (select * from content_x_topic where content_id="+anEntityAdapter.get("id")+" and topic_id=id)";\r
467         if (topicCondition!=null && topicCondition.length()>0)\r
468           condition = "(" + topicCondition + ") and " + condition;\r
469 \r
470         return anEntityAdapter.getRelation(\r
471                     condition,\r
472                     topicOrder,\r
473                     "topic" );\r
474       }\r
475       catch (Throwable t) {\r
476         throw new RuntimeException(t.getMessage());\r
477       }\r
478     }\r
479   }\r
480 \r
481   protected class ContentToMediaField implements EntityAdapterDefinition.CalculatedField {\r
482     private String definition;\r
483     private boolean published;\r
484 \r
485     public ContentToMediaField(String aDefinition, boolean anOnlyPublished) {\r
486       definition = aDefinition;\r
487       published = anOnlyPublished;\r
488     }\r
489 \r
490     public ContentToMediaField(String aDefinition) {\r
491       this(aDefinition, true);\r
492     }\r
493 \r
494     public Object getValue(EntityAdapter anEntityAdapter) {\r
495       try {\r
496         String condition = "exists (select * from content_x_media where content_id="+anEntityAdapter.get("id")+" and media_id=id)";\r
497         if (published)\r
498           condition = "is_published='t' and " + condition;\r
499         return anEntityAdapter.getRelation(\r
500            condition,\r
501           "id",\r
502           definition);\r
503       }\r
504       catch (Throwable t) {\r
505         throw new RuntimeException(t.getMessage());\r
506       }\r
507     }\r
508   }\r
509 \r
510   protected class CommentToMediaField implements EntityAdapterDefinition.CalculatedField {\r
511     private String definition;\r
512     private boolean published;\r
513 \r
514     public CommentToMediaField(String aDefinition, boolean anOnlyPublished) {\r
515       definition = aDefinition;\r
516       published = anOnlyPublished;\r
517     }\r
518 \r
519     public CommentToMediaField(String aDefinition) {\r
520       this(aDefinition, true);\r
521     }\r
522 \r
523     public Object getValue(EntityAdapter anEntityAdapter) {\r
524       try {\r
525         String condition = "exists (select * from comment_x_media where comment_id="+anEntityAdapter.get("id")+" and media_id=id)";\r
526         if (published)\r
527           condition = "is_published='t' and " + condition;\r
528         return anEntityAdapter.getRelation(\r
529            condition,\r
530           "id",\r
531           definition);\r
532       }\r
533       catch (Throwable t) {\r
534         throw new RuntimeException(t.getMessage());\r
535       }\r
536     }\r
537   }\r
538 \r
539   protected class ContentToIconField implements EntityAdapterDefinition.CalculatedField {\r
540     public Object getValue(EntityAdapter anEntityAdapter) {\r
541       EntityAdapter media;\r
542       Entity mediaType;\r
543       RewindableIterator iterator;\r
544       Map result;\r
545       MirMedia mediaHandler;\r
546       String tinyIcon;\r
547       String iconAlt;\r
548 \r
549       try {\r
550         iterator = (RewindableIterator) (anEntityAdapter.get("to_uploaded_media"));\r
551         iterator.rewind();\r
552 \r
553         tinyIcon = MirGlobal.config().getString("Producer.Icon.TinyText");\r
554         iconAlt = "Text";\r
555 \r
556         if (iterator.hasNext()) {\r
557           media = (EntityAdapter) iterator.next();\r
558 \r
559           mediaType = ((EntityUploadedMedia) (media.getEntity())).getMediaType();\r
560           mediaHandler = MediaHelper.getHandler( mediaType );\r
561 \r
562           if (mediaHandler.isVideo()) {\r
563             tinyIcon = MirGlobal.config().getString("Producer.Icon.TinyVideo");\r
564             iconAlt = "Video";\r
565           }\r
566           else if (mediaHandler.isAudio()) {\r
567             tinyIcon = MirGlobal.config().getString("Producer.Icon.TinyAudio");\r
568             iconAlt = "Audio";\r
569           }\r
570           else if (mediaHandler.isImage()) {\r
571             tinyIcon = MirGlobal.config().getString("Producer.Icon.TinyImage");\r
572             iconAlt = "Image";\r
573           }\r
574           else {\r
575             tinyIcon = mediaHandler.getTinyIconName();\r
576             iconAlt = mediaHandler.getIconAltName();\r
577           }\r
578 \r
579         }\r
580       }\r
581       catch (Throwable t) {\r
582         logger.error("ContentToIconField: " +t.getMessage());\r
583         throw new RuntimeException(t.getMessage());\r
584       }\r
585 \r
586       result = new HashMap();\r
587       result.put("tiny_icon", MirGlobal.config().getString("Producer.ImageRoot") + "/" + tinyIcon);\r
588       result.put("icon_alt", iconAlt);\r
589 \r
590       return result;\r
591     }\r
592   }\r
593 \r
594   protected class ContentCommentCountField implements EntityAdapterDefinition.CalculatedField {\r
595     private String extraCondition;\r
596 \r
597     public ContentCommentCountField(String anExtraCondition) {\r
598       super();\r
599 \r
600       extraCondition = anExtraCondition;\r
601     }\r
602 \r
603     public Object getValue(EntityAdapter anEntityAdapter) {\r
604       try {\r
605         return Integer.toString(\r
606             DatabaseComment.getInstance().getSize(\r
607                   "to_media="+anEntityAdapter.get("id")+" " + extraCondition));\r
608       }\r
609       catch (Throwable t) {\r
610         throw new RuntimeException(t.getMessage());\r
611       }\r
612     }\r
613   }\r
614 \r
615   protected class ContentMediaCountField implements EntityAdapterDefinition.CalculatedField {\r
616     private String table;\r
617     private boolean published;\r
618 \r
619     public ContentMediaCountField(String aTable, boolean anOnlyPublished) {\r
620       table = aTable;\r
621       published = anOnlyPublished;\r
622     }\r
623 \r
624     public ContentMediaCountField(String aTable) {\r
625       this(aTable, true);\r
626     }\r
627 \r
628     public Object getValue(EntityAdapter anEntityAdapter) {\r
629       try {\r
630         String subQuery = "select * from "+table+" where id = media_id";\r
631         if (published)\r
632           subQuery = subQuery + " and is_published='t'";\r
633 \r
634         return Integer.toString(\r
635             DatabaseContentToMedia.getInstance().getSize(\r
636                   "exists ("+subQuery+")"));\r
637       }\r
638       catch (Throwable t) {\r
639         throw new RuntimeException(t.getMessage());\r
640       }\r
641     }\r
642   }\r
643 }\r