SECI  1
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties Events
RBDataHolder.cs
Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Data;
6 using System.IO;
7 
8 namespace SeciControls
9 {
11  {
12  int indexTeamInst = -1;
13  int indexTeamRole = -1;
14  int indexTeamExptr = -1;
16  int indexTeamRBPart = -1;
17 
18  int indexDataRBPart = -1;
19  int indexDateStart = -1;
21 
22  private String _instName = "";
23  private DataSet _teamData;
24  private DataSet _dateData;
25  private List<Tuple<DateTime, DateTime>> _dates;
26 
27  public String InstName { get { return _instName; } }
28  public List<Tuple<DateTime, DateTime>> Dates { get { return _dates; } }
29 
30  public RBDataHolder()
31  {
32  getInstName();
33  getData();
34  }
35 
36  private void getInstName()
37  {
38  //Get the instrument name
39  String inst = Environment.MachineName.ToUpper();
40 
41  if (inst.StartsWith("NDX"))
42  {
43  if (inst == "NDXEVS")
44  {
45  inst = "VESUVIO";
46  }
47  else if (inst == "NDXENGINX")
48  {
49  inst = "ENGIN_X";
50  }
51  else
52  {
53  inst = inst.Substring(3);
54  }
55 
56  _instName = inst;
57  }
58  else
59  {
60  //For testing purposes
61  _instName = "LET";
62  }
63  }
64 
65  private void getData()
66  {
67  FileInfo fiTeam = new FileInfo(Seci.Definitions.Status.RBDataFilepath + "\\" + _instName + "Team.xml");
68  FileInfo fiDates = new FileInfo(Seci.Definitions.Status.RBDataFilepath + "\\" + _instName + "Dates.xml");
69 
70  try
71  {
72  loadData(fiTeam, fiDates);
73  }
74  catch (Exception e)
75  {
76  throw e;
77  }
78  }
79 
80  private void getColumns(DataSet team, DataSet data)
81  {
82  //From team
83  for (int i = 0; i < team.Tables[1].Columns.Count; ++i)
84  {
85  if (team.Tables[1].Columns[i].ColumnName.ToLower() == "ows_instrument")
86  {
87  indexTeamInst = i;
88  }
89  else if (team.Tables[1].Columns[i].ColumnName.ToLower() == "ows_role")
90  {
91  indexTeamRole = i;
92  }
93  else if (team.Tables[1].Columns[i].ColumnName.ToLower() == "ows_organisation")
94  {
96  }
97  else if (team.Tables[1].Columns[i].ColumnName.ToLower() == "ows_title")
98  {
99  indexTeamExptr = i;
100  }
101  else if (team.Tables[1].Columns[i].ColumnName.ToLower() == "ows_rbpart")
102  {
103  indexTeamRBPart = i;
104  }
105  }
106 
107  //From data
108  for (int i = 0; i < data.Tables[1].Columns.Count; ++i)
109  {
110  if (data.Tables[1].Columns[i].ColumnName.ToLower() == "ows_scheduled_date")
111  {
112  indexDateStart = i;
113  }
114  else if (data.Tables[1].Columns[i].ColumnName.ToLower() == "ows_rbpart")
115  {
116  indexDataRBPart = i;
117  }
118  else if (data.Tables[1].Columns[i].ColumnName.ToLower() == "ows_time_allocated")
119  {
120  indexDateDuration = i;
121  }
122  }
123  }
124 
125  private void loadData(FileInfo team, FileInfo dates)
126  {
127  if (_teamData == null) _teamData = new DataSet();
128  if (_dateData == null) _dateData = new DataSet();
129 
130  if (team.Exists && dates.Exists)
131  {
132  _teamData = RBDataHolder.loadData(team.FullName);
133  _dateData = RBDataHolder.loadData(dates.FullName);
134 
135  if (_teamData.Tables.Count == 0 || _dateData.Tables.Count == 0)
136  {
137  throw new DataException();
138  }
139 
140  //Get columns
141  getColumns(_teamData, _dateData);
142  }
143  }
144 
145  private static DataSet loadData(String filepath)
146  {
147  DataSet data = new DataSet();
148  data.ReadXml(filepath);
149  return data;
150  }
151 
152  public List<string> GetExperimenters()
153  {
154  List<string> experimenters = new List<string>();
155 
156  for (int i = 0; i < _teamData.Tables[1].Rows.Count; ++i)
157  {
158  //check it has an RB part number ie. 123456_1
159  if (!String.IsNullOrEmpty(_teamData.Tables[1].Rows[i].ItemArray[indexTeamRBPart].ToString()))
160  {
161  String inst = _teamData.Tables[1].Rows[i].ItemArray[indexTeamInst].ToString();
162  String exptr = _teamData.Tables[1].Rows[i].ItemArray[indexTeamExptr].ToString();
163  String institute = _teamData.Tables[1].Rows[i].ItemArray[indexTeamInstitute].ToString();
164 
165  if (!experimenters.Contains(exptr + " (" + institute + ")") && inst.ToLower() == _instName.ToLower())
166  {
167  experimenters.Add(exptr + " (" + institute + ")");
168  }
169  }
170  }
171 
172  experimenters.Sort();
173  return experimenters;
174  }
175 
176  public List<string> GetDates(String Exptr)
177  {
178  _dates = new List<Tuple<DateTime, DateTime>>();
179  List<string> dateStrings = new List<string>();
180 
181  for (int i = 0; i < _teamData.Tables[1].Rows.Count; ++i)
182  {
183  String inst = _teamData.Tables[1].Rows[i].ItemArray[indexTeamInst].ToString();
184  String exptr = _teamData.Tables[1].Rows[i].ItemArray[indexTeamExptr].ToString();
185  String rb = _teamData.Tables[1].Rows[i].ItemArray[indexTeamRBPart].ToString();
186 
187  if (inst.ToLower() == _instName.ToLower() && Exptr.StartsWith(exptr) && !String.IsNullOrEmpty(rb))
188  {
189  Tuple<DateTime, DateTime> allocated = getAllocatedDates(rb);
190  _dates.Add(allocated);
191 
192  if (allocated != null)
193  {
194  dateStrings.Add(allocated.Item1.ToShortDateString() + " - " + allocated.Item2.ToShortDateString() + " [RB = " + rb.Substring(0, rb.IndexOf('_')) + "]");
195  }
196  else
197  {
198  dateStrings.Add("Unknown [RB = " + rb.Substring(0, rb.IndexOf('_')) + "]");
199  }
200  }
201  }
202 
203  return dateStrings;
204  }
205 
206  private Tuple<DateTime, DateTime> getAllocatedDates(String rbpart)
207  {
208  for (int i = 0; i < _dateData.Tables[1].Rows.Count; ++i)
209  {
210  if (_dateData.Tables[1].Rows[i].ItemArray[indexDataRBPart].ToString() == rbpart)
211  {
212  try
213  {
214  DateTime start = Convert.ToDateTime(_dateData.Tables[1].Rows[i].ItemArray[indexDateStart].ToString());
215  String duration = _dateData.Tables[1].Rows[i].ItemArray[indexDateDuration].ToString();
216  DateTime end = start.AddDays(Double.Parse(duration));
217  return new Tuple<DateTime, DateTime>(start, end);
218  }
219  catch
220  {
221  return null;
222  }
223  }
224  }
225  return null;
226  }
227 
228  private List<Tuple<DateTime, DateTime>> getPossibleDates(String rb)
229  {
230  List<Tuple<DateTime, DateTime>> dates = new List<Tuple<DateTime, DateTime>>();
231 
232  for (int i = 0; i < _dateData.Tables[1].Rows.Count; ++i)
233  {
234  if (_dateData.Tables[1].Rows[i].ItemArray[indexDataRBPart].ToString().StartsWith(rb))
235  {
236  try
237  {
238  DateTime start = Convert.ToDateTime(_dateData.Tables[1].Rows[i].ItemArray[indexDateStart].ToString());
239  String duration = _dateData.Tables[1].Rows[i].ItemArray[indexDateDuration].ToString();
240  DateTime end = start.AddDays(Double.Parse(duration));
241  dates.Add(new Tuple<DateTime, DateTime>(start, end));
242  }
243  catch
244  {
245  //Do nothing
246  }
247  }
248  }
249  return dates;
250  }
251 
252  public bool DateOK(Tuple<DateTime, DateTime> daterange)
253  {
254  DateTime today = DateTime.Now;
255  if (today >= daterange.Item1.Subtract(new TimeSpan(Seci.Definitions.Status.RBDateLeeway, 0, 0, 0))
256  && today <= daterange.Item2.AddDays(Seci.Definitions.Status.RBDateLeeway))
257  {
258  return true;
259  }
260  else
261  {
262  return false;
263  }
264  }
265 
266  public Boolean RetrieveUsersAndCheckDate(String rbnumber, ref List<User> users)
267  {
268  users = RetrieveUsersByRb(rbnumber);
269 
270  Boolean dateokay = false;
271 
272  var dates = getPossibleDates(rbnumber);
273  foreach(var date in dates)
274  {
275  if (DateOK(date))
276  {
277  dateokay = true;
278  break;
279  }
280  }
281 
282  return dateokay;
283  }
284 
285  public List<User> RetrieveUsersByRb(String rbnumber)
286  {
287  if (_teamData.Tables.Count <= 1)
288  {
289  return new List<User>();
290  }
291 
292  List<User> PIs = new List<User>();
293  List<User> contacts = new List<User>();
294  List<User> users = new List<User>();
295 
296  for (int i = 0; i < _teamData.Tables[1].Rows.Count; ++i)
297  {
298  if (_teamData.Tables[1].Rows[i].ItemArray[indexTeamRBPart].ToString().StartsWith(rbnumber))
299  {
300  String exptr = _teamData.Tables[1].Rows[i].ItemArray[indexTeamExptr].ToString();
301  String role = _teamData.Tables[1].Rows[i].ItemArray[indexTeamRole].ToString();
302  String institute = _teamData.Tables[1].Rows[i].ItemArray[indexTeamInstitute].ToString();
303 
304  if (role.ToLower() == "pi")
305  {
306  PI temp = new PI(exptr, institute);
307  if (!PIs.Contains(temp))
308  {
309  PIs.Add(temp);
310  }
311  }
312  else if (role.ToLower() == "contact")
313  {
314  Contact temp = new Contact(exptr, institute);
315  if (!contacts.Contains(temp))
316  {
317  contacts.Add(temp);
318  }
319  }
320  else
321  {
322  User temp = new User(exptr, institute);
323  if (!users.Contains(temp))
324  {
325  users.Add(temp);
326  }
327  }
328  }
329  }
330 
331  //Make sure the order is PI(s), Contact(s), User(s)
332  users.InsertRange(0, contacts);
333  users.InsertRange(0, PIs);
334 
335  return users;
336  }
337  }
338 }
static DataSet loadData(String filepath)
List< string > GetExperimenters()
Boolean RetrieveUsersAndCheckDate(String rbnumber, ref List< User > users)
List< Tuple< DateTime, DateTime > > getPossibleDates(String rb)
Tuple< DateTime, DateTime > getAllocatedDates(String rbpart)
void loadData(FileInfo team, FileInfo dates)
List< Tuple< DateTime, DateTime > > Dates
Definition: RBDataHolder.cs:28
List< string > GetDates(String Exptr)
bool DateOK(Tuple< DateTime, DateTime > daterange)
void getColumns(DataSet team, DataSet data)
Definition: RBDataHolder.cs:80
List< User > RetrieveUsersByRb(String rbnumber)
List< Tuple< DateTime, DateTime > > _dates
Definition: RBDataHolder.cs:25