Skip to content

Commit

Permalink
Refactor bootstrappers
Browse files Browse the repository at this point in the history
  • Loading branch information
benbc committed Mar 9, 2016
1 parent 2caeb94 commit e05437c
Show file tree
Hide file tree
Showing 12 changed files with 169 additions and 229 deletions.
112 changes: 54 additions & 58 deletions community/server/src/main/java/org/neo4j/server/Bootstrapper.java
Expand Up @@ -21,6 +21,7 @@


import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;


Expand All @@ -30,16 +31,16 @@
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.info.JvmChecker; import org.neo4j.kernel.info.JvmChecker;
import org.neo4j.kernel.info.JvmMetadataRepository; import org.neo4j.kernel.info.JvmMetadataRepository;
import org.neo4j.kernel.lifecycle.LifeSupport;
import org.neo4j.logging.FormattedLogProvider; import org.neo4j.logging.FormattedLogProvider;
import org.neo4j.logging.Log; import org.neo4j.logging.Log;
import org.neo4j.logging.LogProvider; import org.neo4j.logging.LogProvider;
import org.neo4j.server.configuration.BaseServerConfigLoader; import org.neo4j.server.configuration.ConfigLoader;
import org.neo4j.server.configuration.ServerSettings; import org.neo4j.server.configuration.ServerSettings;
import org.neo4j.server.logging.JULBridge; import org.neo4j.server.logging.JULBridge;
import org.neo4j.server.logging.JettyLogBridge; import org.neo4j.server.logging.JettyLogBridge;


import static java.lang.String.format; import static java.lang.String.format;

import static org.neo4j.server.configuration.ServerSettings.SERVER_CONFIG_FILE; import static org.neo4j.server.configuration.ServerSettings.SERVER_CONFIG_FILE;
import static org.neo4j.server.configuration.ServerSettings.SERVER_CONFIG_FILE_KEY; import static org.neo4j.server.configuration.ServerSettings.SERVER_CONFIG_FILE_KEY;


Expand All @@ -49,40 +50,32 @@ public abstract class Bootstrapper
public static final int WEB_SERVER_STARTUP_ERROR_CODE = 1; public static final int WEB_SERVER_STARTUP_ERROR_CODE = 1;
public static final int GRAPH_DATABASE_STARTUP_ERROR_CODE = 2; public static final int GRAPH_DATABASE_STARTUP_ERROR_CODE = 2;


protected final LifeSupport life = new LifeSupport(); private NeoServer server;
protected NeoServer server;
protected Config config;
private Thread shutdownHook; private Thread shutdownHook;
protected GraphDatabaseDependencies dependencies = GraphDatabaseDependencies.newDependencies(); private GraphDatabaseDependencies dependencies = GraphDatabaseDependencies.newDependencies();

private Log log; private Log log;
private String serverPort; private String serverPort = "unknown port";


public static void main( String[] args ) /**
* Start a bootstrapper with the specified command-line arguments, returns a status code indicating success or
* failure outcomes.
*/
public static int start( Bootstrapper boot, String[] argv )
{ {
throw new UnsupportedOperationException( ServerCommandLineArgs args = ServerCommandLineArgs.parse( argv );
"Invoking Bootstrapper#main() is no longer supported. If you see this error, please contact Neo4j " + return boot.start( args.configFile(), args.configOverrides() );
"support." );
} }


public int start( File configFile, Pair<String, String> ... configOverrides ) @SafeVarargs
public final int start( File configFile, Pair<String, String>... configOverrides )
{ {
LogProvider userLogProvider = FormattedLogProvider.withoutRenderingContext().toOutputStream( System.out ); LogProvider userLogProvider = setupLogging();

JULBridge.resetJUL();
Logger.getLogger( "" ).setLevel( Level.WARNING );
JULBridge.forwardTo( userLogProvider );
JettyLogBridge.setLogProvider( userLogProvider );

log = userLogProvider.getLog( getClass() ); log = userLogProvider.getLog( getClass() );


serverPort = "unknown port";
try try
{ {
config = createConfig( log, configFile, configOverrides ); Config config = createConfig( log, configFile, configOverrides );
serverPort = String.valueOf( config.get( ServerSettings.webserver_port ) ); serverPort = String.valueOf( config.get( ServerSettings.webserver_port ) );
dependencies = dependencies.userLogProvider( userLogProvider );
life.start();


checkCompatibility(); checkCompatibility();


Expand All @@ -101,7 +94,7 @@ public int start( File configFile, Pair<String, String> ... configOverrides )
catch ( TransactionFailureException tfe ) catch ( TransactionFailureException tfe )
{ {
String locationMsg = (server == null) ? "" : " Another process may be using database location " + String locationMsg = (server == null) ? "" : " Another process may be using database location " +
server.getDatabase().getLocation(); server.getDatabase().getLocation();
log.error( format( "Failed to start Neo Server on port [%s].", serverPort ) + locationMsg, tfe ); log.error( format( "Failed to start Neo Server on port [%s].", serverPort ) + locationMsg, tfe );
return GRAPH_DATABASE_STARTUP_ERROR_CODE; return GRAPH_DATABASE_STARTUP_ERROR_CODE;
} }
Expand All @@ -112,14 +105,6 @@ public int start( File configFile, Pair<String, String> ... configOverrides )
} }
} }


