fixes:
[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.media.MediaHelper;\r
45 import mir.media.MirMedia;\r
46 import mir.util.RewindableIterator;\r
47 import mir.log.LoggerWrapper;\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( "feature", DatabaseFeature.getInstance(), new EntityAdapterDefinition());\r
161       result.addMapping( "imageType", DatabaseImageType.getInstance(), new EntityAdapterDefinition());\r
162       result.addMapping( "language", DatabaseLanguage.getInstance(), new EntityAdapterDefinition());\r
163       result.addMapping( "mediaFolder", DatabaseMediafolder.getInstance(), new EntityAdapterDefinition());\r
164       result.addMapping( "mediaType", DatabaseMediaType.getInstance(), new EntityAdapterDefinition());\r
165       result.addMapping( "internalMessage", DatabaseMessages.getInstance(), new EntityAdapterDefinition());\r
166       result.addMapping( "topic", DatabaseTopics.getInstance(), new EntityAdapterDefinition());\r
167       result.addMapping( "user", DatabaseUsers.getInstance(), new EntityAdapterDefinition());\r
168       result.addMapping( "media", DatabaseMedia.getInstance(), new EntityAdapterDefinition());\r
169       result.addMapping( "uploadedMedia", DatabaseUploadedMedia.getInstance(), new EntityAdapterDefinition());\r
170       result.addMapping( "image", DatabaseImages.getInstance(), new EntityAdapterDefinition());\r
171       result.addMapping( "audio", DatabaseAudio.getInstance(), new EntityAdapterDefinition());\r
172       result.addMapping( "video", DatabaseVideo.getInstance(), new EntityAdapterDefinition());\r
173       result.addMapping( "otherMedia", DatabaseOther.getInstance(), new EntityAdapterDefinition());\r
174     }\r
175     catch (Throwable t) {\r
176       throw new MirLocalizerFailure(t.getMessage(), t);\r
177     }\r
178 \r
179     return result;\r
180   }\r
181 \r
182   protected class CommentToContentField implements EntityAdapterDefinition.CalculatedField {\r
183     public Object getValue(EntityAdapter anEntityAdapter) {\r
184       try {\r
185         return anEntityAdapter.getToOneRelation(\r
186                     "id="+anEntityAdapter.get("to_media"),\r
187                     "id",\r
188                     "content" );\r
189       }\r
190       catch (Throwable t) {\r
191         throw new RuntimeException(t.getMessage());\r
192       }\r
193     }\r
194   }\r
195 \r
196   protected class CommentToStatusField implements EntityAdapterDefinition.CalculatedField {\r
197     public Object getValue(EntityAdapter anEntityAdapter) {\r
198       try {\r
199         return anEntityAdapter.getToOneRelation(\r
200                     "id="+anEntityAdapter.get("to_comment_status"),\r
201                     "id",\r
202                     "commentStatus" );\r
203       }\r
204       catch (Throwable t) {\r
205         throw new RuntimeException(t.getMessage());\r
206       }\r
207     }\r
208   }\r
209 \r
210   protected class EntityToSimpleOperationsField implements EntityAdapterDefinition.CalculatedField {\r
211     private List operations;\r
212 \r
213     public EntityToSimpleOperationsField(List anOperations) {\r
214       operations = anOperations;\r
215     }\r
216 \r
217     public Object getValue(EntityAdapter anEntityAdapter) {\r
218       try {\r
219         Iterator i = operations.iterator();\r
220         List availableOperations = new Vector();\r
221 \r
222         while (i.hasNext()) {\r
223           MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation =\r
224             (MirAdminInterfaceLocalizer.MirSimpleEntityOperation) i.next();\r
225 \r
226           if (operation.isAvailable(anEntityAdapter)) {\r
227             availableOperations.add(operation.getName());\r
228           }\r
229         };\r
230 \r
231         return availableOperations;\r
232       }\r
233       catch (Throwable t) {\r
234         throw new RuntimeException(t.getMessage());\r
235       }\r
236     }\r
237   }\r
238 \r
239   protected class FilteredField implements EntityAdapterDefinition.CalculatedField {\r
240     String fieldName;\r
241 \r
242     public FilteredField(String aFieldName) {\r
243       fieldName = aFieldName;\r
244     }\r
245 \r
246     public Object getValue(EntityAdapter anEntityAdapter) {\r
247       try {\r
248         if (anEntityAdapter.get("is_html")!=null && anEntityAdapter.get("is_html").equals("1")) {\r
249           return anEntityAdapter.get(fieldName);\r
250         }\r
251         else {\r
252           return MirGlobal.localizer().producerAssistant().filterText((String) anEntityAdapter.get(fieldName));\r
253         }\r
254       }\r
255       catch (Throwable t) {\r
256         throw new RuntimeException(t.getMessage());\r
257       }\r
258     }\r
259   }\r
260 \r
261   protected class ContentToParentField implements EntityAdapterDefinition.CalculatedField {\r
262     public Object getValue(EntityAdapter anEntityAdapter) {\r
263       try {\r
264         logger.debug("ContentToParentField.getValue");\r
265         return anEntityAdapter.getToOneRelation(\r
266                     "id="+anEntityAdapter.get("to_content"),\r
267                     "id",\r
268                     "content" );\r
269       }\r
270       catch (Throwable t) {\r
271         throw new RuntimeException(t.getMessage());\r
272       }\r
273     }\r
274   }\r
275 \r
276   protected class ContentToChildrenField implements EntityAdapterDefinition.CalculatedField {\r
277     public Object getValue(EntityAdapter anEntityAdapter) {\r
278       try {\r
279         return anEntityAdapter.getRelation(\r
280                     "to_content="+anEntityAdapter.get("id"),\r
281                     "id",\r
282                     "content" );\r
283       }\r
284       catch (Throwable t) {\r
285         throw new RuntimeException(t.getMessage());\r
286       }\r
287     }\r
288   }\r
289 \r
290   protected class ContentToLanguageField implements EntityAdapterDefinition.CalculatedField {\r
291     public Object getValue(EntityAdapter anEntityAdapter) {\r
292       try {\r
293         return anEntityAdapter.getToOneRelation(\r
294                     "id="+anEntityAdapter.get("to_language"),\r
295                     "id",\r
296                     "language" );\r
297       }\r
298       catch (Throwable t) {\r
299         throw new RuntimeException(t.getMessage());\r
300       }\r
301     }\r
302   }\r
303 \r
304   protected class ContentToArticleTypeField implements EntityAdapterDefinition.CalculatedField {\r
305     public Object getValue(EntityAdapter anEntityAdapter) {\r
306       try {\r
307         return anEntityAdapter.getToOneRelation(\r
308                     "id="+anEntityAdapter.get("to_article_type"),\r
309                     "id",\r
310                     "articleType" );\r
311       }\r
312       catch (Throwable t) {\r
313         throw new RuntimeException(t.getMessage());\r
314       }\r
315     }\r
316   }\r
317 \r
318   protected class ContentToCommentsField implements EntityAdapterDefinition.CalculatedField {\r
319     public Object getValue(EntityAdapter anEntityAdapter) {\r
320       try {\r
321         return anEntityAdapter.getRelation(\r
322                     "to_media="+anEntityAdapter.get("id")+" and is_published='1'",\r
323                     "webdb_create",\r
324                     "comment" );\r
325       }\r
326       catch (Throwable t) {\r
327         throw new RuntimeException(t.getMessage());\r
328       }\r
329     }\r
330   }\r
331 \r
332   protected class ContentToTopicsField implements EntityAdapterDefinition.CalculatedField {\r
333     public Object getValue(EntityAdapter anEntityAdapter) {\r
334       try {\r
335         return anEntityAdapter.getRelation(\r
336                     "exists (select * from content_x_topic where content_id="+anEntityAdapter.get("id")+" and topic_id=id)",\r
337                     "title",\r
338                     "topic" );\r
339       }\r
340       catch (Throwable t) {\r
341         throw new RuntimeException(t.getMessage());\r
342       }\r
343     }\r
344   }\r
345 \r
346   protected class ContentToMediaField implements EntityAdapterDefinition.CalculatedField {\r
347     String definition;\r
348 \r
349     public ContentToMediaField(String aDefinition) {\r
350       definition = aDefinition;\r
351     }\r
352 \r
353     public Object getValue(EntityAdapter anEntityAdapter) {\r
354       try {\r
355         return anEntityAdapter.getRelation(\r
356           "is_published='t' and exists (select * from content_x_media where content_id="+anEntityAdapter.get("id")+" and media_id=id)",\r
357           "id",\r
358           definition);\r
359       }\r
360       catch (Throwable t) {\r
361         throw new RuntimeException(t.getMessage());\r
362       }\r
363     }\r
364   }\r
365 \r
366   protected class ContentToIconField implements EntityAdapterDefinition.CalculatedField {\r
367     public Object getValue(EntityAdapter anEntityAdapter) {\r
368       EntityAdapter media;\r
369       Entity mediaType;\r
370       RewindableIterator iterator;\r
371       Map result;\r
372       MirMedia mediaHandler;\r
373       String tinyIcon;\r
374       String iconAlt;\r
375 \r
376       try {\r
377         iterator = (RewindableIterator) (anEntityAdapter.get("to_uploaded_media"));\r
378         iterator.rewind();\r
379 \r
380         tinyIcon = MirGlobal.getConfigProperty("Producer.Icon.TinyText");\r
381         iconAlt = "Text";\r
382 \r
383         if (iterator.hasNext()) {\r
384           media = (EntityAdapter) iterator.next();\r
385 \r
386           mediaType = ((EntityUploadedMedia) (media.getEntity())).getMediaType();\r
387           mediaHandler = MediaHelper.getHandler( mediaType );\r
388 \r
389           if (mediaHandler.isVideo()) {\r
390             tinyIcon = MirGlobal.getConfigProperty("Producer.Icon.TinyVideo");\r
391             iconAlt = "Video";\r
392           }\r
393           else if (mediaHandler.isAudio()) {\r
394             tinyIcon = MirGlobal.getConfigProperty("Producer.Icon.TinyAudio");\r
395             iconAlt = "Audio";\r
396           }\r
397           else if (mediaHandler.isImage()) {\r
398             tinyIcon = MirGlobal.getConfigProperty("Producer.Icon.TinyImage");\r
399             iconAlt = "Image";\r
400           }\r
401           else {\r
402             tinyIcon = mediaHandler.getTinyIconName();\r
403             iconAlt = mediaHandler.getIconAltName();\r
404           }\r
405 \r
406         }\r
407       }\r
408       catch (Throwable t) {\r
409         logger.error("ContentToIconField: " +t.getMessage());\r
410         throw new RuntimeException(t.getMessage());\r
411       }\r
412 \r
413       result = new HashMap();\r
414       result.put("tiny_icon", MirGlobal.getConfigProperty("Producer.ImageRoot") + "/" + tinyIcon);\r
415       result.put("icon_alt", iconAlt);\r
416 \r
417       return result;\r
418     }\r
419   }\r
420 \r
421   protected class ContentCommentCountField implements EntityAdapterDefinition.CalculatedField {\r
422     private String extraCondition;\r
423 \r
424     public ContentCommentCountField(String anExtraCondition) {\r
425       super();\r
426 \r
427       extraCondition = anExtraCondition;\r
428     }\r
429 \r
430     public Object getValue(EntityAdapter anEntityAdapter) {\r
431       try {\r
432         return Integer.toString(\r
433             DatabaseComment.getInstance().getSize(\r
434                   "to_media="+anEntityAdapter.get("id")+" " + extraCondition));\r
435       }\r
436       catch (Throwable t) {\r
437         throw new RuntimeException(t.getMessage());\r
438       }\r
439     }\r
440   }\r
441 }\r