922ed11939baea54952f85099e5c6565258c6688
[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 the com.oreilly.servlet library, any library\r
22  * licensed under the Apache Software License, The Sun (tm) Java Advanced\r
23  * Imaging library (JAI), The Sun JIMI library (or with modified versions of\r
24  * the above that use the same license as the above), and distribute linked\r
25  * combinations including the two.  You must obey the GNU General Public\r
26  * License in all respects for all of the code used other than the above\r
27  * mentioned libraries.  If you modify this file, you may extend this exception\r
28  * to your version of the file, but you are not obligated to do so.  If you do\r
29  * not wish to do so, delete this exception statement from your version.\r
30  */\r
31 \r
32 package mircoders.localizer.basic;\r
33 \r
34 import java.util.HashMap;\r
35 import java.util.Iterator;\r
36 import java.util.List;\r
37 import java.util.Map;\r
38 import java.util.Vector;\r
39 \r
40 import mir.entity.Entity;\r
41 import mir.entity.adapter.EntityAdapter;\r
42 import mir.entity.adapter.EntityAdapterDefinition;\r
43 import mir.entity.adapter.EntityAdapterModel;\r
44 import mir.log.LoggerWrapper;\r
45 import mir.media.MediaHelper;\r
46 import mir.media.MirMedia;\r
47 import mir.util.RewindableIterator;\r
48 import mircoders.entity.EntityUploadedMedia;\r
49 import mircoders.global.MirGlobal;\r
50 import mircoders.localizer.MirAdminInterfaceLocalizer;\r
51 import mircoders.localizer.MirDataModelLocalizer;\r
52 import mircoders.localizer.MirLocalizerFailure;\r
53 import mircoders.storage.DatabaseArticleType;\r
54 import mircoders.storage.DatabaseAudio;\r
55 import mircoders.storage.DatabaseBreaking;\r
56 import mircoders.storage.DatabaseComment;\r
57 import mircoders.storage.DatabaseCommentStatus;\r
58 import mircoders.storage.DatabaseContent;\r
59 import mircoders.storage.DatabaseFeature;\r
60 import mircoders.storage.DatabaseImageType;\r
61 import mircoders.storage.DatabaseImages;\r
62 import mircoders.storage.DatabaseLanguage;\r
63 import mircoders.storage.DatabaseMedia;\r
64 import mircoders.storage.DatabaseMediaType;\r
65 import mircoders.storage.DatabaseMediafolder;\r
66 import mircoders.storage.DatabaseMessages;\r
67 import mircoders.storage.DatabaseOther;\r
68 import mircoders.storage.DatabaseTopics;\r
69 import mircoders.storage.DatabaseUploadedMedia;\r
70 import mircoders.storage.DatabaseUsers;\r
71 import mircoders.storage.DatabaseVideo;\r
72 \r
73 public class MirBasicDataModelLocalizer implements MirDataModelLocalizer {\r
74   private EntityAdapterModel model;\r
75   protected LoggerWrapper logger;\r
76 \r
77   public MirBasicDataModelLocalizer() {\r
78     model=null;\r
79     logger = new LoggerWrapper("Localizer.DataModel");\r
80   }\r
81 \r
82   public EntityAdapterModel adapterModel() throws MirLocalizerFailure {\r
83     if (model==null)\r
84       model = buildModel();\r
85 \r
86     return model;\r
87   };\r
88 \r
89   protected void constructContentAdapterDefinition(EntityAdapterDefinition anEntityAdapterDefinition) throws MirLocalizerFailure {\r
90     try {\r
91       anEntityAdapterDefinition.addDBDateField("creationdate", "webdb_create");\r
92       anEntityAdapterDefinition.addDBDateField("changedate", "webdb_lastchange");\r
93       anEntityAdapterDefinition.addMirDateField("date", "date");\r
94       anEntityAdapterDefinition.addCalculatedField("to_topics", new ContentToTopicsField());\r
95       anEntityAdapterDefinition.addCalculatedField("to_comments", new ContentToCommentsField());\r
96       anEntityAdapterDefinition.addCalculatedField("language", new ContentToLanguageField());\r
97 \r
98       anEntityAdapterDefinition.addCalculatedField("commentcount", new ContentCommentCountField(" and is_published='1'"));\r
99       anEntityAdapterDefinition.addCalculatedField("fullcommentcount", new ContentCommentCountField(""));\r
100 \r
101       anEntityAdapterDefinition.addCalculatedField("to_media_images",  new ContentToMediaField( "image" ));\r
102       anEntityAdapterDefinition.addCalculatedField("to_uploaded_media", new ContentToMediaField( "uploadedMedia" ));\r
103       anEntityAdapterDefinition.addCalculatedField("to_media_audio", new ContentToMediaField( "audio" ));\r
104       anEntityAdapterDefinition.addCalculatedField("to_media_video", new ContentToMediaField( "video" ));\r
105       anEntityAdapterDefinition.addCalculatedField("to_media_other", new ContentToMediaField( "otherMedia" ));\r
106       anEntityAdapterDefinition.addCalculatedField("to_media_icon", new ContentToIconField());\r
107 \r
108       anEntityAdapterDefinition.addCalculatedField("article_type", new ContentToArticleTypeField());\r
109 \r
110       anEntityAdapterDefinition.addCalculatedField("description_parsed", new FilteredField("description"));\r
111       anEntityAdapterDefinition.addCalculatedField("content_data_parsed", new FilteredField("content_data"));\r
112 \r
113       anEntityAdapterDefinition.addCalculatedField("children", new ContentToChildrenField());\r
114       anEntityAdapterDefinition.addCalculatedField("parent", new ContentToParentField());\r
115 \r
116       anEntityAdapterDefinition.addCalculatedField("operations",\r
117           new EntityToSimpleOperationsField(MirGlobal.localizer().adminInterface().simpleArticleOperations()));\r
118     }\r
119     catch (Throwable t) {\r
120       throw new MirLocalizerFailure(t.getMessage(), t);\r
121     }\r
122   }\r
123 \r
124   protected void constructCommentAdapterDefinition(EntityAdapterDefinition anEntityAdapterDefinition) throws MirLocalizerFailure {\r
125     try {\r
126       anEntityAdapterDefinition.addDBDateField("creationdate", "webdb_create");\r
127       anEntityAdapterDefinition.addCalculatedField("to_content", new CommentToContentField());\r
128       anEntityAdapterDefinition.addCalculatedField("status", new CommentToStatusField());\r
129 \r
130       anEntityAdapterDefinition.addCalculatedField("description_parsed", new FilteredField("description"));\r
131       anEntityAdapterDefinition.addCalculatedField("operations",\r
132           new EntityToSimpleOperationsField(MirGlobal.localizer().adminInterface().simpleCommentOperations()));\r
133     }\r
134     catch (Throwable t) {\r
135       throw new MirLocalizerFailure(t.getMessage(), t);\r
136     }\r
137   }\r
138 \r
139   protected EntityAdapterModel buildModel() throws MirLocalizerFailure {\r
140     EntityAdapterModel result = new EntityAdapterModel();\r
141 \r
142     try {\r
143       EntityAdapterDefinition definition;\r
144 \r
145       definition = new EntityAdapterDefinition();\r
146       constructContentAdapterDefinition( definition );\r
147       result.addMapping( "content", DatabaseContent.getInstance(), definition);\r
148 \r
149       definition = new EntityAdapterDefinition();\r
150       constructCommentAdapterDefinition( definition );\r
151       result.addMapping( "comment", DatabaseComment.getInstance(), definition);\r
152 \r
153       result.addMapping( "articleType", DatabaseArticleType.getInstance(), new EntityAdapterDefinition());\r
154       result.addMapping( "commentStatus", DatabaseCommentStatus.getInstance(), new EntityAdapterDefinition());\r
155 \r
156       definition = new EntityAdapterDefinition();\r
157       definition.addDBDateField("creationdate", "webdb_create");\r
158       result.addMapping( "breakingNews", DatabaseBreaking.getInstance(), definition);\r
159 \r
160       result.addMapping( "imageType", DatabaseImageType.getInstance(), new EntityAdapterDefinition());\r
161       result.addMapping( "language", DatabaseLanguage.getInstance(), new EntityAdapterDefinition());\r
162       result.addMapping( "mediaFolder", DatabaseMediafolder.getInstance(), new EntityAdapterDefinition());\r
163       result.addMapping( "mediaType", DatabaseMediaType.getInstance(), new EntityAdapterDefinition());\r
164       result.addMapping( "internalMessage", DatabaseMessages.getInstance(), new EntityAdapterDefinition());\r
165       result.addMapping( "topic", DatabaseTopics.getInstance(), new EntityAdapterDefinition());\r
166       result.addMapping( "user", DatabaseUsers.getInstance(), new EntityAdapterDefinition());\r
167       result.addMapping( "media", DatabaseMedia.getInstance(), new EntityAdapterDefinition());\r
168       result.addMapping( "uploadedMedia", DatabaseUploadedMedia.getInstance(), new EntityAdapterDefinition());\r
169       result.addMapping( "image", DatabaseImages.getInstance(), new EntityAdapterDefinition());\r
170       result.addMapping( "audio", DatabaseAudio.getInstance(), new EntityAdapterDefinition());\r
171       result.addMapping( "video", DatabaseVideo.getInstance(), new EntityAdapterDefinition());\r
172       result.addMapping( "otherMedia", DatabaseOther.getInstance(), new EntityAdapterDefinition());\r
173     }\r
174     catch (Throwable t) {\r
175       throw new MirLocalizerFailure(t.getMessage(), t);\r
176     }\r
177 \r
178     return result;\r
179   }\r
180 \r
181   protected class CommentToContentField implements EntityAdapterDefinition.CalculatedField {\r
182     public Object getValue(EntityAdapter anEntityAdapter) {\r
183       try {\r
184         return anEntityAdapter.getToOneRelation(\r
185                     "id="+anEntityAdapter.get("to_media"),\r
186                     "id",\r
187                     "content" );\r
188       }\r
189       catch (Throwable t) {\r
190         throw new RuntimeException(t.getMessage());\r
191       }\r
192     }\r
193   }\r
194 \r
195   protected class CommentToStatusField implements EntityAdapterDefinition.CalculatedField {\r
196     public Object getValue(EntityAdapter anEntityAdapter) {\r
197       try {\r
198         return anEntityAdapter.getToOneRelation(\r
199                     "id="+anEntityAdapter.get("to_comment_status"),\r
200                     "id",\r
201                     "commentStatus" );\r
202       }\r
203       catch (Throwable t) {\r
204         throw new RuntimeException(t.getMessage());\r
205       }\r
206     }\r
207   }\r
208 \r
209   protected class EntityToSimpleOperationsField implements EntityAdapterDefinition.CalculatedField {\r
210     private List operations;\r
211 \r
212     public EntityToSimpleOperationsField(List anOperations) {\r
213       operations = anOperations;\r
214     }\r
215 \r
216     public Object getValue(EntityAdapter anEntityAdapter) {\r
217       try {\r
218         Iterator i = operations.iterator();\r
219         List availableOperations = new Vector();\r
220 \r
221         while (i.hasNext()) {\r
222           MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation =\r
223             (MirAdminInterfaceLocalizer.MirSimpleEntityOperation) i.next();\r
224 \r
225           if (operation.isAvailable(anEntityAdapter)) {\r
226             availableOperations.add(operation.getName());\r
227           }\r
228         };\r
229 \r
230         return availableOperations;\r
231       }\r
232       catch (Throwable t) {\r
233         throw new RuntimeException(t.getMessage());\r
234       }\r
235     }\r
236   }\r
237 \r
238   protected class FilteredField implements EntityAdapterDefinition.CalculatedField {\r
239     String fieldName;\r
240 \r
241     public FilteredField(String aFieldName) {\r
242       fieldName = aFieldName;\r
243     }\r
244 \r
245     public Object getValue(EntityAdapter anEntityAdapter) {\r
246       try {\r
247         if (anEntityAdapter.get("is_html")!=null && anEntityAdapter.get("is_html").equals("1")) {\r
248           return anEntityAdapter.get(fieldName);\r
249         }\r
250         else {\r
251           return MirGlobal.localizer().producerAssistant().filterText((String) anEntityAdapter.get(fieldName));\r
252         }\r
253       }\r
254       catch (Throwable t) {\r
255         throw new RuntimeException(t.getMessage());\r
256       }\r
257     }\r
258   }\r
259 \r
260   protected class ContentToParentField implements EntityAdapterDefinition.CalculatedField {\r
261     public Object getValue(EntityAdapter anEntityAdapter) {\r
262       try {\r
263         logger.debug("ContentToParentField.getValue");\r
264         return anEntityAdapter.getToOneRelation(\r
265                     "id="+anEntityAdapter.get("to_content"),\r
266                     "id",\r
267                     "content" );\r
268       }\r
269       catch (Throwable t) {\r
270         throw new RuntimeException(t.getMessage());\r
271       }\r
272     }\r
273   }\r
274 \r
275   protected class ContentToChildrenField implements EntityAdapterDefinition.CalculatedField {\r
276     public Object getValue(EntityAdapter anEntityAdapter) {\r
277       try {\r
278         return anEntityAdapter.getRelation(\r
279                     "to_content="+anEntityAdapter.get("id"),\r
280                     "id",\r
281                     "content" );\r
282       }\r
283       catch (Throwable t) {\r
284         throw new RuntimeException(t.getMessage());\r
285       }\r
286     }\r
287   }\r
288 \r
289   protected class ContentToLanguageField implements EntityAdapterDefinition.CalculatedField {\r
290     public Object getValue(EntityAdapter anEntityAdapter) {\r
291       try {\r
292         return anEntityAdapter.getToOneRelation(\r
293                     "id="+anEntityAdapter.get("to_language"),\r
294                     "id",\r
295                     "language" );\r
296       }\r
297       catch (Throwable t) {\r
298         throw new RuntimeException(t.getMessage());\r
299       }\r
300     }\r
301   }\r
302 \r
303   protected class ContentToArticleTypeField implements EntityAdapterDefinition.CalculatedField {\r
304     public Object getValue(EntityAdapter anEntityAdapter) {\r
305       try {\r
306         return anEntityAdapter.getToOneRelation(\r
307                     "id="+anEntityAdapter.get("to_article_type"),\r
308                     "id",\r
309                     "articleType" );\r
310       }\r
311       catch (Throwable t) {\r
312         throw new RuntimeException(t.getMessage());\r
313       }\r
314     }\r
315   }\r
316 \r
317   protected class ContentToCommentsField implements EntityAdapterDefinition.CalculatedField {\r
318     public Object getValue(EntityAdapter anEntityAdapter) {\r
319       try {\r
320         return anEntityAdapter.getRelation(\r
321                     "to_media="+anEntityAdapter.get("id")+" and is_published='1'",\r
322                     "webdb_create",\r
323                     "comment" );\r
324       }\r
325       catch (Throwable t) {\r
326         throw new RuntimeException(t.getMessage());\r
327       }\r
328     }\r
329   }\r
330 \r
331   protected class ContentToTopicsField implements EntityAdapterDefinition.CalculatedField {\r
332     public Object getValue(EntityAdapter anEntityAdapter) {\r
333       try {\r
334         return anEntityAdapter.getRelation(\r
335                     "exists (select * from content_x_topic where content_id="+anEntityAdapter.get("id")+" and topic_id=id)",\r
336                     "title",\r
337                     "topic" );\r
338       }\r
339       catch (Throwable t) {\r
340         throw new RuntimeException(t.getMessage());\r
341       }\r
342     }\r
343   }\r
344 \r
345   protected class ContentToMediaField implements EntityAdapterDefinition.CalculatedField {\r
346     String definition;\r
347 \r
348     public ContentToMediaField(String aDefinition) {\r
349       definition = aDefinition;\r
350     }\r
351 \r
352     public Object getValue(EntityAdapter anEntityAdapter) {\r
353       try {\r
354         return anEntityAdapter.getRelation(\r
355           "is_published='t' and exists (select * from content_x_media where content_id="+anEntityAdapter.get("id")+" and media_id=id)",\r
356           "id",\r
357           definition);\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 ContentToIconField implements EntityAdapterDefinition.CalculatedField {\r
366     public Object getValue(EntityAdapter anEntityAdapter) {\r
367       EntityAdapter media;\r
368       Entity mediaType;\r
369       RewindableIterator iterator;\r
370       Map result;\r
371       MirMedia mediaHandler;\r
372       String tinyIcon;\r
373       String iconAlt;\r
374 \r
375       try {\r
376         iterator = (RewindableIterator) (anEntityAdapter.get("to_uploaded_media"));\r
377         iterator.rewind();\r
378 \r
379         tinyIcon = MirGlobal.getConfigProperty("Producer.Icon.TinyText");\r
380         iconAlt = "Text";\r
381 \r
382         if (iterator.hasNext()) {\r
383           media = (EntityAdapter) iterator.next();\r
384 \r
385           mediaType = ((EntityUploadedMedia) (media.getEntity())).getMediaType();\r
386           mediaHandler = MediaHelper.getHandler( mediaType );\r
387 \r
388           if (mediaHandler.isVideo()) {\r
389             tinyIcon = MirGlobal.getConfigProperty("Producer.Icon.TinyVideo");\r
390             iconAlt = "Video";\r
391           }\r
392           else if (mediaHandler.isAudio()) {\r
393             tinyIcon = MirGlobal.getConfigProperty("Producer.Icon.TinyAudio");\r
394             iconAlt = "Audio";\r
395           }\r
396           else if (mediaHandler.isImage()) {\r
397             tinyIcon = MirGlobal.getConfigProperty("Producer.Icon.TinyImage");\r
398             iconAlt = "Image";\r
399           }\r
400           else {\r
401             tinyIcon = mediaHandler.getTinyIconName();\r
402             iconAlt = mediaHandler.getIconAltName();\r
403           }\r
404 \r
405         }\r
406       }\r
407       catch (Throwable t) {\r
408         logger.error("ContentToIconField: " +t.getMessage());\r
409         throw new RuntimeException(t.getMessage());\r
410       }\r
411 \r
412       result = new HashMap();\r
413       result.put("tiny_icon", MirGlobal.getConfigProperty("Producer.ImageRoot") + "/" + tinyIcon);\r
414       result.put("icon_alt", iconAlt);\r
415 \r
416       return result;\r
417     }\r
418   }\r
419 \r
420   protected class ContentCommentCountField implements EntityAdapterDefinition.CalculatedField {\r
421     private String extraCondition;\r
422 \r
423     public ContentCommentCountField(String anExtraCondition) {\r
424       super();\r
425 \r
426       extraCondition = anExtraCondition;\r
427     }\r
428 \r
429     public Object getValue(EntityAdapter anEntityAdapter) {\r
430       try {\r
431         return Integer.toString(\r
432             DatabaseComment.getInstance().getSize(\r
433                   "to_media="+anEntityAdapter.get("id")+" " + extraCondition));\r
434       }\r
435       catch (Throwable t) {\r
436         throw new RuntimeException(t.getMessage());\r
437       }\r
438     }\r
439   }\r
440 }\r