private void checkCompatibility()
{
new JvmChecker( log, new JvmMetadataRepository() ).checkJvmCompatibilityAndIssueWarning();
}

protected abstract NeoServer createNeoServer( Config config, GraphDatabaseDependencies dependencies,
LogProvider userLogProvider );

public int stop() public int stop()
{ {
String location = "unknown location"; String location = "unknown location";
Expand All @@ -132,8 +117,6 @@ public int stop()


removeShutdownHook(); removeShutdownHook();


life.shutdown();

return 0; return 0;
} }
catch ( Exception e ) catch ( Exception e )
Expand All @@ -144,23 +127,34 @@ public int stop()
} }
} }


protected void removeShutdownHook() public NeoServer getServer()
{ {
if ( shutdownHook != null ) return server;
{
if ( !Runtime.getRuntime().removeShutdownHook( shutdownHook ) )
{
log.warn( "Unable to remove shutdown hook" );
}
}
} }


public NeoServer getServer() protected abstract NeoServer createNeoServer( Config config, GraphDatabaseDependencies dependencies,
LogProvider userLogProvider );

protected abstract Iterable<Class<?>> settingsClasses( HashMap<String, String> settings );

private LogProvider setupLogging()
{ {
return server; LogProvider userLogProvider = FormattedLogProvider.withoutRenderingContext().toOutputStream( System.out );
JULBridge.resetJUL();
Logger.getLogger( "" ).setLevel( Level.WARNING );
JULBridge.forwardTo( userLogProvider );
JettyLogBridge.setLogProvider( userLogProvider );
dependencies = dependencies.userLogProvider( userLogProvider );
return userLogProvider;
} }


protected void addShutdownHook() private Config createConfig( Log log, File file, Pair<String, String>[] configOverrides ) throws IOException
{
File standardConfigFile = new File( System.getProperty( SERVER_CONFIG_FILE_KEY, SERVER_CONFIG_FILE ) );
return new ConfigLoader( this::settingsClasses ).loadConfig( file, standardConfigFile, log, configOverrides );
}

private void addShutdownHook()
{ {
shutdownHook = new Thread() shutdownHook = new Thread()
{ {
Expand All @@ -174,20 +168,22 @@ public void run()
} }
} }
}; };
Runtime.getRuntime() Runtime.getRuntime().addShutdownHook( shutdownHook );
.addShutdownHook( shutdownHook );
} }


/** private void removeShutdownHook()
* Create a new config instance for the DBMS. For legacy reasons, this method contains convoluted logic to load an
* additional config file determined by a system property (neo4j.conf).
*
* It will also override defaults set in neo4j embedded (remote shell default on/off, query log file name). Whether
* it's correct to do that here is dubious, it makes it confusing in the documentation that the defaults do not
* match the behavior of the server.
*/
protected Config createConfig( Log log, File file, Pair<String, String>[] configOverrides ) throws IOException
{ {
return new BaseServerConfigLoader().loadConfig( file, new File( System.getProperty( SERVER_CONFIG_FILE_KEY, SERVER_CONFIG_FILE ) ), log, configOverrides ); if ( shutdownHook != null )
{
if ( !Runtime.getRuntime().removeShutdownHook( shutdownHook ) )
{
log.warn( "Unable to remove shutdown hook" );
}
}
}

private void checkCompatibility()
{
new JvmChecker( log, new JvmMetadataRepository() ).checkJvmCompatibilityAndIssueWarning();
} }
} }
Expand Up @@ -19,12 +19,23 @@
*/ */
package org.neo4j.server; package org.neo4j.server;


import java.util.HashMap;
import java.util.List;

