Skip to content

Commit

Permalink
Simplify GraphDatabaseFacadeFactory hierarchy
Browse files Browse the repository at this point in the history
Unify all the different kind of GraphDatabaseFacadeFactories into a
single one and hence reduce complexity.
  • Loading branch information
davidegrohmann committed Jun 23, 2016
1 parent 3de4548 commit 2647276
Show file tree
Hide file tree
Showing 35 changed files with 191 additions and 466 deletions.
Expand Up @@ -24,7 +24,8 @@

import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.security.URLAccessRule;
import org.neo4j.kernel.impl.factory.CommunityFacadeFactory;
import org.neo4j.kernel.impl.factory.CommunityEditionModule;
import org.neo4j.kernel.impl.factory.DatabaseInfo;
import org.neo4j.kernel.impl.factory.Edition;
import org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory;
import org.neo4j.kernel.monitoring.Monitors;
Expand Down Expand Up @@ -96,7 +97,8 @@ protected void configure( GraphDatabaseBuilder builder )

protected GraphDatabaseService newDatabase( File storeDir, Map<String,String> config, GraphDatabaseFacadeFactory.Dependencies dependencies )
{
return new CommunityFacadeFactory().newFacade( storeDir, config, dependencies );
return new GraphDatabaseFacadeFactory( DatabaseInfo.COMMUNITY, CommunityEditionModule::new )
.newFacade( storeDir, config, dependencies );
}

public GraphDatabaseFactory addURLAccessRule( String protocol, URLAccessRule rule )
Expand Down
Expand Up @@ -186,7 +186,7 @@ public static Locks createLockManager( Config config, LogService logging )
}
else if ( key.equals( "" ) )
{
logging.getInternalLog( CommunityFacadeFactory.class )
logging.getInternalLog( CommunityEditionModule.class )
.info( "No locking implementation specified, defaulting to '" + candidateId + "'" );
return candidate.newInstance( ResourceTypes.values() );
}
Expand All @@ -198,7 +198,7 @@ else if ( key.equals( "" ) )
}
else if ( key.equals( "" ) )
{
logging.getInternalLog( CommunityFacadeFactory.class )
logging.getInternalLog( CommunityEditionModule.class )
.info( "No locking implementation specified, defaulting to 'community'" );
return new CommunityLockManger();
}
Expand Down

This file was deleted.

