33import java .io .File ;
44import java .util .HashMap ;
55import java .util .Map ;
6+ import java .util .Optional ;
67import java .util .function .Consumer ;
8+ import java .util .stream .Stream ;
79
8- import org .apache .log4j .Logger ;
10+ import org .apache .logging .log4j .LogManager ;
11+ import org .apache .logging .log4j .Logger ;
12+ import org .apache .logging .log4j .core .LoggerContext ;
13+ import org .apache .logging .log4j .core .appender .ConsoleAppender ;
14+ import org .apache .logging .log4j .core .layout .PatternLayout ;
915
1016import nuix .Utilities ;
1117import nuix .engine .AvailableLicence ;
2733 *
2834 */
2935public class EngineWrapper implements AutoCloseable {
30- // Obtain a logger instance for this class
31- private final static Logger logger = Logger .getLogger ("EngineWrapper" );
32-
3336 private static GlobalContainer container = null ;
37+ private static boolean loggingInitHasBeenPerformed = false ;
3438
3539 private File nuixBaseDirectory = null ;
3640 private Engine engine = null ;
37-
3841 private Thread shutdownHook = null ;
39-
40- // We will use this while iterating licenses to determine which one to acquire.
41- // By default this filter accepts any license.
42- private LicenseFilter licenseFilter = new LicenseFilter ();
43-
42+ private LicenseFilter licenseFilter = null ;
4443 private CertificateTrustCallback certificateTrustCallback = null ;
4544
45+ public Logger logger = null ;
46+
4647 /***
4748 * Creates a new instance running against the specified engine release.
4849 * @param nuixBaseDirectory Base directory of the target engine release.
50+ * @param logDirectory Where logs for this sessions should be written to
4951 */
50- public EngineWrapper (File nuixBaseDirectory ){
52+ public EngineWrapper (File nuixBaseDirectory , String logDirectory ){
5153 this .nuixBaseDirectory = nuixBaseDirectory ;
5254
55+ // Lets only initialize the logging stuff the first time
56+ if (!loggingInitHasBeenPerformed ) {
57+ System .getProperties ().put ("nuix.logdir" , logDirectory );
58+
59+ // Use Log4j2 config YAML from engine base directory
60+ File log4jConfigFile = new File (nuixBaseDirectory ,"config/log4j2.yml" );
61+ System .setProperty ("log4j.configurationFile" ,log4jConfigFile .getAbsolutePath ());
62+ logger = LogManager .getLogger ("EngineWrapper" );
63+
64+ // Register our own console appender that writes more than just fatal errors
65+ PatternLayout layout = PatternLayout .newBuilder ().withPattern ("%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n" ).build ();
66+ ConsoleAppender appender = ConsoleAppender .createDefaultAppenderForLayout (layout );
67+ appender .start ();
68+ LoggerContext ctx = (LoggerContext ) LogManager .getContext (false );
69+ ctx .getRootLogger ().addAppender (appender );
70+ ctx .updateLoggers ();
71+
72+ loggingInitHasBeenPerformed = true ;
73+ }
74+
75+ licenseFilter = new LicenseFilter ();
76+
5377 // We want to set the System property "nuix.libdir" so that when the engine spins up worker processes,
5478 // that it can specify the "lib" directory properly to the workers. Without this the engine will instead
5579 // attempt to specify an absolute path to each of the JARs, which can cause the command used to start the
@@ -71,9 +95,10 @@ public EngineWrapper(File nuixBaseDirectory){
7195 /***
7296 * Creates a new instance running against the specified engine release.
7397 * @param nuixBaseDirectory Base directory of the target engine release.
98+ * @param logDirectory Where logs for this sessions should be written to
7499 */
75- public EngineWrapper (String nuixBaseDirectory ){
76- this (new File (nuixBaseDirectory ));
100+ public EngineWrapper (String nuixBaseDirectory , String logDirectory ){
101+ this (new File (nuixBaseDirectory ), logDirectory );
77102 }
78103
79104 /***
@@ -113,10 +138,6 @@ public void withDongleLicense(Consumer<Utilities> consumer) throws Exception{
113138 Utilities utilities = engine .getUtilities ();
114139 ThirdPartyDependencyChecker .logAllDependencyInfo (utilities );
115140
116- // Setup our shutdown hook in case user terminates before consumer returns
117- logger .info ("Adding shutdown hook for EngineWrapper::close" );
118- Runtime .getRuntime ().addShutdownHook (shutdownHook );
119-
120141 logger .info ("License was obtained, providing Utilities object to consumer..." );
121142 consumer .accept (utilities );
122143 }
@@ -201,7 +222,7 @@ public void withServerLicense(final String server, final String userName, final
201222
202223 logger .info ("Specifying credentials to use with license server..." );
203224 engine .whenAskedForCredentials (new CredentialsCallback () {
204- Logger logger = Logger .getLogger ("CredentialCallback" );
225+ Logger logger = LogManager .getLogger ("CredentialCallback" );
205226 public void execute (CredentialsCallbackInfo info ) {
206227 logger .info (String .format ("Providing credentials for %s to license server %s..." , userName ,info .getAddress ().getHostName ()));
207228 info .setUsername (userName );
@@ -222,11 +243,7 @@ public void execute(CredentialsCallbackInfo info) {
222243 if (licenseObtained ){
223244 Utilities utilities = engine .getUtilities ();
224245 ThirdPartyDependencyChecker .logAllDependencyInfo (utilities );
225-
226- // Setup our shutdown hook in case user terminates before consumer returns
227- logger .info ("Adding shutdown hook for EngineWrapper::close" );
228- Runtime .getRuntime ().addShutdownHook (shutdownHook );
229-
246+
230247 logger .info ("License was obtained, providing Utilities object to consumer..." );
231248 consumer .accept (utilities );
232249 } else {
@@ -296,7 +313,7 @@ public void withCloudLicense(final String userName, final String password, Consu
296313
297314 logger .info ("Specifying credentials to use with cloud license server..." );
298315 engine .whenAskedForCredentials (new CredentialsCallback () {
299- Logger logger = Logger .getLogger ("CredentialCallback" );
316+ Logger logger = LogManager .getLogger ("CredentialCallback" );
300317 public void execute (CredentialsCallbackInfo info ) {
301318 logger .info (String .format ("Providing credentials for %s to cloud license server %s..." , userName ,info .getAddress ().getHostName ()));
302319 info .setUsername (userName );
@@ -317,10 +334,6 @@ public void execute(CredentialsCallbackInfo info) {
317334 if (licenseObtained ){
318335 Utilities utilities = engine .getUtilities ();
319336 ThirdPartyDependencyChecker .logAllDependencyInfo (utilities );
320-
321- // Setup our shutdown hook in case user terminates before consumer returns
322- logger .info ("Adding shutdown hook for EngineWrapper::close" );
323- Runtime .getRuntime ().addShutdownHook (shutdownHook );
324337
325338 logger .info ("License was obtained, providing Utilities object to consumer..." );
326339 consumer .accept (utilities );
@@ -362,45 +375,25 @@ private boolean obtainLicense(Map<String,Object> licenseOptions){
362375 logger .info (String .format ("\t %s: %s" ,entry .getKey (),entry .getValue ()));
363376 }
364377
365- Iterable <AvailableLicence > licences = licensor .findAvailableLicences (licenseOptions );
366-
367- logger .info ("Iterating available licences..." );
368- for (AvailableLicence license : licences ) {
369- logger .info (LicenseFeaturesLogger .summarizeLicense (license ));
370- }
371-
372- boolean licenceObtained = false ;
373-
374378 logger .info ("Finding first license which meets filter requirements..." );
375- for (AvailableLicence license : licences ) {
376- logger .info ("\t Count: " + license .getCount ());
377- logger .info ("\t Workers: " + license .getWorkers ());
378- logger .info ("\t Short Name: " + license .getShortName ());
379- logger .info ("\t Type: " + license .getSource ().getType ());
380- logger .info ("\t ID: " + license .getSource ().getLocation ());
381- logger .info ("\t Description: " + license .getDescription ());
382- LicenseFeaturesLogger .logFeaturesOfLicense (license );
383-
384- if (licenseFilter .isValid (license )) {
385- if (license .canChooseWorkers ()) {
386- logger .info (">>>> Acquiring this licence with " +licenseFilter .getMinWorkers ()+" workers" );
387- int targetWorkerCount = licenseFilter .getMinWorkers ();
388- if (targetWorkerCount < 1 ) { targetWorkerCount = 2 ; }
389- Map <String ,Object > acquireSettings = new HashMap <String ,Object >();
390- acquireSettings .put ("workerCount" , targetWorkerCount );
391- license .acquire (acquireSettings );
392- licenceObtained = true ;
393- } else {
394- logger .info (">>>> Acquiring this licence" );
395- license .acquire ();
396- licenceObtained = true ;
397- }
398-
399- break ;
379+ Stream <AvailableLicence > licences = licensor .findAvailableLicencesStream (licenseOptions );
380+ boolean licenceObtained = false ;
381+ Optional <AvailableLicence > possiblyFoundLicense = licences .filter (availableLicence -> licenseFilter .isValid (availableLicence )).findFirst ();
382+ if (possiblyFoundLicense .isEmpty () == false ) {
383+ AvailableLicence foundLicense = possiblyFoundLicense .get ();
384+ logger .info (">>>> Acquiring following license: " +LicenseFeaturesLogger .summarizeLicense (foundLicense ));
385+ if (foundLicense .canChooseWorkers ()) {
386+ int targetWorkerCount = licenseFilter .getMinWorkers ();
387+ if (targetWorkerCount < 1 ) { targetWorkerCount = 2 ; }
388+ Map <String ,Object > acquireSettings = new HashMap <String ,Object >();
389+ acquireSettings .put ("workerCount" , targetWorkerCount );
390+ foundLicense .acquire (acquireSettings );
400391 } else {
401- logger .info ("<<<< Ignoring this license, does not meet requirements of license filter" );
402- continue ;
392+ foundLicense .acquire ();
403393 }
394+ licenceObtained = true ;
395+ } else {
396+ logger .warn ("!!!! No license found that matches " +licenseFilter .toString ());
404397 }
405398
406399 return licenceObtained ;
@@ -426,8 +419,11 @@ private void configureAndBuildEngine(){
426419
427420 //Obtain an engine instance
428421 engine = container .newEngine (engineConfiguration );
429-
430422 logger .info ("Obtained Engine instance v" +engine .getVersion ());
423+
424+ // Setup our shutdown hook in case user terminates before consumer returns
425+ logger .info ("Adding shutdown hook for EngineWrapper::close" );
426+ Runtime .getRuntime ().addShutdownHook (shutdownHook );
431427 }
432428
433429 /***
@@ -524,8 +520,11 @@ public void close() throws Exception {
524520 engine .close ();
525521 }
526522
527- // Remove our shutdown hook since engine has now been closed
528- logger .info ("Removing shutdown hook to EngineWrapper::close" );
529- Runtime .getRuntime ().removeShutdownHook (shutdownHook );
523+ if (shutdownHook != null ) {
524+ // Remove our shutdown hook since engine has now been closed
525+ logger .info ("Removing shutdown hook to EngineWrapper::close" );
526+ Runtime .getRuntime ().removeShutdownHook (shutdownHook );
527+ shutdownHook = null ;
528+ }
530529 }
531530}
0 commit comments