From 721b0f786260c27ae16235ab5e155929fd186ef5 Mon Sep 17 00:00:00 2001 From: Andrew Jefferson Date: Wed, 19 Sep 2018 15:51:42 +0200 Subject: [PATCH] use immutable collections in GraphDatabaseDependencies --- .../facade/GraphDatabaseDependencies.java | 102 ++++++++++-------- 1 file changed, 56 insertions(+), 46 deletions(-) diff --git a/community/neo4j/src/main/java/org/neo4j/graphdb/facade/GraphDatabaseDependencies.java b/community/neo4j/src/main/java/org/neo4j/graphdb/facade/GraphDatabaseDependencies.java index 0b5d69a7853a5..a00e7a5c42219 100644 --- a/community/neo4j/src/main/java/org/neo4j/graphdb/facade/GraphDatabaseDependencies.java +++ b/community/neo4j/src/main/java/org/neo4j/graphdb/facade/GraphDatabaseDependencies.java @@ -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; @@ -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> kernelExtensions = new ArrayList<>(); - for ( KernelExtensionFactory factory : Service.load( KernelExtensionFactory.class ) ) - { - kernelExtensions.add( factory ); - } + ImmutableList> settingsClasses = ImmutableListFactoryImpl.INSTANCE.empty(); + ImmutableList> kernelExtensions = asImmutableList( Service.load( KernelExtensionFactory.class ) ); - Map urlAccessRules = new HashMap<>(); - urlAccessRules.put( "http", URLAccessRules.alwaysPermitted() ); - urlAccessRules.put( "https", URLAccessRules.alwaysPermitted() ); - urlAccessRules.put( "ftp", URLAccessRules.alwaysPermitted() ); - urlAccessRules.put( "file", URLAccessRules.fileAccess() ); + ImmutableMap urlAccessRules = ImmutableMapFactoryImpl.INSTANCE.of( + "http", URLAccessRules.alwaysPermitted(), + "https", URLAccessRules.alwaysPermitted(), + "ftp", URLAccessRules.alwaysPermitted(), + "file", URLAccessRules.fileAccess() + ); - List queryEngineProviders = asList( Service.load( QueryEngineProvider.class ) ); + ImmutableList queryEngineProviders = asImmutableList( Service.load( QueryEngineProvider.class ) ); + ImmutableList> 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> settingsClasses; - private final List> kernelExtensions; - private final Map urlAccessRules; - private final List queryEngineProviders; - private final List> deferredExecutors = new LinkedList<>(); + private final ImmutableList> settingsClasses; + private final ImmutableList> kernelExtensions; + private final ImmutableMap urlAccessRules; + private final ImmutableList queryEngineProviders; + private final ImmutableList> deferredExecutors; private GraphDatabaseDependencies( Monitors monitors, LogProvider userLogProvider, - List> settingsClasses, - List> kernelExtensions, - Map urlAccessRules, - List queryEngineProviders ) + ImmutableList> settingsClasses, + ImmutableList> kernelExtensions, + ImmutableMap urlAccessRules, + ImmutableList queryEngineProviders, + ImmutableList> 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> 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> kernelExtensions ) { return new GraphDatabaseDependencies( monitors, userLogProvider, settingsClasses, - addAll( new ArrayList<>(), kernelExtensions ), - urlAccessRules, queryEngineProviders ); + asImmutableList( kernelExtensions ), + urlAccessRules, queryEngineProviders, deferredExecutors ); } public GraphDatabaseDependencies urlAccessRules( Map urlAccessRules ) { - final HashMap newUrlAccessRules = new HashMap<>( this.urlAccessRules ); + final Map newUrlAccessRules = this.urlAccessRules.toMap(); newUrlAccessRules.putAll( urlAccessRules ); return new GraphDatabaseDependencies( monitors, userLogProvider, settingsClasses, kernelExtensions, - newUrlAccessRules, queryEngineProviders ); + asImmutableMap( newUrlAccessRules ), queryEngineProviders, deferredExecutors ); } public GraphDatabaseDependencies queryEngineProviders( Iterable queryEngineProviders ) { return new GraphDatabaseDependencies( monitors, userLogProvider, settingsClasses, kernelExtensions, - urlAccessRules, addAll( new ArrayList<>( this.queryEngineProviders ), queryEngineProviders ) ); + urlAccessRules, asImmutableList( concat( this.queryEngineProviders, queryEngineProviders ) ), + deferredExecutors ); } // Dependencies implementation @@ -177,7 +187,7 @@ public Iterable> kernelExtensions() @Override public Map urlAccessRules() { - return urlAccessRules; + return urlAccessRules.castToMap(); } @Override @@ -189,6 +199,6 @@ public Iterable executionEngines() @Override public Iterable> deferredExecutors() { - return deferredExecutors; + return deferredExecutors == null ? new ArrayList<>( 0 ) : deferredExecutors; } }