Skip to content

Commit

Permalink
use immutable collections in GraphDatabaseDependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrew Jefferson authored and eastlondoner committed Sep 20, 2018
1 parent f6f3f94 commit 721b0f7
Showing 1 changed file with 56 additions and 46 deletions.
Expand Up @@ -19,11 +19,14 @@
*/
package org.neo4j.graphdb.facade;

import org.eclipse.collections.api.list.ImmutableList;
import org.eclipse.collections.api.map.ImmutableMap;
import org.eclipse.collections.impl.list.immutable.ImmutableListFactoryImpl;
import org.eclipse.collections.impl.map.immutable.ImmutableMapFactoryImpl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

Expand All @@ -40,113 +43,120 @@

import static org.neo4j.helpers.collection.Iterables.addAll;
import static org.neo4j.helpers.collection.Iterables.asList;
import static org.neo4j.helpers.collection.Iterables.concat;
import static org.neo4j.helpers.collection.Iterables.asImmutableList;
import static org.neo4j.helpers.collection.Iterables.asImmutableMap;
import static org.neo4j.helpers.collection.Iterables.asIterable;

public class GraphDatabaseDependencies implements GraphDatabaseFacadeFactory.Dependencies
{
public static GraphDatabaseDependencies newDependencies( GraphDatabaseFacadeFactory.Dependencies deps )
{
return new GraphDatabaseDependencies( deps.monitors(), deps.userLogProvider(), asList( deps.settingsClasses() ),
asList( deps.kernelExtensions() ), deps.urlAccessRules(), asList( deps.executionEngines() ) );
return new GraphDatabaseDependencies( deps.monitors(), deps.userLogProvider(),
asImmutableList( deps.settingsClasses() ), asImmutableList( deps.kernelExtensions() ),
asImmutableMap( deps.urlAccessRules() ), asImmutableList( deps.executionEngines() ),
asImmutableList( deps.deferredExecutors() ) );
}

public static GraphDatabaseDependencies newDependencies()
{
List<KernelExtensionFactory<?>> kernelExtensions = new ArrayList<>();
for ( KernelExtensionFactory<?> factory : Service.load( KernelExtensionFactory.class ) )
{
kernelExtensions.add( factory );
}
ImmutableList<Class<?>> settingsClasses = ImmutableListFactoryImpl.INSTANCE.empty();
ImmutableList<KernelExtensionFactory<?>> kernelExtensions = asImmutableList( Service.load( KernelExtensionFactory.class ) );

Map<String,URLAccessRule> urlAccessRules = new HashMap<>();
urlAccessRules.put( "http", URLAccessRules.alwaysPermitted() );
urlAccessRules.put( "https", URLAccessRules.alwaysPermitted() );
urlAccessRules.put( "ftp", URLAccessRules.alwaysPermitted() );
urlAccessRules.put( "file", URLAccessRules.fileAccess() );
ImmutableMap<String,URLAccessRule> urlAccessRules = ImmutableMapFactoryImpl.INSTANCE.of(
"http", URLAccessRules.alwaysPermitted(),
"https", URLAccessRules.alwaysPermitted(),
"ftp", URLAccessRules.alwaysPermitted(),
"file", URLAccessRules.fileAccess()
);

List<QueryEngineProvider> queryEngineProviders = asList( Service.load( QueryEngineProvider.class ) );
ImmutableList<QueryEngineProvider> queryEngineProviders = asImmutableList( Service.load( QueryEngineProvider.class ) );
ImmutableList<Pair<DeferredExecutor,Group>> deferredExecutors = ImmutableListFactoryImpl.INSTANCE.empty();

return new GraphDatabaseDependencies( null, null, new ArrayList<>(), kernelExtensions,
urlAccessRules, queryEngineProviders );
return new GraphDatabaseDependencies( null, null, settingsClasses, kernelExtensions,
urlAccessRules, queryEngineProviders, deferredExecutors );
}

private final Monitors monitors;
private final LogProvider userLogProvider;
private final List<Class<?>> settingsClasses;
private final List<KernelExtensionFactory<?>> kernelExtensions;
private final Map<String,URLAccessRule> urlAccessRules;
private final List<QueryEngineProvider> queryEngineProviders;
private final List<Pair<DeferredExecutor, Group>> deferredExecutors = new LinkedList<>();
private final ImmutableList<Class<?>> settingsClasses;
private final ImmutableList<KernelExtensionFactory<?>> kernelExtensions;
private final ImmutableMap<String,URLAccessRule> urlAccessRules;
private final ImmutableList<QueryEngineProvider> queryEngineProviders;
private final ImmutableList<Pair<DeferredExecutor, Group>> deferredExecutors;

private GraphDatabaseDependencies(
Monitors monitors,
LogProvider userLogProvider,
List<Class<?>> settingsClasses,
List<KernelExtensionFactory<?>> kernelExtensions,
Map<String,URLAccessRule> urlAccessRules,
List<QueryEngineProvider> queryEngineProviders )
ImmutableList<Class<?>> settingsClasses,
ImmutableList<KernelExtensionFactory<?>> kernelExtensions,
ImmutableMap<String,URLAccessRule> urlAccessRules,
ImmutableList<QueryEngineProvider> queryEngineProviders,
ImmutableList<Pair<DeferredExecutor, Group>> deferredExecutors
)
{
this.monitors = monitors;
this.userLogProvider = userLogProvider;
this.settingsClasses = settingsClasses;
this.kernelExtensions = kernelExtensions;
this.urlAccessRules = Collections.unmodifiableMap( urlAccessRules );
this.urlAccessRules = urlAccessRules;
this.queryEngineProviders = queryEngineProviders;
this.deferredExecutors = deferredExecutors;
}

