Beispiel #1
0
        public void Analyze()
        {
            try
            {
                bool success = _repository.OpenFile(_analyzerSettings.InputFilename);
                if (success)
                {
                    _elementCount = 0;
                    for (short index = 0; index < _repository.Models.Count; index++)
                    {
                        EA.Package model = (EA.Package)_repository.Models.GetAt(index);
                        FindPackageElements(model);
                    }
                    UpdateElementProgress(true);

                    _relationCount = 0;
                    for (short index = 0; index < _repository.Models.Count; index++)
                    {
                        EA.Package model = (EA.Package)_repository.Models.GetAt(index);
                        FindPackageRelations(model);
                    }
                    UpdateRelationProgress(true);

                    _repository.CloseFile();
                }

                _repository.Exit();
            }
            catch (Exception e)
            {
                Logger.LogException($"Reading EA model failed file={_analyzerSettings.InputFilename}", e);
            }
            AnalyzerLogger.Flush();
        }
Beispiel #2
0
        private void AddProjectFile(string guid, string solutionFolder, string relativeProjectFilename)
        {
            string solutionDir             = _solutionFileInfo.DirectoryName;
            string absoluteProjectFilename = ResolvePath(solutionDir, relativeProjectFilename);

            if (absoluteProjectFilename != null)
            {
                FileInfo projectFileInfo = new FileInfo(absoluteProjectFilename);
                if (projectFileInfo.Exists)
                {
                    if (absoluteProjectFilename.EndsWith("vcxproj"))
                    {
                        ProjectFile projectFile = new ProjectFile(solutionFolder, solutionDir, absoluteProjectFilename, _analyzerSettings);
                        _projects[guid] = projectFile;
                    }
                    else
                    {
                        Logger.LogInfo("File ignored " + absoluteProjectFilename);
                    }
                }
                else
                {
                    AnalyzerLogger.LogErrorFileNotFound(absoluteProjectFilename, _solutionFileInfo.FullName);
                }
            }
            else
            {
                AnalyzerLogger.LogErrorPathNotResolved(relativeProjectFilename, _solutionFileInfo.FullName);
            }
        }
Beispiel #3
0
        public void Analyze()
        {
            int      lineNumber = 0;
            FileInfo dotFile    = new FileInfo(_analyzerSettings.InputFilename);

            using (FileStream stream = dotFile.Open(FileMode.Open))
            {
                StreamReader sr = new StreamReader(stream);
                string       line;
                while ((line = sr.ReadLine()) != null)
                {
                    lineNumber++;
                    UpdateLineProgress(lineNumber, false);

                    if (line.Contains("->"))
                    {
                        string[] items = line.Split('"');
                        if (items.Length == 5)
                        {
                            string consumer = ReplaceNestedClassMarker(items[1]);
                            string provider = ReplaceNestedClassMarker(RemoveTrailingText(items[3]));

                            RegisterRelation(consumer, provider);
                        }
                    }
                }
            }
            UpdateLineProgress(lineNumber, true);
            AnalyzerLogger.Flush();
        }
Beispiel #4
0
 public void Analyze()
 {
     FindAssemblies();
     FindTypes();
     FindRelations();
     AnalyzerLogger.Flush();
 }
Beispiel #5
0
 public void Analyze()
 {
     FindSourceFiles();
     AnalyzeSourceFiles();
     RegisterSourceFiles();
     RegisterDirectIncludeRelations();
     AnalyzerLogger.Flush();
 }
Beispiel #6
0
        public void SkipRelation(string consumerName, string providerName, string type, string context)
        {
            Logger.LogDataModelMessage("Skip relation consumerName={consumerName} providerName={providerName} type={type} weight={weight}");

            AnalyzerLogger.LogDataModelRelationNotResolved(consumerName, providerName);

            _relationCount++;
        }
Beispiel #7
0
 public void Analyze()
 {
     RegisterInterfaceFiles();
     AnalyzeSolution();
     RegisterSourceFiles();
     RegisterDirectIncludeRelations();
     RegisterGeneratedFileRelations();
     AnalyzerLogger.Flush();
 }
Beispiel #8
0
        private void RegisterRelation(IDsiElement consumer, IDsiElement provider)
        {
            if (consumer != null && provider != null)
            {
                string type = "transitive";
                _model.AddRelation(consumer.Name, provider.Name, type, 1, "transformer");

                string description = "consumer=" + consumer.Name + " provider=" + provider.Name;
                AnalyzerLogger.LogTransformation(ActionName, description);
            }
        }
Beispiel #9
0
 private void RegisterSourceFile(SourceFile sourceFile)
 {
     if (sourceFile.FileInfo.Exists)
     {
         string name = ExtractSourceFileUniqueName(sourceFile.Name);
         string type = sourceFile.Extension;
         _model.AddElement(name, type, sourceFile.FileInfo.FullName);
     }
     else
     {
         AnalyzerLogger.LogErrorFileNotFound(sourceFile.Name, "source directory");
     }
 }
