Usage
Executing Solicitor
Solicitor is a standalone Java (Spring Boot) application. Prerequisite for running it is an existing Java 8 or 11 runtime environment. If you do not yet have a the Solicitor executable JAR (solicitor.jar
) you need to build it as given on the project GitHub homepage https://github.com/devonfw/solicitor .
Solicitor is executed with the following command:
java -jar solicitor.jar -c <configfile>
where <configfile>
is to be replaced by the location of the Project Configuration File.
To get a first idea on what Solicitor does you might call
java -jar solicitor.jar -c classpath:samples/solicitor_sample.cfg
This executes Solicitor with default configuration on it own list of internal components and produces sample output.
To get an overview of the available command line options use
java -jar solicitor.jar -h
Project Configuration File
The project configuration of Solicitor is done via a configuration file in JSON format. This configuration file defines the engagements and applications master data, configures the readers for importing component and license information, references the business rules to be applied and defines the exports to be done.
The config file has the following skeleton:
{ "version" : 1, "comment" : "Sample Solicitor configuration file", "engagementName" : "devonfw", (1) . . . "applications" : [ ... ], (2) "rules" : [ ... ], (3) "writers" : [ ... ], (4) "additionalWriters" : [ ...] (5) }
1 | The leading data defines the engagement master data, see Header and Engagement Master Data |
2 | applications defines the applications within the engagement and configures the readers to import the component/license information, see Applications |
3 | rules references the rules to apply to the imported data, see Business Rules |
4 | writers configures how the processed data should be exported, see Writers and Reporting |
5 | additionalWriters defines optional additional project specific writers without overwriting already defined writers, see Writers and Reporting |
The following section describes all sections of the Solicitor configuration file format. Often the configuration of writers and especially rules will be identical for projects. To facilitate the project specific configuration setup Solicitor internally provides a base configuration which contains reasonable defaults for the rules and writers section. If the project specific configuration file omits the rules and/or writers sections then the corresponding settings from the base configuration will be taken. For details see Default Base Configuration.
|
If locations of files are specified within the configuration files as relative
pathnames then this is always evaluated relative to the current working directory (which
might differ from the location of the configuration file). If some file location
should be given relative to the location of the configuration file this might be done
using the special placeholder ${cfgdir} as described in the following.
|
Placeholders within the configuration file
Within certain parts of the configuration file (path and filenames) special placeholders might be used to parameterize the configuration. These areas are explicitly marked in the following description.
These placeholders are available:
-
${project}
- A simplified project name (taking the engagement name, removing all non-word characters and converting to lowercase). -
${cfgdir}
- If the config file was loaded from the filesystem this denotes the directory where the config file resides,.
otherwise. This can be used to reference locations relative to the location of the config file.
Header and Engagement Master Data
The leading section of the config file defines some metadata and the engagement master data.
"version" : 1, (1) "comment" : "Sample Solicitor configuration file", (2) "engagementName" : "devonfw", (3) "engagementType" : "INTERN", (4) "clientName" : "none", (5) "goToMarketModel" : "LICENSE", (6) "contractAllowsOss" : true, (7) "ossPolicyFollowed" : true, (8) "customerProvidesOss" : false, (9)
1 | version of the config file format (currently needs to be 1) |
2 | is a free text comment (no further function at the moment) |
3 | the engagement name (any string) |
4 | the engagement type; possible values: INTERN, EXTERN |
5 | name of the client (any string) |
6 | the go-to-market-model; possible values: LICENSE |
7 | does the contract explicitly allow OSS? (boolean) |
8 | is the companies OSS policy followed? (boolean) |
9 | does the customer provide the OSS? (boolean) |
Applications
Within this section the different applications (=deliverables) of the engagement are defined. Furthermore, for each application at least one reader needs to be defined which imports the component and license information.
"applications" : [ { "name" : "Devon4J", (1) "releaseId" : "3.1.0-SNAPSHOT", (2) "sourceRepo" : "https://github.com/devonfw/devon4j.git", (3) "programmingEcosystem" : "Java8", (4) "readers" : [ { (5) "type" : "maven", (6) "source" : "classpath:samples/licenses_devon4j.xml", (7) (10) "usagePattern" : "DYNAMIC_LINKING", (8) "repoType" : "maven" (9) } ] } ],
1 | The name of the application / deliverable (any string) |
2 | Version identifier of the application (any string) |
3 | URL of the source repo of the application (string; should be an URL) |
4 | programming ecosystem (any string; e.g. Java8; Android/Java, iOS / Objective C) |
5 | multiple readers might be defined per application |
6 | the type of reader; for possible values see Reading License Information with Readers |
7 | location of the source file to read (ResourceLoader-URL) |
8 | usage pattern; possible values: DYNAMIC_LINKING, STATIC_LINKING, STANDALONE_PRODUCT |
9 | repoType: repoType to be set in the ApplicationComponent . This parameter is deprecated and should no longer be used, see List of Deprecated Features. The value of repoType in ApplicationComponent will otherwise be determined from the type info in the PackageURL of the component. |
10 | placeholder patterns might be used here |
The different readers are described in chapter Reading License Information with Readers
Business Rules
Business rules are executed within a Drools rule engine. They are defined as a sequence of rule templates and corresponding XLS (or CSV) files which together represent decision tables.
"rules" : [ { "type" : "dt", (1) "optional" : false, (2) "ruleSource" : "classpath:samples/LicenseAssignmentV2Sample.xls", (3) (9) "templateSource" : "classpath:com/.../rules/rule_templates/LicenseAssignmentV2.drt", (4) (9) "ruleGroup" : "LicenseAssignmentV2", (5) "description" : "setting license in case that no one was detected", (6) "deprecationWarnOnly" : true, (7) "deprecationDetails" : "This decision table should be migrated to ..." (8) }, . . . ,{ "type" : "dt", "optional" : false, "ruleSource" : "classpath:samples/LegalEvaluationSample.xls", "templateSource" : "classpath:com/.../rules/rule_templates/LegalEvaluation.drt", "ruleGroup" : "LegalEvaluation", "description" : "final legal evaluation based on the rules defined by legal" } ],
1 | type of the rule; only possible value: dt which stands for "decision table" |
2 | if set to true the processing of this group of rules will be skipped if the XLS/CSV with table
data (given by ruleSource ) does not exist; if set to false a missing XLS/CSV table will result
in program termination |
3 | location of the tabular decision table data. This might either point directly to the XLS or CSV file or only give the resource name without suffix. In this case Solicitor will dynamically test for existing resources by appending suffixes xls and csv. |
4 | location of the drools rule template to be used to define the rules together with the decision table data |
5 | id of the group of rules; used to reference it e.g. when doing logging |
6 | some textual description of the rule group |
7 | flag to control which level of deprecation (see Feature Deprecation) applies to this rule group; optional and only applicable if deprecationDetails is also defined. |
8 | optional value; if set then the use of the defined decision table is deprecated; the given string will be given as part of the log message |
9 | placeholder patterns might be used here |
When running, Solicitor will execute the rules of each rule group separately and in the order given by the configuration. Only if there are no more rules to fire in a group Solicitor will move to the next rule group and start firing those rules.
Normally a project will only customize (part of) the data of the decision tables and thus will only change the ruleSource
and the data in the XLS/CSV.
All other configuration (the different templates and processing order) is part of the Solicitor application itself and should not be changed by end users.
See Working with Decision Tables and Standard Business Rules for further information on the business rules.
Writers and Reporting
The writer configuration defines how the processed data will be exported and/or reported.
"writers" : [ { "type" : "xls", (1) "templateSource" : "classpath:samples/Solicitor_Output_Template_Sample.xlsx", (2) (6) "target" : "OSS-Inventory-devonfw.xlsx", (3) (6) "description" : "The XLS OSS-Inventory document", (4) "dataTables" : { (5) "ENGAGEMENT" : "classpath:com/devonfw/tools/solicitor/sql/allden_engagements.sql", "LICENSE" : "classpath:com/devonfw/tools/solicitor/sql/allden_normalizedlicenses.sql" } } ]
1 | type of writer to be selected; possible values: xls , velo |
2 | path to the template to be used |
3 | location of the output file |
4 | some textual description |
5 | reference to SQL statements used to transform the internal data model to data tables used for reporting |
6 | placeholder patterns might be used here |
If a writers
section is defined in the project configuration then it will replace the writer configuration given in the
builtin default configuration.
If you want to just add additional project specific writers then you might define them in the (optional)
additionalWriters
section of the project configuration file. These get processed
additionally to the default writers. The section additionalWriters
has the same attributes as the standard writers
configuration.
"additionalWriters" : [ { "type" : ... "dataTables" : { ... } } ]
For details on the writer configuration see Reporting and Creating output documents.
Starting a new project
To simplify setting up a new project Solicitor provides an option to create a project starter configuration in a given directory.
java -jar solicitor.jar -wiz some/directory/path
Besides the necessary configuration file this includes also empty XLS or CSV files for defining project
specific rules which amend the builtin rules. Furthermore, a sample license.xml
file is provided to
directly enable execution of solicitor and check functionality.
This configuration then serves as starting point for project specific configuration.
Exporting the Builtin Configuration
When working with Solicitor it might be necessary to get access to the builtin base configuration, e.g. for reviewing the builtin sample rules or using builtin reporting templates as starting point for the creation of own templates.
The command
java -jar solicitor.jar -ec some/directory/path
will export all internal configuration to the given directory. This includes:
-
The base configuration file, which defines standard settings inherited by the Project Configuration File
-
The Drools Rule Templates
-
The builtin decision tables which are referenced in the base configuration, see Standard Business Rules
-
The SQL statements which are used for SQL transformation and filtering
-
The referenced templates for the Velocity Writer and Excel Writer
Configuration of Technical Properties
Besides the project configuration done via the above described file there are a set of technical settings in Solicitor which are done via properties. Solicitor is implemented as a Spring Boot Application and makes use of the standard configuration mechanism provided by the Spring Boot Platform which provides several ways to define/override properties.
The default property values are given in Built in Default Properties.
In case that a property shall be overridden when executing Solicitor this can easiest be done via the command line when executing Solicitor:
java -Dsome.property.name1=value -Dsome.property.name2=another_value -jar solicitor.jar <any other arguments>