Expand Up @@ -22,11 +22,16 @@
public class DatabaseInfo
{
public static final DatabaseInfo UNKNOWN = new DatabaseInfo( Edition.unknown, OperationalMode.unknown );
public static final DatabaseInfo COMMUNITY = new DatabaseInfo( Edition.community, OperationalMode.single );
public static final DatabaseInfo ENTERPRISE = new DatabaseInfo( Edition.enterprise, OperationalMode.single );
public static final DatabaseInfo HA = new DatabaseInfo( Edition.enterprise, OperationalMode.ha );
public static final DatabaseInfo CORE = new DatabaseInfo( Edition.enterprise, OperationalMode.core );
public static final DatabaseInfo EDGE = new DatabaseInfo( Edition.enterprise, OperationalMode.edge );

public final Edition edition;
public final OperationalMode operationalMode;

public DatabaseInfo( Edition edition, OperationalMode operationalMode )
private DatabaseInfo( Edition edition, OperationalMode operationalMode )
{
this.edition = edition;
this.operationalMode = operationalMode;
Expand Down
Expand Up @@ -21,6 +21,7 @@

import java.io.File;
import java.util.Map;
import java.util.function.Function;

import org.neo4j.graphdb.config.Setting;
import org.neo4j.graphdb.security.URLAccessRule;
Expand Down Expand Up @@ -54,7 +55,7 @@
* .CommunityFacadeFactory}), and replace modules
* with custom versions that instantiate alternative services.
*/
public abstract class GraphDatabaseFacadeFactory
public class GraphDatabaseFacadeFactory
{
public interface Dependencies
{
Expand All @@ -78,21 +79,30 @@ public interface Dependencies

public static class Configuration
{
public static final Setting<Boolean> ephemeral = setting( "unsupported.dbms.ephemeral", Settings.BOOLEAN, Settings.FALSE );
public static final Setting<String> ephemeral_keep_logical_logs = setting( "dbms.tx_log.rotation.retention_policy", STRING, "1 " +
"files", illegalValueMessage( "must be `true`/`false` or of format '<number><optional unit> <type>' " +
"for example `100M size` for " +
"limiting logical log space on disk to 100Mb," +
" or `200k txs` for limiting the number of transactions to keep to 200 000", matches( ANY ) ) );
public static final Setting<Boolean> ephemeral =
setting( "unsupported.dbms.ephemeral", Settings.BOOLEAN, Settings.FALSE );
public static final Setting<String> ephemeral_keep_logical_logs =
setting( "dbms.tx_log.rotation.retention_policy", STRING, "1 " + "files", illegalValueMessage( "must be `true`/`false` or of format '<number><optional unit> <type>' " +
"for example `100M size` for " +
"limiting logical log space on disk to 100Mb," +
" or `200k txs` for limiting the number of transactions to keep to 200 000", matches( ANY ) ) );

// Kept here to have it not be publicly documented.
public static final Setting<String> lock_manager = setting( "unsupported.dbms.lock_manager", Settings.STRING, "" );

public static final Setting<String> tracer =
setting( "unsupported.dbms.tracer", Settings.STRING, (String) null ); // 'null' default.

public static final Setting<String> editionName = setting( "unsupported.dbms.edition", Settings.STRING,
Edition.unknown.toString() );
public static final Setting<String> editionName = setting( "unsupported.dbms.edition", Settings.STRING, Edition.unknown.toString() );
}

protected final DatabaseInfo databaseInfo;
private final Function<PlatformModule,EditionModule> editionFactory;

public GraphDatabaseFacadeFactory( DatabaseInfo databaseInfo, Function<PlatformModule,EditionModule> editionFactory )
{
this.databaseInfo = databaseInfo;
this.editionFactory = editionFactory;
}

/**
Expand All @@ -103,7 +113,7 @@ public static class Configuration
* @param dependencies the dependencies required to construct the {@link GraphDatabaseFacade}
* @return the newly constructed {@link GraphDatabaseFacade}
*/
public GraphDatabaseFacade newFacade( File storeDir, Map<String, String> params, final Dependencies dependencies )
public GraphDatabaseFacade newFacade( File storeDir, Map<String,String> params, final Dependencies dependencies )
{
return initFacade( storeDir, params, dependencies, new GraphDatabaseFacade() );
}
Expand All @@ -118,11 +128,11 @@ public GraphDatabaseFacade newFacade( File storeDir, Map<String, String> params,
* @param graphDatabaseFacade the already created facade which needs initialisation
* @return the initialised {@link GraphDatabaseFacade}
*/
public GraphDatabaseFacade initFacade( File storeDir, Map<String, String> params, final Dependencies dependencies,
final GraphDatabaseFacade graphDatabaseFacade )
public GraphDatabaseFacade initFacade( File storeDir, Map<String,String> params, final Dependencies dependencies,
final GraphDatabaseFacade graphDatabaseFacade )
{
PlatformModule platform = createPlatform( storeDir, params, dependencies, graphDatabaseFacade );
EditionModule edition = createEdition( platform );
EditionModule edition = editionFactory.apply( platform );
final DataSourceModule dataSource = createDataSource( dependencies, platform, edition );
Logger msgLog = platform.logging.getInternalLog( getClass() ).infoLogger();
CoreAPIAvailabilityGuard coreAPIAvailabilityGuard = edition.coreAPIAvailabilityGuard;
Expand Down Expand Up @@ -171,23 +181,17 @@ public GraphDatabaseFacade initFacade( File storeDir, Map<String, String> params
/**
* Create the platform module. Override to replace with custom module.
*/
protected PlatformModule createPlatform( File storeDir, Map<String, String> params, final Dependencies dependencies,
final GraphDatabaseFacade graphDatabaseFacade )
protected PlatformModule createPlatform( File storeDir, Map<String,String> params, final Dependencies dependencies,
final GraphDatabaseFacade graphDatabaseFacade )
{
return new PlatformModule( storeDir, params, databaseInfo(), dependencies, graphDatabaseFacade );
return new PlatformModule( storeDir, params, databaseInfo, dependencies, graphDatabaseFacade );
}

/**
* Create the edition module. Implement to provide the edition services specified by the public fields in {@link
* org.neo4j.kernel.impl.factory.EditionModule}.
*/
protected abstract EditionModule createEdition( PlatformModule platformModule );

/**
* Create the datasource module. Override to replace with custom module.
*/
protected DataSourceModule createDataSource( final Dependencies dependencies,
final PlatformModule platformModule, EditionModule editionModule )
protected DataSourceModule createDataSource( final Dependencies dependencies, final PlatformModule platformModule,
EditionModule editionModule )
{
return new DataSourceModule( dependencies, platformModule, editionModule );
}
Expand All @@ -209,6 +213,4 @@ public void unavailable()
}
} );
}

protected abstract DatabaseInfo databaseInfo();
}
Expand Up @@ -25,7 +25,8 @@
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.kernel.GraphDatabaseDependencies;
import org.neo4j.kernel.impl.factory.CommunityFacadeFactory;
import org.neo4j.kernel.impl.factory.CommunityEditionModule;
import org.neo4j.kernel.impl.factory.DatabaseInfo;
import org.neo4j.kernel.impl.factory.GraphDatabaseFacade;
import org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory;