Beispiel #10
0
        private void Move(IDsiElement element, string identifier)
        {
            string from = "." + identifier + ".";
            string to   = ".";

            if (element.Name.Contains(from))
            {
                string elementName    = element.Name;
                string newElementName = identifier + "." + element.Name.ReplaceIgnoreCase(from, to);

                _model.RenameElement(element, newElementName);

                string description = elementName + "->" + newElementName;
                AnalyzerLogger.LogTransformation(ActionName, description);
            }
        }
Beispiel #11
0
        private void MoveElement(IDsiElement element)
        {
            foreach (MoveElementRule rule in _transformationRules)
            {
                if (element.Name.Contains(rule.From))
                {
                    string elementName    = element.Name;
                    string newElementName = element.Name.ReplaceIgnoreCase(rule.From, rule.To);

                    _model.RenameElement(element, newElementName);

                    string description = elementName + "->" + newElementName;
                    AnalyzerLogger.LogTransformation(ActionName, description);
                }
            }
        }
Beispiel #12
0
        public void Transform()
        {
            List <Action> actions = new List <Action>
            {
                new IncludeFilterAction(_model, _transformerSettings.IncludeFilterSettings, _progress),
                new MoveHeaderElementsAction(_model, _transformerSettings.MoveHeaderElementsSettings.Enabled, _progress),
                new MoveElementsAction(_model, _transformerSettings.MoveElementsSettings, _progress),
                new AddTransitiveRelationsAction(_model, _transformerSettings.AddTransitiveRelationsSettings.Enabled, _progress),
                new SplitProductAndTestElementsAction(_model, _transformerSettings.SplitProductAndTestElementsSettings, _progress)
            };

            foreach (Action action in actions)
            {
                _model.AddMetaData(action.Name, action.IsEnabled ? "Enabled" : "Disabled");
                action.Execute();
            }

            AnalyzerLogger.Flush();
        }
Beispiel #13
0
 private void AddHeaderFile(ProjectItem projectItem)
 {
     try
     {
         string   projectFolder = _filterFile.GetSourceFileProjectFolder(projectItem.EvaluatedInclude);
         FileInfo fileInfo      = new FileInfo(GetAbsolutePath(_projectFileInfo.DirectoryName, projectItem.EvaluatedInclude));
         if (fileInfo.Exists)
         {
             AddSourceFile(fileInfo, projectFolder);
         }
         else
         {
             AnalyzerLogger.LogErrorFileNotFound(fileInfo.FullName, _projectFileInfo.Name);
         }
     }
     catch (Exception e)
     {
         Logger.LogException($"Add  header file failed project={_projectFileInfo.FullName} file={projectItem.EvaluatedInclude}", e);
     }
 }
Beispiel #14
0
        public IDsiRelation ImportRelation(int consumerId, int providerId, string type, int weight)
        {
            Logger.LogDataModelMessage("Import relation consumerId={consumerId} providerId={providerId} type={type} weight={weight}");

            _relationCount++;

            DsiRelation relation = null;

            IDsiElement consumer = _elementsDataModel.FindElementById(consumerId);
            IDsiElement provider = _elementsDataModel.FindElementById(providerId);

            if ((consumer != null) && (provider != null))
            {
                relation = AddOrUpdateRelation(consumer.Id, provider.Id, type, weight);
            }
            else
            {
                AnalyzerLogger.LogDataModelRelationNotResolved(consumerId.ToString(), providerId.ToString());
            }
            return(relation);
        }
Beispiel #15
0
        public string Resolve(string sourceFile, string relativeIncludeFilename)
        {
            string resolvedIncludeFilename = null;

            try
            {
                if (File.Exists(relativeIncludeFilename))
                {
                    // The include path is an absolute path, so no resolving is required
                    resolvedIncludeFilename = relativeIncludeFilename;
                }
                else
                {
                    //Like Visual Studio look for headers in this order:
                    // -In the current source directory.
                    // -In the Additional Include Directories in the project properties(under C++ | General).
                    // -In the Visual Studio C++ Include directories under Tools → Options → Projects and Solutions → VC++ Directories.
                    string sourceDirectory = Path.GetDirectoryName(sourceFile);
                    if (sourceDirectory != null)
                    {
                        ResolveUsingIncludeDirectory(relativeIncludeFilename, sourceDirectory, ref resolvedIncludeFilename);
                        ResolveUsingIncludeDirectories(relativeIncludeFilename, _projectIncludeDirectories, false, ref resolvedIncludeFilename);
                        ResolveUsingIncludeDirectories(relativeIncludeFilename, _interfaceIncludeDirectories, true, ref resolvedIncludeFilename);
                        ResolveUsingIncludeDirectories(relativeIncludeFilename, _externalIncludeDirectories, true, ref resolvedIncludeFilename);
                        ResolveUsingIncludeDirectories(relativeIncludeFilename, _systemIncludeDirectories, true, ref resolvedIncludeFilename);
                    }
                }
            }
            catch (Exception e)
            {
                Logger.LogException($"Resolve failed include={relativeIncludeFilename}", e);
            }

            if (resolvedIncludeFilename == null)
            {
                AnalyzerLogger.LogErrorIncludeFileNotFound(relativeIncludeFilename, sourceFile);
            }

            return(resolvedIncludeFilename);
        }
