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
|
import { HttpClient, HttpParams } from '@angular/common/http';
import { Inject, Injectable } from '@angular/core';
import { LeftPaletteComponent, LeftPaletteMetadataTypes } from 'app/models/components/displayComponent';
import { GroupMetadata } from 'app/models/group-metadata';
import { PolicyMetadata } from 'app/models/policy-metadata';
import { IComponentMetadata } from 'app/models/component-metadata';
import { SdcConfigToken } from 'app/ng2/config/sdc-config.config';
import { ISdcConfig } from 'app/ng2/config/sdc-config.config.factory';
import { WorkspaceService } from 'app/ng2/pages/workspace/workspace.service';
import 'rxjs/add/observable/forkJoin';
import { Observable } from 'rxjs/Rx';
import Dictionary = _.Dictionary;
@Injectable()
export class CompositionPaletteService {
protected baseUrl = '';
private leftPaletteComponents: Dictionary<Dictionary<LeftPaletteComponent[]>>;
private facadeUrl: string;
constructor(protected http: HttpClient, @Inject(SdcConfigToken) sdcConfig: ISdcConfig, private workspaceService: WorkspaceService) {
this.baseUrl = sdcConfig.api.root + sdcConfig.api.component_api_root;
this.facadeUrl = sdcConfig.api.uicache_root + sdcConfig.api.GET_uicache_left_palette;
}
public subscribeToLeftPaletteElements(next, error) {
let params = new HttpParams();
params = params.append('internalComponentType', this.workspaceService.getMetadataType());
let model = this.workspaceService.metadata.model
if (model) {
params = params.append('componentModel', model);
}
const loadInstances = this.http.get(this.facadeUrl, {params});
const loadGroups = this.http.get(this.baseUrl + 'groupTypes', {params});
const loadPolicies = this.http.get(this.baseUrl + 'policyTypes', {params});
Observable.forkJoin(loadInstances, loadGroups, loadPolicies).subscribe( ([resInstances, resGrouops, resPolicies]) => {
const combinedDictionary = this.combineResoponses(resInstances, resGrouops, resPolicies);
this.leftPaletteComponents = combinedDictionary;
next(this.leftPaletteComponents);
});
}
public getLeftPaletteElements = (): Dictionary<Dictionary<LeftPaletteComponent[]>> => {
return this.leftPaletteComponents;
}
public convertPoliciesOrGroups = (paletteListResult, type: string ) => {
const components: LeftPaletteComponent[] = [];
if (type === 'Policies') {
_.forEach(paletteListResult, (policyMetadata: PolicyMetadata) => {
components.push(new LeftPaletteComponent(LeftPaletteMetadataTypes.Policy, policyMetadata));
});
return {
Policies: components
};
}
if (type === 'Groups') {
_.forEach(paletteListResult, (groupMetadata: GroupMetadata) => {
const item = new LeftPaletteComponent(LeftPaletteMetadataTypes.Group, groupMetadata);
components.push(item);
});
return {
Groups: components
};
}
return {};
}
private combineResoponses(resInstances: object, resGrouops: object, resPolicies: object) {
const retValObject = {};
if (resInstances['Generic']) {
if (this.isSubstitutionForNestedServices()) {
const serviceGroup = this.createServiceGroup(resInstances);
if (serviceGroup) {
retValObject['Service'] = serviceGroup;
}
}
retValObject['Generic'] = resInstances['Generic'];
}
// Add all other categories
for (const category in resInstances) {
if (category === 'Generic') {
continue;
}
retValObject[category] = resInstances[category];
}
// Add Groups
retValObject["Groups"] = this.convertPoliciesOrGroups(resGrouops, 'Groups');
// Add policies
retValObject["Policies"] = this.convertPoliciesOrGroups(resPolicies, 'Policies');
return retValObject;
}
private isSubstitutionForNestedServices(): boolean {
return this.workspaceService.metadata.categories[0].useServiceSubstitutionForNestedServices;
}
private createServiceGroup(resInstances: object): object {
const servicesList = resInstances['Generic']['Generic'];
if (Array.isArray(servicesList) && servicesList.length > 0) {
delete resInstances['Generic']['Generic'];
return servicesList.reduce(function (map, component) {
if (map[component.categories[0].name]) {
map[component.categories[0].name].push(component);
} else {
map[component.categories[0].name] = [component];
}
return map;
}, {});
}
return null;
}
}
|