TimeFinder.java
上传用户:dinglihq
上传日期:2013-02-04
资源大小:99958k
文件大小:4k
源码类别:

Java编程

开发平台:

Java

  1. package com.borland.training.meetings.sessions;
  2. import java.util.*;
  3. import javax.ejb.*;
  4. import javax.naming.*;
  5. import com.borland.training.meetings.entities.*;
  6. public class TimeFinder {
  7.   private static TimeFinder instance = null;
  8.   private EJBHomeFactory homeFactory;
  9.   private TimeFinder() throws NamingException {
  10.     homeFactory = EJBHomeFactory.getInstance();
  11.   }
  12.   public static TimeFinder getInstance() throws NamingException {
  13.     if(instance == null) {
  14.       instance = new TimeFinder();
  15.     }
  16.     return instance;
  17.   }
  18.   public TimePeriod firstAvailableTime(Collection attendees, java.util.Date earliestTime)
  19.     throws FinderException, NamingException {
  20.     Collection meetings = null;
  21.     int defaultInterval = 1;
  22.     long maxAttempts = 10;
  23.     int attempt = 0; // number of times the earliestTime was shifted to later
  24.     TimePeriod result = new TimePeriod();
  25.     MeetingHome meetingHome = (MeetingHome) homeFactory.lookupByLocalEJBReference("Meeting");
  26.     boolean conflictFound = true;
  27.     System.out.println("Entering the main loop");
  28.     earliestSearch:
  29.     while(attempt++ < maxAttempts && conflictFound) {
  30.       conflictFound = false;
  31.       System.out.println("Looking for meetings in progress at: " + earliestTime);
  32.       // find all meetings that will be in progress at earliestTime
  33.       meetings = meetingHome.findByTime(
  34.         new java.sql.Timestamp(earliestTime.getTime()),
  35.         new java.sql.Timestamp(earliestTime.getTime()));
  36.       // for each meeting
  37.       Iterator miter = meetings.iterator();
  38.       while(miter.hasNext()) {
  39.         Meeting meeting = (Meeting) miter.next();
  40.         // for each attendee within each meeting
  41.         System.out.println("Checking meeting: " + meeting.getId() +
  42.           ", " + meeting.getTopic() + ", " + meeting.getStartTime() +
  43.           ", " + meeting.getFinishTime());
  44.         Iterator aiter = meeting.getAttendees().iterator();
  45.         while(aiter.hasNext()) {
  46.           Attendee attendee = (Attendee) aiter.next();
  47.           System.out.println("tChecking attendee: " + attendee.getName());
  48.           // if meeting is scheduled for one of the specified attendees
  49.           if(attendees.contains(attendee)) {
  50.             System.out.println("tConflict discovered for attendee: " + attendee.getName());
  51.             // select a new earliest time (= when this meeting finishes)
  52.             earliestTime = meeting.getFinishTime();
  53.             conflictFound = true;
  54.             continue earliestSearch;
  55.           }
  56.         }
  57.       }
  58.     }
  59.     if(conflictFound) {
  60.       System.out.println("No available time period");
  61.       // No available time period
  62.       return null;
  63.     }
  64.     // earliestTime found
  65.     result.setStartTime(earliestTime);
  66.     Calendar cal = Calendar.getInstance();
  67.     cal.setTime(earliestTime);
  68.     cal.add(Calendar.HOUR, defaultInterval);
  69.     result.setFinishTime(cal.getTime());
  70.     System.out.println("Proposed time period: " + result.getStartTime() + ", " + result.getFinishTime());
  71.     // now search for timeInterval
  72.     System.out.println("Checking if endTime conflicts with any meetings");
  73.     meetings = meetingHome.findByTime(
  74.       new java.sql.Timestamp(result.getStartTime().getTime()),
  75.       new java.sql.Timestamp(result.getFinishTime().getTime()));
  76.     Iterator miter = meetings.iterator();
  77.     // find earliest starting time amongst pertinent meetings
  78.     while(miter.hasNext()) {
  79.       Meeting meeting = (Meeting)
  80.         javax.rmi.PortableRemoteObject.narrow(miter.next(), Meeting.class);
  81.       System.out.println("Checking meeting: " + meeting.getId() +
  82.         ", " + meeting.getTopic() + ", " + meeting.getStartTime() +
  83.         ", " + meeting.getFinishTime());
  84.       Iterator aiter = meeting.getAttendees().iterator();
  85.       while(aiter.hasNext()) {
  86.         Attendee attendee = (Attendee) aiter.next();
  87.         // if meeting is scheduled to include one of the attendees
  88.         System.out.println("tChecking attendee: " + attendee.getName());
  89.         if (attendees.contains(attendee)) {
  90.           System.out.println("tAttendee in the list");
  91.           java.util.Date startTime = meeting.getStartTime();
  92.           Calendar calStart = Calendar.getInstance();
  93.           calStart.setTime(startTime);
  94.           Calendar calEnd = Calendar.getInstance();
  95.           calEnd.setTime(result.getFinishTime());
  96.           if(calStart.before(calEnd)) {
  97.             result.setFinishTime(startTime);
  98.           }
  99.           System.out.println("tSetting endTime to: " + result.getFinishTime());
  100.         }
  101.       }
  102.     }
  103.     return result;
  104.   }
  105. }