// Builder DSL
public GraphDatabaseDependencies monitors( Monitors monitors )
{
return new GraphDatabaseDependencies( monitors, userLogProvider, settingsClasses, kernelExtensions,
urlAccessRules, queryEngineProviders );
urlAccessRules, queryEngineProviders, deferredExecutors );
}

public GraphDatabaseDependencies userLogProvider( LogProvider userLogProvider )
{
return new GraphDatabaseDependencies( monitors, userLogProvider, settingsClasses, kernelExtensions,
urlAccessRules, queryEngineProviders );
urlAccessRules, queryEngineProviders, deferredExecutors );
}

public GraphDatabaseDependencies withDeferredExecutor( DeferredExecutor executor, Group group )
{
synchronized ( deferredExecutors )
{
deferredExecutors.add( Pair.of( executor, group ) );
}
return this;
return new GraphDatabaseDependencies( monitors, userLogProvider, settingsClasses, kernelExtensions,
urlAccessRules, queryEngineProviders,
asImmutableList( concat( deferredExecutors, asIterable( Pair.of( executor, group ) ) ) ) );
}

public GraphDatabaseDependencies settingsClasses( List<Class<?>> settingsClasses )
{
return new GraphDatabaseDependencies( monitors, userLogProvider, settingsClasses, kernelExtensions,
urlAccessRules, queryEngineProviders );
return new GraphDatabaseDependencies( monitors, userLogProvider, asImmutableList( settingsClasses ),
kernelExtensions, urlAccessRules, queryEngineProviders, deferredExecutors );
}

public GraphDatabaseDependencies settingsClasses( Class<?>... settingsClass )
{
settingsClasses.addAll( Arrays.asList( settingsClass ) );
return new GraphDatabaseDependencies( monitors, userLogProvider, settingsClasses, kernelExtensions,
urlAccessRules, queryEngineProviders );
return new GraphDatabaseDependencies( monitors, userLogProvider,
asImmutableList( concat( settingsClasses, Arrays.asList( settingsClass ) ) ),
kernelExtensions, urlAccessRules, queryEngineProviders, deferredExecutors );
}

public GraphDatabaseDependencies kernelExtensions( Iterable<KernelExtensionFactory<?>> kernelExtensions )
{
return new GraphDatabaseDependencies( monitors, userLogProvider, settingsClasses,
addAll( new ArrayList<>(), kernelExtensions ),
urlAccessRules, queryEngineProviders );
asImmutableList( kernelExtensions ),
urlAccessRules, queryEngineProviders, deferredExecutors );
}

public GraphDatabaseDependencies urlAccessRules( Map<String,URLAccessRule> urlAccessRules )
{
final HashMap<String,URLAccessRule> newUrlAccessRules = new HashMap<>( this.urlAccessRules );
final Map<String,URLAccessRule> newUrlAccessRules = this.urlAccessRules.toMap();
newUrlAccessRules.putAll( urlAccessRules );
return new GraphDatabaseDependencies( monitors, userLogProvider, settingsClasses, kernelExtensions,
newUrlAccessRules, queryEngineProviders );
asImmutableMap( newUrlAccessRules ), queryEngineProviders, deferredExecutors );
}

public GraphDatabaseDependencies queryEngineProviders( Iterable<QueryEngineProvider> queryEngineProviders )
{
return new GraphDatabaseDependencies( monitors, userLogProvider, settingsClasses, kernelExtensions,
urlAccessRules, addAll( new ArrayList<>( this.queryEngineProviders ), queryEngineProviders ) );
urlAccessRules, asImmutableList( concat( this.queryEngineProviders, queryEngineProviders ) ),
deferredExecutors );
}

// Dependencies implementation
Expand Down Expand Up @@ -177,7 +187,7 @@ public Iterable<KernelExtensionFactory<?>> kernelExtensions()
@Override
public Map<String,URLAccessRule> urlAccessRules()
{
return urlAccessRules;
return urlAccessRules.castToMap();
}

@Override
Expand All @@ -189,6 +199,6 @@ public Iterable<QueryEngineProvider> executionEngines()
@Override
public Iterable<Pair<DeferredExecutor,Group>> deferredExecutors()
{
return deferredExecutors;
return deferredExecutors == null ? new ArrayList<>( 0 ) : deferredExecutors;
}
}

0 comments on commit 721b0f7

Please sign in to comment.