Fix Security Vulnerabilities
[sdc.git] / catalog-ui / src / app / models / components / component.ts
index 0c47cc4..f787142 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
 
 'use strict';
 
+import * as _ from "lodash";
 import {AsdcComment, ArtifactModel, ArtifactGroupModel, IFileDownload, PropertyModel, PropertiesGroup, AttributeModel, AttributesGroup, ComponentInstance,
     InputModel, DisplayModule, Module, IValidate, RelationshipModel, IMainCategory, RequirementsGroup, CapabilitiesGroup, AdditionalInformationModel,
-    Resource, IAppMenu, Product, Service} from "../../models";
+    Resource, IAppMenu, OperationModel, Service} from "../../models";
 
 import {IComponentService} from "../../services/components/component-service";
 import {CommonUtils} from "../../utils/common-utils";
 import {QueueUtils} from "../../utils/functions";
 import {ArtifactGroupType} from "../../utils/constants";
 import {ComponentMetadata} from "../component-metadata";
+import {Capability} from "../capability";
+import {Requirement} from "../requirement";
+import {Relationship} from "../graph/relationship";
+import { PolicyInstance } from "app/models/graph/zones/policy-instance";
+import { GroupInstance } from "../graph/zones/group-instance";
+import { Metadata } from "app/models/metadata";
+
 
 // import {}
 export interface IComponent {
@@ -41,62 +49,33 @@ export interface IComponent {
     createComponentOnServer():ng.IPromise<Component>;
     changeLifecycleState(state:string, commentObj:AsdcComment):ng.IPromise<Component>;
     validateName(newName:string):ng.IPromise<IValidate>;
-    updateRequirementsCapabilities():ng.IPromise<any>;
 
     //Artifacts API
     addOrUpdateArtifact(artifact:ArtifactModel):ng.IPromise<ArtifactModel>;
-    updateMultipleArtifacts(artifacts:Array<ArtifactModel>):ng.IPromise<any>;
     deleteArtifact(artifactId:string, artifactLabel:string):ng.IPromise<ArtifactModel>;
     downloadInstanceArtifact(artifactId:string):ng.IPromise<IFileDownload>;
     downloadArtifact(artifactId:string):ng.IPromise<IFileDownload>;
-    getArtifactByGroupType(artifactGroupType:string):ng.IPromise<ArtifactGroupModel>;
-
 
     //Property API
     addOrUpdateProperty(property:PropertyModel):ng.IPromise<PropertyModel>;
     deleteProperty(propertyId:string):ng.IPromise<PropertyModel>;
-    updateInstanceProperty(property:PropertyModel):ng.IPromise<PropertyModel>;
 
     //Attribute API
     deleteAttribute(attributeId:string):ng.IPromise<AttributeModel>;
     addOrUpdateAttribute(attribute:AttributeModel):ng.IPromise<AttributeModel>;
-    updateInstanceAttribute(attribute:AttributeModel):ng.IPromise<AttributeModel>;
-
-
-
-
-    //Component Instance API
-    createComponentInstance(componentInstance:ComponentInstance):ng.IPromise<ComponentInstance>;
-    deleteComponentInstance(componentInstanceId:string):ng.IPromise<ComponentInstance>;
-    addOrUpdateInstanceArtifact(artifact:ArtifactModel):ng.IPromise<ArtifactModel>;
-    deleteInstanceArtifact(artifactId:string, artifactLabel:string):ng.IPromise<ArtifactModel>;
-    uploadInstanceEnvFile(artifact:ArtifactModel):ng.IPromise<ArtifactModel>;
-    changeComponentInstanceVersion(componentUid:string):ng.IPromise<Component>;
-    updateComponentInstance(componentInstance:ComponentInstance):ng.IPromise<ComponentInstance>;
-    updateMultipleComponentInstances(instances:Array<ComponentInstance>):ng.IPromise<Array<ComponentInstance>>;
-
-    //Inputs API
-    getComponentInstanceInputProperties(componentInstanceId:string, inputId:string):ng.IPromise<Array<PropertyModel>>
-    getComponentInstanceProperties(componentInstanceId:string):ng.IPromise<Array<PropertyModel>>
-    getComponentInputs(componentId:string):ng.IPromise<Array<InputModel>>;
-
-    createRelation(link:RelationshipModel):ng.IPromise<RelationshipModel>;
-    deleteRelation(link:RelationshipModel):ng.IPromise<RelationshipModel>;
-
 
     //Modules
     getModuleForDisplay(moduleId:string):ng.IPromise<DisplayModule>;
     getModuleInstanceForDisplay(componentInstanceId:string, moduleId:string):ng.IPromise<DisplayModule>;
     updateGroupMetadata(group:Module):ng.IPromise<Module>;
+
     //---------------------------------------------- HELP FUNCTIONS ----------------------------------------------------//
 
     getComponentSubType():string;
     isAlreadyCertified():boolean;
-    isProduct():boolean;
     isService():boolean;
     isResource():boolean;
     isComplex():boolean;
-    getAdditionalInformation():Array<AdditionalInformationModel>;
     getAllVersionsAsSortedArray():Array<any>;
     getStatus(sdcMenu:IAppMenu):string;
 }
@@ -127,8 +106,11 @@ export abstract class Component implements IComponent {
     public deploymentArtifacts:ArtifactGroupModel;
     public artifacts:ArtifactGroupModel;
     public toscaArtifacts:ArtifactGroupModel;
+    public interfaceOperations:Array<OperationModel>;
     public distributionStatus:string;
     public categories:Array<IMainCategory>;
+    public categoryNormalizedName: string;
+    public subCategoryNormalizedName: string;
     public componentInstancesProperties:PropertiesGroup;
     public componentInstancesAttributes:AttributesGroup;
     public componentInstancesRelations:Array<RelationshipModel>;
@@ -146,8 +128,9 @@ export abstract class Component implements IComponent {
     public interfaces:any;
     public normalizedName:string;
     public systemName:string;
-    public projectCode:string;
-    public groups:Array<Module>;
+    public policies:Array<PolicyInstance>;
+    public groupInstances:Array<GroupInstance>
+    public modules:Array<Module>;
     //custom properties
     public componentService:IComponentService;
     public filterTerm:string;
@@ -157,7 +140,10 @@ export abstract class Component implements IComponent {
     public subCategory:string;
     public selectedCategory:string;
     public showMenu:boolean;
-
+    public archived:boolean;
+    public vspArchived: boolean;
+    public componentMetadata: ComponentMetadata;
+    public categorySpecificMetadata: Metadata = new Metadata();
 
     constructor(componentService:IComponentService, protected $q:ng.IQService, component?:Component) {
         if (component) {
@@ -168,8 +154,11 @@ export abstract class Component implements IComponent {
             this.additionalInformation = component.additionalInformation;
             this.artifacts = new ArtifactGroupModel(component.artifacts);
             this.toscaArtifacts = new ArtifactGroupModel(component.toscaArtifacts);
+            this.interfaceOperations = component.interfaceOperations;
             this.contactId = component.contactId;
             this.categories = component.categories;
+            this.categoryNormalizedName = component.categoryNormalizedName;
+            this.subCategoryNormalizedName = component.subCategoryNormalizedName;
             this.creatorUserId = component.creatorUserId;
             this.creationDate = component.creationDate;
             this.creatorFullName = component.creatorFullName;
@@ -199,7 +188,6 @@ export abstract class Component implements IComponent {
             this.interfaces = component.interfaces;
             this.normalizedName = component.normalizedName;
             this.systemName = component.systemName;
-            this.projectCode = component.projectCode;
             this.inputs = component.inputs;
             this.componentInstances = CommonUtils.initComponentInstances(component.componentInstances);
             this.properties = CommonUtils.initProperties(component.properties, this.uniqueId);
@@ -207,25 +195,48 @@ export abstract class Component implements IComponent {
             this.selectedInstance = component.selectedInstance;
             this.iconSprite = component.iconSprite;
             this.showMenu = true;
-            this.groups = CommonUtils.initModules(component.groups);
+            this.modules = component.modules;
+            this.groupInstances = component.groupInstances;
+            this.policies = component.policies;
+            this.archived = component.archived;
+            this.vspArchived = component.vspArchived;
+
+            if (component.categorySpecificMetadata && component.categories && component.categories[0]){
+                this.copyCategoryMetadata(component);
+                this.copySubcategoryMetadata(component);
+            }
         }
 
         //custom properties
         this.componentService = componentService;
     }
 
+    private copyCategoryMetadata = (component:Component):void => {
+        if (component.categories[0].metadataKeys){
+            for (let key of Object.keys(component.categorySpecificMetadata)) {
+                if (component.categories[0].metadataKeys.some(metadataKey => metadataKey.name == key)) {
+                    this.categorySpecificMetadata[key] = component.categorySpecificMetadata[key];
+                }
+            }
+        }
+    }
+    private copySubcategoryMetadata = (component:Component):void => {
+        if (component.categories[0].subcategories && component.categories[0].subcategories[0] && component.categories[0].subcategories[0].metadataKeys){
+            for (let key of Object.keys(component.categorySpecificMetadata)) {
+                if (component.categories[0].subcategories[0].metadataKeys.some(metadataKey => metadataKey.name == key)) {
+                    this.categorySpecificMetadata[key] = component.categorySpecificMetadata[key];
+                }
+            }
+        }
+    }
+
     public setUniqueId = (uniqueId:string):void => {
         this.uniqueId = uniqueId;
     };
 
-    public setSelectedInstance = (componentInstance:ComponentInstance):void => {
-        this.selectedInstance = componentInstance;
-    };
-
-
     //------------------------------------------ API Calls ----------------------------------------------------------------//
     public changeLifecycleState = (state:string, commentObj:AsdcComment):ng.IPromise<Component> => {
-        let deferred = this.$q.defer();
+        let deferred = this.$q.defer<Component>();
         let onSuccess = (componentMetadata:ComponentMetadata):void => {
             this.setComponentMetadata(componentMetadata);
             // this.version = componentMetadata.version;
@@ -236,7 +247,7 @@ export abstract class Component implements IComponent {
         let onError = (error:any):void => {
             deferred.reject(error);
         };
-        this.componentService.changeLifecycleState(this, state, JSON.stringify(commentObj)).then(onSuccess, onError);
+        this.componentService.changeLifecycleState(this, state, commentObj).then(onSuccess, onError);
         return deferred.promise;
     };
 
@@ -248,6 +259,11 @@ export abstract class Component implements IComponent {
         this.handleTags();
         return this.componentService.createComponent(this);
     };
+    
+    public importComponentOnServer = (): ng.IPromise<Component> => {
+        this.handleTags();
+        return this.componentService.importComponent(this);
+    };
 
     public updateComponent = ():ng.IPromise<Component> => {
         this.handleTags();
@@ -258,12 +274,16 @@ export abstract class Component implements IComponent {
         return this.componentService.validateName(newName, subtype);
     };
 
-    public downloadArtifact = (artifactId:string):ng.IPromise<IFileDownload> => {
-        return this.componentService.downloadArtifact(this.uniqueId, artifactId);
+    public downloadArtifact = (artifactId: string): ng.IPromise<IFileDownload> => {
+        if(this.vendorName === 'IsService'){
+            return this.componentService.downloadArtifact(this.uniqueId, artifactId, this.vendorName);
+        }else{
+            return this.componentService.downloadArtifact(this.uniqueId, artifactId);
+        }
     };
 
     public addOrUpdateArtifact = (artifact:ArtifactModel):ng.IPromise<ArtifactModel> => {
-        let deferred = this.$q.defer();
+        let deferred = this.$q.defer<ArtifactModel>();
         let onSuccess = (artifactObj:ArtifactModel):void => {
             let newArtifact = new ArtifactModel(artifactObj);
             let artifacts = this.getArtifactsByType(artifactObj.artifactGroupType);
@@ -277,25 +297,8 @@ export abstract class Component implements IComponent {
         return deferred.promise;
     };
 
-    public updateMultipleArtifacts = (artifacts:Array<ArtifactModel>):ng.IPromise<any>=> {
-        let deferred = this.$q.defer();
-        let onSuccess = (response:any):void => {
-            deferred.resolve(response);
-        };
-        let onError = (error:any):void => {
-            deferred.reject(error);
-        };
-        let q = new QueueUtils(this.$q);
-
-        _.forEach(artifacts, (artifact)=> {
-            q.addBlockingUIAction(()=> this.addOrUpdateArtifact(artifact).then(onSuccess, onError));
-        });
-        return deferred.promise;
-    };
-
-
     public deleteArtifact = (artifactId:string, artifactLabel:string):ng.IPromise<ArtifactModel> => {
-        let deferred = this.$q.defer();
+        let deferred = this.$q.defer<ArtifactModel>();
         let onSuccess = (artifactObj:ArtifactModel):void => {
             let newArtifact = new ArtifactModel(artifactObj);
             let artifacts = this.getArtifactsByType(artifactObj.artifactGroupType);
@@ -311,34 +314,8 @@ export abstract class Component implements IComponent {
         return deferred.promise;
     };
 
-    public getArtifactByGroupType = (artifactGroupType:string):ng.IPromise<ArtifactGroupModel> => {
-
-        let deferred = this.$q.defer();
-        let onSuccess = (response:ArtifactGroupModel):void => {
-            deferred.resolve(response);
-        };
-        let onFailed = (error:any):void => {
-            deferred.reject(error);
-        };
-        this.componentService.getArtifactByGroupType(this.uniqueId, artifactGroupType).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
-    public getComponentInstanceArtifactsByGroupType = (componentInstanceId:string, artifactGroupType:string):ng.IPromise<ArtifactGroupModel> => {
-
-        let deferred = this.$q.defer();
-        let onSuccess = (response:ArtifactGroupModel):void => {
-            deferred.resolve(response);
-        };
-        let onFailed = (error:any):void => {
-            deferred.reject(error);
-        };
-        this.componentService.getComponentInstanceArtifactsByGroupType(this.uniqueId, componentInstanceId, artifactGroupType).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
     public addOrUpdateProperty = (property:PropertyModel):ng.IPromise<PropertyModel> => {
-        let deferred = this.$q.defer();
+        let deferred = this.$q.defer<PropertyModel>();
 
         let onError = (error:any):void => {
             deferred.reject(error);
@@ -357,7 +334,6 @@ export abstract class Component implements IComponent {
                 // find exist instance property in parent component for update the new value ( find bu uniqueId )
                 let existProperty:PropertyModel = <PropertyModel>_.find(this.properties, {uniqueId: newProperty.uniqueId});
                 let propertyIndex = this.properties.indexOf(existProperty);
-                newProperty.readonly = this.uniqueId != newProperty.parentUniqueId;
                 this.properties[propertyIndex] = newProperty;
                 deferred.resolve(newProperty);
             };
@@ -367,7 +343,7 @@ export abstract class Component implements IComponent {
     };
 
     public addOrUpdateAttribute = (attribute:AttributeModel):ng.IPromise<AttributeModel> => {
-        let deferred = this.$q.defer();
+        let deferred = this.$q.defer<AttributeModel>();
 
         let onError = (error:any):void => {
             deferred.reject(error);
@@ -395,7 +371,7 @@ export abstract class Component implements IComponent {
     };
 
     public deleteProperty = (propertyId:string):ng.IPromise<PropertyModel> => {
-        let deferred = this.$q.defer();
+        let deferred = this.$q.defer<PropertyModel>();
         let onSuccess = ():void => {
             console.log("Property deleted");
             delete _.remove(this.properties, {uniqueId: propertyId})[0];
@@ -410,7 +386,7 @@ export abstract class Component implements IComponent {
     };
 
     public deleteAttribute = (attributeId:string):ng.IPromise<AttributeModel> => {
-        let deferred = this.$q.defer();
+        let deferred = this.$q.defer<AttributeModel>();
         let onSuccess = ():void => {
             console.log("Attribute deleted");
             delete _.remove(this.attributes, {uniqueId: attributeId})[0];
@@ -422,257 +398,13 @@ export abstract class Component implements IComponent {
         return deferred.promise;
     };
 
-    public updateInstanceProperty = (property:PropertyModel):ng.IPromise<PropertyModel> => {
-        let deferred = this.$q.defer();
-        let onSuccess = (newProperty:PropertyModel):void => {
-            // find exist instance property in parent component for update the new value ( find bu uniqueId & path)
-            let existProperty:PropertyModel = <PropertyModel>_.find(this.componentInstancesProperties[newProperty.resourceInstanceUniqueId], {
-                uniqueId: newProperty.uniqueId,
-                path: newProperty.path
-            });
-            let index = this.componentInstancesProperties[newProperty.resourceInstanceUniqueId].indexOf(existProperty);
-            this.componentInstancesProperties[newProperty.resourceInstanceUniqueId][index] = newProperty;
-            deferred.resolve(newProperty);
-        };
-        let onFailed = (error:any):void => {
-            console.log('Failed to update property value');
-            deferred.reject(error);
-        };
-        this.componentService.updateInstanceProperty(this.uniqueId, property).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
-    public updateInstanceAttribute = (attribute:AttributeModel):ng.IPromise<AttributeModel> => {
-        let deferred = this.$q.defer();
-        let onSuccess = (newAttribute:AttributeModel):void => {
-            let existAttribute:AttributeModel = <AttributeModel>_.find(this.componentInstancesAttributes[newAttribute.resourceInstanceUniqueId], {uniqueId: newAttribute.uniqueId});
-            let index = this.componentInstancesAttributes[newAttribute.resourceInstanceUniqueId].indexOf(existAttribute);
-            this.componentInstancesAttributes[newAttribute.resourceInstanceUniqueId][index] = newAttribute;
-            deferred.resolve(newAttribute);
-        };
-        let onFailed = (error:any):void => {
-            console.log('Failed to update attribute value');
-            deferred.reject(error);
-        };
-        this.componentService.updateInstanceAttribute(this.uniqueId, attribute).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
     public downloadInstanceArtifact = (artifactId:string):ng.IPromise<IFileDownload> => {
         return this.componentService.downloadInstanceArtifact(this.uniqueId, this.selectedInstance.uniqueId, artifactId);
     };
 
-    public deleteInstanceArtifact = (artifactId:string, artifactLabel:string):ng.IPromise<ArtifactModel> => {
-        let deferred = this.$q.defer();
-        let onSuccess = (artifactObj:ArtifactModel):void => {
-            let newArtifact = new ArtifactModel(artifactObj);
-            let artifacts = this.selectedInstance.deploymentArtifacts;
-            if (newArtifact.mandatory || newArtifact.serviceApi) {//?????????
-                artifacts[newArtifact.artifactLabel] = newArtifact;
-            }
-            else {
-                delete artifacts[artifactLabel];
-            }
-            deferred.resolve(newArtifact);
-        };
-        this.componentService.deleteInstanceArtifact(this.uniqueId, this.selectedInstance.uniqueId, artifactId, artifactLabel).then(onSuccess);
-        return deferred.promise;
-    };
-
-    public addOrUpdateInstanceArtifact = (artifact:ArtifactModel):ng.IPromise<ArtifactModel> => {
-        let deferred = this.$q.defer();
-        let onSuccess = (artifactObj:ArtifactModel):void => {
-            switch (artifactObj.artifactGroupType) {
-                case ArtifactGroupType.DEPLOYMENT:
-                    this.selectedInstance.deploymentArtifacts[artifactObj.artifactLabel] = artifactObj;
-                    break;
-                case ArtifactGroupType.INFORMATION:
-                    this.selectedInstance.artifacts[artifactObj.artifactLabel] = artifactObj;
-                    break;
-            }
-            deferred.resolve(artifactObj);
-        };
-        let onError = (error:any):void => {
-            deferred.reject(error);
-        };
-        if (artifact.uniqueId) {
-            this.componentService.updateInstanceArtifact(this.uniqueId, this.selectedInstance.uniqueId, artifact).then(onSuccess, onError);
-        } else {
-            this.componentService.addInstanceArtifact(this.uniqueId, this.selectedInstance.uniqueId, artifact).then(onSuccess, onError);
-        }
-        return deferred.promise;
-    };
-
-    public uploadInstanceEnvFile = (artifact:ArtifactModel):ng.IPromise<ArtifactModel> => {
-        let deferred = this.$q.defer();
-        let onSuccess = (artifactObj:ArtifactModel):void => {
-            this.selectedInstance.deploymentArtifacts[artifactObj.artifactLabel] = artifactObj;
-            deferred.resolve(artifactObj);
-        };
-        let onError = (error:any):void => {
-            deferred.reject(error);
-        };
-        this.componentService.uploadInstanceEnvFile(this.uniqueId, this.selectedInstance.uniqueId, artifact).then(onSuccess, onError);
-        return deferred.promise;
-    };
-
-    //this function will update the instance version than the function call getComponent to update the current component and return the new instance version
-    public changeComponentInstanceVersion = (componentUid:string):ng.IPromise<Component> => {
-        let deferred = this.$q.defer();
-        let onFailed = (error:any):void => {
-            deferred.reject(error);
-        };
-        let onSuccess = (componentInstance:ComponentInstance):void => {
-            let onSuccess = (component:Component):void => {
-                component.setSelectedInstance(componentInstance);
-                deferred.resolve(component);
-            };
-            this.getComponent().then(onSuccess, onFailed);
-        };
-        this.componentService.changeResourceInstanceVersion(this.uniqueId, this.selectedInstance.uniqueId, componentUid).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
-    public createComponentInstance = (componentInstance:ComponentInstance):ng.IPromise<ComponentInstance> => {
-        let deferred = this.$q.defer();
-        let onSuccess = (instance:ComponentInstance):void => {
-            this.componentInstances.push(instance);
-            deferred.resolve(instance);
-        };
-        let onFailed = (error:any):void => {
-            deferred.reject(error);
-        };
-        this.componentService.createComponentInstance(this.uniqueId, componentInstance).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
-    public updateComponentInstance = (componentInstance:ComponentInstance):ng.IPromise<ComponentInstance> => {
-        let deferred = this.$q.defer();
-        let onSuccess = (updatedInstance:ComponentInstance):void => {
-            let componentInstance:ComponentInstance = _.find(this.componentInstances, (instance:ComponentInstance) => {
-                return instance.uniqueId === updatedInstance.uniqueId;
-            });
-
-            let index = this.componentInstances.indexOf(componentInstance);
-            this.componentInstances[index] = componentInstance;
-            deferred.resolve(updatedInstance);
-
-        };
-        let onFailed = (error:any):void => {
-            deferred.reject(error);
-        };
-        this.componentService.updateComponentInstance(this.uniqueId, componentInstance).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
-    public updateMultipleComponentInstances = (instances:Array<ComponentInstance>):ng.IPromise<Array<ComponentInstance>> => {
-        let deferred = this.$q.defer();
-        let onSuccess = (updatedInstances:Array<ComponentInstance>):void => {
-            _.forEach(updatedInstances, (updatedComponentInstance) => {
-                let componentInstance:ComponentInstance = _.find(this.componentInstances, (instance:ComponentInstance) => {
-                    return instance.uniqueId === updatedComponentInstance.uniqueId;
-                });
-
-                let index = this.componentInstances.indexOf(componentInstance);
-                this.componentInstances[index] = componentInstance;
-
-            });
-            deferred.resolve(updatedInstances);
-
-        };
-        let onFailed = (error:any):void => {
-            deferred.reject(error);
-        };
-        this.componentService.updateMultipleComponentInstances(this.uniqueId, instances).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
-    public deleteComponentInstance = (componentInstanceId:string):ng.IPromise<ComponentInstance> => {
-        let deferred = this.$q.defer();
-        let onSuccess = ():void => {
-            let onSuccess = (component:Component):void => {
-                this.componentInstances = CommonUtils.initComponentInstances(component.componentInstances);
-                this.componentInstancesProperties = new PropertiesGroup(component.componentInstancesProperties);
-                this.componentInstancesAttributes = new AttributesGroup(component.componentInstancesAttributes);
-                this.groups = component.groups;
-                this.componentInstancesRelations = CommonUtils.initComponentInstanceRelations(component.componentInstancesRelations);
-                deferred.resolve();
-            };
-            this.getComponent().then(onSuccess);
-        };
-        let onFailed = (error:any):void => {
-            deferred.reject(error);
-        };
-        this.componentService.deleteComponentInstance(this.uniqueId, componentInstanceId).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
-
-    public createRelation = (relation:RelationshipModel):ng.IPromise<RelationshipModel> => {
-        let deferred = this.$q.defer();
-        let onSuccess = (relation:RelationshipModel):void => {
-            console.info('Link created successfully', relation);
-            if (!this.componentInstancesRelations) {
-                this.componentInstancesRelations = [];
-            }
-            this.componentInstancesRelations.push(new RelationshipModel(relation));
-            deferred.resolve(relation);
-        };
-        let onFailed = (error:any):void => {
-            console.info('Failed to create relation', error);
-            deferred.reject(error);
-        };
-        this.componentService.createRelation(this.uniqueId, relation).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
-    public deleteRelation = (relation:RelationshipModel):ng.IPromise<RelationshipModel> => {
-        let deferred = this.$q.defer();
-        let onSuccess = (responseRelation:RelationshipModel):void => {
-            console.log("Link Deleted In Server");
-            let relationToDelete = _.find(this.componentInstancesRelations, (item) => {
-                return item.fromNode === relation.fromNode && item.toNode === relation.toNode && _.some(item.relationships, (relationship)=> {
-                        return angular.equals(relation.relationships[0], relationship);
-                    });
-            });
-            let index = this.componentInstancesRelations.indexOf(relationToDelete);
-            if (relationToDelete != undefined && index > -1) {
-                if (relationToDelete.relationships.length == 1) {
-                    this.componentInstancesRelations.splice(index, 1);
-                } else {
-                    this.componentInstancesRelations[index].relationships =
-                        _.reject(this.componentInstancesRelations[index].relationships, relation.relationships[0]);
-                }
-            } else {
-                console.error("Error while deleting relation - the return delete relation from server was not found in UI")
-            }
-            deferred.resolve(relation);
-        };
-        let onFailed = (error:any):void => {
-            console.error("Failed To Delete Link");
-            deferred.reject(error);
-        };
-        this.componentService.deleteRelation(this.uniqueId, relation).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
-    public updateRequirementsCapabilities = ():ng.IPromise<any> => {
-        let deferred = this.$q.defer();
-        let onSuccess = (response:any):void => {
-            this.capabilities = response.capabilities;
-            this.requirements = response.requirements;
-            deferred.resolve(response);
-        };
-        let onFailed = (error:any):void => {
-            deferred.reject(error);
-        };
-        this.componentService.getRequirementsCapabilities(this.uniqueId).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
     public getModuleForDisplay = (moduleId:string):ng.IPromise<DisplayModule> => {
 
-        let deferred = this.$q.defer();
+        let deferred = this.$q.defer<DisplayModule>();
         let onSuccess = (response:DisplayModule):void => {
             deferred.resolve(response);
         };
@@ -685,7 +417,7 @@ export abstract class Component implements IComponent {
 
     public getModuleInstanceForDisplay = (componentInstanceId:string, moduleId:string):ng.IPromise<DisplayModule> => {
 
-        let deferred = this.$q.defer();
+        let deferred = this.$q.defer<DisplayModule>();
         let onSuccess = (response:DisplayModule):void => {
             deferred.resolve(response);
         };
@@ -696,93 +428,17 @@ export abstract class Component implements IComponent {
         return deferred.promise;
     };
 
-
-    // this function get all instances filtered by inputs and properties (optional) - if no search string insert - this function will
-    // get all the instances of the component (in service only VF instances)
-    public getComponentInstancesFilteredByInputsAndProperties = (searchText?:string):ng.IPromise<Array<ComponentInstance>> => {
-
-        let deferred = this.$q.defer();
-        let onSuccess = (response:Array<ComponentInstance>):void => {
-            deferred.resolve(response);
-        };
-        let onFailed = (error:any):void => {
-            deferred.reject(error);
-        };
-        this.componentService.getComponentInstancesFilteredByInputsAndProperties(this.uniqueId, searchText).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
-
-    // get inputs for instance - Pagination function
-    public getComponentInputs = ():ng.IPromise<Array<InputModel>> => {
-
-        let deferred = this.$q.defer();
-        let onSuccess = (inputsRes:Array<InputModel>):void => {
-            this.inputs = inputsRes;
-            deferred.resolve(inputsRes);
-        };
-        let onFailed = (error:any):void => {
-            deferred.reject(error);
-        };
-        this.componentService.getComponentInputs(this.uniqueId).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
-
-    // get inputs instance - Pagination function
-    public getComponentInstanceInputs = (componentInstanceId:string, originComponentUid:string):ng.IPromise<Array<InputModel>> => {
-
-        let deferred = this.$q.defer();
-        let onSuccess = (response:Array<InputModel>):void => {
-            deferred.resolve(response);
-        };
-        let onFailed = (error:any):void => {
-            deferred.reject(error);
-        };
-        this.componentService.getComponentInstanceInputs(this.uniqueId, componentInstanceId, originComponentUid).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
-    // get inputs inatnce - Pagination function
-    public getComponentInstanceInputProperties = (componentInstanceId:string, inputId:string):ng.IPromise<Array<PropertyModel>> => {
-
-        let deferred = this.$q.defer();
-        let onSuccess = (response:Array<PropertyModel>):void => {
-            deferred.resolve(response);
-        };
-        let onFailed = (error:any):void => {
-            deferred.reject(error);
-        };
-        this.componentService.getComponentInstanceInputProperties(this.uniqueId, componentInstanceId, inputId).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
-    // get inputs inatnce - Pagination function
-    public getComponentInstanceProperties = (componentInstanceId:string):ng.IPromise<Array<PropertyModel>> => {
-
-        let deferred = this.$q.defer();
-        let onSuccess = (response:Array<PropertyModel>):void => {
-            deferred.resolve(response);
-        };
-        let onFailed = (error:any):void => {
-            deferred.reject(error);
-        };
-        this.componentService.getComponentInstanceProperties(this.uniqueId, componentInstanceId).then(onSuccess, onFailed);
-        return deferred.promise;
-    };
-
-
     public updateGroupMetadata = (module:Module):ng.IPromise<Module> => {
 
-        let deferred = this.$q.defer();
+        let deferred = this.$q.defer<Module>();
 
         let onSuccess = (updatedModule:Module):void => {
-            let groupIndex:number = _.indexOf(this.groups, _.find(this.groups, (module:Module) => {
+            let groupIndex:number = _.indexOf(this.modules, _.find(this.modules, (module:Module) => {
                 return module.uniqueId === updatedModule.uniqueId;
             }));
 
             if (groupIndex !== -1) {
-                this.groups[groupIndex] = updatedModule;
+                this.modules[groupIndex] = updatedModule;
             }
             deferred.resolve(updatedModule);
         };
@@ -797,10 +453,6 @@ export abstract class Component implements IComponent {
 
     //------------------------------------------ Help Functions ----------------------------------------------------------------//
 
-    public isProduct = ():boolean => {
-        return this instanceof Product;
-    };
-
     public isService = ():boolean => {
         return this instanceof Service;
     };
@@ -855,15 +507,6 @@ export abstract class Component implements IComponent {
 
     };
 
-    public getAdditionalInformation = ():Array<AdditionalInformationModel> => {
-        let additionalInformationObject:any = _.find(this.additionalInformation, (obj:any):boolean => {
-            return obj.parentUniqueId == this.uniqueId;
-        });
-        if (additionalInformationObject) {
-            return additionalInformationObject.parameters;
-        }
-        return [];
-    };
 
     public handleTags = ():void => {
         let isContainTag = _.find(this.tags, (tag)=> {
@@ -922,22 +565,32 @@ export abstract class Component implements IComponent {
         this.derivedList = componentMetadata.derivedList;
         this.normalizedName = componentMetadata.normalizedName;
         this.systemName = componentMetadata.systemName;
-        this.projectCode = componentMetadata.projectCode;
         this.categories = componentMetadata.categories;
-
+        this.archived = componentMetadata.archived || false;
+        this.vspArchived = componentMetadata.vspArchived;
+        this.componentMetadata = componentMetadata;
+        if (componentMetadata.categorySpecificMetadata){
+            this.categorySpecificMetadata = componentMetadata.categorySpecificMetadata;
+        } else {
+            this.categorySpecificMetadata = new Metadata();
+        }
     }
 
     public toJSON = ():any => {
-        this.componentService = undefined;
-        this.filterTerm = undefined;
-        this.iconSprite = undefined;
-        this.mainCategory = undefined;
-        this.subCategory = undefined;
-        this.selectedInstance = undefined;
-        this.showMenu = undefined;
-        this.$q = undefined;
-        this.selectedCategory = undefined;
-        return this;
+        let temp = angular.copy(this);
+        temp.componentService = undefined;
+        temp.filterTerm = undefined;
+        temp.iconSprite = undefined;
+        temp.mainCategory = undefined;
+        temp.subCategory = undefined;
+        temp.selectedInstance = undefined;
+        temp.showMenu = undefined;
+        temp.$q = undefined;
+        temp.selectedCategory = undefined;
+        temp.modules = undefined
+        temp.groupInstances = undefined;
+        temp.policies = undefined;
+        return temp;
     };
 }