Skip to content

Commit c773353

Browse files
author
Dennis Labordus
committed
Refactoring of error handling and processing of CoMPAS Service calls.
Signed-off-by: Dennis Labordus <[email protected]>
1 parent 6657029 commit c773353

File tree

13 files changed

+170
-115
lines changed

13 files changed

+170
-115
lines changed

src/compas-editors/CompasVersions.ts

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {get, translate} from 'lit-translate';
33
import {newLogEvent, newWizardEvent, Wizard} from "../foundation.js";
44

55
import {CompasSclDataService, SDS_NAMESPACE} from "../compas-services/CompasSclDataService.js";
6+
import {createLogEvent} from "../compas-services/foundation.js";
67
import {getTypeFromDocName, updateDocumentInOpenSCD} from "../compas/foundation.js";
78
import {getOpenScdElement, styles} from './foundation.js';
89

@@ -29,7 +30,8 @@ export default class CompasVersionsPlugin extends LitElement {
2930
CompasSclDataService().listVersions(type, this.docId)
3031
.then(xmlResponse => {
3132
this.scls = Array.from(xmlResponse.querySelectorAll('Item') ?? [])
32-
});
33+
})
34+
.catch(createLogEvent);
3335
}
3436

3537
confirmRestoreCompas(version: string): void {
@@ -136,29 +138,27 @@ export default class CompasVersionsPlugin extends LitElement {
136138
`;
137139
}
138140

139-
function fetchScl(type: string, docId: string, version: string) {
140-
CompasSclDataService().getSclDocumentVersion(type, docId, version)
141-
.then(response => {
142-
// Copy the SCL Result from the Response and create a new Document from it.
143-
const sclElement = response.querySelectorAll("SCL").item(0);
144-
const sclDocument = document.implementation.createDocument("", "", null);
145-
sclDocument.getRootNode().appendChild(sclElement.cloneNode(true));
146-
147-
updateDocumentInOpenSCD(sclDocument);
148-
});
149-
}
150-
151141
function openScl(docName: string, docId: string, version: string) {
152142
return function () {
143+
const openScd = getOpenScdElement();
153144
const type = getTypeFromDocName(docName);
154-
fetchScl(type, docId, version);
155145

156-
const openScd = getOpenScdElement();
157-
openScd.dispatchEvent(
158-
newLogEvent({
159-
kind: 'info',
160-
title: get('compas.versions.restoreVersionSuccess', {version : version})
161-
}));
146+
CompasSclDataService().getSclDocumentVersion(type, docId, version)
147+
.then(response => {
148+
// Copy the SCL Result from the Response and create a new Document from it.
149+
const sclElement = response.querySelectorAll("SCL").item(0);
150+
const sclDocument = document.implementation.createDocument("", "", null);
151+
sclDocument.getRootNode().appendChild(sclElement.cloneNode(true));
152+
153+
updateDocumentInOpenSCD(sclDocument);
154+
155+
openScd.dispatchEvent(
156+
newLogEvent({
157+
kind: 'info',
158+
title: get('compas.versions.restoreVersionSuccess', {version : version})
159+
}));
160+
})
161+
.catch(createLogEvent);
162162

163163
// Close the Restore Dialog.
164164
openScd.dispatchEvent(newWizardEvent());
@@ -169,16 +169,20 @@ function openScl(docName: string, docId: string, version: string) {
169169

170170
function deleteScl(docName: string, docId: string) {
171171
return function () {
172+
const openScd = getOpenScdElement();
172173
const type = getTypeFromDocName(docName);
173-
CompasSclDataService().deleteSclDocument(type, docId);
174174

175-
const openScd = getOpenScdElement();
176-
openScd.docId = '';
177-
openScd.dispatchEvent(
178-
newLogEvent({
179-
kind: 'info',
180-
title: get('compas.versions.deleteSuccess')
181-
}));
175+
CompasSclDataService()
176+
.deleteSclDocument(type, docId)
177+
.then (() => {
178+
openScd.docId = '';
179+
openScd.dispatchEvent(
180+
newLogEvent({
181+
kind: 'info',
182+
title: get('compas.versions.deleteSuccess')
183+
}));
184+
})
185+
.catch(createLogEvent);
182186

183187
// Close the Restore Dialog.
184188
openScd.dispatchEvent(newWizardEvent());
@@ -189,15 +193,19 @@ function deleteScl(docName: string, docId: string) {
189193

190194
function deleteSclVersion(docName: string, docId: string, version: string) {
191195
return function () {
196+
const openScd = getOpenScdElement();
192197
const type = getTypeFromDocName(docName);
193-
CompasSclDataService().deleteSclDocumentVersion(type, docId, version);
194198

195-
const openScd = getOpenScdElement();
196-
openScd.dispatchEvent(
197-
newLogEvent({
198-
kind: 'info',
199-
title: get('compas.versions.deleteVersionSuccess', {version : version})
200-
}));
199+
CompasSclDataService()
200+
.deleteSclDocumentVersion(type, docId, version)
201+
.then(() => {
202+
openScd.dispatchEvent(
203+
newLogEvent({
204+
kind: 'info',
205+
title: get('compas.versions.deleteVersionSuccess', {version : version})
206+
}));
207+
})
208+
.catch(createLogEvent);
201209

202210
// Close the Restore Dialog.
203211
openScd.dispatchEvent(newWizardEvent());

src/compas-services/CompasCimMappingService.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {CompasSettings} from "../compas/CompasSettingsElement.js";
2+
import {handleError, handleResponse, parseXml} from "./foundation.js";
23

34
export const CMS_NAMESPACE = 'https://www.lfenergy.org/compas/CimMappingService/v1';
45

@@ -35,9 +36,9 @@ export function CompasCimMappingService() {
3536
</cms:CimData>`;
3637
}) }
3738
</cms:MapRequest>`
38-
})
39-
.then(response => response.text())
40-
.then(str => new DOMParser().parseFromString(str, 'application/xml'))
39+
}).catch(handleError)
40+
.then(handleResponse)
41+
.then(parseXml);
4142
},
4243
}
4344
}

src/compas-services/CompasSclDataService.ts

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {CompasSettings} from "../compas/CompasSettingsElement.js";
22
import {ChangeSet} from "../compas/CompasChangeSet.js";
3+
import {handleError, handleResponse, parseXml} from "./foundation.js";
34

45
export const SDS_NAMESPACE = 'https://www.lfenergy.org/compas/SclDataService/v1';
56

@@ -25,8 +26,9 @@ export function CompasSclDataService() {
2526
listSclTypes(): Promise<Document> {
2627
const sclUrl = getCompasSettings().sclDataServiceUrl + '/common/v1/type/list';
2728
return fetch(sclUrl)
28-
.then(response => response.text())
29-
.then(str => new DOMParser().parseFromString(str, 'application/xml'))
29+
.catch(handleError)
30+
.then(handleResponse)
31+
.then(parseXml);
3032
},
3133

3234
listSclTypesAndOrder(): Promise<Element[]> {
@@ -44,39 +46,47 @@ export function CompasSclDataService() {
4446
listScls(type: string): Promise<Document> {
4547
const sclUrl = getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type?.toUpperCase() + '/list';
4648
return fetch(sclUrl)
47-
.then(response => response.text())
48-
.then(str => new DOMParser().parseFromString(str, 'application/xml'))
49+
.catch(handleError)
50+
.then(handleResponse)
51+
.then(parseXml);
4952
},
5053

5154
listVersions(type: string, id: string): Promise<Document> {
5255
const sclUrl = getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type?.toUpperCase() + '/' + id + "/versions";
5356
return fetch(sclUrl)
54-
.then(response => response.text())
55-
.then(str => new DOMParser().parseFromString(str, 'application/xml'))
57+
.catch(handleError)
58+
.then(handleResponse)
59+
.then(parseXml);
5660
},
5761

5862
getSclDocument(type: string, id: string): Promise<Document> {
5963
const sclUrl = getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type?.toUpperCase() + '/' + id;
6064
return fetch(sclUrl)
61-
.then(response => response.text())
62-
.then(str => new DOMParser().parseFromString(str, 'application/xml'))
65+
.catch(handleError)
66+
.then(handleResponse)
67+
.then(parseXml);
6368
},
6469

6570
getSclDocumentVersion(type: string, id: string, version: string): Promise<Document> {
6671
const sclUrl = getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type?.toUpperCase() + '/' + id + '/' + version;
6772
return fetch(sclUrl)
68-
.then(response => response.text())
69-
.then(str => new DOMParser().parseFromString(str, 'application/xml'))
73+
.catch(handleError)
74+
.then(handleResponse)
75+
.then(parseXml);
7076
},
7177

72-
deleteSclDocumentVersion(type: string, id: string, version: string): Promise<Response> {
78+
deleteSclDocumentVersion(type: string, id: string, version: string): Promise<string> {
7379
const sclUrl = getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type?.toUpperCase() + '/' + id + '/' + version;
74-
return fetch(sclUrl, {method: 'DELETE'});
80+
return fetch(sclUrl, {method: 'DELETE'})
81+
.catch(handleError)
82+
.then(handleResponse);
7583
},
7684

77-
deleteSclDocument(type: string, id: string): Promise<Response> {
85+
deleteSclDocument(type: string, id: string): Promise<string> {
7886
const sclUrl = getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type?.toUpperCase() + '/' + id;
79-
return fetch(sclUrl, {method: 'DELETE'});
87+
return fetch(sclUrl, {method: 'DELETE'})
88+
.catch(handleError)
89+
.then(handleResponse);
8090
},
8191

8292
addSclDocument(type: string, body: CreateRequestBody): Promise<Document> {
@@ -92,12 +102,12 @@ export function CompasSclDataService() {
92102
<sds:Comment>${body.comment}</sds:Comment>
93103
${new XMLSerializer().serializeToString(body.doc.documentElement)}
94104
</sds:CreateRequest>`
95-
})
96-
.then(response => response.text())
97-
.then(str => new DOMParser().parseFromString(str, 'application/xml'))
105+
}).catch(handleError)
106+
.then(handleResponse)
107+
.then(parseXml);
98108
},
99109

