You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2016/07/13 11:34:50 UTC

svn commit: r1752395 - /directory/apacheds/trunk/wrapper/src/main/java/org/apache/directory/server/wrapper/ApacheDsTanukiWrapper.java

Author: elecharny
Date: Wed Jul 13 11:34:49 2016
New Revision: 1752395

URL: http://svn.apache.org/viewvc?rev=1752395&view=rev
Log:
Handling the repair command in the wrapper

Modified:
    directory/apacheds/trunk/wrapper/src/main/java/org/apache/directory/server/wrapper/ApacheDsTanukiWrapper.java

Modified: directory/apacheds/trunk/wrapper/src/main/java/org/apache/directory/server/wrapper/ApacheDsTanukiWrapper.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/wrapper/src/main/java/org/apache/directory/server/wrapper/ApacheDsTanukiWrapper.java?rev=1752395&r1=1752394&r2=1752395&view=diff
==============================================================================
--- directory/apacheds/trunk/wrapper/src/main/java/org/apache/directory/server/wrapper/ApacheDsTanukiWrapper.java (original)
+++ directory/apacheds/trunk/wrapper/src/main/java/org/apache/directory/server/wrapper/ApacheDsTanukiWrapper.java Wed Jul 13 11:34:49 2016
@@ -21,6 +21,15 @@
 package org.apache.directory.server.wrapper;
 
 
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.Socket;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+import org.apache.directory.api.util.Network;
+import org.apache.directory.api.util.Strings;
 import org.apache.directory.server.ApacheDsService;
 import org.apache.directory.server.core.api.InstanceLayout;
 import org.slf4j.Logger;
@@ -43,6 +52,9 @@ public final class ApacheDsTanukiWrapper
     private ApacheDsService service;
 
 
+    /**
+     * Creates a new instance of ApacheDsTanukiWrapper.
+     */
     private ApacheDsTanukiWrapper()
     {
     }
@@ -54,33 +66,157 @@ public final class ApacheDsTanukiWrapper
     }
 
 
-    public Integer start( String[] args )
+    
+    private static int readShutdownPort( InstanceLayout layout ) throws IOException 
     {
-        LOG.info( "Starting the service..." );
+        return Integer.parseInt( new String( Files.readAllBytes( 
+                Paths.get( layout.getRunDirectory().getAbsolutePath(), ".shutdown.port" ) ),
+                Charset.forName( "utf-8" ) ) );
+    }
+    
+
+    private static String readShutdownPassword( InstanceLayout layout ) throws IOException 
+    {
+        return new String( Files.readAllBytes( 
+                Paths.get( layout.getRunDirectory().getAbsolutePath(), ".shutdown.pwd" ) ),
+                Charset.forName( "utf-8" ) );
+    }
 
-        if ( ( args != null ) && ( args.length == 1 ) )
+    
+    /**
+     * Try to repair the databases
+     *
+     * @param instanceDirectory The directory containing the server instance 
+     */
+    public void repair( String instanceDirectory )
+    {
+        System.out.println( "Trying to repair the following data :" + instanceDirectory );
+        InstanceLayout layout = new InstanceLayout( instanceDirectory );
+        
+        // Creating ApacheDS service
+        service = new ApacheDsService();
+        
+        try
+        {
+            System.out.println( "Starting the service." );
+            service.start( layout );
+            System.out.println( "Service started." );
+        }
+        catch ( Exception e )
+        {
+            return;
+        }
+
+        // Initializing the service
+        try
+        {
+            System.out.println( "Repairing the database." );
+            service.repair( layout );
+            System.out.println( "Database repaired." );
+        }
+        catch ( Exception e )
         {
-            // Creating ApacheDS service
-            service = new ApacheDsService();
+            LOG.error( "Failed to start the service.", e );
+            System.exit( 1 );
+        }
+    }
 
-            // Creating instance layouts from the argument
-            InstanceLayout instanceLayout = new InstanceLayout( args[0] );
 
-            // Starting the service
-            try
-            {
-                service.start( instanceLayout );
-            }
-            catch ( Exception e )
+    /**
+     * Implemented the start() method from the WrapperListener class.
+     * 
+     * The possible arguments are the instance layout directory and the command, one of :
+     * <ul>
+     *   <li>START (default) : starts the server</li>
+     *   <li>STOP : stops the server</li>
+     *   <li>REPAIR : repairs the index</li>
+     * </ul>
+     */
+    public Integer start( String[] args )
+    {
+        LOG.info( "Starting the service..." );
+
+        if ( args != null )
+        {
+            int argNb = 0;
+            
+            for ( String arg : args )
             {
-                LOG.error( "Failed to start the service.", e );
-                System.exit( ExitCodes.START );
+                LOG.info( "Args[{}] : {}", argNb, arg );
+                argNb++;
             }
         }
-        else
+
+        if ( args != null )
         {
-            throw new IllegalArgumentException(
-                "Program must be launched with 1 arguement, the path to the instance directory." );
+            // the default action
+            String action = "START";
+            String instanceDirectory = args[0];
+
+            switch ( args.length )
+            {
+                case 2 :
+                    action = args[1];
+                    /* Passthrough...*/
+                    
+                case 1 :
+                    // Creating ApacheDS service
+                    service = new ApacheDsService();
+
+                    // Creating instance layouts from the argument
+                    InstanceLayout instanceLayout = new InstanceLayout( instanceDirectory );
+                    
+                    // Process the action
+                    switch ( Strings.toLowerCaseAscii( action ) )
+                    {
+                        case "stop" :
+                            // Stops the server
+                            LOG.debug( "Stopping runtime" );
+                            InstanceLayout layout = new InstanceLayout( instanceDirectory );
+                            
+                            try ( Socket socket = new Socket( Network.LOOPBACK, readShutdownPort( layout ) );
+                                    PrintWriter writer = new PrintWriter( socket.getOutputStream() ) )
+                            {
+                                writer.print( readShutdownPassword( layout ) );
+                            }
+                            catch ( IOException e )
+                            {
+                                // TODO Auto-generated catch block
+                                e.printStackTrace();
+                            }
+                            
+                            break;
+
+                        case "repair" :
+                            // Try to fix the JDBM database
+                            LOG.debug( "Fixing the database runtime" );
+                            repair( instanceDirectory );
+                            
+                            break;
+                            
+                        default :
+                            // Starts the server
+                            LOG.debug( "Starting runtime" );
+
+                            try
+                            {
+                                service.start( instanceLayout );
+                            }
+                            catch ( Exception e )
+                            {
+                                LOG.error( "Failed to start the service.", e );
+                                System.exit( ExitCodes.START );
+                            }
+                            
+                            break;
+                    }
+                    
+                    break;
+                    
+                default :
+                    throw new IllegalArgumentException(
+                        "Program must be launched with at least 1 argument, the path to the instance directory." );
+            }
         }
 
         return null;