Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes startup NPE with openlcb connection #4245

Merged
merged 1 commit into from Oct 14, 2017

Conversation

balazsracz
Copy link
Contributor

Startup of JMRI since 4.9.5 crashes with an NPE when there is an OpenLCB connection present in the profile.

Stacktrace:

2017-10-12 05:42:46,523 ptionhandler.UncaughtExceptionHandler ERROR - Uncaught Exception caught by jmri.util.exceptionhandler.UncaughtExceptionHandler [main]
java.lang.NullPointerException
	at jmri.jmrix.can.CanSystemConnectionMemo.provides(CanSystemConnectionMemo.java:51)
	at jmri.managers.ManagerDefaultSelector.lambda$9(ManagerDefaultSelector.java:340)
	at java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1549)
	at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
	at jmri.managers.ManagerDefaultSelector.isPreferencesValid(ManagerDefaultSelector.java:338)
	at jmri.managers.ManagerDefaultSelector.configure(ManagerDefaultSelector.java:252)
	at jmri.managers.ManagerDefaultSelector.initialize(ManagerDefaultSelector.java:289)
	at jmri.implementation.JmriConfigurationManager.initializeProvider(JmriConfigurationManager.java:263)
	at jmri.implementation.JmriConfigurationManager.lambda$3(JmriConfigurationManager.java:259)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1375)
	at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
	at jmri.implementation.JmriConfigurationManager.initializeProvider(JmriConfigurationManager.java:258)
	at jmri.implementation.JmriConfigurationManager.lambda$1(JmriConfigurationManager.java:183)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1375)
	at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
	at jmri.implementation.JmriConfigurationManager.load(JmriConfigurationManager.java:182)
	at jmri.implementation.JmriConfigurationManager.load(JmriConfigurationManager.java:170)
	at apps.Apps.<init>(Apps.java:251)
	at apps.PanelPro.PanelPro.<init>(PanelPro.java:40)
	at apps.PanelPro.PanelPro.main(PanelPro.java:102)

@balazsracz
Copy link
Contributor Author

@rhwood please consider this PR.

@bobjacobsen
Copy link
Member

Restart graphical Travis after unrelated:

[INFO] Running jmri.jmrix.dccpp.dccppovertcp.ServerFrameTest
ERROR - Proceeding to initialize class jmri.jmrix.dccpp.dccppovertcp.Server but initialization is marked as complete [main] jmri.InstanceManager.?()
java.lang.Exception: Thread "main"
	at jmri.InstanceManager.getNullableDefault(InstanceManager.java:239)
	at jmri.InstanceManager.getDefault(InstanceManager.java:188)
	at jmri.jmrix.dccpp.dccppovertcp.ServerFrame.initialize(ServerFrame.java:165)
	at jmri.InstanceManager.getNullableDefault(InstanceManager.java:279)
	at jmri.InstanceManager.getDefault(InstanceManager.java:188)
	at jmri.jmrix.dccpp.dccppovertcp.ServerFrame.getInstance(ServerFrame.java:115)
	at jmri.jmrix.dccpp.dccppovertcp.ServerFrameTest.getInstanceTest(ServerFrameTest.java:21)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:365)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:272)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:236)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:159)
	at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:386)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:323)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:143)
[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.107 s <<< FAILURE! - in jmri.jmrix.dccpp.dccppovertcp.ServerFrameTest
[ERROR] getInstanceTest(jmri.jmrix.dccpp.dccppovertcp.ServerFrameTest)  Time elapsed: 0.106 s  <<< FAILURE!
java.lang.AssertionError: Unexpected ERROR or FATAL messages emitted
	at org.junit.Assert.fail(Assert.java:88)
	at org.junit.Assert.assertTrue(Assert.java:41)
	at org.junit.Assert.assertFalse(Assert.java:64)
	at apps.tests.Log4JFixture.tearDown(Log4JFixture.java:38)
	at jmri.util.JUnitUtil.tearDown(JUnitUtil.java:118)
	at jmri.jmrix.dccpp.dccppovertcp.ServerFrameTest.tearDown(ServerFrameTest.java:34)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:33)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:365)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:272)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:236)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:159)
	at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:386)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:323)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:143)

[INFO] Running jmri.jmrix.dccpp.dccppovertcp.configurexml.ConnectionConfigXmlTest

@bobjacobsen
Copy link
Member

@balazsracz Do I understand correctly that this fixes a regression first present in 4.9.5? If so, we should respin 4.9.5 before release to include this.

@rhwood rhwood self-requested a review October 12, 2017 21:52
@rhwood
Copy link
Contributor

rhwood commented Oct 12, 2017

A quick look through this code suggests that provides() in this class really aught to be:

    public boolean provides(Class<?> type) {
        if (getDisabled() || manager == null) {
            return false;
        }
        return manager.provides(type);
    }

Despite that, I see no reason not to accept this now.

@balazsracz
Copy link
Contributor Author

@bobjacobsen yes this is a new regression in 4.9.5; respinning is definitely something that would be worth considering.

thanks,
Balazs

@bobjacobsen bobjacobsen merged commit 87fd928 into JMRI:master Oct 14, 2017
@bobjacobsen bobjacobsen added this to the 4.9.5 milestone Oct 14, 2017
@balazsracz balazsracz deleted the bracz-fixopenlcb-manager-npe branch January 31, 2018 01:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants