@finos/legend-graph
Version:
Legend graph and graph manager
242 lines • 13.8 kB
JavaScript
/**
* Copyright (c) 2020-present, Goldman Sachs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import packageJson from '../../../../../package.json' with { type: 'json' };
import { assertType, guaranteeNonEmptyString, assertNonNullable, guaranteeNonNullable, } from '@finos/legend-shared';
import { deserialize, serialize } from 'serializr';
import { getOwnBinding, getOwnSchemaSet, } from '../../../helpers/DSL_ExternalFormat_GraphManagerHelper.js';
import { PackageableElementReference } from '../../../../graph/metamodel/pure/packageableElements/PackageableElementReference.js';
import { ExternalFormatConnection } from '../../../../graph/metamodel/pure/packageableElements/externalFormat/connection/DSL_ExternalFormat_ExternalFormatConnection.js';
import { UrlStream } from '../../../../graph/metamodel/pure/packageableElements/externalFormat/connection/DSL_ExternalFormat_UrlStream.js';
import { Schema } from '../../../../graph/metamodel/pure/packageableElements/externalFormat/schemaSet/DSL_ExternalFormat_Schema.js';
import { SchemaSet } from '../../../../graph/metamodel/pure/packageableElements/externalFormat/schemaSet/DSL_ExternalFormat_SchemaSet.js';
import { Binding } from '../../../../graph/metamodel/pure/packageableElements/externalFormat/store/DSL_ExternalFormat_Binding.js';
import { ModelUnit } from '../../../../graph/metamodel/pure/packageableElements/externalFormat/store/DSL_ExternalFormat_ModelUnit.js';
import { PureProtocolProcessorPlugin, } from '../PureProtocolProcessorPlugin.js';
import { V1_ExternalFormatConnection } from '../v1/model/packageableElements/externalFormat/connection/V1_DSL_ExternalFormat_ExternalFormatConnection.js';
import { V1_UrlStream } from '../v1/model/packageableElements/externalFormat/connection/V1_DSL_ExternalFormat_UrlStream.js';
import { V1_Schema } from '../v1/model/packageableElements/externalFormat/schemaSet/V1_DSL_ExternalFormat_Schema.js';
import { V1_SchemaSet } from '../v1/model/packageableElements/externalFormat/schemaSet/V1_DSL_ExternalFormat_SchemaSet.js';
import { V1_Binding } from '../v1/model/packageableElements/externalFormat/store/V1_DSL_ExternalFormat_Binding.js';
import { V1_ModelUnit } from '../v1/model/packageableElements/externalFormat/store/V1_DSL_ExternalFormat_ModelUnit.js';
import { V1_initPackageableElement } from '../v1/transformation/pureGraph/from/V1_CoreTransformerHelper.js';
import { V1_resolveBinding, V1_resolveSchemaSet, } from '../v1/transformation/pureGraph/to/V1_DSL_ExternalFormat_GraphBuilderHelper.js';
import { V1_ElementBuilder } from '../v1/transformation/pureGraph/to/V1_ElementBuilder.js';
import { V1_buildFullPath, } from '../v1/transformation/pureGraph/to/V1_GraphBuilderContext.js';
import { V1_bindingModelSchema, V1_BINDING_ELEMENT_PROTOCOL_TYPE, V1_externalFormatConnectionModelSchema, V1_EXTERNAL_FORMAT_CONNECTION_ELEMENT_PROTOCOL_TYPE, V1_schemaSetModelSchema, V1_SCHEMA_SET_ELEMENT_PROTOCOL_TYPE, } from '../v1/transformation/pureProtocol/serializationHelpers/V1_DSL_ExternalFormat_ProtocolHelper.js';
const BINDING_ELEMENT_CLASSIFIER_PATH = 'meta::external::format::shared::binding::Binding';
const SCHEMA_SET_ELEMENT_CLASSIFIER_PATH = 'meta::external::format::shared::metamodel::SchemaSet';
export class DSL_ExternalFormat_PureProtocolProcessorPlugin extends PureProtocolProcessorPlugin {
constructor() {
super(packageJson.extensions.dsl_external_format_pureProtocolProcessorPlugin, packageJson.version);
}
V1_getExtraElementBuilders() {
return [
new V1_ElementBuilder({
elementClassName: Binding.name,
_class: V1_Binding,
firstPass: (elementProtocol, context) => {
assertType(elementProtocol, V1_Binding);
const element = new Binding(elementProtocol.name);
const path = V1_buildFullPath(elementProtocol.package, elementProtocol.name);
context.currentSubGraph.setOwnStore(path, element);
return element;
},
secondPass: (elementProtocol, context) => {
assertType(elementProtocol, V1_Binding);
const path = V1_buildFullPath(elementProtocol.package, elementProtocol.name);
const element = getOwnBinding(path, context.currentSubGraph);
element.schemaId = elementProtocol.schemaId;
element.schemaSet = elementProtocol.schemaSet
? V1_resolveSchemaSet(elementProtocol.schemaSet, context)
: undefined;
element.contentType = guaranteeNonEmptyString(elementProtocol.contentType, `Binding 'contentType' '${elementProtocol.contentType}' is not supported`);
assertNonNullable(elementProtocol.modelUnit, `Binding 'modelUnit' field is missing`);
const modelUnit = new ModelUnit();
modelUnit.packageableElementIncludes =
elementProtocol.modelUnit.packageableElementIncludes.map((e) => context.resolveElement(e, true));
modelUnit.packageableElementExcludes =
elementProtocol.modelUnit.packageableElementExcludes.map((e) => context.resolveElement(e, true));
element.modelUnit = modelUnit;
},
}),
new V1_ElementBuilder({
elementClassName: SchemaSet.name,
_class: V1_SchemaSet,
firstPass: (elementProtocol, context) => {
assertType(elementProtocol, V1_SchemaSet);
const element = new SchemaSet(elementProtocol.name);
const path = V1_buildFullPath(elementProtocol.package, elementProtocol.name);
context.currentSubGraph.setOwnElementInExtension(path, element, SchemaSet);
return element;
},
secondPass: (elementProtocol, context) => {
assertType(elementProtocol, V1_SchemaSet);
const path = V1_buildFullPath(elementProtocol.package, elementProtocol.name);
const element = getOwnSchemaSet(path, context.currentSubGraph);
element.format = guaranteeNonEmptyString(elementProtocol.format);
element.schemas = elementProtocol.schemas.map((schema) => {
const schemaElement = new Schema();
schemaElement.content = guaranteeNonEmptyString(schema.content, `Schema 'content' field is missing or empty`);
schemaElement.id = schema.id;
schemaElement.location = schema.location;
return schemaElement;
});
},
}),
];
}
V1_getExtraElementClassifierPathGetters() {
return [
(elementProtocol) => {
if (elementProtocol instanceof V1_Binding) {
return BINDING_ELEMENT_CLASSIFIER_PATH;
}
else if (elementProtocol instanceof V1_SchemaSet) {
return SCHEMA_SET_ELEMENT_CLASSIFIER_PATH;
}
return undefined;
},
];
}
V1_getExtraElementProtocolSerializers() {
return [
(elementProtocol, plugins) => {
if (elementProtocol instanceof V1_Binding) {
return serialize(V1_bindingModelSchema, elementProtocol);
}
else if (elementProtocol instanceof V1_SchemaSet) {
return serialize(V1_schemaSetModelSchema, elementProtocol);
}
return undefined;
},
];
}
V1_getExtraElementProtocolDeserializers() {
return [
(json, plugins) => {
if (json._type === V1_BINDING_ELEMENT_PROTOCOL_TYPE) {
return deserialize(V1_bindingModelSchema, json);
}
else if (json._type === V1_SCHEMA_SET_ELEMENT_PROTOCOL_TYPE) {
return deserialize(V1_schemaSetModelSchema, json);
}
return undefined;
},
];
}
V1_getExtraElementTransformers() {
return [
(metamodel, context) => {
if (metamodel instanceof Binding) {
const protocol = new V1_Binding();
V1_initPackageableElement(protocol, metamodel);
protocol.name = metamodel.name;
protocol.package = metamodel.package?.path ?? '';
protocol.schemaId = metamodel.schemaId;
protocol.schemaSet = metamodel.schemaSet?.valueForSerialization;
protocol.contentType = metamodel.contentType;
const modelUnit = new V1_ModelUnit();
modelUnit.packageableElementExcludes =
metamodel.modelUnit.packageableElementExcludes.map((path) => path instanceof PackageableElementReference
? (path.valueForSerialization ?? '')
: path);
modelUnit.packageableElementIncludes =
metamodel.modelUnit.packageableElementIncludes.map((path) => path instanceof PackageableElementReference
? (path.valueForSerialization ?? '')
: path);
protocol.modelUnit = modelUnit;
protocol.includedStores = [];
return protocol;
}
else if (metamodel instanceof SchemaSet) {
const protocol = new V1_SchemaSet();
V1_initPackageableElement(protocol, metamodel);
protocol.name = metamodel.name;
protocol.package = metamodel.package?.path ?? '';
protocol.format = metamodel.format;
protocol.schemas = metamodel.schemas.map((schema) => {
const schemaProtocol = new V1_Schema();
schemaProtocol.content = schema.content;
schemaProtocol.id = schema.id;
schemaProtocol.location = schema.location;
return schemaProtocol;
});
return protocol;
}
return undefined;
},
];
}
V1_getExtraConnectionBuilders() {
return [
(connection, context, store) => {
if (connection instanceof V1_ExternalFormatConnection) {
const Store = !store
? V1_resolveBinding(guaranteeNonNullable(connection.store, `External format connection 'store' field is missing`), context)
: connection.store
? V1_resolveBinding(connection.store, context)
: (() => {
assertType(store.value, Binding, `External format connection store must be a Binding`);
return store;
})();
const externalFormatConnection = new ExternalFormatConnection(Store);
assertNonNullable(connection.externalSource, `External format connection 'externalSource' field is missing`);
const urlStream = new UrlStream();
urlStream.url = guaranteeNonEmptyString(connection.externalSource.url, `URL stream 'url' field is missing or empty`);
externalFormatConnection.externalSource = urlStream;
return externalFormatConnection;
}
return undefined;
},
];
}
V1_getExtraConnectionTransformers() {
return [
(metamodel, context) => {
if (metamodel instanceof ExternalFormatConnection) {
const connection = new V1_ExternalFormatConnection();
connection.store = metamodel.store.valueForSerialization ?? '';
const urlStream = new V1_UrlStream();
urlStream.url = metamodel.externalSource.url;
connection.externalSource = urlStream;
return connection;
}
return undefined;
},
];
}
V1_getExtraConnectionProtocolSerializers() {
return [
(connectionProtocol) => {
if (connectionProtocol instanceof V1_ExternalFormatConnection) {
return serialize(V1_externalFormatConnectionModelSchema, connectionProtocol);
}
return undefined;
},
];
}
V1_getExtraConnectionProtocolDeserializers() {
return [
(json) => {
if (json._type === V1_EXTERNAL_FORMAT_CONNECTION_ELEMENT_PROTOCOL_TYPE) {
return deserialize(V1_externalFormatConnectionModelSchema, json);
}
return undefined;
},
];
}
}
//# sourceMappingURL=DSL_ExternalFormat_PureProtocolProcessorPlugin.js.map