Why is a Bamboo CustomBuildCompleteAction implementation in my plugin unable to be cast?
Asked by David FALLAS:

I have been trying to develop a plugin which implements the Bamboo CustomBuildCompleteAction module.

I wish to trace my plugin code using IDEA and have started the Bamboo instance from the command line - atlas-debug --product bamboo. Running IDEA in debug mode informs me that it has successfully connected the debug port.

Having placed a breakpoint at the first line of code in my override of the CustomBuildCompleteAction.run() method, I would expect to see it triggered upon successful completion of a manually triggered build. However I do not. Instead, I see in the Bamboo .log the following:

ERROR \[AtlassianEvent::0-BAM::EVENTS:pool-2-thread-13\] \[NamedThreadFactory\] Uncaught exception in thread AtlassianEvent::0-BAM::EVENTS:pool-2-thread-13

java.lang.ClassCastException: co.nz.xxxxx.bamboo.plugins.PostBuildCompleteNotifier cannot be cast to com.atlassian.bamboo.build.CustomPostBuildCompletedAction

Can anyone assist me to resolve this? What do I need to add/modify to ensure that my implementation of the CustomPostBuildCompletedAction is cast-able?


Answers:
author: David FALLAS
body: The cause of my problem was right there in the exception message and was staring me in the face:

"PostBuild***Complete*** Notifier cannot be cast to com.atlassian.bamboo.build.CustomPostBuild***Completed***Action".

I had implemented the CustomPostBuild***Complete*** interface...

public PostBuildCompleteNotifier implements CustomPostBuildCompleteAction

..but had declared the postBuild***Completed***Action module in atlassian-plugin.xml:

\<postBuildCompletedAction .../\>

Silly boy - RTFM!


author: David FALLAS
body: Investigating this a bit further, I have added a constructor to my plugin to confirm that debugging is actually working. Here is the code, and the constructor definitely does get hit.

public class TestCompleteBuildAction implements CustomBuildCompleteAction

{

public TestCompleteBuildAction()

{

String _text = "constructor got hit";// \<-- breakpoint here definitely fires

}

@Override

public void run(Buildable buildable, BuildResults buildResults)

{

String _text = buildable.getBuildKey();// \<--breakpoint here does not.

}

}

The stack trace in the ERROR shows that the PostBuildCompletedEventsListener appears to be the class that is trying to cast my class (complete log entry follows):

ERROR \[AtlassianEvent::0-BAM::EVENTS:pool-2-thread-12\] \[NamedThreadFactory\] Uncaught exception in thread AtlassianEvent::0-BAM::EVENTS:pool-2-thread-12

java.lang.ClassCastException: co.nz.xxxxxx.bamboo.plugins.TestCompleteBuildAction cannot be cast to com.atlassian.bamboo.build.CustomPostBuildCompletedAction

at com.atlassian.bamboo.v2.build.events.PostBuildCompletedEventListener$1.run(PostBuildCompletedEventListener.java:67)

at com.atlassian.bamboo.variable.CustomVariableContextRunnerImpl.execute(CustomVariableContextRunnerImpl.java:27)

at com.atlassian.bamboo.v2.build.events.PostBuildCompletedEventListener.performAction(PostBuildCompletedEventListener.java:54)

...

Unfortunately, still no closer to understanding why ClassCastException is being thrown. Any assistance gratefully received.


Tags: app