OSDN Git Service

#25725着手前
[train-delayed/source.git] / workspace / TrainDelayed / src / com / td / service / Scheduler.java
1 package com.td.service;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Calendar;\r
5 import java.util.Collections;\r
6 import java.util.Comparator;\r
7 import java.util.Date;\r
8 import java.util.List;\r
9 \r
10 import com.td.db.Monitor;\r
11 import com.td.db.MonitorDao;\r
12 import com.td.utility.DateUtil;\r
13 import com.td.utility.Debug;\r
14 \r
15 public class Scheduler {\r
16         private static Calendar cal = Calendar.getInstance();\r
17         private List<Term>[] list = null;\r
18         private Comparator<Term> comp = new Comparator<Term>(){\r
19                 public int compare(Term t1, Term t2) {\r
20                         return t1.getFrom() - t2.getFrom();\r
21                 }\r
22         };\r
23         \r
24         public Scheduler(){\r
25 \r
26         }\r
27         \r
28         public long calcSchedule(long now){\r
29                 Debug.d(this, "start");\r
30                 makeSchedule();\r
31                 long t = nextSchedule(now);\r
32                 Debug.d(this, "end");\r
33                 return t;\r
34         }\r
35 \r
36         public long nextSchedule(long now){\r
37                 // TODO\r
38                 //long next = now + 60 * DateUtil.LEN * 1000;\r
39                 long next = now + 60 * 1 * 1000;\r
40                 \r
41                 cal.setTimeInMillis(next);\r
42                 Date date = cal.getTime();\r
43                 int h = date.getHours();\r
44                 int m = date.getMinutes();\r
45                 int hm = DateUtil.getHm(h, m);\r
46                 int w = date.getDay();\r
47                 \r
48                 for (int i = 0; i < DateUtil.WEEK + 1; i++){\r
49                         int n = (w + i) % DateUtil.WEEK;\r
50                         List<Term> l = list[n];\r
51                         int j = isContain(l, hm);\r
52                         if (j == 0){\r
53                                 return next;\r
54                         }\r
55                         if (j > 0){\r
56                                 Term t = l.get(j - 1);\r
57                                 // \8d¡\93ú(next)\82©\82ç\81Ai\93ú\8cã\82Ì\81Afrom\8e\9e\r
58                                 return DateUtil.getTime(date, i, t.getFrom());\r
59                         }\r
60                         if (i > 0){\r
61                                 // \91¼\82Ì\97j\93ú\82Ì\8fê\8d\87\r
62                                 if (l.size() > 0){\r
63                                         Term t = l.get(0);\r
64                                         // \8d¡\93ú(next)\82©\82ç\81Ai\93ú\8cã\82Ì\81Afrom\8e\9e\r
65                                         return DateUtil.getTime(date, i, t.getFrom());\r
66                                 }\r
67                                 \r
68                         }\r
69                 }\r
70                 return -1;\r
71         }\r
72 \r
73         public int isContain(List<Term> l, int hm) {\r
74                 int from;\r
75                 int to;\r
76                 \r
77                 for (int i = 0; i < l.size(); i++){\r
78                         Term t = l.get(i);\r
79                         from = t.getFrom();\r
80                         to = t.getTo();\r
81                         if (from <= hm && hm <= to){\r
82                                 return 0;\r
83                         }\r
84                         if (hm < from){\r
85                                 return i + 1;\r
86                         }\r
87                 } \r
88                 return -1;\r
89         }\r
90 \r
91         public void makeSchedule(){\r
92                 if (list != null){\r
93                         return;\r
94                 }\r
95                 Debug.d(this, "update");\r
96 \r
97                 MonitorDao dao = MonitorDao.getInstance();\r
98                 List<Monitor> mList = dao.search();\r
99                 makeSchedule(mList);\r
100         }\r
101         \r
102         public void makeSchedule(List<Monitor> mList){\r
103                 clearSchedule();\r
104                 \r
105                 for (Monitor monitor : mList){\r
106                         add(list, monitor);\r
107                 }       \r
108         }\r
109         \r
110         public void clearSchedule(){\r
111                 list = new List[DateUtil.WEEK];\r
112                 for (int i = 0; i < list.length; i++){\r
113                         list[i] = new ArrayList<Term>();\r
114                 }\r
115         }\r
116         \r
117         public void add(List<Term>[] ll, Monitor monitor){\r
118                 Term term = new Term(monitor.getFrom(), monitor.getTo());\r
119                 for (int i = 0; i < DateUtil.WEEK; i++){\r
120                         if (monitor.getWeek(i)){\r
121                                 add(ll[i], term);\r
122                         }\r
123                 }\r
124         }\r
125         \r
126         public void add(List<Term> l, Term term){\r
127                 int i = 0;\r
128                 while (i < l.size()){\r
129                         Term t = l.get(i);\r
130                         if (isContain(t, term)){\r
131                                 term = add(t, term);\r
132                                 l.remove(i);\r
133                                 continue;\r
134                         }\r
135                         i++;\r
136                 }\r
137                 l.add(term);\r
138                 Collections.sort(l, comp);\r
139         }\r
140         \r
141         public boolean isContain(Term t1, Term t2){\r
142                 int from1 = t1.getFrom();\r
143                 int to1 = t1.getTo();\r
144                 int from2 = t2.getFrom();\r
145                 int to2 = t2.getTo();\r
146 \r
147                 if (from1 <= from2 && from2 <= to1){\r
148                         return true;\r
149                 }\r
150                 if (from1 <= to2 && to2 <= to1){\r
151                         return true;\r
152                 }\r
153                 if (from2 <= from1 && from1 <= to2){\r
154                         return true;\r
155                 }\r
156                 if (from2 <= to1 && to1 <= to2){\r
157                         return true;\r
158                 }\r
159                 return false;\r
160         }\r
161 \r
162         public Term add(Term t1, Term t2){\r
163                 int from1 = t1.getFrom();\r
164                 int to1 = t1.getTo();\r
165                 int from2 = t2.getFrom();\r
166                 int to2 = t2.getTo();\r
167                 \r
168                 int from = (from1 < from2)? from1 : from2;\r
169                 int to = (to1 > to2)? to1 : to2;\r
170                 return new Term(from, to);\r
171         }\r
172 \r
173         public List<Term>[] getList() {\r
174                 return list;\r
175         }\r
176 \r
177 }\r