Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Improve the error message when a kernel extension cannot be loaded fo…
…r various reasons. The error message is unfortunately still buried in the middle of the stack trace, but I think it would be too intrusive to improve that in a patch release.
- Loading branch information
Showing
13 changed files
with
244 additions
and
41 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
117 changes: 117 additions & 0 deletions
117
...ity/kernel/src/main/java/org/neo4j/kernel/extension/KernelExtensionFailureStrategies.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,117 @@ | |||
/* | |||
* Copyright (c) 2002-2018 "Neo4j," | |||
* Neo4j Sweden AB [http://neo4j.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 <http://www.gnu.org/licenses/>. | |||
*/ | |||
package org.neo4j.kernel.extension; | |||
|
|||
import java.io.PrintStream; | |||
|
|||
import org.neo4j.kernel.impl.util.UnsatisfiedDependencyException; | |||
|
|||
public class KernelExtensionFailureStrategies | |||
{ | |||
private KernelExtensionFailureStrategies() | |||
{ | |||
} | |||
|
|||
private static FailedToBuildKernelExtensionException wrap( KernelExtensionFactory kernelExtensionFactory, UnsatisfiedDependencyException e ) | |||
{ | |||
return new FailedToBuildKernelExtensionException( | |||
"Failed to build kernel extension " + kernelExtensionFactory + " due to a missing dependency: " + e.getMessage(), e ); | |||
} | |||
|
|||
private static FailedToBuildKernelExtensionException wrap( KernelExtensionFactory kernelExtensionFactory, Throwable e ) | |||
{ | |||
StringBuilder message = new StringBuilder( "Failed to build kernel extension " ).append( kernelExtensionFactory ); | |||
if ( e instanceof LinkageError || e instanceof ReflectiveOperationException ) | |||
{ | |||
if ( e instanceof LinkageError ) | |||
{ | |||
message.append( " because it is compiled with a reference to a class, method, or field, that is not in the class path: " ); | |||
} | |||
else | |||
{ | |||
message.append( " because it a reflective access to a class, method, or field, that is not in the class path: " ); | |||
} | |||
message.append( '\'' ).append( e.getMessage() ).append( '\'' ); | |||
message.append( ". The most common cause of this problem, is that Neo4j has been upgraded without also upgrading all" ); | |||
message.append( "installed extensions, such as APOC. " ); | |||
message.append( "Make sure that all of your extensions are build against your specific version of Neo4j." ); | |||
} | |||
else | |||
{ | |||
message.append( " because of an unanticipated error: '" ).append( e.getMessage() ).append( "'." ); | |||
} | |||
return new FailedToBuildKernelExtensionException( message.toString(), e ); | |||
} | |||
|
|||
public static KernelExtensionFailureStrategy fail() | |||
{ | |||
return new KernelExtensionFailureStrategy() | |||
{ | |||
@Override | |||
public void handle( KernelExtensionFactory kernelExtensionFactory, UnsatisfiedDependencyException e ) | |||
{ | |||
throw wrap( kernelExtensionFactory, e ); | |||
} | |||
|
|||
@Override | |||
public void handle( KernelExtensionFactory kernelExtensionFactory, Throwable e ) | |||
{ | |||
throw wrap( kernelExtensionFactory, e ); | |||
} | |||
}; | |||
} | |||
|
|||
public static KernelExtensionFailureStrategy ignore() | |||
{ | |||
return new KernelExtensionFailureStrategy() | |||
{ | |||
@Override | |||
public void handle( KernelExtensionFactory kernelExtensionFactory, UnsatisfiedDependencyException e ) | |||
{ | |||
// Just ignore. | |||
} | |||
|
|||
@Override | |||
public void handle( KernelExtensionFactory kernelExtensionFactory, Throwable e ) | |||
{ | |||
// Just ignore. | |||
} | |||
}; | |||
} | |||
|
|||
// Perhaps not used, but very useful for debugging kernel extension loading problems | |||
public static KernelExtensionFailureStrategy print( PrintStream out ) | |||
{ | |||
return new KernelExtensionFailureStrategy() | |||
{ | |||
@Override | |||
public void handle( KernelExtensionFactory kernelExtensionFactory, UnsatisfiedDependencyException e ) | |||
{ | |||
wrap( kernelExtensionFactory, e ).printStackTrace( out ); | |||
} | |||
|
|||
@Override | |||
public void handle( KernelExtensionFactory kernelExtensionFactory, Throwable e ) | |||
{ | |||
wrap( kernelExtensionFactory, e ).printStackTrace( out ); | |||
} | |||
}; | |||
} | |||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
40 changes: 40 additions & 0 deletions
40
...ernel/src/test/java/org/neo4j/kernel/extension/UninitializableKernelExtensionFactory.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,40 @@ | |||
/* | |||
* Copyright (c) 2002-2018 "Neo4j," | |||
* Neo4j Sweden AB [http://neo4j.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 <http://www.gnu.org/licenses/>. | |||
*/ | |||
package org.neo4j.kernel.extension; | |||
|
|||
import org.neo4j.kernel.impl.spi.KernelContext; | |||
import org.neo4j.kernel.lifecycle.Lifecycle; | |||
|
|||
/** | |||
* This kernel extension cannot be initialised, because an exception will be thrown we the machinery tries to create a proxy of the UnproxyableDepencies class. | |||
*/ | |||
public class UninitializableKernelExtensionFactory extends KernelExtensionFactory<UnproxyableDependencies> | |||
{ | |||
public UninitializableKernelExtensionFactory() | |||
{ | |||
super( "uninitializable" ); | |||
} | |||
|
|||
@Override | |||
public Lifecycle newInstance( KernelContext context, UnproxyableDependencies dependencies ) | |||
{ | |||
return null; | |||
} | |||
} |
27 changes: 27 additions & 0 deletions
27
community/kernel/src/test/java/org/neo4j/kernel/extension/UnproxyableDependencies.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,27 @@ | |||
/* | |||
* Copyright (c) 2002-2018 "Neo4j," | |||
* Neo4j Sweden AB [http://neo4j.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 <http://www.gnu.org/licenses/>. | |||
*/ | |||
package org.neo4j.kernel.extension; | |||
|
|||
/** | |||
* This cannot be initialised as a dependencies proxy, because it is only possible to make proxies of interfaces, and this is a class! | |||
*/ | |||
class UnproxyableDependencies | |||
{ | |||
} |
Oops, something went wrong.