d5aae4140e9339641e027160d21a3c3b905b5237
[mir.git] / source / mircoders / producer / ProducerStartPage.java
1 package mircoders.producer;
2
3 import java.io.*;
4 import java.lang.*;
5 import java.lang.reflect.*;
6 import java.util.*;
7
8 import freemarker.template.*;
9
10 import mir.misc.*;
11 import mir.media.*;
12 import mir.storage.*;
13 import mir.module.*;
14 import mir.entity.*;
15
16 import mircoders.module.*;
17 import mircoders.storage.*;
18 import mircoders.entity.*;
19
20
21 public class ProducerStartPage extends Producer {
22
23   private static String startPageTemplate = MirConfig.getProp("Producer.StartPage.Template");
24   private static int itemsPerPage = Integer.parseInt(MirConfig.getProp("Producer.StartPage.Items"));
25   private static int newsPerPage = Integer.parseInt(MirConfig.getProp("Producer.StartPage.Newswire"));
26   Entity              mediaType;
27   Entity              upMedia;
28   SimpleHash          upMediaSimpleHash;
29   Class               mediaHandlerClass;
30   Class               mediaStorageClass;
31   String              mediaStorageName;
32
33
34
35   public static void main(String argv[]){
36     try {
37       // Why are we reloading the configuration here?
38       // is there something I'm missing?
39       // mh. <heckmann@hbe.ca>
40       // Configuration.initConfig(argv[0]);
41       new ProducerStartPage().handle(new PrintWriter(System.out), null);
42     } catch(Exception e) {
43       System.err.println(e.toString());
44     }
45   }
46
47   public void handle(PrintWriter htmlout, EntityUsers user, boolean force,boolean sync)
48     throws StorageObjectException, ModuleException
49   {
50     printHTML(htmlout, "Producer.StartPage: started");
51
52     String extLinkName = MirConfig.getProp("Producer.ExtLinkName");
53     String intLinkName = MirConfig.getProp("Producer.IntLinkName");
54     String mailLinkName = MirConfig.getProp("Producer.MailLinkName");
55     String imageRoot = MirConfig.getProp("Producer.ImageRoot");
56
57     long                sessionConnectTime = 0;
58     long                startTime = (new java.util.Date()).getTime();
59     String              nowWebdbDate = StringUtil.date2webdbDate(new GregorianCalendar());
60     String              whereClause;
61     String              orderBy;
62     FileWriter          outputFile;
63     String              htmlFileName;
64     EntityContent       currentContent;
65     EntityList          entityList;
66     SimpleHash          startPageModel;
67     SimpleList          contentList;
68     String              currentMediaId;
69     EntityList          upMediaEntityList;
70     EntityList          imageEntityList;
71     EntityList          currentMediaList;
72     Entity              mediaType;
73     EntityUploadedMedia uploadedMedia;
74     Class               mediaHandlerClass=null;
75     MirMedia            mediaHandler=null;
76     String              mediaHandlerName=null;
77     Database            mediaStorage=null;
78     String              tinyIcon;
79     String              iconAlt;
80     Logfile theLog = Logfile.getInstance(MirConfig.getProp("Home") + MirConfig.getProp("Producer.Logfile"));
81
82     SimpleList mediaList;
83     SimpleHash contentHash;
84
85     // get the topiclist
86     entityList = topicsModule.getByWhereClause("","title",-1);
87     SimpleList topicList = HTMLTemplateProcessor.makeSimpleList(entityList);
88
89     // get the imclinks
90     entityList = linksImcsModule.getByWhereClause("", "sortpriority, title", -1);
91     SimpleList imcList = HTMLTemplateProcessor.makeSimpleList(entityList);
92
93     EntityList theParentList = linksImcsModule.getByWhereClause("to_parent_id=NULL", "sortpriority, title", -1);
94     SimpleList parentList = HTMLTemplateProcessor.makeSimpleList(theParentList);
95
96     // get the newswire
97     whereClause="is_published=true AND to_article_type >= 1";
98     entityList = contentModule.getContent(whereClause,"date desc, webdb_create desc",0,newsPerPage);
99     SimpleList newsWireList = HTMLTemplateProcessor.makeSimpleList(entityList);
100     for (int i=0; i < entityList.size();i++) {
101       currentContent = (EntityContent)entityList.elementAt(i);
102       //fetching/setting the images
103       upMediaEntityList = DatabaseContentToMedia.getInstance().getUploadedMedia(currentContent);
104       if (upMediaEntityList!=null && upMediaEntityList.getCount()>=1) {
105         tinyIcon = null;
106         iconAlt = null;
107         mediaHandler = null;
108         mediaHandlerName = null;
109         for (int n=0; n < upMediaEntityList.size();n++) {
110           uploadedMedia = (EntityUploadedMedia)upMediaEntityList.elementAt(n);
111           mediaType = uploadedMedia.getMediaType();
112
113           //must of had a non-existant to_media_type entry..
114           //let's save our ass.
115           if (mediaType != null) {
116               /*
117                * grrr. why doesn't getId return an int! if It
118                * did I could just compare the value of getId and
119                * pick the biggest one. or is there
120                * another way around this that I am missing?
121                * can we make getIdasInt() or can we just have
122                * another getId() that returns an Int and the VM
123                * will handle it transparantly? -mh
124                */
125               try {
126                 mediaHandlerName = mediaType.getValue("classname");
127                 mediaHandlerClass = Class.forName("mir.media.MediaHandler"+mediaHandlerName);
128                 mediaHandler = (MirMedia)mediaHandlerClass.newInstance();
129               } catch (Exception e) {
130                 theLog.printError("ProducerStartpage:problem in reflection: "+mediaHandlerName);
131               }
132
133               //the best media type
134               if (mediaHandler.isVideo()) {
135                 tinyIcon = MirConfig.getProp("Producer.Icon.TinyVideo");
136                 iconAlt = "Video";
137                 break;
138               } else if (mediaHandler.isAudio()) {
139                 tinyIcon = MirConfig.getProp("Producer.Icon.TinyAudio");
140                 iconAlt = "Audio";
141               } else if (tinyIcon == null && !mediaHandler.isImage()) {
142                 tinyIcon = mediaHandler.getTinyIcon();
143                 iconAlt = mediaHandler.getIconAlt();
144               }
145           }
146         }
147         //it only has image(s)
148         if (tinyIcon == null) {
149           tinyIcon = MirConfig.getProp("Producer.Icon.TinyImage");
150           iconAlt = "Image";
151         }
152
153       // uploadedMedia Entity list is empty.
154       // we only have text
155       } else {
156         tinyIcon = MirConfig.getProp("Producer.Icon.TinyText");
157         iconAlt = "Text";
158       }
159
160       try{
161         //mediaList = HTMLTemplateProcessor.makeSimpleList(upMediaEntityList);
162         contentHash = (SimpleHash)newsWireList.get(i);
163         contentHash.put("tiny_icon", imageRoot+"/"+tinyIcon);
164         contentHash.put("icon_alt", iconAlt);
165       } catch (Exception e){}
166     }
167
168     // get the startarticle and the related images
169     whereClause="is_published=true AND to_article_type=4";
170     entityList = contentModule.getContent(whereClause,"date desc, webdb_create desc",0,1);
171     //if no startspecial exists
172     if (entityList==null || entityList.size()==0){
173       whereClause="is_published=true AND to_article_type=3";
174       entityList = contentModule.getContent(whereClause,"date desc, webdb_create desc",0,1);
175     }
176     SimpleList startItemList = HTMLTemplateProcessor.makeSimpleList(entityList);
177     for (int k=0; k < entityList.size();k++) {
178       currentContent = (EntityContent)entityList.elementAt(k);
179       //images to content
180       currentMediaList = DatabaseContentToMedia.getInstance().getUploadedMedia(currentContent);
181       if (currentMediaList!=null && currentMediaList.getCount()>=1) {
182         SimpleList mediaListAudio = new SimpleList();
183         SimpleList mediaListImages = new SimpleList();
184         SimpleList mediaListVideo = new SimpleList();
185         SimpleList mediaListOther = new SimpleList();
186         //SimpleHash allMediaSimpleHash = new SimpleHash();
187         for (int n=0; n < currentMediaList.size();n++) {
188           upMedia = currentMediaList.elementAt(n);
189           upMediaSimpleHash = HTMLTemplateProcessor.makeSimpleHash(upMedia);
190           mediaType = ((EntityUploadedMedia)upMedia).getMediaType();
191           //must be a non-existant to_media_type entry..
192           if (mediaType != null) {
193             try {
194               mediaHandlerName = mediaType.getValue("classname");
195               mediaStorageName = mediaType.getValue("tablename");
196               mediaStorageClass = Class.forName("mircoders.storage.Database"+mediaStorageName);
197               mediaHandlerClass = Class.forName("mir.media.MediaHandler"+mediaHandlerName);
198               mediaHandler = (MirMedia)mediaHandlerClass.newInstance();
199               if(!mediaStorageName.equals(new String("UploadedMedia"))) {
200                 Method m = mediaStorageClass.getMethod("getInstance", null);
201                 mediaStorage = (Database)m.invoke(null, null);
202                 //we most likely need further info
203                 upMedia = mediaStorage.selectById(upMedia.getId());
204               }
205             } catch (Exception e) {
206               theLog.printError("ProducerList: problem in reflection: "+mediaHandlerName);
207             } //end catch
208             upMediaSimpleHash.put("url", mediaHandler.getListView(upMedia, mediaType));
209             if (upMedia.getValue("is_published") == "1") {
210               if (mediaHandler.isImage()) {
211                 mediaListImages.add(upMediaSimpleHash);
212               } else if (mediaHandler.isAudio()) {
213                 mediaListAudio.add(upMediaSimpleHash);
214               } else if (mediaHandler.isVideo()) {
215                 mediaListVideo.add(upMediaSimpleHash);
216               } else {
217                 mediaListOther.add(upMediaSimpleHash);
218               }
219             } //end if is_published
220           } //end if media_type != null
221         } //end for
222         try{
223           //SimpleList contentList = (SimpleList)mergeData.get("contentlist");
224           contentHash = (SimpleHash)startItemList.get(k);
225           contentHash.put("to_media_audio", mediaListAudio);
226           contentHash.put("to_media_images", mediaListImages);
227           contentHash.put("to_media_video", mediaListVideo);
228           contentHash.put("to_media_other", mediaListOther);
229         } catch (Exception e){}
230       } //end if currentMediaList != null
231     } //enf for featurueList.size..
232
233
234
235     /*for (int i=0; i < entityList.size();i++) {
236       currentContent = (EntityContent)entityList.elementAt(i);
237       //fetching/setting the images
238       imageEntityList = DatabaseContentToMedia.getInstance().getImages(currentContent);
239       if (imageEntityList!=null && imageEntityList.getCount()>=1) {
240         try{
241           mediaList = HTMLTemplateProcessor.makeSimpleList(imageEntityList);
242           contentHash = (SimpleHash)startItemList.get(i);
243           contentHash.put("to_media", mediaList);
244         } catch (Exception e){}
245       }
246     }*/
247
248     // get the breaking news
249     // only the first 5
250     // todo: the number of breaking_news items have to be configurable
251     ModuleBreaking breakingModule = new ModuleBreaking(DatabaseBreaking.getInstance());
252     entityList = breakingModule.getByWhereClause(null,"webdb_create desc",0,5);
253     SimpleList breakingList = HTMLTemplateProcessor.makeSimpleList(entityList);
254
255     // get the articles
256     whereClause="is_published=true AND to_article_type=2";
257     orderBy="date desc, webdb_create desc";
258     entityList = contentModule.getContent(whereClause, orderBy, 0, itemsPerPage);
259     SimpleList featureList = HTMLTemplateProcessor.makeSimpleList(entityList);
260     for (int k=0; k < entityList.size();k++) {
261       currentContent = (EntityContent)entityList.elementAt(k);
262       //images to content
263       currentMediaList = DatabaseContentToMedia.getInstance().getUploadedMedia(currentContent);
264       if (currentMediaList!=null && currentMediaList.getCount()>=1) {
265         SimpleList mediaListAudio = new SimpleList();
266         SimpleList mediaListImages = new SimpleList();
267         SimpleList mediaListVideo = new SimpleList();
268         SimpleList mediaListOther = new SimpleList();
269         //SimpleHash allMediaSimpleHash = new SimpleHash();
270         for (int n=0; n < currentMediaList.size();n++) {
271           upMedia = currentMediaList.elementAt(n);
272           upMediaSimpleHash = HTMLTemplateProcessor.makeSimpleHash(upMedia);
273           mediaType = ((EntityUploadedMedia)upMedia).getMediaType();
274           //must be a non-existant to_media_type entry..
275           if (mediaType != null) {
276             try {
277               mediaHandlerName = mediaType.getValue("classname");
278               mediaStorageName = mediaType.getValue("tablename");
279               mediaStorageClass = Class.forName("mircoders.storage.Database"+mediaStorageName);
280               mediaHandlerClass = Class.forName("mir.media.MediaHandler"+mediaHandlerName);
281               mediaHandler = (MirMedia)mediaHandlerClass.newInstance();
282               if(!mediaStorageName.equals(new String("UploadedMedia"))) {
283                 Method m = mediaStorageClass.getMethod("getInstance", null);
284                 mediaStorage = (Database)m.invoke(null, null);
285                 //we most likely need further info
286                 upMedia = mediaStorage.selectById(upMedia.getId());
287               }
288             } catch (Exception e) {
289               theLog.printError("ProducerList: problem in reflection: "+mediaHandlerName);
290             } //end catch
291             upMediaSimpleHash.put("url", mediaHandler.getListView(upMedia, mediaType));
292             if (upMedia.getValue("is_published") == "1") {
293               if (mediaHandler.isImage()) {
294                 mediaListImages.add(upMediaSimpleHash);
295               } else if (mediaHandler.isAudio()) {
296                 mediaListAudio.add(upMediaSimpleHash);
297               } else if (mediaHandler.isVideo()) {
298                 mediaListVideo.add(upMediaSimpleHash);
299               } else {
300                 mediaListOther.add(upMediaSimpleHash);
301               }
302             } //end if is_published
303           } //end if media_type != null
304         } //end for
305         try{
306           //SimpleList contentList = (SimpleList)mergeData.get("contentlist");
307           contentHash = (SimpleHash)featureList.get(k);
308           contentHash.put("to_media_audio", mediaListAudio);
309           contentHash.put("to_media_images", mediaListImages);
310           contentHash.put("to_media_video", mediaListVideo);
311           contentHash.put("to_media_other", mediaListOther);
312         } catch (Exception e){}
313       } //end if currentMediaList != null
314     } //enf for featurueList.size..
315
316
317
318     /*for (int i=0; i < entityList.size();i++) {
319       currentContent = (EntityContent)entityList.elementAt(i);
320       //fetching/setting the images
321       imageEntityList = DatabaseContentToMedia.getInstance().getImages(currentContent);
322       if (imageEntityList!=null && imageEntityList.getCount()>=1) {
323         try{
324           mediaList = HTMLTemplateProcessor.makeSimpleList(imageEntityList);
325           contentHash = (SimpleHash)featureList.get(i);
326           contentHash.put("to_media", mediaList);
327         } catch (Exception e){}
328       }
329     }*/
330
331     // Zusaetzlich Informationen
332     startPageModel = new SimpleHash();
333     startPageModel.put("breakingnews", breakingList);
334     startPageModel.put("topics", topicList);
335     startPageModel.put("imclist", imcList);
336     startPageModel.put("parentlist", parentList);
337     startPageModel.put("newswire", newsWireList);
338     startPageModel.put("startspecial", startItemList);
339     startPageModel.put("features", featureList);
340
341     htmlFileName = producerDocRoot + "/index.shtml";
342
343     produce(startPageTemplate, htmlFileName, startPageModel, htmlout);
344
345     // Finish
346     sessionConnectTime = new java.util.Date().getTime() - startTime;
347     logHTML(htmlout, "Producer.Startseite finished: " + sessionConnectTime + " ms.");
348     if(sync==true){
349       Helper.rsync();
350       logHTML(htmlout, "Producer.Startseite: rsync done");
351     }
352   }
353 }
354