KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > lucane > applications > calendar > CalendarService


1 /*
2  * Lucane - a collaborative platform
3  * Copyright (C) 2003 Vincent Fiack <vfiack@mail15.com>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  */

19
20 package org.lucane.applications.calendar;
21
22 import java.sql.*;
23 import java.util.*;
24
25 import org.lucane.common.*;
26 import org.lucane.common.net.ObjectConnection;
27 import org.lucane.server.*;
28 import org.lucane.server.database.DatabaseAbstractionLayer;
29 import org.lucane.server.database.util.Sequence;
30 import org.lucane.server.store.Store;
31
32
33 public class CalendarService
34 extends Service
35 {
36     private Store store;
37     private DatabaseAbstractionLayer layer;
38     private Sequence sequence;
39
40     /**
41      * Initialize the service.
42      * Called every time the server is started.
43      *
44      * @param parent the Server
45      */

46     public void init(Server parent)
47     {
48         this.store = parent.getStore();
49         this.layer = parent.getDBLayer();
50         this.sequence = new Sequence("CalEvents", "id");
51     }
52
53     /**
54      * Install the service.
55      * Only called the first time a service is initialized.
56      */

57     public void install()
58     {
59         try {
60             String JavaDoc dbDescription = getDirectory() + "db-calendar.xml";
61             layer.getTableCreator().createFromXml(dbDescription);
62             this.addType("type.default", 170, 140, 220, "default.png");
63             this.addType("type.meeting", 220, 140, 170, "meeting.png");
64             this.addType("type.presentation", 100, 40, 50, "presentation.png");
65             this.addType("type.training", 40, 100, 80, "training.png");
66             this.addType("type.vacation", 140, 220, 220, "vacation.png");
67         } catch (Exception JavaDoc e) {
68             Logging.getLogger().severe("Unable to install CalendarService !");
69             e.printStackTrace();
70         }
71     }
72     
73     public void process(ObjectConnection oc, Message message)
74     {
75         CalendarAction ca = (CalendarAction)message.getData();
76         String JavaDoc user, resource;
77         long start, end;
78         boolean showAll;
79         ArrayList list;
80
81         try {
82             switch(ca.action)
83             {
84             case CalendarAction.STORE_EVENT:
85                 storeEvent((Event)ca.get("event"));
86                 oc.write("OK");
87                 break;
88
89             case CalendarAction.REMOVE_EVENT:
90                 removeEvent((Event)ca.get("event"));
91                 oc.write("OK");
92                 break;
93
94             case CalendarAction.GET_EVENTS_FOR_USER:
95                 user = (String JavaDoc)ca.get("user");
96                 showAll = ((Boolean JavaDoc)ca.get("showAll")).booleanValue();
97                 start = ((Long JavaDoc)ca.get("startTime")).longValue();
98                 end = ((Long JavaDoc)ca.get("endTime")).longValue();
99
100                 list = getEventsForUser(user, showAll, start, end);
101                 oc.write("OK");
102                 oc.write(list);
103                 break;
104
105             case CalendarAction.GET_EVENTS_FOR_RESOURCE:
106                 resource = (String JavaDoc)ca.get("resource");
107                 start = ((Long JavaDoc)ca.get("startTime")).longValue();
108                 end = ((Long JavaDoc)ca.get("endTime")).longValue();
109
110                 list = getEventsForResource(resource, start, end);
111                 oc.write("OK");
112                 oc.write(list);
113                 break;
114
115             case CalendarAction.GET_RESOURCES:
116                 list = getResources();
117                 oc.write("OK");
118                 oc.write(list);
119                 break;
120                 
121             case CalendarAction.GET_USERS:
122                 list = getUsers();
123                 oc.write("OK");
124                 oc.write(list);
125                 break;
126                 
127             case CalendarAction.GET_GROUPS:
128                 list = getGroups();
129                 oc.write("OK");
130                 oc.write(list);
131                 break;
132                 
133             case CalendarAction.GET_EVENT_TYPES:
134                 list = getEventTypes();
135                 oc.write("OK");
136                 oc.write(list);
137                 break;
138             }
139         } catch(Exception JavaDoc e) {
140             try {
141                 oc.write("FAILED " + e);
142             } catch(Exception JavaDoc e2) {}
143             
144             e.printStackTrace();
145         }
146         
147     }
148
149     //-- set
150

151     public void storeEvent(Event event)
152     throws Exception JavaDoc
153     {
154         Logging.getLogger().fine("Storing event : " + event.getTitle());
155         
156         boolean newEvent = event.getId() < 0;
157         if(newEvent)
158             event.setId(sequence.getNextId());
159         else
160             removeEvent(event);
161
162         Connection c = layer.getConnection();
163         PreparedStatement insert = c.prepareStatement(
164             "INSERT INTO CalEvents VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
165         
166         insert.setInt(1, event.getId());
167         insert.setString(2, event.getTitle());
168         insert.setString(3, event.getType());
169         insert.setString(4, event.getOrganizer());
170         insert.setInt(5, event.isPublic() ? 1 : 0);
171         insert.setInt(6, event.isEditable() ? 1 : 0);
172         insert.setLong(7, event.getStartDate().getTime());
173         insert.setLong(8, event.getEndDate().getTime());
174         insert.setInt(9, event.getRecurrence());
175         insert.setString(10, event.getDescription());
176
177         insert.execute();
178         insert.close();
179         
180         storeAttendees(event);
181         storeResources(event);
182
183         if(newEvent)
184             new MailThread(event, getDirectory() + "event-new.mail").start();
185         else
186             new MailThread(event, getDirectory() + "event-update.mail").start();
187         
188         c.close();
189     }
190
191     private void storeAttendees(Event event)
192     throws Exception JavaDoc
193     {
194         Connection c = layer.getConnection();
195         PreparedStatement insert = c.prepareStatement(
196             "INSERT INTO CalAttendees VALUES(?, ?, ?, ?)");
197
198         Iterator attendees = event.getAttendees();
199         while(attendees.hasNext())
200         {
201             Attendee attendee = (Attendee)attendees.next();
202             insert.setInt(1, event.getId());
203             insert.setString(2, attendee.getUser());
204             insert.setInt(3, attendee.isMandatory() ? 1 : 0);
205             insert.setInt(4, attendee.getStatus());
206             insert.execute();
207         }
208
209         insert.close();
210         c.close();
211     }
212     
213     private void storeResources(Event event)
214     throws Exception JavaDoc
215     {
216         Connection c = layer.getConnection();
217         PreparedStatement insert = c.prepareStatement(
218             "INSERT INTO CalResources VALUES(?, ?)");
219
220         Iterator resources = event.getResources();
221         while(resources.hasNext())
222         {
223             String JavaDoc resource = (String JavaDoc)resources.next();
224             insert.setInt(1, event.getId());
225             insert.setString(2, resource);
226             insert.execute();
227         }
228
229         insert.close();
230         c.close();
231     }
232
233     //-- remove
234

235     public void removeEvent(Event event)
236     throws Exception JavaDoc
237     {
238         if(event.getId() < 0)
239             return;
240
241         Logging.getLogger().fine("Removing event : " + event.getTitle());
242         Connection c = layer.getConnection();
243         PreparedStatement delete;
244         
245         delete = c.prepareStatement("DELETE FROM CalEvents WHERE id=?");
246         delete.setInt(1, event.getId());
247         delete.execute();
248         delete.close();
249                     
250         delete = c.prepareStatement("DELETE FROM CalAttendees WHERE eventId=?");
251         delete.setInt(1, event.getId());
252         delete.execute();
253         delete.close();
254
255         delete = c.prepareStatement("DELETE FROM CalResources WHERE eventId=?");
256         delete.setInt(1, event.getId());
257         delete.execute();
258         delete.close();
259
260         c.close();
261     }
262     
263     //-- get
264

265     public ArrayList getEventsForUser(String JavaDoc user, boolean showAll, long start, long end)
266     throws Exception JavaDoc
267     {
268         ArrayList events = new ArrayList();
269         Connection c = layer.getConnection();
270         
271         //events where the user is organizer
272
PreparedStatement select = c.prepareStatement(
273             "SELECT * FROM CalEvents WHERE " +
274             "organizer = ? AND (" +
275             "(startTime >= ? AND startTime <= ?) " +
276             "OR (endTime >= ? AND endTime <= ?) " +
277             "OR (startTime <= ? AND endTime >= ?) " +
278             "OR recurrence > 0) " +
279             "ORDER BY startTime");
280         
281         select.setString(1, user);
282         select.setLong(2, start);
283         select.setLong(3, end);
284         select.setLong(4, start);
285         select.setLong(5, end);
286         select.setLong(6, start);
287         select.setLong(7, start);
288         ResultSet rs = select.executeQuery();
289         addEventsFromQuery(rs, events, showAll);
290         rs.close();
291         select.close();
292     
293         //events where the user is an attendee
294
select = c.prepareStatement(
295             "SELECT * FROM CalEvents e, CalAttendees a WHERE " +
296             "e.id = a.eventId AND " +
297             "a.userName = ? AND (" +
298             "(startTime >= ? AND startTime <= ?) " +
299             "OR (endTime >= ? AND endTime <= ?) " +
300             "OR (startTime <= ? AND endTime >= ?) " +
301             "OR recurrence > 0)");
302         
303         select.setString(1, user);
304         select.setLong(2, start);
305         select.setLong(3, end);
306         select.setLong(4, start);
307         select.setLong(5, end);
308         select.setLong(6, start);
309         select.setLong(7, start);
310         rs = select.executeQuery();
311         addEventsFromQuery(rs, events, showAll);
312         rs.close();
313         select.close();
314         
315         c.close();
316         
317         return filterEvents(events, start, end);
318     }
319
320         public Event getEventById(String JavaDoc user, int id)
321     throws Exception JavaDoc
322     {
323         ArrayList events = new ArrayList();
324         Connection c = layer.getConnection();
325         
326         //events where the user is organizer
327
PreparedStatement select = c.prepareStatement(
328             "SELECT * FROM CalEvents WHERE " +
329             "id=?");
330         
331         select.setInt(1, id);
332         ResultSet rs = select.executeQuery();
333         addEventsFromQuery(rs, events, false);
334         rs.close();
335         select.close();
336         c.close();
337         
338         if(events.size() != 1)
339                     throw new Exception JavaDoc("No such event: " + id);
340                 
341                 Event event = (Event)events.get(0);
342                 
343                 //private events
344
if(!event.isPublic() && !event.getOrganizer().equals(user))
345                 {
346                     event = new Event(id, "private", "private", "", false, false,
347             event.getStartDate().getTime(), event.getEndDate().getTime(),
348                         event.getRecurrence(), "");
349                     event.setIconFile("private.png");
350                     event.setColor(150, 150, 150);
351                 }
352                 
353         return event;
354     }
355
356         
357     private void addEventsFromQuery(ResultSet r, ArrayList events, boolean showAll)
358     throws Exception JavaDoc
359     {
360         while(r.next())
361         {
362             int id = r.getInt(1);
363             String JavaDoc title = r.getString(2);
364             String JavaDoc type = r.getString(3);
365             String JavaDoc organizer = r.getString(4);
366             boolean isPublic = (r.getInt(5) == 1);
367             boolean isEditable = (r.getInt(6) == 1);
368             long mystart = r.getLong(7);
369             long myend = r.getLong(8);
370             int recurrence = r.getInt(9);
371             String JavaDoc description = r.getString(10);
372
373             if(showAll || isPublic)
374             {
375                 Event event = new Event(id, type, title, organizer, isPublic, isEditable,
376                         mystart, myend, recurrence, description);
377                 loadTypeInfos(event);
378                 loadAttendees(event);
379                 loadResources(event);
380                 events.add(event);
381             }
382             else
383             {
384                 Event event = new Event(id, "private", "private", "", isPublic, isEditable,
385                         mystart, myend, recurrence, "");
386                 event.setIconFile("private.png");
387                 event.setColor(150, 150, 150);
388                 events.add(event);
389             }
390         }
391     }
392     
393     private ArrayList filterEvents(ArrayList events, long start, long end)
394     {
395         ArrayList newEvents = new ArrayList();
396         
397         Iterator i = events.iterator();
398         while(i.hasNext())
399         {
400             Event event = (Event)i.next();
401             if(event.getRecurrence() == Event.RECUR_NONE)
402             {
403                 newEvents.add(event);
404             }
405             else
406             {
407                 //get the fist event after the start time
408
Calendar time = Calendar.getInstance();
409                 time.setTime(event.getStartDate());
410                 while(time.getTime().getTime() < start)
411                 {
412                     if(event.getRecurrence() == Event.RECUR_DAY)
413                         time.add(Calendar.DAY_OF_YEAR, 1);
414                     else if(event.getRecurrence() == Event.RECUR_WEEK)
415                         time.add(Calendar.WEEK_OF_YEAR, 1);
416                     else if(event.getRecurrence() == Event.RECUR_MONTH)
417                         time.add(Calendar.MONTH, 1);
418                     else if(event.getRecurrence() == Event.RECUR_YEAR)
419                         time.add(Calendar.YEAR, 1);
420                 }
421                 
422                 //create all events until the end time
423
long duration = event.getEndDate().getTime() - event.getStartDate().getTime();
424                 while(time.getTime().getTime() < end)
425                 {
426                     long mytime = time.getTime().getTime();
427                     Event e = new Event(event.getId(), event.getType(), event.getTitle(),
428                             event.getOrganizer(), event.isPublic(), event.isEditable(),
429                             mytime, mytime+duration, event.getRecurrence(), event.getDescription());
430                     e.setIconFile(event.getIconFile());
431                     e.setColor(event.getColorRed(), event.getColorGreen(), event.getColorBlue());
432                     newEvents.add(e);
433                     
434                     if(event.getRecurrence() == Event.RECUR_DAY)
435                         time.add(Calendar.DAY_OF_YEAR, 1);
436                     else if(event.getRecurrence() == Event.RECUR_WEEK)
437                         time.add(Calendar.WEEK_OF_YEAR, 1);
438                     else if(event.getRecurrence() == Event.RECUR_MONTH)
439                         time.add(Calendar.MONTH, 1);
440                     else if(event.getRecurrence() == Event.RECUR_YEAR)
441                         time.add(Calendar.YEAR, 1);
442                 }
443             }
444         }
445         
446         return newEvents;
447     }
448     
449     public ArrayList getEventsForResource(String JavaDoc object, long start, long end)
450     throws Exception JavaDoc
451     {
452         ArrayList events = new ArrayList();
453         
454         Connection c = layer.getConnection();
455         PreparedStatement select = c.prepareStatement(
456             "SELECT e.* FROM CalEvents e, CalResources r WHERE " +
457             "e.id = r.eventId AND r.object = ?");
458                     
459         select.setString(1, object);
460
461         ResultSet r = select.executeQuery();
462         while(r.next())
463         {
464             int id = r.getInt(1);
465             String JavaDoc title = r.getString(2);
466             String JavaDoc type = r.getString(3);
467             String JavaDoc organizer = r.getString(4);
468             boolean isPublic = (r.getInt(5) == 1);
469             boolean isEditable = (r.getInt(6) == 1);
470             long mystart = r.getLong(7);
471             long myend = r.getLong(8);
472             int recurrence = r.getInt(9);
473             String JavaDoc description = r.getString(10);
474
475             if(isPublic)
476             {
477                 Event event = new Event(id, type, title, organizer, isPublic, isEditable,
478                         mystart, myend, recurrence, description);
479                 loadTypeInfos(event);
480                 loadAttendees(event);
481                 loadResources(event);
482                 events.add(event);
483             }
484             else
485             {
486                 Event event = new Event(id, "private", "private", "", isPublic, isEditable,
487                         mystart, myend, recurrence, "");
488                 event.setColor(150, 150, 150);
489                 event.setIconFile("private.png");
490                 events.add(event);
491             }
492         }
493         
494         select.close();
495         c.close();
496         
497         return events;
498     }
499
500     public ArrayList getResources()
501     throws Exception JavaDoc
502     {
503         ArrayList resources = new ArrayList();
504         
505         Connection c = layer.getConnection();
506         PreparedStatement select = c.prepareStatement(
507             "SELECT * FROM CalObjects");
508
509         ResultSet r = select.executeQuery();
510         while(r.next())
511         {
512             String JavaDoc object = r.getString(1);
513             resources.add(object);
514         }
515         
516         select.close();
517         c.close();
518         
519         return resources;
520     }
521
522     public ArrayList getUsers()
523     throws Exception JavaDoc
524     {
525         ArrayList users = new ArrayList();
526         Iterator i = store.getUserStore().getAllUsers();
527         while(i.hasNext())
528             users.add(i.next());
529         
530         return users;
531     }
532     
533     private ArrayList getGroups()
534     throws Exception JavaDoc
535     {
536         ArrayList groups = new ArrayList();
537         Iterator i = store.getGroupStore().getAllGroups();
538         while(i.hasNext())
539             groups.add(i.next());
540         
541         return groups;
542     }
543
544     private void loadTypeInfos(Event event)
545     throws Exception JavaDoc
546     {
547         Connection c = layer.getConnection();
548         PreparedStatement select = c.prepareStatement(
549             "SELECT * FROM CalEventTypes WHERE type = ?");
550                     
551         select.setString(1, event.getType());
552     
553         ResultSet r = select.executeQuery();
554         if(r.next())
555         {
556             int red = r.getInt(2);
557             int green = r.getInt(3);
558             int blue = r.getInt(4);
559             String JavaDoc icon = r.getString(5);
560             
561             event.setColor(red, green, blue);
562             event.setIconFile(icon);
563         }
564         
565         r.close();
566         select.close();
567         c.close();
568     }
569     
570     public ArrayList getEventTypes()
571     throws Exception JavaDoc
572     {
573         ArrayList types = new ArrayList();
574         Connection c = layer.getConnection();
575         PreparedStatement select = c.prepareStatement(
576             "SELECT * FROM CalEventTypes");
577
578         ResultSet r = select.executeQuery();
579         while(r.next())
580             types.add(r.getString(1));
581         
582         r.close();
583         select.close();
584         c.close();
585         
586         return types;
587     }
588     
589     private void loadAttendees(Event event)
590     throws Exception JavaDoc
591     {
592         ArrayList attendees = new ArrayList();
593         Connection c = layer.getConnection();
594         PreparedStatement select = c.prepareStatement(
595             "SELECT * FROM CalAttendees WHERE eventId = ?");
596                     
597         select.setInt(1, event.getId());
598
599         ResultSet r = select.executeQuery();
600         while(r.next())
601         {
602             String JavaDoc user = r.getString(2);
603             boolean mandatory = (r.getInt(3) == 1);
604             int status = r.getInt(4);
605             
606             Attendee attendee = new Attendee(user, mandatory, status);
607             attendees.add(attendee);
608         }
609         
610         event.setAttendees(attendees);
611         
612         r.close();
613         select.close();
614         c.close();
615     }
616     
617     private void loadResources(Event event)
618     throws Exception JavaDoc
619     {
620         ArrayList resources = new ArrayList();
621         Connection c = layer.getConnection();
622         PreparedStatement select = c.prepareStatement(
623             "SELECT * FROM CalResources WHERE eventId = ?");
624
625         select.setInt(1, event.getId());
626
627         ResultSet r = select.executeQuery();
628         while(r.next())
629         {
630             String JavaDoc object = r.getString(2);
631             resources.add(object);
632         }
633         
634         event.setResources(resources);
635         
636         r.close();
637         select.close();
638         c.close();
639     }
640     
641     private void addType(String JavaDoc name, int red, int green, int blue, String JavaDoc icon)
642     throws Exception JavaDoc
643     {
644         Connection c = layer.getConnection();
645         PreparedStatement insert = c.prepareStatement(
646             "INSERT INTO CalEventTypes VALUES(?, ?, ?, ?, ?)");
647             
648         insert.setString(1, name);
649         insert.setInt(2, red);
650         insert.setInt(3, green);
651         insert.setInt(4, blue);
652         insert.setString(5, icon);
653         
654         insert.execute();
655         insert.close();
656         c.close();
657     }
658 }
659
Popular Tags