Beispiel #16
0
        public IDsiRelation AddRelation(string consumerName, string providerName, string type, int weight, string context)
        {
            Logger.LogDataModelMessage("Add relation consumerName={consumerName} providerName={providerName} type={type} weight={weight}");

            DsiRelation relation = null;

            _relationCount++;

            IDsiElement consumer = _elementsDataModel.FindElementByName(consumerName);
            IDsiElement provider = _elementsDataModel.FindElementByName(providerName);

            if ((consumer != null) && (provider != null))
            {
                relation = AddOrUpdateRelation(consumer.Id, provider.Id, type, weight);
            }
            else
            {
                AnalyzerLogger.LogDataModelRelationNotResolved(consumerName, providerName);
            }

            return(relation);
        }
Beispiel #17
0
        private void RegisterSourceFile(SolutionFile solutionFile, ProjectFile visualStudioProject, SourceFile sourceFile)
        {
            Logger.LogInfo("Source file registered: " + sourceFile.Name);

            string type = sourceFile.FileType;

            _sourcesFilesById[sourceFile.Id] = sourceFile.SourceFileInfo;

            if (sourceFile.SourceFileInfo.Exists)
            {
                switch (_analyzerSettings.ViewMode)
                {
                case ViewMode.LogicalView:
                {
                    string name = GetLogicalName(solutionFile, visualStudioProject, sourceFile);
                    _model.AddElement(name, type, sourceFile.SourceFileInfo.FullName);
                    break;
                }

                case ViewMode.PhysicalView:
                {
                    string name = GetPhysicalName(sourceFile);
                    _model.AddElement(name, type, sourceFile.SourceFileInfo.FullName);
                    break;
                }

                default:
                    Logger.LogError("Unknown view mode");
                    break;
                }
            }
            else
            {
                AnalyzerLogger.LogErrorFileNotFound(sourceFile.Name, visualStudioProject.ProjectName);
            }
        }
Beispiel #18
0
        private void DefineProjectIncludeDirectories(Project evaluatedProject)
        {
            AddIncludeDirectory(_projectFileInfo.DirectoryName, _projectFileInfo.DirectoryName);

            foreach (ProjectItemDefinition projectItem in evaluatedProject.ItemDefinitions.Values)
            {
                foreach (ProjectMetadata metaData in projectItem.Metadata)
                {
                    if (metaData.Name == "AdditionalIncludeDirectories")
                    {
                        string[] includeDirectories = metaData.EvaluatedValue.Trim(';').Split(';');

                        foreach (string includeDirectory in includeDirectories)
                        {
                            string trimmedIncludeDirectory = includeDirectory.Trim().Replace(@"\r\n", ""); // To fix occasional prefixes

                            if (trimmedIncludeDirectory.Length > 0)
                            {
                                try
                                {
                                    string resolvedIncludeDirectory = Path.GetFullPath(trimmedIncludeDirectory);

                                    if (Directory.Exists(resolvedIncludeDirectory)) // Is existing absolute include path
                                    {
                                        AddIncludeDirectory(resolvedIncludeDirectory, includeDirectory);
                                    }
                                    else
                                    {
                                        resolvedIncludeDirectory = GetAbsolutePath(_projectFileInfo.DirectoryName, trimmedIncludeDirectory);

                                        if (Directory.Exists(resolvedIncludeDirectory)) // Is existing resolved relative include path
                                        {
                                            AddIncludeDirectory(resolvedIncludeDirectory, includeDirectory);
                                        }
                                        else
                                        {
                                            AnalyzerLogger.LogErrorIncludePathNotFound(resolvedIncludeDirectory, evaluatedProject.FullPath);
                                        }
                                    }
                                }
                                catch (Exception)
                                {
                                    AnalyzerLogger.LogErrorPathNotResolved(includeDirectory, evaluatedProject.FullPath);
                                }
                            }
                        }
                    }
                }
            }

            List <string> externalIncludeDirectories = new List <string>();

            foreach (ExternalIncludeDirectory externalIncludeDirectory in _analyzerSettings.ExternalIncludeDirectories)
            {
                if (Directory.Exists(externalIncludeDirectory.Path))
                {
                    externalIncludeDirectories.Add(externalIncludeDirectory.Path);
                }
                else
                {
                    AnalyzerLogger.LogErrorIncludePathNotFound(externalIncludeDirectory.Path, evaluatedProject.FullPath);
                }
            }

            List <string> interfaceIncludeDirectories = new List <string>();

            foreach (string interfaceIncludeDirectory in _analyzerSettings.InterfaceIncludeDirectories)
            {
                if (Directory.Exists(interfaceIncludeDirectory))
                {
                    interfaceIncludeDirectories.Add(interfaceIncludeDirectory);
                }
                else
                {
                    AnalyzerLogger.LogErrorIncludePathNotFound(interfaceIncludeDirectory, evaluatedProject.FullPath);
                }
            }

            _includeResolveStrategy = new IncludeResolveStrategy(_includeDirectories, interfaceIncludeDirectories, externalIncludeDirectories, _analyzerSettings.SystemIncludeDirectories);
        }