Forráskód Böngészése

Merge remote-tracking branch 'origin/master'

Jason Rivard 6 éve
szülő
commit
a509e74608

+ 8 - 1
onejar/src/main/java/password/pwm/onejar/Argument.java

@@ -39,7 +39,8 @@ enum Argument
     port,
     context,
     properties,
-    localAddress,;
+    localAddress,
+    command,;
 
     static Options asOptions( )
     {
@@ -97,6 +98,12 @@ enum Argument
                 .numberOfArgs( 1 )
                 .build() );
 
+        optionMap.put( Argument.command, Option.builder( Argument.command.name() )
+                .desc( "execute command (instead of starting web application)" )
+                .optionalArg( true )
+                .numberOfArgs( 10 )
+                .build() );
+
         return Collections.unmodifiableMap( optionMap );
     }
 

+ 18 - 2
onejar/src/main/java/password/pwm/onejar/ArgumentParser.java

@@ -145,8 +145,17 @@ public class ArgumentParser
                 if ( commandLine.hasOption( option.getOpt() ) )
                 {
                     final Argument argument = Argument.valueOf( option.getOpt() );
-                    final String value = commandLine.getOptionValue( option.getOpt() );
-                    map.put( argument, value );
+                    if ( option.getArgs() > 1 )
+                    {
+                        final String[] values = commandLine.getOptionValues( option.getOpt() );
+                        final String joined = String.join( " ", values );
+                        map.put( argument, joined );
+                    }
+                    else
+                    {
+                        final String value = commandLine.getOptionValue( option.getOpt() );
+                        map.put( argument, value );
+                    }
                 }
             }
         }
@@ -226,6 +235,13 @@ public class ArgumentParser
             onejarConfig.workingPath( figureDefaultWorkPath( localAddress, context, port ) );
         }
 
+        if ( argumentMap.containsKey( Argument.command ) )
+        {
+            final String value = argumentMap.get( Argument.command );
+            System.out.println( "cmddetected" );
+            onejarConfig.execCommand( value );
+        }
+
         return onejarConfig.build();
     }
 

+ 1 - 0
onejar/src/main/java/password/pwm/onejar/OnejarConfig.java

@@ -40,6 +40,7 @@ class OnejarConfig
     private String context;
     private String localAddress;
     private String keystorePass;
+    private String execCommand;
 
     File getWarFolder( ) throws IOException
     {

+ 41 - 1
onejar/src/main/java/password/pwm/onejar/OnejarMain.java

@@ -24,8 +24,13 @@ package password.pwm.onejar;
 
 import javax.servlet.ServletException;
 import java.io.IOException;
+import java.lang.reflect.Method;
+import java.net.URLClassLoader;
 import java.time.Duration;
 import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 public class OnejarMain
 {
@@ -47,7 +52,42 @@ public class OnejarMain
         }
 
         final OnejarMain onejarMain = new OnejarMain();
-        onejarMain.run( onejarConfig );
+
+        if ( onejarConfig != null )
+        {
+            if ( onejarConfig.getExecCommand() != null )
+            {
+                onejarMain.execCommand( onejarConfig );
+            }
+            else
+            {
+                onejarMain.run( onejarConfig );
+            }
+        }
+    }
+
+    private void execCommand( final OnejarConfig onejarConfig )
+    {
+        try
+        {
+            final String cmdLine = onejarConfig.getExecCommand();
+            out( "executing command: " + cmdLine );
+            final TomcatOnejarRunner runner = new TomcatOnejarRunner( this );
+            final URLClassLoader classLoader = runner.warClassLoaderFromConfig( onejarConfig );
+
+            final Class pwmMainClass = classLoader.loadClass( "password.pwm.util.cli.MainClass" );
+            final Method mainMethod = pwmMainClass.getMethod( "main", String[].class );
+            final List<String> cmdLineItems = new ArrayList<>( );
+            cmdLineItems.add( "-applicationPath=" + onejarConfig.getApplicationPath().getAbsolutePath() );
+            cmdLineItems.addAll( Arrays.asList( cmdLine.split( " " ) ) );
+            final String[] arguments = cmdLineItems.toArray( new String[0] );
+
+            mainMethod.invoke( null, ( Object ) arguments );
+        }
+        catch ( Exception e )
+        {
+            e.printStackTrace( );
+        }
     }
 
     void run( final OnejarConfig onejarConfig )