100-
updateSclDocument(type: string, id: string, body: UpdateRequestBody): Promise<Response> {
110+
updateSclDocument(type: string, id: string, body: UpdateRequestBody): Promise<string> {
101111
const sclUrl = getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type?.toUpperCase() + '/' + id;
102112
return fetch(sclUrl, {
103113
method: 'PUT',
@@ -110,7 +120,8 @@ export function CompasSclDataService() {
110120
<sds:Comment>${body.comment}</sds:Comment>
111121
${new XMLSerializer().serializeToString(body.doc.documentElement)}
112122
</sds:UpdateRequest>`
113-
})
123+
}).catch(handleError)
124+
.then(handleResponse);
114125
}
115126
}
116127
}

src/compas-services/CompasUserInfoService.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {CompasSettings} from "../compas/CompasSettingsElement.js";
2+
import {handleError, handleResponse, parseXml} from "./foundation.js";
23

34
export function CompasUserInfoService() {
45

@@ -10,8 +11,9 @@ export function CompasUserInfoService() {
1011
getCompasUserInfo(): Promise<Document> {
1112
const userInfoUrl = getCompasSettings().sclDataServiceUrl + '/common/v1/userinfo';
1213
return fetch(userInfoUrl)
13-
.then(response => response.text())
14-
.then(str => new DOMParser().parseFromString(str, 'application/xml'));
14+
.catch(handleError)
15+
.then(handleResponse)
16+
.then(parseXml);
1517
}
1618
}
1719
}

src/compas-services/foundation.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import {get} from "lit-translate";
2+
3+
import {OpenSCD} from "../open-scd.js";
4+
import {newLogEvent} from "../foundation.js";
5+
6+
export function handleResponse(response: Response): Promise<string> {
7+
if (!response.ok) {
8+
let type = 'ApplicationError';
9+
if (response.status === 404) {
10+
type = 'NotFoundError';
11+
} else if (response.status >= 500)
12+
{
13+
type = 'ServerError';
14+
}
15+
return Promise.reject({type: type, status: response.status, message: response.statusText});
16+
}
17+
return Promise.resolve(response.text());
18+
}
19+
20+
export function parseXml(textContent: string): Promise<Document> {
21+
return Promise.resolve(new DOMParser().parseFromString(textContent, 'application/xml'));
22+
}
23+
24+
export function handleError(error: Error): Promise<never> {
25+
return Promise.reject({type: 'ServerError', message: error.message});
26+
}
27+
28+
export function createLogEvent(reason: any): void {
29+
let message = reason.message;
30+
if (reason.status) {
31+
message += " (" + reason.status + ")";
32+
}
33+
34+
const openScd = <OpenSCD>document.querySelector('open-scd');
35+
openScd.dispatchEvent(
36+
newLogEvent({
37+
kind: 'error',
38+
title: get('compas.error.server'),
39+
message: get('compas.error.serverDetails', {type: reason.type, message: message})
40+
}));
41+
}

src/compas/CompasSaveTo.ts

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,8 @@ import {newLogEvent, newPendingStateEvent, newWizardEvent, Wizard, WizardInput}
88
import {CompasChangeSetRadiogroup} from "./CompasChangeSet.js";
99
import {CompasScltypeRadiogroup} from "./CompasScltypeRadiogroup.js";
1010
import {CompasSclDataService} from "../compas-services/CompasSclDataService.js";
11-
import {
12-
getOpenScdElement,
13-
getTypeFromDocName,
14-
stripExtensionFromName,
15-
updateDocumentInOpenSCD
16-
} from "./foundation.js";
17-
11+
import {createLogEvent} from "../compas-services/foundation.js";
12+
import {getOpenScdElement, getTypeFromDocName, stripExtensionFromName, updateDocumentInOpenSCD} from "./foundation.js";
1813
import './CompasChangeSet.js';
1914
import './CompasScltypeRadiogroup.js';
2015

@@ -60,7 +55,8 @@ export class CompasSaveTo extends LitElement {
6055
sclDocument.getRootNode().appendChild(sclElement.cloneNode(true));
6156

6257
updateDocumentInOpenSCD(sclDocument);
63-
});
58+
})
59+
.catch(createLogEvent);
6460
}
6561

6662
private async addSclToCompas(wizard: Element, doc: XMLDocument): Promise<void> {
@@ -84,14 +80,8 @@ export class CompasSaveTo extends LitElement {
8480

8581
// Close the Save Dialog.
8682
openScd.dispatchEvent(newWizardEvent());
87-
}).catch(() => {
88-
const openScd = getOpenScdElement();
89-
openScd.dispatchEvent(
90-
newLogEvent({
91-
kind: 'error',
92-
title: get('compas.saveTo.addError')
93-
}));
94-
});
83+
})
84+
.catch(createLogEvent);
9585
}
9686

9787
private async updateSclInCompas(wizard: Element, docId: string, docName: string, doc: XMLDocument): Promise<void> {
@@ -113,13 +103,8 @@ export class CompasSaveTo extends LitElement {
113103

114104
// Close the Save Dialog.
115105
openScd.dispatchEvent(newWizardEvent());
116-
}).catch(() => {
117-
const openScd = getOpenScdElement();
118-
openScd.dispatchEvent(
119-
newLogEvent({
120-
kind: 'error',
121-
title: get('compas.saveTo.updateError')}));
122-
});
106+
})
107+
.catch(createLogEvent);
123108
}
124109

125110
async saveToCompas(wizard: Element, docId: string, docName: string, doc: XMLDocument): Promise<void> {

0 commit comments

Comments
 (0)