code cleaning, new config
[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 mircoders.entity.EntityUploadedMedia;\r
48 import mircoders.global.MirGlobal;\r
49 import mircoders.localizer.MirAdminInterfaceLocalizer;\r
50 import mircoders.localizer.MirDataModelLocalizer;\r
51 import mircoders.localizer.MirLocalizerFailure;\r
52 import mircoders.storage.DatabaseArticleType;\r
53 import mircoders.storage.DatabaseAudio;\r
54 import mircoders.storage.DatabaseBreaking;\r
55 import mircoders.storage.DatabaseComment;\r
56 import mircoders.storage.DatabaseCommentStatus;\r
57 import mircoders.storage.DatabaseContent;\r
58 import mircoders.storage.DatabaseFeature;\r
59 import mircoders.storage.DatabaseImageType;\r
60 import mircoders.storage.DatabaseImages;\r
61 import mircoders.storage.DatabaseLanguage;\r
62 import mircoders.storage.DatabaseMedia;\r
63 import mircoders.storage.DatabaseMediaType;\r
64 import mircoders.storage.DatabaseMediafolder;\r
65 import mircoders.storage.DatabaseMessages;\r
66 import mircoders.storage.DatabaseOther;\r
67 import mircoders.storage.DatabaseTopics;\r
68 import mircoders.storage.DatabaseUploadedMedia;\r
69 import mircoders.storage.DatabaseUsers;\r
70 import mircoders.storage.DatabaseVideo;\r
71 \r
72 public class MirBasicDataModelLocalizer implements MirDataModelLocalizer {\r
73   private EntityAdapterModel model;\r
74 \r
75   public MirBasicDataModelLocalizer() {\r
76   }\r
77 \r
78   public EntityAdapterModel adapterModel() throws MirLocalizerFailure {\r
79     if (model==null)\r
80       model = buildModel();\r
81 \r
82     return model;\r
83   };\r
84 \r
85   protected void constructContentAdapterDefinition(EntityAdapterDefinition anEntityAdapterDefinition) throws MirLocalizerFailure {\r
86     try {\r
87       anEntityAdapterDefinition.addDBDateField("creationdate", "webdb_create");\r
88       anEntityAdapterDefinition.addDBDateField("changedate", "webdb_lastchange");\r
89       anEntityAdapterDefinition.addMirDateField("date", "date");\r
90       anEntityAdapterDefinition.addCalculatedField("to_topics", new ContentToTopicsField());\r
91       anEntityAdapterDefinition.addCalculatedField("to_comments", new ContentToCommentsField());\r
92       anEntityAdapterDefinition.addCalculatedField("language", new ContentToLanguageField());\r
93 \r
94       anEntityAdapterDefinition.addCalculatedField("commentcount", new ContentCommentCountField(" and is_published='1'"));\r
95       anEntityAdapterDefinition.addCalculatedField("fullcommentcount", new ContentCommentCountField(""));\r
96 \r
97       anEntityAdapterDefinition.addCalculatedField("to_media_images",  new ContentToMediaField( "image" ));\r
98       anEntityAdapterDefinition.addCalculatedField("to_uploaded_media", new ContentToMediaField( "uploadedMedia" ));\r
99       anEntityAdapterDefinition.addCalculatedField("to_media_audio", new ContentToMediaField( "audio" ));\r
100       anEntityAdapterDefinition.addCalculatedField("to_media_video", new ContentToMediaField( "video" ));\r
101       anEntityAdapterDefinition.addCalculatedField("to_media_other", new ContentToMediaField( "otherMedia" ));\r
102       anEntityAdapterDefinition.addCalculatedField("to_media_icon", new ContentToIconField());\r
103 \r
104       anEntityAdapterDefinition.addCalculatedField("article_type", new ContentToArticleTypeField());\r
105 \r
106       anEntityAdapterDefinition.addCalculatedField("description_parsed", new FilteredField("description"));\r
107       anEntityAdapterDefinition.addCalculatedField("content_data_parsed", new FilteredField("content_data"));\r
108 \r
109       anEntityAdapterDefinition.addCalculatedField("operations",\r
110           new EntityToSimpleOperationsField(MirGlobal.localizer().adminInterface().simpleArticleOperations()));\r
111     }\r
112     catch (Throwable t) {\r
113       throw new MirLocalizerFailure(t.getMessage(), t);\r
114     }\r
115   }\r
116 \r
117   protected void constructCommentAdapterDefinition(EntityAdapterDefinition anEntityAdapterDefinition) throws MirLocalizerFailure {\r
118     try {\r
119       anEntityAdapterDefinition.addDBDateField("creationdate", "webdb_create");\r
120       anEntityAdapterDefinition.addCalculatedField("to_content", new CommentToContentField());\r
121       anEntityAdapterDefinition.addCalculatedField("status", new CommentToStatusField());\r
122 \r
123       anEntityAdapterDefinition.addCalculatedField("description_parsed", new FilteredField("description"));\r
124       anEntityAdapterDefinition.addCalculatedField("operations",\r
125           new EntityToSimpleOperationsField(MirGlobal.localizer().adminInterface().simpleCommentOperations()));\r
126     }\r
127     catch (Throwable t) {\r
128       throw new MirLocalizerFailure(t.getMessage(), t);\r
129     }\r
130   }\r
131 \r
132   protected EntityAdapterModel buildModel() throws MirLocalizerFailure {\r
133     EntityAdapterModel result = new EntityAdapterModel();\r
134 \r
135     try {\r
136       EntityAdapterDefinition definition;\r
137 \r
138       definition = new EntityAdapterDefinition();\r
139       constructContentAdapterDefinition( definition );\r
140       result.addMapping( "content", DatabaseContent.getInstance(), definition);\r
141 \r
142       definition = new EntityAdapterDefinition();\r
143       constructCommentAdapterDefinition( definition );\r
144       result.addMapping( "comment", DatabaseComment.getInstance(), definition);\r
145 \r
146       result.addMapping( "articleType", DatabaseArticleType.getInstance(), new EntityAdapterDefinition());\r
147       result.addMapping( "commentStatus", DatabaseCommentStatus.getInstance(), new EntityAdapterDefinition());\r
148 \r
149       definition = new EntityAdapterDefinition();\r
150       definition.addDBDateField("creationdate", "webdb_create");\r
151       result.addMapping( "breakingNews", DatabaseBreaking.getInstance(), definition);\r
152 \r
153       result.addMapping( "feature", DatabaseFeature.getInstance(), new EntityAdapterDefinition());\r
154       result.addMapping( "imageType", DatabaseImageType.getInstance(), new EntityAdapterDefinition());\r
155       result.addMapping( "language", DatabaseLanguage.getInstance(), new EntityAdapterDefinition());\r
156       result.addMapping( "mediaFolder", DatabaseMediafolder.getInstance(), new EntityAdapterDefinition());\r
157       result.addMapping( "mediaType", DatabaseMediaType.getInstance(), new EntityAdapterDefinition());\r
158       result.addMapping( "internalMessage", DatabaseMessages.getInstance(), new EntityAdapterDefinition());\r
159       result.addMapping( "topic", DatabaseTopics.getInstance(), new EntityAdapterDefinition());\r
160       result.addMapping( "user", DatabaseUsers.getInstance(), new EntityAdapterDefinition());\r
161       result.addMapping( "media", DatabaseMedia.getInstance(), new EntityAdapterDefinition());\r
162       result.addMapping( "uploadedMedia", DatabaseUploadedMedia.getInstance(), new EntityAdapterDefinition());\r
163       result.addMapping( "image", DatabaseImages.getInstance(), new EntityAdapterDefinition());\r
164       result.addMapping( "audio", DatabaseAudio.getInstance(), new EntityAdapterDefinition());\r
165       result.addMapping( "video", DatabaseVideo.getInstance(), new EntityAdapterDefinition());\r
166       result.addMapping( "otherMedia", DatabaseOther.getInstance(), new EntityAdapterDefinition());\r
167     }\r
168     catch (Throwable t) {\r
169       throw new MirLocalizerFailure(t.getMessage(), t);\r
170     }\r
171 \r
172     return result;\r
173   }\r
174 \r
175   protected class CommentToContentField implements EntityAdapterDefinition.CalculatedField {\r
176     public Object getValue(EntityAdapter anEntityAdapter) {\r
177       try {\r
178         return anEntityAdapter.getToOneRelation(\r
179                     "id="+anEntityAdapter.get("to_media"),\r
180                     "id",\r
181                     "content" );\r
182       }\r
183       catch (Throwable t) {\r
184         throw new RuntimeException(t.getMessage());\r
185       }\r
186     }\r
187   }\r
188 \r
189   protected class CommentToStatusField implements EntityAdapterDefinition.CalculatedField {\r
190     public Object getValue(EntityAdapter anEntityAdapter) {\r
191       try {\r
192         return anEntityAdapter.getToOneRelation(\r
193                     "id="+anEntityAdapter.get("to_comment_status"),\r
194                     "id",\r
195                     "commentStatus" );\r
196       }\r
197       catch (Throwable t) {\r
198         throw new RuntimeException(t.getMessage());\r
199       }\r
200     }\r
201   }\r
202 \r
203   protected class EntityToSimpleOperationsField implements EntityAdapterDefinition.CalculatedField {\r
204     private List operations;\r
205 \r
206     public EntityToSimpleOperationsField(List anOperations) {\r
207       operations = anOperations;\r
208     }\r
209 \r
210     public Object getValue(EntityAdapter anEntityAdapter) {\r
211       try {\r
212         Iterator i = operations.iterator();\r
213         List availableOperations = new Vector();\r
214 \r
215         while (i.hasNext()) {\r
216           MirAdminInterfaceLocalizer.MirSimpleEntityOperation operation =\r
217             (MirAdminInterfaceLocalizer.MirSimpleEntityOperation) i.next();\r
218 \r
219           if (operation.isAvailable(anEntityAdapter)) {\r
220             availableOperations.add(operation.getName());\r
221           }\r
222         };\r
223 \r
224         return availableOperations;\r
225       }\r
226       catch (Throwable t) {\r
227         throw new RuntimeException(t.getMessage());\r
228       }\r
229     }\r
230   }\r
231 \r
232   protected class FilteredField implements EntityAdapterDefinition.CalculatedField {\r
233     String fieldName;\r
234 \r
235     public FilteredField(String aFieldName) {\r
236       fieldName = aFieldName;\r
237     }\r
238 \r
239     public Object getValue(EntityAdapter anEntityAdapter) {\r
240       try {\r
241         if (anEntityAdapter.get("is_html")!=null && anEntityAdapter.get("is_html").equals("1")) {\r
242           return anEntityAdapter.get(fieldName);\r
243         }\r
244         else {\r
245           return MirGlobal.localizer().producerAssistant().filterText((String) anEntityAdapter.get(fieldName));\r
246         }\r
247       }\r
248       catch (Throwable t) {\r
249         throw new RuntimeException(t.getMessage());\r
250       }\r
251     }\r
252   }\r
253 \r
254   protected class ContentToLanguageField implements EntityAdapterDefinition.CalculatedField {\r
255     public Object getValue(EntityAdapter anEntityAdapter) {\r
256       try {\r
257         return anEntityAdapter.getToOneRelation(\r
258                     "id="+anEntityAdapter.get("to_language"),\r
259                     "id",\r
260                     "language" );\r
261       }\r
262       catch (Throwable t) {\r
263         throw new RuntimeException(t.getMessage());\r
264       }\r
265     }\r
266   }\r
267 \r
268   protected class ContentToArticleTypeField implements EntityAdapterDefinition.CalculatedField {\r
269     public Object getValue(EntityAdapter anEntityAdapter) {\r
270       try {\r
271         return anEntityAdapter.getToOneRelation(\r
272                     "id="+anEntityAdapter.get("to_article_type"),\r
273                     "id",\r
274                     "articleType" );\r
275       }\r
276       catch (Throwable t) {\r
277         throw new RuntimeException(t.getMessage());\r
278       }\r
279     }\r
280   }\r
281 \r
282   protected class ContentToCommentsField implements EntityAdapterDefinition.CalculatedField {\r
283     public Object getValue(EntityAdapter anEntityAdapter) {\r
284       try {\r
285         return anEntityAdapter.getRelation(\r
286                     "to_media="+anEntityAdapter.get("id")+" and is_published='1'",\r
287                     "webdb_create",\r
288                     "comment" );\r
289       }\r
290       catch (Throwable t) {\r
291         throw new RuntimeException(t.getMessage());\r
292       }\r
293     }\r
294   }\r
295 \r
296   protected class ContentToTopicsField implements EntityAdapterDefinition.CalculatedField {\r
297     public Object getValue(EntityAdapter anEntityAdapter) {\r
298       try {\r
299         return anEntityAdapter.getRelation(\r
300                     "exists (select * from content_x_topic where content_id="+anEntityAdapter.get("id")+" and topic_id=id)",\r
301                     "title",\r
302                     "topic" );\r
303       }\r
304       catch (Throwable t) {\r
305         throw new RuntimeException(t.getMessage());\r
306       }\r
307     }\r
308   }\r
309 \r
310   protected class ContentToMediaField implements EntityAdapterDefinition.CalculatedField {\r
311     String definition;\r
312 \r
313     public ContentToMediaField(String aDefinition) {\r
314       definition = aDefinition;\r
315     }\r
316 \r
317     public Object getValue(EntityAdapter anEntityAdapter) {\r
318       try {\r
319         return anEntityAdapter.getRelation(\r
320           "exists (select * from content_x_media where content_id="+anEntityAdapter.get("id")+" and media_id=id)",\r
321           "title",\r
322           definition);\r
323       }\r
324       catch (Throwable t) {\r
325         throw new RuntimeException(t.getMessage());\r
326       }\r
327     }\r
328   }\r
329 \r
330   protected class ContentToIconField implements EntityAdapterDefinition.CalculatedField {\r
331     public Object getValue(EntityAdapter anEntityAdapter) {\r
332       EntityAdapter media;\r
333       Entity mediaType;\r
334       RewindableIterator iterator;\r
335       Map result;\r
336       MirMedia mediaHandler;\r
337       String tinyIcon;\r
338       String iconAlt;\r
339 \r
340       try {\r
341         iterator = (RewindableIterator) (anEntityAdapter.get("to_uploaded_media"));\r
342         iterator.rewind();\r
343 \r
344         tinyIcon = MirGlobal.getConfigProperty("Producer.Icon.TinyText");\r
345         iconAlt = "Text";\r
346 \r
347         if (iterator.hasNext()) {\r
348           media = (EntityAdapter) iterator.next();\r
349 \r
350           mediaType = ((EntityUploadedMedia) (media.getEntity())).getMediaType();\r
351           mediaHandler = MediaHelper.getHandler( mediaType );\r
352 \r
353           if (mediaHandler.isVideo()) {\r
354             tinyIcon = MirGlobal.getConfigProperty("Producer.Icon.TinyVideo");\r
355             iconAlt = "Video";\r
356           }\r
357           else if (mediaHandler.isAudio()) {\r
358             tinyIcon = MirGlobal.getConfigProperty("Producer.Icon.TinyAudio");\r
359             iconAlt = "Audio";\r
360           }\r
361           else if (mediaHandler.isImage()) {\r
362             tinyIcon = MirGlobal.getConfigProperty("Producer.Icon.TinyImage");\r
363             iconAlt = "Image";\r
364           }\r
365           else {\r
366             tinyIcon = mediaHandler.getTinyIconName();\r
367             iconAlt = mediaHandler.getIconAltName();\r
368           }\r
369 \r
370         }\r
371       }\r
372       catch (Throwable t) {\r
373         System.out.println("ContentToIconField: exception: " +t.getMessage());\r
374         t.printStackTrace(System.out);\r
375         throw new RuntimeException(t.getMessage());\r
376       }\r
377 \r
378       result = new HashMap();\r
379       result.put("tiny_icon", MirGlobal.getConfigProperty("Producer.ImageRoot") + "/" + tinyIcon);\r
380       result.put("icon_alt", iconAlt);\r
381 \r
382       return result;\r
383     }\r
384   }\r
385 \r
386   protected class ContentCommentCountField implements EntityAdapterDefinition.CalculatedField {\r
387     private String extraCondition;\r
388 \r
389     public ContentCommentCountField(String anExtraCondition) {\r
390       super();\r
391 \r
392       extraCondition = anExtraCondition;\r
393     }\r
394 \r
395     public Object getValue(EntityAdapter anEntityAdapter) {\r
396       try {\r
397         return Integer.toString(\r
398             DatabaseComment.getInstance().getSize(\r
399                   "to_media="+anEntityAdapter.get("id")+" " + extraCondition));\r
400       }\r
401       catch (Throwable t) {\r
402         throw new RuntimeException(t.getMessage());\r
403       }\r
404     }\r
405   }\r
406 }\r