/// <summary> /// Fin de traitement d'un elément /// </summary> /// <param name="item">The item.</param> public void ExitElement(ReferenceItem item) { if (item.Element is CandleModel) { _modelsStack.Pop(); } else if (item.Element is DataLayer) { DataLayer modelsLayer = item.Element as DataLayer; CandleModel model = modelsLayer.Component.Model; if (model.Id != _initialModelId) { _modelsStack.Pop(); } } else if (item.Element is SoftwareLayer || item.Element is DotNetAssembly) { _projectPath.Pop(); } }
/// <summary> /// Récupération des configurations lorsqu'on rencontre un modèle sauf pour le modèle initial. /// </summary> /// <param name="item">The item.</param> /// <returns></returns> bool IReferenceVisitor.Accept(ReferenceItem item) { if (item.Element is CandleModel) { CandleModel model = item.Element as CandleModel; if (model == null) { return(false); } ComponentSig key = new ComponentSig(model.Id, model.Version); // Si dèja vu, on arrete if (_models.ContainsKey(key)) { return(false); } // On ne prend jamais la config du modèle initial if (_includeInitialModelConfigurations || _models.Count > 0) { if (model.IsLibrary && model.SoftwareComponent != null) { foreach (SoftwareLayer asm in model.SoftwareComponent.Layers) { RetrieveConfigurations(asm); } } else if (model.BinaryComponent != null) { foreach (DotNetAssembly asm in model.BinaryComponent.Assemblies) { RetrieveConfigurations(asm); } } } _models.Add(key, null); } return(true); }
/// <summary> /// Exits the element. /// </summary> /// <param name="item">The item.</param> void IReferenceVisitor.ExitElement(ReferenceItem item) { }
/// <summary> /// Accepts the specified item. /// </summary> /// <param name="item">The item.</param> /// <returns></returns> bool IReferenceVisitor.Accept(ReferenceItem item) { if (item.Element is DataLayer) { if (item.Source is DataLayer) { RelationShip relation; relation.Source = ((DataLayer)item.Source).Component.Model; relation.Target = ((DataLayer)item.Element).Component.Model; ; relation.Type = RelationShip.RelationType.Composants; relation.Scope = item.Scope; relation.TargetAsString = String.Empty; if (!RelationExists(relation)) { _relations.Add(relation); } // On n'empile pas le modèle sur le contexte car une couche modèle ne peut avoir que des références sur d'autres modèles // et on a pas besoin de contexte pour calculer la relation } } if (item.Element is CandleModel) { CandleModel model = item.Element as CandleModel; if (model == null) { return(false); } if (_context.Count > 0) { RelationShip relation; relation.Source = _context.Peek(); relation.Target = model; relation.Type = RelationShip.RelationType.Composants; relation.Scope = item.Scope; relation.TargetAsString = String.Empty; if (!RelationExists(relation)) { _relations.Add(relation); } } else { //modele initial RelationShip rel; rel.Type = RelationShip.RelationType.Framework; rel.Source = model; rel.Target = null; rel.TargetAsString = model.DotNetFrameworkVersion.ToString(); rel.Scope = item.Scope; _relations.Add(rel); } // Si dèja vu, on arrete ModelKey key = new ModelKey(model.Id, model.Version); if (_models.Exists(delegate(ModelKey k) { return(key.GetHashCode() == k.GetHashCode()); })) { return(false); } _models.Add(key); // Liste des modèles dèja traités _context.Push(model); } return(true); }
/// <summary> /// Accepts the specified item. /// </summary> /// <param name="item">The item.</param> /// <returns></returns> public bool Accept(ReferenceItem item) { if (item.Element is DataLayer) { DataLayer modelsLayer = item.Element as DataLayer; // Verification si ce système n'a pas dèjà été vu (pour éviter les boucles) if (_checkedModels.Contains(item.Element.Id)) { return(false); } _checkedModels.Add(item.Element.Id); // On accepte aussi le modèle de la couche (si il n'a pas dèjà été vu par ailleurs) if (!_models.Contains(modelsLayer.Component.Model)) { AcceptModel(modelsLayer.Component.Model, _initialModelId == Guid.Empty); } CandleModel model = modelsLayer.Component.Model; if (model.Id != _initialModelId) { _modelsStack.Push(model); } } if (item.Element is CandleModel) { // Verification si ce système n'a pas dèjà été vu (pour éviter les boucles) if (_checkedModels.Contains(item.Element.Id)) { return(false); } if (!_models.Contains((CandleModel)item.Element)) { AcceptModel((CandleModel)item.Element, _initialModelId == Guid.Empty); } if (_initialModelId == Guid.Empty) { _initialModelId = item.Element.Id; } _checkedModels.Add(item.Element.Id); _modelsStack.Push(item.Element as CandleModel); return(true); } // Toujours devant if (item.Element is SoftwareLayer) { // Calcul du répertoire du projet courant string currentProjectPath = CurrentModelPath; if (_initialModelIsInSolution && !IsExternalModel) { currentProjectPath = Path.Combine(currentProjectPath, ((SoftwareLayer)item.Element).VSProjectName); } _projectPath.Push(currentProjectPath); } if (item.Element is InterfaceLayer) { InterfaceLayer ilayer = item.Element as InterfaceLayer; if (_scope == ReferenceScope.Compilation && IsExternalModel == false) { _references.Add(ilayer.VSProjectName); } else { AddFullNameAssembly(ilayer, ".dll"); } } else if (item.Element is SoftwareLayer) { AcceptSoftwareLayer(item.Element as SoftwareLayer); } else if (item.Element is DotNetAssembly) { AcceptDotNetAssembly(item.Element as DotNetAssembly); } else if (item.Element is Artifact) { AcceptArtifact(item.Element as Artifact); } return(true); }