Expand Down Expand Up @@ -76,6 +77,7 @@ protected void create( File storeDir, Map<String, String> params,
{
GraphDatabaseDependencies newDependencies = newDependencies( dependencies )
.settingsClasses( asList( append( GraphDatabaseSettings.class, dependencies.settingsClasses() ) ) );
new CommunityFacadeFactory().initFacade( storeDir, params, newDependencies, this );
new GraphDatabaseFacadeFactory( DatabaseInfo.COMMUNITY, CommunityEditionModule::new )
.initFacade( storeDir, params, newDependencies, this );
}
}
Expand Up @@ -40,7 +40,8 @@
import org.neo4j.kernel.api.Statement;
import org.neo4j.kernel.impl.core.ThreadToStatementContextBridge;
import org.neo4j.kernel.impl.factory.CommunityEditionModule;
import org.neo4j.kernel.impl.factory.CommunityFacadeFactory;
import org.neo4j.kernel.impl.factory.DatabaseInfo;
import org.neo4j.kernel.impl.factory.Edition;
import org.neo4j.kernel.impl.factory.EditionModule;
import org.neo4j.kernel.impl.factory.GraphDatabaseFacade;
import org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory;
Expand Down Expand Up @@ -732,25 +733,23 @@ public GraphDatabaseService newDatabase( Map<String,String> config )
protected void create( File storeDir, Map<String, String> params, GraphDatabaseFacadeFactory
.Dependencies dependencies )
{
new CommunityFacadeFactory()
{
@Override
protected EditionModule createEdition( PlatformModule platformModule )
{
return new CommunityEditionModule( platformModule )
Function<PlatformModule,EditionModule> factory =
( platformModule ) -> new CommunityEditionModule( platformModule )
{
@Override
protected IdGeneratorFactory createIdGeneratorFactory( FileSystemAbstraction fs )
protected IdGeneratorFactory createIdGeneratorFactory(
FileSystemAbstraction fs )
{
return idFactory;
}
};
}
new GraphDatabaseFacadeFactory( DatabaseInfo.COMMUNITY, factory )
{

@Override
protected PlatformModule createPlatform( File storeDir, Map<String, String> params, Dependencies dependencies, GraphDatabaseFacade graphDatabaseFacade )
{
return new ImpermanentPlatformModule( storeDir, params, databaseInfo(), dependencies, graphDatabaseFacade );
return new ImpermanentPlatformModule( storeDir, params, databaseInfo, dependencies, graphDatabaseFacade );
}
}.initFacade( storeDir, params, dependencies, this );
}
Expand Down
Expand Up @@ -113,24 +113,18 @@ public void shouldThrowAppropriateExceptionIfBothStartAndShutdownFail()

private GraphDatabaseFacadeFactory newFaultyGraphDatabaseFacadeFactory( final RuntimeException startupError )
{
return new GraphDatabaseFacadeFactory()
return new GraphDatabaseFacadeFactory( DatabaseInfo.UNKNOWN,
(p) -> Mockito.mock( EditionModule.class, Mockito.RETURNS_DEEP_STUBS ))
{
@Override
protected PlatformModule createPlatform( File storeDir, Map<String,String> params,
Dependencies dependencies, GraphDatabaseFacade graphDatabaseFacade )
{
final LifeSupport lifeMock = mock( LifeSupport.class );
doThrow( startupError ).when( lifeMock ).start();
doAnswer( new Answer()
{
@Override
public Object answer( InvocationOnMock invocationOnMock ) throws Throwable
{
return invocationOnMock.getArguments()[0];
}
} ).when( lifeMock ).add( any( Lifecycle.class ) );
doAnswer( invocation -> invocation.getArguments()[0] ).when( lifeMock ).add( any( Lifecycle.class ) );

return new PlatformModule( storeDir, params, databaseInfo(), dependencies, graphDatabaseFacade )
return new PlatformModule( storeDir, params, databaseInfo, dependencies, graphDatabaseFacade )
{
@Override
public LifeSupport createLife()
Expand All @@ -139,25 +133,12 @@ public LifeSupport createLife()
}
};
}

@Override
protected EditionModule createEdition( PlatformModule platformModule )
{
return Mockito.mock( EditionModule.class, Mockito.RETURNS_DEEP_STUBS );
}

@Override
protected DataSourceModule createDataSource(
Dependencies dependencies, PlatformModule platformModule, EditionModule editionModule )
{
return null;
}

@Override
protected DatabaseInfo databaseInfo()
{
return DatabaseInfo.UNKNOWN;
}
};
}
}

0 comments on commit 2647276

Please sign in to comment.