Skip to content

Commit e7de36e

Browse files
author
Dennis Labordus
committed
Support Websocket also for Get and GetVersion. Also changed the request bodies for Websocket.
Signed-off-by: Dennis Labordus <[email protected]>
1 parent 7448654 commit e7de36e

File tree

3 files changed

+190
-80
lines changed

3 files changed

+190
-80
lines changed

src/compas-editors/CompasVersions.ts

Lines changed: 77 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -130,25 +130,40 @@ export default class CompasVersionsPlugin extends LitElement {
130130

131131
private confirmRestoreVersionWizard(version: string): Wizard {
132132
function openScl(plugin: CompasVersionsPlugin) {
133-
return function () {
134-
const type = getTypeFromDocName(plugin.docName);
135-
136-
CompasSclDataService()
137-
.getSclDocumentVersion(type, plugin.docId, version)
138-
.then(sclDocument => {
139-
updateDocumentInOpenSCD(plugin, sclDocument);
133+
function updateDocument(sclDocument: Document): void {
134+
updateDocumentInOpenSCD(plugin, sclDocument);
140135

141-
plugin.dispatchEvent(
142-
newLogEvent({
143-
kind: 'info',
144-
title: get('compas.versions.restoreVersionSuccess', {
145-
version: version,
146-
}),
147-
})
148-
);
136+
plugin.dispatchEvent(
137+
newLogEvent({
138+
kind: 'info',
139+
title: get('compas.versions.restoreVersionSuccess', {
140+
version: version,
141+
}),
149142
})
150-
.catch(reason => createLogEvent(plugin, reason));
143+
);
144+
}
151145

146+
return function () {
147+
const type = getTypeFromDocName(plugin.docName);
148+
149+
const service = CompasSclDataService();
150+
if (service.useWebsocket()) {
151+
service.getSclDocumentVersionUsingWebsockets(
152+
plugin,
153+
type,
154+
plugin.docId,
155+
version,
156+
(sclDocument) => {
157+
updateDocument(sclDocument);
158+
})
159+
} else {
160+
service
161+
.getSclDocumentVersionUsingRest(type, plugin.docId, version)
162+
.then(sclDocument => {
163+
updateDocument(sclDocument);
164+
})
165+
.catch(reason => createLogEvent(plugin, reason));
166+
}
152167
// Close the Restore Dialog.
153168
plugin.dispatchEvent(newWizardEvent());
154169

@@ -285,15 +300,17 @@ export default class CompasVersionsPlugin extends LitElement {
285300
const oldScl = await this.getVersion(oldVersion);
286301
const newScl = this.doc.documentElement;
287302

288-
this.dispatchEvent(
289-
newWizardEvent(
290-
compareWizard(this, oldScl, newScl, {
291-
title: get('compas.compare.titleCurrent', {
292-
oldVersion: oldVersion,
293-
}),
294-
})
295-
)
296-
);
303+
if (oldScl && newScl) {
304+
this.dispatchEvent(
305+
newWizardEvent(
306+
compareWizard(this, oldScl, newScl, {
307+
title: get('compas.compare.titleCurrent', {
308+
oldVersion: oldVersion,
309+
}),
310+
})
311+
)
312+
);
313+
}
297314
} else {
298315
this.dispatchEvent(
299316
newWizardEvent(
@@ -318,16 +335,18 @@ export default class CompasVersionsPlugin extends LitElement {
318335
const oldScl = await this.getVersion(oldVersion);
319336
const newScl = await this.getVersion(newVersion);
320337

321-
this.dispatchEvent(
322-
newWizardEvent(
323-
compareWizard(this, oldScl, newScl, {
324-
title: get('compas.compare.title', {
325-
oldVersion: oldVersion,
326-
newVersion: newVersion,
327-
}),
328-
})
329-
)
330-
);
338+
if (oldScl && newScl) {
339+
this.dispatchEvent(
340+
newWizardEvent(
341+
compareWizard(this, oldScl, newScl, {
342+
title: get('compas.compare.title', {
343+
oldVersion: oldVersion,
344+
newVersion: newVersion,
345+
}),
346+
})
347+
)
348+
);
349+
}
331350
} else {
332351
this.dispatchEvent(
333352
newWizardEvent(
@@ -351,13 +370,31 @@ export default class CompasVersionsPlugin extends LitElement {
351370
];
352371
}
353372

354-
private async getVersion(version: string) {
373+
private async getVersion(version: string): Promise<void | Element> {
355374
const type = getTypeFromDocName(this.docName);
356-
return CompasSclDataService()
357-
.getSclDocumentVersion(type, this.docId, version)
358-
.then(sclDocument => {
359-
return Promise.resolve(sclDocument.documentElement);
375+
const service = CompasSclDataService();
376+
377+
if (service.useWebsocket()) {
378+
return new Promise((resolve) => {
379+
service.getSclDocumentVersionUsingWebsockets(
380+
this,
381+
type,
382+
this.docId,
383+
version,
384+
(sclDocument) => {
385+
resolve(sclDocument.documentElement);
386+
})
360387
});
388+
} else {
389+
return service
390+
.getSclDocumentVersionUsingRest(type, this.docId, version)
391+
.then(sclDocument => {
392+
return Promise.resolve(<Element>sclDocument.documentElement);
393+
})
394+
.catch(reason => {
395+
createLogEvent(this, reason)
396+
});
397+
}
361398
}
362399

363400
private openEditWizard(): void {

src/compas-services/CompasSclDataService.ts

Lines changed: 99 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -35,36 +35,6 @@ export function CompasSclDataService() {
3535
return CompasSettings().compasSettings.sclDataServiceUrl;
3636
}
3737

38-
function createCreateRequest(
39-
sclName: string,
40-
comment: string | null,
41-
doc: Document
42-
): string {
43-
return `<?xml version="1.0" encoding="UTF-8"?>
44-
<sds:CreateRequest xmlns:sds="${SDS_NAMESPACE}">
45-
<sds:Name>${sclName}</sds:Name>
46-
<sds:Comment>${comment ?? ''}</sds:Comment>
47-
<sds:SclData><![CDATA[${formatXml(
48-
new XMLSerializer().serializeToString(
49-
doc.documentElement))}]]></sds:SclData>
50-
</sds:CreateRequest>`;
51-
}
52-
53-
function createUpdateRequest(
54-
changeSet: ChangeSet,
55-
comment: string | null,
56-
doc: Document
57-
): string {
58-
return `<?xml version="1.0" encoding="UTF-8"?>
59-
<sds:UpdateRequest xmlns:sds="${SDS_NAMESPACE}">
60-
<sds:ChangeSet>${changeSet}</sds:ChangeSet>
61-
<sds:Comment>${comment ?? ''}</sds:Comment>
62-
<sds:SclData><![CDATA[${formatXml(
63-
new XMLSerializer().serializeToString(
64-
doc.documentElement))}]]></sds:SclData>
65-
</sds:UpdateRequest>`;
66-
}
67-
6838
return {
6939
useWebsocket(): boolean {
7040
return CompasSettings().useWebsockets();
@@ -120,7 +90,10 @@ export function CompasSclDataService() {
12090
.then(parseXml);
12191
},
12292

123-
getSclDocument(type: string, id: string): Promise<Document> {
93+
getSclDocumentUsingRest(
94+
type: string,
95+
id: string
96+
): Promise<Document> {
12497
const sclUrl =
12598
getSclDataServiceUrl() + '/scl/v1/' + type + '/' + id;
12699
return fetch(sclUrl)
@@ -130,7 +103,30 @@ export function CompasSclDataService() {
130103
.then(extractSclFromResponse);
131104
},
132105

133-
getSclDocumentVersion(
106+
getSclDocumentUsingWebsockets(
107+
element: Element,
108+
type: string,
109+
id: string,
110+
callback: (scl: Document) => void,
111+
) {
112+
const request =
113+
`<?xml version="1.0" encoding="UTF-8"?>
114+
<sds:GetWsRequest xmlns:sds="${SDS_NAMESPACE}">
115+
<sds:Id>${id}</sds:Id>
116+
</sds:GetWsRequest>`;
117+
118+
const sclUrl = getSclDataServiceUrl() + '/scl-ws/v1/' + type + '/get';
119+
Websockets(element, 'CompasSclDataService').execute(
120+
getWebsocketUri(sclUrl),
121+
request,
122+
async (response: Document) => {
123+
const scl = await extractSclFromResponse(response);
124+
callback(scl);
125+
}
126+
);
127+
},
128+
129+
getSclDocumentVersionUsingRest(
134130
type: string,
135131
id: string,
136132
version: string
@@ -150,6 +146,31 @@ export function CompasSclDataService() {
150146
.then(extractSclFromResponse);
151147
},
152148

149+
getSclDocumentVersionUsingWebsockets(
150+
element: Element,
151+
type: string,
152+
id: string,
153+
version: string,
154+
callback: (scl: Document) => void,
155+
) {
156+
const request =
157+
`<?xml version="1.0" encoding="UTF-8"?>
158+
<sds:GetVersionWsRequest xmlns:sds="${SDS_NAMESPACE}">
159+
<sds:Id>${id}</sds:Id>
160+
<sds:Version>${version}</sds:Version>
161+
</sds:GetVersionWsRequest>`;
162+
163+
const sclUrl = getSclDataServiceUrl() + '/scl-ws/v1/' + type + '/get-version';
164+
Websockets(element, 'CompasSclDataService').execute(
165+
getWebsocketUri(sclUrl),
166+
request,
167+
async (response: Document) => {
168+
const scl = await extractSclFromResponse(response);
169+
callback(scl);
170+
}
171+
);
172+
},
173+
153174
deleteSclDocumentVersion(
154175
type: string,
155176
id: string,
@@ -177,13 +198,23 @@ export function CompasSclDataService() {
177198
},
178199

179200
addSclDocumentUsingRest(type: string, body: CreateRequestBody): Promise<Document> {
201+
const request =
202+
`<?xml version="1.0" encoding="UTF-8"?>
203+
<sds:CreateRequest xmlns:sds="${SDS_NAMESPACE}">
204+
<sds:Name>${body.sclName}</sds:Name>
205+
<sds:Comment>${body.comment ?? ''}</sds:Comment>
206+
<sds:SclData><![CDATA[${formatXml(
207+
new XMLSerializer().serializeToString(
208+
body.doc.documentElement))}]]></sds:SclData>
209+
</sds:CreateRequest>`;
210+
180211
const sclUrl = getSclDataServiceUrl() + '/scl/v1/' + type;
181212
return fetch(sclUrl, {
182213
method: 'POST',
183214
headers: {
184215
'Content-Type': 'application/xml',
185216
},
186-
body: createCreateRequest(body.sclName, body.comment, body.doc),
217+
body: request,
187218
})
188219
.catch(handleError)
189220
.then(handleResponse)
@@ -197,10 +228,20 @@ export function CompasSclDataService() {
197228
body: CreateRequestBody,
198229
callback: (scl: Document) => void,
199230
) {
231+
const request =
232+
`<?xml version="1.0" encoding="UTF-8"?>
233+
<sds:CreateWsRequest xmlns:sds="${SDS_NAMESPACE}">
234+
<sds:Name>${body.sclName}</sds:Name>
235+
<sds:Comment>${body.comment ?? ''}</sds:Comment>
236+
<sds:SclData><![CDATA[${formatXml(
237+
new XMLSerializer().serializeToString(
238+
body.doc.documentElement))}]]></sds:SclData>
239+
</sds:CreateWsRequest>`;
240+
200241
const sclUrl = getSclDataServiceUrl() + '/scl-ws/v1/' + type + '/create';
201242
Websockets(element, 'CompasSclDataService').execute(
202243
getWebsocketUri(sclUrl),
203-
createCreateRequest(body.sclName, body.comment, body.doc),
244+
request,
204245
async (response: Document) => {
205246
const scl = await extractSclFromResponse(response);
206247
callback(scl);
@@ -213,14 +254,24 @@ export function CompasSclDataService() {
213254
id: string,
214255
body: UpdateRequestBody
215256
): Promise<Document> {
257+
const request =
258+
`<?xml version="1.0" encoding="UTF-8"?>
259+
<sds:UpdateRequest xmlns:sds="${SDS_NAMESPACE}">
260+
<sds:ChangeSet>${body.changeSet}</sds:ChangeSet>
261+
<sds:Comment>${body.comment ?? ''}</sds:Comment>
262+
<sds:SclData><![CDATA[${formatXml(
263+
new XMLSerializer().serializeToString(
264+
body.doc.documentElement))}]]></sds:SclData>
265+
</sds:UpdateRequest>`;
266+
216267
const sclUrl =
217268
getSclDataServiceUrl() + '/scl/v1/' + type + '/' + id;
218269
return fetch(sclUrl, {
219270
method: 'PUT',
220271
headers: {
221272
'Content-Type': 'application/xml',
222273
},
223-
body: createUpdateRequest(body.changeSet, body.comment, body.doc),
274+
body: request,
224275
})
225276
.catch(handleError)
226277
.then(handleResponse)
@@ -235,10 +286,21 @@ export function CompasSclDataService() {
235286
body: UpdateRequestBody,
236287
callback: (scl: Document) => void,
237288
) {
238-
const sclUrl = getSclDataServiceUrl() + '/scl-ws/v1/' + type + '/update/' + id;
289+
const request =
290+
`<?xml version="1.0" encoding="UTF-8"?>
291+
<sds:UpdateWsRequest xmlns:sds="${SDS_NAMESPACE}">
292+
<sds:Id>${id}</sds:Id>
293+
<sds:ChangeSet>${body.changeSet}</sds:ChangeSet>
294+
<sds:Comment>${body.comment ?? ''}</sds:Comment>
295+
<sds:SclData><![CDATA[${formatXml(
296+
new XMLSerializer().serializeToString(
297+
body.doc.documentElement))}]]></sds:SclData>
298+
</sds:UpdateWsRequest>`
299+
300+
const sclUrl = getSclDataServiceUrl() + '/scl-ws/v1/' + type + '/update';
239301
Websockets(element, 'CompasSclDataService').execute(
240302
getWebsocketUri(sclUrl),
241-
createUpdateRequest(body.changeSet, body.comment, body.doc),
303+
request,
242304
async (response: Document) => {
243305
const scl = await extractSclFromResponse(response);
244306
callback(scl);

src/compas/CompasOpen.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,20 @@ export default class CompasOpenElement extends LitElement {
5656
private sclFileUI!: HTMLInputElement;
5757

5858
private async getSclDocument(docId?: string): Promise<void> {
59-
const doc = await CompasSclDataService()
60-
.getSclDocument(this.selectedType ?? '', docId ?? '')
61-
.catch(reason => createLogEvent(this, reason));
59+
const service = CompasSclDataService();
60+
const doc = service.useWebsocket()
61+
? await new Promise((resolve) => {
62+
service.getSclDocumentUsingWebsockets(
63+
this,
64+
this.selectedType ?? '',
65+
docId ?? '',
66+
(doc) => resolve(doc)
67+
)
68+
})
69+
: await service
70+
.getSclDocumentUsingRest(this.selectedType ?? '', docId ?? '')
71+
.catch(reason => createLogEvent(this, reason));
72+
6273
if (doc instanceof Document) {
6374
const docName = buildDocName(doc.documentElement);
6475
this.dispatchEvent(newDocRetrievedEvent(false, doc, docName, docId));

0 commit comments

Comments
 (0)