major cleanup:
[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 \r
450     public ContentToTopicsField() {\r
451       this(null);\r
452     }\r
453 \r
454     public ContentToTopicsField(String aTopicCondition) {\r
455       topicCondition = aTopicCondition;\r
456     }\r
457 \r
458     public Object getValue(EntityAdapter anEntityAdapter) {\r
459       try {\r
460         String condition = "exists (select * from content_x_topic where content_id="+anEntityAdapter.get("id")+" and topic_id=id)";\r
461         if (topicCondition!=null && topicCondition.length()>0)\r
462           condition = "(" + topicCondition + ") and " + condition;\r
463 \r
464         return anEntityAdapter.getRelation(\r
465                     condition,\r
466                     "title",\r
467                     "topic" );\r
468       }\r
469       catch (Throwable t) {\r
470         throw new RuntimeException(t.getMessage());\r
471       }\r
472     }\r
473   }\r
474 \r
475   protected class ContentToMediaField implements EntityAdapterDefinition.CalculatedField {\r
476     private String definition;\r
477     private boolean published;\r
478 \r
479     public ContentToMediaField(String aDefinition, boolean anOnlyPublished) {\r
480       definition = aDefinition;\r
481       published = anOnlyPublished;\r
482     }\r
483 \r
484     public ContentToMediaField(String aDefinition) {\r
485       this(aDefinition, true);\r
486     }\r
487 \r
488     public Object getValue(EntityAdapter anEntityAdapter) {\r
489       try {\r
490         String condition = "exists (select * from content_x_media where content_id="+anEntityAdapter.get("id")+" and media_id=id)";\r
491         if (published)\r
492           condition = "is_published='t' and " + condition;\r
493         return anEntityAdapter.getRelation(\r
494            condition,\r
495           "id",\r
496           definition);\r
497       }\r
498       catch (Throwable t) {\r
499         throw new RuntimeException(t.getMessage());\r
500       }\r
501     }\r
502   }\r
503 \r
504   protected class CommentToMediaField implements EntityAdapterDefinition.CalculatedField {\r
505     private String definition;\r
506     private boolean published;\r
507 \r
508     public CommentToMediaField(String aDefinition, boolean anOnlyPublished) {\r
509       definition = aDefinition;\r
510       published = anOnlyPublished;\r
511     }\r
512 \r
513     public CommentToMediaField(String aDefinition) {\r
514       this(aDefinition, true);\r
515     }\r
516 \r
517     public Object getValue(EntityAdapter anEntityAdapter) {\r
518       try {\r
519         String condition = "exists (select * from comment_x_media where comment_id="+anEntityAdapter.get("id")+" and media_id=id)";\r
520         if (published)\r
521           condition = "is_published='t' and " + condition;\r
522         return anEntityAdapter.getRelation(\r
523            condition,\r
524           "id",\r
525           definition);\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 ContentToIconField implements EntityAdapterDefinition.CalculatedField {\r
534     public Object getValue(EntityAdapter anEntityAdapter) {\r
535       EntityAdapter media;\r
536       Entity mediaType;\r
537       RewindableIterator iterator;\r
538       Map result;\r
539       MirMedia mediaHandler;\r
540       String tinyIcon;\r
541       String iconAlt;\r
542 \r
543       try {\r
544         iterator = (RewindableIterator) (anEntityAdapter.get("to_uploaded_media"));\r
545         iterator.rewind();\r
546 \r
547         tinyIcon = MirGlobal.config().getString("Producer.Icon.TinyText");\r
548         iconAlt = "Text";\r
549 \r
550         if (iterator.hasNext()) {\r
551           media = (EntityAdapter) iterator.next();\r
552 \r
553           mediaType = ((EntityUploadedMedia) (media.getEntity())).getMediaType();\r
554           mediaHandler = MediaHelper.getHandler( mediaType );\r
555 \r
556           if (mediaHandler.isVideo()) {\r
557             tinyIcon = MirGlobal.config().getString("Producer.Icon.TinyVideo");\r
558             iconAlt = "Video";\r
559           }\r
560           else if (mediaHandler.isAudio()) {\r
561             tinyIcon = MirGlobal.config().getString("Producer.Icon.TinyAudio");\r
562             iconAlt = "Audio";\r
563           }\r
564           else if (mediaHandler.isImage()) {\r
565             tinyIcon = MirGlobal.config().getString("Producer.Icon.TinyImage");\r
566             iconAlt = "Image";\r
567           }\r
568           else {\r
569             tinyIcon = mediaHandler.getTinyIconName();\r
570             iconAlt = mediaHandler.getIconAltName();\r
571           }\r
572 \r
573         }\r
574       }\r
575       catch (Throwable t) {\r
576         logger.error("ContentToIconField: " +t.getMessage());\r
577         throw new RuntimeException(t.getMessage());\r
578       }\r
579 \r
580       result = new HashMap();\r
581       result.put("tiny_icon", MirGlobal.config().getString("Producer.ImageRoot") + "/" + tinyIcon);\r
582       result.put("icon_alt", iconAlt);\r
583 \r
584       return result;\r
585     }\r
586   }\r
587 \r
588   protected class ContentCommentCountField implements EntityAdapterDefinition.CalculatedField {\r
589     private String extraCondition;\r
590 \r
591     public ContentCommentCountField(String anExtraCondition) {\r
592       super();\r
593 \r
594       extraCondition = anExtraCondition;\r
595     }\r
596 \r
597     public Object getValue(EntityAdapter anEntityAdapter) {\r
598       try {\r
599         return Integer.toString(\r
600             DatabaseComment.getInstance().getSize(\r
601                   "to_media="+anEntityAdapter.get("id")+" " + extraCondition));\r
602       }\r
603       catch (Throwable t) {\r
604         throw new RuntimeException(t.getMessage());\r
605       }\r
606     }\r
607   }\r
608 \r
609   protected class ContentMediaCountField implements EntityAdapterDefinition.CalculatedField {\r
610     private String table;\r
611     private boolean published;\r
612 \r
613     public ContentMediaCountField(String aTable, boolean anOnlyPublished) {\r
614       table = aTable;\r
615       published = anOnlyPublished;\r
616     }\r
617 \r
618     public ContentMediaCountField(String aTable) {\r
619       this(aTable, true);\r
620     }\r
621 \r
622     public Object getValue(EntityAdapter anEntityAdapter) {\r
623       try {\r
624         String subQuery = "select * from "+table+" where id = media_id";\r
625         if (published)\r
626           subQuery = subQuery + " and is_published='t'";\r
627 \r
628         return Integer.toString(\r
629             DatabaseContentToMedia.getInstance().getSize(\r
630                   "exists ("+subQuery+")"));\r
631       }\r
632       catch (Throwable t) {\r
633         throw new RuntimeException(t.getMessage());\r
634       }\r
635     }\r
636   }\r
637 }\r