MIRTH-3352

DashboardPanelPlugin is now an abstract class with two child classes: DashboardTablePlugin and DashboardTabPlugin.

DashboardTablePlugin can provide a custom dashboard table class and place additional components in the panel below the dashboard table.

DashboardTabPlugin places a new tab in the tab panel below the dashboard.

Modified DashboardTreeTableModel so that table nodes are created via a supplied DashboardTableNodeFactory that returns an AbstractDashboardTableNode, rather than directly creating DashboardTableNode objects.

Added an 'UNKNOWN' deployed state and a black bullet icon to be displayed on the dashboard.

Added a DashboardTableNode.setValueAt() method to allow subclasses of DashboardTableNode to set row values.

Added DashboardTreeTableModel.refresh() to allow dashboard plugins to refresh the table model without needing to refresh the entire dashboard.
MIRTH-3353

Added the ability for external/plugin code to specify a custom implementation of the channel process lock. Added a ChannelProcessLock interface along with a DefaultChannelProcessLock implementation and getter/setter methods in the Donkey Channel class to get/set the process lock implementation.

Added addDispatchThread / removeDispatchThread methods so that external/plugin code can add/remove threads that should be terminated on channel halt.

Made the processUnfinishedMessages() method public so that external/plugin code can trigger the message recovery process.
MIRTH-3354

Made DonkeyEngineController's constructor protected so that it can be extended.

Split up channel deploy logic into smaller methods: executeGlobalDeployScript() and executeChannelPluginOnDeploy().

Made deployChannel and convertToDonkeyChannel methods protected so they can be overridden by subclasses.

Added a startupDeploy() method to the EngineController interface to distinguish between redeploying all channels and deploying all channels on server startup. Changed startup logic in Mirth.java to call startupDeploy() instead of redeployAllChannels().
MIRTH-3351

In com.mirth.connect.donkey.server.controllers.ChannelController, temporarily added a hardcoded check to instantiate com.mirth.connect.plugins.clustering.server.jdbc.ClusterDonkeyChannelController as the singleton instance if it exists on the classpath.

In DefaultControllerFactory, temporarily added a hardcoded check to instantiate com.mirth.connect.plugins.clustering.server.ClusterEngineController as the EngineController singleton instance if it exists on the classpath.

Changed com.mirth.connect.donkey.server.controllers.ChannelController's constructor to protected visibility so that this class can be extended.

Modified DefaultControllerFactory.createAuthorizationController() so that it is synchronized and also calls ExtensionController.loadExtensions() to ensure that the plugins have been read from the filesystem.

Modified DefaultExtensionController.loadExtensions() so that it will only run once if called multiple times, since it is now also being called in DefaultControllerFactory.

Modified ObjectXMLSerializer so that MapContentConverter and PluginMetaDataConverter are registered in the constructor rather than in init(). These converters can be registered in the constructor since they don't make use of the currentVersion string. This change was done since DefaultControllerFactory needs to deserialize plugin meta data before ObjectXMLSerializer.init() has been called.

The hardcoded class references will be removed once the controller override feature has been implemented.