25d85e087b9abfe3bcbcf36eaac05bd9059debf1
[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 \r
118       anEntityAdapterDefinition.addCalculatedField("firstImage",  new ContentToFirstMediaField( "image" ));\r
119       anEntityAdapterDefinition.addCalculatedField("firstAudio", new ContentToFirstMediaField( "audio" ));\r
120       anEntityAdapterDefinition.addCalculatedField("firstVideo", new ContentToFirstMediaField( "video" ));\r
121       anEntityAdapterDefinition.addCalculatedField("firstOther", new ContentToFirstMediaField( "otherMedia" ));\r
122 \r
123       anEntityAdapterDefinition.addCalculatedField("to_all_uploaded_media", new ContentToMediaField( "uploadedMedia", false));\r
124       anEntityAdapterDefinition.addCalculatedField("to_all_media_images",  new ContentToMediaField( "image", false));\r
125       anEntityAdapterDefinition.addCalculatedField("to_all_media_audio", new ContentToMediaField( "audio", false));\r
126       anEntityAdapterDefinition.addCalculatedField("to_all_media_video", new ContentToMediaField( "video", false));\r
127       anEntityAdapterDefinition.addCalculatedField("to_all_media_other", new ContentToMediaField( "otherMedia", false));\r
128       anEntityAdapterDefinition.addCalculatedField("to_media_icon", new ContentToIconField());\r
129 \r
130       anEntityAdapterDefinition.addCalculatedField("article_type", new ContentToArticleTypeField());\r
131 \r
132       anEntityAdapterDefinition.addCalculatedField("description_parsed", new FilteredField("description"));\r
133       anEntityAdapterDefinition.addCalculatedField("content_data_parsed", new FilteredField("content_data"));\r
134 \r
135       anEntityAdapterDefinition.addCalculatedField("children", new ContentToChildrenField());\r
136       anEntityAdapterDefinition.addCalculatedField("parent", new ContentToParentField());\r
137 \r
138       anEntityAdapterDefinition.addCalculatedField("publicurl", new ExpandedField(configuration.getString("Article.PublicUrl")));\r
139 \r
140       anEntityAdapterDefinition.addCalculatedField("operations",\r
141           new EntityToSimpleOperationsField(MirGlobal.localizer().adminInterface().simpleArticleOperations()));\r
142     }\r
143     catch (Throwable t) {\r
144       throw new MirLocalizerFailure(t.getMessage(), t);\r
145     }\r
146   }\r
147 \r
148   protected void constructCommentAdapterDefinition(EntityAdapterDefinition anEntityAdapterDefinition) throws MirLocalizerFailure {\r
149     try {\r
150       anEntityAdapterDefinition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
151       anEntityAdapterDefinition.addCalculatedField("to_content", new CommentToContentField());\r
152       anEntityAdapterDefinition.addCalculatedField("status", new CommentToStatusField());\r
153 \r
154       anEntityAdapterDefinition.addCalculatedField("to_uploaded_media", new CommentToMediaField( "uploadedMedia" ));\r
155       anEntityAdapterDefinition.addCalculatedField("to_media_images",  new CommentToMediaField( "image" ));\r
156       anEntityAdapterDefinition.addCalculatedField("to_media_audio", new CommentToMediaField( "audio" ));\r
157       anEntityAdapterDefinition.addCalculatedField("to_media_video", new CommentToMediaField( "video" ));\r
158       anEntityAdapterDefinition.addCalculatedField("to_media_other", new CommentToMediaField( "otherMedia" ));\r
159       anEntityAdapterDefinition.addCalculatedField("to_all_uploaded_media", new CommentToMediaField( "uploadedMedia", false));\r
160       anEntityAdapterDefinition.addCalculatedField("to_all_media_images",  new CommentToMediaField( "image", false));\r
161       anEntityAdapterDefinition.addCalculatedField("to_all_media_audio", new CommentToMediaField( "audio", false));\r
162       anEntityAdapterDefinition.addCalculatedField("to_all_media_video", new CommentToMediaField( "video", false));\r
163       anEntityAdapterDefinition.addCalculatedField("to_all_media_other", new CommentToMediaField( "otherMedia", false));\r
164 \r
165       anEntityAdapterDefinition.addCalculatedField("publicurl", new ExpandedField(configuration.getString("Comment.PublicUrl")));\r
166 \r
167       anEntityAdapterDefinition.addCalculatedField("description_parsed", new FilteredField("description"));\r
168       anEntityAdapterDefinition.addCalculatedField("operations",\r
169           new EntityToSimpleOperationsField(MirGlobal.localizer().adminInterface().simpleCommentOperations()));\r
170     }\r
171     catch (Throwable t) {\r
172       throw new MirLocalizerFailure(t.getMessage(), t);\r
173     }\r
174   }\r
175 \r
176   public EntityAdapterModel adapterModel() throws MirLocalizerFailure, MirLocalizerExc {\r
177     EntityAdapterModel result = new EntityAdapterModel();\r
178 \r
179     try {\r
180       EntityAdapterDefinition definition;\r
181 \r
182       definition = new EntityAdapterDefinition();\r
183       constructContentAdapterDefinition( definition );\r
184       result.addMapping( "content", DatabaseContent.getInstance(), definition);\r
185 \r
186       definition = new EntityAdapterDefinition();\r
187       constructCommentAdapterDefinition( definition );\r
188       result.addMapping( "comment", DatabaseComment.getInstance(), definition);\r
189       result.addMapping( "commentStatus", DatabaseCommentStatus.getInstance(), new EntityAdapterDefinition());\r
190 \r
191       result.addMapping( "articleType", DatabaseArticleType.getInstance(), new EntityAdapterDefinition());\r
192 \r
193       result.addMapping( "mediaType", DatabaseMediaType.getInstance(), new EntityAdapterDefinition());\r
194 \r
195 \r
196       definition = new EntityAdapterDefinition();\r
197       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
198       result.addMapping( "breakingNews", DatabaseBreaking.getInstance(), definition);\r
199 \r
200       definition = new EntityAdapterDefinition();\r
201       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
202       result.addMapping( "internalMessage", DatabaseMessages.getInstance(), definition);\r
203 \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       result.addMapping( "uploadedMedia", DatabaseUploadedMedia.getInstance(), definition);\r
210       definition = new EntityAdapterDefinition();\r
211       definition.addCalculatedField("mediafolder", new MediaToMediaFolderField());\r
212       definition.addCalculatedField("human_readable_size", new HumanReadableSizeField("value"));\r
213       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
214       definition.addCalculatedField("info", new MediaToMediaInfoField());\r
215       definition.addCalculatedField("big_icon", new MediaToBigIconField());\r
216       result.addMapping( "image", DatabaseImages.getInstance(), definition);\r
217       definition = new EntityAdapterDefinition();\r
218       definition.addCalculatedField("mediafolder", new MediaToMediaFolderField());\r
219       definition.addCalculatedField("human_readable_size", new HumanReadableSizeField("value"));\r
220       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
221       definition.addCalculatedField("info", new MediaToMediaInfoField());\r
222       definition.addCalculatedField("big_icon", new MediaToBigIconField());\r
223       result.addMapping( "audio", DatabaseAudio.getInstance(), definition);\r
224       definition = new EntityAdapterDefinition();\r
225       definition.addCalculatedField("mediafolder", new MediaToMediaFolderField());\r
226       definition.addCalculatedField("human_readable_size", new HumanReadableSizeField("value"));\r
227       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
228       definition.addCalculatedField("info", new MediaToMediaInfoField());\r
229       definition.addCalculatedField("big_icon", new MediaToBigIconField());\r
230       result.addMapping( "video", DatabaseVideo.getInstance(), definition);\r
231       definition = new EntityAdapterDefinition();\r
232       definition.addCalculatedField("mediafolder", new MediaToMediaFolderField());\r
233       definition.addCalculatedField("human_readable_size", new HumanReadableSizeField("value"));\r
234       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
235       definition.addCalculatedField("info", new MediaToMediaInfoField());\r
236       definition.addCalculatedField("big_icon", new MediaToBigIconField());\r
237       result.addMapping( "otherMedia", DatabaseOther.getInstance(), definition);\r
238 \r
239 \r
240       result.addMapping( "mediaFolder", DatabaseMediafolder.getInstance(), new EntityAdapterDefinition());\r
241       result.addMapping( "imageType", DatabaseImageType.getInstance(), new EntityAdapterDefinition());\r
242       result.addMapping( "language", DatabaseLanguage.getInstance(), new EntityAdapterDefinition());\r
243       result.addMapping( "mediaType", DatabaseMediaType.getInstance(), new EntityAdapterDefinition());\r
244       result.addMapping( "topic", DatabaseTopics.getInstance(), new EntityAdapterDefinition());\r
245 \r
246       definition = new EntityAdapterDefinition();\r
247       definition.addDBDateField("creationdate", "webdb_create", configuration.getString("Mir.DefaultTimezone"));\r
248       definition.addDBDateField("lastlogindate", "lastlogin", configuration.getString("Mir.DefaultTimezone"));\r
249       definition.addCalculatedField("structuredProfile", new StructuredContentField("profile"));\r
250       result.addMapping( "user", DatabaseUsers.getInstance(), definition);\r
251 \r
252       result.addMapping( "otherMedia", DatabaseOther.getInstance(), new EntityAdapterDefinition());\r
253 \r
254       result.addMapping( "content_x_topic", DatabaseContentToTopics.getInstance(), new EntityAdapterDefinition());\r
255 \r
256     }\r
257     catch (Throwable t) {\r
258       throw new MirLocalizerFailure(t.getMessage(), t);\r
259     }\r
260 \r
261     return result;\r
262   }\r
263 \r
264   protected class CommentToContentField implements EntityAdapterDefinition.CalculatedField {\r
265     public Object getValue(EntityAdapter anEntityAdapter) {\r
266       try {\r
267         return anEntityAdapter.getToOneRelation(\r
268                     "id="+anEntityAdapter.get("to_media"),\r
269                     "id",\r
270                     "content" );\r
271       }\r
272       catch (Throwable t) {\r
273         throw new RuntimeException(t.getMessage());\r
274       }\r
275     }\r
276   }\r
277 \r
278   protected class CommentToStatusField implements EntityAdapterDefinition.CalculatedField {\r
279     public Object getValue(EntityAdapter anEntityAdapter) {\r
280       try {\r
281         return anEntityAdapter.getToOneRelation(\r
282                     "id="+anEntityAdapter.get("to_comment_status"),\r
283                     "id",\r
284                     "commentStatus" );\r
285       }\r
286       catch (Throwable t) {\r
287         throw new RuntimeException(t.getMessage());\r
288       }\r
289     }\r
290   }\r
291 \r
292   protected class EntityToSimpleOperationsField implements EntityAdapterDefinition.CalculatedField {\r
293     private List operations;\r
294 \r
295     public EntityToSimpleOperationsField(List anOperations) {\r
296       operations = anOperations;\r
297     }\r
298 \r
299     public Object getValue(EntityAdapter anEntityAdapter) {\r
300       try {\r
301         Iterator i = operations.iterator();\r
302         List availableOperations = new Vector();\r
303 \r
304         while (i.hasNext()) {\r
305           MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation =\r
306             (MirAdminInterfaceLocalizer.MirSimpleEntityOperation) i.next();\r
307 \r
308           if (operation.isAvailable(anEntityAdapter)) {\r
309             availableOperations.add(operation.getName());\r
310           }\r
311         };\r
312 \r
313         return availableOperations;\r
314       }\r
315       catch (Throwable t) {\r
316         throw new RuntimeException(t.getMessage());\r
317       }\r
318     }\r
319   }\r
320 \r
321   protected class FilteredField implements EntityAdapterDefinition.CalculatedField {\r
322     private String fieldName;\r
323 \r
324     public FilteredField(String aFieldName) {\r
325       fieldName = aFieldName;\r
326     }\r
327 \r
328     public Object getValue(EntityAdapter anEntityAdapter) {\r
329       try {\r
330         if (anEntityAdapter.get("is_html")!=null && anEntityAdapter.get("is_html").equals("1")) {\r
331           return MirGlobal.localizer().producerAssistant().filterHTMLText((String) anEntityAdapter.get(fieldName));\r
332         }\r
333         else {\r
334           return MirGlobal.localizer().producerAssistant().filterNonHTMLText((String) anEntityAdapter.get(fieldName));\r
335         }\r
336       }\r
337       catch (Throwable t) {\r
338         throw new RuntimeException(t.getMessage());\r
339       }\r
340     }\r
341   }\r
342 \r
343   protected class StructuredContentField implements EntityAdapterDefinition.CalculatedField {\r
344     private String expression;\r
345 \r
346     public StructuredContentField(String anExpression) {\r
347       expression = anExpression;\r
348     }\r
349 \r
350     public Object getValue(EntityAdapter anEntityAdapter) {\r
351       try {\r
352         return StructuredContentParser.parse(ParameterExpander.evaluateStringExpression(anEntityAdapter, expression));\r
353       }\r
354       catch (Throwable t) {\r
355         throw new RuntimeException(t.getMessage());\r
356       }\r
357     }\r
358   }\r
359 \r
360   protected class ExpandedField implements EntityAdapterDefinition.CalculatedField {\r
361     private String expression;\r
362 \r
363     public ExpandedField(String anExpression) {\r
364       expression = anExpression;\r
365     }\r
366 \r
367     public Object getValue(EntityAdapter anEntityAdapter) {\r
368       try {\r
369         return ParameterExpander.expandExpression(anEntityAdapter, expression);\r
370       }\r
371       catch (Throwable t) {\r
372         throw new RuntimeException(t.getMessage());\r
373       }\r
374     }\r
375   }\r
376 \r
377   protected class EvaluatedField implements EntityAdapterDefinition.CalculatedField {\r
378     private String expression;\r
379 \r
380     public EvaluatedField(String anExpression) {\r
381       expression = anExpression;\r
382     }\r
383 \r
384     public Object getValue(EntityAdapter anEntityAdapter) {\r
385       try {\r
386         return ParameterExpander.evaluateExpression(anEntityAdapter, expression);\r
387       }\r
388       catch (Throwable t) {\r
389         throw new RuntimeException(t.getMessage());\r
390       }\r
391     }\r
392   }\r
393 \r
394   protected class ContentToParentField implements EntityAdapterDefinition.CalculatedField {\r
395     public Object getValue(EntityAdapter anEntityAdapter) {\r
396       try {\r
397         logger.debug("ContentToParentField.getFieldValue");\r
398         return anEntityAdapter.getToOneRelation(\r
399                     "id="+anEntityAdapter.get("to_content"),\r
400                     "id",\r
401                     "content" );\r
402       }\r
403       catch (Throwable t) {\r
404         throw new RuntimeException(t.getMessage());\r
405       }\r
406     }\r
407   }\r
408 \r
409   protected class ContentToChildrenField implements EntityAdapterDefinition.CalculatedField {\r
410     public Object getValue(EntityAdapter anEntityAdapter) {\r
411       try {\r
412         return anEntityAdapter.getRelation(\r
413                     "to_content="+anEntityAdapter.get("id"),\r
414                     "id",\r
415                     "content" );\r
416       }\r
417       catch (Throwable t) {\r
418         throw new RuntimeException(t.getMessage());\r
419       }\r
420     }\r
421   }\r
422 \r
423   protected class ContentToLanguageField implements EntityAdapterDefinition.CalculatedField {\r
424     public Object getValue(EntityAdapter anEntityAdapter) {\r
425       try {\r
426         return anEntityAdapter.getToOneRelation(\r
427                     "id="+anEntityAdapter.get("to_language"),\r
428                     "id",\r
429                     "language" );\r
430       }\r
431       catch (Throwable t) {\r
432         throw new RuntimeException(t.getMessage());\r
433       }\r
434     }\r
435   }\r
436 \r
437   protected class ContentToArticleTypeField implements EntityAdapterDefinition.CalculatedField {\r
438     public Object getValue(EntityAdapter anEntityAdapter) {\r
439       try {\r
440         return anEntityAdapter.getToOneRelation(\r
441                     "id="+anEntityAdapter.get("to_article_type"),\r
442                     "id",\r
443                     "articleType" );\r
444       }\r
445       catch (Throwable t) {\r
446         throw new RuntimeException(t.getMessage());\r
447       }\r
448     }\r
449   }\r
450 \r
451   protected class MediaToMediaFolderField implements EntityAdapterDefinition.CalculatedField {\r
452     public Object getValue(EntityAdapter anEntityAdapter) {\r
453       try {\r
454         return anEntityAdapter.getToOneRelation(\r
455                     "id="+anEntityAdapter.get("to_media_folder"),\r
456                     "id",\r
457                     "mediaFolder" );\r
458       }\r
459       catch (Throwable t) {\r
460         throw new RuntimeException(t.getMessage());\r
461       }\r
462     }\r
463   }\r
464 \r
465   public static class MediaInfo {\r
466     private MediaHandler mediaHandler;\r
467 \r
468     public MediaInfo(MediaHandler aHandler) {\r
469       mediaHandler = aHandler;\r
470     }\r
471     public String getBigIcon() {\r
472       if (mediaHandler == null)\r
473         return "bla";\r
474       else\r
475         return mediaHandler.getBigIconName();\r
476     }\r
477 \r
478     public String getSmallIcon() {\r
479       if (mediaHandler == null)\r
480         return "bla";\r
481       else\r
482         return mediaHandler.getTinyIconName();\r
483     }\r
484 \r
485     public String getMediaType() {\r
486       return "";\r
487     }\r
488   }\r
489 \r
490   protected class MediaToMediaInfoField implements EntityAdapterDefinition.CalculatedField {\r
491     public Object getValue(EntityAdapter anEntityAdapter) {\r
492       try {\r
493         MediaHandler mediaHandler = MediaHelper.getHandler(((EntityUploadedMedia) anEntityAdapter.getEntity()).getMediaType());\r
494 \r
495         return new MediaInfo(mediaHandler);\r
496       }\r
497       catch (Throwable t) {\r
498         throw new RuntimeException(t.getMessage());\r
499       }\r
500     }\r
501   }\r
502 \r
503   protected class MediaToBigIconField implements EntityAdapterDefinition.CalculatedField {\r
504     public Object getValue(EntityAdapter anEntityAdapter) {\r
505       try {\r
506         return MediaHelper.getHandler(((EntityUploadedMedia) anEntityAdapter.getEntity()).getMediaType()).getBigIconName();\r
507       }\r
508       catch (Throwable t) {\r
509         throw new RuntimeException(t.getMessage());\r
510       }\r
511     }\r
512   }\r
513 \r
514   protected class ContentToCommentsField implements EntityAdapterDefinition.CalculatedField {\r
515     private String extracondition;\r
516     private String order;\r
517 \r
518     public ContentToCommentsField() {\r
519       this ( " and is_published='1'", "webdb_create");\r
520     }\r
521 \r
522     public ContentToCommentsField(String anExtraCondition, String anOrder) {\r
523       order = anOrder;\r
524       extracondition = anExtraCondition;\r
525     }\r
526 \r
527     public Object getValue(EntityAdapter anEntityAdapter) {\r
528       try {\r
529         return anEntityAdapter.getRelation(\r
530                     "to_media="+anEntityAdapter.get("id")+" " + extracondition,\r
531                     order,\r
532                     "comment" );\r
533       }\r
534       catch (Throwable t) {\r
535         throw new RuntimeException(t.getMessage());\r
536       }\r
537     }\r
538   }\r
539 \r
540   protected class ContentToTopicsField implements EntityAdapterDefinition.CalculatedField {\r
541     private String topicCondition;\r
542     private String topicOrder;\r
543 \r
544     public ContentToTopicsField() {\r
545       this(null);\r
546     }\r
547 \r
548     public ContentToTopicsField(String aTopicCondition) {\r
549       this(aTopicCondition, "title");\r
550     }\r
551 \r
552     public ContentToTopicsField(String aTopicCondition, String aTopicOrder) {\r
553       topicCondition = aTopicCondition;\r
554       topicOrder = aTopicOrder;\r
555     }\r
556 \r
557     public Object getValue(EntityAdapter anEntityAdapter) {\r
558       try {\r
559 \r
560         Vector extraTable = new Vector();\r
561         extraTable.add("content_x_topic cxt");\r
562         String condition = "cxt.content_id="+anEntityAdapter.get("id")+\r
563           " and cxt.topic_id=t.id";\r
564 \r
565         if (topicCondition!=null && topicCondition.length()>0)\r
566           condition = "(" + topicCondition + ") and " + condition;\r
567 \r
568         return anEntityAdapter.getComplexRelation("t", extraTable,\r
569                     condition, topicOrder, "topic" );\r
570       }\r
571       catch (Throwable t) {\r
572         throw new RuntimeException(t.getMessage());\r
573       }\r
574     }\r
575   }\r
576 \r
577   protected class ContentToMediaField implements EntityAdapterDefinition.CalculatedField {\r
578     private String definition;\r
579     private boolean published;\r
580 \r
581     public ContentToMediaField(String aDefinition, boolean anOnlyPublished) {\r
582       definition = aDefinition;\r
583       published = anOnlyPublished;\r
584     }\r
585 \r
586     public ContentToMediaField(String aDefinition) {\r
587       this(aDefinition, true);\r
588     }\r
589 \r
590     public Object getValue(EntityAdapter anEntityAdapter) {\r
591       try {\r
592         String condition = "cxm.content_id="+ anEntityAdapter.get("id") +\r
593           " and cxm.media_id = m.id";\r
594         if (published)\r
595           condition = "is_published='t' and " + condition;\r
596 \r
597         List extraTables = new Vector();\r
598         extraTables.add("content_x_media cxm");\r
599 \r
600         return anEntityAdapter.getComplexRelation("m", extraTables, condition, "id", definition);\r
601       }\r
602       catch (Throwable t) {\r
603         throw new RuntimeException(t.getMessage());\r
604       }\r
605     }\r
606   }\r
607 \r
608   protected class ContentToFirstMediaField implements EntityAdapterDefinition.CalculatedField {\r
609     private String definition;\r
610     private boolean published;\r
611 \r
612     public ContentToFirstMediaField(String aDefinition, boolean anOnlyPublished) {\r
613       definition = aDefinition;\r
614       published = anOnlyPublished;\r
615     }\r
616 \r
617     public ContentToFirstMediaField(String aDefinition) {\r
618       this(aDefinition, true);\r
619     }\r
620 \r
621     public Object getValue(EntityAdapter anEntityAdapter) {\r
622       try {\r
623         String condition = "cxm.content_id="+ anEntityAdapter.get("id") +\r
624           " and cxm.media_id = m.id";\r
625         if (published)\r
626           condition = "is_published='t' and " + condition;\r
627 \r
628         List extraTables = new Vector();\r
629         extraTables.add("content_x_media cxm");\r
630 \r
631         return anEntityAdapter.getComplexToOneRelation("m", extraTables, condition, "id", definition);\r
632       }\r
633       catch (Throwable t) {\r
634         throw new RuntimeException(t.getMessage());\r
635       }\r
636     }\r
637   }\r
638 \r
639   protected class CommentToMediaField implements EntityAdapterDefinition.CalculatedField {\r
640     private String definition;\r
641     private boolean published;\r
642 \r
643     public CommentToMediaField(String aDefinition, boolean anOnlyPublished) {\r
644       definition = aDefinition;\r
645       published = anOnlyPublished;\r
646     }\r
647 \r
648     public CommentToMediaField(String aDefinition) {\r
649       this(aDefinition, true);\r
650     }\r
651 \r
652     public Object getValue(EntityAdapter anEntityAdapter) {\r
653       try {\r
654 \r
655         String condition = "cxm.comment_id="+ anEntityAdapter.get("id") +\r
656                   " and cxm.media_id = m.id";\r
657         if (published)\r
658            condition = "is_published='t' and " + condition;\r
659 \r
660         List extraTables = new Vector();\r
661         extraTables.add("comment_x_media cxm");\r
662         return anEntityAdapter.getComplexRelation("m", extraTables, condition, "id", definition);\r
663 \r
664       }\r
665       catch (Throwable t) {\r
666         throw new RuntimeException(t.getMessage());\r
667       }\r
668     }\r
669   }\r
670 \r
671   protected class ContentToIconField implements EntityAdapterDefinition.CalculatedField {\r
672     public Object getValue(EntityAdapter anEntityAdapter) {\r
673       EntityAdapter media;\r
674       Entity mediaType;\r
675       RewindableIterator iterator;\r
676       Map result;\r
677       MediaHandler mediaHandler;\r
678       String tinyIcon;\r
679       String iconAlt;\r
680 \r
681       try {\r
682         iterator = (RewindableIterator) (anEntityAdapter.get("to_uploaded_media"));\r
683         iterator.rewind();\r
684 \r
685         tinyIcon = MirGlobal.config().getString("Producer.Icon.TinyText");\r
686         iconAlt = "Text";\r
687 \r
688         if (iterator.hasNext()) {\r
689           media = (EntityAdapter) iterator.next();\r
690 \r
691           mediaType = ((EntityUploadedMedia) (media.getEntity())).getMediaType();\r
692           mediaHandler = MediaHelper.getHandler( mediaType );\r
693 \r
694           tinyIcon = mediaHandler.getTinyIconName();\r
695           iconAlt = mediaHandler.getIconAltName();\r
696         }\r
697       }\r
698       catch (Throwable t) {\r
699         logger.error("ContentToIconField: " +t.getMessage());\r
700         throw new RuntimeException(t.getMessage());\r
701       }\r
702 \r
703       result = new HashMap();\r
704       result.put("tiny_icon", MirGlobal.config().getString("Producer.ImageRoot") + "/" + tinyIcon);\r
705       result.put("icon_alt", iconAlt);\r
706 \r
707       return result;\r
708     }\r
709   }\r
710 \r
711   protected class ContentCommentCountField implements EntityAdapterDefinition.CalculatedField {\r
712     private String extraCondition;\r
713 \r
714     public ContentCommentCountField(String anExtraCondition) {\r
715       super();\r
716 \r
717       extraCondition = anExtraCondition;\r
718     }\r
719 \r
720     public Object getValue(EntityAdapter anEntityAdapter) {\r
721       try {\r
722         return Integer.toString(\r
723             DatabaseComment.getInstance().getSize(\r
724                   "to_media="+anEntityAdapter.get("id")+" " + extraCondition));\r
725       }\r
726       catch (Throwable t) {\r
727         throw new RuntimeException(t.getMessage());\r
728       }\r
729     }\r
730   }\r
731 \r
732   protected class HumanReadableSizeField implements EntityAdapterDefinition.CalculatedField {\r
733       private String fieldName;\r
734 \r
735       public HumanReadableSizeField(String aFieldName) {\r
736         fieldName= aFieldName;\r
737       }\r
738 \r
739       public Object getValue(EntityAdapter anEntityAdapter) {\r
740         try {\r
741           String size = (String) anEntityAdapter.get(fieldName);\r
742           if (size!=null)\r
743             return NumberUtils.humanReadableSize(Double.parseDouble(size));\r
744           else\r
745             return "";\r
746         }\r
747         catch (Throwable t) {\r
748           throw new RuntimeException(t.getMessage());\r
749         }\r
750       }\r
751     }\r
752 \r
753 \r
754   protected class ContentMediaCountField implements EntityAdapterDefinition.CalculatedField {\r
755     private String table;\r
756     private boolean published;\r
757 \r
758     public ContentMediaCountField(String aTable, boolean anOnlyPublished) {\r
759       table = aTable;\r
760       published = anOnlyPublished;\r
761     }\r
762 \r
763     public ContentMediaCountField(String aTable) {\r
764       this(aTable, true);\r
765     }\r
766 \r
767     public Object getValue(EntityAdapter anEntityAdapter) {\r
768       try {\r
769         Vector extraTable = new Vector();\r
770         extraTable.add(table+" m");\r
771         String selectSql = "cxm.media_id=m.id and cxm.content_id="+\r
772           anEntityAdapter.get("id");\r
773         if (published)\r
774           selectSql+= " and m.is_published='t'";\r
775 \r
776         return Integer.toString(\r
777             DatabaseContentToMedia.getInstance().getSize(\r
778               "cxm", extraTable, selectSql));\r
779       }\r
780       catch (Throwable t) {\r
781         throw new RuntimeException(t.getMessage());\r
782       }\r
783     }\r
784   }\r
785 \r
786   protected class ContentToUserField implements EntityAdapterDefinition.CalculatedField {\r
787     private String fieldName;\r
788 \r
789     public ContentToUserField(String aFieldName) {\r
790       fieldName = aFieldName;\r
791     }\r
792 \r
793     public Object getValue(EntityAdapter anEntityAdapter) {\r
794       try {\r
795         return anEntityAdapter.getToOneRelation(\r
796             "id=" + anEntityAdapter.get(fieldName),\r
797             "id",\r
798             "user");\r
799       }\r
800       catch (Throwable t) {\r
801         throw new RuntimeException(t.getMessage());\r
802       }\r
803     }\r
804   }\r
805 \r
806   protected class ContentToIsLockedField implements EntityAdapterDefinition.CalculatedField {\r
807     private ModuleContent contentModule;\r
808 \r
809     public ContentToIsLockedField() {\r
810       contentModule = new ModuleContent(DatabaseContent.getInstance());\r
811     }\r
812 \r
813     public Object getValue(EntityAdapter anEntityAdapter) {\r
814       try {\r
815         return new Boolean(contentModule.queryArticleLock(anEntityAdapter.getEntity().getId())!=null);\r
816       }\r
817       catch (Throwable t) {\r
818         throw new RuntimeException(t.getMessage());\r
819       }\r
820     }\r
821   }\r
822 }\r