1 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 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 57 public void install() 58 { 59 try { 60 String 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 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 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 )ca.get("user"); 96 showAll = ((Boolean )ca.get("showAll")).booleanValue(); 97 start = ((Long )ca.get("startTime")).longValue(); 98 end = ((Long )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 )ca.get("resource"); 107 start = ((Long )ca.get("startTime")).longValue(); 108 end = ((Long )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 e) { 140 try { 141 oc.write("FAILED " + e); 142 } catch(Exception e2) {} 143 144 e.printStackTrace(); 145 } 146 147 } 148 149 151 public void storeEvent(Event event) 152 throws Exception 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 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 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 resource = (String )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 235 public void removeEvent(Event event) 236 throws Exception 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 265 public ArrayList getEventsForUser(String user, boolean showAll, long start, long end) 266 throws Exception 267 { 268 ArrayList events = new ArrayList(); 269 Connection c = layer.getConnection(); 270 271 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 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 user, int id) 321 throws Exception 322 { 323 ArrayList events = new ArrayList(); 324 Connection c = layer.getConnection(); 325 326 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 ("No such event: " + id); 340 341 Event event = (Event)events.get(0); 342 343 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 359 { 360 while(r.next()) 361 { 362 int id = r.getInt(1); 363 String title = r.getString(2); 364 String type = r.getString(3); 365 String 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 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 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 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 object, long start, long end) 450 throws Exception 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 title = r.getString(2); 466 String type = r.getString(3); 467 String 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 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 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 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 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 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 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 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 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 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 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 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 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 name, int red, int green, int blue, String icon) 642 throws Exception 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 |