/
MainController.cs
146 lines (117 loc) · 4.19 KB
/
MainController.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Timers;
using System.Windows;
using MS.OSM.Querys.DTO;
using MS.OSM.Querys.OSM2DB.Loader;
using MS.OSM.Querys.OSM2DB.OSMFileReader;
using MS.OSM.Querys.OSM2DB.ViewModel;
namespace MS.OSM.Querys.OSM2DB.Controller
{
class MainController
{
private MainViewModel _model;
private Dictionary<long, Node> _nodes;
private ConcurrentBag<Way> _ways;
private Stopwatch _watch;
private Timer timerRefresh;
private XmlOSMFileLoader _xmlOSMFileLoader;
private DBLoader _dbLoader;
private MainControllerStates _phase;
public MainController()
{
_model = new MainViewModel();
_nodes = new Dictionary<long, Node>();
_ways = new ConcurrentBag<Way>();
_watch = new Stopwatch();
timerRefresh = new Timer(500);
timerRefresh.Elapsed += TimerRefreshElapsed;
timerRefresh.Start();
_xmlOSMFileLoader = new XmlOSMFileLoader(_ways);
_dbLoader = new DBLoader(_ways,Model.QueryString);
_phase = MainControllerStates.None;
//load current Query String
var v = ConfigurationManager.ConnectionStrings["CS"];
if (v != null)
{
Model.QueryString = v.ConnectionString;
}
}
public MainViewModel Model
{
get { return _model; }
}
public MainControllerStates Phase
{
get { return _phase; }
}
void TimerRefreshElapsed(object sender, ElapsedEventArgs e)
{
RefreshModel();
}
private void RefreshModel()
{
if (_phase == MainControllerStates.None)
{
return;
}
_model.Elapsed = _watch.Elapsed;
if (_phase == MainControllerStates.LoadFromFile)
{
Model.MaxNodesLeft = _nodes.Count;
Model.MaxWaysLeft = _ways.Count;
}
Model.NodesLeft = _nodes.Count;
Model.WaysLeft = _ways.Count;
}
public void LoadOSMFile(string path, List<string> filters, Action<Task> continuation)
{
_phase = MainControllerStates.LoadFromFile;
_watch.Start();
var task = _xmlOSMFileLoader.BeginRead(path, filters);
task.ContinueWith(a =>
{
if (a.IsFaulted)
{
MessageBox.Show("Internal Error!");
}
continuation(a);
_model.MaxWaysLeft = _ways.Count;
_watch.Stop();
_phase = MainControllerStates.Idle;
_xmlOSMFileLoader.Dispose();
});
}
public void Clear()
{
_nodes.Clear();
_ways = new ConcurrentBag<Way>();
_xmlOSMFileLoader = new XmlOSMFileLoader(_ways);
_watch.Reset();
RefreshModel();
_phase = MainControllerStates.None;
}
public void LoadOSMToDatabase(Action<Task> continuation)
{
_phase = MainControllerStates.LoadToDb;
_watch.Start();
_dbLoader.QueryString = Model.QueryString;
var tasks = _dbLoader.BeginLoadWays(4);
Task.Factory.StartNew(() =>
{
Task.WaitAll(tasks);
continuation(null);
_watch.Stop();
_phase = MainControllerStates.Idle;
});
}
}
public enum MainControllerStates
{
LoadFromFile, LoadToDb, None, Idle
}
}