diff --git a/org.eclipse.winery.frontends/app/topologymodeler/src/app/canvas/canvas.component.ts b/org.eclipse.winery.frontends/app/topologymodeler/src/app/canvas/canvas.component.ts index 6520f1983d..0d70a40d0c 100644 --- a/org.eclipse.winery.frontends/app/topologymodeler/src/app/canvas/canvas.component.ts +++ b/org.eclipse.winery.frontends/app/topologymodeler/src/app/canvas/canvas.component.ts @@ -43,7 +43,6 @@ import { align, toggleModalType } from '../models/enums'; import { QName } from '../models/qname'; import { ImportTopologyModalData } from '../models/importTopologyModalData'; import { ImportTopologyService } from '../services/import-topology.service'; -import { ReqCapService } from '../services/req-cap.service'; import { SplitMatchTopologyService } from '../services/split-match-topology.service'; import { PlaceComponentsService } from '../services/placement.service'; import { DifferenceStates, VersionUtils } from '../models/ToscaDiff'; @@ -56,6 +55,8 @@ import { TopologyTemplateUtil } from '../models/topologyTemplateUtil'; import { ReqCapRelationshipService } from '../services/req-cap-relationship.service'; import { TPolicy } from '../models/policiesModalData'; import { WineryRepositoryConfigurationService } from '../../../../tosca-management/src/app/wineryFeatureToggleModule/WineryRepositoryConfiguration.service'; +import { RequirementDefinitionModel } from '../models/requirementDefinitonModel'; +import { CapabilityDefinitionModel } from '../models/capabilityDefinitionModel'; @Component({ selector: 'winery-canvas', @@ -161,7 +162,6 @@ export class CanvasComponent implements OnInit, OnDestroy, OnChanges, AfterViewI private existsService: ExistsService, private splitMatchService: SplitMatchTopologyService, private placementService: PlaceComponentsService, - private reqCapService: ReqCapService, private errorHandler: ErrorHandlerService, private reqCapRelationshipService: ReqCapRelationshipService, private notify: ToastrService, @@ -372,14 +372,14 @@ export class CanvasComponent implements OnInit, OnDestroy, OnChanges, AfterViewI try { // request all valid requirement types for that node type for display as name select options in // the modal - this.reqCapService.requestRequirementDefinitionsOfNodeType(currentNodeData.type).subscribe(data => { - this.requirements.reqDefinitionNames = []; - this.requirements.reqDefinitionName = ''; - for (const reqType of data) { - const qNameOfType = new QName(reqType.requirementType); - this.requirements.reqDefinitionNames.push(qNameOfType.localName); - } - }); + const data = this.getRequirementDefinitionsOfNodeType(currentNodeData.type); + this.requirements.reqDefinitionNames = []; + this.requirements.reqDefinitionName = ''; + + for (const reqType of data) { + const qNameOfType = new QName(reqType.requirementType); + this.requirements.reqDefinitionNames.push(qNameOfType.localName); + } } catch (e) { this.requirements.requirements = ''; } @@ -454,14 +454,15 @@ export class CanvasComponent implements OnInit, OnDestroy, OnChanges, AfterViewI try { // request all valid capability types for that node type for display as name select options in // the modal - this.reqCapService.requestCapabilityDefinitionsOfNodeType(currentNodeData.type).subscribe(data => { - this.capabilities.capDefinitionNames = []; - this.capabilities.capDefinitionName = ''; - for (const capType of data) { - const qNameOfType = new QName(capType.capabilityType); - this.capabilities.capDefinitionNames.push(qNameOfType.localName); - } - }); + const data = this.getCapabilityDefinitionsOfNodeType(currentNodeData.type); + console.debug(currentNodeData); + this.capabilities.capDefinitionNames = []; + this.capabilities.capDefinitionName = ''; + for (const capType of data) { + const qNameOfType = new QName(capType.capabilityType); + this.capabilities.capDefinitionNames.push(qNameOfType.localName); + } + } catch (e) { this.capabilities.capabilities = ''; } @@ -471,6 +472,45 @@ export class CanvasComponent implements OnInit, OnDestroy, OnChanges, AfterViewI } } + getCapabilityDefinitionsOfNodeType(nodeType: string): CapabilityDefinitionModel[] { + const match = this.entityTypes.unGroupedNodeTypes + .filter(nt => nt.qName === nodeType) + .filter(nt => + nt.full && + nt.full.serviceTemplateOrNodeTypeOrNodeTypeImplementation && + nt.full.serviceTemplateOrNodeTypeOrNodeTypeImplementation.length > 0 && + nt.full.serviceTemplateOrNodeTypeOrNodeTypeImplementation[0].capabilityDefinitions && + nt.full.serviceTemplateOrNodeTypeOrNodeTypeImplementation[0].capabilityDefinitions.capabilityDefinition && + nt.full.serviceTemplateOrNodeTypeOrNodeTypeImplementation[0].capabilityDefinitions.capabilityDefinition.length > 0 + ); + + if (match && match.length > 0) { + return match[0].full.serviceTemplateOrNodeTypeOrNodeTypeImplementation[0].capabilityDefinitions.capabilityDefinition; + } + + return []; + } + + getRequirementDefinitionsOfNodeType(nodeType: string): RequirementDefinitionModel[] { + const match = this.entityTypes.unGroupedNodeTypes + .filter(nt => nt.qName === nodeType) + .filter(nt => + nt.full && + nt.full.serviceTemplateOrNodeTypeOrNodeTypeImplementation && + nt.full.serviceTemplateOrNodeTypeOrNodeTypeImplementation.length > 0 && + nt.full.serviceTemplateOrNodeTypeOrNodeTypeImplementation[0].requirementDefinitions && + nt.full.serviceTemplateOrNodeTypeOrNodeTypeImplementation[0].requirementDefinitions.requirementDefinition && + nt.full.serviceTemplateOrNodeTypeOrNodeTypeImplementation[0].requirementDefinitions.requirementDefinition.length > 0 + ); + + if (match && match.length > 0) { + return match[0].full.serviceTemplateOrNodeTypeOrNodeTypeImplementation[0].requirementDefinitions.requirementDefinition; + } + + return []; + + } + /** * This function sets the capability default KV properties */ @@ -1808,15 +1848,16 @@ export class CanvasComponent implements OnInit, OnDestroy, OnChanges, AfterViewI // if in YAML mode, automatically add all requirement and capability definitions to the node template! if (this.configuration.isYaml()) { - this.reqCapService.requestRequirementDefinitionsOfNodeType(this.newNode.type).subscribe(data => { - this.newNode.requirements = { requirement: [] }; - data.forEach(def => this.newNode.requirements.requirement.push(RequirementModel.fromRequirementDefinition(def))); - }); - - this.reqCapService.requestCapabilityDefinitionsOfNodeType(this.newNode.type).subscribe(data => { - this.newNode.capabilities = { capability: [] }; - data.forEach(def => this.newNode.capabilities.capability.push(CapabilityModel.fromCapabilityDefinitionModel(def))); - }); + this.newNode.requirements = { requirement: [] }; + this.newNode.capabilities = { capability: [] }; + const reqData = this.getRequirementDefinitionsOfNodeType(this.newNode.type); + if (reqData) { + reqData.forEach(reqDef => this.newNode.requirements.requirement.push(RequirementModel.fromRequirementDefinition(reqDef))); + } + const capData = this.getCapabilityDefinitionsOfNodeType(this.newNode.type); + if (capData) { + capData.forEach(capDef => this.newNode.capabilities.capability.push(CapabilityModel.fromCapabilityDefinitionModel(capDef))); + } } } diff --git a/org.eclipse.winery.frontends/app/topologymodeler/src/app/models/requirementModel.ts b/org.eclipse.winery.frontends/app/topologymodeler/src/app/models/requirementModel.ts index 5ddb5d00c8..1fead77f2d 100644 --- a/org.eclipse.winery.frontends/app/topologymodeler/src/app/models/requirementModel.ts +++ b/org.eclipse.winery.frontends/app/topologymodeler/src/app/models/requirementModel.ts @@ -28,6 +28,9 @@ export class RequirementModel { public capability?: string; public node?: string; public relationship?: string; + public capabilityType?: string; + public relationshipType?: string; + public nodeType?: string; static fromRequirementDefinition(def: RequirementDefinitionModel): RequirementModel { const result = new RequirementModel(); @@ -36,9 +39,9 @@ export class RequirementModel { result.name = def.name; result.otherAttributes = def.otherAttributes; result.type = def.requirementType; - result.capability = def.capability; - result.node = def.node; - result.relationship = def.relationship; + result.capabilityType = def.capability; + result.nodeType = def.node; + result.relationshipType = def.relationship; return result; } diff --git a/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/requirements/requirements.component.html b/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/requirements/requirements.component.html index 121a5ad0d4..b8eea5ed3d 100644 --- a/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/requirements/requirements.component.html +++ b/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/requirements/requirements.component.html @@ -12,7 +12,7 @@ * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 --> -
+
-
+
No requirements defined
for this Node Template.
-
- Add new Requirement +
+
+ Add new Requirement +
diff --git a/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/toscatype-table/toscatype-table.component.css b/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/toscatype-table/toscatype-table.component.css index ba7304112e..33c4617286 100644 --- a/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/toscatype-table/toscatype-table.component.css +++ b/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/toscatype-table/toscatype-table.component.css @@ -23,7 +23,7 @@ table { th { background-color: #CFD8DC; color: #000; - text-align: center; + text-align: left; } th, td { @@ -31,6 +31,7 @@ th, td { border-left: 0; border-right: 0; border-bottom: 1px solid #ddd; + padding-left: 2px; } tr { diff --git a/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/toscatype-table/toscatype-table.component.html b/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/toscatype-table/toscatype-table.component.html index a0119205e1..e38f258a92 100644 --- a/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/toscatype-table/toscatype-table.component.html +++ b/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/toscatype-table/toscatype-table.component.html @@ -70,51 +70,121 @@ - - - - - - - - - - - - - - - - - + + +
EndpointIdName
- - -
{{ reqOrCap.type | localname }}
- {{ reqOrCap.type | localname }} -
-
{{ reqOrCap.id }}
- {{ reqOrCap.name }} -
-
{{ reqOrCap.name }}
- {{ reqOrCap.name }} -
-
+ + + + + + + + + + + + + + + + + + - - -
EndpointIdName
+ + +
{{ reqOrCap.type | localname }}
+ {{ reqOrCap.type | localname }} +
+
{{ reqOrCap.id }}
+ {{ reqOrCap.name }} +
+
{{ reqOrCap.name }}
+ {{ reqOrCap.name }} +
+
-
- +
+ +
-
-
+
+ +
+ + + + + + + + + + + + + + + + +
NameFulfilled by RelationshipPossible Relationships
+
{{ req.name }}
+
{{req.relationship}} N/A +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + +
NameTypeActions
+ + +
{{ cap.name }}
+
+
{{ cap.type | localname }}
+ {{ cap.type }} +
Action
+
+
+ diff --git a/org.eclipse.winery.frontends/app/topologymodeler/src/app/services/req-cap.service.ts b/org.eclipse.winery.frontends/app/topologymodeler/src/app/services/req-cap.service.ts deleted file mode 100644 index f8f8d0b557..0000000000 --- a/org.eclipse.winery.frontends/app/topologymodeler/src/app/services/req-cap.service.ts +++ /dev/null @@ -1,65 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2018 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0, or the Apache Software License 2.0 - * which is available at https://www.apache.org/licenses/LICENSE-2.0. - * - * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 - *******************************************************************************/ - -import { Injectable } from '@angular/core'; -import { definitionType, urlElement } from '../models/enums'; -import { QName } from '../models/qname'; -import { Observable } from 'rxjs/Rx'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { BackendService } from './backend.service'; -import { RequirementDefinitionModel } from '../models/requirementDefinitonModel'; -import { CapabilityDefinitionModel } from '../models/capabilityDefinitionModel'; - -@Injectable() -export class ReqCapService { - // Logic for fetching the requirement, capability definitions of a node type - readonly options = { - headers: new HttpHeaders({ - 'Accept': 'application/json' - }) - }; - - constructor(private http: HttpClient, private backendService: BackendService) { - } - - /** - * Requests all requirement definitions of a node type from the backend - * @param nodeType - the node type of the node template - * @returns - */ - requestRequirementDefinitionsOfNodeType(nodeType: string): Observable { - const qName = new QName(nodeType); - const url = this.backendService.configuration.repositoryURL - + urlElement.NodeTypeURL - + encodeURIComponent(encodeURIComponent(qName.nameSpace)) - + '/' + qName.localName - + definitionType.RequirementDefinitions; - return this.http.get(url, this.options); - } - - /** - * Requests all capability definitions of a node type from the backend - * @param nodeType - the node type of the node template - * @returns - */ - requestCapabilityDefinitionsOfNodeType(nodeType: string): Observable { - const qName = new QName(nodeType); - const url = this.backendService.configuration.repositoryURL - + urlElement.NodeTypeURL - + encodeURIComponent(encodeURIComponent(qName.nameSpace)) + '/' - + qName.localName - + definitionType.CapabilityDefinitions; - return this.http.get(url, this.options); - } -} diff --git a/org.eclipse.winery.frontends/app/topologymodeler/src/app/winery.module.ts b/org.eclipse.winery.frontends/app/topologymodeler/src/app/winery.module.ts index 1b20afefa4..22f262264b 100644 --- a/org.eclipse.winery.frontends/app/topologymodeler/src/app/winery.module.ts +++ b/org.eclipse.winery.frontends/app/topologymodeler/src/app/winery.module.ts @@ -39,7 +39,6 @@ import { TypeaheadModule } from 'ngx-bootstrap/typeahead'; import { ExistsService } from './services/exists.service'; import { EntitiesModalService } from './canvas/entities-modal/entities-modal.service'; import { ImportTopologyService } from './services/import-topology.service'; -import { ReqCapService } from './services/req-cap.service'; import { SplitMatchTopologyService } from './services/split-match-topology.service'; import { ErrorHandlerService } from './services/error-handler.service'; import { PopoverModule } from 'ngx-bootstrap/popover'; @@ -101,7 +100,6 @@ import { ReqCapRelationshipService } from './services/req-cap-relationship.servi ExistsService, EntitiesModalService, ImportTopologyService, - ReqCapService, SplitMatchTopologyService, ErrorHandlerService, StatefulAnnotationsService,