diff --git a/community/lucene-index/src/main/java/org/neo4j/index/lucene/LuceneKernelExtension.java b/community/lucene-index/src/main/java/org/neo4j/index/lucene/LuceneKernelExtension.java index df605dff93829..81dbf2fe183d0 100644 --- a/community/lucene-index/src/main/java/org/neo4j/index/lucene/LuceneKernelExtension.java +++ b/community/lucene-index/src/main/java/org/neo4j/index/lucene/LuceneKernelExtension.java @@ -22,7 +22,6 @@ import java.io.File; import java.util.function.Supplier; -import org.neo4j.index.impl.lucene.explicit.LuceneIndexImplementation; import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.factory.OperationalMode; @@ -30,44 +29,44 @@ import org.neo4j.kernel.lifecycle.LifecycleAdapter; import org.neo4j.kernel.spi.explicitindex.IndexProviders; +/** + * @deprecated removed in 4.0 + */ +@Deprecated public class LuceneKernelExtension extends LifecycleAdapter { - private final File storeDir; - private final Config config; - private final Supplier indexStore; - private final FileSystemAbstraction fileSystemAbstraction; - private final IndexProviders indexProviders; - private final OperationalMode operationalMode; + private final org.neo4j.kernel.api.impl.index.LuceneKernelExtension delegate; + /** + * @deprecated removed in 4.0 + */ + @Deprecated public LuceneKernelExtension( File storeDir, Config config, Supplier indexStore, FileSystemAbstraction fileSystemAbstraction, IndexProviders indexProviders ) { this( storeDir, config, indexStore, fileSystemAbstraction, indexProviders, OperationalMode.single ); } + /** + * @deprecated removed in 4.0 + */ + @Deprecated public LuceneKernelExtension( File storeDir, Config config, Supplier indexStore, FileSystemAbstraction fileSystemAbstraction, IndexProviders indexProviders, OperationalMode operationalMode ) { - this.storeDir = storeDir; - this.config = config; - this.indexStore = indexStore; - this.fileSystemAbstraction = fileSystemAbstraction; - this.indexProviders = indexProviders; - this.operationalMode = operationalMode; + delegate = new org.neo4j.kernel.api.impl.index.LuceneKernelExtension( storeDir, config, indexStore, + fileSystemAbstraction, indexProviders, operationalMode ); } @Override public void init() { - - LuceneIndexImplementation indexImplementation = - new LuceneIndexImplementation( storeDir, config, indexStore, fileSystemAbstraction, operationalMode ); - indexProviders.registerIndexProvider( LuceneIndexImplementation.SERVICE_NAME, indexImplementation ); + delegate.init(); } @Override public void shutdown() { - indexProviders.unregisterIndexProvider( LuceneIndexImplementation.SERVICE_NAME ); + delegate.shutdown(); } } diff --git a/community/lucene-index/src/main/java/org/neo4j/index/lucene/LuceneKernelExtensionFactory.java b/community/lucene-index/src/main/java/org/neo4j/index/lucene/LuceneKernelExtensionFactory.java index e367b42db4a1f..4c80f508369b6 100644 --- a/community/lucene-index/src/main/java/org/neo4j/index/lucene/LuceneKernelExtensionFactory.java +++ b/community/lucene-index/src/main/java/org/neo4j/index/lucene/LuceneKernelExtensionFactory.java @@ -19,6 +19,10 @@ */ package org.neo4j.index.lucene; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + import org.neo4j.index.impl.lucene.explicit.LuceneIndexImplementation; import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.kernel.configuration.Config; @@ -28,19 +32,31 @@ import org.neo4j.kernel.lifecycle.Lifecycle; import org.neo4j.kernel.spi.explicitindex.IndexProviders; +/** + * @deprecated removed in 4.0 + */ +@Deprecated public class LuceneKernelExtensionFactory extends KernelExtensionFactory { + /** + * @deprecated removed in 4.0 + */ + @Deprecated public interface Dependencies { Config getConfig(); - IndexProviders getIndexProviders(); + org.neo4j.kernel.spi.legacyindex.IndexProviders getIndexProviders(); IndexConfigStore getIndexStore(); FileSystemAbstraction fileSystem(); } + /** + * @deprecated removed in 4.0 + */ + @Deprecated public LuceneKernelExtensionFactory() { super( LuceneIndexImplementation.SERVICE_NAME ); @@ -49,12 +65,39 @@ public LuceneKernelExtensionFactory() @Override public Lifecycle newInstance( KernelContext context, Dependencies dependencies ) throws Throwable { - return new LuceneKernelExtension( + IndexProviders indexProvider = mimicClassWith( IndexProviders.class, dependencies.getIndexProviders() ); + return new org.neo4j.kernel.api.impl.index.LuceneKernelExtension( context.storeDir(), dependencies.getConfig(), dependencies::getIndexStore, dependencies.fileSystem(), - dependencies.getIndexProviders(), + indexProvider, context.databaseInfo().operationalMode ); } + + /** + * Create a mimicking proxy since it's in the public API and can't be changed + */ + @SuppressWarnings( "unchecked" ) + private static T mimicClassWith( Class clazz, F base ) + { + return (T)Proxy.newProxyInstance( null, new Class[]{clazz}, new MimicWrapper<>( base ) ); + } + + private static class MimicWrapper implements InvocationHandler + { + private final F wrapped; + + MimicWrapper( F wrapped ) + { + this.wrapped = wrapped; + } + + @Override + public Object invoke( Object proxy, Method method, Object[] args ) throws Throwable + { + Method match = wrapped.getClass().getMethod(method.getName(), method.getParameterTypes()); + return match.invoke( wrapped, args); + } + } } diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/index/LuceneKernelExtension.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/index/LuceneKernelExtension.java new file mode 100644 index 0000000000000..5b3a2cea7548a --- /dev/null +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/index/LuceneKernelExtension.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2002-2017 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.neo4j.kernel.api.impl.index; + +import java.io.File; +import java.util.function.Supplier; + +import org.neo4j.index.impl.lucene.explicit.LuceneIndexImplementation; +import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.kernel.configuration.Config; +import org.neo4j.kernel.impl.factory.OperationalMode; +import org.neo4j.kernel.impl.index.IndexConfigStore; +import org.neo4j.kernel.lifecycle.LifecycleAdapter; +import org.neo4j.kernel.spi.explicitindex.IndexProviders; + +public class LuceneKernelExtension extends LifecycleAdapter +{ + private final File storeDir; + private final Config config; + private final Supplier indexStore; + private final FileSystemAbstraction fileSystemAbstraction; + private final IndexProviders indexProviders; + private final OperationalMode operationalMode; + + public LuceneKernelExtension( File storeDir, Config config, Supplier indexStore, + FileSystemAbstraction fileSystemAbstraction, IndexProviders indexProviders, OperationalMode operationalMode ) + { + this.storeDir = storeDir; + this.config = config; + this.indexStore = indexStore; + this.fileSystemAbstraction = fileSystemAbstraction; + this.indexProviders = indexProviders; + this.operationalMode = operationalMode; + } + + @Override + public void init() + { + + LuceneIndexImplementation indexImplementation = + new LuceneIndexImplementation( storeDir, config, indexStore, fileSystemAbstraction, operationalMode ); + indexProviders.registerIndexProvider( LuceneIndexImplementation.SERVICE_NAME, indexImplementation ); + } + + @Override + public void shutdown() + { + indexProviders.unregisterIndexProvider( LuceneIndexImplementation.SERVICE_NAME ); + } +} diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/index/LuceneKernelExtensionFactory.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/index/LuceneKernelExtensionFactory.java new file mode 100644 index 0000000000000..45906e2afa1ab --- /dev/null +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/index/LuceneKernelExtensionFactory.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2002-2017 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.neo4j.kernel.api.impl.index; + +import org.neo4j.index.impl.lucene.explicit.LuceneIndexImplementation; +import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.kernel.configuration.Config; +import org.neo4j.kernel.extension.KernelExtensionFactory; +import org.neo4j.kernel.impl.index.IndexConfigStore; +import org.neo4j.kernel.impl.spi.KernelContext; +import org.neo4j.kernel.lifecycle.Lifecycle; +import org.neo4j.kernel.spi.explicitindex.IndexProviders; + +public class LuceneKernelExtensionFactory extends KernelExtensionFactory +{ + public interface Dependencies + { + Config getConfig(); + + IndexProviders getIndexProviders(); + + IndexConfigStore getIndexStore(); + + FileSystemAbstraction fileSystem(); + } + + public LuceneKernelExtensionFactory() + { + super( LuceneIndexImplementation.SERVICE_NAME ); + } + + @Override + public Lifecycle newInstance( KernelContext context, Dependencies dependencies ) throws Throwable + { + return new LuceneKernelExtension( + context.storeDir(), + dependencies.getConfig(), + dependencies::getIndexStore, + dependencies.fileSystem(), + dependencies.getIndexProviders(), + context.databaseInfo().operationalMode ); + } +} diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/spi/legacyindex/IndexProviders.java b/community/lucene-index/src/main/java/org/neo4j/kernel/spi/legacyindex/IndexProviders.java new file mode 100644 index 0000000000000..2658758a8f19a --- /dev/null +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/spi/legacyindex/IndexProviders.java @@ -0,0 +1,17 @@ +package org.neo4j.kernel.spi.legacyindex; + + +import org.neo4j.kernel.spi.explicitindex.IndexImplementation; + +/** + * Registry of currently active index implementations. Indexing extensions should register the implementation + * here on startup, and unregister it on stop. + * @deprecated removed in 4.0 + */ +@Deprecated +public interface IndexProviders +{ + void registerIndexProvider( String name, IndexImplementation index ); + + boolean unregisterIndexProvider( String name ); +} \ No newline at end of file diff --git a/community/lucene-index/src/main/resources/META-INF/services/org.neo4j.kernel.extension.KernelExtensionFactory b/community/lucene-index/src/main/resources/META-INF/services/org.neo4j.kernel.extension.KernelExtensionFactory index ee53bd45c0458..173bf3efaeee5 100644 --- a/community/lucene-index/src/main/resources/META-INF/services/org.neo4j.kernel.extension.KernelExtensionFactory +++ b/community/lucene-index/src/main/resources/META-INF/services/org.neo4j.kernel.extension.KernelExtensionFactory @@ -1,3 +1,3 @@ -org.neo4j.index.lucene.LuceneKernelExtensionFactory +org.neo4j.kernel.api.impl.index.LuceneKernelExtensionFactory org.neo4j.kernel.api.impl.schema.LuceneSchemaIndexProviderFactory org.neo4j.kernel.api.impl.schema.NativeLuceneFusionSchemaIndexProviderFactory