import org.neo4j.dbms.DatabaseManagementSystemSettings;
import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.kernel.GraphDatabaseDependencies; import org.neo4j.kernel.GraphDatabaseDependencies;
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;
import org.neo4j.logging.LogProvider; import org.neo4j.logging.LogProvider;
import org.neo4j.server.configuration.ServerSettings;

import static java.util.Arrays.asList;


public class CommunityBootstrapper extends Bootstrapper public class CommunityBootstrapper extends Bootstrapper
{ {
public static final List<Class<?>> settingsClasses =
asList( ServerSettings.class, GraphDatabaseSettings.class, DatabaseManagementSystemSettings.class );

public static void main( String[] args ) public static void main( String[] args )
{ {
int exit = start( new CommunityBootstrapper(), args ); int exit = start( new CommunityBootstrapper(), args );
Expand All @@ -34,19 +45,16 @@ public static void main( String[] args )
} }
} }


/**
* Start a bootstrapper with the specified command-line arguments, returns a status code indicating success or failure outcomes.
*/
public static int start( Bootstrapper boot, String[] argv )
{
ServerCommandLineArgs args = ServerCommandLineArgs.parse( argv );
return boot.start( args.configFile(), args.configOverrides() );
}

@Override @Override
protected NeoServer createNeoServer( Config config, GraphDatabaseDependencies dependencies, protected NeoServer createNeoServer( Config config, GraphDatabaseDependencies dependencies,
LogProvider logProvider ) LogProvider logProvider )
{ {
return new CommunityNeoServer( config, dependencies, logProvider ); return new CommunityNeoServer( config, dependencies, logProvider );
} }

@Override
protected Iterable<Class<?>> settingsClasses( HashMap<String, String> settings )
{
return settingsClasses;
}
} }
Expand Up @@ -22,6 +22,7 @@
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;


import org.neo4j.bolt.BoltKernelExtension; import org.neo4j.bolt.BoltKernelExtension;
Expand All @@ -38,8 +39,20 @@
import static org.neo4j.bolt.BoltKernelExtension.Settings.connector; import static org.neo4j.bolt.BoltKernelExtension.Settings.connector;
import static org.neo4j.kernel.configuration.Settings.TRUE; import static org.neo4j.kernel.configuration.Settings.TRUE;


public class BaseServerConfigLoader public class ConfigLoader
{ {
private final SettingsClasses settingsClasses;

public ConfigLoader( SettingsClasses settingsClasses )
{
this.settingsClasses = settingsClasses;
}

public ConfigLoader( List<Class<?>> settingsClasses )
{
this( settings -> settingsClasses );
}

public Config loadConfig( File configFile, File legacyConfigFile, Log log, Pair<String, String>... configOverrides ) public Config loadConfig( File configFile, File legacyConfigFile, Log log, Pair<String, String>... configOverrides )
{ {
if ( log == null ) if ( log == null )
Expand All @@ -48,7 +61,7 @@ public Config loadConfig( File configFile, File legacyConfigFile, Log log, Pair<
} }


HashMap<String, String> settings = calculateSettings( configFile, legacyConfigFile, log, configOverrides ); HashMap<String, String> settings = calculateSettings( configFile, legacyConfigFile, log, configOverrides );
Config config = new Config( settings, settingsClasses(settings) ); Config config = new Config( settings, settingsClasses.calculate( settings ) );
config.setLogger( log ); config.setLogger( log );
return config; return config;
} }
Expand Down Expand Up @@ -120,4 +133,9 @@ private static Map<String, String> loadFromFile( Log log, File file )
// Default to no user-defined config if no config was found // Default to no user-defined config if no config was found
return new HashMap<>(); return new HashMap<>();
} }

public interface SettingsClasses
{
Iterable<Class<?>> calculate( HashMap<String, String> settings );
}
} }
Expand Up @@ -44,7 +44,7 @@
import static org.neo4j.graphdb.factory.GraphDatabaseSettings.forced_kernel_id; import static org.neo4j.graphdb.factory.GraphDatabaseSettings.forced_kernel_id;
import static org.neo4j.helpers.collection.MapUtil.store; import static org.neo4j.helpers.collection.MapUtil.store;
import static org.neo4j.helpers.collection.MapUtil.stringMap; import static org.neo4j.helpers.collection.MapUtil.stringMap;
import static org.neo4j.server.CommunityBootstrapper.start; import static org.neo4j.server.Bootstrapper.start;


public abstract class BaseBootstrapperTest extends ExclusiveServerTestBase public abstract class BaseBootstrapperTest extends ExclusiveServerTestBase
{ {
Expand Down

This file was deleted.

0 comments on commit e05437c

Please sign in to comment.