Skip to main content

Model Validation

Overview

This is a tutorial on performing model validation using NDCLI.
Develop a command line extension to output the model validation results to standard output when the command is executed from NDCLI.

  • Implement the following validations:
  • Model validation
  • Feature validation
  • Configuration validation
  • Specify the following options to execute the command:
  • "--projectPath" or "-p": Specifies the path to the project file to validate. This option is required.
  • "--model" or "-m": Specify true to perform model validation.
  • "--feature" or "-f": Specify true to perform feature validation.
  • "--configuration" or "-c": Specify true to perform configuration validation.
    Command Example
ndcli ModelValidate --projectPath "{project file storage path}\Advanced Driving System Software Development.nproj" --model true --feature true --configuration true

Overall Flow

  • Preparing the Command Line Extension
  • Implementing Command Processing
  • Deploying to the Execution Environment
  • Executing the Command Line Extension

Public Sample

  • The source code created as a result of this tutorial and the project files required to execute the commands are available on GitHub.

    External link: Model Validation

Goal Image

  • When you run the model validation command line extension from NDCLI, the following message is output.
> ndcli ModelValidate --projectPath "{project file storage path}\Advanced Driving System Software Development.nproj" --model true --feature true --configuration true
NextDesign.ModelValidate
Project : {project file storage path}\Advanced Driving System Software Development.nproj
Model : Yes
FeatureModels : Yes
Configuration : Yes

Model(2)
[Warning](Multiplicity Constraint): The operand of the composite fragment (Interaction) violates the multiplicity limit of 1.
[Warning](Product Line): The feature name is not unique. Change the name or specify a unique name.

FeatureModels(1)
[Warning](Product Line): There are no selectable alternative features defined.

Configuration(1)
[Error](Product Line): "Feature" is a logical OR feature. Please select at least one logical OR feature at the same level.

Preparing the Command Line Extension

The following steps explain how to create a new command line extension project in Visual Studio and prepare a debugging environment for the command line extension.

  • Creating a new project in Visual Studio
  • Installing the NuGet package for command line extension development
  • Creating a new class

This section explains the procedure for Visual Studio 2022 (VS).

Creating a new project in VS

This is similar to the Hello World example. See there.

ItemValue
Project NameModelValidationCliExtensionSample
LocationOptional parent folder for storing the entire project
Solution NameModelValidationCliExtensionSample
Framework.NET Standard 2.0
Notes

Installing Packages

Similar to the Hello World section. See there.

Build Settings

This is the same as the Hello World section. Please refer to the relevant section.

Creating a New Class

This is the same as the Hello World section. Please refer to the relevant section.

  • Class Name: ModelValidationCliExtensionSample

Implementing Command Processing

To implement the command line extension entry point and model validation processing, implement the following in the class created in Create a New Class.

  • Declares the namespace of the API to reference.
  • A class that inherits the ExtensionBase class, which serves as the entry point.
  • Model validation command options.
  • Command handler for model validation.

Implementation Example

ModelValidationCliExtensionSample.cs

using NextDesign.Cli.ExtensionFramework;
using DensoCreate.Cli.Framework;
using NextDesign.Core.Runtime;
using NextDesign.Core;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace ModelValidate.CliExtension
{
///<summary>
///An extension that provides model validation.
///</summary>
public class ModelValidateExtension : ExtensionBase
{
///<summary>
///Constructor
///</summary>
public ModelValidateExtension()
: base("NextDesign.ModelValidate")
{
}
}

///<summary>
///Model validation command
///</summary>
public class ModelValidateCommand : Command
{
///<summary>
///Constructor
///</summary>
public ModelValidateCommand()
: base("ModelValidate", new string[] { "MV", "mv" }, "Command to perform model validation")
{
//Command option definition
//Define using the DensoCreate.Cli.Framework.CommandBase.AddOption<T>() method.
//<T>: Option type
//First argument: Array of option names and aliases (e.g., "--projectPath", "-p")
//Second argument: Option description (for displaying help information)
//Third argument: Required option (true: required, false: optional)
//ExistingOnly(): For FileInfo types, checks whether the specified file exists.
AddOption<FileInfo>(new string[] { "--projectPath", "-p" }, "Project file path", true).ExistingOnly();
AddOption<bool>(new string[] { "--doModelValidate", "--model", "-m" }, "Perform model validation");
AddOption<bool>(new string[] { "--doFeatureValidate", "--feature", "-f" }, "Perform feature validation");
AddOption<bool>(new string[] { "--doConfigurationValidate", "--configuration", "-c" }, "Perform configuration validation");

//Register the command handler
RegisterHandler(nameof(OnExecute));
}

///<summary>
///Execute the command handler
///</summary>
///<param name="projectPath">Project file path</param>
///<param name="doModelValidate"></param>
///<param name="doFeatureValidate"></param>
///<param name="doConfigurationValidate"></param>
private void OnExecute(FileInfo projectPath, bool doModelValidate = false, bool doFeatureValidate = false, bool doConfigurationValidate = false)
{
Console.WriteLine($"{Extension.Name}");
Console.WriteLine($" Project : {projectPath}");
Console.WriteLine($" Model : {(doModelValidate ? "Yes" : "Skip")}");
Console.WriteLine($" Feature : {(doFeatureValidate ? "Yes" : "Skip")}");
Console.WriteLine($" Configuration : {(doConfigurationValidate ? "Yes" : "Skip")}"); Console.WriteLine("");

// Open the project
// Get the NextDesign.Core.Runtime.IProjectService service
// using the DensoCreate.Cli.Framework.ExtensionBase.GetService<T>() method,
// and open the project using the IProjectService.OpenProject() method.
var projectService = GetService<IProjectService>();
var project = projectService.OpenProject(projectPath.FullName);

if (doModelValidate)
{
project.Validate();
var errors = project.GetAllErrorsWithChildren();
OutputErrors("Model", errors);
}

if (doFeatureValidate)
{
var fms = project.ProductLineModel.FeatureModels;
foreach (var fm in fms) fm.Validate();
var errors = fms.SelectMany(fm => fm.GetAllErrorsWithChildren());
OutputErrors("FeatureModels", errors);
}

if (doConfigurationValidate)
{
project.ProductLineModel.ConfigurationModel.Validate();
var errors = project.ProductLineModel.ConfigurationModel.GetAllErrorsWithChildren(); OutputErrors("Configuration", errors);
}
}

private void OutputErrors(string name, IEnumerable<IError> errors)
{
Console.WriteLine($"{name}({errors.Count()})");
foreach (var error in errors.Take(10))
{
Console.WriteLine($" [{error.Type}]({error.Category}) : {error.Message}");
}

if (errors.Count() > 10)
{
Console.WriteLine(" :");
}

Console.WriteLine("");
}
}
}

Deploying to the Execution Environment

The set of files output to the publish folder as a build result is stored in the following folder.

  • Windows version:
    "%HOMEPATH%\AppData\Local\DENSO CREATE\Next Design CLI\extensions\ModelValidation\"
  • Linux version:
    "$HOME/.local/share/DENSO CREATE/Next Design CLI/extensions/ModelValidation/"

Running the command line extension

Execute the following command from the command prompt to output the model validation results to standard output.

  • Example command with all options specified
ndcli ModelValidate --projectPath "{project file path}\Advanced Driving System Software Development.nproj" --model --feature --configuration
  • Example command with feature and configuration validation specified
ndcli ModelValidate --projectPath "{project file path}\Advanced Driving System Software Development.nproj" --feature --configuration
note

License registration is required to run the command line extension. See the following page for details.