-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDataSourceMerger.cs
90 lines (79 loc) · 4.27 KB
/
DataSourceMerger.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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using DevExpress.DashboardCommon;
namespace DashboardMergeExample {
public static class DataSourceMerger {
public static void MergeDataSources(DataSourceCollection fromDataSources, DashboardMerger dashboardMerger) {
DataSourceCollection toDataSources = dashboardMerger.TargetDashboard.DataSources;
foreach(IDashboardDataSource dataSource in fromDataSources) {
AddDataSourceCopy(dataSource, dashboardMerger, (dataSourceCopy) => {
toDataSources.Add(dataSourceCopy);
});
}
}
static void AddDataSourceCopy(IDashboardDataSource dataSource, DashboardMerger dashboardMerger, Action<IDashboardDataSource> addDataSourceDelegate) {
DataSourceCollection toDataSources = dashboardMerger.TargetDashboard.DataSources;
IDictionary<string, string> dataSourceNamesMap = dashboardMerger.DataSourceNamesMap;
IDashboardDataSource dataSourceCopy = CreateDataSourceCopy(dataSource);
if(dataSourceCopy != null) {
if(toDataSources.Any(d => d.ComponentName == dataSourceCopy.ComponentName)) {
if(ResolveNamesConflict(dataSourceCopy, toDataSources, dataSourceNamesMap))
addDataSourceDelegate(dataSourceCopy);
} else {
addDataSourceDelegate(dataSourceCopy);
}
}
}
static bool ResolveNamesConflict(IDashboardDataSource dataSourceCopy, DataSourceCollection toDataSources, IDictionary<string, string> dataSourceNamesMap) {
// Provide your data source component names conflict resolution logic here
string newName = NamesGenerator.GenerateName(dataSourceCopy.ComponentName, 1, toDataSources.Select(ds => ds.ComponentName));
dataSourceNamesMap.Add(dataSourceCopy.ComponentName, newName);
dataSourceCopy.ComponentName = newName;
return true;
}
static IDashboardDataSource CreateDataSourceCopy(IDashboardDataSource dataSourceToCopy) {
DashboardEFDataSource efDataSource = dataSourceToCopy as DashboardEFDataSource;
if(efDataSource != null) {
XElement element = efDataSource.SaveToXml();
DashboardEFDataSource newDataSource = new DashboardEFDataSource();
newDataSource.LoadFromXml(element);
newDataSource.Fill();
return newDataSource;
}
DashboardExtractDataSource extractDataSource = dataSourceToCopy as DashboardExtractDataSource;
if(extractDataSource != null) {
XElement element = extractDataSource.SaveToXml();
DashboardExtractDataSource newDataSource = new DashboardExtractDataSource();
newDataSource.LoadFromXml(element);
return newDataSource;
}
DashboardObjectDataSource objectDataSource = dataSourceToCopy as DashboardObjectDataSource;
if(objectDataSource != null) {
XElement element = objectDataSource.SaveToXml();
DashboardObjectDataSource newDataSource = new DashboardObjectDataSource();
newDataSource.LoadFromXml(element);
newDataSource.Fill();
return newDataSource;
}
DashboardOlapDataSource olapDataSource = dataSourceToCopy as DashboardOlapDataSource;
if(olapDataSource != null) {
XElement element = olapDataSource.SaveToXml();
DashboardOlapDataSource newDataSource = new DashboardOlapDataSource();
newDataSource.LoadFromXml(element);
newDataSource.Fill();
return newDataSource;
}
DashboardSqlDataSource sqlDataSource = dataSourceToCopy as DashboardSqlDataSource;
if(sqlDataSource != null) {
XElement element = sqlDataSource.SaveToXml();
DashboardSqlDataSource newDataSource = new DashboardSqlDataSource();
newDataSource.LoadFromXml(element);
newDataSource.Fill();
return newDataSource;
}
return null;
}
}
}