OSDN Git Service

test_nextSchedule()テストケース追加。テスト未実施
[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 \r
14 public class Scheduler {\r
15         private int N = 7;//TODO\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 void calcSchedule(){\r
29                 \r
30         }\r
31 \r
32         public long nextSchedule(long now){\r
33                 long next = now + 60 * DateUtil.LEN * 1000;\r
34                 \r
35                 cal.setTimeInMillis(next);\r
36                 Date date = cal.getTime();\r
37                 int h = date.getHours();\r
38                 int m = date.getMinutes();\r
39                 int hm = DateUtil.getHm(h, m);\r
40                 int w = date.getDay();\r
41                 \r
42                 for (int i = 0; i < N; i++){\r
43                         int n = (w + i) % N;\r
44                         List<Term> l = list[n];\r
45                         int j = isContain(l, hm);\r
46                         if (j == 0){\r
47                                 return next;\r
48                         }\r
49                         if (j > 0){\r
50                                 Term t = l.get(j - 1);\r
51                                 // \8d¡\93ú(next)\82©\82ç\81Ai\93ú\8cã\82Ì\81Afrom\8e\9e\r
52                                 return DateUtil.getTime(date, i, t.getFrom());\r
53                         }\r
54                         if (i > 0){\r
55                                 // \91¼\82Ì\97j\93ú\82Ì\8fê\8d\87\r
56                                 if (l.size() > 0){\r
57                                         Term t = l.get(0);\r
58                                         // \8d¡\93ú(next)\82©\82ç\81Ai\93ú\8cã\82Ì\81Afrom\8e\9e\r
59                                         return DateUtil.getTime(date, i, t.getFrom());\r
60                                 }\r
61                                 \r
62                         }\r
63                 }\r
64                 return -1;\r
65         }\r
66 \r
67         public int isContain(List<Term> l, int hm) {\r
68                 int from;\r
69                 int to;\r
70                 \r
71                 for (int i = 0; i < l.size(); i++){\r
72                         Term t = l.get(i);\r
73                         from = t.getFrom();\r
74                         to = t.getTo();\r
75                         if (from <= hm && hm <= to){\r
76                                 return 0;\r
77                         }\r
78                         if (hm < from){\r
79                                 return i + 1;\r
80                         }\r
81                 } \r
82                 return -1;\r
83         }\r
84 \r
85         public void makeSchedule(){\r
86                 if (list != null){\r
87                         return;\r
88                 }\r
89 \r
90                 MonitorDao dao = MonitorDao.getInstance();\r
91                 List<Monitor> mList = dao.search();\r
92                 makeSchedule(mList);\r
93         }\r
94         \r
95         public void makeSchedule(List<Monitor> mList){\r
96                 clearSchedule();\r
97                 \r
98                 for (Monitor monitor : mList){\r
99                         add(list, monitor);\r
100                 }       \r
101         }\r
102         \r
103         public void clearSchedule(){\r
104                 list = new List[N];\r
105                 for (int i = 0; i < list.length; i++){\r
106                         list[i] = new ArrayList<Term>();\r
107                 }\r
108         }\r
109         \r
110         public void add(List<Term>[] ll, Monitor monitor){\r
111                 Term term = new Term(monitor.getFrom(), monitor.getTo());\r
112                 for (int i = 0; i < N; i++){\r
113                         if (monitor.getWeek(i)){\r
114                                 add(ll[i], term);\r
115                         }\r
116                 }\r
117         }\r
118         \r
119         public void add(List<Term> l, Term term){\r
120                 int i = 0;\r
121                 while (i < l.size()){\r
122                         Term t = l.get(i);\r
123                         if (isContain(t, term)){\r
124                                 term = add(t, term);\r
125                                 l.remove(i);\r
126                                 continue;\r
127                         }\r
128                         i++;\r
129                 }\r
130                 l.add(term);\r
131                 Collections.sort(l, comp);\r
132         }\r
133         \r
134         public boolean isContain(Term t1, Term t2){\r
135                 int from1 = t1.getFrom();\r
136                 int to1 = t1.getTo();\r
137                 int from2 = t2.getFrom();\r
138                 int to2 = t2.getTo();\r
139 \r
140                 if (from1 <= from2 && from2 <= to1){\r
141                         return true;\r
142                 }\r
143                 if (from1 <= to2 && to2 <= to1){\r
144                         return true;\r
145                 }\r
146                 if (from2 <= from1 && from1 <= to2){\r
147                         return true;\r
148                 }\r
149                 if (from2 <= to1 && to1 <= to2){\r
150                         return true;\r
151                 }\r
152                 return false;\r
153         }\r
154 \r
155         public Term add(Term t1, Term t2){\r
156                 int from1 = t1.getFrom();\r
157                 int to1 = t1.getTo();\r
158                 int from2 = t2.getFrom();\r
159                 int to2 = t2.getTo();\r
160                 \r
161                 int from = (from1 < from2)? from1 : from2;\r
162                 int to = (to1 > to2)? to1 : to2;\r
163                 return new Term(from, to);\r
164         }\r
165 \r
166         public List<Term>[] getList() {\r
167                 return list;\r
168         }\r
169 }\r