[rhq] Branch 'mod_cluster_plugin' - 113 commits - .classpath etc/eclipse-tools etc/m2 .gitignore modules/common modules/core modules/enterprise modules/integration-tests modules/plugins modules/pom.xml modules/test-utils pom.xml
by snegrea
.classpath | 2
.gitignore | 3
etc/eclipse-tools/maven/RHQ | 4
etc/m2/settings.xml | 1
modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReaderImpl.java | 35
modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriter.java | 1
modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriterImpl.java | 1
modules/common/drift/src/main/java/org/rhq/common/drift/Headers.java | 16
modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetReaderImplTest.java | 13
modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetWriterImplTest.java | 27
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/drift/DriftServerService.java | 9
modules/core/client-api/src/main/resources/rhq-configuration.xsd | 4
modules/core/client-api/src/main/resources/rhq-plugin.xsd | 19
modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml | 3
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml | 4
modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java | 61 -
modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionCategory.java | 4
modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionLog.java | 15
modules/core/domain/src/main/java/org/rhq/core/domain/alert/composite/AlertConditionDriftCategoryComposite.java | 40
modules/core/domain/src/main/java/org/rhq/core/domain/alert/composite/AlertConditionRangeCategoryComposite.java | 48
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/DriftCriteria.java | 5
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/GenericDriftCriteria.java | 13
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/JPADriftCriteria.java | 18
modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftChangeSet.java | 22
modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java | 35
modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationComparator.java | 6
modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java | 133 +-
modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftSnapshot.java | 10
modules/core/domain/src/main/java/org/rhq/core/domain/drift/JPADriftChangeSet.java | 16
modules/core/domain/src/main/java/org/rhq/core/domain/drift/dto/DriftChangeSetDTO.java | 13
modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java | 5
modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java | 3
modules/core/domain/src/test/java/org/rhq/core/domain/drift/DriftConfigurationTest.java | 38
modules/core/domain/src/test/java/org/rhq/core/domain/drift/DriftSnapshotTest.java | 403 ++++++
modules/core/domain/src/test/java/org/rhq/core/domain/drift/SnapshotTest.java | 390 ------
modules/core/domain/src/test/java/org/rhq/core/domain/operation/OperationHistoryTest.java | 2
modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ResourceGroupTest.java | 2
modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/event/log/LogFileEventResourceComponentHelper.java | 24
modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ClassLoaderFacet.java | 2
modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ManualAddFacet.java | 2
modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceComponent.java | 2
modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceContext.java | 14
modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceDiscoveryComponent.java | 2
modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceDiscoveryContext.java | 13
modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/upgrade/ResourceUpgradeContext.java | 27
modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/upgrade/ResourceUpgradeFacet.java | 2
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java | 2
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java | 2
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java | 202 ++-
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java | 143 ++
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ScheduleQueue.java | 5
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ScheduleQueueImpl.java | 72 +
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSyncManager.java | 147 ++
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSynchronizer.java | 84 +
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSynchronizerFactory.java | 37
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/RuntimeSynchronizer.java | 137 ++
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/StartupSynchronizer.java | 137 ++
modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java | 232 ++-
modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/ResourceContainer.java | 27
modules/core/plugin-container/src/main/java/org/rhq/core/pc/plugin/PluginComponentFactory.java | 24
modules/core/plugin-container/src/main/java/org/rhq/core/pc/upgrade/ResourceUpgradeDelegate.java | 28
modules/core/plugin-container/src/main/java/org/rhq/core/pc/util/DiscoveryComponentProxyFactory.java | 25
modules/core/plugin-container/src/test/java/org/rhq/core/pc/PluginContainerTest.java | 51
modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java | 60
modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftManagerTest.java | 65 +
modules/core/plugin-container/src/test/java/org/rhq/core/pc/inventory/ResourceContainerTest.java | 11
modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/failing/DiscComponent.java | 14
modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/failing/ResComponent.java | 14
modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/BaseDiscoveryComponent.java | 2
modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/BaseResourceComponent.java | 54
modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/BaseUpgradingDiscoveryComponent.java | 10
modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/NothingDiscoveringDiscoveryComponent.java | 3
modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v1/DiscComponent.java | 4
modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v1/ResComponent.java | 4
modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v2/DiscComponent.java | 8
modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v2/ResComponent.java | 4
modules/core/plugindoc/pom.xml | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java | 26
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java | 57
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java | 16
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesView.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDetailsView.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java | 197 +--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/CliNotificationSenderForm.java | 362 +++--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsAlertDefinitionForm.java | 43
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java | 124 +-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/DampeningAlertDefinitionForm.java | 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java | 564 ++++++---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentListView.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleResourceDeploymentHistoryListView.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/file/FileListView.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/AboutModalWindow.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/TitleBar.java | 15
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java | 110 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/NumberWithUnitsValidator.java | 112 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/measurement/AbstractMeasurementRangeEditor.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/AbstractTableSection.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/TableSection.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/content/repository/tree/ContentRepositoryTreeView.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/drift/RecentDriftsPortlet.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/imported/RecentlyAddedResourcesPortlet.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/problems/ProblemResourcesPortlet.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/summary/TagCloudPortlet.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/AbstractDriftChangeSetsTreeDataSource.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/AbstractDriftChangeSetsTreeView.java | 12
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java | 29
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationEditView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationView.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDataSource.java | 19
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDetailsView.java | 147 +-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftHistoryView.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftChangeSetsTreeDataSource.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftChangeSetsTreeView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftChangeSetsView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftConfigurationView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftAddConfigWizard.java | 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftAddConfigWizardInfoStep.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleListView.java | 13
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/UpdateCollectionIntervalWidget.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryDetailsView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/SingleGroupDefinitionView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java | 22
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java | 82 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/GroupResourceConfigurationEditView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationTable.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationTable.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/MembersView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/table/GroupMeasurementTableDataSource.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceCompositeSearchView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ChildHistoryDetails.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/OverviewForm.java | 15
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 41
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeDatasource.java | 35
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDataSource.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/calltime/CallTimeDataSource.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/calltime/CallTimeView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MeasurementTableDataSource.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java | 13
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java | 25
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java | 41
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/ProblemResourcesDataSource.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestDataSourceResponseStatisticsView.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestNumberFormatView.java | 78 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestRemoteServiceStatisticsView.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestTopView.java | 9
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/MeasurementConverterClient.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/measurement/GwtMeasurementConverter.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/measurement/MeasurementParser.java | 121 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/util/SerialUtility.java | 2
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 151 +-
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties | 174 +-
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties | 151 +-
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties | 169 +-
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties | 142 +-
modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.html | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/ExternalizableStrategyCommandListener.java | 2
modules/enterprise/server/container/src/main/bin-resources/bin/rhq-server.sh | 8
modules/enterprise/server/ear/pom.xml | 6
modules/enterprise/server/jar/pom.xml | 25
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/impl/AgentClientImpl.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java | 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java | 472 +++++--
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerBean.java | 20
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/AlertConditionCacheManagerBean.java | 7
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/AlertConditionCacheManagerLocal.java | 9
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AbstractConditionCache.java | 25
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java | 122 +-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheCoordinator.java | 44
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheUtils.java | 22
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/GlobalConditionCache.java | 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/mbean/AlertConditionCacheMonitor.java | 25
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/mbean/AlertConditionCacheMonitorMBean.java | 10
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/AbstractCacheElement.java | 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/DriftCacheElement.java | 103 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/MeasurementNumericCacheElement.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/MeasurementRangeNumericCacheElement.java | 95 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/i18n/AlertI18NResourceKeys.java | 189 ++-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleServerServiceImpl.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftChangesetBean.java | 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftFileBean.java | 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java | 87 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerLocal.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerRemote.java | 8
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftServerServiceImpl.java | 52
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java | 33
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerLocal.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java | 26
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftChangeSetSummary.java | 121 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftServerPluginFacet.java | 11
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteSafeInvocationHandler.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteWsInvocationHandler.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java | 76 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/AsyncResourceDeleteJob.java | 22
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/engine/model/MeasurementRangeNumericCacheElementTest.java | 96 +
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java | 442 +++++++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java | 487 +++++--
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/DeleteAlertsTest.java | 123 ++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/operation/OperationManagerBeanTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/PluginDescriptorValidationTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/SubcategoryTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateConfigurationSubsystemTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateContentSubsystemTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateEventsSubsystemTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateMeasurementSubsystemTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateNativesSubsystemTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateOperationsSubsystemTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdatePluginMetadataTestBase.java | 446 +++++++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceSubsystemTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateSubsytemTestBase.java | 407 ------
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/test/ResourceManagerBeanTest.java | 25
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java | 73 -
modules/enterprise/server/jar/src/test/resources/embedded-jboss-beans.xml | 177 --
modules/enterprise/server/jar/src/test/resources/jboss-jms-beans.xml | 102 -
modules/enterprise/server/jar/src/test/resources/jms-ra.rar |binary
modules/enterprise/server/jar/src/test/resources/log4j.xml | 5
modules/enterprise/server/jar/src/test/resources/login-config.xml | 9
modules/enterprise/server/jar/src/test/resources/rhq-mdb-beans.xml | 25
modules/enterprise/server/jar/src/test/resources/test/metadata/alerts/type-with-metric.xml | 14
modules/enterprise/server/plugins/drift-mongodb/pom.xml | 11
modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java | 89 +
modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAO.java | 17
modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java | 59
modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBChangeSet.java | 13
modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBChangeSetEntry.java | 22
modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBFile.java | 12
modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/GridFSTest.java | 63 -
modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAOTest.java | 162 ++
modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAOTest.java | 161 ++
modules/enterprise/server/plugins/drift-rhq/src/main/java/org/rhq/enterprise/server/plugins/drift/JPADriftServerPluginComponent.java | 9
modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/safeinvoker/EJB3SafeEndpointInvoker.java | 58
modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/safeinvoker/EJB3SafeEndpointInvokerDeploymentAspect.java | 59
modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/safeinvoker/HibernateDetachUtility.java | 610 ++++++++++
modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/util/EJB3SafeEndpointInvoker.java | 58
modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/util/EJB3SafeEndpointInvokerDeploymentAspect.java | 59
modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/util/HibernateDetachUtility.java | 569 ---------
modules/enterprise/server/safe-invoker/src/test/java/org/rhq/enterprise/server/safeinvoker/HibernateDetachUtilityTest.java | 142 ++
modules/enterprise/server/safe-invoker/src/test/java/org/rhq/enterprise/server/util/HibernateDetachUtilityTest.java | 141 --
modules/integration-tests/mod_cluster-plugin-test/pom.xml | 15
modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java | 24
modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationDiscoveryComponent.java | 10
modules/plugins/database/src/main/java/org/rhq/plugins/database/AbstractDatabaseComponent.java | 3
modules/plugins/database/src/main/java/org/rhq/plugins/database/CustomTableComponent.java | 25
modules/plugins/database/src/main/java/org/rhq/plugins/database/CustomTableDiscoveryComponent.java | 6
modules/plugins/database/src/main/java/org/rhq/plugins/database/CustomTableRowDiscoveryComponent.java | 4
modules/plugins/database/src/main/java/org/rhq/plugins/database/DatabaseComponent.java | 3
modules/plugins/hibernate/src/main/java/org/rhq/plugins/hibernate/EntityComponent.java | 48
modules/plugins/hibernate/src/main/java/org/rhq/plugins/hibernate/EntityDiscoveryComponent.java | 50
modules/plugins/hibernate/src/main/java/org/rhq/plugins/hibernate/StatisticsComponent.java | 60
modules/plugins/hudson/src/main/java/org/rhq/plugins/hudson/HudsonServerComponent.java | 14
modules/plugins/iis/src/main/java/org/rhq/plugins/iis/IISServerComponent.java | 3
modules/plugins/iis/src/main/java/org/rhq/plugins/iis/IISVHostComponent.java | 10
modules/plugins/iis/src/main/java/org/rhq/plugins/iis/IISVHostDiscoveryComponent.java | 4
modules/plugins/irc/src/main/java/org/rhq/plugins/irc/IRCServerComponent.java | 2
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedComponent.java | 26
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedDeploymentComponent.java | 17
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedDeploymentDiscoveryComponent.java | 75 -
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java | 17
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossMessagingComponent.java | 10
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossMessagingDiscoveryComponent.java | 4
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossWebComponent.java | 22
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossWebDiscoveryComponent.java | 4
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JmsDestinationDiscoveryComponent.java | 2
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java | 58
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentDiscoveryComponent.java | 13
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedDeploymentDiscoveryComponent.java | 4
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/PlatformComponent.java | 397 +++---
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/PlatformDiscoveryComponent.java | 128 --
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ProfileServiceComponent.java | 2
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/WebApplicationContextComponent.java | 217 +--
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/helper/JBossInstanceInfo.java | 9
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/script/ScriptComponent.java | 64 -
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/script/ScriptDiscoveryComponent.java | 23
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/util/JBossConfigurationUtility.java | 2
modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml | 7
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/AbstractBaseDiscovery.java | 2
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java | 2
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java | 82 -
modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml | 8
modules/plugins/jboss-as-7/src/test/resources/test-plugin.xml | 2
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/AbstractMessagingComponent.java | 58
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/AbstractMessagingDiscoveryComponent.java | 4
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/ApplicationComponent.java | 2
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/ApplicationDiscoveryComponent.java | 16
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/ConnectionFactoryComponent.java | 4
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/DatasourceComponent.java | 4
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/EJB2BeanComponent.java | 2
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/EJB3BeanComponent.java | 2
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/EmbeddedWarDiscoveryComponent.java | 19
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBMDestinationDiscoveryComponent.java | 4
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASServerComponent.java | 20
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatConnectorDiscoveryComponent.java | 24
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatDiscoveryComponent.java | 54
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatServerComponent.java | 8
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatVHostDiscoveryService.java | 4
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatVHostService.java | 46
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossMQDiscoveryComponent.java | 2
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossMessagingComponent.java | 49
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossMessagingDiscoveryComponent.java | 2
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JMSComponent.java | 53
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/WarDiscoveryComponent.java | 2
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/helper/JBossInstanceInfo.java | 9
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/script/ScriptComponent.java | 7
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/script/ScriptDiscoveryComponent.java | 75 -
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/util/JBossConfigurationUtility.java | 2
modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheComponent.java | 60
modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheDetailComponent.java | 8
modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheDetailDiscoveryComponent.java | 4
modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheDiscoveryComponent.java | 4
modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheComponent.java | 8
modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheDiscoveryComponent.java | 6
modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheSubsystemComponent.java | 2
modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheSubsystemDiscovery.java | 4
modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/EmbeddedJMXServerDiscoveryComponent.java | 16
modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/InternalJMXServerDiscoveryComponent.java | 4
modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/JMXComponent.java | 2
modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/JMXServerComponent.java | 3
modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/MBeanResourceComponent.java | 2
modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/MBeanResourceDiscoveryComponent.java | 12
modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/ClassNameMBeanComponent.java | 4
modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/ClassNameMBeanDiscoveryComponent.java | 3
modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/LoadMetricDiscoveryComponent.java | 7
modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/WebappContextComponent.java | 4
modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/WebappContextDiscoveryComponent.java | 7
modules/plugins/mysql/src/main/java/org/rhq/plugins/mysql/MySqlComponent.java | 3
modules/plugins/pattern-generator/src/main/java/org/rhq/plugins/pattern/PatternComponent.java | 79 -
modules/plugins/pattern-generator/src/main/java/org/rhq/plugins/pattern/PatternDiscovery.java | 2
modules/plugins/pattern-generator/src/main/resources/META-INF/rhq-plugin.xml | 15
modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemDiscoveryComponent.java | 78 -
modules/plugins/platform/src/main/java/org/rhq/plugins/platform/PlatformComponent.java | 7
modules/plugins/postfix/src/main/java/org/rhq/plugins/postfix/PostfixAccessDiscoveryComponent.java | 5
modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresDatabaseComponent.java | 6
modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresDatabaseDiscoveryComponent.java | 8
modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresServerComponent.java | 3
modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresUserComponent.java | 6
modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresUserDiscoveryComponent.java | 6
modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentEnvironmentScriptComponent.java | 4
modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentEnvironmentScriptDiscoveryComponent.java | 8
modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentJavaServiceWrapperComponent.java | 8
modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentJavaServiceWrapperDiscoveryComponent.java | 8
modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentLauncherScriptComponent.java | 6
modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentLauncherScriptDiscoveryComponent.java | 8
modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentServerComponent.java | 5
modules/plugins/rhq-server/src/main/resources/META-INF/rhq-plugin.xml | 6
modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java | 39
modules/plugins/snmptrapd/src/main/java/org/rhq/plugins/snmptrapd/SnmpTrapdComponent.java | 2
modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatConnectorComponent.java | 6
modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatConnectorDiscoveryComponent.java | 5
modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatServerComponent.java | 16
modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatUserDatabaseComponent.java | 4
modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatVHostComponent.java | 7
modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatVHostDiscoveryComponent.java | 11
modules/plugins/twitter/src/main/java/org/rhq/plugins/twitter/TwitterComponent.java | 2
modules/plugins/virt/src/main/java/org/rhq/plugins/virt/VirtualizationHostComponent.java | 2
modules/pom.xml | 22
modules/test-utils/src/main/java/org/rhq/test/JPAUtils.java | 34
modules/test-utils/src/main/java/org/rhq/test/TransactionCallbackWithContext.java | 10
pom.xml | 86 +
371 files changed, 10010 insertions(+), 5477 deletions(-)
New commits:
commit 6f72300567cbb5ecccdfa7da473675f864c075b4
Merge: 21a2a27 ce216a9
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Tue Sep 27 15:53:16 2011 -0500
Merge branch 'master' into mod_cluster_plugin
commit ce216a9370e354bfd6089d929504b98be73e7e7b
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Tue Sep 27 13:58:28 2011 -0400
[BZ 739529] fix a regression that was causing the group Configuration tab to
never be displayed (https://bugzilla.redhat.com/show_bug.cgi?id=739529)
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
index 103acdd..1ecd83f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
@@ -76,7 +76,7 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
- * Right panel of the Resource Group view (#ResourceGroup/*).
+ * The right panel of a Resource Group view (#ResourceGroup/* or #Resource/AutoGroup/*).
*
* @author Jay Shaughnessy
* @author Ian Springer
@@ -247,8 +247,6 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
protected void updateTabContent(ResourceGroupComposite groupComposite) {
try {
this.groupComposite = groupComposite;
- ResourceGroup group = groupComposite.getResourceGroup();
- int groupId = group.getId();
getTitleBar().setGroup(groupComposite);
// wipe the canvas views for the current set of subtabs.
@@ -258,13 +256,13 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
Set<ResourceTypeFacet> facets = groupComposite.getResourceFacets().getFacets();
updateSummaryTab();
- updateMonitoringTab(groupId, groupCategory, facets);
- updateInventoryTab(groupId, facets);
+ updateInventoryTab(facets);
+ updateAlertsTab(groupCategory);
+ updateMonitoringTab(facets);
+ updateEventsTab(groupCategory, facets);
updateOperationsTab(groupCategory, facets);
- updateAlertsTab(groupComposite, groupCategory);
- updateConfigurationTab(groupId, groupCategory, facets);
- updateDriftTab(groupComposite, groupCategory, facets);
- updateEventsTab(groupComposite, groupCategory, facets);
+ updateConfigurationTab(groupCategory, facets);
+ updateDriftTab(groupCategory, facets);
this.show();
markForRedraw();
@@ -285,12 +283,13 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
// TODO (ips): Add Timeline subtab?
}
- private void updateMonitoringTab(final int groupId, GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
+ private void updateMonitoringTab(Set<ResourceTypeFacet> facets) {
ViewFactory viewFactory;
// TODO: Once we add an Availability subtab, the Monitoring tab will always be visible, even for groups with
// no metrics.
boolean visible = hasMetricsOfType(this.groupComposite, null);
if (updateTab(this.monitoringTab, visible, true)) {
+ final int groupId = groupComposite.getResourceGroup().getId();
visible = hasMetricsOfType(this.groupComposite, DataType.MEASUREMENT);
viewFactory = (!visible) ? null : new ViewFactory() {
@Override
@@ -352,14 +351,15 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
}
}
- private void updateInventoryTab(final int groupId, Set<ResourceTypeFacet> facets) {
+ private void updateInventoryTab(Set<ResourceTypeFacet> facets) {
// Inventory tab is always visible and enabled.
final boolean canModifyMembers = (!isAutoGroup() && !isAutoCluster() && globalPermissions
.contains(Permission.MANAGE_INVENTORY));
updateSubTab(this.inventoryTab, this.inventoryMembers, true, true, new ViewFactory() {
@Override
public Canvas createView() {
- return new MembersView(inventoryMembers.extendLocatorId("View"), groupId, canModifyMembers);
+ return new MembersView(inventoryMembers.extendLocatorId("View"),
+ groupComposite.getResourceGroup().getId(), canModifyMembers);
}
});
updateSubTab(this.inventoryTab, this.inventoryConn, facets.contains(ResourceTypeFacet.PLUGIN_CONFIGURATION),
@@ -398,7 +398,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
}
}
- private void updateAlertsTab(final ResourceGroupComposite groupComposite, GroupCategory groupCategory) {
+ private void updateAlertsTab(GroupCategory groupCategory) {
// alerts tab is always visible, even for mixed groups
if (updateTab(this.alertsTab, true, true)) {
// alert history is always available
@@ -420,7 +420,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
}
}
- private void updateConfigurationTab(final int groupId, GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
+ private void updateConfigurationTab(GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
boolean visible = (groupCategory == GroupCategory.COMPATIBLE && facets
.contains(ResourceTypeFacet.CONFIGURATION));
Set<Permission> groupPermissions = this.groupComposite.getResourcePermission().getPermissions();
@@ -434,15 +434,14 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
updateSubTab(this.configurationTab, this.configHistory, true, true, new ViewFactory() {
@Override
public Canvas createView() {
- return new HistoryGroupResourceConfigurationView(inventoryConnHistory.extendLocatorId("View"),
+ return new HistoryGroupResourceConfigurationView(configHistory.extendLocatorId("View"),
groupComposite);
}
});
}
}
- private void updateEventsTab(final ResourceGroupComposite groupComposite, GroupCategory groupCategory,
- Set<ResourceTypeFacet> facets) {
+ private void updateEventsTab(GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
// allow mixed groups to show events from supporting resources
boolean visible = (groupCategory == GroupCategory.MIXED || (groupCategory == GroupCategory.COMPATIBLE && facets
.contains(ResourceTypeFacet.EVENT)));
@@ -456,12 +455,11 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
}
}
- private void updateDriftTab(final ResourceGroupComposite resourceComposite, GroupCategory groupCategory,
- Set<ResourceTypeFacet> facets) {
+ private void updateDriftTab(GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
boolean visible = (groupCategory == GroupCategory.COMPATIBLE && facets.contains(ResourceTypeFacet.DRIFT));
Set<Permission> groupPermissions = this.groupComposite.getResourcePermission().getPermissions();
- if (updateTab(this.configurationTab, visible, visible && groupPermissions.contains(Permission.MANAGE_DRIFT))) {
+ if (updateTab(this.driftTab, visible, visible && groupPermissions.contains(Permission.MANAGE_DRIFT))) {
updateSubTab(this.driftTab, this.driftHistory, true, true, new ViewFactory() {
@Override
commit 1026cd0039574ee628929c0140b6ce452b0db822
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Tue Sep 27 11:38:03 2011 -0400
[BZ 736517] remove unnecessary loading of grandchildren Resources in
ResourceManagerBean.getResourceLineageAndSiblings() and further optimize
performance of that method (https://bugzilla.redhat.com/show_bug.cgi?id=736517)
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
index de415f4..1eb495e 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
@@ -291,13 +291,14 @@ import org.rhq.core.domain.util.Summary;
+ " FROM Resource res " //
+ " WHERE res.parentResource = :parent " //
+ " AND res.id IN (SELECT rr.id FROM Resource rr JOIN rr.implicitGroups g JOIN g.roles r JOIN r.subjects s WHERE s = :subject)"
- + " AND res.resourceType.category = :category " + " AND res.inventoryStatus = :status "),
+ + " AND res.inventoryStatus = :status " //
+ + " AND (res.resourceType.category = :category OR :category is null)"),
@NamedQuery(name = Resource.QUERY_FIND_CHILDREN_BY_CATEGORY_AND_INVENTORY_STATUS_ADMIN, query = "" //
+ "SELECT res " //
+ " FROM Resource res " //
+ " WHERE res.parentResource = :parent " //
+ " AND res.inventoryStatus = :status " //
- + " AND res.resourceType.category = :category "),
+ + " AND (res.resourceType.category = :category OR :category is null)"),
@NamedQuery(name = Resource.QUERY_FIND_BY_CATEGORY_AND_INVENTORY_STATUS, query = "" //
+ "SELECT res " //
+ " FROM Resource res " //
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
index 16fd8e6..6a10c30 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
@@ -750,74 +750,44 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage
}
public List<ResourceLineageComposite> getResourceLineageAndSiblings(Subject subject, int resourceId) {
- boolean isInventoryManager = authorizationManager.isInventoryManager(subject);
-
- // get the raw resource lineage up to the platform. We'll check the auth below
+ // Get the raw resource lineage up to the platform. We'll check the auth below.
List<Resource> rawResourceLineage = getResourceLineage(resourceId);
int depth = rawResourceLineage.size();
Resource parent = (depth > 1) ? rawResourceLineage.get(depth - 2) : null;
- // record which of the raw ancestry is locked from view
- List<ResourceLineageComposite> resourceLineage = new ArrayList<ResourceLineageComposite>(rawResourceLineage
- .size());
+ // Build up a list of composite Resources for the ancestry that includes which ancestors, if any, should be
+ // locked from view.
+ boolean isInventoryManager = authorizationManager.isInventoryManager(subject);
+ List<ResourceLineageComposite> resourceLineage = new ArrayList<ResourceLineageComposite>(rawResourceLineage.size());
for (Resource resource : rawResourceLineage) {
- resourceLineage.add(new ResourceLineageComposite(resource, !authorizationManager.canViewResource(subject,
- resource.getId())));
+ boolean isLocked = !(isInventoryManager || authorizationManager.canViewResource(subject, resource.getId()));
+ ResourceLineageComposite composite = new ResourceLineageComposite(resource, isLocked);
+ resourceLineage.add(composite);
}
- // fill out the tree, including only the direct ancestors and all viewable relations
+ // Build up the result list, including only the direct ancestors of the Resource and all viewable siblings of
+ // the ancestors. The list will represent a tree, rooted at the platform, in depth-first order.
List<ResourceLineageComposite> result = new LinkedList<ResourceLineageComposite>();
for (ResourceLineageComposite ancestor : resourceLineage) {
- // always include a direct ancestor
+ // Always include a direct ancestor.
result.add(ancestor);
- // if the ancestor is not locked, include relevant children. Also, always show viewable
- // siblings of the target resource.
+ // If the ancestor is not locked, include viewable children.
if (!ancestor.isLocked() || ancestor.getResource() == parent) {
-
- // get children
- Set<Resource> children = ancestor.getResource().getChildResources();
- // remove any that are in the ancestry to avoid repeated handling
+ // Get all viewable committed children.
+ PageList<Resource> children = findChildResourcesByCategoryAndInventoryStatus(subject,
+ ancestor.getResource(), null, InventoryStatus.COMMITTED, PageControl.getUnlimitedInstance());
+ // Remove any that are in the lineage to avoid repeated handling.
children.removeAll(rawResourceLineage);
- // only add the viewable children
- List<Resource> viewableChildren = new ArrayList<Resource>(children.size());
for (Resource child : children) {
- boolean isCommitted = (child.getInventoryStatus() == InventoryStatus.COMMITTED);
- boolean isViewable = (isInventoryManager || authorizationManager.canViewResource(subject, child
- .getId()));
- if (isCommitted && isViewable) {
- // if not a direct ancestor add to the list (direct ancestors already added by default)
- if (!rawResourceLineage.contains(child)) {
- // ensure we have the parent in the entity
- child.getParentResource().getId();
- ResourceLineageComposite composite = new ResourceLineageComposite(child, false);
- result.add(composite);
- }
- viewableChildren.add(child);
- }
- }
-
- // get grandchildren
- for (Resource child : viewableChildren) {
- // This ensures Hibernate actually fetches the parent Resource.
- // ensure we have the parent
+ // Ensure the parentResource field is fetched.
+ //noinspection ConstantConditions
child.getParentResource().getId();
- Set<Resource> grandChildren = child.getChildResources();
- for (Resource grandChild : grandChildren) {
- boolean isCommitted = (grandChild.getInventoryStatus() == InventoryStatus.COMMITTED);
- boolean isViewable = (isInventoryManager || authorizationManager.canViewResource(subject,
- grandChild.getId()));
- if (isCommitted && isViewable) {
- // if not a direct ancestor add to the list (direct ancestors already added by default)
- if (!rawResourceLineage.contains(grandChild)) {
- // ensure we have the parent in the entity
- grandChild.getParentResource().getId();
- ResourceLineageComposite composite = new ResourceLineageComposite(grandChild, false);
- result.add(composite);
- }
- }
- }
+ // The query only returned viewable children, so the composite should not be locked.
+ boolean isLocked = false;
+ ResourceLineageComposite composite = new ResourceLineageComposite(child, isLocked);
+ result.add(composite);
}
}
}
@@ -1070,7 +1040,7 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage
@SuppressWarnings("unchecked")
public PageList<Resource> findChildResourcesByCategoryAndInventoryStatus(Subject user, Resource parent,
- ResourceCategory category, InventoryStatus status, PageControl pageControl) {
+ @Nullable ResourceCategory category, InventoryStatus status, PageControl pageControl) {
pageControl.initDefaultOrderingField("res.name");
Query queryCount;
commit c14cbc4b9afa6a1f223f54b29af47c011941cbb0
Merge: 14ef47f 8ada3a7
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Sep 27 11:37:39 2011 -0400
Merge commit 'origin/master'
commit 14ef47fc976d72d69c41b21cc2de329c15ba03e8
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Sep 27 11:35:36 2011 -0400
[BZ 741691] make sure the plugin XML descriptor accepts all units that the code can support
this adds: petabytes, epoch_seconds, jiffys, microseconds
diff --git a/modules/core/client-api/src/main/resources/rhq-configuration.xsd b/modules/core/client-api/src/main/resources/rhq-configuration.xsd
index b038ec1..4b706d8 100644
--- a/modules/core/client-api/src/main/resources/rhq-configuration.xsd
+++ b/modules/core/client-api/src/main/resources/rhq-configuration.xsd
@@ -590,8 +590,12 @@
<xs:enumeration value="megabytes"/>
<xs:enumeration value="gigabytes"/>
<xs:enumeration value="terabytes"/>
+ <xs:enumeration value="petabytes" />
<xs:enumeration value="epoch_milliseconds"/>
+ <xs:enumeration value="epoch_seconds"/>
+ <xs:enumeration value="jiffys"/>
<xs:enumeration value="nanoseconds"/>
+ <xs:enumeration value="microseconds"/>
<xs:enumeration value="milliseconds"/>
<xs:enumeration value="seconds"/>
<xs:enumeration value="minutes"/>
commit 8ada3a7c385894feb9166cb685144978e5ab0819
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Sep 26 14:26:26 2011 -0400
update the pattern-generator plugin so it can be used to reproduce
https://bugzilla.redhat.com/show_bug.cgi?id=741414
diff --git a/modules/plugins/pattern-generator/src/main/java/org/rhq/plugins/pattern/PatternComponent.java b/modules/plugins/pattern-generator/src/main/java/org/rhq/plugins/pattern/PatternComponent.java
index 8a44947..5c8d631 100644
--- a/modules/plugins/pattern-generator/src/main/java/org/rhq/plugins/pattern/PatternComponent.java
+++ b/modules/plugins/pattern-generator/src/main/java/org/rhq/plugins/pattern/PatternComponent.java
@@ -1,7 +1,6 @@
package org.rhq.plugins.pattern;
-import java.util.Date;
import java.util.Set;
import org.apache.commons.logging.Log;
@@ -19,14 +18,16 @@ import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
@SuppressWarnings("unused")
-public class PatternComponent implements ResourceComponent, MeasurementFacet
-{
+public class PatternComponent implements ResourceComponent, MeasurementFacet {
+
private final Log log = LogFactory.getLog(this.getClass());
int count = 0;
int traitCount = 0;
+
int number = 0; // We start with returning zeros
- int numerForTrait = 0;
+ int numberForTrait = 0;
+
int[] wanted = new int[2];
/**
@@ -68,43 +69,63 @@ public class PatternComponent implements ResourceComponent, MeasurementFacet
}
-
/**
* Gather "measurement" data - actually a series of 1s and 0s starting with 0.
* @see org.rhq.core.pluginapi.measurement.MeasurementFacet#getValues(org.rhq.core.domain.measurement.MeasurementReport, java.util.Set)
*/
- public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception {
+ public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> requests) throws Exception {
- for (MeasurementScheduleRequest req : metrics) {
- if (req.getName().equals("pattern1")) {
+ boolean flipMetrics = false;
+ boolean flipTraits = false;
+ for (MeasurementScheduleRequest request : requests) {
+ String metricName = request.getName();
- double val;
+ if (metricName.startsWith("pattern")) {
- val = (double) number;
+ double value;
+ if (metricName.equals("pattern1")) {
+ value = number;
+ flipMetrics = true;
- count++;
- // enough of this? Flip over to the other number and reset the series.
- if (count>=wanted[number]) {
- number = 1-number;
- count=0;
+ } else {
+ // pattern2
+ value = 1 - number;
}
- MeasurementDataNumeric res = new MeasurementDataNumeric(req, val);
- report.addData(res);
- }
- else if (req.getName().equals("text1")) {
-
- String trait = "Trait_" + number;
- traitCount++;
- // enough of this? Flip over to the other number and reset the series.
- if (traitCount>=wanted[number]) {
- number = 1-number;
- traitCount=0;
+ MeasurementDataNumeric datum = new MeasurementDataNumeric(request, value);
+ report.addData(datum);
+ } else if (metricName.startsWith("text")) {
+
+ double value;
+ if (metricName.equals("text1")) {
+ value = numberForTrait;
+ flipTraits = true;
+ } else {
+ // text2
+ value = 1 - numberForTrait;
}
+ String traitValue = (value == 0) ? "red" : "green";
- MeasurementDataTrait res = new MeasurementDataTrait(req,trait);
- report.addData(res);
+ MeasurementDataTrait datum = new MeasurementDataTrait(request,traitValue);
+ report.addData(datum);
+ }
+ }
+ if (flipMetrics) {
+ count++;
+ if (count >= wanted[number]) {
+ // Flip over to the other number and reset the series.
+ number = 1 - number;
+ count = 0;
}
- }
+ }
+ if (flipTraits) {
+ traitCount++;
+ if (traitCount >= wanted[numberForTrait]) {
+ // Flip over to the other number and reset the series.
+ numberForTrait = 1 - numberForTrait;
+ traitCount = 0;
+ }
+ }
}
+
}
diff --git a/modules/plugins/pattern-generator/src/main/java/org/rhq/plugins/pattern/PatternDiscovery.java b/modules/plugins/pattern-generator/src/main/java/org/rhq/plugins/pattern/PatternDiscovery.java
index cf2b1ac..46a6358 100644
--- a/modules/plugins/pattern-generator/src/main/java/org/rhq/plugins/pattern/PatternDiscovery.java
+++ b/modules/plugins/pattern-generator/src/main/java/org/rhq/plugins/pattern/PatternDiscovery.java
@@ -25,7 +25,7 @@ public class PatternDiscovery implements ResourceDiscoveryComponent
discoveryContext.getResourceType(), // ResourceType
"pattern",
"pattern",
- "1.1",
+ "1.2",
"Generate metrics that follow a pattern",
discoveryContext.getDefaultPluginConfiguration(),
null
diff --git a/modules/plugins/pattern-generator/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/pattern-generator/src/main/resources/META-INF/rhq-plugin.xml
index a4f5da4..70a8a59 100644
--- a/modules/plugins/pattern-generator/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/pattern-generator/src/main/resources/META-INF/rhq-plugin.xml
@@ -1,13 +1,12 @@
<?xml version="1.0"?>
+
<plugin name="pattern-generator"
displayName="pattern-generator Plugin"
description="Devs plugin that generates metrics that follow patterns"
package="org.rhq.plugins.pattern"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:xmlns:rhq-plugin"
xmlns:c="urn:xmlns:rhq-configuration">
-
<server name="pattern"
discovery="PatternDiscovery"
class="PatternComponent"
@@ -15,13 +14,15 @@
>
<plugin-configuration>
- <c:simple-property name="ones" description="Number of ones in a row" type="integer" default="1"/>
- <c:simple-property name="zeros" description="Number of zeros in a row" type="integer" default="2"/>
+ <c:simple-property name="zeros" description="Number of zeros in a row" type="integer" default="1"/>
+ <c:simple-property name="ones" description="Number of ones in a row" type="integer" default="2"/>
</plugin-configuration>
- <metric property="pattern1" displayName="Pattern 1 metric" defaultInterval="60000" displayType="summary" defaultOn="true"/>
- <metric property="text1" displayName="Pattern 1 trait" defaultInterval="60000" displayType="summary" defaultOn="true" dataType="trait"/>
+ <metric property="pattern1" displayName="Pattern 1 Metric" defaultInterval="30000" displayType="summary" defaultOn="true"/>
+ <metric property="pattern2" displayName="Pattern 2 Metric" defaultInterval="30000" displayType="summary" defaultOn="true"/>
+ <metric property="text1" displayName="Pattern 1 Trait" defaultInterval="30000" displayType="summary" defaultOn="true" dataType="trait"/>
+ <metric property="text2" displayName="Pattern 2 Trait" defaultInterval="30000" displayType="summary" defaultOn="true" dataType="trait"/>
</server>
-</plugin>
\ No newline at end of file
+</plugin>
commit 664ea3ed6421311a171726d26b44c6dae034d8e1
Author: John Sanda <jsanda(a)redhat.com>
Date: Sun Sep 25 13:23:35 2011 -0400
Adding more drift criteria query support
Adding ability to filter by path and change set id
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAO.java b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAO.java
index 1f4f96c..dd230ac 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAO.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAO.java
@@ -56,6 +56,11 @@ public class ChangeSetDAO extends BasicDAO<MongoDBChangeSet, ObjectId> {
return query.asList();
}
+ if (criteria.getFilterChangeSetId() != null && !criteria.getFilterChangeSetId().isEmpty()) {
+ query.field("id").equal(new ObjectId(criteria.getFilterChangeSetId()));
+ return query.asList();
+ }
+
if (criteria.getFilterResourceIds() != null && criteria.getFilterResourceIds().length > 0) {
query.field("resourceId").in(asList(criteria.getFilterResourceIds()));
}
@@ -72,6 +77,10 @@ public class ChangeSetDAO extends BasicDAO<MongoDBChangeSet, ObjectId> {
query.field("files.ctime").lessThanOrEq(criteria.getFilterEndTime());
}
+ if (criteria.getFilterPath() != null && !criteria.getFilterPath().isEmpty()) {
+ query.field("files.path").equal(criteria.getFilterPath());
+ }
+
return query.asList();
}
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAOTest.java b/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAOTest.java
index f95026a..1c3c3c7 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAOTest.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAOTest.java
@@ -26,11 +26,14 @@ import com.google.code.morphia.Morphia;
import com.google.code.morphia.query.Query;
import com.mongodb.Mongo;
+import org.testng.Assert;
+import org.testng.AssertJUnit;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.domain.criteria.GenericDriftCriteria;
+import org.rhq.core.domain.drift.DriftCategory;
import org.rhq.core.domain.drift.DriftChangeSetCategory;
import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBChangeSet;
import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBChangeSetEntry;
@@ -248,11 +251,15 @@ public class ChangeSetDAOTest {
dao.save(c1);
+ MongoDBChangeSet c2 = createChangeSet(COVERAGE, 2, 1, 1);
+ c2.add(new MongoDBChangeSetEntry("c1-1.txt", FILE_CHANGED));
+
+ dao.save(c2);
+
GenericDriftCriteria criteria = new GenericDriftCriteria();
criteria.addFilterId(entry.getId());
List<MongoDBChangeSet> actual = dao.findByDriftCriteria(criteria);
- List<MongoDBChangeSet> expected = asList(c1);
assertEquals("Expected to get back only one change set when searching by drift criteria with id filter.",
1, actual.size());
@@ -260,7 +267,7 @@ public class ChangeSetDAOTest {
}
@Test(enabled = ENABLED)
- public void findDriftCriteriaWithStartTimeFilter() throws Exception {
+ public void findByDriftCriteriaWithStartTimeFilter() throws Exception {
int resourceId = 1;
MongoDBChangeSet c1 = createChangeSet(COVERAGE, 1, resourceId, 1);
@@ -292,7 +299,7 @@ public class ChangeSetDAOTest {
}
@Test(enabled = ENABLED)
- public void findDriftCriteriaWithEndTimeFilter() throws Exception {
+ public void findByDriftCriteriaWithEndTimeFilter() throws Exception {
int resourceId = 1;
MongoDBChangeSet c1 = createChangeSet(COVERAGE, 1, resourceId, 1);
@@ -322,6 +329,67 @@ public class ChangeSetDAOTest {
assertChangeSetMatches("Failed to find drift entries with end time filter", c1, actualChangeSet);
}
+ @Test(enabled = ENABLED)
+ public void findByDriftCriteriaWithPathFilter() throws Exception {
+ MongoDBChangeSet c1 = createChangeSet(COVERAGE, 1, 1, 1);
+ c1.add(new MongoDBChangeSetEntry("c1-1.txt", FILE_ADDED));
+
+ dao.save(c1);
+
+ MongoDBChangeSet c2 = createChangeSet(DRIFT, 2, 1, 1);
+ c2.add(new MongoDBChangeSetEntry("c1-1.txt", FILE_CHANGED));
+
+ dao.save(c2);
+
+ MongoDBChangeSet c3 = createChangeSet(DRIFT, 3, 1, 1);
+ c3.add(new MongoDBChangeSetEntry("c2-1.txt", FILE_ADDED));
+
+ dao.save(c3);
+
+ GenericDriftCriteria criteria = new GenericDriftCriteria();
+ criteria.addFilterPath("c1-1.txt");
+
+ List<MongoDBChangeSet> actual = dao.findByDriftCriteria(criteria);
+
+ assertChangeSetsMatch("Failed to find change sets with drift path filter", asList(c1, c2), actual);
+ }
+
+ @Test(enabled = ENABLED)
+ public void findByDriftCriteriaWithChangeSetIdFilter() throws Exception {
+ MongoDBChangeSet c1 = createChangeSet(COVERAGE, 1, 1, 1);
+ c1.add(new MongoDBChangeSetEntry("c1-1.txt", FILE_ADDED));
+
+ dao.save(c1);
+
+ MongoDBChangeSet c2 = createChangeSet(DRIFT, 2, 1, 1);
+ c2.add(new MongoDBChangeSetEntry("c1-1.txt", FILE_CHANGED));
+
+ dao.save(c2);
+
+ GenericDriftCriteria criteria = new GenericDriftCriteria();
+ criteria.addFilterChangeSetId(c2.getId());
+
+ List<MongoDBChangeSet> actual = dao.findByDriftCriteria(criteria);
+
+ assertChangeSetsMatch("Failed to find change sets by drift criteria with change set id filter",
+ asList(c2), actual);
+ }
+
+ private void assertChangeSetsMatch(String msg, List<MongoDBChangeSet> expected, List<MongoDBChangeSet> actual) {
+ org.testng.Assert.assertEquals(actual.size(), expected.size(), "The number of change sets differ: " + msg);
+ for (MongoDBChangeSet expectedChangeSet : expected) {
+ MongoDBChangeSet actualChangeSet = null;
+ for (MongoDBChangeSet changeSet : actual) {
+ if (expectedChangeSet.getObjectId().equals(changeSet.getObjectId())) {
+ actualChangeSet = changeSet;
+ break;
+ }
+ }
+ assertNotNull(actualChangeSet, msg + ": expected to find change set " + expectedChangeSet);
+ assertChangeSetMatches(msg, expectedChangeSet, actualChangeSet);
+ }
+ }
+
/**
* This method first checks that the actual change set is not null. It then performs a
* property-wise comparison against the expected change set using
@@ -364,6 +432,4 @@ public class ChangeSetDAOTest {
return changeSet;
}
-
-
}
commit 189beefbf35c48fe022d7a88f1e0f272bc6597fa
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Sep 23 16:24:46 2011 -0400
this method still needs to do something - it has to set the label of the title bar, even if it shouldn't set the window title. putting some of this back.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/TitleBar.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/TitleBar.java
index 84c6113..c70c3fb 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/TitleBar.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/TitleBar.java
@@ -87,19 +87,10 @@ public class TitleBar extends LocatableToolStrip {
private void refresh(String title) {
setVisible(title != null);
-
- String contents;
- String windowTitle;
- //spinder 9/15/11: Commenting out to let CoreGUI handle all title setting.
- // if (title == null) {
- // contents = null;
- // windowTitle = "RHQ";
- // } else {
- // contents = "<span class='HeaderLabel'>" + title + "</span>";
- // windowTitle = "RHQ: " + title;
- // }
- // this.label.setContents(contents);
- // Window.setTitle(windowTitle);
+ if (title != null) {
+ String contents = "<span class='HeaderLabel'>" + title + "</span>";
+ this.label.setContents(contents);
+ }
}
}
commit c0254ee091873b666fb7f4dfad1c0cc476dad20c
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Sep 21 17:36:03 2011 -0400
More terminology changes, this time the canned dift config def.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java
index 70c3c84..561f055 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java
@@ -87,14 +87,14 @@ public class DriftConfigurationDefinition implements Serializable {
}
private static final ConfigurationDefinition INSTANCE = new ConfigurationDefinition("GLOBAL_DRIFT_CONFIG_DEF",
- "The drift configuration definition");
+ "The drift detection definition");
/**
- * For drift configurations that have already been created, this definition can be used for editing those existing configuration.
- * Existing drift configurations cannot have their name changed nor can their base directory or includes/excludes be altered.
+ * For drift definitions that have already been created, this definition can be used for editing those existing configuration.
+ * Existing drift definitions cannot have their name changed nor can their base directory or includes/excludes be altered.
*/
private static final ConfigurationDefinition INSTANCE_FOR_EXISTING_CONFIGS = new ConfigurationDefinition(
- "GLOBAL_DRIFT_CONFIG_DEF", "The drift configuration definition");
+ "GLOBAL_DRIFT_CONFIG_DEF", "The drift detection definition");
/**
* Returns a configuration definition suitable for showing a new configuration form - that is,
@@ -142,12 +142,12 @@ public class DriftConfigurationDefinition implements Serializable {
private static PropertyDefinitionSimple createName(ConfigurationDefinition configDef, boolean readOnly) {
String name = PROP_NAME;
- String description = "The drift configuration name";
+ String description = "The drift detection definition name";
boolean required = true;
PropertySimpleType type = PropertySimpleType.STRING;
PropertyDefinitionSimple pd = new PropertyDefinitionSimple(name, description, required, type);
- pd.setDisplayName("Drift Configuration Name");
+ pd.setDisplayName("Drift Definition Name");
pd.setReadOnly(readOnly);
pd.setSummary(true);
pd.setOrder(0);
@@ -163,7 +163,7 @@ public class DriftConfigurationDefinition implements Serializable {
private static PropertyDefinitionSimple createEnabled(ConfigurationDefinition configDef) {
String name = PROP_ENABLED;
- String description = "Enables or disables the drift configuration";
+ String description = "Enables or disables the drift definition";
boolean required = true;
PropertySimpleType type = PropertySimpleType.BOOLEAN;
@@ -181,13 +181,13 @@ public class DriftConfigurationDefinition implements Serializable {
private static PropertyDefinitionSimple createDriftHandlingMode(ConfigurationDefinition configDef) {
String name = PROP_DRIFT_HANDLING_MODE;
String description = "" //
- + "Specifies the way in which drift occurrences will be handled when reported. Normal " //
+ + "Specifies the way in which drift instances will be handled when reported. Normal " //
+ "handling implies the reported drift is unexpected and as such can trigger alerts, " //
+ "will be present in recent drift reports, etc. Setting to 'Planned Changes' implies " //
+ "that the reported drift is happening at a time when drift is expected due to " //
+ "planned changes in the monitored environment, such as an application deployment, a " //
+ "configuration change, or something similar. With this setting drift is only reported " //
- + " for inspection, in the drift history view.";
+ + " for inspection, in drift snapshot views.";
boolean required = true;
PropertySimpleType type = PropertySimpleType.STRING;
@@ -217,7 +217,7 @@ public class DriftConfigurationDefinition implements Serializable {
private static PropertyDefinitionSimple createInterval(ConfigurationDefinition configDef) {
String name = PROP_INTERVAL;
- String description = "The frequency in seconds in which drift monitoring should run. Defaults to 1800 seconds (i.e. 30 minutes)";
+ String description = "The frequency in seconds in which drift detection should run. Defaults to 1800 seconds (i.e. 30 minutes)";
boolean required = false;
PropertySimpleType type = PropertySimpleType.LONG;
@@ -337,7 +337,7 @@ public class DriftConfigurationDefinition implements Serializable {
private static PropertyDefinitionSimple createIncludePath(boolean readOnly) {
String name = PROP_PATH;
- String description = "A file system path that can be a directory or a file. The path is assumed to be relative to the base directory of the drift configuration.";
+ String description = "A file system path that can be a directory or a file. The path is assumed to be relative to the base directory of the drift definition.";
boolean required = true;
PropertySimpleType type = PropertySimpleType.STRING;
@@ -399,7 +399,7 @@ public class DriftConfigurationDefinition implements Serializable {
private static PropertyDefinitionSimple createExcludePath(boolean readOnly) {
String name = PROP_PATH;
- String description = "A file system path that can be a directory or a file. The path is assumed to be relative to the base directory of the drift configuration.";
+ String description = "A file system path that can be a directory or a file. The path is assumed to be relative to the base directory of the drift definition.";
boolean required = true;
PropertySimpleType type = PropertySimpleType.STRING;
commit c57047c48f469586283209d50192fe7edfcf50bb
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Sep 21 17:35:15 2011 -0400
Add a drift profile that basically builds the agent, coregui and drift
server plugin. Since maven does not support profile chaining (yet) it's
really a standalone profile that needs updating if either the agent or
coregui modules get updated.
diff --git a/modules/pom.xml b/modules/pom.xml
index 2b45c62..c846655 100644
--- a/modules/pom.xml
+++ b/modules/pom.xml
@@ -94,7 +94,27 @@
</modules>
</profile>
-
+ <profile>
+ <id>drift</id>
+ <activation>
+ <property>
+ <name>drift</name>
+ </property>
+ </activation>
+ <modules>
+ <!-- agent -->
+ <module>core</module>
+ <module>common/drift</module>
+ <module>enterprise/comm</module>
+ <module>enterprise/agent</module>
+ <module>enterprise/agentupdate</module>
+ <!-- coregui -->
+ <module>enterprise/server/jar</module>
+ <module>enterprise/gui/coregui</module>
+ <!-- server plugin -->
+ <module>enterprise/server/plugins/drift-rhq</module>
+ </modules>
+ </profile>
<profile>
<id>plugins</id>
commit 3650043e1c93a5b9671b51e2959c971c4ec7baa5
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Sep 16 14:36:41 2011 -0400
Convert drift I18N properties to use updated terminology. Additionally, made
a pass through the properties files to correct a bunch of issues such as:
- remove some unused properties
- consolidate a lot of properties by making better use of common props
- add many missing props (commented) to various lang packs. Remember,
commented props make it easier for a localizer to see the props that need
translation.
- related, commented out many untranslated props
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
index c5b8f43..82e2d93 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
@@ -138,7 +138,7 @@ public class LoginView extends LocatableCanvas {
user.setRequired(true);
user.setAttribute("autoComplete", "native");
- final PasswordItem password = new PasswordItem("password", MSG.dataSource_users_field_password());
+ final PasswordItem password = new PasswordItem("password", MSG.common_title_password());
password.setRequired(true);
password.setAttribute("autoComplete", "native");
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
index 2285d8e..e462d3e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
@@ -27,7 +27,6 @@ import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.authz.Permission;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
-import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
import org.rhq.enterprise.gui.coregui.client.admin.agent.install.RemoteAgentInstallView;
import org.rhq.enterprise.gui.coregui.client.admin.roles.RolesView;
import org.rhq.enterprise.gui.coregui.client.admin.templates.ResourceTypeTreeView;
@@ -39,7 +38,6 @@ import org.rhq.enterprise.gui.coregui.client.components.view.NavigationItem;
import org.rhq.enterprise.gui.coregui.client.components.view.NavigationSection;
import org.rhq.enterprise.gui.coregui.client.components.view.ViewFactory;
import org.rhq.enterprise.gui.coregui.client.components.view.ViewName;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
@@ -72,8 +70,7 @@ public class AdministrationView extends AbstractSectionedLeftNavigationView {
// TODO these iframe page view ids should go away in favor of the gwt view page view_id, when available
private static final ViewName PAGE_CONTENT_SOURCES_VIEW_ID = new ViewName("ContentSources", MSG
.view_adminContent_contentSources());
- private static final ViewName PAGE_REPOS_VIEW_ID = new ViewName("Repositories", MSG
- .view_adminContent_repositories());
+ private static final ViewName PAGE_REPOS_VIEW_ID = new ViewName("Repositories", MSG.common_title_repositories());
public AdministrationView() {
// This is a top level view, so our locator id can simply be our view id.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java
index 2561dd3..01b107f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java
@@ -107,20 +107,20 @@ public class RolesDataSource extends RPCDataSource<Role, RoleCriteria> {
100, false);
fields.add(descriptionField);
- DataSourceField resourceGroupsField = new DataSourceField(Field.RESOURCE_GROUPS, FieldType.ANY,
- MSG.datasource_roles_field_resourceGroups());
+ DataSourceField resourceGroupsField = new DataSourceField(Field.RESOURCE_GROUPS, FieldType.ANY, MSG
+ .common_title_resourceGroups());
fields.add(resourceGroupsField);
- DataSourceField permissionsField = new DataSourceField(Field.PERMISSIONS, FieldType.ANY,
- MSG.datasource_roles_field_permissions());
+ DataSourceField permissionsField = new DataSourceField(Field.PERMISSIONS, FieldType.ANY, MSG
+ .common_title_permissions());
fields.add(permissionsField);
- DataSourceField subjectsField = new DataSourceField(Field.SUBJECTS, FieldType.ANY,
- MSG.datasource_roles_field_subjects());
+ DataSourceField subjectsField = new DataSourceField(Field.SUBJECTS, FieldType.ANY, MSG
+ .datasource_roles_field_subjects());
fields.add(subjectsField);
- DataSourceField ldapGroupsField = new DataSourceField(Field.LDAP_GROUPS, FieldType.ANY,
- MSG.datasource_roles_field_ldapGroups());
+ DataSourceField ldapGroupsField = new DataSourceField(Field.LDAP_GROUPS, FieldType.ANY, MSG
+ .datasource_roles_field_ldapGroups());
fields.add(ldapGroupsField);
return fields;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesView.java
index bfa9ae6..3c3e91d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesView.java
@@ -48,7 +48,7 @@ import org.rhq.enterprise.gui.coregui.client.components.view.ViewName;
*/
public class RolesView extends TableSection<RolesDataSource> implements BookmarkableView {
- public static final ViewName VIEW_ID = new ViewName("Roles", MSG.view_adminSecurity_roles());
+ public static final ViewName VIEW_ID = new ViewName("Roles", MSG.common_title_roles());
public static final String VIEW_PATH = AdministrationView.VIEW_ID + "/"
+ AdministrationView.SECTION_SECURITY_VIEW_ID + "/" + VIEW_ID;
@@ -58,7 +58,7 @@ public class RolesView extends TableSection<RolesDataSource> implements Bookmark
private boolean initialized;
public RolesView(String locatorId) {
- super(locatorId, MSG.view_adminSecurity_roles());
+ super(locatorId, MSG.common_title_roles());
final RolesDataSource datasource = RolesDataSource.getInstance();
setDataSource(datasource);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java
index 55b0281..4fadf87 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java
@@ -115,8 +115,8 @@ public class UsersDataSource extends RPCDataSource<Subject, SubjectCriteria> {
ldapField.setCanEdit(false); // read-only
fields.add(ldapField);
- DataSourcePasswordField passwordField = new DataSourcePasswordField(Field.PASSWORD, MSG
- .dataSource_users_field_password(), 100, true);
+ DataSourcePasswordField passwordField = new DataSourcePasswordField(Field.PASSWORD,
+ MSG.common_title_password(), 100, true);
LengthRangeValidator passwordValidator = new LengthRangeValidator();
passwordValidator.setMin(6);
passwordValidator.setMax(100);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java
index 58c0912..a8b35fd 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java
@@ -54,7 +54,7 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message;
*/
public class UsersView extends TableSection<UsersDataSource> {
- public static final ViewName VIEW_ID = new ViewName("Users", MSG.view_adminSecurity_users());
+ public static final ViewName VIEW_ID = new ViewName("Users", MSG.common_title_users());
public static final String VIEW_PATH = AdministrationView.VIEW_ID + "/"
+ AdministrationView.SECTION_SECURITY_VIEW_ID + "/" + VIEW_ID;
@@ -64,7 +64,7 @@ public class UsersView extends TableSection<UsersDataSource> {
private boolean initialized;
public UsersView(String locatorId) {
- super(locatorId, MSG.view_adminSecurity_users());
+ super(locatorId, MSG.common_title_users());
final UsersDataSource dataSource = UsersDataSource.getInstance();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDetailsView.java
index 1ee0b09..fd88c19 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDetailsView.java
@@ -274,7 +274,7 @@ public class AlertDetailsView extends LocatableVLayout implements BookmarkableVi
grid.setData((Record[]) input);
ListGridField condition = new ListGridField("text", MSG.view_alert_common_tab_conditions_text());
condition.setWidth("60%");
- ListGridField value = new ListGridField("value", MSG.view_alert_common_tab_conditions_value());
+ ListGridField value = new ListGridField("value", MSG.common_title_value());
grid.setFields(condition, value);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/CliNotificationSenderForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/CliNotificationSenderForm.java
index 38dbf8b..225c5c5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/CliNotificationSenderForm.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/CliNotificationSenderForm.java
@@ -82,12 +82,12 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
private static class Config {
List<Repo> allRepos;
Repo selectedRepo;
-
+
List<PackageAndLatestVersionComposite> allPackages;
PackageAndLatestVersionComposite selectedPackage;
-
+
Subject selectedSubject;
-
+
/*
* This is a counter to keep track if all the async
* loading of the above data has finished.
@@ -101,10 +101,10 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
* updated) only in that single thread.
*/
int __handlerCounter = 3;
-
+
public void setSelectedRepo(int repoId) {
if (allRepos != null) {
- for(Repo r : allRepos) {
+ for (Repo r : allRepos) {
if (r.getId() == repoId) {
selectedRepo = r;
break;
@@ -115,7 +115,7 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
public void setSelectedPackage(int packageId) {
if (allPackages != null) {
- for(PackageAndLatestVersionComposite p : allPackages) {
+ for (PackageAndLatestVersionComposite p : allPackages) {
if (p.getGeneralPackage().getId() == packageId) {
selectedPackage = p;
break;
@@ -124,9 +124,9 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
}
}
}
-
+
private static class PackageVersionFileUploadFormWithVersion extends PackageVersionFileUploadForm {
-
+
/**
* @param locatorId
* @param packageTypeId
@@ -138,47 +138,48 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
protected List<FormItem> getOnDrawItems() {
List<FormItem> items = super.getOnDrawItems();
-
- TextItem version = new TextItem("editableVersion", MSG.view_alert_definition_notification_cliScript_editor_newScriptVersion());
+
+ TextItem version = new TextItem("editableVersion", MSG
+ .view_alert_definition_notification_cliScript_editor_newScriptVersion());
version.setColSpan(getNumCols());
version.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent event) {
getField("version").setValue(event.getValue());
}
});
-
+
items.add(version);
-
+
return items;
}
}
-
+
private static abstract class ForwardingDynamicFormHandler implements DynamicFormHandler {
private AsyncCallback<Void> callback;
-
+
public AsyncCallback<Void> getCallback() {
return callback;
}
-
+
public void setCallback(AsyncCallback<Void> callback) {
this.callback = callback;
}
};
-
+
private static abstract class ForwardingSubmitFailedHandler implements FormSubmitFailedHandler {
private AsyncCallback<Void> callback;
-
+
public AsyncCallback<Void> getCallback() {
return callback;
}
-
+
public void setCallback(AsyncCallback<Void> callback) {
this.callback = callback;
}
};
-
+
private boolean formBuilt;
-
+
private SelectItem repoSelector;
private RadioGroupWithComponentsItem packageSelector;
private SelectItem existingPackageSelector;
@@ -194,7 +195,7 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
private ForwardingDynamicFormHandler uploadSuccessHandler;
private Config config;
-
+
public CliNotificationSenderForm(String locatorId, AlertNotification notif, String sender) {
super(locatorId, notif, sender);
}
@@ -202,21 +203,21 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
@Override
protected void onInit() {
super.onInit();
-
- if (!formBuilt) {
+
+ if (!formBuilt) {
loadPackageType(new AsyncCallback<PackageTypeAndVersionFormatComposite>() {
public void onFailure(Throwable t) {
- CoreGUI.getErrorHandler().handleError(MSG.view_alert_definition_notification_cliScript_editor_loadFailed(),
- t);
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_alert_definition_notification_cliScript_editor_loadFailed(), t);
}
-
+
public void onSuccess(PackageTypeAndVersionFormatComposite result) {
cliScriptPackageType = result;
LocatableDynamicForm form = new LocatableDynamicForm(extendLocatorId("form"));
form.setTitleOrientation(TitleOrientation.TOP);
form.setWidth(500);
-
+
SectionItem repoSection = new SectionItem("repoSection");
repoSection.setDefaultValue(MSG.view_alert_definition_notification_cliScript_editor_repository());
repoSection.setWidth("100%");
@@ -224,62 +225,64 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
packageSection.setDefaultValue(MSG.view_alert_definition_notification_cliScript_editor_script());
SectionItem userSection = new SectionItem("userSection");
userSection.setDefaultValue(MSG.view_alert_definition_notification_cliScript_editor_whichUser());
-
- repoSelector = new SelectItem(extendLocatorId("repoSelector"), MSG.view_alert_definition_notification_cliScript_editor_selectRepo());
+
+ repoSelector = new SelectItem(extendLocatorId("repoSelector"), MSG
+ .view_alert_definition_notification_cliScript_editor_selectRepo());
repoSelector.setDefaultToFirstOption(true);
repoSelector.setWrapTitle(false);
- repoSelector.setWidth(400);
+ repoSelector.setWidth(400);
repoSelector.setValueMap(MSG.common_msg_loading());
repoSelector.setDisabled(true);
LinkedHashMap<String, DynamicForm> packageSelectItems = new LinkedHashMap<String, DynamicForm>();
- packageSelectItems.put(MSG.view_alert_definition_notification_cliScript_editor_existingScript(), createExistingPackageForm());
- packageSelectItems.put(MSG.view_alert_definition_notification_cliScript_editor_uploadNewScript(), createUploadNewScriptForm());
- packageSelector = new RadioGroupWithComponentsItem(extendLocatorId("packageSelector"),
- "", packageSelectItems, form);
+ packageSelectItems.put(MSG.view_alert_definition_notification_cliScript_editor_existingScript(),
+ createExistingPackageForm());
+ packageSelectItems.put(MSG.view_alert_definition_notification_cliScript_editor_uploadNewScript(),
+ createUploadNewScriptForm());
+ packageSelector = new RadioGroupWithComponentsItem(extendLocatorId("packageSelector"), "",
+ packageSelectItems, form);
packageSelector.setWidth("100%");
-
- LinkedHashMap<String, DynamicForm> userSelectItems = new LinkedHashMap<String, DynamicForm>();
- userSelectItems.put(MSG.view_alert_definition_notification_cliScript_editor_thisUser(),
- null);
- userSelectItems.put(MSG.view_alert_definition_notification_cliScript_editor_anotherUser(),
- createAnotherUserForm());
- userSelector = new RadioGroupWithComponentsItem(
- extendLocatorId("userSelector"),
- "", userSelectItems, form);
+
+ LinkedHashMap<String, DynamicForm> userSelectItems = new LinkedHashMap<String, DynamicForm>();
+ userSelectItems.put(MSG.view_alert_definition_notification_cliScript_editor_thisUser(), null);
+ userSelectItems.put(MSG.view_alert_definition_notification_cliScript_editor_anotherUser(),
+ createAnotherUserForm());
+ userSelector = new RadioGroupWithComponentsItem(extendLocatorId("userSelector"), "",
+ userSelectItems, form);
userSelector.setWidth("100%");
userSelector.setShowTitle(false);
-
+
repoSection.setItemIds(extendLocatorId("repoSelector"));
packageSection.setItemIds(extendLocatorId("packageSelector"));
userSection.setItemIds(extendLocatorId("userSelector"));
-
- form.setFields(userSection, userSelector, repoSection, repoSelector, packageSection, packageSelector);
-
+
+ form.setFields(userSection, userSelector, repoSection, repoSelector, packageSection,
+ packageSelector);
+
addMember(form);
-
+
loadConfig(new AsyncCallback<Config>() {
public void onFailure(Throwable t) {
- CoreGUI.getErrorHandler().handleError(MSG.view_alert_definition_notification_cliScript_editor_loadFailed(),
- t);
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_alert_definition_notification_cliScript_editor_loadFailed(), t);
}
-
+
public void onSuccess(Config config) {
CliNotificationSenderForm.this.config = config;
- setupRepoSelector();
- setupPackageSelector();
+ setupRepoSelector();
+ setupPackageSelector();
setupUserSelector();
-
+
formBuilt = true;
-
+
markForRedraw();
}
});
}
- });
+ });
}
}
-
+
private void setupUserSelector() {
if (config.selectedSubject != null && !UserSessionManager.getSessionSubject().equals(config.selectedSubject)) {
userSelector.setSelected(MSG.view_alert_definition_notification_cliScript_editor_anotherUser());
@@ -293,11 +296,11 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
private void setupPackageSelector() {
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
- for(PackageAndLatestVersionComposite p : config.allPackages) {
+ for (PackageAndLatestVersionComposite p : config.allPackages) {
String label = p.getGeneralPackage().getName() + " (" + p.getLatestPackageVersion().getVersion() + ")";
map.put(String.valueOf(p.getGeneralPackage().getId()), label);
}
-
+
existingPackageSelector.setValueMap(map);
if (config.selectedPackage != null) {
existingPackageSelector.setValue(config.selectedPackage.getGeneralPackage().getId());
@@ -305,7 +308,7 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
} else {
packageSelector.setSelected(MSG.view_alert_definition_notification_cliScript_editor_uploadNewScript());
}
-
+
if (!formBuilt) {
existingPackageSelector.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent event) {
@@ -314,18 +317,18 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
}
});
}
-
+
existingPackageSelector.setDisabled(false);
-
+
markForRedraw();
}
- private void setupRepoSelector() {
+ private void setupRepoSelector() {
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
- for(Repo r : config.allRepos) {
+ for (Repo r : config.allRepos) {
map.put(String.valueOf(r.getId()), r.getName());
}
-
+
repoSelector.setValueMap(map);
if (config.selectedRepo != null) {
repoSelector.setValue(config.selectedRepo.getId());
@@ -336,41 +339,42 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
packageSelector.setDisabled(true);
uploadForm.setRepoId(null);
}
-
+
if (!formBuilt) {
repoSelector.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent event) {
final Integer repoId = Integer.valueOf(event.getItem().getValue().toString());
config.setSelectedRepo(repoId);
-
+
PackageCriteria pc = new PackageCriteria();
pc.addFilterRepoId(repoId);
pc.addFilterPackageTypeId(cliScriptPackageType.getPackageType().getId());
-
+
packageSelector.setDisabled(false);
existingPackageSelector.setDisabled(true);
existingPackageSelector.setValueMap(MSG.common_msg_loading());
-
- GWTServiceLookup.getContentService().findPackagesWithLatestVersion(pc, new AsyncCallback<PageList<PackageAndLatestVersionComposite>>() {
- public void onSuccess(PageList<PackageAndLatestVersionComposite> result) {
- config.allPackages = result;
- config.selectedPackage = result.isEmpty() ? null : result.get(0); //we're autoselecting the first item
- setupPackageSelector();
-
- uploadForm.setRepoId(repoId);
- }
-
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_alert_definition_notification_cliScript_editor_loadFailed(),
- caught);
- }
- });
+
+ GWTServiceLookup.getContentService().findPackagesWithLatestVersion(pc,
+ new AsyncCallback<PageList<PackageAndLatestVersionComposite>>() {
+ public void onSuccess(PageList<PackageAndLatestVersionComposite> result) {
+ config.allPackages = result;
+ config.selectedPackage = result.isEmpty() ? null : result.get(0); //we're autoselecting the first item
+ setupPackageSelector();
+
+ uploadForm.setRepoId(repoId);
+ }
+
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_alert_definition_notification_cliScript_editor_loadFailed(), caught);
+ }
+ });
}
});
}
-
+
repoSelector.setDisabled(false);
-
+
markForRedraw();
}
@@ -384,23 +388,25 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
public void onFailure(Throwable caught) {
callback.onFailure(caught);
}
-
+
public void onSuccess(Void result) {
getConfiguration().put(new PropertySimple(PROP_USER_ID, config.selectedSubject.getId()));
getConfiguration().put(new PropertySimple(PROP_USER_NAME, anotherUserName.getEnteredValue()));
- getConfiguration().put(new PropertySimple(PROP_USER_PASSWORD, anotherUserPassword.getEnteredValue()));
-
+ getConfiguration().put(
+ new PropertySimple(PROP_USER_PASSWORD, anotherUserPassword.getEnteredValue()));
+
validatePackage(callback);
}
});
- }
+ }
}
-
+
private void validatePackage(final AsyncCallback<Void> callback) {
getConfiguration().put(new PropertySimple(PROP_REPO_ID, config.selectedRepo.getId()));
if (packageSelector.getSelectedIndex() == 0) {
- getConfiguration().put(new PropertySimple(PROP_PACKAGE_ID, config.selectedPackage.getGeneralPackage().getId()));
+ getConfiguration().put(
+ new PropertySimple(PROP_PACKAGE_ID, config.selectedPackage.getGeneralPackage().getId()));
callback.onSuccess(null);
} else {
if (cliScriptPackageType.getVersionFormat() != null) {
@@ -422,6 +428,7 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
public void onFailure(Throwable caught) {
callback.onFailure(null);
};
+
public void onSuccess(Void result) {
getConfiguration().put(new PropertySimple(PROP_PACKAGE_ID, uploadForm.getPackageId()));
callback.onSuccess(null);
@@ -430,7 +437,7 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
uploadForm.submitForm();
}
}
-
+
private void loadConfig(final AsyncCallback<Config> handler) {
final String repoId = getConfiguration().getSimpleValue(PROP_REPO_ID, null);
final String packageId = getConfiguration().getSimpleValue(PROP_PACKAGE_ID, null);
@@ -439,16 +446,16 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
final Config config = new Config();
RepoCriteria rc = new RepoCriteria();
-
+
GWTServiceLookup.getRepoService().findReposByCriteria(rc, new AsyncCallback<PageList<Repo>>() {
public void onSuccess(PageList<Repo> result) {
config.allRepos = result;
-
+
if (repoId != null && repoId.trim().length() > 0) {
final int rid = Integer.parseInt(repoId);
config.setSelectedRepo(rid);
}
-
+
if (--config.__handlerCounter == 0) {
handler.onSuccess(config);
}
@@ -458,66 +465,68 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
handler.onFailure(caught);
}
});
-
+
if (repoId != null && repoId.trim().length() > 0) {
PackageCriteria pc = new PackageCriteria();
pc.addFilterRepoId(Integer.parseInt(repoId));
pc.addFilterPackageTypeId(cliScriptPackageType.getPackageType().getId());
- GWTServiceLookup.getContentService().findPackagesWithLatestVersion(pc, new AsyncCallback<PageList<PackageAndLatestVersionComposite>>() {
- public void onSuccess(PageList<PackageAndLatestVersionComposite> result) {
- config.allPackages = result;
-
- if (packageId != null && packageId.trim().length() > 0) {
- int pid = Integer.parseInt(packageId);
- config.setSelectedPackage(pid);
+ GWTServiceLookup.getContentService().findPackagesWithLatestVersion(pc,
+ new AsyncCallback<PageList<PackageAndLatestVersionComposite>>() {
+ public void onSuccess(PageList<PackageAndLatestVersionComposite> result) {
+ config.allPackages = result;
+
+ if (packageId != null && packageId.trim().length() > 0) {
+ int pid = Integer.parseInt(packageId);
+ config.setSelectedPackage(pid);
+ }
+
+ if (--config.__handlerCounter == 0) {
+ handler.onSuccess(config);
+ }
+ }
+
+ public void onFailure(Throwable caught) {
+ handler.onFailure(caught);
+ }
+ });
+ } else {
+ config.allPackages = Collections.emptyList();
+ --config.__handlerCounter;
+ }
+
+ if (subjectId != null && subjectId.trim().length() > 0) {
+ int sid = Integer.parseInt(subjectId);
+ SubjectCriteria c = new SubjectCriteria();
+ c.addFilterId(sid);
+
+ GWTServiceLookup.getSubjectService().findSubjectsByCriteria(c, new AsyncCallback<PageList<Subject>>() {
+ public void onSuccess(PageList<Subject> result) {
+ if (result.size() > 0) {
+ config.selectedSubject = result.get(0);
}
if (--config.__handlerCounter == 0) {
handler.onSuccess(config);
}
}
-
+
public void onFailure(Throwable caught) {
handler.onFailure(caught);
}
});
} else {
- config.allPackages = Collections.emptyList();
- --config.__handlerCounter;
- }
-
- if (subjectId != null && subjectId.trim().length() > 0) {
- int sid = Integer.parseInt(subjectId);
- SubjectCriteria c = new SubjectCriteria();
- c.addFilterId(sid);
-
- GWTServiceLookup.getSubjectService().findSubjectsByCriteria(c, new AsyncCallback<PageList<Subject>>() {
- public void onSuccess(PageList<Subject> result) {
- if (result.size() > 0) {
- config.selectedSubject = result.get(0);
- }
-
- if (--config.__handlerCounter == 0) {
- handler.onSuccess(config);
- }
- }
-
- public void onFailure(Throwable caught) {
- handler.onFailure(caught);
- }
- });
- } else {
--config.__handlerCounter;
}
}
-
+
private DynamicForm createAnotherUserForm() {
LocatableDynamicForm form = new LocatableDynamicForm(extendLocatorId("anotherUserForm"));
form.setTitleOrientation(TitleOrientation.TOP);
anotherUserName = new TextItem("userName", MSG.dataSource_users_field_name());
- anotherUserPassword = new PasswordItem("password", MSG.dataSource_users_field_password());
- verifyUserButton = new ButtonItem("verify", MSG.view_alert_definition_notification_cliScript_editor_verifyAuthentication());
-
+ anotherUserPassword = new PasswordItem("password", MSG.common_title_password());
+ verifyUserButton = new ButtonItem("verify", MSG
+ .view_alert_definition_notification_cliScript_editor_verifyAuthentication());
+
successIcon = new FormItemIcon();
successIcon.setSrc(ImageManager.getAvailabilityIcon(Boolean.TRUE));
successIcon.setWidth(16);
@@ -527,16 +536,16 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
failureIcon.setSrc(ImageManager.getAvailabilityIcon(Boolean.FALSE));
failureIcon.setWidth(16);
failureIcon.setHeight(16);
-
+
form.setFields(anotherUserName, anotherUserPassword, verifyUserButton);
-
+
verifyUserButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
//just checking the auth is ok, no other action is needed.
checkAuthenticationAndDo(new AsyncCallback<Void>() {
public void onFailure(Throwable caught) {
}
-
+
public void onSuccess(Void result) {
}
});
@@ -544,7 +553,7 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
});
return form;
}
-
+
private DynamicForm createExistingPackageForm() {
LocatableDynamicForm form = new LocatableDynamicForm(extendLocatorId("existingPackageForm"));
form.setTitleOrientation(TitleOrientation.TOP);
@@ -552,16 +561,17 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
existingPackageSelector.setDefaultToFirstOption(true);
existingPackageSelector.setWrapTitle(false);
existingPackageSelector.setRedrawOnChange(true);
- existingPackageSelector.setWidth(300);
+ existingPackageSelector.setWidth(300);
existingPackageSelector.setValueMap(MSG.common_msg_loading());
existingPackageSelector.setDisabled(true);
-
+
form.setFields(existingPackageSelector);
return form;
}
-
+
private DynamicForm createUploadNewScriptForm() {
- uploadForm = new PackageVersionFileUploadFormWithVersion(extendLocatorId("uploadForm"), cliScriptPackageType.getPackageType().getId());
+ uploadForm = new PackageVersionFileUploadFormWithVersion(extendLocatorId("uploadForm"), cliScriptPackageType
+ .getPackageType().getId());
uploadForm.setTitleOrientation(TitleOrientation.TOP);
uploadForm.setPackageTypeId(cliScriptPackageType.getPackageType().getId());
@@ -572,7 +582,7 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
}
}
});
-
+
uploadSuccessHandler = new ForwardingDynamicFormHandler() {
public void onSubmitComplete(DynamicFormSubmitCompleteEvent event) {
if (uploadForm.getPackageId() == 0 || uploadForm.getPackageVersionId() == 0) {
@@ -588,8 +598,8 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
}
};
uploadForm.addFormHandler(uploadSuccessHandler);
-
- uploadForm.addItemChangeHandler(new ItemChangeHandler() {
+
+ uploadForm.addItemChangeHandler(new ItemChangeHandler() {
public void onItemChange(ItemChangeEvent event) {
if (event.getItem() instanceof UploadItem) {
if (event.getNewValue() == null) {
@@ -597,29 +607,28 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
uploadForm.getField("version").setValue("");
return;
}
-
+
String fileName = event.getNewValue().toString();
-
+
if (config.allPackages != null) {
- for(PackageAndLatestVersionComposite plv : config.allPackages) {
+ for (PackageAndLatestVersionComposite plv : config.allPackages) {
if (plv.getGeneralPackage().getName().equals(fileName)) {
try {
String version = plv.getLatestPackageVersion().getVersion();
-
+
PackageVersionFormatDescription format = cliScriptPackageType.getVersionFormat();
if (format == null) {
return;
}
-
+
if (format.getOsgiVersionExtractionRegex() == null) {
return;
}
-
+
String regex = format.getOsgiVersionExtractionRegex();
int group = format.getOsgiVersionGroupIndex();
String oldOsgiVersion = getOsgiVersion(version, regex, group);
-
-
+
OSGiVersion v = new OSGiVersion(oldOsgiVersion);
if (v.getMicroIfDefined() != null) {
v.setMicro(v.getMicro() + 1);
@@ -628,9 +637,9 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
} else {
v.setMajor(v.getMajor() + 1);
}
-
+
String newVersion = version.replace(oldOsgiVersion, v.toString());
-
+
uploadForm.getField("editableVersion").setValue(newVersion);
uploadForm.getField("version").setValue(newVersion);
return;
@@ -640,11 +649,12 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
}
}
}
-
+
//no existing package exists with the same name as the file being uploaded
-
+
String defaultVersion = "";
- if (cliScriptPackageType.getVersionFormat() != null && cliScriptPackageType.getVersionFormat().getOsgiVersionExtractionRegex() != null) {
+ if (cliScriptPackageType.getVersionFormat() != null
+ && cliScriptPackageType.getVersionFormat().getOsgiVersionExtractionRegex() != null) {
//check if the package format understands plain OSGi versioning
if (matches("1.0", cliScriptPackageType.getVersionFormat().getFullFormatRegex())) {
defaultVersion = "1.0";
@@ -652,22 +662,22 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
}
uploadForm.getField("editableVersion").setValue(defaultVersion);
uploadForm.getField("version").setValue(defaultVersion);
- }
+ }
}
}
});
-
+
return uploadForm;
}
-
+
private void loadPackageType(AsyncCallback<PackageTypeAndVersionFormatComposite> handler) {
GWTServiceLookup.getContentService().findPackageType(null, PACKAGE_TYPE_NAME, handler);
}
-
+
private void checkAuthenticationAndDo(final AsyncCallback<Void> action) {
String username = anotherUserName.getEnteredValue();
String password = anotherUserPassword.getEnteredValue();
-
+
GWTServiceLookup.getSubjectService().checkAuthentication(username, password, new AsyncCallback<Subject>() {
public void onFailure(Throwable caught) {
config.selectedSubject = null;
@@ -675,10 +685,10 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
markForRedraw();
action.onFailure(caught);
}
-
+
public void onSuccess(Subject result) {
config.selectedSubject = result;
- verifyUserButton.setIcons(result == null ? failureIcon : successIcon);
+ verifyUserButton.setIcons(result == null ? failureIcon : successIcon);
markForRedraw();
if (result == null) {
action.onFailure(null);
@@ -688,17 +698,17 @@ public class CliNotificationSenderForm extends AbstractNotificationSenderForm {
}
});
}
-
+
private static native String getOsgiVersion(String version, String osgiRegex, int groupIdx) /*-{
- var re = new RegExp(osgiRegex);
- var groupRef = '$' + groupIdx;
- version = version.replace(re, groupRef);
-
- return version;
- }-*/;
-
+ var re = new RegExp(osgiRegex);
+ var groupRef = '$' + groupIdx;
+ version = version.replace(re, groupRef);
+
+ return version;
+ }-*/;
+
private static native boolean matches(String string, String regex) /*-{
- var re = new RegExp(regex);
- return re.test(string);
- }-*/;
-}
+ var re = new RegExp(regex);
+ return re.test(string);
+ }-*/;
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/DampeningAlertDefinitionForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/DampeningAlertDefinitionForm.java
index 3527da5..3ba2182 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/DampeningAlertDefinitionForm.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/DampeningAlertDefinitionForm.java
@@ -578,16 +578,16 @@ public class DampeningAlertDefinitionForm extends LocatableDynamicForm implement
private String getTimeUnitsTitle(AlertDampening.TimeUnits units) {
switch (units) {
case MINUTES: {
- return MSG.common_label_minutes();
+ return MSG.common_unit_minutes();
}
case HOURS: {
- return MSG.common_label_hours();
+ return MSG.common_unit_hours();
}
case DAYS: {
- return MSG.common_label_days();
+ return MSG.common_unit_days();
}
case WEEKS: {
- return MSG.common_label_weeks();
+ return MSG.common_unit_weeks();
}
default: {
throw new IllegalStateException(MSG.view_alert_common_tab_invalid_time_units(units.name())); // should never happen
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
index 81ba472..23b59f6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
@@ -790,8 +790,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
ops.put(opDef.getName(), opDef.getDisplayName());
}
- SelectItem opSelection = new SelectItem(OPERATION_NAME_ITEMNAME, MSG
- .view_alert_definition_condition_editor_operation_value());
+ SelectItem opSelection = new SelectItem(OPERATION_NAME_ITEMNAME, MSG.common_title_value());
opSelection.setValueMap(ops);
opSelection.setDefaultValue(ops.keySet().iterator().next()); // just use the first one
opSelection.setWidth("*");
@@ -799,17 +798,12 @@ public class NewConditionEditor extends LocatableDynamicForm {
opSelection.setShowIfCondition(ifFunc);
formItems.add(opSelection);
- SelectItem opResultsSelection = new SelectItem(OPERATION_RESULTS_ITEMNAME, MSG
- .view_alert_definition_condition_editor_operation_status());
+ SelectItem opResultsSelection = new SelectItem(OPERATION_RESULTS_ITEMNAME, MSG.common_title_status());
LinkedHashMap<String, String> operationStatuses = new LinkedHashMap<String, String>(4);
- operationStatuses.put(OperationRequestStatus.INPROGRESS.name(), MSG
- .view_alert_definition_condition_editor_operation_status_inprogress());
- operationStatuses.put(OperationRequestStatus.SUCCESS.name(), MSG
- .view_alert_definition_condition_editor_operation_status_success());
- operationStatuses.put(OperationRequestStatus.FAILURE.name(), MSG
- .view_alert_definition_condition_editor_operation_status_failure());
- operationStatuses.put(OperationRequestStatus.CANCELED.name(), MSG
- .view_alert_definition_condition_editor_operation_status_canceled());
+ operationStatuses.put(OperationRequestStatus.INPROGRESS.name(), MSG.common_status_inprogress());
+ operationStatuses.put(OperationRequestStatus.SUCCESS.name(), MSG.common_status_success());
+ operationStatuses.put(OperationRequestStatus.FAILURE.name(), MSG.common_status_failed());
+ operationStatuses.put(OperationRequestStatus.CANCELED.name(), MSG.common_status_canceled());
opResultsSelection.setValueMap(operationStatuses);
opResultsSelection.setDefaultValue(OperationRequestStatus.FAILURE.name());
opResultsSelection.setWrapTitle(false);
@@ -831,11 +825,11 @@ public class NewConditionEditor extends LocatableDynamicForm {
SelectItem eventSeveritySelection = new SelectItem(EVENT_SEVERITY_ITEMNAME, MSG
.view_alert_definition_condition_editor_event_severity());
LinkedHashMap<String, String> severities = new LinkedHashMap<String, String>(5);
- severities.put(EventSeverity.DEBUG.name(), MSG.view_alert_definition_condition_editor_event_severity_debug());
- severities.put(EventSeverity.INFO.name(), MSG.view_alert_definition_condition_editor_event_severity_info());
- severities.put(EventSeverity.WARN.name(), MSG.view_alert_definition_condition_editor_event_severity_warn());
- severities.put(EventSeverity.ERROR.name(), MSG.view_alert_definition_condition_editor_event_severity_error());
- severities.put(EventSeverity.FATAL.name(), MSG.view_alert_definition_condition_editor_event_severity_fatal());
+ severities.put(EventSeverity.DEBUG.name(), MSG.common_severity_debug());
+ severities.put(EventSeverity.INFO.name(), MSG.common_severity_info());
+ severities.put(EventSeverity.WARN.name(), MSG.common_severity_warn());
+ severities.put(EventSeverity.ERROR.name(), MSG.common_severity_error());
+ severities.put(EventSeverity.FATAL.name(), MSG.common_severity_fatal());
eventSeveritySelection.setValueMap(severities);
eventSeveritySelection.setDefaultValue(EventSeverity.ERROR.name());
eventSeveritySelection.setWrapTitle(false);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentListView.java
index b2763d9..4f78a16 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentListView.java
@@ -83,8 +83,7 @@ public class BundleDeploymentListView extends Table<BundleDeploymentDataSource>
+ LinkManager.getBundleDeploymentLink(record
.getAttributeAsInt(BundleDeploymentDataSource.FIELD_BUNDLE_ID), record
.getAttributeAsInt(BundleDeploymentDataSource.FIELD_ID)) + "\">"
- + StringUtility.escapeHtml(String.valueOf(value))
- + "</a>";
+ + StringUtility.escapeHtml(String.valueOf(value)) + "</a>";
}
});
} else {
@@ -119,7 +118,7 @@ public class BundleDeploymentListView extends Table<BundleDeploymentDataSource>
String err = event.getRecord().getAttribute(BundleDeploymentDataSource.FIELD_ERROR_MESSAGE);
if (err != null && err.length() > 0) {
err = "<pre>" + err + "</pre>";
- new ErrorMessageWindow(extendLocatorId("errWin"), MSG.common_title_error(), err).show();
+ new ErrorMessageWindow(extendLocatorId("errWin"), MSG.common_severity_error(), err).show();
}
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
index 966b14e..0000f46 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
@@ -197,8 +197,8 @@ public class BundleDeploymentView extends LocatableVLayout implements Bookmarkab
status.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
- ErrorMessageWindow win = new ErrorMessageWindow(extendLocatorId("errWin"),
- MSG.common_title_error(), "<pre>" + deployment.getErrorMessage() + "</pre>");
+ ErrorMessageWindow win = new ErrorMessageWindow(extendLocatorId("errWin"), MSG
+ .common_severity_error(), "<pre>" + deployment.getErrorMessage() + "</pre>");
win.show();
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleResourceDeploymentHistoryListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleResourceDeploymentHistoryListView.java
index d1e5a74..749b042 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleResourceDeploymentHistoryListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleResourceDeploymentHistoryListView.java
@@ -97,7 +97,7 @@ public class BundleResourceDeploymentHistoryListView extends LocatableVLayout {
action.setAutoFitWidth(true);
action.setAutoFitWidthApproach(AutoFitWidthApproach.BOTH);
- ListGridField message = new ListGridField("info", MSG.common_title_info());
+ ListGridField message = new ListGridField("info", MSG.common_severity_info());
message.setWidth("60%");
ListGridField user = new ListGridField("user", MSG.common_title_user());
@@ -163,7 +163,7 @@ public class BundleResourceDeploymentHistoryListView extends LocatableVLayout {
timestamp.setDateFormatter(DateDisplayFormat.TOLOCALESTRING);
StaticTextItem action = new StaticTextItem("action", MSG.view_bundle_deploy_action());
- StaticTextItem info = new StaticTextItem("info", MSG.common_title_info());
+ StaticTextItem info = new StaticTextItem("info", MSG.common_severity_info());
StaticTextItem category = new StaticTextItem("category", MSG.common_title_category());
StaticTextItem message = new StaticTextItem("message", MSG.common_title_message());
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java
index bddf144..b000631 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java
@@ -63,7 +63,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends LocatableVLayout implements
BookmarkableView, DetailsView {
- private static final Label LOADING_LABEL = new Label(MSG.widget_recordEditor_label_loading());
+ private static final Label LOADING_LABEL = new Label(MSG.common_msg_loading());
private static final String FIELD_ID = "id";
private static final String FIELD_NAME = "name";
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/measurement/AbstractMeasurementRangeEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/measurement/AbstractMeasurementRangeEditor.java
index 1978665..8bad3dd 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/measurement/AbstractMeasurementRangeEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/measurement/AbstractMeasurementRangeEditor.java
@@ -74,9 +74,9 @@ public abstract class AbstractMeasurementRangeEditor extends LocatableDynamicFor
static {
lastUnits = new LinkedHashMap<String, String>(3);
- lastUnits.put(String.valueOf(MeasurementUtility.UNIT_MINUTES), MSG.common_label_minutes());
- lastUnits.put(String.valueOf(MeasurementUtility.UNIT_HOURS), MSG.common_label_hours());
- lastUnits.put(String.valueOf(MeasurementUtility.UNIT_DAYS), MSG.common_label_days());
+ lastUnits.put(String.valueOf(MeasurementUtility.UNIT_MINUTES), MSG.common_unit_minutes());
+ lastUnits.put(String.valueOf(MeasurementUtility.UNIT_HOURS), MSG.common_unit_hours());
+ lastUnits.put(String.valueOf(MeasurementUtility.UNIT_DAYS), MSG.common_unit_days());
lastValues = new String[] { "4", "8", "12", "24", "30", "36", "48", "60", "90", "120" };
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/drift/RecentDriftsPortlet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/drift/RecentDriftsPortlet.java
index ebee689..48c7c2f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/drift/RecentDriftsPortlet.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/drift/RecentDriftsPortlet.java
@@ -30,7 +30,7 @@ public class RecentDriftsPortlet extends AbstractRecentDriftsPortlet {
// A non-displayed, persisted identifier for the portlet
public static final String KEY = "RecentDrifts";
// A default displayed, persisted name for the portlet
- public static final String NAME = MSG.view_portlet_defaultName_recentDrifts();
+ public static final String NAME = MSG.common_title_recent_drifts();
public RecentDriftsPortlet(String locatorId) {
super(locatorId, EntityContext.forSubsystemView());
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/imported/RecentlyAddedResourcesPortlet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/imported/RecentlyAddedResourcesPortlet.java
index 0ee9dd1..132f154 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/imported/RecentlyAddedResourcesPortlet.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/imported/RecentlyAddedResourcesPortlet.java
@@ -183,7 +183,7 @@ public class RecentlyAddedResourcesPortlet extends LocatableVLayout implements C
// second combobox for timeframe for problem resources search.
final SelectItem maximumTimeRecentlyAddedComboBox = new SelectItem(RECENTLY_ADDED_SHOW_HRS);
maximumTimeRecentlyAddedComboBox.setTitle("Over ");
- maximumTimeRecentlyAddedComboBox.setHint("<nobr><b> " + MSG.common_label_hours() + " </b></nobr>");
+ maximumTimeRecentlyAddedComboBox.setHint("<nobr><b> " + MSG.common_unit_hours() + " </b></nobr>");
//spinder 9/3/10: the following is required workaround to disable editability of combobox.
maximumTimeRecentlyAddedComboBox.setType("selection");
//define acceptable values for display amount
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/problems/ProblemResourcesPortlet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/problems/ProblemResourcesPortlet.java
index 7c91dc1..736b1a8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/problems/ProblemResourcesPortlet.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/problems/ProblemResourcesPortlet.java
@@ -241,7 +241,7 @@ public class ProblemResourcesPortlet extends Table<ProblemResourcesDataSource> i
//------------- Build second combobox for timeframe for problem resources search.
final SelectItem maximumTimeProblemResourcesComboBox = new SelectItem(PROBLEM_RESOURCE_SHOW_HRS);
maximumTimeProblemResourcesComboBox.setTitle(MSG.common_title_over() + " ");
- maximumTimeProblemResourcesComboBox.setHint("<nobr><b> " + MSG.common_label_hours() + " </b></nobr>");
+ maximumTimeProblemResourcesComboBox.setHint("<nobr><b> " + MSG.common_unit_hours() + " </b></nobr>");
//spinder 9/3/10: the following is required workaround to disable editability of combobox.
maximumTimeProblemResourcesComboBox.setType("selection");
//define acceptable values for display amount
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/summary/TagCloudPortlet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/summary/TagCloudPortlet.java
index 15cfbf1..8d3e8c2 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/summary/TagCloudPortlet.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/summary/TagCloudPortlet.java
@@ -40,7 +40,7 @@ public class TagCloudPortlet extends TagCloudView implements Portlet {
// A non-displayed, persisted identifier for the portlet
public static final String KEY = "TagCloud";
// A default displayed, persisted name for the portlet
- public static final String NAME = MSG.view_portlet_defaultName_tagCloud();
+ public static final String NAME = MSG.common_title_tag_cloud();
public TagCloudPortlet(String locatorId) {
super(locatorId);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/AbstractDriftChangeSetsTreeDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/AbstractDriftChangeSetsTreeDataSource.java
index 7d34297..e8fb327 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/AbstractDriftChangeSetsTreeDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/AbstractDriftChangeSetsTreeDataSource.java
@@ -109,7 +109,7 @@ public abstract class AbstractDriftChangeSetsTreeDataSource extends RPCDataSourc
}
public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_drift_changeset_tree_loadFailure(), caught);
+ CoreGUI.getErrorHandler().handleError(MSG.view_drift_snapshots_tree_loadFailure(), caught);
response.setStatus(DSResponse.STATUS_FAILURE);
processResponse(request.getRequestId(), response);
}
@@ -123,7 +123,7 @@ public abstract class AbstractDriftChangeSetsTreeDataSource extends RPCDataSourc
driftService.findDriftsByCriteria(criteria, new AsyncCallback<PageList<? extends Drift>>() {
public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_drift_changeset_tree_loadFailure(), caught);
+ CoreGUI.getErrorHandler().handleError(MSG.view_drift_snapshots_tree_loadFailure(), caught);
response.setStatus(DSResponse.STATUS_FAILURE);
processResponse(request.getRequestId(), response);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationEditView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationEditView.java
index 375f2af..0ae1f7a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationEditView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationEditView.java
@@ -150,7 +150,7 @@ public class DriftConfigurationEditView extends LocatableVLayout implements Prop
}
public void onSuccess(Void result) {
- Message message = new Message(MSG.view_drift_success_configurationUpdated(), Message.Severity.Info);
+ Message message = new Message(MSG.view_drift_success_defUpdated(), Message.Severity.Info);
switch (context.getType()) {
case Resource:
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationView.java
index 364d25d..00fa49f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationView.java
@@ -58,7 +58,7 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message;
*/
public class DriftConfigurationView extends TableSection<DriftConfigurationDataSource> {
- public static final ViewName SUBSYSTEM_VIEW_ID = new ViewName("DriftConfigs", MSG.common_title_configuration());
+ public static final ViewName SUBSYSTEM_VIEW_ID = new ViewName("DriftDefs", MSG.common_title_definitions());
private static SortSpecifier DEFAULT_SORT_SPECIFIER = new SortSpecifier(DriftConfigurationDataSource.ATTR_NAME,
SortDirection.ASCENDING);
@@ -210,7 +210,7 @@ public class DriftConfigurationView extends TableSection<DriftConfigurationDataS
}
public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_drift_failure_deleteConfigs(), caught);
+ CoreGUI.getErrorHandler().handleError(MSG.view_drift_failure_deleteDefs(), caught);
}
});
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDataSource.java
index d9f89aa..cdb85b7 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDataSource.java
@@ -77,9 +77,9 @@ public class DriftDataSource extends RPCDataSource<DriftComposite, GenericDriftC
public static final String ATTR_PATH = "path";
public static final String FILTER_CATEGORIES = "categories";
- public static final String FILTER_CONFIGURATION = "configuration";
- public static final String FILTER_CHANGE_SET = "changeSet";
+ public static final String FILTER_DEFINITION = "definition";
public static final String FILTER_PATH = "path";
+ public static final String FILTER_SNAPSHOT = "snapshot";
private DriftGWTServiceAsync driftService = GWTServiceLookup.getDriftService();
@@ -109,11 +109,10 @@ public class DriftDataSource extends RPCDataSource<DriftComposite, GenericDriftC
ctimeField.setHoverCustomizer(TimestampCellFormatter.getHoverCustomizer(ATTR_CTIME));
fields.add(ctimeField);
- ListGridField changeSetConfigField = new ListGridField(ATTR_CHANGESET_CONFIG, MSG.common_title_configuration());
+ ListGridField changeSetConfigField = new ListGridField(ATTR_CHANGESET_CONFIG, MSG.common_title_definition());
fields.add(changeSetConfigField);
- ListGridField changeSetVersionField = new ListGridField(ATTR_CHANGESET_VERSION, MSG
- .view_drift_table_changeSet());
+ ListGridField changeSetVersionField = new ListGridField(ATTR_CHANGESET_VERSION, MSG.view_drift_table_snapshot());
fields.add(changeSetVersionField);
ListGridField categoryField = new ListGridField(ATTR_CATEGORY, MSG.common_title_category());
@@ -199,7 +198,7 @@ public class DriftDataSource extends RPCDataSource<DriftComposite, GenericDriftC
// only get the desired config names (substring match)
// note - this does not alter the PageList row count, which, I think, makes this
// ok without messing up paging.
- String configFilter = getFilter(request, FILTER_CONFIGURATION, String.class);
+ String configFilter = getFilter(request, FILTER_DEFINITION, String.class);
if (null != configFilter && !configFilter.isEmpty()) {
configFilter = configFilter.toLowerCase();
for (Iterator<DriftComposite> i = result.getValues().iterator(); i.hasNext();) {
@@ -288,7 +287,7 @@ public class DriftDataSource extends RPCDataSource<DriftComposite, GenericDriftC
return null; // user didn't select any priorities - return null to indicate no data should be displayed
}
- String changeSetFilter = getFilter(request, FILTER_CHANGE_SET, String.class);
+ String changeSetFilter = getFilter(request, FILTER_SNAPSHOT, String.class);
String pathFilter = getFilter(request, FILTER_PATH, String.class);
// note, this criteria does not allow for query-time config name filtering. That filter is applied lazily
// to the query results.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDetailsView.java
index 1791971..6961071 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDetailsView.java
@@ -98,7 +98,7 @@ public class DriftDetailsView extends LocatableVLayout {
DynamicForm driftForm = new LocatableDynamicForm(extendLocatorId("form"));
driftForm.setIsGroup(true);
- driftForm.setGroupTitle(MSG.view_drift());
+ driftForm.setGroupTitle(MSG.view_tabs_common_drift());
driftForm.setWrapItemTitles(false);
driftForm.setNumCols(4);
@@ -203,7 +203,7 @@ public class DriftDetailsView extends LocatableVLayout {
private DynamicForm createChangeSetForm(Drift<?, ?> drift) {
DynamicForm changeSetForm = new LocatableDynamicForm(extendLocatorId("changeSetForm"));
changeSetForm.setIsGroup(true);
- changeSetForm.setGroupTitle(MSG.view_drift_table_changeSet());
+ changeSetForm.setGroupTitle(MSG.view_drift_table_snapshot());
changeSetForm.setWrapItemTitles(false);
DriftChangeSet<?> changeSet = drift.getChangeSet();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftHistoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftHistoryView.java
index d603dbb..ca5bcb8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftHistoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftHistoryView.java
@@ -122,9 +122,8 @@ public class DriftHistoryView extends StringIDTableSection<DriftDataSource> {
SelectItem categoryFilter = new EnumSelectItem(DriftDataSource.FILTER_CATEGORIES, MSG.common_title_category(),
DriftCategory.class, categories, categoryIcons);
- TextItem configurationFilter = new TextItem(DriftDataSource.FILTER_CONFIGURATION, MSG
- .common_title_configuration());
- TextItem changeSetFilter = new TextItem(DriftDataSource.FILTER_CHANGE_SET, MSG.view_drift_table_changeSet());
+ TextItem configurationFilter = new TextItem(DriftDataSource.FILTER_DEFINITION, MSG.common_title_definition());
+ TextItem changeSetFilter = new TextItem(DriftDataSource.FILTER_SNAPSHOT, MSG.view_drift_table_snapshot());
TextItem pathFilter = new TextItem(DriftDataSource.FILTER_PATH, MSG.common_title_path());
if (isShowFilterForm()) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftChangeSetsTreeDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftChangeSetsTreeDataSource.java
index 693998b..4da7eac 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftChangeSetsTreeDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftChangeSetsTreeDataSource.java
@@ -67,7 +67,7 @@ public class ResourceDriftChangeSetsTreeDataSource extends AbstractDriftChangeSe
}
public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_drift_changeset_tree_loadFailure(), caught);
+ CoreGUI.getErrorHandler().handleError(MSG.view_drift_snapshots_tree_loadFailure(), caught);
response.setStatus(DSResponse.STATUS_FAILURE);
processResponse(request.getRequestId(), response);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftChangeSetsTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftChangeSetsTreeView.java
index 0df6df4..9869a24 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftChangeSetsTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftChangeSetsTreeView.java
@@ -76,7 +76,7 @@ public class ResourceDriftChangeSetsTreeView extends AbstractDriftChangeSetsTree
@Override
public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_drift_failure_deleteConfigs(), caught);
+ CoreGUI.getErrorHandler().handleError(MSG.view_drift_failure_deleteDefs(), caught);
}
});
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftChangeSetsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftChangeSetsView.java
index ab54e88..5ac7143 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftChangeSetsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftChangeSetsView.java
@@ -27,7 +27,7 @@ import org.rhq.core.domain.resource.composite.ResourceComposite;
*/
public class ResourceDriftChangeSetsView extends DriftChangeSetsView {
public static ResourceDriftChangeSetsView get(String locatorId, ResourceComposite composite) {
- String tableTitle = MSG.view_drift_changeSets_resourceViewTitle();
+ String tableTitle = MSG.view_drift_snapshots_resourceViewTitle();
EntityContext context = EntityContext.forResource(composite.getResource().getId());
boolean hasWriteAccess = composite.getResourcePermission().isDrift();
return new ResourceDriftChangeSetsView(locatorId, tableTitle, context, hasWriteAccess);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftConfigurationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftConfigurationView.java
index c68ea75..c6163ac 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftConfigurationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/ResourceDriftConfigurationView.java
@@ -27,7 +27,7 @@ import org.rhq.core.domain.resource.composite.ResourceComposite;
*/
public class ResourceDriftConfigurationView extends DriftConfigurationView {
public static ResourceDriftConfigurationView get(String locatorId, ResourceComposite composite) {
- String tableTitle = MSG.view_drift_table_resourceConfig();
+ String tableTitle = MSG.view_drift_table_resourceDef();
EntityContext context = EntityContext.forResource(composite.getResource().getId());
boolean hasWriteAccess = composite.getResourcePermission().isDrift();
return new ResourceDriftConfigurationView(locatorId, tableTitle, context, hasWriteAccess);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftAddConfigWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftAddConfigWizard.java
index 0aa7400..5af4465 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftAddConfigWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftAddConfigWizard.java
@@ -55,11 +55,11 @@ public class DriftAddConfigWizard extends AbstractDriftAddConfigWizard {
}
public String getWindowTitle() {
- return MSG.view_drift_wizard_addConfig_windowTitle();
+ return MSG.view_drift_wizard_addDef_windowTitle();
}
public String getTitle() {
- return MSG.view_drift_wizard_addConfig_title(getType().getName());
+ return MSG.view_drift_wizard_addDef_title(getType().getName());
}
public String getSubtitle() {
@@ -78,7 +78,7 @@ public class DriftAddConfigWizard extends AbstractDriftAddConfigWizard {
new AsyncCallback<Void>() {
public void onSuccess(Void result) {
CoreGUI.getMessageCenter().notify(
- new Message(MSG.view_drift_wizard_addConfig_success(getNewDriftConfiguration().getName()),
+ new Message(MSG.view_drift_wizard_addDef_success(getNewDriftConfiguration().getName()),
Message.Severity.Info));
getView().closeDialog();
DriftAddConfigWizard.this.table.refresh();
@@ -86,7 +86,7 @@ public class DriftAddConfigWizard extends AbstractDriftAddConfigWizard {
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError(
- MSG.view_drift_wizard_addConfig_failure(getNewDriftConfiguration().getName()), caught);
+ MSG.view_drift_wizard_addDef_failure(getNewDriftConfiguration().getName()), caught);
getView().closeDialog();
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftAddConfigWizardInfoStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftAddConfigWizardInfoStep.java
index 3f66b79..6abc7e6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftAddConfigWizardInfoStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/wizard/DriftAddConfigWizardInfoStep.java
@@ -63,12 +63,12 @@ public class DriftAddConfigWizardInfoStep extends AbstractWizardStep {
form.setNumCols(1);
List<FormItem> formItems = new ArrayList<FormItem>(2);
- SelectItem templateSelect = new SelectItem("template", MSG.view_drift_wizard_addConfig_templatePrompt());
+ SelectItem templateSelect = new SelectItem("template", MSG.view_drift_wizard_addDef_templatePrompt());
templateSelect.setTitleOrientation(TitleOrientation.TOP);
templateSelect.setAlign(Alignment.LEFT);
templateSelect.setWidth(300);
templateSelect.setRequired(true);
- FormUtility.addContextualHelp(templateSelect, MSG.view_drift_wizard_addConfig_templateHelp());
+ FormUtility.addContextualHelp(templateSelect, MSG.view_drift_wizard_addDef_templateHelp());
Set<ConfigurationTemplate> templates = wizard.getType().getDriftConfigurationTemplates();
final HashMap<String, ConfigurationTemplate> templatesMap = new HashMap<String, ConfigurationTemplate>(
@@ -115,7 +115,7 @@ public class DriftAddConfigWizardInfoStep extends AbstractWizardStep {
}
public String getName() {
- return MSG.view_drift_wizard_addConfig_infoStepName();
+ return MSG.view_drift_wizard_addDef_infoStepName();
}
public Configuration getStartingConfiguration() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
index f7b50a3..c733fef 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
@@ -59,8 +59,7 @@ public class InventoryView extends AbstractSectionedLeftNavigationView {
public static final ViewName VIEW_ID = new ViewName("Inventory", MSG.common_title_inventory());
// view IDs for Resources section
- private static final ViewName RESOURCES_SECTION_VIEW_ID = new ViewName("Resources", MSG
- .view_inventory_resources_title());
+ private static final ViewName RESOURCES_SECTION_VIEW_ID = new ViewName("Resources", MSG.common_title_resources());
private static final ViewName PAGE_AUTODISCOVERY_QUEUE = new ViewName("AutodiscoveryQueue", MSG
.view_inventory_adq());
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleListView.java
index 43f130f..67d6556 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleListView.java
@@ -39,9 +39,8 @@ import org.rhq.enterprise.gui.coregui.client.components.table.TableAction;
*/
public abstract class AbstractMeasurementScheduleListView extends Table {
- private static final SortSpecifier[] SORT_SPECIFIERS = new SortSpecifier[] {
- new SortSpecifier(MeasurementScheduleCriteria.SORT_FIELD_DISPLAY_NAME, SortDirection.ASCENDING)
- };
+ private static final SortSpecifier[] SORT_SPECIFIERS = new SortSpecifier[] { new SortSpecifier(
+ MeasurementScheduleCriteria.SORT_FIELD_DISPLAY_NAME, SortDirection.ASCENDING) };
public AbstractMeasurementScheduleListView(String locatorId, String title,
AbstractMeasurementScheduleCompositeDataSource dataSource, Criteria criteria, String[] excludedFieldNames) {
@@ -122,27 +121,27 @@ public abstract class AbstractMeasurementScheduleListView extends Table {
if (minutes > 60) {
long hours = minutes / 60;
minutes = minutes % 60;
- result.append(hours).append(" ").append(MSG.common_label_hours());
+ result.append(hours).append(" ").append(MSG.common_unit_hours());
}
if (minutes != 0) {
if (result.length() != 0) {
result.append(", ");
}
- result.append(minutes).append(" ").append(MSG.common_label_minutes());
+ result.append(minutes).append(" ").append(MSG.common_unit_minutes());
}
}
if (seconds != 0) {
if (result.length() != 0) {
result.append(", ");
}
- result.append(seconds).append(" ").append(MSG.common_label_seconds());
+ result.append(seconds).append(" ").append(MSG.common_unit_seconds());
}
}
if (milliseconds != 0) {
if (result.length() != 0) {
result.append(", ");
}
- result.append(milliseconds).append(" ").append(MSG.common_label_milliseconds());
+ result.append(milliseconds).append(" ").append(MSG.common_unit_milliseconds());
}
return result.toString();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/UpdateCollectionIntervalWidget.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/UpdateCollectionIntervalWidget.java
index 76378f0..dce5a3f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/UpdateCollectionIntervalWidget.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/UpdateCollectionIntervalWidget.java
@@ -55,9 +55,9 @@ public class UpdateCollectionIntervalWidget extends LocatableHLayout implements
// Maps values to labels for the units select list.
private static final LinkedHashMap<String, String> VALUE_MAP = new LinkedHashMap<String, String>();
static {
- VALUE_MAP.put(UNITS_SECONDS, MSG.common_label_seconds());
- VALUE_MAP.put(UNITS_MINUTES, MSG.common_label_minutes());
- VALUE_MAP.put(UNITS_HOURS, MSG.common_label_hours());
+ VALUE_MAP.put(UNITS_SECONDS, MSG.common_unit_seconds());
+ VALUE_MAP.put(UNITS_MINUTES, MSG.common_unit_minutes());
+ VALUE_MAP.put(UNITS_HOURS, MSG.common_unit_hours());
}
private AbstractMeasurementScheduleListView schedulesView;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryDetailsView.java
index ae7a365..3f9279e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryDetailsView.java
@@ -194,7 +194,7 @@ public abstract class AbstractOperationHistoryDetailsView<T extends OperationHis
statusItem.setTooltip(MSG.common_status_failed());
}
LinkItem errorLinkItem = new LinkItem("errorLink");
- errorLinkItem.setTitle(MSG.common_title_error());
+ errorLinkItem.setTitle(MSG.common_severity_error());
errorLinkItem.setLinkTitle(getShortErrorMessage(operationHistory));
errorLinkItem.addClickHandler(new ClickHandler() {
@Override
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
index 72442eb..bf022a0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
@@ -65,7 +65,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
*/
public class ResourceGroupListView extends Table<ResourceGroupCompositeDataSource> {
- private static final String DEFAULT_TITLE = MSG.view_inventory_groups_resourceGroups();
+ private static final String DEFAULT_TITLE = MSG.common_title_resourceGroups();
// our static factory method will set this to a non-null resource ID if the user can modify that resource's group membership
private Integer resourceIdToModify = null;
@@ -268,7 +268,7 @@ public class ResourceGroupListView extends Table<ResourceGroupCompositeDataSourc
boolean canModifyMembership) {
ResourceGroupListView view = new ResourceGroupListView(locatorId, new Criteria("explicitResourceId", String
- .valueOf(explicitResourceId)), MSG.view_inventory_groups_resourceGroups());
+ .valueOf(explicitResourceId)), MSG.common_title_resourceGroups());
if (canModifyMembership) {
view.resourceIdToModify = Integer.valueOf(explicitResourceId);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java
index 3d973d5..57c3ced 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java
@@ -208,7 +208,7 @@ public class ResourceGroupContextMenu extends LocatableMenu {
addItem(new MenuItemSeparator());
// Operations Menu
- MenuItem operations = new MenuItem(MSG.view_tree_common_contextMenu_operations());
+ MenuItem operations = new MenuItem(MSG.common_title_operations());
boolean operationsEnabled = (groupComposite.getResourcePermission().isControl()
&& null != resourceType.getOperationDefinitions() && !resourceType.getOperationDefinitions().isEmpty());
operations.setEnabled(operationsEnabled);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
index 7756bc1..103acdd 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
@@ -163,7 +163,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
List<TwoLevelTab> tabs = new ArrayList<TwoLevelTab>();
summaryTab = new TwoLevelTab(getTabSet().extendLocatorId("Summary"), new ViewName("Summary", MSG
- .view_tabs_common_summary()), ImageManager.getResourceIcon(ResourceCategory.SERVICE, Boolean.TRUE));
+ .common_title_summary()), ImageManager.getResourceIcon(ResourceCategory.SERVICE, Boolean.TRUE));
summaryActivity = new SubTab(summaryTab.extendLocatorId("Activity"), new ViewName("Activity", MSG
.view_tabs_common_activity()), null);
summaryTimeline = new SubTab(summaryTab.extendLocatorId("Timeline"), new ViewName("Timeline", MSG
@@ -183,11 +183,11 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
tabs.add(inventoryTab);
alertsTab = new TwoLevelTab(getTabSet().extendLocatorId("Alerts"), new ViewName("Alerts", MSG
- .view_tabs_common_alerts()), "/images/icons/Alert_grey_16.png");
+ .common_title_alerts()), "/images/icons/Alert_grey_16.png");
this.alertHistory = new SubTab(alertsTab.extendLocatorId("History"), new ViewName("History", MSG
.view_tabs_common_history()), null);
this.alertDef = new SubTab(alertsTab.extendLocatorId("Definitions"), new ViewName("Definitions", MSG
- .view_tabs_common_definitions()), null);
+ .common_title_definitions()), null);
alertsTab.registerSubTabs(alertHistory, alertDef);
tabs.add(alertsTab);
@@ -215,7 +215,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
tabs.add(eventsTab);
operationsTab = new TwoLevelTab(getTabSet().extendLocatorId("Operations"), new ViewName("Operations", MSG
- .view_tabs_common_operations()), "/images/icons/Operation_grey_16.png");
+ .common_title_operations()), "/images/icons/Operation_grey_16.png");
this.operationsSchedules = new SubTab(operationsTab.extendLocatorId("Schedules"), new ViewName("Schedules", MSG
.view_tabs_common_schedules()), null);
this.operationsHistory = new SubTab(operationsTab.extendLocatorId("History"), new ViewName("History", MSG
@@ -224,7 +224,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
tabs.add(operationsTab);
configurationTab = new TwoLevelTab(getTabSet().extendLocatorId("Configuration"), new ViewName("Configuration",
- MSG.view_tabs_common_configuration()), "/images/icons/Configure_grey_16.png");
+ MSG.common_title_configuration()), "/images/icons/Configure_grey_16.png");
this.configCurrent = new SubTab(configurationTab.extendLocatorId("Current"), new ViewName("Current", MSG
.view_tabs_common_current()), null);
this.configHistory = new SubTab(configurationTab.extendLocatorId("History"), new ViewName("History", MSG
@@ -236,8 +236,8 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
.view_tabs_common_drift()), "subsystems/drift/Drift_16.png");
this.driftHistory = new SubTab(driftTab.extendLocatorId(DriftSubTab.HISTORY), new ViewName(DriftSubTab.HISTORY,
MSG.view_tabs_common_history()), null);
- this.driftConfig = new SubTab(driftTab.extendLocatorId(DriftSubTab.CONFIGURATION), new ViewName(
- DriftSubTab.CONFIGURATION, MSG.view_tabs_common_configuration()), null);
+ this.driftConfig = new SubTab(driftTab.extendLocatorId(DriftSubTab.DEFINITIONS), new ViewName(
+ DriftSubTab.DEFINITIONS, MSG.common_title_definitions()), null);
driftTab.registerSubTabs(driftHistory, driftConfig);
tabs.add(driftTab);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationTable.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationTable.java
index ae52f4d..399e6a0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationTable.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/HistoryGroupResourceConfigurationTable.java
@@ -101,7 +101,7 @@ public class HistoryGroupResourceConfigurationTable extends Table<GroupResourceC
fieldStatus.addRecordClickHandler(new RecordClickHandler() {
@Override
public void onRecordClick(RecordClickEvent event) {
- new ErrorMessageWindow("errWin", MSG.common_title_error(), getStatusHtmlString(event.getRecord()))
+ new ErrorMessageWindow("errWin", MSG.common_severity_error(), getStatusHtmlString(event.getRecord()))
.show();
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationTable.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationTable.java
index 483a854..2d6a2cd 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationTable.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationTable.java
@@ -104,7 +104,7 @@ public class HistoryGroupPluginConfigurationTable extends Table<HistoryGroupPlug
fieldStatus.addRecordClickHandler(new RecordClickHandler() {
@Override
public void onRecordClick(RecordClickEvent event) {
- new ErrorMessageWindow("errWin", MSG.common_title_error(), getStatusHtmlString(event.getRecord()))
+ new ErrorMessageWindow("errWin", MSG.common_severity_error(), getStatusHtmlString(event.getRecord()))
.show();
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/MembersView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/MembersView.java
index c483a25..bb6a935 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/MembersView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/MembersView.java
@@ -46,7 +46,7 @@ public class MembersView extends ResourceSearchView {
public MembersView(String locatorId, int groupId, boolean canModifyMembers) {
super(locatorId, new Criteria(ResourceDatasource.FILTER_GROUP_ID, String.valueOf(groupId)), MSG
- .view_inventory_resources_title_members());
+ .view_inventory_resources_members());
this.canModifyMembers = canModifyMembers;
this.groupId = groupId;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/table/GroupMeasurementTableDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/table/GroupMeasurementTableDataSource.java
index 0511e9a..29c6911 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/table/GroupMeasurementTableDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/table/GroupMeasurementTableDataSource.java
@@ -71,7 +71,7 @@ public class GroupMeasurementTableDataSource extends MeasurementTableDataSource
nameField.setWidth("30%");
fields.add(nameField);
- ListGridField alertsField = new ListGridField(FIELD_ALERT_COUNT, MSG.view_resource_monitor_table_alerts());
+ ListGridField alertsField = new ListGridField(FIELD_ALERT_COUNT, MSG.common_title_alerts());
alertsField.setWidth("10%");
fields.add(alertsField);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceCompositeSearchView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceCompositeSearchView.java
index beeb982..c7ddc3f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceCompositeSearchView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceCompositeSearchView.java
@@ -197,7 +197,7 @@ public class ResourceCompositeSearchView extends ResourceSearchView {
public static ResourceCompositeSearchView getChildrenOf(String locatorId, ResourceComposite parentResourceComposite) {
return new ResourceCompositeSearchView(locatorId, parentResourceComposite, new Criteria("parentId", String
- .valueOf(parentResourceComposite.getResource().getId())), MSG.view_inventory_resources_title_children());
+ .valueOf(parentResourceComposite.getResource().getId())), MSG.view_tabs_common_child_resources());
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java
index 53d5b18..da3f5e3 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java
@@ -81,7 +81,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
@SuppressWarnings("unchecked")
public class ResourceSearchView extends Table {
- private static final String DEFAULT_TITLE = MSG.view_inventory_resources_title();
+ private static final String DEFAULT_TITLE = MSG.common_title_resources();
private List<ResourceSelectListener> selectListeners = new ArrayList<ResourceSelectListener>();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ChildHistoryDetails.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ChildHistoryDetails.java
index 6e8105a..23100fc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ChildHistoryDetails.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ChildHistoryDetails.java
@@ -126,7 +126,7 @@ public class ChildHistoryDetails extends LocatableVLayout {
createdResourceType.setValue(MSG.common_status_unknown());
}
- TextAreaItem errorMessage = new TextAreaItem("errorMessage", MSG.common_title_error());
+ TextAreaItem errorMessage = new TextAreaItem("errorMessage", MSG.common_severity_error());
errorMessage.setValue(history.getErrorMessage());
errorMessage.setTitleOrientation(TitleOrientation.TOP);
errorMessage.setColSpan(2);
@@ -202,7 +202,7 @@ public class ChildHistoryDetails extends LocatableVLayout {
deletedResourceType.setValue(MSG.common_status_unknown());
}
- TextAreaItem errorMessage = new TextAreaItem("errorMessage", MSG.common_title_error());
+ TextAreaItem errorMessage = new TextAreaItem("errorMessage", MSG.common_severity_error());
errorMessage.setValue(history.getErrorMessage());
errorMessage.setTitleOrientation(TitleOrientation.TOP);
errorMessage.setColSpan(2);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/OverviewForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/OverviewForm.java
index 245ab2c..3db8f68 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/OverviewForm.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/OverviewForm.java
@@ -144,7 +144,7 @@ public class OverviewForm extends EnhancedDynamicForm {
// Type
StaticTextItem typeItem = new StaticTextItem("type", MSG.view_summaryOverviewForm_field_type());
typeItem.setTooltip(MSG.view_summaryOverviewForm_label_plugin() + type.getPlugin() + "\n<br>"
- + MSG.view_summaryOverviewForm_label_type() + type.getName());
+ + MSG.common_title_type() + type.getName());
typeItem.setValue(AncestryUtil.getFormattedType(type));
formItems.add(typeItem);
@@ -152,7 +152,7 @@ public class OverviewForm extends EnhancedDynamicForm {
// Key
StaticTextItem keyItem = new StaticTextItem(ResourceDataSourceField.KEY.propertyName(),
- ResourceDataSourceField.KEY.title());
+ ResourceDataSourceField.KEY.title());
keyItem.setValue(resource.getResourceKey());
formItems.add(keyItem);
@@ -287,32 +287,33 @@ public class OverviewForm extends EnhancedDynamicForm {
// Timestamps
StaticTextItem ctimeItem = new StaticTextItem(ResourceDataSourceField.CTIME.propertyName(),
- ResourceDataSourceField.CTIME.title());
+ ResourceDataSourceField.CTIME.title());
String ctime = TimestampCellFormatter.format(resource.getCtime());
ctimeItem.setValue(ctime);
formItems.add(ctimeItem);
StaticTextItem itimeItem = new StaticTextItem(ResourceDataSourceField.ITIME.propertyName(),
- ResourceDataSourceField.ITIME.title());
+ ResourceDataSourceField.ITIME.title());
String itime = TimestampCellFormatter.format(resource.getItime());
itimeItem.setValue(itime);
formItems.add(itimeItem);
StaticTextItem mtimeItem = new StaticTextItem(ResourceDataSourceField.MTIME.propertyName(),
- ResourceDataSourceField.MTIME.title());
+ ResourceDataSourceField.MTIME.title());
String mtime = TimestampCellFormatter.format(resource.getMtime());
mtimeItem.setValue(mtime);
formItems.add(mtimeItem);
StaticTextItem modifierItem = new StaticTextItem(ResourceDataSourceField.MODIFIER.propertyName(),
- ResourceDataSourceField.MODIFIER.title());
+ ResourceDataSourceField.MODIFIER.title());
modifierItem.setValue(resource.getModifiedBy());
formItems.add(modifierItem);
// Traits
List<MeasurementDefinition> summaryTraitDefs = new ArrayList<MeasurementDefinition>();
for (MeasurementDefinition measurementDef : type.getMetricDefinitions()) {
- if (measurementDef.getDataType() == DataType.TRAIT && measurementDef.getDisplayType() == DisplayType.SUMMARY) {
+ if (measurementDef.getDataType() == DataType.TRAIT
+ && measurementDef.getDisplayType() == DisplayType.SUMMARY) {
summaryTraitDefs.add(measurementDef);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
index b6aa0fb..ae39e50 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
@@ -98,9 +98,9 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
}
public static class DriftSubTab {
- public static final String CONFIGURATION = "Configuration";
public static final String HISTORY = "History";
- public static final String CHANGE_SETS = "ChangeSets";
+ public static final String SNAPSHOTS = "Snapshots";
+ public static final String DEFINITIONS = "Definitions";
}
public static class OperationsSubTab {
@@ -146,8 +146,8 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
private SubTab configHistory;
private SubTab eventHistory;
private SubTab driftHistory;
- private SubTab driftChangeSets;
- private SubTab driftConfig;
+ private SubTab driftSnapshots;
+ private SubTab driftDefinitions;
private SubTab contentDeployed;
private SubTab contentNew;
private SubTab contentSubscrip;
@@ -164,7 +164,7 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
List<TwoLevelTab> tabs = new ArrayList<TwoLevelTab>();
summaryTab = new TwoLevelTab(getTabSet().extendLocatorId("Summary"), new ViewName("Summary", MSG
- .view_tabs_common_summary()), ImageManager.getResourceIcon(ResourceCategory.SERVICE, Boolean.TRUE));
+ .common_title_summary()), ImageManager.getResourceIcon(ResourceCategory.SERVICE, Boolean.TRUE));
summaryActivity = new SubTab(summaryTab.extendLocatorId("Activity"), new ViewName("Activity", MSG
.view_tabs_common_activity()), null);
summaryTimeline = new SubTab(summaryTab.extendLocatorId("Timeline"), new ViewName("Timeline", MSG
@@ -191,11 +191,11 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
tabs.add(inventoryTab);
alertsTab = new TwoLevelTab(getTabSet().extendLocatorId("Alerts"), new ViewName("Alerts", MSG
- .view_tabs_common_alerts()), "subsystems/alert/Alerts_16.png");
+ .common_title_alerts()), "subsystems/alert/Alerts_16.png");
this.alertHistory = new SubTab(alertsTab.extendLocatorId("History"), new ViewName("History", MSG
.view_tabs_common_history()), null);
this.alertDef = new SubTab(alertsTab.extendLocatorId("Definitions"), new ViewName("Definitions", MSG
- .view_tabs_common_definitions()), null);
+ .common_title_definitions()), null);
alertsTab.registerSubTabs(alertHistory, alertDef);
tabs.add(alertsTab);
@@ -225,7 +225,7 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
tabs.add(eventsTab);
operationsTab = new TwoLevelTab(getTabSet().extendLocatorId(Tab.OPERATIONS), new ViewName(Tab.OPERATIONS, MSG
- .view_tabs_common_operations()), "subsystems/control/Operation_grey_16.png");
+ .common_title_operations()), "subsystems/control/Operation_grey_16.png");
this.operationsSchedules = new SubTab(operationsTab.extendLocatorId(OperationsSubTab.SCHEDULES), new ViewName(
OperationsSubTab.SCHEDULES, MSG.view_tabs_common_schedules()), null);
this.operationsHistory = new SubTab(operationsTab.extendLocatorId(OperationsSubTab.HISTORY), new ViewName(
@@ -234,7 +234,7 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
tabs.add(operationsTab);
configurationTab = new TwoLevelTab(getTabSet().extendLocatorId(Tab.CONFIGURATION), new ViewName(
- Tab.CONFIGURATION, MSG.view_tabs_common_configuration()), "subsystems/configure/Configure_grey_16.png");
+ Tab.CONFIGURATION, MSG.common_title_configuration()), "subsystems/configure/Configure_grey_16.png");
this.configCurrent = new SubTab(configurationTab.extendLocatorId(ConfigurationSubTab.CURRENT), new ViewName(
ConfigurationSubTab.CURRENT, MSG.view_tabs_common_current()), null);
this.configHistory = new SubTab(configurationTab.extendLocatorId(ConfigurationSubTab.HISTORY), new ViewName(
@@ -244,21 +244,21 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
driftTab = new TwoLevelTab(getTabSet().extendLocatorId(Tab.DRIFT), new ViewName(Tab.DRIFT, MSG
.view_tabs_common_drift()), "subsystems/drift/Drift_16.png");
- this.driftChangeSets = new SubTab(driftTab.extendLocatorId(DriftSubTab.CHANGE_SETS), new ViewName(
- DriftSubTab.CHANGE_SETS, MSG.view_drift_changeSets()), null);
+ this.driftSnapshots = new SubTab(driftTab.extendLocatorId(DriftSubTab.SNAPSHOTS), new ViewName(
+ DriftSubTab.SNAPSHOTS, MSG.view_drift_snapshots()), null);
this.driftHistory = new SubTab(driftTab.extendLocatorId(DriftSubTab.HISTORY), new ViewName(DriftSubTab.HISTORY,
MSG.view_tabs_common_history()), null);
- this.driftConfig = new SubTab(driftTab.extendLocatorId(DriftSubTab.CONFIGURATION), new ViewName(
- DriftSubTab.CONFIGURATION, MSG.view_tabs_common_configuration()), null);
- driftTab.registerSubTabs(driftChangeSets, driftHistory, driftConfig);
+ this.driftDefinitions = new SubTab(driftTab.extendLocatorId(DriftSubTab.DEFINITIONS), new ViewName(
+ DriftSubTab.DEFINITIONS, MSG.common_title_definitions()), null);
+ driftTab.registerSubTabs(driftHistory, driftSnapshots, driftDefinitions);
tabs.add(driftTab);
contentTab = new TwoLevelTab(getTabSet().extendLocatorId("Content"), new ViewName("Content", MSG
.view_tabs_common_content()), "subsystems/content/Content_grey_16.png");
this.contentDeployed = new SubTab(contentTab.extendLocatorId("Deployed"), new ViewName("Deployed", MSG
.view_tabs_common_deployed()), null);
- this.contentNew = new SubTab(contentTab.extendLocatorId("New"),
- new ViewName("New", MSG.view_tabs_common_new()), null);
+ this.contentNew = new SubTab(contentTab.extendLocatorId("New"), new ViewName("New", MSG.common_button_new()),
+ null);
this.contentSubscrip = new SubTab(contentTab.extendLocatorId("Subscriptions"), new ViewName("Subscriptions",
MSG.view_tabs_common_subscriptions()), null);
this.contentHistory = new SubTab(contentTab.extendLocatorId("History"), new ViewName("History", MSG
@@ -523,10 +523,10 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
ResourcePermission resourcePermissions, Set<ResourceTypeFacet> facets) {
if (updateTab(this.driftTab, facets.contains(ResourceTypeFacet.DRIFT), resourcePermissions.isDrift())) {
- updateSubTab(this.driftTab, this.driftChangeSets, true, true, new ViewFactory() {
+ updateSubTab(this.driftTab, this.driftSnapshots, true, true, new ViewFactory() {
@Override
public Canvas createView() {
- return ResourceDriftChangeSetsView.get(driftChangeSets.extendLocatorId("View"), resourceComposite);
+ return ResourceDriftChangeSetsView.get(driftSnapshots.extendLocatorId("View"), resourceComposite);
}
});
@@ -537,10 +537,11 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
}
});
- updateSubTab(this.driftTab, this.driftConfig, true, true, new ViewFactory() {
+ updateSubTab(this.driftTab, this.driftDefinitions, true, true, new ViewFactory() {
@Override
public Canvas createView() {
- return ResourceDriftConfigurationView.get(driftConfig.extendLocatorId("View"), resourceComposite);
+ return ResourceDriftConfigurationView.get(driftDefinitions.extendLocatorId("View"),
+ resourceComposite);
}
});
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
index 501d9b2..5d175c7 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
@@ -460,7 +460,7 @@ public class ResourceTreeView extends LocatableVLayout {
resourceContextMenu.addItem(new MenuItemSeparator());
// Operations Menu
- MenuItem operations = new MenuItem(MSG.view_tree_common_contextMenu_operations());
+ MenuItem operations = new MenuItem(MSG.common_title_operations());
boolean operationsEnabled = (resourcePermission.isControl() && (resourceType.getOperationDefinitions() != null) && !resourceType
.getOperationDefinitions().isEmpty());
operations.setEnabled(operationsEnabled);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDataSource.java
index 9991f9c..03ae86f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDataSource.java
@@ -188,7 +188,7 @@ public abstract class AbstractConfigurationHistoryDataSource<T extends AbstractR
String err = event.getRecord().getAttribute(Field.ERROR_MESSAGE);
if (err != null && err.length() > 0) {
err = "<pre>" + err + "</pre>";
- new ErrorMessageWindow("errWin", MSG.common_title_error(), err).show();
+ new ErrorMessageWindow("errWin", MSG.common_severity_error(), err).show();
}
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/calltime/CallTimeDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/calltime/CallTimeDataSource.java
index b6acfa1..550215e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/calltime/CallTimeDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/calltime/CallTimeDataSource.java
@@ -68,7 +68,7 @@ public class CallTimeDataSource extends RPCDataSource<CallTimeDataComposite, Cri
DataSourceIntegerField maximum = new DataSourceIntegerField("maximum", MSG
.view_resource_monitor_calltime_maximum());
fields.add(maximum);
- DataSourceIntegerField total = new DataSourceIntegerField("total", MSG.view_resource_monitor_calltime_total());
+ DataSourceIntegerField total = new DataSourceIntegerField("total", MSG.common_title_total());
fields.add(total);
return fields;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/calltime/CallTimeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/calltime/CallTimeView.java
index b13d5ee..894a1b3 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/calltime/CallTimeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/calltime/CallTimeView.java
@@ -131,7 +131,7 @@ public class CallTimeView extends LocatableLayout {
}
});
ListGridField maximum = new ListGridField("maximum", MSG.view_resource_monitor_calltime_maximum(), 70);
- ListGridField total = new ListGridField("total", MSG.view_resource_monitor_calltime_total(), 70);
+ ListGridField total = new ListGridField("total", MSG.common_title_total(), 70);
table.getListGrid().setFields(callDestination, count, minimum, average, maximum, total);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MeasurementTableDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MeasurementTableDataSource.java
index 8913ab7..32975b4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MeasurementTableDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MeasurementTableDataSource.java
@@ -62,7 +62,7 @@ public class MeasurementTableDataSource extends RPCDataSource<MetricDisplaySumma
nameField.setWidth("30%");
fields.add(nameField);
- ListGridField alertsField = new ListGridField(FIELD_ALERT_COUNT, MSG.view_resource_monitor_table_alerts());
+ ListGridField alertsField = new ListGridField(FIELD_ALERT_COUNT, MSG.common_title_alerts());
alertsField.setWidth("10%");
fields.add(alertsField);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java
index cccc08a..931da57 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java
@@ -56,12 +56,12 @@ public class AutodiscoveryQueueDataSource extends DataSource {
private static Messages MSG = CoreGUI.getMessages();
- public static final String NEW = MSG.view_autoDiscoveryQ_new();
+ public static final String NEW = MSG.common_button_new();
public static final String IGNORED = MSG.view_autoDiscoveryQ_ignored();
public static final String NEW_AND_IGNORED = MSG.view_autoDiscoveryQ_newAndIgnored();
private static final String NO_MANAGE_INVENTORY_PERMS_EMPTY_MESSAGE = MSG.view_autoDiscoveryQ_noperm();
- private static final String EMPTY_MESSAGE = MSG.view_autoDiscoveryQ_noItems();
+ private static final String EMPTY_MESSAGE = MSG.common_msg_noItemsToShow();
private int unlimited = -1;
private int maximumPlatformsToDisplay = -1;
@@ -86,12 +86,11 @@ public class AutodiscoveryQueueDataSource extends DataSource {
.view_autoDiscoveryQ_field_parentId());
parentIdField.setForeignKey("id");
- DataSourceTextField resourceNameField = new DataSourceTextField("name", MSG.view_autoDiscoveryQ_field_name());
+ DataSourceTextField resourceNameField = new DataSourceTextField("name", MSG.common_title_resource_name());
- DataSourceTextField resourceKeyField = new DataSourceTextField("resourceKey", MSG
- .view_autoDiscoveryQ_field_key());
+ DataSourceTextField resourceKeyField = new DataSourceTextField("resourceKey", MSG.common_title_resource_key());
- DataSourceTextField resourceTypeField = new DataSourceTextField("typeName", MSG.common_title_type());
+ DataSourceTextField resourceTypeField = new DataSourceTextField("typeName", MSG.common_title_resource_type());
DataSourceTextField descriptionField = new DataSourceTextField("description", MSG.common_title_description());
@@ -253,7 +252,7 @@ public class AutodiscoveryQueueDataSource extends DataSource {
setAttribute("status", resource.getInventoryStatus().name());
switch (resource.getInventoryStatus()) {
case NEW:
- setAttribute("statusLabel", MSG.view_autoDiscoveryQ_new());
+ setAttribute("statusLabel", MSG.common_button_new());
break;
case COMMITTED:
setAttribute("statusLabel", MSG.view_autoDiscoveryQ_committed());
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java
index 9b0cfe3..690ea75 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java
@@ -166,8 +166,7 @@ public class ResourceAutodiscoveryView extends LocatableVLayout implements Refre
addMember(footer);
- final IButton importButton = new LocatableIButton(this.extendLocatorId("Import"), MSG
- .view_autoDiscoveryQ_import());
+ final IButton importButton = new LocatableIButton(this.extendLocatorId("Import"), MSG.common_button_import());
final IButton ignoreButton = new LocatableIButton(this.extendLocatorId("Ignore"), MSG
.view_autoDiscoveryQ_ignore());
final IButton unignoreButton = new LocatableIButton(this.extendLocatorId("Unignore"), MSG
@@ -198,11 +197,11 @@ public class ResourceAutodiscoveryView extends LocatableVLayout implements Refre
});
footer.addMember(form);
- final IButton selectAllButton = new LocatableIButton(this.extendLocatorId("SelectAll"),
- MSG.view_autoDiscoveryQ_selectAll());
+ final IButton selectAllButton = new LocatableIButton(this.extendLocatorId("SelectAll"), MSG
+ .view_autoDiscoveryQ_selectAll());
footer.addMember(selectAllButton);
- final IButton deselectAllButton = new LocatableIButton(this.extendLocatorId("DeselectAll"),
- MSG.view_autoDiscoveryQ_deselectAll());
+ final IButton deselectAllButton = new LocatableIButton(this.extendLocatorId("DeselectAll"), MSG
+ .view_autoDiscoveryQ_deselectAll());
deselectAllButton.setDisabled(true);
footer.addMember(deselectAllButton);
@@ -238,7 +237,7 @@ public class ResourceAutodiscoveryView extends LocatableVLayout implements Refre
}
}
updateButtonEnablement(selectAllButton, deselectAllButton, importButton, ignoreButton,
- unignoreButton);
+ unignoreButton);
selectionChangedHandlerDisabled = false;
}
});
@@ -252,7 +251,7 @@ public class ResourceAutodiscoveryView extends LocatableVLayout implements Refre
// platform checkbox remained checked.
treeGrid.redraw();
updateButtonEnablement(selectAllButton, deselectAllButton, importButton, ignoreButton,
- unignoreButton);
+ unignoreButton);
selectionChangedHandlerDisabled = false;
}
} else {
@@ -262,7 +261,7 @@ public class ResourceAutodiscoveryView extends LocatableVLayout implements Refre
}
}
updateButtonEnablement(selectAllButton, deselectAllButton, importButton, ignoreButton,
- unignoreButton);
+ unignoreButton);
selectionChangedHandlerDisabled = false;
}
}
@@ -273,7 +272,7 @@ public class ResourceAutodiscoveryView extends LocatableVLayout implements Refre
public void onDataArrived(DataArrivedEvent dataArrivedEvent) {
if (treeGrid != null) {
updateButtonEnablement(selectAllButton, deselectAllButton, importButton, ignoreButton,
- unignoreButton);
+ unignoreButton);
// NOTE: Due to a SmartGWT bug, the TreeGrid is not automatically redrawn upon data arrival, and
// calling treeGrid.markForRedraw() doesn't redraw it either. The user can mouse over the grid
// to cause it to redraw, but it is obviously not reasonable to expect that. So we must
@@ -304,7 +303,7 @@ public class ResourceAutodiscoveryView extends LocatableVLayout implements Refre
}
treeGrid.markForRedraw();
updateButtonEnablement(selectAllButton, deselectAllButton, importButton, ignoreButton,
- unignoreButton);
+ unignoreButton);
selectionChangedHandlerDisabled = false;
}
});
@@ -389,8 +388,8 @@ public class ResourceAutodiscoveryView extends LocatableVLayout implements Refre
}
- private void updateButtonEnablement(IButton selectAllButton, IButton deselectAllButton,
- IButton importButton, IButton ignoreButton, IButton unignoreButton) {
+ private void updateButtonEnablement(IButton selectAllButton, IButton deselectAllButton, IButton importButton,
+ IButton ignoreButton, IButton unignoreButton) {
if (treeGrid.getSelection().length == 0) {
selectAllButton.setDisabled(false);
deselectAllButton.setDisabled(true);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/ProblemResourcesDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/ProblemResourcesDataSource.java
index 3926fc5..6874d39 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/ProblemResourcesDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/ProblemResourcesDataSource.java
@@ -58,7 +58,7 @@ public class ProblemResourcesDataSource extends RPCDataSource<ProblemResourceCom
public enum Field {
- ALERTS("numAlerts", MSG.dataSource_problemResources_field_alerts()),
+ ALERTS("numAlerts", MSG.common_title_alerts()),
AVAILABILITY("availabilityType", MSG.common_title_availability()),
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index 8a14fb6..9e4311a 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -55,25 +55,19 @@ common_label_ago = ago
common_label_all = ALL
common_label_all_resources = all resources
common_label_day = day
-common_label_days = days
common_label_hour = hour
-common_label_hours = hours
common_label_item = item
common_label_items = items
-common_label_milliseconds = milliseconds
-common_label_minutes = minutes
common_label_month = month
common_label_none = none
common_label_role = role
common_label_roles = roles
common_label_scheduled_operations = scheduled operations
-common_label_seconds = seconds
common_label_selected_resources = selected resources
common_label_unlimited = unlimited
common_label_user = user
common_label_users = users
common_label_week = week
-common_label_weeks = weeks
common_label_yesterday = Yesterday
common_msg_areYouSure = Are You Sure?
common_msg_asyncTimeout = {0}. This occurred because the server is taking a long time to complete this request. Please be aware that the server may still be processing your request and it may complete shortly. You can check the server logs to see if any abnormal errors occurred.
@@ -103,7 +97,8 @@ common_title_add_column = Add Column
common_title_add_graph_to_view = Add Graph to Monitor View
common_title_add_portlet = Add Portlet
common_title_address = Address
-common_title_alert_range = Alert Range
+common_title_alerts = Alerts
+common_title_alerts_range = Alert Range
common_title_ancestry = Ancestry
common_title_availability = Availability
common_title_available_resources = Available Resources
@@ -127,6 +122,8 @@ common_title_dashboard_name = Dashboard Name
common_title_dateCreated = Date Created
common_title_dateRange = Date Range
common_title_default = Default
+common_title_definition = Definition
+common_title_definitions = Definitions
common_title_description = Description
common_title_details = Details
common_title_display = Display
@@ -135,7 +132,6 @@ common_title_duration = Duration
common_title_edit_mode = Edit Mode
common_title_enabled = Enabled?
common_title_end = End
-common_title_error = Error
common_title_generalProp = General Properties
common_title_group = Group
common_title_group_def_total = Group Definition Total
@@ -145,7 +141,6 @@ common_title_help = Help
common_title_host = Host
common_title_id = ID
common_title_id_parent = Parent ID
-common_title_info = Info
common_title_interval = Interval
common_title_inventory = Inventory
common_title_inventorySummary = Inventory Summary
@@ -163,6 +158,7 @@ common_title_name = Name
common_title_new_dashboard = New Dashboard
common_title_numeric_metrics = Numeric Metrics
common_title_numeric_type = Numeric Type
+common_title_operation = Operation
common_title_operation_status = Operation Status
common_title_operations = Operations
common_title_operations_range = Operation Range
@@ -178,7 +174,7 @@ common_title_providers = Providers
common_title_recent_alerts = Recent Alerts
common_title_recent_bundle_deployments = Recent Bundle Deployments
common_title_recent_configuration_updates = Recent Configuration Updates
-common_title_recent_drifts = Recent Drifts
+common_title_recent_drifts = Recent Drift
common_title_recent_event_counts = Recent Event Counts
common_title_recent_measurements = Recent Measurements
common_title_recent_oob_metrics = Recent Out of Bound metrics
@@ -285,14 +281,12 @@ dataSource_platforms_field_cpu = CPU
dataSource_platforms_field_memory = Memory
dataSource_platforms_field_swap = Swap
dataSource_problemResources_error_fetchFailure = Failed to load Resources with alerts/unavailability.
-dataSource_problemResources_field_alerts = Alerts
dataSource_problemResources_field_available = Current Availability
dataSource_recentOperations_error_fetchFailure = Failed to load recently completed operations.
dataSource_recentOperations_field_location = Location
dataSource_recentOperations_field_operation = Operation
dataSource_recentOperations_field_resource = Resource
dataSource_recentOperations_field_status = Status
-dataSource_recentOperations_field_time = Date/Time
dataSource_resourceErrors_clickStatusIcon = Click the icon for more details
dataSource_resourceErrors_deleteFailure = Failed to delete resource errors
dataSource_resourceErrors_deleteSuccess = You have successfully deleted [{0}] resource error messages.
@@ -316,7 +310,6 @@ dataSource_scheduledOperations_error_fetchFailure = Failed to load scheduled ope
dataSource_scheduledOperations_field_location = Location
dataSource_scheduledOperations_field_operation = Operation
dataSource_scheduledOperations_field_resource = Resource
-dataSource_scheduledOperations_field_time = Date/Time
dataSource_schedules_disableFailure_group = Failed to disable the collection of [{0}] metrics for resource group with ID [{1}]. The metrics were: [{2}]
dataSource_schedules_disableFailure_resource = Failed to disable the collection of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]
dataSource_schedules_disableSuccessful_concise = You have disabled the collection of [{0}] measurements
@@ -352,14 +345,11 @@ dataSource_users_field_id = ID
dataSource_users_field_lastName = Last Name
dataSource_users_field_ldap = LDAP Login?
dataSource_users_field_name = User Name
-dataSource_users_field_password = Password
dataSource_users_field_passwordVerify = Verify Password
dataSource_users_field_phoneNumber = Phone Number
dataSource_users_invalidEmailAddress = Invalid email address.
dataSource_users_passwordsDoNotMatch = Passwords do not match.
datasource_roles_field_ldapGroups = LDAP Groups
-datasource_roles_field_permissions = Permissions
-datasource_roles_field_resourceGroups = Resource Groups
datasource_roles_field_subjects = Subjects
datasource_templateSchedules_disabled = Disabled collection of selected metric [{0}].
datasource_templateSchedules_disabled_detailed = Disabled collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
@@ -397,7 +387,6 @@ view_adminConfig_plugins = Plugins
view_adminConfig_systemSettings = System Settings
view_adminConfig_templates = Templates
view_adminContent_contentSources = Content Sources
-view_adminContent_repositories = Repositories
view_adminRoles_assignedGroups = Assigned Resource Groups
view_adminRoles_assignedSubjects = Assigned Subjects
view_adminRoles_failLdap = Failed to determine if LDAP configured - assuming no LDAP.
@@ -407,7 +396,6 @@ view_adminRoles_failRoles = Failed to fetch roles.
view_adminRoles_globalPerms = Global Permissions
view_adminRoles_ldapGroups = LDAP Groups
view_adminRoles_ldapGroupsReadOnly = LDAP group data is read only
-view_adminRoles_noItems = No items to show
view_adminRoles_noLdap = The LDAP security integration is not configured. To configure LDAP, go to <a {0}>{1}</a>.
view_adminRoles_permissions_autoselecting_configureRead_implied = Autodeselected CONFIGURE_WRITE permission, since lack of CONFIGURE_READ implies lack of it...
view_adminRoles_permissions_autoselecting_configureWrite_implied = Autoselected CONFIGURE_READ permission, since CONFIGURE_WRITE implies it...
@@ -432,7 +420,7 @@ view_adminRoles_permissions_permReadDesc_deleteChildResources = (IMPLIED) view c
view_adminRoles_permissions_permReadDesc_inventory = (IMPLIED) view Resource properties (name, description, version, etc.), connection settings, and connection settings history
view_adminRoles_permissions_permReadDesc_manageAlerts = (IMPLIED) view alert definitions and alert history
view_adminRoles_permissions_permReadDesc_manageContent = (IMPLIED) view installed and available packages; view package installation history
-view_adminRoles_permissions_permReadDesc_manageDrift = (IMPLIED) view drift configurations and drift history
+view_adminRoles_permissions_permReadDesc_manageDrift = (IMPLIED) view drift definitions and drift history
view_adminRoles_permissions_permReadDesc_manageEvents = (IMPLIED) view events
view_adminRoles_permissions_permReadDesc_manageMeasurements = (IMPLIED) view metric data and collection schedules
view_adminRoles_permissions_permWriteDesc_configure = update Resource configuration; delete Resource configuration revision history items
@@ -442,7 +430,7 @@ view_adminRoles_permissions_permWriteDesc_deleteChildResources = uninventory res
view_adminRoles_permissions_permWriteDesc_inventory = update Resource name, version, description, and connection settings; delete connection settings history items
view_adminRoles_permissions_permWriteDesc_manageAlerts = create, update, and delete alert definitions; acknowledge and delete alert history items
view_adminRoles_permissions_permWriteDesc_manageContent = subscribe to content sources; install and uninstall packages
-view_adminRoles_permissions_permWriteDesc_manageDrift = create, update, and delete drift configurations; acknowledge and delete drift history items
+view_adminRoles_permissions_permWriteDesc_manageDrift = create, update, and delete drift definitions; and manage drift instances
view_adminRoles_permissions_permWriteDesc_manageEvents = delete events
view_adminRoles_permissions_permWriteDesc_manageMeasurements = update metric collection schedules
view_adminRoles_permissions_perm_configure = Configure
@@ -464,15 +452,12 @@ view_adminRoles_permissions_read = Read:
view_adminRoles_permissions_readAccessImplied = Read access for the {0} permission is implied and cannot be disabled.
view_adminRoles_permissions_resourcePermissions = Resource Permissions
view_adminRoles_permissions_write = Write:
-view_adminRoles_perms = Permissions
view_adminRoles_resourcePerms = Resource Permissions
view_adminRoles_roleAdded = Role [{0}] added.
view_adminRoles_roleDeleteFailed = Failed to delete role [{0}].
view_adminRoles_roleDeleted = Role [{0}] deleted.
view_adminRoles_roleUpdateFailed = Failed to update role [{0}].
view_adminRoles_roleUpdated = Role [{0}] updated.
-view_adminSecurity_roles = Roles
-view_adminSecurity_users = Users
view_adminTemplates_disabledAlertTemplates = Disabled Alert Templates
view_adminTemplates_disabledMetricTemplates = Disabled Metric Templates
view_adminTemplates_editAlertTemplate = Edit Alert Template
@@ -492,8 +477,6 @@ view_adminTopology_partitionEvents = Partition Events
view_adminTopology_remoteAgentInstall = Remote Agent Install
view_adminTopology_servers = Servers
view_adminUsersDetails_dataTypeName = user
-view_adminUsersList_dataTypeName = user
-view_adminUsersList_dataTypeNamePlural = users
view_admin_administration = Administration
view_admin_configuration = Configuration
view_admin_content = Content
@@ -613,8 +596,8 @@ view_alert_common_tab_conditions_type_availability = Availability Change
view_alert_common_tab_conditions_type_availability_down = Went down
view_alert_common_tab_conditions_type_availability_up = Came up
view_alert_common_tab_conditions_type_drift = Drift Detection
-view_alert_common_tab_conditions_type_drift_configpaths = Drift Detection for files that match "{0}" and for drift configuration [{1}]
-view_alert_common_tab_conditions_type_drift_onlyconfig = Drift Detection for drift configuration [{0}]
+view_alert_common_tab_conditions_type_drift_configpaths = Drift Detection for files that match "{0}" and for drift definition [{1}]
+view_alert_common_tab_conditions_type_drift_onlyconfig = Drift Detection for drift definition [{0}]
view_alert_common_tab_conditions_type_drift_onlypaths = Drift Detection for files that match "{0}"
view_alert_common_tab_conditions_type_event = Event Detection
view_alert_common_tab_conditions_type_event_matching = with event source matching
@@ -637,7 +620,6 @@ view_alert_common_tab_conditions_type_metric_trait_change = Trait Change
view_alert_common_tab_conditions_type_operation = Operation Execution
view_alert_common_tab_conditions_type_operation_status = with result status
view_alert_common_tab_conditions_type_resource_configuration = Resource Configuration Change
-view_alert_common_tab_conditions_value = Value
view_alert_common_tab_dampening = Dampening
view_alert_common_tab_dampening_category_consecutive_count = Consecutive
view_alert_common_tab_dampening_category_consecutive_count_tooltip = An alert is triggered once every X occurrences the condition set is true consecutively.
@@ -674,19 +656,14 @@ view_alert_definition_condition_editor_common_avg = Average
view_alert_definition_condition_editor_common_max = Maximum
view_alert_definition_condition_editor_common_min = Minimum
view_alert_definition_condition_editor_delete_confirm = Delete the selected alert condition(s)?
-view_alert_definition_condition_editor_drift_configname_regex = Drift Configuration Name
-view_alert_definition_condition_editor_drift_configname_regex_tooltip = If specified, this is the drift configuration name that was responsible for the drift that was detected. This can optionally be a regular expression if you wish to match multiple drift configuration names.
+view_alert_definition_condition_editor_drift_configname_regex = Drift Definition Name
+view_alert_definition_condition_editor_drift_configname_regex_tooltip = If specified, this is the drift definition name that was responsible for the drift that was detected. This can optionally be a regular expression if you wish to match multiple drift definition names.
view_alert_definition_condition_editor_drift_pathname_regex = Pathname Regular Expression
view_alert_definition_condition_editor_drift_pathname_regex_tooltip = If specified, this is a regular expression that must match the pathnames of those files that drifted.
view_alert_definition_condition_editor_drift_tooltip = This condition is triggered when drift has been detected.
view_alert_definition_condition_editor_event_regex = Regular Expression
view_alert_definition_condition_editor_event_regex_tooltip = If specified, this is a regular expression that must match a collected event message in order to trigger the condition.
view_alert_definition_condition_editor_event_severity = Event Severity
-view_alert_definition_condition_editor_event_severity_debug = Debug
-view_alert_definition_condition_editor_event_severity_error = Error
-view_alert_definition_condition_editor_event_severity_fatal = Fatal
-view_alert_definition_condition_editor_event_severity_info = Info
-view_alert_definition_condition_editor_event_severity_warn = Warn
view_alert_definition_condition_editor_event_tooltip = Specify the event severity that an event message must be reported with in order to trigger this condition. If you specify an optional regular expression, the event message must also match that regular expression in order for the condition to trigger.
view_alert_definition_condition_editor_metric_baseline_percentage = Baseline Percentage
view_alert_definition_condition_editor_metric_baseline_percentage_tooltip = A collected metric value will trigger this condition when compared to this percentage of the selected baseline value using the selected comparator
@@ -735,12 +712,7 @@ view_alert_definition_condition_editor_metric_trait_change_tooltip = Specify the
view_alert_definition_condition_editor_metric_trait_change_value = Trait
view_alert_definition_condition_editor_metricswarning = You cannot have multiple conditions that use the same metric when using the ALL conjunction. This alert definition has multiple conditions that use the metric [{0}].
view_alert_definition_condition_editor_operation_status = Operation Status
-view_alert_definition_condition_editor_operation_status_canceled = Canceled
-view_alert_definition_condition_editor_operation_status_failure = Failure
-view_alert_definition_condition_editor_operation_status_inprogress = In Progress
-view_alert_definition_condition_editor_operation_status_success = Success
view_alert_definition_condition_editor_operation_tooltip = Specify the result that must occur when the selected operation is executed in order to trigger the condition.
-view_alert_definition_condition_editor_operation_value = Operation
view_alert_definition_condition_editor_option_availability = Availability Change
view_alert_definition_condition_editor_option_drift = Drift Detection
view_alert_definition_condition_editor_option_event = Event Detection
@@ -873,22 +845,17 @@ view_autoDiscoveryQ_deleted = Deleted
view_autoDiscoveryQ_deselectAll = Deselect All
view_autoDiscoveryQ_field_discoveryTime = Discovery Time
view_autoDiscoveryQ_field_inventoryStatus = Inventory Status
-view_autoDiscoveryQ_field_key = Resource Key
-view_autoDiscoveryQ_field_name = Resource Name
view_autoDiscoveryQ_field_parentId = Parent ID
view_autoDiscoveryQ_ignore = Ignore
view_autoDiscoveryQ_ignoreFailure = Failed to ignore Resources
view_autoDiscoveryQ_ignoreInProgress = Ignoring the selected Resources...
view_autoDiscoveryQ_ignoreSuccessful = You have successfully ignored the selected Resources.
view_autoDiscoveryQ_ignored = Ignored
-view_autoDiscoveryQ_import = Import
view_autoDiscoveryQ_importFailure = Failed to import Resources
view_autoDiscoveryQ_importInProgress = Importing the selected Resources...
view_autoDiscoveryQ_importSuccessful = You have successfully imported the selected Resources.
view_autoDiscoveryQ_loadFailure = Failed to load the inventory discovery queue
-view_autoDiscoveryQ_new = New
view_autoDiscoveryQ_newAndIgnored = New and Ignored
-view_autoDiscoveryQ_noItems = No items to show
view_autoDiscoveryQ_noperm = (You are not authorized to view the auto-discovery queue)
view_autoDiscoveryQ_selectAll = Select All
view_autoDiscoveryQ_showStatus = Show
@@ -1149,41 +1116,40 @@ view_dashboards_portlets_refresh_one_min = 1 minute
view_dashboards_portlets_refresh_success1 = Updated interval for portlets that auto-refresh
view_dashboards_portlets_refresh_success2 = Stopping reload for portlets that auto-refresh
view_dashboards_title = Dashboard
-view_drift = Drift
view_drift_button_detectNow = Detect Now
view_drift_category_fileAdded = File Added
view_drift_category_fileChanged = File Changed
-view_drift_category_fileNew = New Detection
+view_drift_category_fileNew = Newly Detected
view_drift_category_fileRemoved = File Removed
-view_drift_changeSets = Change Sets
-view_drift_changeSets_resourceViewTitle = Resource Drift Change Sets
-view_drift_changeset_tree_loadConfigFailure = Failed to load drift configuration for change set id [{0}]
-view_drift_changeset_tree_loadFailure = Failed to load drift change set tree.
-view_drift_delete_configConfirm = Delete the selected drift configuration(s)?
-view_drift_delete_configConfirmAll = Delete all drift configurations?
-view_drift_failure_deleteConfigs = Failed to delete some or all drift configurations.
-view_drift_failure_detectNow = Failed to submit drift detection request
-view_drift_failure_load = Failed to fetch drift data
-view_drift_success_configurationUpdated = Drift configuration updated. File coverage will be updated on next detection scan.
-view_drift_success_delete = Successfully deleted {0} drifts
-view_drift_success_deleteConfigs = Successfully deleted {0} drift configurations
-view_drift_success_detectNow = Successfully submitted drift detection request
+view_drift_delete_configConfirm = Delete the selected drift detection definition(s)?
+view_drift_delete_configConfirmAll = Delete all drift detection definition?
+view_drift_failure_deleteDefs = Failed to delete some or all drift detection definitions.
+view_drift_failure_detectNow = Failed to submit drift detection run request
+view_drift_failure_load = Failed to fetch drift instances
+view_drift_snapshots = Snapshots
+view_drift_snapshots_resourceViewTitle = Resource Drift Snapshots
+view_drift_snapshots_tree_loadDefFailure = Failed to load drift detection definition for snapshot id [{0}]
+view_drift_snapshots_tree_loadFailure = Failed to load drift snapshot tree.
+view_drift_success_defUpdated = Drift detection definition updated and will affect the next detection run as applicable.
+view_drift_success_delete = Successfully deleted {0} drift instances
+view_drift_success_deleteConfigs = Successfully deleted {0} drift detection definitions
+view_drift_success_detectNow = Successfully submitted drift detection run request
view_drift_table_baseDir = Base Directory
-view_drift_table_changeSet = Change Set
view_drift_table_driftHandlingMode = Drift Handling
view_drift_table_driftHandlingMode_normal = normal
view_drift_table_driftHandlingMode_plannedChanges = planned changes
view_drift_table_newFile = New File
view_drift_table_oldFile = Old File
-view_drift_table_resourceConfig = Resource Drift Configuration
+view_drift_table_resourceDef = Resource Drift Detection Definition
view_drift_table_resourceHistory = Resource Drift History
-view_drift_wizard_addConfig_failure = Failed to add new drift configuration [{0}]
-view_drift_wizard_addConfig_infoStepName = Provide Drift Detection Information
-view_drift_wizard_addConfig_success = Successfully added new drift configuration [{0}]. Agent(s) will be updated.
-view_drift_wizard_addConfig_templateHelp = Each drift configuration describes a set of files for which drift detection can be performed. The configuration can be enabled and disabled, defines the detection interval, and specifies a base directory and optional file filters. For each resource type offering drift detection there will be one or more predefined templates to use a starting configuration, which can then be edited.
-view_drift_wizard_addConfig_templatePrompt = Drift Configuration Templates
-view_drift_wizard_addConfig_title = Add Drift Configuration for Resource of Type [{0}]
-view_drift_wizard_addConfig_windowTitle = Drift Add Configuration Wizard
+view_drift_table_snapshot = Snapshot
+view_drift_wizard_addDef_failure = Failed to add new drift detection definition [{0}]
+view_drift_wizard_addDef_infoStepName = Provide Drift Detection Information
+view_drift_wizard_addDef_success = Successfully added new drift detection definition [{0}]. Agent(s) will be updated.
+view_drift_wizard_addDef_templateHelp = Each drift detection definition describes a set of files for which drift monitoring will be performed. The definition can be enabled and disabled, defines the detection run interval, and specifies a base directory and optional file filters. For each resource type offering drift detection there will be one or more predefined templates to use as a starting definition, which can then be edited.
+view_drift_wizard_addDef_templatePrompt = Drift Detection Definition Templates
+view_drift_wizard_addDef_title = Add Drift Detection Definition for Resource of Type [{0}]
+view_drift_wizard_addDef_windowTitle = Drift Add Detection Definition Wizard
view_dynagroup_children = DynaGroup Children
view_dynagroup_compatible = Compatible
view_dynagroup_definitionAlreadyExists = A group definition already exists with this name
@@ -1404,7 +1370,6 @@ view_inventory_groups_deleteFailed = Failed to delete the selected resource grou
view_inventory_groups_deleteSuccessful = You have successfully deleted the selected resource groups
view_inventory_groups_descendants = Descendants
view_inventory_groups_loadFailed = Failed to load group composite data
-view_inventory_groups_resourceGroups = Resource Groups
view_inventory_mixed = mixed
view_inventory_platforms = Platforms
view_inventory_problemGroups = Problem Groups
@@ -1413,9 +1378,7 @@ view_inventory_resources_deleteConfirm = Are you sure you want to delete the sel
view_inventory_resources_deleteFailed = Failed to delete the selected resources
view_inventory_resources_deleteSuccessful = A request to perform the resource deletion has been submitted successfully to the agent(s).
view_inventory_resources_loadFailed = Failed to load resource composite data
-view_inventory_resources_title = Resources
-view_inventory_resources_title_children = Child Resources
-view_inventory_resources_title_members = Member Resources
+view_inventory_resources_members = Member Resources
view_inventory_resources_uninventoryConfirm = Are you sure you want to uninventory the selected resources? Note that if a selected resource still exists, then it will get rediscovered during its agent''s next discovery scan.
view_inventory_resources_uninventoryFailed = Failed to uninventory the selected resources
view_inventory_resources_uninventorySuccessful = You have successfully uninventoried the selected resources
@@ -1442,7 +1405,6 @@ view_login_prompt = Please Login
view_login_registerLater = (Cancel - Complete registration later.)
view_login_registerLdapSuccess = Successfully registered the new LDAP User.
view_login_registerUser = Register User
-view_login_welcome = Welcome
view_login_welcomeMsg = Welcome to RHQ! <br/><br/> Enter/update the following fields to complete your registration process.<br/> Once you click "OK", you will be logged in.<br/><br/>
view_measureRange_last = Time Range - Previous
view_measureRange_simple = Simple...
@@ -1512,7 +1474,6 @@ view_portlet_defaultName_operations = Recent Operations
view_portlet_defaultName_platformSummary = Platform Utilization
view_portlet_defaultName_problemResources = Alerted or Unavailable Resources
view_portlet_defaultName_recentAlerts = Recent Alerts
-view_portlet_defaultName_recentDrifts = Recent Drifts
view_portlet_defaultName_recentlyAddedResources = Recently Added Resources
view_portlet_defaultName_resourceMetric = Resource Metric Graph
view_portlet_defaultName_resource_alerts = Resource: Alerts
@@ -1523,7 +1484,6 @@ view_portlet_defaultName_resource_metrics = Resource: Measurements
view_portlet_defaultName_resource_oobs = Resource: OOB Metrics
view_portlet_defaultName_resource_operations = Resource: Operations
view_portlet_defaultName_resource_pkg_hisory = Resource: Package History
-view_portlet_defaultName_tagCloud = Tag Cloud
view_portlet_factory_invalidPortlet = This is an obsolete portlet that is no longer valid. Please delete it.
view_portlet_graph_configure_metricDefinition_graph = The metric definition id to graph
view_portlet_graph_configure_resource_graph = The resource to graph
@@ -1638,7 +1598,6 @@ view_resource_monitor_calltime_lookupFailed = Could not load resource for call t
view_resource_monitor_calltime_maximum = Maximum
view_resource_monitor_calltime_minimum = Minimum
view_resource_monitor_calltime_title = Call Time Data
-view_resource_monitor_calltime_total = Total
view_resource_monitor_detailed_graph_label = Detailed Graph
view_resource_monitor_graph_instructions = Point your mouse to a data point on the chart
view_resource_monitor_graph_live_tooltip = Click for a live graph of current values
@@ -1646,7 +1605,6 @@ view_resource_monitor_graphs_loadFailed = Failed to load graph data
view_resource_monitor_graphs_lookupFailed = Failed to find resource for graph
view_resource_monitor_graphs_noneAvailable = No graphs available
view_resource_monitor_schedules_title = Resource Metric Collection Schedules
-view_resource_monitor_table_alerts = Alerts
view_resource_monitor_table_avg = Average
view_resource_monitor_table_last = Last
view_resource_monitor_table_max = Maximum
@@ -1680,7 +1638,6 @@ view_summaryOverviewForm_field_type = Type
view_summaryOverviewForm_field_version = Version
view_summaryOverviewForm_header_summary = Summary
view_summaryOverviewForm_label_plugin = Plugin:
-view_summaryOverviewForm_label_type = Type:
view_summaryOverviewForm_message_descriptionChangeSuccess = Description of Resource with id {0} was changed from [{1}] to [{2}].
view_summaryOverviewForm_message_locationChangeSuccess = Location of Resource with id {0} was changed from [{1}] to [{2}].
view_summaryOverviewForm_message_nameChangeSuccess = Name of Resource with id {0} was changed from [{1}] to [{2}].
@@ -1696,18 +1653,15 @@ view_table_totalRows = Total Rows: {0} (selected: {1})
view_table_totalRowsUnknown = Total Rows: ?
view_tabs_common_activity = Activity
view_tabs_common_agent = Agent
-view_tabs_common_alerts = Alerts
view_tabs_common_availability = Availability
view_tabs_common_calltime = Calltime
view_tabs_common_child_history = Child History
view_tabs_common_child_resources = Child Resources
-view_tabs_common_configuration = Configuration
view_tabs_common_connectionSettings = Connection Settings
view_tabs_common_connectionSettingsHistory = Connection Settings History
view_tabs_common_content = Content
view_tabs_common_current = Current
view_tabs_common_dashboard = Dashboard
-view_tabs_common_definitions = Definitions
view_tabs_common_deployed = Deployed
view_tabs_common_drift = Drift
view_tabs_common_events = Events
@@ -1719,13 +1673,10 @@ view_tabs_common_history = History
view_tabs_common_inventory = Inventory
view_tabs_common_members = Members
view_tabs_common_monitoring = Monitoring
-view_tabs_common_new = New
-view_tabs_common_operations = Operations
view_tabs_common_overview = Overview
view_tabs_common_schedule = Schedule
view_tabs_common_schedules = Schedules
view_tabs_common_subscriptions = Subscriptions
-view_tabs_common_summary = Summary
view_tabs_common_tables = Tables
view_tabs_common_timeline = Timeline
view_tabs_common_traits = Traits
@@ -1736,8 +1687,7 @@ view_tagCloud_deleteTagFailure = Failed to delete the tag [{0}]
view_tagCloud_deleteTagSuccess = You successfully deleted the tag [{0}]
view_tagCloud_error_fetchFailure = Failed to load tags.
view_tagCloud_error_tagUsedCount = Tag used {0} times.
-view_tagCloud_title = Tag Cloud
-view_taggedResources_title = Resources
+view_taggedResources_title = Tagged Resources
view_tags_error_1 = Failed to load Tags
view_tags_tags = Tags
view_tags_tooltip_1 = Click to remove this Tag
@@ -1766,9 +1716,8 @@ view_tree_common_contextMenu_loadFail_dashboards = Failed to load user dashboard
view_tree_common_contextMenu_loadFail_group = Failed to load group for context menu
view_tree_common_contextMenu_loadFailed_dashboard = Failed to load user dashboards
view_tree_common_contextMenu_loadFailed_manualAddChildren = Failed to load platform manual add children
+view_tree_common_contextMenu_loadFailed_operations = Failure to start wizard for running operations
view_tree_common_contextMenu_measurements = Measurements
-view_tree_common_contextMenu_operations = Operations
-view_tree_common_contextMenu_operations_loadFailed = Failure to start wizard for running operations
view_tree_common_contextMenu_resourceConfiguration = Resource Configuration
view_tree_common_contextMenu_resourceGraph = Resource Metric Graph
view_tree_common_contextMenu_saveChartToDashboardFailure = Failed to save the dashboard
@@ -1846,7 +1795,6 @@ widget_recordEditor_info_recordUpdatedConcise = {0} updated.
widget_recordEditor_info_recordUpdatedDetailed = {0} [{1}] updated.
widget_recordEditor_info_recordsDeletedConcise = {0} {1} deleted.
widget_recordEditor_info_recordsDeletedDetailed = {0} {1} deleted: {2}.
-widget_recordEditor_label_loading = Loading...
widget_recordEditor_title_edit = Edit {0} [{1}]
widget_recordEditor_title_new = Create New {0}
widget_recordEditor_title_view = View {0} [{1}]
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
index a396be5..2c84b0b 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
@@ -53,30 +53,27 @@ common_calendar_may_short = Mai
common_calendar_november_short = Nov
common_calendar_october_short = Okt
common_calendar_september_short = Sept
+##common_label_ago = ago
common_label_all = ALLE
common_label_all_resources = Alle Ressourcen
common_label_day = Tag
-common_label_days = Tage
common_label_hour = Stunde
-common_label_hours = Stunden
common_label_item = Eintrag
common_label_items = EintrÀge
-common_label_milliseconds = Millisekunden
-common_label_minutes = Minuten
common_label_month = Monat
common_label_none = keine
common_label_role = Rolle
common_label_roles = Rollen
common_label_scheduled_operations = Geplante Operationen
-common_label_seconds = Sekunden
common_label_selected_resources = AusgewÀhlte Ressourcen
common_label_unlimited = unbeschrÀnkt
common_label_user = Benutzer
common_label_users = Benutzer
common_label_week = Woche
-common_label_weeks = Wochen
common_label_yesterday = Gestern
common_msg_areYouSure = Sind Sie sicher?
+##common_msg_asyncTimeout = {0}. This occurred because the server is taking a long time to complete this request. Please be aware that the server may still be processing your request and it may complete shortly. You can check the server logs to see if any abnormal errors occurred.
+##common_msg_changeAutoDetected = Change auto-detected
common_msg_deleteConfirm = Are you sure you want to delete the # selected {0}?~
common_msg_emphasizedNotePrefix = Achtung:
common_msg_loading = Laden...
@@ -84,6 +81,11 @@ common_msg_noItemsToShow = Keine EintrÀge vorhanden
common_msg_notYetImplemented = Noch nicht implementiert
common_msg_see_more = mehr ...
common_msg_step_x_of_y = Schritt {0} von {1}
+##common_severity_debug = Debug
+common_severity_error = Fehler
+##common_severity_fatal = Fatal
+##common_severity_info = Info
+##common_severity_warn = Warn
common_status_canceled = Abgebrochen
common_status_deferred = Verzögert
common_status_failed = Fehlgeschlagen
@@ -95,7 +97,8 @@ common_status_unknown = Unbekannt
common_title_add_column = Spalte hinzufÃŒgen
common_title_add_portlet = Portlet hinzufÃŒgen
common_title_address = Adresse
-common_title_alert_range = Alert Range~
+common_title_alerts = Alarme
+common_title_alerts_range = Alert Range~
common_title_availability = VerfÃŒgbar
common_title_available_resources = VerfÃŒgbare Ressourcen
common_title_average_metrics = Durchsch. Anzahl Metriken pro Minute
@@ -117,6 +120,8 @@ common_title_dashboard_name = Dashboard-Name
common_title_dateCreated = Zeitpunkt d. Erzeugung
common_title_dateRange = Zeitraum
common_title_default = Standard
+##common_title_definition = Definition
+common_title_definitions = Definitionen
common_title_description = Beschreibung
common_title_details = Details
common_title_display = Display~
@@ -125,7 +130,6 @@ common_title_duration = Dauer
common_title_edit_mode = Bearbeitungsmodus
common_title_enabled = Aktiviert?
common_title_end = Ende
-common_title_error = Fehler
common_title_generalProp = Allgemeine Eigenschaften
common_title_group = Gruppe
common_title_group_def_total = Anzahl Gruppen-Definitionen
@@ -136,7 +140,6 @@ common_title_host = Rechner
common_title_icon = Ikone
common_title_id = ID
common_title_id_parent = ID des Vaters
-common_title_info = Info
##common_title_interval = Interval
common_title_inventory = Inventar
common_title_inventorySummary = Inventar Zusammenfassung
@@ -154,29 +157,31 @@ common_title_name = Name
common_title_new_dashboard = Neues Dashboard
common_title_numeric_metrics = Numerische Metriken
common_title_numeric_type = Numerischer Typ
-common_title_operation_status = Status der Operation
+common_title_operation = Operation
+common_title_operation_status = Zustand der Operation
common_title_operations = Operationen
-common_title_operations_range = Operation Range~
+##common_title_operations_range = Operation Range
common_title_over = Ãber
common_title_password = Passwort
common_title_path = Pfad
common_title_permissions = Rechte
common_title_platform = Plattform
common_title_platform_total = Anzahl Platformen
-common_title_plugin = Plugin
-common_title_port = Port
-common_title_providers = Provider
+##common_title_plugin = Plugin
+##common_title_port = Port
+##common_title_providers = Providers
common_title_recent_alerts = KÌrzlich ausgelöste Alarme
common_title_recent_bundle_deployments = KÃŒrzliche Bundle-Deployments
common_title_recent_configuration_updates = Frische Konfigurationsaktualisierungen
-##common_title_recent_drifts = Recent Drifts
+##common_title_recent_drifts = Recent Drift
common_title_recent_event_counts = Anzahl frischer Events
common_title_recent_measurements = Frische Messwerte
common_title_recent_oob_metrics = KÃŒrzlich aus dem Ruder gelaufene Metriken
common_title_recent_operations = KÃŒrzlich ausgefÃŒhrte Operationen
+##common_title_recent_pkg_history = Recent Package History
common_title_recently_added = KÃŒrzlich hinzugefÃŒgte Ressourcen
common_title_remove_column = Spalte löschen
-common_title_repositories = Repositories~
+##common_title_repositories = Repositories
common_title_resource = Ressource
common_title_resourceGroups = Ressourcen-Gruppen
common_title_resource_group = Ressourcen-Gruppe
@@ -209,7 +214,7 @@ common_title_summary = Zusammenfassung
common_title_tag_cloud = Tag-Wolke
common_title_the = Die
common_title_timestamp = Zeitpunkt
-common_title_total = Total
+common_title_total = Gesamt
common_title_type = Typ
common_title_units = Einheiten
common_title_user = Benutzer
@@ -271,14 +276,12 @@ dataSource_platforms_field_cpu = CPU
dataSource_platforms_field_memory = Speicher
dataSource_platforms_field_swap = Swap
dataSource_problemResources_error_fetchFailure = Konnte die Liste der Ressourcen mit Alarmen oder unverfÃŒgbarkeit nicht laden.
-dataSource_problemResources_field_alerts = Alarme
dataSource_problemResources_field_available = Aktuelle VerfÃŒgbarkeit
dataSource_recentOperations_error_fetchFailure = Konnte die Liste der kÃŒrzlich vollendeten Operationen nicht laden.
dataSource_recentOperations_field_location = Ort
dataSource_recentOperations_field_operation = Operation
dataSource_recentOperations_field_resource = Ressource
dataSource_recentOperations_field_status = Status
-dataSource_recentOperations_field_time = Zeitpunkt
dataSource_resourceErrors_clickStatusIcon = FÃŒr mehr Details auf das Icon klicken
dataSource_resourceErrors_deleteFailure = Konnte die Ressourcen-Fehler nicht löschen
dataSource_resourceErrors_deleteSuccess = Sie haben erfolgreich [{0}] Ressourcen-Fehlermeldungen gelöscht.
@@ -296,7 +299,6 @@ dataSource_scheduledOperations_error_fetchFailure = Konnte die Liste der geplant
dataSource_scheduledOperations_field_location = Ort
dataSource_scheduledOperations_field_operation = Operation
dataSource_scheduledOperations_field_resource = Ressource
-dataSource_scheduledOperations_field_time = Zeitpunkt
dataSource_schedules_disableFailure_group = Failed to disable the collection of [{0}] metrics for resource group with ID [{1}]. The metrics were: [{2}]~
dataSource_schedules_disableFailure_resource = Failed to disable the collection of [{0}] metrics for resource with ID [{1}]. The metrics were: [{2}]~
dataSource_schedules_disableSuccessful_concise = You have disabled the collection of [{0}] measurements~
@@ -332,7 +334,6 @@ dataSource_users_field_id = ID
dataSource_users_field_lastName = Nachname
dataSource_users_field_ldap = LDAP Login?
dataSource_users_field_name = Benutzername
-dataSource_users_field_password = Passwort
dataSource_users_field_passwordVerify = Passwort ÃŒberprÃŒfen
dataSource_users_field_phoneNumber = Telefonnummer
dataSource_users_invalidEmailAddress = UngÃŒltige E-Mail-Adresse
@@ -381,7 +382,6 @@ view_adminRoles_failRoles = Konnte die Rollen nicht laden.
view_adminRoles_globalPerms = Applikationsweite Rechte
view_adminRoles_ldapGroups = LDAP-Gruppen
view_adminRoles_ldapGroupsReadOnly = LDAP Gruppendaten können nur gelesen werden
-view_adminRoles_noItems = Keine EintrÀge vorhanden
view_adminRoles_noLdap = Die LDAP-Integration ist nicht konfiguriert. Um LDAP zu konfigurieren, wechseln sie zu <a {0}>{1}</a>.
view_adminRoles_permissions_globalPermissions = Globale Rechte
view_adminRoles_permissions_isAuthorized = Berechtigt?
@@ -398,7 +398,7 @@ view_adminRoles_permissions_permReadDesc_deleteChildResources = (IMPLIZIT) Ansic
view_adminRoles_permissions_permReadDesc_inventory = (IMPLIZIT) Ansehen der Eigenschaft einer Ressource (Name, Beschreibung, Version etc.), Verbindungseinstellungen, Verlauf derselben
view_adminRoles_permissions_permReadDesc_manageAlerts = (IMPLIZIT) Ansehen von Alarm-Definitionen und ausgelösten Alarmen
view_adminRoles_permissions_permReadDesc_manageContent = (IMPLIZIT) Installierte und verfÃŒgbare Pakete ansehen; Verlauf der Installation von Paketen ansehen
-##view_adminRoles_permissions_permReadDesc_manageDrift = (IMPLIED) view drift configurations and drift history
+##view_adminRoles_permissions_permReadDesc_manageDrift = (IMPLIED) view drift definitions and drift history
view_adminRoles_permissions_permReadDesc_manageEvents = (IMPLIZIT) Ereignisse ansehen
view_adminRoles_permissions_permReadDesc_manageMeasurements = (IMPLIZIT) Monitoringdaten und -zeitplan ansehen
view_adminRoles_permissions_permWriteDesc_configure = Bearbeiten der Ressourcen-Konfiguration; Löschen einzelner EintrÀge im Verlauf der Ressourcen-Konfiguration
@@ -408,7 +408,7 @@ view_adminRoles_permissions_permWriteDesc_deleteChildResources = Löschen von Ki
view_adminRoles_permissions_permWriteDesc_inventory = Aktualisieren von Ressourcename, Beschreibung und Verbindungseinstellungen. Löschen einzelner EintrÀge des Verlaufs der Verbindungseinstellungen.
view_adminRoles_permissions_permWriteDesc_manageAlerts = Anlegen, Bearbeiten und Löschen von Alarm-Definitionen. BestÀtigen und Löschen von ausgelösten Alarmen.
view_adminRoles_permissions_permWriteDesc_manageContent = Abonnieren von Content-Quellen; Pakete installieren und deinstallieren
-##view_adminRoles_permissions_permWriteDesc_manageDrift = create, update, and delete alert definitions; acknowledge and delete alert history items
+##view_adminRoles_permissions_permWriteDesc_manageDrift = create, update, and delete drift definitions; and manage drift instances
view_adminRoles_permissions_permWriteDesc_manageEvents = Ereignisse löschen
view_adminRoles_permissions_permWriteDesc_manageMeasurements = Zeitplan fÃŒr das Monitoring bearbeiten
view_adminRoles_permissions_perm_configure = Konfiguration
@@ -429,15 +429,12 @@ view_adminRoles_permissions_read = Lesen
view_adminRoles_permissions_readAccessImplied = Lesezugriff fÃŒr das Recht {0} ist implizit und kann nicht abgeschaltet werden.
view_adminRoles_permissions_resourcePermissions = Rechte fÃŒr Ressourcen
view_adminRoles_permissions_write = Schreiben:
-view_adminRoles_perms = Rechte
view_adminRoles_resourcePerms = Rechte auf Ressourcen
view_adminRoles_roleAdded = Rolle [{0}] hinzugefÃŒgt
view_adminRoles_roleDeleteFailed = Konnte die Rolle [{0}] nicht löschen.
view_adminRoles_roleDeleted = Rolle [{0}] gelöscht.
view_adminRoles_roleUpdateFailed = Konnte die Rolle [{0}] nicht aktualisieren.
view_adminRoles_roleUpdated = Rolle [{0}] aktualisiert.
-view_adminSecurity_roles = Rollen
-view_adminSecurity_users = Benutzer
view_adminTemplates_platforms = Platformen
view_adminTemplates_servers = Server
view_adminTopology_affinityGroups = Affinity Groups~
@@ -446,8 +443,6 @@ view_adminTopology_partitionEvents = Partition Events~
view_adminTopology_remoteAgentInstall = Installation entfernter Agenten
view_adminTopology_servers = Server
view_adminUsersDetails_dataTypeName = Benutzer
-view_adminUsersList_dataTypeName = Benutzer
-view_adminUsersList_dataTypeNamePlural = Benutzer
view_admin_administration = Verwaltung
view_admin_configuration = Konfiguration
view_admin_content = Inhalte
@@ -464,6 +459,7 @@ view_admin_systemSettings_AlertPurge_name = Lösche Alarme, die Àlter sind als
view_admin_systemSettings_AvailabilityPurge_name = Lösche VerfÌgbarkeitsdaten, die Àlter sind als
##view_admin_systemSettings_DriftFilePurge_desc = How old unused and orphaned drift files must be before being purged from backend storage. This is specified in days.
##view_admin_systemSettings_DriftFilePurge_name = Delete Unused Drift Files Older Than
+view_admin_systemSettings_LDAPBindPW_name = Passwort
view_admin_systemSettings_TraitPurge_name = Lösche Trait-Daten, die Àlter sind als
##view_admin_systemSettings_group_drift = Drift Server Configuration Settings
view_admin_systemSettings_saveFailure = Das Speichern der Systemeinstellungen ist fehlgeschlagen
@@ -490,8 +486,8 @@ view_alert_common_tab_conditions_type_availability = Ãnderung der VerfÃŒgbarkei
view_alert_common_tab_conditions_type_availability_down = Wurde unverfÃŒgbar
view_alert_common_tab_conditions_type_availability_up = Wurde wieder verfÃŒgbar
##view_alert_common_tab_conditions_type_drift = Drift Detection
-##view_alert_common_tab_conditions_type_drift_configpaths = Drift Detection for files that match "{0}" and for drift configuration [{1}]
-##view_alert_common_tab_conditions_type_drift_onlyconfig = Drift Detection for drift configuration [{0}]
+##view_alert_common_tab_conditions_type_drift_configpaths = Drift Detection for files that match "{0}" and for drift definition [{1}]
+##view_alert_common_tab_conditions_type_drift_onlyconfig = Drift Detection for drift definition [{0}]
##view_alert_common_tab_conditions_type_drift_onlypaths = Drift Detection for files that match "{0}"
##view_alert_common_tab_conditions_type_event = Event Detection
view_alert_common_tab_conditions_type_event_matching = with event source matching~
@@ -514,7 +510,6 @@ view_alert_common_tab_conditions_type_metric_trait_change = Trait-Ãnderung
view_alert_common_tab_conditions_type_operation = AusfÃŒhrung der Operation
view_alert_common_tab_conditions_type_operation_status = mit Ergebnis-Status
view_alert_common_tab_conditions_type_resource_configuration = Resource Configuration Change~
-view_alert_common_tab_conditions_value = Wert
view_alert_common_tab_dampening = DÀmpfung
view_alert_common_tab_dampening_category_consecutive_count = Aufeinanderfolgend
view_alert_common_tab_dampening_category_consecutive_count_tooltip = Ein Alarm wird ausgelöst, wenn bei X aufeinanderfolgenden Werten die Bedingungen zutreffen.
@@ -551,19 +546,14 @@ view_alert_definition_condition_editor_common_avg = Durchschnitt
view_alert_definition_condition_editor_common_max = Maximum
view_alert_definition_condition_editor_common_min = Minimum
view_alert_definition_condition_editor_delete_confirm = Die ausgewÀhlte(n) Alarm-Bedingung(en) löschen?
-##view_alert_definition_condition_editor_drift_configname_regex = Drift Configuration Name
-##view_alert_definition_condition_editor_drift_configname_regex_tooltip = If specified, this is the drift configuration name that was responsible for the drift that was detected. This can optionally be a regular expression if you wish to match multiple drift configuration names.
+##view_alert_definition_condition_editor_drift_configname_regex = Drift Definition Name
+##view_alert_definition_condition_editor_drift_configname_regex_tooltip = If specified, this is the drift definition name that was responsible for the drift that was detected. This can optionally be a regular expression if you wish to match multiple drift definition names.
##view_alert_definition_condition_editor_drift_pathname_regex = Pathname Regular Expression
##view_alert_definition_condition_editor_drift_pathname_regex_tooltip = If specified, this is a regular expression that must match the pathnames of those files that drifted.
##view_alert_definition_condition_editor_drift_tooltip = This condition is triggered when drift has been detected.
view_alert_definition_condition_editor_event_regex = RegulÀrer Ausdruck
view_alert_definition_condition_editor_event_regex_tooltip = If specified, this is a regular expression that must match a collected event message in order to trigger the condition.~
view_alert_definition_condition_editor_event_severity = Schwere des Ereignisses
-view_alert_definition_condition_editor_event_severity_debug = Debug
-view_alert_definition_condition_editor_event_severity_error = Error
-view_alert_definition_condition_editor_event_severity_fatal = Fatal
-view_alert_definition_condition_editor_event_severity_info = Info
-view_alert_definition_condition_editor_event_severity_warn = Warn
view_alert_definition_condition_editor_event_tooltip = Specify the event severity that an event message must be reported with in order to trigger this condition. If you specify an optional regular expression, the event message must also match that regular expression in order for the condition to trigger.~
view_alert_definition_condition_editor_metric_baseline_percentage = Baseline Percentage~
view_alert_definition_condition_editor_metric_baseline_percentage_tooltip = A collected metric value will trigger this condition when compared to this percentage of the selected baseline value using the selected comparator~
@@ -612,12 +602,7 @@ view_alert_definition_condition_editor_metric_trait_change_tooltip = Specify the
view_alert_definition_condition_editor_metric_trait_change_value = Trait~
##view_alert_definition_condition_editor_metricswarning = You cannot have multiple conditions that use the same metric when using the ALL conjunction. This alert definition has multiple conditions that use the metric [{0}].
view_alert_definition_condition_editor_operation_status = Zustand der Operation
-view_alert_definition_condition_editor_operation_status_canceled = Abgebrochen
-view_alert_definition_condition_editor_operation_status_failure = Fehler
-view_alert_definition_condition_editor_operation_status_inprogress = In AusfÃŒhrung
-view_alert_definition_condition_editor_operation_status_success = Erfolg
view_alert_definition_condition_editor_operation_tooltip = Specify the result that must occur when the selected operation is executed in order to trigger the condition.~
-view_alert_definition_condition_editor_operation_value = Operation
view_alert_definition_condition_editor_option_availability = Ãnderung der VerfÃŒgbarkeit
##view_alert_definition_condition_editor_option_drift = Drift Detection
##view_alert_definition_condition_editor_option_event = Event Detection
@@ -740,20 +725,15 @@ view_autoDiscoveryQ_confirmSelect = Sollen auch die Kinder der Platform ausgewÀ
view_autoDiscoveryQ_deleted = Gelöscht
view_autoDiscoveryQ_field_discoveryTime = Zeitpunkt des Auffindens
view_autoDiscoveryQ_field_inventoryStatus = Inventar-Status
-view_autoDiscoveryQ_field_key = Ressourcen-SchlÃŒssel
-view_autoDiscoveryQ_field_name = Ressourcen-Name
view_autoDiscoveryQ_field_parentId = Eltern-ID
view_autoDiscoveryQ_ignore = Ignorieren
view_autoDiscoveryQ_ignoreFailure = Konnte die Ressourcen nicht ignorieren
view_autoDiscoveryQ_ignoreSuccessful = Sie haben die ausgewÀhlten Ressourcen erfolgreich ignoriert
view_autoDiscoveryQ_ignored = Ignoriert
-view_autoDiscoveryQ_import = Importieren
view_autoDiscoveryQ_importFailure = Konnte die Ressourcen nicht importieren
view_autoDiscoveryQ_importSuccessful = Sie haben die ausgewÀhlten Ressourcen erfolgreich importiert
view_autoDiscoveryQ_loadFailure = Failed to load the inventory discovery queue~
-view_autoDiscoveryQ_new = Neu
view_autoDiscoveryQ_newAndIgnored = Neu und Ignoriert
-view_autoDiscoveryQ_noItems = Keine EintrÀge gefunden
view_autoDiscoveryQ_noperm = (Die erforderlichen "manage inventory" Rechte fehlen. Kontaktieren Sie den Administrator)
view_autoDiscoveryQ_showStatus = Zeige
view_autoDiscoveryQ_title = Autodiscovery-Warteschlange
@@ -886,6 +866,7 @@ view_bundle_list_singleLoadFailure = Failed to get a single bundle to be deploye
view_bundle_list_tagUpdateFailure = Failed to update bundle tags~
view_bundle_list_tagUpdateSuccessful = You have successfully updated the bundle tags~
view_bundle_list_versionsCount = Versions Count~
+##view_bundle_purge = Purge
view_bundle_recipe = Recipe~
view_bundle_resDeployDS_loadFailure = Failed to load bundle resource deployments~
view_bundle_revert = Revert~
@@ -967,41 +948,40 @@ view_dashboardsManager_error1 = Failed to add new dashboard~
view_dashboardsManager_message_title_details = <h1>Willkommen bei RHQ</h1>\n<p>Das RHQ-Projekt is an abstraction and plug-in based systems management suite that provides extensible and integrated systems management for multiple products and platforms across a set of core features. The project is designed with layered modules that provide a flexible architecture for deployment. It delivers a core user interface that delivers audited and historical management across an entire enterprise. A Server/Agent architecture provides remote management and plugins implement all specific support for managed products.</p>\n <p>This default dashboard can be edited by clicking the (edit mode) button above.</p>~
view_dashboards_confirm1 = Sind Sie sicher, dass Sie löschen möchten
view_dashboards_title = Dashboard
-##view_drift = Drift
##view_drift_button_detectNow = Detect Now
##view_drift_category_fileAdded = File Added
##view_drift_category_fileChanged = File Changed
-##view_drift_category_fileNew = New Detection
+##view_drift_category_fileNew = Newly Detected
##view_drift_category_fileRemoved = File Removed
-##view_drift_changeSets = Change Sets
-##view_drift_changeSets_resourceViewTitle = Resource Drift Change Sets
-##view_drift_changeset_tree_loadConfigFailure = Failed to load drift configuration for change set id [{0}]
-##view_drift_changeset_tree_loadFailure = Failed to load drift change set tree.
-##view_drift_delete_configConfirm = Delete the selected drift configuration(s)?
-##view_drift_delete_configConfirmAll = Delete all drift configurations?
-##view_drift_failure_deleteConfigs = Failed to delete some or all drift configurations.
-##view_drift_failure_detectNow = Failed to submit drift detection request
-##view_drift_failure_load = Failed to fetch drift data
-##view_drift_success_configurationUpdated = Drift configuration updated. File coverage will be updated on next detection scan.
-##view_drift_success_delete = Successfully deleted {0} drifts
-##view_drift_success_deleteConfigs = Successfully deleted {0} drift configurations
-##view_drift_success_detectNow = Successfully submitted drift detection request
+##view_drift_delete_configConfirm = Delete the selected drift detection definition(s)?
+##view_drift_delete_configConfirmAll = Delete all drift detection definition?
+##view_drift_failure_deleteDefs = Failed to delete some or all drift detection definitions.
+##view_drift_failure_detectNow = Failed to submit drift detection run request
+##view_drift_failure_load = Failed to fetch drift instances
+##view_drift_snapshots = Snapshots
+##view_drift_snapshots_resourceViewTitle = Resource Drift Snapshots
+##view_drift_snapshots_tree_loadDefFailure = Failed to load drift detection definition for snapshot id [{0}]
+##view_drift_snapshots_tree_loadFailure = Failed to load drift snapshot tree.
+##view_drift_success_defUpdated = Drift detection definition updated and will affect the next detection run as applicable.
+##view_drift_success_delete = Successfully deleted {0} drift instances
+##view_drift_success_deleteConfigs = Successfully deleted {0} drift detection definitions
+##view_drift_success_detectNow = Successfully submitted drift detection run request
##view_drift_table_baseDir = Base Directory
-##view_drift_table_changeSet = Change Set
##view_drift_table_driftHandlingMode = Drift Handling
##view_drift_table_driftHandlingMode_normal = normal
##view_drift_table_driftHandlingMode_plannedChanges = planned changes
##view_drift_table_newFile = New File
##view_drift_table_oldFile = Old File
-##view_drift_table_resourceConfig = Resource Drift Configuration
+##view_drift_table_resourceDef = Resource Drift Detection Definition
##view_drift_table_resourceHistory = Resource Drift History
-##view_drift_wizard_addConfig_failure = Failed to add new drift configuration [{0}]
-##view_drift_wizard_addConfig_infoStepName = Provide Drift Detection Information
-##view_drift_wizard_addConfig_success = Successfully added new drift configuration [{0}]. Agent(s) will be updated.
-##view_drift_wizard_addConfig_templateHelp = Each drift configuration describes a set of files for which drift detection can be performed. The configuration can be enabled and disabled, defines the detection interval, and specifies a base directory and optional file filters. For each resource type offering drift detection there will be one or more predefined templates to use a starting configuration, which can then be edited.
-##view_drift_wizard_addConfig_templatePrompt = Drift Configuration Templates
-##view_drift_wizard_addConfig_title = Add Drift Configuration for Resource of Type [{0}]
-##view_drift_wizard_addConfig_windowTitle = Drift Add Configuration Wizard
+##view_drift_table_snapshot = Snapshot
+##view_drift_wizard_addDef_failure = Failed to add new drift detection definition [{0}]
+##view_drift_wizard_addDef_infoStepName = Provide Drift Detection Information
+##view_drift_wizard_addDef_success = Successfully added new drift detection definition [{0}]. Agent(s) will be updated.
+##view_drift_wizard_addDef_templateHelp = Each drift detection definition describes a set of files for which drift monitoring will be performed. The definition can be enabled and disabled, defines the detection run interval, and specifies a base directory and optional file filters. For each resource type offering drift detection there will be one or more predefined templates to use as a starting definition, which can then be edited.
+##view_drift_wizard_addDef_templatePrompt = Drift Detection Definition Templates
+##view_drift_wizard_addDef_title = Add Drift Detection Definition for Resource of Type [{0}]
+##view_drift_wizard_addDef_windowTitle = Drift Add Detection Definition Wizard
view_dynagroup_children = DynaGroup Children~
view_dynagroup_compatible = Kompatible
view_dynagroup_definitionAlreadyExists = A group definition already exists with this name~
@@ -1133,7 +1113,6 @@ view_inventory_groups_deleteFailed = Failed to delete the selected resource grou
view_inventory_groups_deleteSuccessful = You have successfully deleted the selected resource groups~
view_inventory_groups_descendants = Descendants~
view_inventory_groups_loadFailed = Failed to load group composite data~
-view_inventory_groups_resourceGroups = Ressource-Gruppen
view_inventory_mixed = gemischt
view_inventory_platforms = Platformen
view_inventory_problemGroups = Gruppen mit Problemen
@@ -1142,9 +1121,7 @@ view_inventory_resources_deleteConfirm = Are you sure you want to delete the sel
view_inventory_resources_deleteFailed = Failed to delete the selected resources~
##view_inventory_resources_deleteSuccessful = A request to perform the resource deletion has been submitted successfully to the agent(s).
view_inventory_resources_loadFailed = Failed to load resource composite data~
-view_inventory_resources_title = Ressourcen
-view_inventory_resources_title_children = Child Resources~
-view_inventory_resources_title_members = Member Resources~
+##view_inventory_resources_members = Member Resources
view_inventory_sectionHelp = In diesem Abschnitt können neu gefundene Ressourcen, sowie Ressourcen und Gruppen im Inventar angesehen und verwaltet werden.
view_inventory_servers = Server
view_inventory_services = Dienste
@@ -1168,7 +1145,6 @@ view_login_prompt = Bitte loggen Sie sich ein
view_login_registerLater = (Logout - Complete registration later.)~
view_login_registerLdapSuccess = Succesfully registered the new LDAP User.~
view_login_registerUser = Benutzer Anlegen
-view_login_welcome = Willkommen
view_login_welcomeMsg = Willkommen bei JBoss ON! <br/><br/> Enter/update the following fields to complete your registration process.<br/> Once you click "OK" you will be logged in.<br/><br/>~
view_measureRange_last = Letzte
view_measureRange_simple = Einfach...
@@ -1257,7 +1233,6 @@ view_operationScheduleDetails_noParameters = Diese Operation benötigt keine Par
view_portlet_autodiscovery_config_platform_selection = Number of platforms to display~
view_portlet_autodiscovery_help_msg = This portlet offers the ability to import newly discovered resources into the inventory for monitoring and management or to ignore them from further action.~
view_portlet_autodiscovery_title = Discovery-Warteschlange
-##view_portlet_defaultName_recentDrifts = Recent Drifts
view_portlet_favoriteResources_msg = Dieses Potlet zeigt Ihre gemerkten Ressourcen
view_portlet_favoriteResources_title = Gemerkete Resourcen
view_portlet_generic_help = FÃŒr dieses Portlet liegt keine Hilfe vor
@@ -1364,7 +1339,6 @@ view_resource_monitor_calltime_lookupFailed = Could not load resource for call t
view_resource_monitor_calltime_maximum = Maximum
view_resource_monitor_calltime_minimum = Minimum
view_resource_monitor_calltime_title = Call Time Data~
-view_resource_monitor_calltime_total = Gesamt
view_resource_monitor_detailed_graph_label = Detailed Graph~
view_resource_monitor_graph_instructions = Point your mouse to a data point on the chart~
view_resource_monitor_graph_live_tooltip = Click for a live graph of current values~
@@ -1372,7 +1346,6 @@ view_resource_monitor_graphs_loadFailed = Failed to load graph data~
view_resource_monitor_graphs_lookupFailed = Failed to find resource for graph~
view_resource_monitor_graphs_noneAvailable = No graphs available~
view_resource_monitor_schedules_title = Resource Metric Collection Schedules~
-view_resource_monitor_table_alerts = Alarme
view_resource_monitor_table_avg = Durchschnitt
view_resource_monitor_table_last = Letzter
view_resource_monitor_table_max = Maximum
@@ -1406,7 +1379,6 @@ view_summaryOverviewForm_field_type = Typ
view_summaryOverviewForm_field_version = Version
view_summaryOverviewForm_header_summary = Zusammenfassung
view_summaryOverviewForm_label_plugin = Plugin:
-view_summaryOverviewForm_label_type = Typ:
view_summaryOverviewForm_message_descriptionChangeSuccess = "Description of Resource with id {0} was changed from [{1}] to [{2}].~
view_summaryOverviewForm_message_locationChangeSuccess = "Location of Resource with id {0} was changed from [{1}] to [{2}].~
view_summaryOverviewForm_message_nameChangeSuccess = "Name of Resource with id {0} was changed from [{1}] to [{2}].~
@@ -1421,18 +1393,15 @@ view_table_matchingRows = Zutreffende Zeilen: {0} (ausgewÀhlt: {1})
view_table_totalRows = Anzahl EintrÀge: {0} AusgewÀhlt: {1}
view_tabs_common_activity = AktivitÀt
view_tabs_common_agent = Agent
-view_tabs_common_alerts = Alarme
view_tabs_common_availability = VerfÃŒgbarkeit
view_tabs_common_calltime = Calltime~
view_tabs_common_child_history = Child History~
view_tabs_common_child_resources = Child Resources~
-view_tabs_common_configuration = Konfiguration
view_tabs_common_connectionSettings = Verbindungs-Einstellungen
view_tabs_common_connectionSettingsHistory = Verlauf der Verbindungs-E.
view_tabs_common_content = Inhalte
view_tabs_common_current = Aktuell
view_tabs_common_dashboard = Dashboard
-view_tabs_common_definitions = Definitionen
view_tabs_common_deployed = Installiert
##view_tabs_common_drift = Drift
view_tabs_common_events = Ereignisse
@@ -1444,14 +1413,11 @@ view_tabs_common_history = Verlauf
view_tabs_common_inventory = Inventar
view_tabs_common_members = Mitglieder
view_tabs_common_monitoring = Monitoring
-view_tabs_common_new = Neu
-view_tabs_common_operations = Operationen
view_tabs_common_overview = Ãbersicht
view_tabs_common_schedule = Zeitplan
view_tabs_common_scheduled = Geplant
view_tabs_common_schedules = Zeitplan
view_tabs_common_subscriptions = Abonnements
-view_tabs_common_summary = Zusammenfassung
view_tabs_common_tables = Tabellen
view_tabs_common_timeline = Zeitstrahl
view_tabs_common_traits = Traits
@@ -1459,7 +1425,6 @@ view_tabs_invalidSubTab = Invalid subtab: {0}~
view_tabs_invalidTab = UngÃŒltiger Reiter: {0}
view_tagCloud_error_fetchFailure = Konnte die Tags nicht laden.
view_tagCloud_error_tagUsedCount = Tag {0} mal verwendet.
-view_tagCloud_title = Tag-Wolke
view_taggedResources_title = Markierte Ressourcen
view_tags_error_1 = Konnte die Tags nicht laden
view_tags_tags = Tags
@@ -1487,9 +1452,8 @@ view_tree_common_contextMenu_groupGraph = Group Metric Graph~
view_tree_common_contextMenu_loadFail_dashboards = Konnte die benutzerspezifischen Dashboards nicht laden
view_tree_common_contextMenu_loadFailed_dashboard = Failed to load user dashboards
view_tree_common_contextMenu_loadFailed_manualAddChildren = Failed to load platform manual add children~
+view_tree_common_contextMenu_loadFailed_operations = Failure to start wizard for running operations~
view_tree_common_contextMenu_measurements = Metriken
-view_tree_common_contextMenu_operations = Operations~
-view_tree_common_contextMenu_operations_loadFailed = Failure to start wizard for running operations~
view_tree_common_contextMenu_pluginConfiguration = Plugin-Konfiguration
view_tree_common_contextMenu_resourceConfiguration = Resource Configuration~
view_tree_common_contextMenu_resourceGraph = Resource Metric Graph~
@@ -1537,7 +1501,6 @@ widget_recordEditor_info_recordUpdatedConcise = {0} aktualisiert.
widget_recordEditor_info_recordUpdatedDetailed = {0} [{1}] aktualisiert.
widget_recordEditor_info_recordsDeletedConcise = {0} {1} gelöscht.
widget_recordEditor_info_recordsDeletedDetailed = {0} {1} gelöscht: {2}.
-widget_recordEditor_label_loading = Laden...
widget_recordEditor_title_edit = Bearbeiten {0} [{1}]
widget_recordEditor_title_new = Neue {0} anlegen
widget_recordEditor_title_view = Anzeigen {0} [{1}]
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
index 6f6bb97..0730e55 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
@@ -57,40 +57,35 @@ common_label_ago = å
common_label_all = ãã¹ãŠã®
common_label_all_resources = ãã¹ãŠã®ãªãœãŒã¹
common_label_day = æ¥
-common_label_days = æ¥
common_label_hour = æé
-common_label_hours = æé
common_label_item = é
ç®
common_label_items = é
ç®
-common_label_milliseconds = ããªç§
-common_label_minutes = å
common_label_month = æ
common_label_none = ãªã
common_label_role = ããŒã«
common_label_roles = ããŒã«
common_label_scheduled_operations = ã¹ã±ãžã¥ãŒã«ãããæäœ
-common_label_seconds = ç§
common_label_selected_resources = éžæããããªãœãŒã¹
common_label_unlimited = ç¡å¶é
common_label_user = ãŠãŒã¶ãŒ
common_label_users = ãŠãŒã¶ãŒ
common_label_week = é±
-common_label_weeks = é±
common_label_yesterday = æšæ¥
common_msg_areYouSure = ããããã§ãã?
+##common_msg_asyncTimeout = {0}. This occurred because the server is taking a long time to complete this request. Please be aware that the server may still be processing your request and it may complete shortly. You can check the server logs to see if any abnormal errors occurred.
common_msg_changeAutoDetected = å€æŽãèªåæ€åºãããŸãã
common_msg_deleteConfirm = ãåé€ããŠãããããã§ãã # selected {0}?
common_msg_emphasizedNotePrefix = 泚æ:
common_msg_loading = ããŒãäž...
common_msg_noItemsToShow = 衚瀺ããé
ç®ã¯ãããŸãã
-common_msg_notYetImplemented = Not Yet Implemented
+##common_msg_notYetImplemented = Not Yet Implemented
common_msg_see_more = 詳现...
common_msg_step_x_of_y = ã¹ããã {1} äž {0} çªã
-common_severity_debug = Debug
-common_severity_error = Error
-common_severity_fatal = Fatal
-common_severity_info = Info
-common_severity_warn = Warn
+##common_severity_debug = Debug
+common_severity_error = ãšã©ãŒ
+##common_severity_fatal = Fatal
+common_severity_info = æ
å ±
+##common_severity_warn = Warn
common_status_canceled = ãã£ã³ã»ã«
common_status_deferred = 延æ
common_status_failed = 倱æ
@@ -103,7 +98,8 @@ common_status_unknown = æªç¥
common_title_add_column = ã«ã©ã è¿œå
common_title_add_portlet = ããŒãã¬ããè¿œå
common_title_address = ã¢ãã¬ã¹
-common_title_alert_range = ã¢ã©ãŒãã®ç¯å²
+common_title_alerts = ã¢ã©ãŒã
+common_title_alerts_range = ã¢ã©ãŒãã®ç¯å²
common_title_ancestry = ç¥å
common_title_availability = ã¢ãã€ã©ããªãã£
common_title_available_resources = å©çšå¯èœãªãœãŒã¹
@@ -126,6 +122,8 @@ common_title_dashboard_name = ããã·ã¥ããŒãå
common_title_dateCreated = äœææ¥
common_title_dateRange = æ¥ä»ã®ç¯å²
common_title_default = ããã©ã«ã
+##common_title_definition = Definition
+common_title_definitions = å®çŸ©
common_title_description = 説æ
common_title_details = 詳现
common_title_display = 衚瀺
@@ -134,7 +132,6 @@ common_title_duration = æé
common_title_edit_mode = ç·šéã¢ãŒã
common_title_enabled = æå¹?
common_title_end = çµäº
-common_title_error = ãšã©ãŒ
common_title_generalProp = äžè¬ããããã£
common_title_group = ã°ã«ãŒã
common_title_group_def_total = ã°ã«ãŒãå®çŸ©ã®åèš
@@ -144,7 +141,6 @@ common_title_help = ãã«ã
common_title_host = ãã¹ã
common_title_id = ID
common_title_id_parent = 芪ã®ID
-common_title_info = æ
å ±
common_title_inventory = ã€ã³ãã³ããª
common_title_inventorySummary = ã€ã³ãã³ããªãµããª
common_title_lastUpdated = æçµæŽæ°
@@ -161,6 +157,7 @@ common_title_name = åå
common_title_new_dashboard = æ°èŠããã·ã¥ããŒã
common_title_numeric_metrics = æ°å€ã¡ããªãã¯ã¹
common_title_numeric_type = æ°å€å
+common_title_operation = ãªãã¬ãŒã·ã§ã³
common_title_operation_status = ãªãã¬ãŒã·ã§ã³ã®ç¶æ
common_title_operations = ãªãã¬ãŒã·ã§ã³
common_title_operations_range = ãªãã¬ãŒã·ã§ã³ã®ç¯å²
@@ -176,6 +173,7 @@ common_title_providers = ãããã€ã
common_title_recent_alerts = æè¿ã®ã¢ã©ãŒã
common_title_recent_bundle_deployments = æè¿ã®ãã³ãã«ã®ãããã€
common_title_recent_configuration_updates = æè¿ã®æ§æã®æŽæ°
+##common_title_recent_drifts = Recent Drift
common_title_recent_event_counts = æè¿ã®ã€ãã³ãæ°
common_title_recent_measurements = æè¿ã®æž¬å®
common_title_recent_oob_metrics = æè¿ã®å¢çå€ã®ã¡ããªãã¯ã¹
@@ -282,14 +280,12 @@ dataSource_platforms_field_cpu = CPU
dataSource_platforms_field_memory = ã¡ã¢ãª
dataSource_platforms_field_swap = ã¹ã¯ãã
dataSource_problemResources_error_fetchFailure = ã¢ã©ãŒããçºããŠããããŸãã¯å©çšäžèœã®ãªãœãŒã¹ã®ããŒãã«å€±æããŸãã
-dataSource_problemResources_field_alerts = ã¢ã©ãŒã
dataSource_problemResources_field_available = çŸåšã®ã¢ãã€ã©ããªãã£
dataSource_recentOperations_error_fetchFailure = æè¿å®äºãããªãã¬ãŒã·ã§ã³ã®ããŒãã«å€±æããŸãã
dataSource_recentOperations_field_location = ãã±ãŒã·ã§ã³
dataSource_recentOperations_field_operation = ãªãã¬ãŒã·ã§ã³
dataSource_recentOperations_field_resource = ãªãœãŒã¹
dataSource_recentOperations_field_status = ã¹ããŒã¿ã¹
-dataSource_recentOperations_field_time = æ¥ä»/æå»
dataSource_resourceErrors_clickStatusIcon = 詳现ã¯ã¢ã€ã³ã³ãã¯ãªãã¯ããŠãã ãã
dataSource_resourceErrors_deleteFailure = ãªãœãŒã¹ãšã©ãŒã®åé€ã«å€±æããŸãã
dataSource_resourceErrors_deleteSuccess = [{0}] ãªãœãŒã¹ãšã©ãŒã¡ãã»ãŒãžãåé€ããã®ã«å€±æããŸãã
@@ -313,7 +309,6 @@ dataSource_scheduledOperations_error_fetchFailure = ã¹ã±ãžã¥ãŒã«ããã
dataSource_scheduledOperations_field_location = å Žæ
dataSource_scheduledOperations_field_operation = ãªãã¬ãŒã·ã§ã³
dataSource_scheduledOperations_field_resource = ãªãœãŒã¹
-dataSource_scheduledOperations_field_time = æ¥ä»/æå»
dataSource_schedules_disableFailure_group = ID [{1}] ãæã€ãªãœãŒã¹ã°ã«ãŒãã® [{0}] ã¡ããªãã¯ã¹ã®åéãç¡å¹ã«ããã®ã«å€±æããŸãããæå¹ã«ãªã£ãã¡ããªãã¯ã¹ã¯ [{2}] ã§ãã
dataSource_schedules_disableFailure_resource = ID [{1}] ãæã€ãªãœãŒã¹ã® [{0}] ã¡ããªãã¯ã¹ã®åéãç¡å¹ã«ããã®ã«å€±æããŸãããæå¹ã«ãªã£ãã¡ããªãã¯ã¹ã¯ [{2}] ã§ãã
dataSource_schedules_disableSuccessful_concise = [{0}] 枬å®ã®åéãç¡å¹ã«ããŸãã
@@ -349,14 +344,11 @@ dataSource_users_field_id = ID
dataSource_users_field_lastName = åå
dataSource_users_field_ldap = LDAPãã°ã€ã³?
dataSource_users_field_name = ãŠãŒã¶ãŒå
-dataSource_users_field_password = ãã¹ã¯ãŒã
dataSource_users_field_passwordVerify = ãã¹ã¯ãŒãã®ç¢ºèª
dataSource_users_field_phoneNumber = é»è©±çªå·
dataSource_users_invalidEmailAddress = ç¡å¹ãªEã¡ãŒã«ã¢ãã¬ã¹
dataSource_users_passwordsDoNotMatch = ãã¹ã¯ãŒããäžèŽããŠããŸãã
datasource_roles_field_ldapGroups = LDAPã°ã«ãŒã
-datasource_roles_field_permissions = ããŒããã·ã§ã³
-datasource_roles_field_resourceGroups = ãªãœãŒã¹ã°ã«ãŒã
datasource_roles_field_subjects = ãµããžã§ã¯ã
datasource_templateSchedules_disabled = éžæãããã¡ããªã㯠[{0}] ã®åéãç¡å¹ã«ããŸãã
datasource_templateSchedules_disabled_detailed = ID [{2}] ãæã€ãªãœãŒã¹ã¿ã€ãã®ããã«ããã©ã«ãã§ã¡ããªã㯠[{0}] [{1}] ã®åéãç¡å¹ã«ããŸãã
@@ -395,7 +387,6 @@ view_adminConfig_plugins = ãã©ã°ã€ã³
view_adminConfig_systemSettings = ã·ã¹ãã èšå®
view_adminConfig_templates = ãã³ãã¬ãŒã
view_adminContent_contentSources = ã³ã³ãã³ããœãŒã¹
-view_adminContent_repositories = ãªããžããª
view_adminRoles_assignedGroups = å²ãåœãŠããããªãœãŒã¹ã°ã«ãŒã
view_adminRoles_assignedSubjects = å²ãåœãŠãããSubjects
view_adminRoles_failLdap = LDAPãæ§æããããã©ããã®æ±ºå®ã«å€±æããŸãã - LDAPãç¡ãããšãä»®å®ããŸã
@@ -405,7 +396,6 @@ view_adminRoles_failRoles = ããŒã«ã®åãåºãã«å€±æããŸãã
view_adminRoles_globalPerms = ã°ããŒãã«æš©é
view_adminRoles_ldapGroups = LDAPã°ã«ãŒã
view_adminRoles_ldapGroupsReadOnly = LDAPã°ã«ãŒãããŒã¿ã¯èªã¿åºãå°çšã§ã
-view_adminRoles_noItems = 衚瀺ããã¢ã€ãã ã¯ãããŸãã
view_adminRoles_noLdap = LDAPã»ãã¥ãªãã£ã®çµ±åã¯æ§æãããŠããŸãããLDAPãæ§æããã«ã¯ã <a {0}>{1}</a>ã«è¡ã£ãŠãã ããã
view_adminRoles_permissions_autoselecting_configureRead_implied = CONFIGURE_WRITEæš©éãèªåçã«éžæãããŸããããªããªããCONFIGURE_READãç¡ãããšããããæ瀺ããŠããããã§ãã
view_adminRoles_permissions_autoselecting_configureWrite_implied = CONFIGURE_READæš©éãèªåçã«éžæãããŸããããªããªããCONFIGURE_WRITEããããæ瀺ããŠããããã§ãã
@@ -430,6 +420,7 @@ view_adminRoles_permissions_permReadDesc_deleteChildResources = (æé»çãª)
view_adminRoles_permissions_permReadDesc_inventory = ãªãœãŒã¹ããããã£(ååã説æãããŒãžã§ã³ãªã©)ãã³ãã¯ã·ã§ã³èšå®ãã³ãã¯ã·ã§ã³èšå®å±¥æŽã®(æé»çãª)é²èŠ§
view_adminRoles_permissions_permReadDesc_manageAlerts = ã¢ã©ãŒãå®çŸ©ãšã¢ã©ãŒãå±¥æŽã®(æé»çãª)é²èŠ§
view_adminRoles_permissions_permReadDesc_manageContent = (æé»çãª)ã€ã³ã¹ããŒã«ãããŠå©çšå¯èœãªããã±ãŒãžãããã±ãŒãžã€ã³ã¹ããŒã«å±¥æŽã®é²èŠ§ã
+##view_adminRoles_permissions_permReadDesc_manageDrift = (IMPLIED) view drift definitions and drift history
view_adminRoles_permissions_permReadDesc_manageEvents = (æé»çãª)ã€ãã³ãã®é²èŠ§
view_adminRoles_permissions_permReadDesc_manageMeasurements = ã¡ããªãã¯ããŒã¿ãšåéã¹ã±ãžã¥ãŒã«ã®(æé»çãª)é²èŠ§
view_adminRoles_permissions_permWriteDesc_configure = ãªãœãŒã¹æ§æã®æŽæ°ããªãœãŒã¹æ§æãªããžã§ã³å±¥æŽã®åé€ã
@@ -439,6 +430,7 @@ view_adminRoles_permissions_permWriteDesc_deleteChildResources = ãªãœãŒã¹ã®
view_adminRoles_permissions_permWriteDesc_inventory = ãªãœãŒã¹ã®ååãããŒãžã§ã³ã説æãã³ãã¯ã·ã§ã³èšå®ã®æŽæ°ãã³ãã¯ã·ã§ã³èšå®ã®å±¥æŽã®åé€ã
view_adminRoles_permissions_permWriteDesc_manageAlerts = ã¢ã©ãŒãå®çŸ©ã®äœæãæŽæ°ãåé€ãã¢ã©ãŒãå±¥æŽã®ç¢ºèªãšåé€
view_adminRoles_permissions_permWriteDesc_manageContent = ã³ã³ãã³ããœãŒã¹ãžã®ç»é²ãããã±ãŒãžã®ã€ã³ã¹ããŒã«ãšã¢ã³ã€ã³ã¹ããŒã«ã
+##view_adminRoles_permissions_permWriteDesc_manageDrift = create, update, and delete drift definitions; and manage drift instances
view_adminRoles_permissions_permWriteDesc_manageEvents = ã€ãã³ãã®åé€
view_adminRoles_permissions_permWriteDesc_manageMeasurements = ã¡ããªãã¯åéã¹ã±ãžã¥ãŒã«ã®æŽæ°
view_adminRoles_permissions_perm_configure = æ§æ
@@ -449,6 +441,7 @@ view_adminRoles_permissions_perm_inventory = ã€ã³ãã³ããª
view_adminRoles_permissions_perm_manageAlerts = ã¢ã©ãŒãã®ç®¡ç
view_adminRoles_permissions_perm_manageBundles = ãã³ãã«ã®ç®¡ç
view_adminRoles_permissions_perm_manageContent = ã³ã³ãã³ã管ç
+##view_adminRoles_permissions_perm_manageDrift = Manage Drift
view_adminRoles_permissions_perm_manageEvents = ã€ãã³ã管ç
view_adminRoles_permissions_perm_manageInventory = ã€ã³ãã³ããªã®ç®¡ç
view_adminRoles_permissions_perm_manageMeasurements = 枬å®ã®ç®¡ç
@@ -459,15 +452,12 @@ view_adminRoles_permissions_read = Read:
view_adminRoles_permissions_readAccessImplied = [{0}] æš©éã®ããã®èªã¿åãã¢ã¯ã»ã¹ãæ瀺ãããŠããŠç¡å¹ã«ã§ããŸãã
view_adminRoles_permissions_resourcePermissions = ãªãœãŒã¹æš©é
view_adminRoles_permissions_write = Write:
-view_adminRoles_perms = æš©é
view_adminRoles_resourcePerms = ãªãœãŒã¹æš©é
view_adminRoles_roleAdded = ããŒã« [{0}] ãè¿œå ãããŸãã
view_adminRoles_roleDeleteFailed = ããŒã« [{0}] ã®åé€ã«å€±æããŸãã
view_adminRoles_roleDeleted = ããŒã« [{0}] ãåé€ãããŸãã
view_adminRoles_roleUpdateFailed = ããŒã« [{0}] ã®æŽæ°ã«å€±æããŸãã.
view_adminRoles_roleUpdated = ããŒã« [{0}] ãæŽæ°ãããŸãã
-view_adminSecurity_roles = ããŒã«
-view_adminSecurity_users = ãŠãŒã¶ãŒ
view_adminTemplates_disabledAlertTemplates = ç¡å¹ãªã¢ã©ãŒããã³ãã¬ãŒã
view_adminTemplates_disabledMetricTemplates = ç¡å¹ãªã¡ããªãã¯ãã³ãã¬ãŒã
view_adminTemplates_editAlertTemplate = ã¢ã©ãŒããã³ãã¬ãŒãã®ç·šé
@@ -487,8 +477,6 @@ view_adminTopology_partitionEvents = ã€ãã³ãã®åé¡
view_adminTopology_remoteAgentInstall = ãªã¢ãŒããšãŒãžã§ã³ãã®ã€ã³ã¹ããŒã«
view_adminTopology_servers = ãµãŒããŒ
view_adminUsersDetails_dataTypeName = ãŠãŒã¶ãŒ
-view_adminUsersList_dataTypeName = ãŠãŒã¶ãŒ
-view_adminUsersList_dataTypeNamePlural = ãŠãŒã¶ãŒ
view_admin_administration = 管ç
view_admin_configuration = æ§æ
view_admin_content = ã³ã³ãã³ã
@@ -608,8 +596,8 @@ view_alert_common_tab_conditions_type_availability = ã¢ãã€ã©ããªãã£ã®
view_alert_common_tab_conditions_type_availability_down = äžé
view_alert_common_tab_conditions_type_availability_up = äžæ
##view_alert_common_tab_conditions_type_drift = Drift Detection
-##view_alert_common_tab_conditions_type_drift_configpaths = Drift Detection for files that match "{0}" and for drift configuration [{1}]
-##view_alert_common_tab_conditions_type_drift_onlyconfig = Drift Detection for drift configuration [{0}]
+##view_alert_common_tab_conditions_type_drift_configpaths = Drift Detection for files that match "{0}" and for drift definition [{1}]
+##view_alert_common_tab_conditions_type_drift_onlyconfig = Drift Detection for drift definition [{0}]
##view_alert_common_tab_conditions_type_drift_onlypaths = Drift Detection for files that match "{0}"
view_alert_common_tab_conditions_type_event = ã€ãã³ãã®æ€åº
view_alert_common_tab_conditions_type_event_matching = ã€ãã³ããœãŒã¹ãäžèŽ
@@ -632,7 +620,6 @@ view_alert_common_tab_conditions_type_metric_trait_change = ãã¬ã€ãã®å€
view_alert_common_tab_conditions_type_operation = ãªãã¬ãŒã·ã§ã³ã®å®è¡
view_alert_common_tab_conditions_type_operation_status = çµæã¹ããŒã¿ã¹ä»
view_alert_common_tab_conditions_type_resource_configuration = ãªãœãŒã¹æ§æã®å€å
-view_alert_common_tab_conditions_value = å€
view_alert_common_tab_dampening = æå¶
view_alert_common_tab_dampening_category_consecutive_count = é£ç¶
view_alert_common_tab_dampening_category_consecutive_count_tooltip = æ¡ä»¶èšå®ãXåé£ç¶ããŠtrueã§ããã°ã¢ã©ãŒããåŒãèµ·ããããŸãã
@@ -669,19 +656,14 @@ view_alert_definition_condition_editor_common_avg = å¹³å
view_alert_definition_condition_editor_common_max = æ倧
view_alert_definition_condition_editor_common_min = æå°
view_alert_definition_condition_editor_delete_confirm = éžæãããã¢ã©ãŒãå®çŸ©ãåé€ããŸãã?
-##view_alert_definition_condition_editor_drift_configname_regex = Drift Configuration Name
-##view_alert_definition_condition_editor_drift_configname_regex_tooltip = If specified, this is the drift configuration name that was responsible for the drift that was detected. This can optionally be a regular expression if you wish to match multiple drift configuration names.
+##view_alert_definition_condition_editor_drift_configname_regex = Drift Definition Name
+##view_alert_definition_condition_editor_drift_configname_regex_tooltip = If specified, this is the drift definition name that was responsible for the drift that was detected. This can optionally be a regular expression if you wish to match multiple drift definition names.
##view_alert_definition_condition_editor_drift_pathname_regex = Pathname Regular Expression
##view_alert_definition_condition_editor_drift_pathname_regex_tooltip = If specified, this is a regular expression that must match the pathnames of those files that drifted.
##view_alert_definition_condition_editor_drift_tooltip = This condition is triggered when drift has been detected.
view_alert_definition_condition_editor_event_regex = æ£èŠè¡šçŸ
view_alert_definition_condition_editor_event_regex_tooltip = ããæå®ããããªããããã¯æ£èŠè¡šçŸã§ããããã®æ¡ä»¶ãåŒãèµ·ããããã«åéãããã€ãã³ãã¡ãã»ãŒãžã«äžèŽããªããã°ãªããŸããã
view_alert_definition_condition_editor_event_severity = ã€ãã³ãé倧床
-view_alert_definition_condition_editor_event_severity_debug = Debug
-view_alert_definition_condition_editor_event_severity_error = Error
-view_alert_definition_condition_editor_event_severity_fatal = Fatal
-view_alert_definition_condition_editor_event_severity_info = Info
-view_alert_definition_condition_editor_event_severity_warn = Warn
view_alert_definition_condition_editor_event_tooltip = ãã®æ¡ä»¶ãåŒãèµ·ããããã«ã€ãã³ãã¡ãã»ãŒãžãå ±åãããå¿
èŠãããã€ãã³ãé倧床ãæå®ããŸãããããªãã·ã§ã³ãšãªãæ£èŠè¡šçŸãæå®ãããªããã€ãã³ãã¡ãã»ãŒãžã¯ãã®æ¡ä»¶ãåŒãèµ·ããããããã«ã€ãã³ãã¡ãã»ãŒãžãæ£èŠè¡šçŸã«äžèŽããªããã°ãªããŸããã
view_alert_definition_condition_editor_metric_baseline_percentage = ããŒã¹ã©ã€ã³ããŒã»ã³ããŒãž
view_alert_definition_condition_editor_metric_baseline_percentage_tooltip = éžæãããæ¯èŒå(comparator)ã䜿çšããŠéžæãããããŒã¹ã©ã€ã³å€ã®ããŒã»ã³ããŒãžãæ¯èŒãããšãã«åéãããã¡ããªãã¯å€ã¯ãã®æ¡ä»¶ãåŒãèµ·ãããŸãã
@@ -730,12 +712,7 @@ view_alert_definition_condition_editor_metric_trait_change_tooltip = æ¡ä»¶ã
view_alert_definition_condition_editor_metric_trait_change_value = ãã¬ã€ã
##view_alert_definition_condition_editor_metricswarning = You cannot have multiple conditions that use the same metric when using the ALL conjunction. This alert definition has multiple conditions that use the metric [{0}].
view_alert_definition_condition_editor_operation_status = ãªãã¬ãŒã·ã§ã³ã¹ããŒã¿ã¹
-view_alert_definition_condition_editor_operation_status_canceled = ãã£ã³ã»ã«æž
-view_alert_definition_condition_editor_operation_status_failure = 倱æ
-view_alert_definition_condition_editor_operation_status_inprogress = åŠçäž
-view_alert_definition_condition_editor_operation_status_success = æå
view_alert_definition_condition_editor_operation_tooltip = æ¡ä»¶ãåŒãèµ·ããããã«éžæããããå®è¡ããããšãçºçããªããã°ãªããªãçµæãæå®ããŸã
-view_alert_definition_condition_editor_operation_value = ãªãã¬ãŒã·ã§ã³
view_alert_definition_condition_editor_option_availability = ã¢ãã€ã©ããªãã£ã®å€å
##view_alert_definition_condition_editor_option_drift = Drift Detection
view_alert_definition_condition_editor_option_event = ã€ãã³ãã®æ€åº
@@ -868,20 +845,15 @@ view_autoDiscoveryQ_confirmSelect = ãã©ãããã©ãŒã ã®åãéžæã
view_autoDiscoveryQ_deleted = åé€æžã¿
view_autoDiscoveryQ_field_discoveryTime = çºèŠæå»
view_autoDiscoveryQ_field_inventoryStatus = ã€ã³ãã³ããªã¹ããŒã¿ã¹
-view_autoDiscoveryQ_field_key = ãªãœãŒã¹ããŒ
-view_autoDiscoveryQ_field_name = ãªãœãŒã¹å
view_autoDiscoveryQ_field_parentId = 芪ID
view_autoDiscoveryQ_ignore = ç¡èŠ
view_autoDiscoveryQ_ignoreFailure = ãªãœãŒã¹ãç¡èŠããã®ã«å€±æããŸãã
view_autoDiscoveryQ_ignoreSuccessful = éžæãããªãœãŒã¹ãç¡èŠããã®ã«æåããŸãã
view_autoDiscoveryQ_ignored = ç¡èŠæžã¿
-view_autoDiscoveryQ_import = ã€ã³ããŒã
view_autoDiscoveryQ_importFailure = ãªãœãŒã¹ã®ã€ã³ããŒãã«å€±æããŸãã
view_autoDiscoveryQ_importSuccessful = éžæãããªãœãŒã¹ã®ã€ã³ããŒãã«æåããŸããã
view_autoDiscoveryQ_loadFailure = ã€ã³ãã³ããªãã£ã¹ã«ããªãã¥ãŒãããŒãããã®ã«å€±æããŸãã
-view_autoDiscoveryQ_new = æ°èŠ
view_autoDiscoveryQ_newAndIgnored = æ°èŠãã€ç¡èŠæžã¿
-view_autoDiscoveryQ_noItems = 衚瀺ããé
ç®ããããŸãã
view_autoDiscoveryQ_noperm = (èªåãã£ã¹ã«ããªãã¥ãŒãé²èŠ§ããæš©éããããŸãã)
view_autoDiscoveryQ_showStatus = 衚瀺
view_autoDiscoveryQ_title = èªåãªã«ããªãã¥ãŒ
@@ -1136,24 +1108,40 @@ view_dashboards_portlets_refresh_one_min = 1 å
view_dashboards_portlets_refresh_success1 = ããŒãã¬ããã®èªåãªãã¬ãã·ã¥ééãæŽæ°ããŸãã
view_dashboards_portlets_refresh_success2 = èªåãªãã¬ãã·ã¥ããããŒãã¬ããã®ãªããŒããåæ¢ããŠããŸã
view_dashboards_title = ããã·ã¥ããŒã
-##view_drift = Drift
-##view_drift_category_fileNew = New Detection
-##view_drift_changeSets = Change Sets
-##view_drift_changeSets_resourceViewTitle = Resource Drift Change Sets
-##view_drift_changeset_tree_loadConfigFailure = Failed to load drift configuration for change set id [{0}]
-##view_drift_changeset_tree_loadFailure = Failed to load drift change set tree.
-##view_drift_delete_configConfirm = Delete the selected drift configuration(s)?
-##view_drift_delete_configConfirmAll = Delete all drift configurations?
-##view_drift_failure_deleteConfigs = Failed to delete some or all drift configurations.
+##view_drift_button_detectNow = Detect Now
+##view_drift_category_fileAdded = File Added
+##view_drift_category_fileChanged = File Changed
+##view_drift_category_fileNew = Newly Detected
+##view_drift_category_fileRemoved = File Removed
+##view_drift_delete_configConfirm = Delete the selected drift detection definition(s)?
+##view_drift_delete_configConfirmAll = Delete all drift detection definition?
+##view_drift_failure_deleteDefs = Failed to delete some or all drift detection definitions.
+##view_drift_failure_detectNow = Failed to submit drift detection run request
+##view_drift_failure_load = Failed to fetch drift instances
+##view_drift_snapshots = Snapshots
+##view_drift_snapshots_resourceViewTitle = Resource Drift Snapshots
+##view_drift_snapshots_tree_loadDefFailure = Failed to load drift detection definition for snapshot id [{0}]
+##view_drift_snapshots_tree_loadFailure = Failed to load drift snapshot tree.
+##view_drift_success_defUpdated = Drift detection definition updated and will affect the next detection run as applicable.
+##view_drift_success_delete = Successfully deleted {0} drift instances
+##view_drift_success_deleteConfigs = Successfully deleted {0} drift detection definitions
+##view_drift_success_detectNow = Successfully submitted drift detection run request
##view_drift_table_baseDir = Base Directory
-##view_drift_table_changeSet = Change Set
##view_drift_table_driftHandlingMode = Drift Handling
##view_drift_table_driftHandlingMode_normal = normal
##view_drift_table_driftHandlingMode_plannedChanges = planned changes
##view_drift_table_newFile = New File
##view_drift_table_oldFile = Old File
-##view_drift_table_resourceConfig = Resource Drift Configuration
+##view_drift_table_resourceDef = Resource Drift Detection Definition
##view_drift_table_resourceHistory = Resource Drift History
+##view_drift_table_snapshot = Snapshot
+##view_drift_wizard_addDef_failure = Failed to add new drift detection definition [{0}]
+##view_drift_wizard_addDef_infoStepName = Provide Drift Detection Information
+##view_drift_wizard_addDef_success = Successfully added new drift detection definition [{0}]. Agent(s) will be updated.
+##view_drift_wizard_addDef_templateHelp = Each drift detection definition describes a set of files for which drift monitoring will be performed. The definition can be enabled and disabled, defines the detection run interval, and specifies a base directory and optional file filters. For each resource type offering drift detection there will be one or more predefined templates to use as a starting definition, which can then be edited.
+##view_drift_wizard_addDef_templatePrompt = Drift Detection Definition Templates
+##view_drift_wizard_addDef_title = Add Drift Detection Definition for Resource of Type [{0}]
+##view_drift_wizard_addDef_windowTitle = Drift Add Detection Definition Wizard
view_dynagroup_children = åçã°ã«ãŒãã®å
view_dynagroup_compatible = Compatible
view_dynagroup_definitionAlreadyExists = ãã§ã«ãã®ååã®ã°ã«ãŒãå®çŸ©ãååšããŸã
@@ -1373,7 +1361,6 @@ view_inventory_groups_deleteFailed = éžæããããªãœãŒã¹ã°ã«ãŒãã®
view_inventory_groups_deleteSuccessful = éžæããããªãœãŒã¹ã°ã«ãŒãã®åé€ã«æåããŸãã
view_inventory_groups_descendants = åå«
view_inventory_groups_loadFailed = ã°ã«ãŒãåæããŒã¿ã®ããŒãã«å€±æããŸãã
-view_inventory_groups_resourceGroups = ãªãœãŒã¹ã°ã«ãŒã
view_inventory_mixed = æ··æ
view_inventory_platforms = ãã©ãããã©ãŒã
view_inventory_problemGroups = åé¡ã°ã«ãŒã
@@ -1382,9 +1369,7 @@ view_inventory_resources_deleteConfirm = éžæããããªãœãŒã¹ãåé€ã
view_inventory_resources_deleteFailed = éžæããããªãœãŒã¹ã®åé€ã«å€±æããŸãã
##view_inventory_resources_deleteSuccessful = A request to perform the resource deletion has been submitted successfully to the agent(s).
view_inventory_resources_loadFailed = ãªãœãŒã¹åæããŒã¿ã®ããŒãã«å€±æããŸãã
-view_inventory_resources_title = ãªãœãŒã¹
-view_inventory_resources_title_children = åãªãœãŒã¹
-view_inventory_resources_title_members = ã¡ã³ããŒãªãœãŒã¹
+view_inventory_resources_members = ã¡ã³ããŒãªãœãŒã¹
view_inventory_resources_uninventoryConfirm = éžæãããªãœãŒã¹ãã¢ã³ã€ã³ãã³ããªããŠãããããã§ãã? ããéžæãããªãœãŒã¹ããŸã ååšããŠãããªãããã®ãšãŒãžã§ã³ãã®æ¬¡åã®ãã£ã¹ã«ããªã¹ãã£ã³ã®éã«ããã¯åçºèŠãããŸãã
view_inventory_resources_uninventoryFailed = éžæããããªãœãŒã¹ã®ã¢ã³ã€ã³ãã³ããªã«å€±æããŸãã
view_inventory_resources_uninventorySuccessful = éžæããããªãœãŒã¹ã®ã¢ã³ã€ã³ãã³ããªã«æåããŸãã
@@ -1411,7 +1396,6 @@ view_login_prompt = ãã°ã€ã³ããŠãã ãã
view_login_registerLater = (ãã£ã³ã»ã« - ç»é²ãåŸã§å®æãããŠãã ãã)
view_login_registerLdapSuccess = æ°ããLDAPãŠãŒã¶ãŒã®ç»é²ã«æåããŸãã
view_login_registerUser = ãŠãŒã¶ã®ç»é²
-view_login_welcome = ãããã
view_login_welcomeMsg = RHQãžãããã! <br/><br/> ç»é²ãå®æãããããã«æ¬¡ã®ãã£ãŒã«ããå
¥å/æŽæ°ããŠãã ããã<br/> "OK"ãã¯ãªãã¯ãããããã°ã€ã³ããŸãã<br/><br/>
view_measureRange_last = æéã®ç¯å² - çŽå
view_measureRange_simple = ã·ã³ãã«...
@@ -1491,7 +1475,6 @@ view_portlet_defaultName_resource_metrics = ãªãœãŒã¹: 枬å®
view_portlet_defaultName_resource_oobs = ãªãœãŒã¹: OOB ã¡ããªãã¯ã¹
view_portlet_defaultName_resource_operations = ãªãœãŒã¹: ãªãã¬ãŒã·ã§ã³
view_portlet_defaultName_resource_pkg_hisory = ãªãœãŒã¹: ããã±ãŒãžå±¥æŽ
-view_portlet_defaultName_tagCloud = ã¿ã°æ°
view_portlet_factory_invalidPortlet = ããã¯æå¹ã§ã¯ãªãå€ãããŒãã¬ããã§ããåé€ããŠãã ããã
view_portlet_graph_configure_metricDefinition_graph = ã°ã©ããæãããã®ã¡ããªãã¯å®çŸ© ID
view_portlet_graph_configure_resource_graph = ã°ã©ãåãããªãœãŒã¹
@@ -1605,7 +1588,6 @@ view_resource_monitor_calltime_lookupFailed = åŒã³åºãæéã®ããã®ãª
view_resource_monitor_calltime_maximum = æ倧
view_resource_monitor_calltime_minimum = æå°
view_resource_monitor_calltime_title = åŒã³åºãæéããŒã¿
-view_resource_monitor_calltime_total = åèš
view_resource_monitor_detailed_graph_label = 詳现åã°ã©ã
view_resource_monitor_graph_instructions = ããŠã¹ã§å³ã®äžã®ããŒã¿ãæã瀺ããŠãã ãã
view_resource_monitor_graph_live_tooltip = ã¯ãªãã¯ããããšçŸåšã®å€ã®æŽ»åäžã®ã°ã©ãã衚瀺ãããŸã
@@ -1613,7 +1595,6 @@ view_resource_monitor_graphs_loadFailed = ã°ã©ãããŒã¿ã®ããŒãã«å€±
view_resource_monitor_graphs_lookupFailed = ã°ã©ãã®ããã®ãªãœãŒã¹ã®çºèŠã«å€±æããŸãã
view_resource_monitor_graphs_noneAvailable = å©çšã§ããã°ã©ãã¯ãããŸãã
view_resource_monitor_schedules_title = ãªãœãŒã¹ã¡ããªãã¯åéã¹ã±ãžã¥ãŒã«
-view_resource_monitor_table_alerts = ã¢ã©ãŒã
view_resource_monitor_table_avg = å¹³å
view_resource_monitor_table_last = æåŸ
view_resource_monitor_table_max = æ倧
@@ -1647,7 +1628,6 @@ view_summaryOverviewForm_field_type = ã¿ã€ã
view_summaryOverviewForm_field_version = ããŒãžã§ã³
view_summaryOverviewForm_header_summary = ãµããª
view_summaryOverviewForm_label_plugin = ãã©ã°ã€ã³:
-view_summaryOverviewForm_label_type = ã¿ã€ã:
view_summaryOverviewForm_message_descriptionChangeSuccess = ID {0} ãæã€ãªãœãŒã¹ã®èª¬æã [{1}] ãã [{2}]ã«å€æŽããã®ã«å€±æããŸãã
view_summaryOverviewForm_message_locationChangeSuccess = ID {0} ãæã€ãªãœãŒã¹ã®äœçœ®ã [{1}] ãã [{2}]ã«å€æŽããã®ã«å€±æããŸãã
view_summaryOverviewForm_message_nameChangeSuccess = ID {0} ãæã€ãªãœãŒã¹ã®ååã [{1}] ãã [{2}]ã«å€æŽããã®ã«å€±æããŸãã
@@ -1662,19 +1642,17 @@ view_table_matchingRows = äžèŽããè¡: {0} (éžææžã¿: {1})
view_table_totalRows = åèšè¡: {0} (éžææžã¿: {1})
view_tabs_common_activity = ã¢ã¯ãã£ããã£
view_tabs_common_agent = ãšãŒãžã§ã³ã
-view_tabs_common_alerts = ã¢ã©ãŒã
view_tabs_common_availability = ã¢ãã€ã©ããªãã£
view_tabs_common_calltime = åŒã³åºãæée
view_tabs_common_child_history = åã®å±¥æŽ
view_tabs_common_child_resources = åãªãœãŒã¹
-view_tabs_common_configuration = æ§æ
view_tabs_common_connectionSettings = æ¥ç¶èšå®
view_tabs_common_connectionSettingsHistory = æ¥ç¶èšå®ã®å±¥æŽ
view_tabs_common_content = ã³ã³ãã³ã
view_tabs_common_current = çŸåš
view_tabs_common_dashboard = ããã·ã¥ããŒã
-view_tabs_common_definitions = å®çŸ©
view_tabs_common_deployed = ãããã€æžã¿
+##view_tabs_common_drift = Drift
view_tabs_common_events = ã€ãã³ã
view_tabs_common_graphs = ã°ã©ã
view_tabs_common_group_members = ã°ã«ãŒãã¡ã³ããŒ
@@ -1684,13 +1662,10 @@ view_tabs_common_history = å±¥æŽ
view_tabs_common_inventory = ã€ã³ãã³ããª
view_tabs_common_members = ã¡ã³ããŒ
view_tabs_common_monitoring = ã¢ãã¿ãªã³ã°
-view_tabs_common_new = æ°èŠ
-view_tabs_common_operations = ãªãã¬ãŒã·ã§ã³
view_tabs_common_overview = æŠèŠ
view_tabs_common_schedule = ã¹ã±ãžã¥ãŒã«
view_tabs_common_schedules = ã¹ã±ãžã¥ãŒã«
view_tabs_common_subscriptions = ãµãã¹ã¯ãªãã·ã§ã³
-view_tabs_common_summary = ãµããª
view_tabs_common_tables = ããŒãã«
view_tabs_common_timeline = ã¿ã€ã ã©ã€ã³
view_tabs_common_traits = ãã¬ã€ã
@@ -1701,7 +1676,6 @@ view_tagCloud_deleteTagFailure = ã¿ã° [{0}] ãåé€ããã®ã«å€±æããŸ
view_tagCloud_deleteTagSuccess = ã¿ã° [{0}] ãåé€ããã®ã«æåããŸãã
view_tagCloud_error_fetchFailure = ã¿ã°ãããŒãããã®ã«å€±æããŸãã
view_tagCloud_error_tagUsedCount = {0} å䜿ãããã¿ã°
-view_tagCloud_title = ã¿ã°ã¯ã©ãŠã
view_taggedResources_title = ãªãœãŒã¹
view_tags_error_1 = ã¿ã°ãããŒãããã®ã«å€±æããŸãã
view_tags_tags = ã¿ã°
@@ -1731,9 +1705,8 @@ view_tree_common_contextMenu_loadFail_dashboards = ãŠãŒã¶ãŒã®ããã·ã¥
view_tree_common_contextMenu_loadFail_group = ã³ã³ããã¹ãã¡ãã¥ãŒã®ããã®ã°ã«ãŒãã®ããŒãã«å€±æããŸãã
view_tree_common_contextMenu_loadFailed_dashboard = ãŠãŒã¶ãŒããã·ã¥ããŒãã®ããŒãã«å€±æããŸãã
view_tree_common_contextMenu_loadFailed_manualAddChildren = åãæåã§è¿œå ããããã®ãã©ãããã©ãŒã ã®ããŒãã«å€±æããŸãã
+view_tree_common_contextMenu_loadFailed_operations = ãªãã¬ãŒã·ã§ã³ã®å®è¡ã®ããã«ãŠã£ã¶ãŒããéå§ããã®ã«å€±æããŸãã
view_tree_common_contextMenu_measurements = 枬å®
-view_tree_common_contextMenu_operations = ãªãã¬ãŒã·ã§ã³
-view_tree_common_contextMenu_operations_loadFailed = ãªãã¬ãŒã·ã§ã³ã®å®è¡ã®ããã«ãŠã£ã¶ãŒããéå§ããã®ã«å€±æããŸãã
view_tree_common_contextMenu_resourceConfiguration = ãªãœãŒã¹æ§æ
view_tree_common_contextMenu_resourceGraph = ãªãœãŒã¹ã¡ããªãã¯ã°ã©ã
view_tree_common_contextMenu_saveChartToDashboardFailure = ããã·ã¥ããŒããä¿åããã®ã«å€±æããŸãã
@@ -1811,7 +1784,6 @@ widget_recordEditor_info_recordUpdatedConcise = {0} ãæŽæ°ãããŸããã
widget_recordEditor_info_recordUpdatedDetailed = {0} [{1}] ãæŽæ°ãããŸããã
widget_recordEditor_info_recordsDeletedConcise = {0} {1} ãåé€ãããŸããã
widget_recordEditor_info_recordsDeletedDetailed = {0} {1} ãåé€ãããŸãã: {2}.
-widget_recordEditor_label_loading = ããŒãäž...
widget_recordEditor_title_edit = ç·šé {0} [{1}]
widget_recordEditor_title_new = æ°èŠäœæ {0}
widget_recordEditor_title_view = é²èŠ§ {0} [{1}]
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
index f3427bb..fe0c5dc 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
@@ -51,29 +51,23 @@ common_calendar_may_short = mai
common_calendar_november_short = nov
common_calendar_october_short = out
common_calendar_september_short = set
-common_label_ago = ago
+##common_label_ago = ago
common_label_all = TODOS
common_label_all_resources = todos os recursos
common_label_day = dia
-common_label_days = dias
common_label_hour = hora
-common_label_hours = horas
common_label_item = item
common_label_items = itens
-common_label_milliseconds = milisegundos
-common_label_minutes = minutos
common_label_month = m\u00EAs
common_label_none = nenhum
common_label_role = perfil
common_label_roles = perfis
common_label_scheduled_operations = opera\u00E7\u00F5es agendadas
-common_label_seconds = segundos
common_label_selected_resources = recursos selecionados
common_label_unlimited = ilimitado
common_label_user = usu\u00E1rio
common_label_users = usu\u00E1rios
common_label_week = semana
-common_label_weeks = semanas
common_label_yesterday = Ontem
common_msg_areYouSure = Tem certeza?
common_msg_asyncTimeout = {0}. Isso ocorre porque o servidor est\u00E1 levando muito tempo para atender esta requisi\u00E7\u00E3o. Favor atentar para o fato de que o servidor ainda esteja processando sua requisi\u00E7\u00E3o e pode concluir dentro de mais alguns instantes. Voc\u00EA ainda pode verificar os logs do servidor para identificar se algum erro anormal ocorreu.
@@ -85,11 +79,11 @@ common_msg_noItemsToShow = N\u00E3o existem itens para apresentar
common_msg_notYetImplemented = N\u00E3o implementado ainda
common_msg_see_more = Ver detalhes...
common_msg_step_x_of_y = Passo {0} de {1}
-common_severity_debug = Debug
-common_severity_error = Error
-common_severity_fatal = Fatal
-common_severity_info = Info
-common_severity_warn = Warn
+##common_severity_debug = Debug
+common_severity_error = Erro
+##common_severity_fatal = Fatal
+##common_severity_info = Info
+##common_severity_warn = Warn
common_status_canceled = Cancelado
common_status_deferred = Deferido
common_status_failed = Falha
@@ -103,7 +97,8 @@ common_title_add_column = Adicionar Coluna
common_title_add_graph_to_view = Adicionar Gr\u00E1fico ao Monitor de Vis\u00E3o
common_title_add_portlet = Adicionar Portlet
common_title_address = Endere\u00E7o
-common_title_alert_range = S\u00E9rie de Alertas
+common_title_alerts = Alerts
+common_title_alerts_range = S\u00E9rie de Alertas
common_title_ancestry = Ancestral
common_title_availability = Disponibilidade
common_title_available_resources = Recursos Dispon\u00EDveis
@@ -126,6 +121,8 @@ common_title_dashboard_name = Nome do Painel de Controle
common_title_dateCreated = Data de Cria\u00E7\u00E3o
common_title_dateRange = Intervalo de Data
common_title_default = Padr\u00E3o
+##common_title_definition = Definition
+common_title_definitions = Definitions
common_title_description = Descri\u00E7\u00E3o
common_title_details = Detalhes
common_title_display = Display
@@ -134,7 +131,6 @@ common_title_duration = Dura\u00E7\u00E3o
common_title_edit_mode = Modo Edi\u00E7\u00E3o
common_title_enabled = Habilitado?
common_title_end = Fim
-common_title_error = Erro
common_title_favorites = Favoritos
common_title_generalProp = Propriedades Gerais
common_title_group = Grupo
@@ -146,7 +142,6 @@ common_title_host = Host
common_title_icon = \u00EDcone
common_title_id = ID
common_title_id_parent = ID do Recurso pai
-common_title_info = Info
##common_title_interval = Interval
common_title_inventory = Invent\u00E1rio
common_title_inventorySummary = Sum\u00E1rio do Invent\u00E1rio
@@ -164,6 +159,7 @@ common_title_name = Nome
common_title_new_dashboard = Novo Painel de Controle
common_title_numeric_metrics = M\u00E9tricas Num\u00E9ricas
common_title_numeric_type = Tipo Num\u00E9rico
+common_title_operation = Opera\u00E7\u00E3o
common_title_operation_status = Status da Opera\u00E7\u00E3o
common_title_operations = Opera\u00E7\u00F5es
common_title_operations_range = S\u00E9rie de Opera\u00E7\u00F5es
@@ -173,13 +169,13 @@ common_title_path = Caminho
common_title_permissions = Permiss\u00F5es
common_title_platform = Plataforma
common_title_platform_total = Total de Plataformas
-common_title_plugin = Plugin
+##common_title_plugin = Plugin
common_title_port = Porta
common_title_providers = Provedores
common_title_recent_alerts = Alertas Recentes
common_title_recent_bundle_deployments = Recent Bundle Deployments
common_title_recent_configuration_updates = Configura\u00E7\u00F5es Alteradas Recentemente
-##common_title_recent_drifts = Recent Drifts
+##common_title_recent_drifts = Recent Drift
common_title_recent_event_counts = Totaliza\u00E7\u00E3o de Eventos Recentes
common_title_recent_measurements = M\u00E9tricas Recentes
common_title_recent_oob_metrics = M\u00E9tricas fora dos limites Recentes
@@ -189,7 +185,7 @@ common_title_recently_added = Recursos Adicionados Recentemente
common_title_remove_column = Remover Coluna
common_title_repositories = Reposit\u00F3rios
common_title_resource = Recursos
-common_title_resourceGroups = Resource Groups
+##common_title_resourceGroups = Resource Groups
common_title_resource_group = Grupo de Recursos
common_title_resource_id = ID do Recurso
common_title_resource_inventory = Invent\u00E1rio de Recursos
@@ -217,7 +213,6 @@ common_title_start = Iniciar
common_title_status = Status
common_title_stop = Parar
common_title_summary = Sum\u00E1rio
-common_title_summary_counts = Sum\u00E1rio de Contagem
common_title_tag_cloud = Nuvem de Tags
common_title_the = O
common_title_timestamp = Data/Hora
@@ -292,16 +287,12 @@ dataSource_platforms_field_cpu = CPU
dataSource_platforms_field_memory = Mem\u00F3ria
dataSource_platforms_field_swap = Swap
dataSource_problemResources_error_fetchFailure = Falha com carregar Recursos com alertas/indisponibilidade.
-dataSource_problemResources_field_alerts = Alertas
dataSource_problemResources_field_available = Disponibilidade Atual
-dataSource_problemResources_field_location = Local
-dataSource_problemResources_field_resource = Recurso
dataSource_recentOperations_error_fetchFailure = Falha ao carregar a lista de opera\u00E7\u00F5es finalizadas recentemente.
dataSource_recentOperations_field_location = Localiza\u00E7\u00E3o
dataSource_recentOperations_field_operation = Opera\u00E7\u00E3o
dataSource_recentOperations_field_resource = Recurso
dataSource_recentOperations_field_status = Status
-dataSource_recentOperations_field_time = Data/Hora
dataSource_resourceErrors_clickStatusIcon = Clique no \u00EDcone para mais detalhes
dataSource_resourceErrors_deleteFailure = Falha do excluir mensagens de erros do recurso
dataSource_resourceErrors_deleteSuccess = Mensagens de erro para o recurso [{0}] exclu\u00EDdas com sucesso.
@@ -326,7 +317,6 @@ dataSource_scheduledOperations_error_fetchFailure = Falha ao carregar a lista de
dataSource_scheduledOperations_field_location = Localiza\u00E7\u00E3o
dataSource_scheduledOperations_field_operation = Opera\u00E7\u00E3o
dataSource_scheduledOperations_field_resource = Recurso
-dataSource_scheduledOperations_field_time = Data/Hora
dataSource_schedules_disableFailure_group = Falha ao desabilitar a coleta de m\u00E9tricas de [{0}] para o grupo de recursos com ID [{1}]. As m\u00E9tricas eram: [{2}]
dataSource_schedules_disableFailure_resource = Falha ao desabilitar a coleta de m\u00E9tricas de [{0}] para o recurso com ID [{1}]. As m\u00E9tricas eram: [{2}]
dataSource_schedules_disableSuccessful_concise = Voc\u00EA desabilitou a coleta de m\u00E9tricas de [{0}]
@@ -363,14 +353,11 @@ dataSource_users_field_id = ID
dataSource_users_field_lastName = \u00DAltimo Nome
dataSource_users_field_ldap = LDAP Login?
dataSource_users_field_name = Nome do Usu\u00E1rio
-dataSource_users_field_password = Senha
dataSource_users_field_passwordVerify = Verifique a Senha
dataSource_users_field_phoneNumber = N\u00FAmero de Telefone
dataSource_users_invalidEmailAddress = Endere\u00E7o de email inv\u00E1lido.
dataSource_users_passwordsDoNotMatch = Senhas n\u00E3o conferem.
datasource_roles_field_ldapGroups = Grupos LDAP
-datasource_roles_field_permissions = Permiss\u00F5es
-datasource_roles_field_resourceGroups = Grupos de Recurso
datasource_roles_field_subjects = Subjects
datasource_templateSchedules_disabled = Desabilitar a coleta da m\u00E9trica selecionada [{0}].
datasource_templateSchedules_disabled_detailed = Desabilitar a coleta da m\u00E9trica [{0}] [{1}] para o Tipo de Recurso com id [{2}].
@@ -409,7 +396,6 @@ view_adminConfig_plugins = Plugins
view_adminConfig_systemSettings = Propriedades de Sistema
view_adminConfig_templates = Templates
view_adminContent_contentSources = Fontes de Conte\u00FAdo
-view_adminContent_repositories = Reposit\u00F3rios
view_adminRoles_assignedGroups = Grupos de Recursos Associados
view_adminRoles_assignedSubjects = Perfis Associados
view_adminRoles_failLdap = Falha ao determinar se o LDAP foi configurado - assumindo como LDAP n\u00E3o configurado.
@@ -419,7 +405,6 @@ view_adminRoles_failRoles = Falha ao recuperar perfis.
view_adminRoles_globalPerms = Permiss\u00F5es Globais
view_adminRoles_ldapGroups = Grupos LDAP
view_adminRoles_ldapGroupsReadOnly = Informa\u00E7\u00F5es do grupo LDAP com permiss\u00F5es apenas de leitura
-view_adminRoles_noItems = Sem itens para apresentar
view_adminRoles_noLdap = A integra\u00E7\u00E3o com o LDAP ainda n\u00E3o foi configurada. Para configurar o LDAP acesse <a {0}>{1}</a>.
view_adminRoles_permissions_autoselecting_configureRead_implied = Autodeselected CONFIGURE_WRITE permission, since lack of CONFIGURE_READ implies lack of it...
view_adminRoles_permissions_autoselecting_configureWrite_implied = Autoselected CONFIGURE_READ permission, since CONFIGURE_WRITE implies it...
@@ -454,7 +439,7 @@ view_adminRoles_permissions_permWriteDesc_deleteChildResources = uninventory res
view_adminRoles_permissions_permWriteDesc_inventory = update Resource name, version, description, and connection settings; delete connection settings history items
##view_adminRoles_permissions_permWriteDesc_manageAlerts = create, update, and delete alert definitions; acknowledge and delete alert history items
view_adminRoles_permissions_permWriteDesc_manageContent = subscribe to content sources; install and uninstall packages
-##view_adminRoles_permissions_permWriteDesc_manageDrift = create, update, and delete alert definitions; acknowledge and delete alert history items
+##view_adminRoles_permissions_permWriteDesc_manageDrift = create, update, and delete drift definitions; and manage drift instances
view_adminRoles_permissions_permWriteDesc_manageEvents = delete events
view_adminRoles_permissions_permWriteDesc_manageMeasurements = update metric collection schedules
view_adminRoles_permissions_perm_configure = Configurar
@@ -476,7 +461,6 @@ view_adminRoles_permissions_read = Leitura:
view_adminRoles_permissions_readAccessImplied = Acesso de leitura para a permiss\u00E3o {0} \u00E9 impl\u00EDcita e n\u00E3o pode ser desabilitada.
view_adminRoles_permissions_resourcePermissions = Permiss\u00F5es de Recurso
view_adminRoles_permissions_write = Escrita:
-view_adminRoles_perms = Permiss\u00F5es
view_adminRoles_resourcePerms = Permiss\u00F5es do Recurso
view_adminRoles_roleAdded = Perfil [{0}] adicionado.
view_adminRoles_roleDeleteFailed = Falha ao excluir o perfil [{0}].
@@ -484,8 +468,6 @@ view_adminRoles_roleDeleted = Perfil [{0}] exclu\u00EDdo.
view_adminRoles_roleExists = O perfil com nome [{0}] j\u00E1 existe.
view_adminRoles_roleUpdateFailed = Falha ao atualizar o perfil [{0}].
view_adminRoles_roleUpdated = Perfil [{0}] atualizado.
-view_adminSecurity_roles = Perfis
-view_adminSecurity_users = Usu\u00E1rios
view_adminTemplates_disabledAlertTemplates = Templates de Alerta Desabilitados
view_adminTemplates_disabledMetricTemplates = Templates de M\u00E9trica Desabilitados
view_adminTemplates_editAlertTemplate = Editar Template de Alerta
@@ -505,8 +487,6 @@ view_adminTopology_partitionEvents = Eventos na Parti\u00E7\u00E3o
view_adminTopology_remoteAgentInstall = Instala\u00E7\u00E3o Remota de Agentes
view_adminTopology_servers = Servidores
view_adminUsersDetails_dataTypeName = usu\u00E1rio
-view_adminUsersList_dataTypeName = usu\u00E1rio
-view_adminUsersList_dataTypeNamePlural = usu\u00E1rios
view_admin_administration = Administra\u00E7\u00E3o
view_admin_configuration = Configura\u00E7\u00E3o
view_admin_content = Conte\u00FAdo
@@ -573,7 +553,7 @@ view_admin_systemSettings_LDAPBaseDN_name = Search Base
view_admin_systemSettings_LDAPBindDN_desc = The username to connect to the LDAP server when querying the LDAP user database. This is typically the full LDAP distinguished name (DN) of a manager user, e.g. cn = Manager,dc = redhat,dc = com
view_admin_systemSettings_LDAPBindDN_name = Username
view_admin_systemSettings_LDAPBindPW_desc = The credentials of the user used to connect to the LDAP server when querying the LDAP user database.
-view_admin_systemSettings_LDAPBindPW_name = Password
+view_admin_systemSettings_LDAPBindPW_name = Senha
view_admin_systemSettings_LDAPFilter_desc = Any additional filters to apply when doing the LDAP search. This is useful if the population to authenticate can be identified via a given LDAP property, e.g. RHQUser = true
view_admin_systemSettings_LDAPFilter_name = Search Filter
view_admin_systemSettings_LDAPGroupFilter_desc = LDAP search filter that must return all LDAP groups available for authorization. This is used for LDAP group authorization.
@@ -624,8 +604,8 @@ view_alert_common_tab_conditions_type_availability = Mudan\u00E7a na Disponibili
view_alert_common_tab_conditions_type_availability_down = Indispon\u00EDvel
view_alert_common_tab_conditions_type_availability_up = Dispon\u00EDvel
##view_alert_common_tab_conditions_type_drift = Drift Detection
-##view_alert_common_tab_conditions_type_drift_configpaths = Drift Detection for files that match "{0}" and for drift configuration [{1}]
-##view_alert_common_tab_conditions_type_drift_onlyconfig = Drift Detection for drift configuration [{0}]
+##view_alert_common_tab_conditions_type_drift_configpaths = Drift Detection for files that match "{0}" and for drift definition [{1}]
+##view_alert_common_tab_conditions_type_drift_onlyconfig = Drift Detection for drift definition [{0}]
##view_alert_common_tab_conditions_type_drift_onlypaths = Drift Detection for files that match "{0}"
view_alert_common_tab_conditions_type_event = Detec\u00E7\u00E3o de Envento
view_alert_common_tab_conditions_type_event_matching = combinando com o evento de origem
@@ -648,7 +628,6 @@ view_alert_common_tab_conditions_type_metric_trait_change = Mudan\u00E7a de Cara
view_alert_common_tab_conditions_type_operation = Execu\u00E7\u00E3o de Opera\u00E7\u00E3o
view_alert_common_tab_conditions_type_operation_status = resultado com status
view_alert_common_tab_conditions_type_resource_configuration = Mudan\u00E7a na Configura\u00E7\u00E3o do Recurso
-view_alert_common_tab_conditions_value = Valor
view_alert_common_tab_dampening = Sensibilidade
view_alert_common_tab_dampening_category_consecutive_count = Consecutivos
view_alert_common_tab_dampening_category_consecutive_count_tooltip = Um alerta \u00E9 disparado a cada X ocorr\u00EAncias consecutivas em que o conjunto de condi\u00E7\u1E4Des for satisfeito.
@@ -687,19 +666,14 @@ view_alert_definition_condition_editor_common_avg = M\u00E9dio
view_alert_definition_condition_editor_common_max = M\u00E1ximo
view_alert_definition_condition_editor_common_min = M\u00EDnimo
view_alert_definition_condition_editor_delete_confirm = Delete the selected alert condition(s)?
-##view_alert_definition_condition_editor_drift_configname_regex = Drift Configuration Name
-##view_alert_definition_condition_editor_drift_configname_regex_tooltip = If specified, this is the drift configuration name that was responsible for the drift that was detected. This can optionally be a regular expression if you wish to match multiple drift configuration names.
+##view_alert_definition_condition_editor_drift_configname_regex = Drift Definition Name
+##view_alert_definition_condition_editor_drift_configname_regex_tooltip = If specified, this is the drift definition name that was responsible for the drift that was detected. This can optionally be a regular expression if you wish to match multiple drift definition names.
##view_alert_definition_condition_editor_drift_pathname_regex = Pathname Regular Expression
##view_alert_definition_condition_editor_drift_pathname_regex_tooltip = If specified, this is a regular expression that must match the pathnames of those files that drifted.
##view_alert_definition_condition_editor_drift_tooltip = This condition is triggered when drift has been detected.
view_alert_definition_condition_editor_event_regex = Express\u00E3o Regular
view_alert_definition_condition_editor_event_regex_tooltip = Se definida, a condi\u00E7\u00E3o somente ser\u00E1 disparada caso o evento satisfa\u00E7a a express\u00E3o.
view_alert_definition_condition_editor_event_severity = Severidade do Evento
-view_alert_definition_condition_editor_event_severity_debug = Debug
-view_alert_definition_condition_editor_event_severity_error = Error
-view_alert_definition_condition_editor_event_severity_fatal = Fatal
-view_alert_definition_condition_editor_event_severity_info = Info
-view_alert_definition_condition_editor_event_severity_warn = Warn
view_alert_definition_condition_editor_event_tooltip = Define a severeidade do evento para disparar a condi\u00E7\u00E3o. Caso seja definida uma express\u00E3o regular, a condi\u00E7\u00E3o somente ser\u00E1 disparada se o evento satisfazer a express\u00E3o.
view_alert_definition_condition_editor_metric_baseline_percentage = Percentual da linha de base
view_alert_definition_condition_editor_metric_baseline_percentage_tooltip = Valor da m\u00E9trica coletada usada para disparo da condi\u00E7\u00E3o quando comparado ao valor da linha de base selecionada
@@ -748,12 +722,7 @@ view_alert_definition_condition_editor_metric_trait_change_tooltip = Specify the
view_alert_definition_condition_editor_metric_trait_change_value = Caracter\u00EDstica
##view_alert_definition_condition_editor_metricswarning = You cannot have multiple conditions that use the same metric when using the ALL conjunction. This alert definition has multiple conditions that use the metric [{0}].
view_alert_definition_condition_editor_operation_status = Status da Opera\u00E7\u00E3o
-view_alert_definition_condition_editor_operation_status_canceled = Cancelada
-view_alert_definition_condition_editor_operation_status_failure = Falha
-view_alert_definition_condition_editor_operation_status_inprogress = Em andamento
-view_alert_definition_condition_editor_operation_status_success = Sucesso
view_alert_definition_condition_editor_operation_tooltip = Define o resultado esperado quando a opera\u00E7\u00E3o selecionada for executada para dispararo da confi\u00E7\u00E3o.
-view_alert_definition_condition_editor_operation_value = Opera\u00E7\u00E3o
view_alert_definition_condition_editor_option_availability = Mudan\u00E7a de Disponibilidade
##view_alert_definition_condition_editor_option_drift = Drift Detection
view_alert_definition_condition_editor_option_event = Detec\u00E7\u00E3o de Evento
@@ -890,22 +859,17 @@ view_autoDiscoveryQ_deleted = Exclu\u00EDdo
view_autoDiscoveryQ_deselectAll = Desmarcar todos
view_autoDiscoveryQ_field_discoveryTime = Data e Hora da Descoberta
view_autoDiscoveryQ_field_inventoryStatus = Status do Invet\u00E1rio
-view_autoDiscoveryQ_field_key = Chave do Recurso
-view_autoDiscoveryQ_field_name = Nome do Recurso
view_autoDiscoveryQ_field_parentId = ID Pai
view_autoDiscoveryQ_ignore = Ignorar
view_autoDiscoveryQ_ignoreFailure = Falha ao ignorar recursos.
view_autoDiscoveryQ_ignoreInProgress = Ignorando recursos selecionados...
view_autoDiscoveryQ_ignoreSuccessful = Os recursos selecionados foram ignorados com sucesso.
view_autoDiscoveryQ_ignored = Ignorado
-view_autoDiscoveryQ_import = Importar
view_autoDiscoveryQ_importFailure = Falha ao importar recursos
view_autoDiscoveryQ_importInProgress = Importando recursos selecionados...
view_autoDiscoveryQ_importSuccessful = Os recursos selecionados foram importados com sucesso.
view_autoDiscoveryQ_loadFailure = Falha ao carregar a fila de descoberta do invent\u00E1rio
-view_autoDiscoveryQ_new = Novo
view_autoDiscoveryQ_newAndIgnored = Novo e Ignorado
-view_autoDiscoveryQ_noItems = N\u00E3o h\u00E1 itens a serem mostrados
view_autoDiscoveryQ_noperm = (Requer permiss\u00E3o para gerenciar o Inevnt\u00E1rio. Contacte o Administrador para realizar a altera\u00E7\u00E3o)
view_autoDiscoveryQ_selectAll = Selecionar todos
view_autoDiscoveryQ_showStatus = Mostrar
@@ -1172,40 +1136,40 @@ view_dashboards_portlets_refresh_one_min = 1 minuto
view_dashboards_portlets_refresh_success1 = Intervalo de atualiza\u00E7\u00E3o dos portlets din\u00E2micos alterado com sucesso
view_dashboards_portlets_refresh_success2 = Parando a atualiza\u00E7\u00E3o autom\u00E1tica dos portlets din\u00E2micos
view_dashboards_title = Dashboard
-##view_drift = Drift
-##view_drift_button_detectNow = Detectar agora
-##view_drift_category_fileAdded = Arquivo adicionado
-##view_drift_category_fileChanged = Arquivo alterado
+view_drift_button_detectNow = Detectar agora
+view_drift_category_fileAdded = Arquivo adicionado
+view_drift_category_fileChanged = Arquivo alterado
+##view_drift_category_fileNew = Newly Detected
##view_drift_category_fileRemoved = Arquivo removido
-##view_drift_changeSets = Change Sets
-##view_drift_changeSets_resourceViewTitle = Resource Drift Change Sets
-##view_drift_delete_configConfirm = Delete the selected drift configuration(s)?
-##view_drift_delete_configConfirmAll = Delete all drift configurations?
-##view_drift_failure_deleteConfigs = Failed to delete some or all drift configurations.
-##view_drift_failure_detectNow = Falha ao submeter a requisiᅵᅵo de detecᅵᅵo do drift
-##view_drift_failure_load = Falha ao recuperar os dados do drift
-##view_drift_success_configurationUpdated = Configuraᅵᅵo do drift atualizada. O arquivo de cobertura serᅵ atualizado na prᅵxima varredura de detecᅵᅵo.
-##view_drift_success_delete = Drifts {0} excluï¿œdos com sucesso!
-##view_drift_success_deleteConfigs = Configuraᅵᅵes do drift {0} excluᅵdas com sucesso!
-##view_drift_success_detectNow = Requisiᅵᅵo de detecᅵᅵo de drift submetida com sucesso.
+##view_drift_delete_configConfirm = Delete the selected drift detection definition(s)?
+##view_drift_delete_configConfirmAll = Delete all drift detection definition?
+##view_drift_failure_deleteDefs = Failed to delete some or all drift detection definitions.
+view_drift_failure_detectNow = Falha ao submeter a requisiᅵᅵo de detecᅵᅵo do drift
+view_drift_failure_load = Falha ao recuperar os dados do drift
+##view_drift_snapshots = Snapshots
+##view_drift_snapshots_resourceViewTitle = Resource Drift Snapshots
+##view_drift_snapshots_tree_loadDefFailure = Failed to load drift detection definition for snapshot id [{0}]
+##view_drift_snapshots_tree_loadFailure = Failed to load drift snapshot tree.
+##view_drift_success_defUpdated = Drift detection definition updated and will affect the next detection run as applicable.
+view_drift_success_delete = Drifts {0} excluï¿œdos com sucesso!
+##view_drift_success_deleteConfigs = Successfully deleted {0} drift detection definitions
+view_drift_success_detectNow = Requisiᅵᅵo de detecᅵᅵo de drift submetida com sucesso.
##view_drift_table_baseDir = Diretï¿œrio Base
-##view_drift_table_changeSet = Change Set
##view_drift_table_driftHandlingMode = Drift Handling
##view_drift_table_driftHandlingMode_normal = normal
##view_drift_table_driftHandlingMode_plannedChanges = planned changes
##view_drift_table_newFile = Novo Arquivo
##view_drift_table_oldFile = Arquivo Antigo
-##view_drift_table_resourceConfig = Configuraᅵᅵo de Drift do Recurso
+##view_drift_table_resourceDef = Resource Drift Detection Definition
##view_drift_table_resourceHistory = Histï¿œrico de Drift do Recurso
-##view_drift_wizard_addConfig_failure = Falha ao adicionar nova configuraᅵᅵo de drift [{0}]
-##view_drift_wizard_addConfig_infoStepName = Provide Drift Detection Information\nForneᅵa a informaᅵᅵo para detecᅵᅵo do drift
-##view_drift_wizard_addConfig_nameHelp = Um nome que descreve de forma objetiva o propᅵsito desta configuraᅵᅵo de drift de detecᅵᅵo. Nomes de configuraᅵᅵo de drift devem ser ᅵnicos para um determinado recurso.
-##view_drift_wizard_addConfig_namePrompt = Novo nome para configuraᅵᅵo do drift
-##view_drift_wizard_addConfig_success = Nova configuraᅵᅵo de drift incluᅵda com sucesso [{0}]. O(s) agente(s) serᅵ(ᅵo) atualizado(s).
-##view_drift_wizard_addConfig_templateHelp = Cada configuraᅵᅵo de drift define um conjunto de arquivos no qual a detecᅵᅵo serᅵ aplicada. A configuraᅵᅵo pode ser habilitada ou desabilitada, define um intervalo de detecᅵᅵo, e especifica um diretᅵrio raiz e filtros opcionais. Para cada tipo de recurso com suporte a detecᅵᅵo de drift existe um ou mais templates prᅵ-definidos para usar como ponto de partida e que podem ser editados posteriormente.
-##view_drift_wizard_addConfig_templatePrompt = Templates de configuraᅵᅵo de Drift
-##view_drift_wizard_addConfig_title = Incluir Configuraᅵᅵo de Drift para o Tipo de Recurso [{0}]
-##view_drift_wizard_addConfig_windowTitle = Assistente de Configuraᅵᅵo de Drift
+##view_drift_table_snapshot = Snapshot
+##view_drift_wizard_addDef_failure = Failed to add new drift detection definition [{0}]
+view_drift_wizard_addDef_infoStepName = Forneᅵa a informaᅵᅵo para detecᅵᅵo do drift
+##view_drift_wizard_addDef_success = Successfully added new drift detection definition [{0}]. Agent(s) will be updated.
+##view_drift_wizard_addDef_templateHelp = Each drift detection definition describes a set of files for which drift monitoring will be performed. The definition can be enabled and disabled, defines the detection run interval, and specifies a base directory and optional file filters. For each resource type offering drift detection there will be one or more predefined templates to use as a starting definition, which can then be edited.
+##view_drift_wizard_addDef_templatePrompt = Drift Detection Definition Templates
+##view_drift_wizard_addDef_title = Add Drift Detection Definition for Resource of Type [{0}]
+##view_drift_wizard_addDef_windowTitle = Drift Add Detection Definition Wizard
view_dynagroup_children = Grupo Dinï¿œmico Filho
view_dynagroup_compatible = Compï¿œtivel
view_dynagroup_definitionAlreadyExists = Jᅵ existe uma definiᅵᅵo de grupo com este nome
@@ -1428,7 +1392,6 @@ view_inventory_groups_deleteFailed = Failed to delete the selected resource grou
view_inventory_groups_deleteSuccessful = You have successfully deleted the selected resource groups
view_inventory_groups_descendants = Descendants
view_inventory_groups_loadFailed = Failed to load group composite data
-view_inventory_groups_resourceGroups = Resource Groups
view_inventory_mixed = mixed
view_inventory_platforms = Platforms
view_inventory_problemGroups = Problem Groups
@@ -1437,9 +1400,7 @@ view_inventory_resources_deleteConfirm = Are you sure you want to delete the sel
view_inventory_resources_deleteFailed = Failed to delete the selected resources
##view_inventory_resources_deleteSuccessful = A request to perform the resource deletion has been submitted successfully to the agent(s).
view_inventory_resources_loadFailed = Failed to load resource composite data
-view_inventory_resources_title = Recursos membros
-view_inventory_resources_title_children = Child Resources
-view_inventory_resources_title_members = Member Resources
+##view_inventory_resources_members = Member Resources
view_inventory_resources_uninventoryConfirm = Are you sure you want to uninventory the selected resources? Note that if a selected resource still exists, then it will get rediscovered during its agent''s next discovery scan.
view_inventory_resources_uninventoryFailed = Failed to uninventory the selected resources
view_inventory_resources_uninventorySuccessful = You have successfully uninventoried the selected resources
@@ -1466,7 +1427,6 @@ view_login_prompt = Favor efetuar Login
view_login_registerLater = (Sair - Concluir registro mais tarde.)
view_login_registerLdapSuccess = Novo usu\u00E1rios do LDAP registrado com sucesso.
view_login_registerUser = Registrar Usu\u00E1rio
-view_login_welcome = Bem Vindo
view_login_welcomeMsg = Seja Bem Vindo ao JBoss ON! <br/><br/> Informe ou altere os seguintes campos para completar o processo de registro.<br/> Clique em "OK" para acessar o sistema.<br/><br/>
view_measureRange_day = 1 Dia
view_measureRange_days = {0} Dias
@@ -1583,7 +1543,6 @@ view_portlet_defaultName_operations = Recent Operations
view_portlet_defaultName_platformSummary = Platform Utilization
view_portlet_defaultName_problemResources = Alerted or Unavailable Resources
view_portlet_defaultName_recentAlerts = Recent Alerts
-##view_portlet_defaultName_recentDrifts = Recent Drifts
view_portlet_defaultName_recentlyAddedResources = Recently Added Resources
view_portlet_defaultName_resourceMetric = Resource Metric Graph
view_portlet_defaultName_resource_alerts = Resource: Alerts
@@ -1594,7 +1553,6 @@ view_portlet_defaultName_resource_metrics = Resource: Measurements
view_portlet_defaultName_resource_oobs = Resource: OOB Metrics
view_portlet_defaultName_resource_operations = Resource: Operations
view_portlet_defaultName_resource_pkg_hisory = Resource: Package History
-view_portlet_defaultName_tagCloud = Tag Count
view_portlet_factory_invalidPortlet = This is an obsolete portlet that is no longer valid. Please delete it.
view_portlet_favoriteResources_msg = This portlet displays your favorite resources
view_portlet_favoriteResources_title = Favorite Resources
@@ -1747,7 +1705,6 @@ view_resource_monitor_calltime_lookupFailed = Could not load resource for call t
view_resource_monitor_calltime_maximum = Maximum
view_resource_monitor_calltime_minimum = Minimum
view_resource_monitor_calltime_title = Call Time Data
-view_resource_monitor_calltime_total = Total
view_resource_monitor_detailed_graph_label = Detailed Graph
view_resource_monitor_graph_instructions = Point your mouse to a data point on the chart
view_resource_monitor_graph_live_tooltip = Click for a live graph of current values
@@ -1755,7 +1712,6 @@ view_resource_monitor_graphs_loadFailed = Failed to load graph data
view_resource_monitor_graphs_lookupFailed = Failed to find resource for graph
view_resource_monitor_graphs_noneAvailable = No graphs available
view_resource_monitor_schedules_title = Resource Metric Collection Schedules
-view_resource_monitor_table_alerts = Alerts
view_resource_monitor_table_avg = Average
view_resource_monitor_table_last = Last
view_resource_monitor_table_max = Maximum
@@ -1790,7 +1746,6 @@ view_summaryOverviewForm_field_type = Type
view_summaryOverviewForm_field_version = Version
view_summaryOverviewForm_header_summary = Summary
view_summaryOverviewForm_label_plugin = Plugin:
-view_summaryOverviewForm_label_type = Type:
view_summaryOverviewForm_message_descriptionChangeSuccess = Description of Resource with id {0} was changed from [{1}] to [{2}].
view_summaryOverviewForm_message_locationChangeSuccess = Location of Resource with id {0} was changed from [{1}] to [{2}].
view_summaryOverviewForm_message_nameChangeSuccess = Name of Resource with id {0} was changed from [{1}] to [{2}].
@@ -1805,18 +1760,15 @@ view_table_matchingRows = Matching Rows: {0} (selected: {1})
view_table_totalRows = Total de Linhas: {0} (selecionada: {1})
view_tabs_common_activity = Activity
view_tabs_common_agent = Agent
-view_tabs_common_alerts = Alerts
view_tabs_common_availability = Availability
view_tabs_common_calltime = Calltime
view_tabs_common_child_history = Child History
view_tabs_common_child_resources = Child Resources
-view_tabs_common_configuration = Configuration
view_tabs_common_connectionSettings = Connection Settings
view_tabs_common_connectionSettingsHistory = Connection Settings History
view_tabs_common_content = Content
view_tabs_common_current = Current
view_tabs_common_dashboard = Dashboard
-view_tabs_common_definitions = Definitions
view_tabs_common_deployed = Deployed
##view_tabs_common_drift = Drift
view_tabs_common_events = Events
@@ -1828,14 +1780,11 @@ view_tabs_common_history = History
view_tabs_common_inventory = Inventory
view_tabs_common_members = Members
view_tabs_common_monitoring = Monitoring
-view_tabs_common_new = New
-view_tabs_common_operations = Operations
view_tabs_common_overview = Overview
view_tabs_common_schedule = Schedule
view_tabs_common_scheduled = Scheduled
view_tabs_common_schedules = Schedules
view_tabs_common_subscriptions = Subscriptions
-view_tabs_common_summary = Summary
view_tabs_common_tables = Tables
view_tabs_common_timeline = Timeline
view_tabs_common_traits = Traits
@@ -1846,7 +1795,6 @@ view_tagCloud_deleteTagFailure = Failed to delete the tag [{0}]
view_tagCloud_deleteTagSuccess = You successfully deleted the tag [{0}]
view_tagCloud_error_fetchFailure = Falha ao carregar etiquetas (tags).
view_tagCloud_error_tagUsedCount = Etiqueta (tag) usada {0} vezes.
-view_tagCloud_title = Nuvem de Tags
view_taggedResources_title = Recursos Etiquetados
view_tags_error_1 = Failed to load Tags
view_tags_tags = Tags
@@ -1878,9 +1826,8 @@ view_tree_common_contextMenu_loadFail_dashboards = Failed to load user dashboard
view_tree_common_contextMenu_loadFail_group = Failed to load group for context menu
view_tree_common_contextMenu_loadFailed_dashboard = Failed to load user dashboards
view_tree_common_contextMenu_loadFailed_manualAddChildren = Failed to load platform manual add children
+view_tree_common_contextMenu_loadFailed_operations = Failure to start wizard for running operations
view_tree_common_contextMenu_measurements = Measurements
-view_tree_common_contextMenu_operations = Operations
-view_tree_common_contextMenu_operations_loadFailed = Failure to start wizard for running operations
view_tree_common_contextMenu_pluginConfiguration = Plugin Configuration
view_tree_common_contextMenu_resourceConfiguration = Resource Configuration
view_tree_common_contextMenu_resourceGraph = Resource Metric Graph
@@ -1960,7 +1907,6 @@ widget_recordEditor_info_recordUpdatedConcise = {0} atualizado.
widget_recordEditor_info_recordUpdatedDetailed = {0} [{1}] atualizado.
widget_recordEditor_info_recordsDeletedConcise = {0} {1} exclu\u00EDdo.
widget_recordEditor_info_recordsDeletedDetailed = {0} {1} exclu\u00EDdo: {2}.
-widget_recordEditor_label_loading = Carregar...
widget_recordEditor_title_edit = Editar {0} [{1}]
widget_recordEditor_title_new = Criar Novo {0}
widget_recordEditor_title_view = Visualizar {0} [{1}]
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
index c0b06b3..1905e96 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
@@ -51,33 +51,27 @@ common_calendar_may_short = \u4e94\u6708
common_calendar_november_short = \u5341\u4e00\u6708
common_calendar_october_short = \u5341\u6708
common_calendar_september_short = \u4e5d\u6708
-common_label_ago = ago
+##common_label_ago = ago
common_label_all = \u6240\u6709
common_label_all_resources = \u6240\u6709\u8d44\u6e90
common_label_day = \u5929
-common_label_days = \u5929
common_label_hour = \u5c0f\u65f6
-common_label_hours = \u5c0f\u65f6
common_label_item = \u9879
common_label_items = \u9879
-common_label_milliseconds = \u6beb\u79d2
-common_label_minutes = \u5206\u949f
common_label_month = \u6708
common_label_none = \u65e0
common_label_role = \u89d2\u8272
common_label_roles = \u89d2\u8272
common_label_scheduled_operations = \u8ba1\u5212\u64cd\u4f5c
-common_label_seconds = \u79d2
common_label_selected_resources = \u5df2\u9009\u8d44\u6e90
common_label_unlimited = \u65e0\u9650\u5236
common_label_user = \u7528\u6237
common_label_users = \u7528\u6237
common_label_week = \u5468
-common_label_weeks = \u5468
common_label_yesterday = \u6628\u5929
common_msg_areYouSure = \u4f60\u786e\u5b9a?
common_msg_asyncTimeout = {0}. \u56e0\u4e3a\u670d\u52a1\u5668\u54cd\u5e94\u65f6\u95f4\u592a\u957f. \u8bf7\u6ce8\u610f\u670d\u52a1\u5668\u53ef\u80fd\u4ecd\u5728\u5904\u7406\u60a8\u7684\u8bf7\u6c42\uff0c\u5e76\u53ef\u80fd\u5728\u77ed\u671f\u5185\u5b8c\u6210. \u4f60\u53ef\u4ee5\u68c0\u67e5\u670d\u52a1\u5668\u65e5\u5fd7\uff0c\u67e5\u770b\u662f\u5426\u51fa\u73b0\u4efb\u4f55\u4e0d\u6b63\u5e38\u7684\u9519\u8bef.
-common_msg_changeAutoDetected = Change auto-detected
+##common_msg_changeAutoDetected = Change auto-detected
common_msg_deleteConfirm = \u4f60\u786e\u5b9a\u8981\u5220\u9664# selected {0}?
common_msg_emphasizedNotePrefix = \u6ce8\u610f:
common_msg_loading = \u52a0\u8f7d\u4e2d...
@@ -86,7 +80,7 @@ common_msg_notYetImplemented = \u5c1a\u672a\u5b9e\u73b0
common_msg_see_more = \u67e5\u770b\u66f4\u591a...
common_msg_step_x_of_y = Step {0} of {1}
common_severity_debug = \u8c03\u8bd5
-common_severity_error = \u9519\u8bef
+common_severity_error = Error
common_severity_fatal = \u4e25\u91cd
common_severity_info = \u4fe1\u606f
common_severity_warn = \u8b66\u544a
@@ -103,7 +97,8 @@ common_title_add_column = \u6dfb\u52a0\u5217
common_title_add_graph_to_view = \u6dfb\u52a0\u56fe\u5230\u76d1\u89c6\u89c6\u56fe
common_title_add_portlet = \u6dfb\u52a0Portlet
common_title_address = \u5730\u5740
-common_title_alert_range = \u544a\u8b66\u8303\u56f4
+common_title_alerts = \u544a\u8b66
+common_title_alerts_range = \u544a\u8b66\u8303\u56f4
common_title_ancestry = \u7956\u5148
common_title_availability = \u53ef\u7528\u6027
common_title_available_resources = \u53ef\u7528\u7684\u8d44\u6e90
@@ -126,6 +121,8 @@ common_title_dashboard_name = \u7edf\u8ba1\u8868\u76d8\u540d
common_title_dateCreated = \u521b\u5efa\u65e5\u671f
common_title_dateRange = \u65e5\u671f\u8303\u56f4
common_title_default = \u9ed8\u8ba4
+##common_title_definition = Definition
+common_title_definitions = \u5b9a\u4e49
common_title_description = \u63cf\u8ff0
common_title_details = \u8be6\u7ec6
common_title_display = \u663e\u793a
@@ -134,7 +131,6 @@ common_title_duration = \u95f4\u9694
common_title_edit_mode = \u7f16\u8f91\u6a21\u5f0f
common_title_enabled = \u542f\u7528?
common_title_end = End
-common_title_error = Error
common_title_generalProp = \u57fa\u672c\u5c5e\u6027
common_title_group = \u7ec4
common_title_group_def_total = \u5b9a\u4e49\u7ec4\u603b\u6570
@@ -144,7 +140,6 @@ common_title_help = \u5e2e\u52a9
common_title_host = \u4e3b\u673a
common_title_id = ID
common_title_id_parent = \u7236ID
-common_title_info = \u4fe1\u606f
common_title_inventory = \u6e05\u5355
common_title_inventorySummary = \u6e05\u5355\u6c47\u603b
common_title_lastUpdated = \u6700\u8fd1\u66f4\u65b0
@@ -161,6 +156,7 @@ common_title_name = \u540d\u79f0
common_title_new_dashboard = \u65b0\u5efa\u7edf\u8ba1\u8868\u76d8
common_title_numeric_metrics = \u6570\u5b57\u578b\u6307\u6807
common_title_numeric_type = \u6570\u5b57\u7c7b\u578b
+common_title_operation = \u64cd\u4f5c
common_title_operation_status = \u64cd\u4f5c\u72b6\u6001
common_title_operations = \u64cd\u4f5c
common_title_operations_range = \u64cd\u4f5c\u8303\u56f4
@@ -176,6 +172,7 @@ common_title_providers = \u63d0\u4f9b\u8005
common_title_recent_alerts = \u6700\u8fd1\u544a\u8b66
common_title_recent_bundle_deployments = \u6700\u8fd1\u53d1\u5e03Bundles
common_title_recent_configuration_updates = \u6700\u8fd1\u914d\u7f6e\u66f4\u65b0
+##common_title_recent_drifts = Recent Drift
common_title_recent_event_counts = \u6700\u8fd1\u4e8b\u4ef6\u6570
common_title_recent_measurements = \u6700\u8fd1\u76d1\u6d4b
common_title_recent_oob_metrics = \u6700\u8fd1\u8d85\u6807\u6307\u6807
@@ -282,14 +279,12 @@ dataSource_platforms_field_cpu = CPU
dataSource_platforms_field_memory = \u5185\u5b58
dataSource_platforms_field_swap = \u4ea4\u6362\u533a
dataSource_problemResources_error_fetchFailure = \u52a0\u8f7d\u544a\u8b66/\u4e0d\u53ef\u7528\u8d44\u6e90\u5931\u8d25.
-dataSource_problemResources_field_alerts = \u544a\u8b66
dataSource_problemResources_field_available = \u5f53\u524d\u53ef\u7528\u6027
dataSource_recentOperations_error_fetchFailure = \u52a0\u8f7d\u6700\u8fd1\u64cd\u4f5c\u5931\u8d25.
dataSource_recentOperations_field_location = \u4f4d\u7f6e
dataSource_recentOperations_field_operation = \u64cd\u4f5c
dataSource_recentOperations_field_resource = \u8d44\u6e90
dataSource_recentOperations_field_status = \u72b6\u6001
-dataSource_recentOperations_field_time = \u65e5\u671f/\u65f6\u95f4
dataSource_resourceErrors_clickStatusIcon = \u70b9\u51fb\u56fe\u6807\u67e5\u770b\u8be6\u60c5
dataSource_resourceErrors_deleteFailure = \u5220\u9664\u8d44\u6e90\u9519\u8bef\u5931\u8d25
dataSource_resourceErrors_deleteSuccess = \u6210\u529f\u5220\u9664\u8d44\u6e90[{0}]\u9519\u8bef\u4fe1\u606f.
@@ -313,7 +308,6 @@ dataSource_scheduledOperations_error_fetchFailure = \u65e0\u6cd5\u8f7d\u5165\u8b
dataSource_scheduledOperations_field_location = \u4f4d\u7f6e
dataSource_scheduledOperations_field_operation = \u64cd\u4f5c
dataSource_scheduledOperations_field_resource = \u8d44\u6e90
-dataSource_scheduledOperations_field_time = \u65e5\u671f/\u65f6\u95f4
dataSource_schedules_disableFailure_group = \u7981\u7528\u6307\u6807\u96c6[{0}]\u5931\u8d25 \u4e3a\u8d44\u6e90\u7ec4ID [{1}]. \u6307\u6807\u662f: [{2}]
dataSource_schedules_disableFailure_resource = \u7981\u7528\u6307\u6807\u96c6[{0}]\u5931\u8d25 \u4e3a\u8d44\u6e90ID [{1}]. \u6307\u6807\u662f: [{2}]
dataSource_schedules_disableSuccessful_concise = \u7981\u7528\u76d1\u6d4b\u96c6[{0}]\u6210\u529f
@@ -349,14 +343,11 @@ dataSource_users_field_id = ID
dataSource_users_field_lastName = \u59d3
dataSource_users_field_ldap = LDAP\u767b\u5f55?
dataSource_users_field_name = \u7528\u6237\u540d
-dataSource_users_field_password = \u5bc6\u7801
dataSource_users_field_passwordVerify = \u786e\u8ba4\u5bc6\u7801
dataSource_users_field_phoneNumber = \u7535\u8bdd\u53f7\u7801
dataSource_users_invalidEmailAddress = \u90ae\u7bb1\u5730\u5740\u65e0\u6548.
dataSource_users_passwordsDoNotMatch = \u5bc6\u7801\u4e0d\u5339\u914d.
datasource_roles_field_ldapGroups = LDAP\u7ec4
-datasource_roles_field_permissions = \u6743\u9650
-datasource_roles_field_resourceGroups = \u8d44\u6e90\u7ec4
datasource_roles_field_subjects = Subjects
datasource_templateSchedules_disabled = \u7981\u7528\u9009\u62e9\u7684\u6307\u6807[{0}]\u91c7\u96c6.
datasource_templateSchedules_disabled_detailed = Disabled collection of metric [{0}] [{1}] by default for ResourceType with id [{2}].
@@ -394,7 +385,6 @@ view_adminConfig_plugins = \u63d2\u4ef6
view_adminConfig_systemSettings = \u7cfb\u7edf\u8bbe\u7f6e
view_adminConfig_templates = \u6a21\u677f
view_adminContent_contentSources = Content\u6e90
-view_adminContent_repositories = \u5e93
view_adminRoles_assignedGroups = \u5206\u914d\u7684\u8d44\u6e90\u7ec4
view_adminRoles_assignedSubjects = \u5206\u914d\u7684\u4e3b\u9898
view_adminRoles_failLdap = \u65e0\u6cd5\u786e\u5b9aLDAP - \u5047\u5b9a\u6ca1\u6709LDAP.
@@ -404,7 +394,6 @@ view_adminRoles_failRoles = \u53d6\u5f97\u89d2\u8272\u5931\u8d25.
view_adminRoles_globalPerms = \u5168\u5c40\u6388\u6743
view_adminRoles_ldapGroups = LDAP\u7ec4
view_adminRoles_ldapGroupsReadOnly = LDAP\u7ec4\u6570\u636e\u4e3a\u53ea\u8bfb
-view_adminRoles_noItems = \u6ca1\u6709\u6761\u76ee\u663e\u793a
view_adminRoles_noLdap = \u6ca1\u6709\u96c6\u6210LDAP\u5b89\u5168, \u5230<a {0}>{1}</a>.
view_adminRoles_permissions_autoselecting_configureRead_implied = Autodeselected CONFIGURE_WRITE permission, since lack of CONFIGURE_READ implies lack of it...
view_adminRoles_permissions_autoselecting_configureWrite_implied = Autoselected CONFIGURE_READ permission, since CONFIGURE_WRITE implies it...
@@ -429,6 +418,7 @@ view_adminRoles_permissions_permReadDesc_deleteChildResources = (IMPLIED) \u67e5
view_adminRoles_permissions_permReadDesc_inventory = (IMPLIED) view Resource properties (name, description, version, etc.), connection settings, and connection settings history
view_adminRoles_permissions_permReadDesc_manageAlerts = (IMPLIED) \u67e5\u770b\u544a\u8b66\u5b9a\u4e49\u548c\u544a\u8b66\u5386\u53f2
view_adminRoles_permissions_permReadDesc_manageContent = (IMPLIED) \u67e5\u770b\u5b89\u88c5\u7684\u548c\u53ef\u7528\u7684\u5305; \u67e5\u770b\u5305\u5b89\u88c5\u5386\u53f2
+##view_adminRoles_permissions_permReadDesc_manageDrift = (IMPLIED) view drift definitions and drift history
view_adminRoles_permissions_permReadDesc_manageEvents = (IMPLIED)\u67e5\u770b\u4e8b\u4ef6
view_adminRoles_permissions_permReadDesc_manageMeasurements = (IMPLIED) view metric data and collection schedules
view_adminRoles_permissions_permWriteDesc_configure = \u66f4\u65b0\u8d44\u6e90\u914d\u7f6e; \u5220\u9664\u8d44\u6e90\u914d\u7f6e\u4fee\u8ba2\u7684\u5386\u53f2\u9879
@@ -438,6 +428,7 @@ view_adminRoles_permissions_permWriteDesc_deleteChildResources = uninventory res
view_adminRoles_permissions_permWriteDesc_inventory = \u66f4\u65b0\u8d44\u6e90\u540d, \u7248\u672c,\u63cf\u8ff0, \u548c\u8fde\u63a5\u8bbe\u7f6e; \u5220\u9664\u8fde\u63a5\u8bbe\u7f6e\u5386\u53f2\u9879
view_adminRoles_permissions_permWriteDesc_manageAlerts = \u521b\u5efa, \u66f4\u65b0, \u548c\u5220\u9664\u544a\u8b66\u5b9a\u4e49; \u786e\u8ba4\u548c\u5220\u9664\u5386\u53f2\u544a\u8b66\u9879
view_adminRoles_permissions_permWriteDesc_manageContent = \u8ba2\u9605\u5185\u5bb9\u6e90; \u5b89\u88c5\u5378\u8f7d\u5305
+##view_adminRoles_permissions_permWriteDesc_manageDrift = create, update, and delete drift definitions; and manage drift instances
view_adminRoles_permissions_permWriteDesc_manageEvents = \u5220\u9664\u4e8b\u4ef6
view_adminRoles_permissions_permWriteDesc_manageMeasurements = \u66f4\u65b0\u6307\u6807\u96c6\u8ba1\u5212\u4efb\u52a1
view_adminRoles_permissions_perm_configure = \u914d\u7f6e
@@ -448,6 +439,7 @@ view_adminRoles_permissions_perm_inventory = \u6e05\u5355
view_adminRoles_permissions_perm_manageAlerts = \u7ba1\u7406\u544a\u8b66
view_adminRoles_permissions_perm_manageBundles = \u7ba1\u7406Bundles
view_adminRoles_permissions_perm_manageContent = \u7ba1\u7406\u5185\u5bb9
+##view_adminRoles_permissions_perm_manageDrift = Manage Drift
view_adminRoles_permissions_perm_manageEvents = \u7ba1\u7406\u4e8b\u4ef6
view_adminRoles_permissions_perm_manageInventory = \u7ba1\u7406\u6e05\u5355
view_adminRoles_permissions_perm_manageMeasurements = \u7ba1\u7406\u6307\u6807
@@ -458,15 +450,12 @@ view_adminRoles_permissions_read = \u8bfb:
view_adminRoles_permissions_readAccessImplied = \u9ed8\u8ba4\u6709\u8bbf\u95ee{0}\u7684\u6743\u9650\u800c\u4e14\u65e0\u6cd5\u7981\u7528.
view_adminRoles_permissions_resourcePermissions = \u8d44\u6e90\u6388\u6743
view_adminRoles_permissions_write = \u5199:
-view_adminRoles_perms = \u6743\u9650
view_adminRoles_resourcePerms = \u8d44\u6e90\u6388\u6743
view_adminRoles_roleAdded = \u89d2\u8272[{0}]\u6dfb\u52a0.
view_adminRoles_roleDeleteFailed = \u5220\u9664\u89d2\u8272[{0}]\u5931\u8d25.
view_adminRoles_roleDeleted = \u89d2\u8272[{0}]\u5220\u9664.
view_adminRoles_roleUpdateFailed = \u4fee\u6539\u89d2\u8272[{0}]\u5931\u8d25.
view_adminRoles_roleUpdated = \u89d2\u8272[{0}]\u66f4\u65b0\u4e86.
-view_adminSecurity_roles = \u89d2\u8272
-view_adminSecurity_users = \u7528\u6237
view_adminTemplates_disabledAlertTemplates = \u7981\u7528\u544a\u8b66\u6a21\u677f
view_adminTemplates_disabledMetricTemplates = \u7981\u7528\u6307\u6807\u6a21\u677f
view_adminTemplates_editAlertTemplate = \u7f16\u8f91\u544a\u8b66\u6a21\u677f
@@ -486,8 +475,6 @@ view_adminTopology_partitionEvents = Partition\u4e8b\u4ef6
view_adminTopology_remoteAgentInstall = \u8fdc\u7a0b\u4ee3\u7406\u5b89\u88c5
view_adminTopology_servers = \u670d\u52a1\u5668
view_adminUsersDetails_dataTypeName = user
-view_adminUsersList_dataTypeName = user
-view_adminUsersList_dataTypeNamePlural = users
view_admin_administration = \u7ba1\u7406
view_admin_configuration = \u914d\u7f6e
view_admin_content = Content
@@ -607,8 +594,8 @@ view_alert_common_tab_conditions_type_availability = \u53ef\u7528\u6027\u6539\u5
view_alert_common_tab_conditions_type_availability_down = Went down
view_alert_common_tab_conditions_type_availability_up = Came up
##view_alert_common_tab_conditions_type_drift = Drift Detection
-##view_alert_common_tab_conditions_type_drift_configpaths = Drift Detection for files that match "{0}" and for drift configuration [{1}]
-##view_alert_common_tab_conditions_type_drift_onlyconfig = Drift Detection for drift configuration [{0}]
+##view_alert_common_tab_conditions_type_drift_configpaths = Drift Detection for files that match "{0}" and for drift definition [{1}]
+##view_alert_common_tab_conditions_type_drift_onlyconfig = Drift Detection for drift definition [{0}]
##view_alert_common_tab_conditions_type_drift_onlypaths = Drift Detection for files that match "{0}"
view_alert_common_tab_conditions_type_event = \u4e8b\u4ef6\u68c0\u6d4b
view_alert_common_tab_conditions_type_event_matching = with event source matching
@@ -631,7 +618,6 @@ view_alert_common_tab_conditions_type_metric_trait_change = \u7279\u5f81\u6539\u
view_alert_common_tab_conditions_type_operation = \u64cd\u4f5c\u6267\u884c
view_alert_common_tab_conditions_type_operation_status = with result status
view_alert_common_tab_conditions_type_resource_configuration = \u8d44\u6e90\u914d\u7f6e Change
-view_alert_common_tab_conditions_value = Value
view_alert_common_tab_dampening = Dampening
view_alert_common_tab_dampening_category_consecutive_count = \u8fde\u7eed
view_alert_common_tab_dampening_category_consecutive_count_tooltip = An alert is triggered once every X occurrences the condition set is true consecutively.
@@ -668,19 +654,14 @@ view_alert_definition_condition_editor_common_avg = \u5e73\u5747
view_alert_definition_condition_editor_common_max = \u6700\u5927
view_alert_definition_condition_editor_common_min = \u6700\u5c0f
view_alert_definition_condition_editor_delete_confirm = \u5220\u9664\u9009\u5b9a\u7684\u8b66\u62a5\u6761\u4ef6?
-##view_alert_definition_condition_editor_drift_configname_regex = Drift Configuration Name
-##view_alert_definition_condition_editor_drift_configname_regex_tooltip = If specified, this is the drift configuration name that was responsible for the drift that was detected. This can optionally be a regular expression if you wish to match multiple drift configuration names.
+##view_alert_definition_condition_editor_drift_configname_regex = Drift Definition Name
+##view_alert_definition_condition_editor_drift_configname_regex_tooltip = If specified, this is the drift definition name that was responsible for the drift that was detected. This can optionally be a regular expression if you wish to match multiple drift definition names.
##view_alert_definition_condition_editor_drift_pathname_regex = Pathname Regular Expression
##view_alert_definition_condition_editor_drift_pathname_regex_tooltip = If specified, this is a regular expression that must match the pathnames of those files that drifted.
##view_alert_definition_condition_editor_drift_tooltip = This condition is triggered when drift has been detected.
view_alert_definition_condition_editor_event_regex = \u6b63\u5219\u8868\u8fbe\u5f0f
view_alert_definition_condition_editor_event_regex_tooltip = If specified, this is a regular expression that must match a collected event message in order to trigger the condition.
view_alert_definition_condition_editor_event_severity = \u4e8b\u4ef6\u4e25\u91cd\u6027
-view_alert_definition_condition_editor_event_severity_debug = \u8c03\u8bd5
-view_alert_definition_condition_editor_event_severity_error = \u9519\u8bef
-view_alert_definition_condition_editor_event_severity_fatal = \u4e25\u91cd
-view_alert_definition_condition_editor_event_severity_info = \u4fe1\u606f
-view_alert_definition_condition_editor_event_severity_warn = \u8b66\u544a
view_alert_definition_condition_editor_event_tooltip = Specify the event severity that an event message must be reported with in order to trigger this condition. If you specify an optional regular expression, the event message must also match that regular expression in order for the condition to trigger.
view_alert_definition_condition_editor_metric_baseline_percentage = Baseline Percentage
view_alert_definition_condition_editor_metric_baseline_percentage_tooltip = A collected metric value will trigger this condition when compared to this percentage of the selected baseline value using the selected comparator
@@ -729,12 +710,7 @@ view_alert_definition_condition_editor_metric_trait_change_tooltip = Specify the
view_alert_definition_condition_editor_metric_trait_change_value = \u7279\u5f81
##view_alert_definition_condition_editor_metricswarning = You cannot have multiple conditions that use the same metric when using the ALL conjunction. This alert definition has multiple conditions that use the metric [{0}].
view_alert_definition_condition_editor_operation_status = \u64cd\u4f5c\u72b6\u6001
-view_alert_definition_condition_editor_operation_status_canceled = Canceled
-view_alert_definition_condition_editor_operation_status_failure = Failure
-view_alert_definition_condition_editor_operation_status_inprogress = \u8fdb\u884c\u4e2d
-view_alert_definition_condition_editor_operation_status_success = Success
view_alert_definition_condition_editor_operation_tooltip = Specify the result that must occur when the selected operation is executed in order to trigger the condition.
-view_alert_definition_condition_editor_operation_value = \u64cd\u4f5c
view_alert_definition_condition_editor_option_availability = \u53ef\u7528\u6027\u6539\u53d8
##view_alert_definition_condition_editor_option_drift = Drift Detection
view_alert_definition_condition_editor_option_event = \u4e8b\u4ef6\u68c0\u6d4b
@@ -869,22 +845,17 @@ view_autoDiscoveryQ_deleted = \u5220\u9664\u7684
view_autoDiscoveryQ_deselectAll = \u53d6\u6d88\u6240\u6709\u7684\u9009\u5b9a
view_autoDiscoveryQ_field_discoveryTime = \u53d1\u73b0\u65f6\u95f4
view_autoDiscoveryQ_field_inventoryStatus = \u6e05\u5355\u72b6\u6001
-view_autoDiscoveryQ_field_key = \u8d44\u6e90Key
-view_autoDiscoveryQ_field_name = \u8d44\u6e90\u540d\u79f0
view_autoDiscoveryQ_field_parentId = \u7236ID
view_autoDiscoveryQ_ignore = \u5ffd\u7565
view_autoDiscoveryQ_ignoreFailure = \u5ffd\u7565\u8d44\u6e90\u5931\u8d25
view_autoDiscoveryQ_ignoreInProgress = \u5ffd\u7565\u9009\u4e2d\u8d44\u6e90...
view_autoDiscoveryQ_ignoreSuccessful = \u6210\u529f\u5ffd\u7565\u9009\u5b9a\u8d44\u6e90.
view_autoDiscoveryQ_ignored = Ignored
-view_autoDiscoveryQ_import = \u5bfc\u5165
view_autoDiscoveryQ_importFailure = \u5bfc\u5165\u8d44\u6e90\u5931\u8d25
view_autoDiscoveryQ_importInProgress = \u5bfc\u5165\u9009\u62e9\u7684\u8d44\u6e90...
view_autoDiscoveryQ_importSuccessful = \u6210\u529f\u5bfc\u5165\u88ab\u9009\u8d44\u6e90.
view_autoDiscoveryQ_loadFailure = \u52a0\u8f7d\u8d44\u6e90\u6e05\u5355\u53d1\u73b0\u961f\u5217\u5931\u8d25
-view_autoDiscoveryQ_new = New
view_autoDiscoveryQ_newAndIgnored = New and Ignored
-view_autoDiscoveryQ_noItems = \u65e0\u6761\u76ee\u663e\u793a
view_autoDiscoveryQ_noperm = (\u60a8\u6ca1\u6709\u6743\u9650\u67e5\u770b\u81ea\u52a8\u53d1\u73b0\u961f\u5217)
view_autoDiscoveryQ_selectAll = \u9009\u62e9\u6240\u6709
view_autoDiscoveryQ_showStatus = \u663e\u793a\u72b6\u6001
@@ -1145,22 +1116,40 @@ view_dashboards_portlets_refresh_one_min = 1 \u5206\u652f
view_dashboards_portlets_refresh_success1 = \u6210\u529f\u4fee\u6539portlets\u81ea\u52a8\u5237\u65b0\u7684\u95f4\u9694\u65f6\u95f4
view_dashboards_portlets_refresh_success2 = \u6210\u529f\u505c\u7528portlets\u81ea\u52a8\u5237\u65b0\u7684\u91cd\u8f7d
view_dashboards_title = \u7edf\u8ba1\u8868\u76d8
-##view_drift = Drift
-##view_drift_changeSets = Change Sets
-##view_drift_changeSets_resourceViewTitle = Resource Drift Change Sets
-##view_drift_changeset_tree_loadFailure = Failed to load drift change set tree.
-##view_drift_delete_configConfirm = Delete the selected drift configuration(s)?
-##view_drift_delete_configConfirmAll = Delete all drift configurations?
-##view_drift_failure_deleteConfigs = Failed to delete some or all drift configurations.
+##view_drift_button_detectNow = Detect Now
+##view_drift_category_fileAdded = File Added
+##view_drift_category_fileChanged = File Changed
+##view_drift_category_fileNew = Newly Detected
+##view_drift_category_fileRemoved = File Removed
+##view_drift_delete_configConfirm = Delete the selected drift detection definition(s)?
+##view_drift_delete_configConfirmAll = Delete all drift detection definition?
+##view_drift_failure_deleteDefs = Failed to delete some or all drift detection definitions.
+##view_drift_failure_detectNow = Failed to submit drift detection run request
+##view_drift_failure_load = Failed to fetch drift instances
+##view_drift_snapshots = Snapshots
+##view_drift_snapshots_resourceViewTitle = Resource Drift Snapshots
+##view_drift_snapshots_tree_loadDefFailure = Failed to load drift detection definition for snapshot id [{0}]
+##view_drift_snapshots_tree_loadFailure = Failed to load drift snapshot tree.
+##view_drift_success_defUpdated = Drift detection definition updated and will affect the next detection run as applicable.
+##view_drift_success_delete = Successfully deleted {0} drift instances
+##view_drift_success_deleteConfigs = Successfully deleted {0} drift detection definitions
+##view_drift_success_detectNow = Successfully submitted drift detection run request
##view_drift_table_baseDir = Base Directory
-##view_drift_table_changeSet = Change Set
##view_drift_table_driftHandlingMode = Drift Handling
##view_drift_table_driftHandlingMode_normal = normal
##view_drift_table_driftHandlingMode_plannedChanges = planned changes
##view_drift_table_newFile = New File
##view_drift_table_oldFile = Old File
-##view_drift_table_resourceConfig = Resource Drift Configuration
+##view_drift_table_resourceDef = Resource Drift Detection Definition
##view_drift_table_resourceHistory = Resource Drift History
+##view_drift_table_snapshot = Snapshot
+##view_drift_wizard_addDef_failure = Failed to add new drift detection definition [{0}]
+##view_drift_wizard_addDef_infoStepName = Provide Drift Detection Information
+##view_drift_wizard_addDef_success = Successfully added new drift detection definition [{0}]. Agent(s) will be updated.
+##view_drift_wizard_addDef_templateHelp = Each drift detection definition describes a set of files for which drift monitoring will be performed. The definition can be enabled and disabled, defines the detection run interval, and specifies a base directory and optional file filters. For each resource type offering drift detection there will be one or more predefined templates to use as a starting definition, which can then be edited.
+##view_drift_wizard_addDef_templatePrompt = Drift Detection Definition Templates
+##view_drift_wizard_addDef_title = Add Drift Detection Definition for Resource of Type [{0}]
+##view_drift_wizard_addDef_windowTitle = Drift Add Detection Definition Wizard
view_dynagroup_children = \u5b50\u52a8\u6001\u7ec4
view_dynagroup_compatible = \u517c\u5bb9\u6027
view_dynagroup_definitionAlreadyExists = \u5df2\u7ecf\u5b58\u5728\u4ee5\u8be5\u540d\u79f0\u547d\u540d\u7684\u7ec4\u5b9a\u4e49
@@ -1381,7 +1370,6 @@ view_inventory_groups_deleteFailed = \u5220\u9664\u6307\u5b9a\u7684\u8d44\u6e90\
view_inventory_groups_deleteSuccessful = \u6210\u529f\u7684\u5220\u9664\u6307\u5b9a\u7684\u8d44\u6e90\u7ec4
view_inventory_groups_descendants = \u540e\u4ee3\u7ec4
view_inventory_groups_loadFailed = \u52a0\u8f7d\u7ec4\u7ec4\u5408\u6570\u636e\u5931\u8d25
-view_inventory_groups_resourceGroups = \u8d44\u6e90\u7ec4
view_inventory_mixed = \u6df7\u5408
view_inventory_platforms = \u5e73\u53f0
view_inventory_problemGroups = \u95ee\u9898\u7ec4
@@ -1390,9 +1378,7 @@ view_inventory_resources_deleteConfirm = \u786e\u5b9a\u5220\u9664\u9009\u4e2d\u7
view_inventory_resources_deleteFailed = \u5220\u9664\u6307\u5b9a\u7684\u8d44\u6e90\u5931\u8d25
##view_inventory_resources_deleteSuccessful = A request to perform the resource deletion has been submitted successfully to the agent(s).
view_inventory_resources_loadFailed = \u52a0\u8f7d\u8d44\u6e90\u7ec4\u5408\u6570\u636e\u5931\u8d25
-view_inventory_resources_title = \u8d44\u6e90
-view_inventory_resources_title_children = \u5b50\u8d44\u6e90
-view_inventory_resources_title_members = \u6210\u5458\u8d44\u6e90
+view_inventory_resources_members = \u6210\u5458\u8d44\u6e90
view_inventory_resources_uninventoryConfirm = \u786e\u5b9a\u628a\u9009\u4e2d\u7684\u8d44\u6e90\u4ece\u6e05\u5355\u4e2d\u5220\u9664? \u6ce8\u610f\uff1a\u5982\u679c\u67d0\u4e2a\u9009\u4e2d\u7684\u8d44\u6e90\u4f9d\u7136\u5b58\u5728, \u5219\u7cfb\u7edf\u4f1a\u5728\u6b64\u8d44\u6e90\u7684\u5ba2\u6237\u7aef\u7a0b\u5e8f\u4e0b\u6b21\u63a2\u7d22\u626b\u63cf\u65f6\u91cd\u65b0\u52a0\u8f7d\u6b64\u8d44\u6e90.
view_inventory_resources_uninventoryFailed = \u4ece\u6e05\u5355\u4e2d\u5220\u9664\u9009\u4e2d\u7684\u8d44\u6e90\u5931\u8d25
view_inventory_resources_uninventorySuccessful = \u6210\u529f\u4ece\u6e05\u5355\u4e2d\u5220\u9664\u9009\u4e2d\u7684\u8d44\u6e90
@@ -1419,7 +1405,6 @@ view_login_prompt = \u8bf7\u767b\u5f55
view_login_registerLater = (\u53d6\u6d88 - \u7a0d\u540e\u5b8c\u6210\u6ce8\u518c.)
view_login_registerLdapSuccess = \u6210\u529f\u6ce8\u518c\u65b0\u7684LDAP\u7528\u6237.
view_login_registerUser = \u7528\u6237\u6ce8\u518c
-view_login_welcome = \u6b22\u8fce
view_login_welcomeMsg = \u6b22\u8fce\u6765\u5230 RHQ! <br/><br/> \u8f93\u5165\u6216\u8005\u4fee\u6539\u4e0b\u9762\u7684\u4fe1\u606f\uff0c\u4ee5\u5b8c\u6210\u6ce8\u518c<br/> \u70b9\u51fb"OK", \u5c31\u53ef\u4ee5\u767b\u5f55\u7cfb\u7edf.<br/><br/>
view_measureRange_last = \u65f6\u95f4\u8303\u56f4 - \u5148\u524d\u7684
view_measureRange_simple = \u4e00\u822c...
@@ -1499,7 +1484,6 @@ view_portlet_defaultName_resource_metrics = \u8d44\u6e90: \u5c5e\u6027
view_portlet_defaultName_resource_oobs = \u8d44\u6e90: OOB\u6307\u6807
view_portlet_defaultName_resource_operations = \u8d44\u6e90: \u64cd\u4f5c
view_portlet_defaultName_resource_pkg_hisory = \u8d44\u6e90: \u5386\u53f2\u6570\u636e\u5305
-view_portlet_defaultName_tagCloud = \u6807\u7b7e\u4e91
view_portlet_factory_invalidPortlet = \u8fd9\u662f\u4e00\u4e2a\u9648\u65e7\u5e76\u4e14\u5df2\u7ecf\u5931\u6548\u7684portlet. \u8bf7\u5220\u9664.
view_portlet_graph_configure_metricDefinition_graph = The metric definition id to graph
view_portlet_graph_configure_resource_graph = The resource to graph
@@ -1613,7 +1597,6 @@ view_resource_monitor_calltime_lookupFailed = Could not load resource for call t
view_resource_monitor_calltime_maximum = \u6700\u5927
view_resource_monitor_calltime_minimum = \u6700\u5c0f
view_resource_monitor_calltime_title = Call Time Data
-view_resource_monitor_calltime_total = \u6240\u6709
view_resource_monitor_detailed_graph_label = \u8be6\u7ec6\u56fe
view_resource_monitor_graph_instructions = Point your mouse to a data point on the chart
view_resource_monitor_graph_live_tooltip = Click for a live graph of current values
@@ -1621,7 +1604,6 @@ view_resource_monitor_graphs_loadFailed = \u52a0\u8f7d\u7ed8\u56fe\u6570\u636e\u
view_resource_monitor_graphs_lookupFailed = Failed to find resource for graph
view_resource_monitor_graphs_noneAvailable = \u6ca1\u6709\u53ef\u7528\u56fe
view_resource_monitor_schedules_title = Resource Metric Collection Schedules
-view_resource_monitor_table_alerts = \u544a\u8b66
view_resource_monitor_table_avg = \u5e73\u5747
view_resource_monitor_table_last = Last
view_resource_monitor_table_max = \u6700\u5927
@@ -1655,7 +1637,6 @@ view_summaryOverviewForm_field_type = \u7c7b\u578b
view_summaryOverviewForm_field_version = \u7248\u672c\u53f7
view_summaryOverviewForm_header_summary = \u7edf\u8ba1
view_summaryOverviewForm_label_plugin = \u63d2\u4ef6\u6807\u7b7e:
-view_summaryOverviewForm_label_type = \u6807\u7b7e\u7c7b\u578b:
view_summaryOverviewForm_message_descriptionChangeSuccess = \u8d44\u6e90{0}\u63cf\u8ff0\u4ece[{1}] \u6539\u4e3a [{2}].
view_summaryOverviewForm_message_locationChangeSuccess = \u8d44\u6e90{0}\u4f4d\u7f6e\u4ece[{1}]\u6539\u4e3a[{2}].
view_summaryOverviewForm_message_nameChangeSuccess = \u8d44\u6e90{0}\u540d\u79f0\u4ece[{1}]\u6539\u4e3a[{2}].
@@ -1670,19 +1651,17 @@ view_table_matchingRows = \u5339\u914d\u7684\u884c: {0} (\u9009\u4e2d: {1})
view_table_totalRows = \u6240\u6709\u7684\u884c: {0} (\u9009\u4e2d: {1})
view_tabs_common_activity = \u6d3b\u52a8
view_tabs_common_agent = \u4ee3\u7406
-view_tabs_common_alerts = \u544a\u8b66
view_tabs_common_availability = \u53ef\u7528\u6027
view_tabs_common_calltime = Calltime
view_tabs_common_child_history = \u5b50\u5386\u53f2
view_tabs_common_child_resources = \u5b50\u8d44\u6e90
-view_tabs_common_configuration = \u914d\u7f6e
view_tabs_common_connectionSettings = \u8fde\u63a5\u8bbe\u7f6e
view_tabs_common_connectionSettingsHistory = \u5386\u53f2\u8fde\u63a5\u8bbe\u7f6e
view_tabs_common_content = \u5185\u5bb9
view_tabs_common_current = \u5f53\u524d
view_tabs_common_dashboard = \u7edf\u8ba1\u8868\u76d8
-view_tabs_common_definitions = \u5b9a\u4e49
view_tabs_common_deployed = \u5df2\u53d1\u5e03
+##view_tabs_common_drift = Drift
view_tabs_common_events = \u4e8b\u4ef6
view_tabs_common_graphs = \u56fe
view_tabs_common_group_members = \u7ec4\u5458
@@ -1692,13 +1671,10 @@ view_tabs_common_history = \u5386\u53f2
view_tabs_common_inventory = \u6e05\u5355
view_tabs_common_members = \u6210\u5458
view_tabs_common_monitoring = \u76d1\u63a7
-view_tabs_common_new = new
-view_tabs_common_operations = \u64cd\u4f5c
view_tabs_common_overview = \u6982\u89c8
view_tabs_common_schedule = \u8c03\u5ea6
view_tabs_common_schedules = \u8ba1\u5212\u4efb\u52a1
view_tabs_common_subscriptions = \u8fd0\u884c\u673a\u5236
-view_tabs_common_summary = \u6982\u8981
view_tabs_common_tables = \u8868\u683c
view_tabs_common_timeline = \u65f6\u95f4\u8f74
view_tabs_common_traits = \u7279\u5f81
@@ -1709,7 +1685,6 @@ view_tagCloud_deleteTagFailure = \u5220\u9664\u6807\u7b7e [{0}] \u5931\u8d25
view_tagCloud_deleteTagSuccess = \u6210\u529f\u7684\u5220\u9664\u4e86\u6807\u7b7e [{0}]
view_tagCloud_error_fetchFailure = \u52a0\u8f7d\u6807\u7b7e\u5931\u8d25.
view_tagCloud_error_tagUsedCount = \u6807\u7b7e\u4f7f\u7528 {0} \u6b21.
-view_tagCloud_title = \u6807\u7b7e\u96c6
view_taggedResources_title = \u8d44\u6e90
view_tags_error_1 = \u52a0\u8f7d\u6807\u7b7e\u5931\u8d25
view_tags_tags = \u6807\u7b7e
@@ -1739,9 +1714,8 @@ view_tree_common_contextMenu_loadFail_dashboards = \u52a0\u8f7d\u7528\u6237\u7ed
view_tree_common_contextMenu_loadFail_group = \u4e0a\u4e0b\u6587\u83dc\u5355\u52a0\u8f7d\u7ec4\u5931\u8d25
view_tree_common_contextMenu_loadFailed_dashboard = \u52a0\u8f7d\u7528\u6237\u7edf\u8ba1\u8868\u76d8\u5931\u8d25
view_tree_common_contextMenu_loadFailed_manualAddChildren = \u52a0\u8f7dplatform manual add children\u5931\u8d25
+view_tree_common_contextMenu_loadFailed_operations = Failure to start wizard for running operations
view_tree_common_contextMenu_measurements = \u76d1\u6d4b
-view_tree_common_contextMenu_operations = \u64cd\u4f5c
-view_tree_common_contextMenu_operations_loadFailed = Failure to start wizard for running operations
view_tree_common_contextMenu_resourceConfiguration = \u8d44\u6e90\u914d\u7f6e
view_tree_common_contextMenu_resourceGraph = \u8d44\u6e90\u6307\u6807\u56fe
view_tree_common_contextMenu_saveChartToDashboardFailure = \u4fdd\u5b58\u7edf\u8ba1\u8868\u76d8\u5931\u8d25
@@ -1818,7 +1792,6 @@ widget_recordEditor_info_recordUpdatedConcise = {0} updated.
widget_recordEditor_info_recordUpdatedDetailed = {0} [{1}] updated.
widget_recordEditor_info_recordsDeletedConcise = {0} {1} deleted.
widget_recordEditor_info_recordsDeletedDetailed = {0} {1} deleted: {2}.
-widget_recordEditor_label_loading = \u52a0\u8f7d\u4e2d...
widget_recordEditor_title_edit = \u7f16\u8f91{0} [{1}]
widget_recordEditor_title_new = \u65b0\u5efa{0}
widget_recordEditor_title_view = \u67e5\u770b{0} [{1}]
commit 3e103c8f42b03984bfd98d1affe520c7a17a0ffe
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Sep 12 16:59:27 2011 -0400
Fix issue setting default value for enumerated value property in
ConfigurationEditor#buildSimpleField() (the rest of the changes are
unfortunately just formatting differences).
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
index 438f73b..2ab6ba6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
@@ -146,8 +146,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
//
public class ConfigurationEditor extends LocatableVLayout {
- private static final LinkedHashMap<String, String> BOOLEAN_PROPERTY_ITEM_VALUE_MAP =
- new LinkedHashMap<String, String>();
+ private static final LinkedHashMap<String, String> BOOLEAN_PROPERTY_ITEM_VALUE_MAP = new LinkedHashMap<String, String>();
static {
BOOLEAN_PROPERTY_ITEM_VALUE_MAP.put(Boolean.TRUE.toString(), MSG.common_val_yes());
BOOLEAN_PROPERTY_ITEM_VALUE_MAP.put(Boolean.FALSE.toString(), MSG.common_val_no());
@@ -436,7 +435,7 @@ public class ConfigurationEditor extends LocatableVLayout {
}
private void fireInitialPropertyChangedEvent() {
- Map validationErrors = this.topLevelPropertiesValuesManager.getErrors();
+ Map<?, ?> validationErrors = this.topLevelPropertiesValuesManager.getErrors();
if (validationErrors != null) {
for (Object key : validationErrors.keySet()) {
String propertyName = (String) key;
@@ -445,7 +444,7 @@ public class ConfigurationEditor extends LocatableVLayout {
}
if (!this.invalidPropertyNameToDisplayNameMap.isEmpty()) {
PropertyValueChangeEvent event = new PropertyValueChangeEvent(null, null, true,
- this.invalidPropertyNameToDisplayNameMap);
+ this.invalidPropertyNameToDisplayNameMap);
firePropertyChangedEvent(event);
}
}
@@ -502,9 +501,9 @@ public class ConfigurationEditor extends LocatableVLayout {
section.setExpanded(true);
} else {
String title = "<div style=\"float:left; font-weight: bold;\">"
- + group.getDisplayName()
- + "</div>"
- + (group.getDescription() != null ? ("<div style='padding-left: 10px; font-weight: normal; font-size: smaller; float: left;'>"
+ + group.getDisplayName()
+ + "</div>"
+ + (group.getDescription() != null ? ("<div style='padding-left: 10px; font-weight: normal; font-size: smaller; float: left;'>"
+ " - " + group.getDescription() + "</div>")
: "");
section = new SectionStackSection(title);
@@ -528,8 +527,8 @@ public class ConfigurationEditor extends LocatableVLayout {
return section;
}
- protected LocatableDynamicForm buildPropertiesForm(String locatorId, Collection<PropertyDefinition> propertyDefinitions,
- AbstractPropertyMap propertyMap) {
+ protected LocatableDynamicForm buildPropertiesForm(String locatorId,
+ Collection<PropertyDefinition> propertyDefinitions, AbstractPropertyMap propertyMap) {
LocatableDynamicForm form = new LocatableDynamicForm(locatorId);
if (propertyMap instanceof Configuration) {
@@ -740,16 +739,15 @@ public class ConfigurationEditor extends LocatableVLayout {
PropertyDefinition topLevelPropertyDefinition = getTopLevelPropertyDefinition(propertyDefinition);
boolean invalidPropertySetChanged;
if (isValid) {
- invalidPropertySetChanged =
- (this.invalidPropertyNameToDisplayNameMap.remove(topLevelPropertyDefinition.getName()) != null);
+ invalidPropertySetChanged = (this.invalidPropertyNameToDisplayNameMap.remove(topLevelPropertyDefinition
+ .getName()) != null);
} else {
- invalidPropertySetChanged =
- (this.invalidPropertyNameToDisplayNameMap.put(topLevelPropertyDefinition.getName(),
- topLevelPropertyDefinition.getDisplayName()) != null);
+ invalidPropertySetChanged = (this.invalidPropertyNameToDisplayNameMap.put(topLevelPropertyDefinition
+ .getName(), topLevelPropertyDefinition.getDisplayName()) != null);
}
PropertyValueChangeEvent event = new PropertyValueChangeEvent(property, propertyDefinition,
- invalidPropertySetChanged, this.invalidPropertyNameToDisplayNameMap);
+ invalidPropertySetChanged, this.invalidPropertyNameToDisplayNameMap);
firePropertyChangedEvent(event);
}
@@ -777,8 +775,8 @@ public class ConfigurationEditor extends LocatableVLayout {
LocatableVLayout layout = new LocatableVLayout(parentLocatorId + "_Layout");
final PropertyDefinitionMap propertyDefinitionMapFinal = propertyDefinitionMap;
- LocatableDynamicForm valuesCanvas = buildPropertiesForm(layout.getLocatorId(),
- propertyDefinitionMapFinal.getPropertyDefinitions().values(), propertyMap);
+ LocatableDynamicForm valuesCanvas = buildPropertiesForm(layout.getLocatorId(), propertyDefinitionMapFinal
+ .getPropertyDefinitions().values(), propertyMap);
layout.addMember(valuesCanvas);
if (isDynamic && !isReadOnly(propertyDefinitionMap, propertyMap)) {
@@ -789,8 +787,7 @@ public class ConfigurationEditor extends LocatableVLayout {
buttonBar.setMembersMargin(15);
layout.addMember(buttonBar);
- final IButton newButton = new LocatableIButton(buttonBar.extendLocatorId("New"), MSG
- .common_button_new());
+ final IButton newButton = new LocatableIButton(buttonBar.extendLocatorId("New"), MSG.common_button_new());
newButton.setIcon(Window.getImgURL("[SKIN]/actions/add.png"));
newButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
public void onClick(ClickEvent clickEvent) {
@@ -938,8 +935,8 @@ public class ConfigurationEditor extends LocatableVLayout {
summaryTable.setRecordEnabledProperty(null);
List<ListGridField> fieldsList = new ArrayList<ListGridField>();
- final List<PropertyDefinition> propertyDefinitions = new ArrayList<PropertyDefinition>(memberPropertyDefinitionMap
- .getPropertyDefinitions().values());
+ final List<PropertyDefinition> propertyDefinitions = new ArrayList<PropertyDefinition>(
+ memberPropertyDefinitionMap.getPropertyDefinitions().values());
Collections.sort(propertyDefinitions, new PropertyDefinitionComparator());
List<PropertyDefinition> summaryPropertyDefinitions = new ArrayList<PropertyDefinition>();
@@ -975,7 +972,7 @@ public class ConfigurationEditor extends LocatableVLayout {
PropertyMap memberPropertyMap = (PropertyMap) record.getPropertyMap();
Log.debug("Editing property map: " + memberPropertyMap);
displayMapEditor(summaryTable, record, propertyDefinitionList, propertyList,
- memberPropertyDefinitionMap, memberPropertyMap, mapReadOnly);
+ memberPropertyDefinitionMap, memberPropertyMap, mapReadOnly);
}
});
fieldsList.add(editField);
@@ -998,7 +995,8 @@ public class ConfigurationEditor extends LocatableVLayout {
SC.confirm(MSG.view_configEdit_confirm_2(), new BooleanCallback() {
public void execute(Boolean confirmed) {
if (confirmed) {
- PropertyMapListGridRecord recordToBeDeleted = (PropertyMapListGridRecord) recordClickEvent.getRecord();
+ PropertyMapListGridRecord recordToBeDeleted = (PropertyMapListGridRecord) recordClickEvent
+ .getRecord();
propertyList.getList().remove(recordToBeDeleted.getIndex());
ListGridRecord[] rows = buildSummaryRecords(propertyList, propertyDefinitions);
summaryTable.setData(rows);
@@ -1029,7 +1027,7 @@ public class ConfigurationEditor extends LocatableVLayout {
addRowButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
public void onClick(ClickEvent clickEvent) {
displayMapEditor(summaryTable, null, propertyDefinitionList, propertyList,
- memberPropertyDefinitionMap, null, mapReadOnly);
+ memberPropertyDefinitionMap, null, mapReadOnly);
}
});
toolStrip.addMember(addRowButton);
@@ -1049,18 +1047,18 @@ public class ConfigurationEditor extends LocatableVLayout {
PropertyDefinitionSimple defSimple = (PropertyDefinitionSimple) summaryPropDef;
PropertySimpleType propSimpleType = defSimple.getType();
switch (propSimpleType) {
- case BOOLEAN:
- field.setType(ListGridFieldType.BOOLEAN);
- break;
- case INTEGER:
- field.setType(ListGridFieldType.INTEGER);
- break;
- case FLOAT:
- case DOUBLE:
- field.setType(ListGridFieldType.FLOAT);
- break;
- default:
- field.setType(ListGridFieldType.TEXT);
+ case BOOLEAN:
+ field.setType(ListGridFieldType.BOOLEAN);
+ break;
+ case INTEGER:
+ field.setType(ListGridFieldType.INTEGER);
+ break;
+ case FLOAT:
+ case DOUBLE:
+ field.setType(ListGridFieldType.FLOAT);
+ break;
+ default:
+ field.setType(ListGridFieldType.TEXT);
}
return field;
}
@@ -1076,8 +1074,10 @@ public class ConfigurationEditor extends LocatableVLayout {
return allPropsDefsReadOnly;
}
- private PropertyMapListGridRecord[] buildSummaryRecords(PropertyList propertyList, List<PropertyDefinition> definitions) {
- PropertyMapListGridRecord[] records = new PropertyMapListGridRecord[propertyList == null ? 0 : propertyList.getList().size()];
+ private PropertyMapListGridRecord[] buildSummaryRecords(PropertyList propertyList,
+ List<PropertyDefinition> definitions) {
+ PropertyMapListGridRecord[] records = new PropertyMapListGridRecord[propertyList == null ? 0 : propertyList
+ .getList().size()];
List<Property> list = propertyList.getList();
for (int index = 0, listSize = list.size(); index < listSize; index++) {
Property row = list.get(index);
@@ -1299,9 +1299,7 @@ public class ConfigurationEditor extends LocatableVLayout {
valueItem = new RadioGroupItem();
}
valueItem.setValueMap(valueOptions);
- if (propertySimple != null) {
- valueItem.setValue(propertySimple.getStringValue());
- }
+
} else {
switch (propertyDefinitionSimple.getType()) {
case STRING:
@@ -1337,8 +1335,8 @@ public class ConfigurationEditor extends LocatableVLayout {
List<Validator> validators = buildValidators(propertyDefinitionSimple, propertySimple);
valueItem.setValidators(validators.toArray(new Validator[validators.size()]));
- if ((propertySimple.getConfiguration() != null) || (propertySimple.getParentMap() != null) ||
- (propertySimple.getParentList() != null)) {
+ if ((propertySimple.getConfiguration() != null) || (propertySimple.getParentMap() != null)
+ || (propertySimple.getParentList() != null)) {
valueItem.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent changedEvent) {
updatePropertySimpleValue(changedEvent.getValue(), propertySimple, propertyDefinitionSimple);
@@ -1359,6 +1357,9 @@ public class ConfigurationEditor extends LocatableVLayout {
valueItem.setShowTitle(false);
String value = propertySimple.getStringValue();
+ if (null == value && null != propertyDefinitionSimple.getDefaultValue()) {
+ value = propertyDefinitionSimple.getDefaultValue();
+ }
if (valueItem instanceof StaticTextItem) {
// Property values are user-editable, so escape HTML when displayed as static text, to prevent XSS attacks.
value = StringUtility.escapeHtml(value);
@@ -1384,10 +1385,9 @@ public class ConfigurationEditor extends LocatableVLayout {
}
protected boolean fireEventOnPropertyValueChange(PropertyDefinitionSimple propertyDefinitionSimple,
- PropertySimple propertySimple) {
+ PropertySimple propertySimple) {
PropertyMap parentMap = propertySimple.getParentMap();
- return propertySimple.getConfiguration() != null
- || (parentMap != null && parentMap.getConfiguration() != null);
+ return propertySimple.getConfiguration() != null || (parentMap != null && parentMap.getConfiguration() != null);
}
protected void updatePropertySimpleValue(Object value, PropertySimple propertySimple,
@@ -1490,8 +1490,8 @@ public class ConfigurationEditor extends LocatableVLayout {
}
if (property instanceof PropertySimple) {
PropertySimple propertySimple = (PropertySimple) property;
- if (propertyDefinition.isRequired() &&
- (propertySimple.getStringValue() == null) || "".equals(propertySimple.getStringValue())) {
+ if (propertyDefinition.isRequired() && (propertySimple.getStringValue() == null)
+ || "".equals(propertySimple.getStringValue())) {
// special case 2: required simple prop with no value - allow user to edit it even if it's a read-only prop,
// otherwise the user will have no way to give the property a new value and thereby get things to a valid state
return false;
@@ -1563,15 +1563,16 @@ public class ConfigurationEditor extends LocatableVLayout {
}
private void displayMapEditor(final ListGrid summaryTable, final PropertyMapListGridRecord existingRecord,
- final PropertyDefinitionList propertyDefinitionList, final PropertyList propertyList, PropertyDefinitionMap memberMapDefinition, final PropertyMap memberMap,
- final boolean mapReadOnly) {
+ final PropertyDefinitionList propertyDefinitionList, final PropertyList propertyList,
+ PropertyDefinitionMap memberMapDefinition, final PropertyMap memberMap, final boolean mapReadOnly) {
final List<PropertyDefinition> memberDefinitions = new ArrayList<PropertyDefinition>(memberMapDefinition
.getPropertyDefinitions().values());
Collections.sort(memberDefinitions, new PropertyDefinitionComparator());
final boolean newRow = (memberMap == null);
- final PropertyMap workingMap = (newRow) ? new PropertyMap(memberMapDefinition.getName()) : memberMap.deepCopy(true);
+ final PropertyMap workingMap = (newRow) ? new PropertyMap(memberMapDefinition.getName()) : memberMap
+ .deepCopy(true);
final LocatableWindow popup = new LocatableWindow(extendLocatorId("MapEditor"));
String title = (mapReadOnly) ? MSG.view_configEdit_viewRow() : MSG.view_configEdit_editRow();
@@ -1610,7 +1611,7 @@ public class ConfigurationEditor extends LocatableVLayout {
propertyList.add(workingMap);
int index = propertyList.getList().size() - 1;
PropertyMapListGridRecord record = new PropertyMapListGridRecord(workingMap, index,
- memberDefinitions);
+ memberDefinitions);
summaryTable.addData(record);
} else {
mergePropertyMap(workingMap, memberMap, memberDefinitions);
@@ -1638,7 +1639,8 @@ public class ConfigurationEditor extends LocatableVLayout {
buttonBar.addMember(okButton);
if (!mapReadOnly) {
- final IButton cancelButton = new LocatableIButton(buttonBar.extendLocatorId("Cancel"), MSG.common_button_cancel());
+ final IButton cancelButton = new LocatableIButton(buttonBar.extendLocatorId("Cancel"), MSG
+ .common_button_cancel());
cancelButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
public void onClick(ClickEvent clickEvent) {
layout.destroy();
@@ -1654,7 +1656,7 @@ public class ConfigurationEditor extends LocatableVLayout {
}
private void mergePropertyMap(PropertyMap sourceMap, PropertyMap targetMap,
- List<PropertyDefinition> memberDefinitions) {
+ List<PropertyDefinition> memberDefinitions) {
for (PropertyDefinition subDef : memberDefinitions) {
PropertyDefinitionSimple subDefSimple = (PropertyDefinitionSimple) subDef;
PropertySimple propertySimple = ((PropertySimple) sourceMap.get(subDefSimple.getName()));
commit 5b8e2569933c39078baa9b9a423e8792b01ee69f
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Sep 23 15:05:45 2011 -0400
make sure we re-enable the table buttons
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestDataSourceResponseStatisticsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestDataSourceResponseStatisticsView.java
index cf9f2df..83a8579 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestDataSourceResponseStatisticsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestDataSourceResponseStatisticsView.java
@@ -166,6 +166,7 @@ public class TestDataSourceResponseStatisticsView extends Table {
if (window != null) {
window.setTitle(getTableTitle());
}
+ refresh();
}
});
@@ -204,6 +205,7 @@ public class TestDataSourceResponseStatisticsView extends Table {
new MessageWindow(extendLocatorId("csv"), "Export To CSV", "<pre>" + csv.toString() + "</pre>")
.show();
+ refresh();
}
});
@@ -265,6 +267,7 @@ public class TestDataSourceResponseStatisticsView extends Table {
if (window != null) {
window.setTitle(getTableTitle());
}
+ refreshTableInfo();
}
});
} else { // not in the standalone window
@@ -273,6 +276,7 @@ public class TestDataSourceResponseStatisticsView extends Table {
@Override
public void executeAction(ListGridRecord[] selection, Object actionValue) {
new StatisticsWindow(extendLocatorId("responseStatsWin")).show();
+ refresh();
}
});
}
@@ -296,6 +300,7 @@ public class TestDataSourceResponseStatisticsView extends Table {
if (window != null) {
window.blink();
}
+ refreshTableInfo();
}
private ListGridRecord[] transform(ArrayList<DataSourceResponseStatistics.Record> arrayList) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestRemoteServiceStatisticsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestRemoteServiceStatisticsView.java
index 1c03410..8195198 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestRemoteServiceStatisticsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestRemoteServiceStatisticsView.java
@@ -150,6 +150,8 @@ public class TestRemoteServiceStatisticsView extends Table {
new MessageWindow(extendLocatorId("csv"), "Export To CSV", "<pre>" + csv.toString() + "</pre>")
.show();
+
+ refresh();
}
});
@@ -206,6 +208,7 @@ public class TestRemoteServiceStatisticsView extends Table {
refreshTimer.scheduleRepeating(timeout.intValue() * 1000);
setTableTitle(TABLE_TITLE + " (refresh every " + timeout + "s)");
}
+ refreshTableInfo();
}
});
} else { // not in the standalone window
@@ -214,6 +217,7 @@ public class TestRemoteServiceStatisticsView extends Table {
@Override
public void executeAction(ListGridRecord[] selection, Object actionValue) {
new StatisticsWindow(extendLocatorId("statsWin")).show();
+ refresh();
}
});
}
@@ -237,6 +241,7 @@ public class TestRemoteServiceStatisticsView extends Table {
if (window != null) {
window.blink();
}
+ refreshTableInfo();
}
private ListGridRecord[] transform(List<Summary> stats) {
commit 414a565741e3f4e842261f03f300489c96bbc6c3
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Sep 23 11:01:22 2011 -0400
Adding more drift criteria query support
diff --git a/modules/enterprise/server/plugins/drift-mongodb/pom.xml b/modules/enterprise/server/plugins/drift-mongodb/pom.xml
index 1f49403..b5eefb7 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/pom.xml
+++ b/modules/enterprise/server/plugins/drift-mongodb/pom.xml
@@ -48,13 +48,13 @@
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
- <version>2.6.3</version>
+ <version>2.6.5</version>
</dependency>
<dependency>
<groupId>com.google.code.morphia</groupId>
<artifactId>morphia</artifactId>
- <version>0.99</version>
+ <version>1.00-SNAPSHOT</version>
</dependency>
<dependency>
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAO.java b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAO.java
index 7e6e7b8..1f4f96c 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAO.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAO.java
@@ -64,6 +64,14 @@ public class ChangeSetDAO extends BasicDAO<MongoDBChangeSet, ObjectId> {
query.field("files.category").in(asList(criteria.getFilterCategories()));
}
+ if (criteria.getFilterStartTime() != null) {
+ query.field("files.ctime").greaterThanOrEq(criteria.getFilterStartTime());
+ }
+
+ if (criteria.getFilterEndTime() != null) {
+ query.field("files.ctime").lessThanOrEq(criteria.getFilterEndTime());
+ }
+
return query.asList();
}
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java
index 869b6b3..33fadf5 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java
@@ -23,6 +23,7 @@ import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
+import java.io.InputStream;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
@@ -41,8 +42,12 @@ public class FileDAO {
gridFS = new GridFS(this.db);
}
- public GridFSDBFile findOne(String hash) {
- return gridFS.findOne(new BasicDBObject("_id", hash));
+ public InputStream findOne(String hash) {
+ GridFSDBFile dbFile = gridFS.findOne(new BasicDBObject("_id", hash));
+ if (dbFile == null) {
+ return null;
+ }
+ return dbFile.getInputStream();
}
public void save(File file) throws IOException {
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/GridFSTest.java b/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/GridFSTest.java
deleted file mode 100644
index da14b84..0000000
--- a/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/GridFSTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2011 Red Hat, Inc.
- * All rights reserved.
- *
- * This program 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 version 2 of the License.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package org.rhq.enterprise.server.plugins.drift.mongodb;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-
-import com.mongodb.DB;
-import com.mongodb.Mongo;
-import com.mongodb.gridfs.GridFS;
-import com.mongodb.gridfs.GridFSDBFile;
-import com.mongodb.gridfs.GridFSInputFile;
-
-import org.bson.types.ObjectId;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import org.rhq.core.util.stream.StreamUtil;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-public class GridFSTest {
-
- // Tests need to be disabled when committed/pushed to the remote repo until we get
- // mongodb installed on the hudson slave
- static final boolean ENABLED = false;
-
- Mongo connection;
-
- DB db;
-
- @BeforeClass
- public void initDB() throws Exception {
- connection = new Mongo("localhost");
- connection.dropDatabase("rhqtest");
- db = connection.getDB("rhqtest");
-
- }
-
- @Test(enabled = ENABLED)
- public void writeAndReadFile() throws Exception {
- GridFS gridFS = new GridFS(db);
- File file = new File("/home/jsanda/clojure-plugin.tar");
- GridFSInputFile inputFile = gridFS.createFile(new FileInputStream(file), file.getName());
-
- inputFile.save();
-
- FileOutputStream stream = new FileOutputStream("/home/jsanda/gridfs-test.tar");
- GridFSDBFile gridFSDBFile = gridFS.findOne((ObjectId) inputFile.getId());
- gridFSDBFile.writeTo(stream);
-
- GridFSDBFile dbFile = gridFS.findOne(file.getName());
- assertNotNull(dbFile);
-
- File outputFile = new File("/tmp/clojure-plugin.tar");
- outputFile.delete();
-
- StreamUtil.copy(dbFile.getInputStream(), new BufferedOutputStream(new FileOutputStream(outputFile)), true);
-
- assertEquals(outputFile.length(), file.length());
- }
-
-}
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAOTest.java b/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAOTest.java
index bfcc480..f95026a 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAOTest.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAOTest.java
@@ -64,7 +64,7 @@ public class ChangeSetDAOTest {
@BeforeClass
public void initDB() throws Exception {
- connection = new Mongo("localhost");
+ connection = new Mongo("127.0.0.1");
morphia = new Morphia()
.map(MongoDBChangeSet.class)
@@ -259,15 +259,68 @@ public class ChangeSetDAOTest {
assertChangeSetMatches("Failed to find change set by drift criteria with id filter.", c1, actual.get(0));
}
-// @Test
-// public void testSlice() throws Exception {
-// MongoDBChangeSet c1 = createChangeSet(DRIFT, 2, 1, 1)
-// .add(new MongoDBChangeSetEntry("c2-1.txt", FILE_ADDED))
-// .add(new MongoDBChangeSetEntry("c1-1.txt", FILE_CHANGED));
-// dao.save(c1);
-//
-// dao.createQuery().filter("files $slice", new Integer(1));
-// }
+ @Test(enabled = ENABLED)
+ public void findDriftCriteriaWithStartTimeFilter() throws Exception {
+ int resourceId = 1;
+
+ MongoDBChangeSet c1 = createChangeSet(COVERAGE, 1, resourceId, 1);
+ MongoDBChangeSetEntry e1 = new MongoDBChangeSetEntry("c1-1.txt", FILE_ADDED);
+ c1.add(e1);
+
+ dao.save(c1);
+
+ long startTime = System.currentTimeMillis();
+ Thread.sleep(10);
+
+ MongoDBChangeSet c2 = createChangeSet(DRIFT, 2, resourceId, 1);
+ MongoDBChangeSetEntry e2 = new MongoDBChangeSetEntry("c1-1.txt", FILE_CHANGED);
+ c2.add(e2);
+
+ dao.save(c2);
+
+ GenericDriftCriteria criteria = new GenericDriftCriteria();
+ criteria.addFilterResourceIds(resourceId);
+ criteria.addFilterStartTime(startTime);
+
+ List<MongoDBChangeSet> actual = dao.findByDriftCriteria(criteria);
+
+ assertEquals("Expected to get back one change set", 1, actual.size());
+ MongoDBChangeSet actualChangeSet = actual.get(0);
+
+ assertChangeSetMatches("Failed to find drift entries by drift criteria with start time filter",
+ c2, actualChangeSet);
+ }
+
+ @Test(enabled = ENABLED)
+ public void findDriftCriteriaWithEndTimeFilter() throws Exception {
+ int resourceId = 1;
+
+ MongoDBChangeSet c1 = createChangeSet(COVERAGE, 1, resourceId, 1);
+ MongoDBChangeSetEntry e1 = new MongoDBChangeSetEntry("c1-1.txt", FILE_ADDED);
+ c1.add(e1);
+
+ dao.save(c1);
+
+ long endTime = System.currentTimeMillis();
+ Thread.sleep(10);
+
+ MongoDBChangeSet c2 = createChangeSet(DRIFT, 2, resourceId, 1);
+ MongoDBChangeSetEntry e2 = new MongoDBChangeSetEntry("c1-1.txt", FILE_CHANGED);
+ c2.add(e2);
+
+ dao.save(c2);
+
+ GenericDriftCriteria criteria = new GenericDriftCriteria();
+ criteria.addFilterEndTime(endTime);
+ criteria.addFilterResourceIds(resourceId);
+
+ List<MongoDBChangeSet> actual = dao.findByDriftCriteria(criteria);
+
+ assertEquals("Expected to get back one change set", 1, actual.size());
+ MongoDBChangeSet actualChangeSet = actual.get(0);
+
+ assertChangeSetMatches("Failed to find drift entries with end time filter", c1, actualChangeSet);
+ }
/**
* This method first checks that the actual change set is not null. It then performs a
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAOTest.java b/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAOTest.java
index ce2af01..9ad3f6a 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAOTest.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAOTest.java
@@ -23,6 +23,7 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.util.Random;
import com.google.code.morphia.Datastore;
@@ -71,7 +72,7 @@ public class FileDAOTest {
@BeforeClass
public void initDB() throws Exception {
- connection = new Mongo("localhost");
+ connection = new Mongo("127.0.0.1");
morphia = new Morphia()
.map(MongoDBChangeSet.class)
@@ -100,33 +101,56 @@ public class FileDAOTest {
@Test(enabled = ENABLED)
public void findFile() throws Exception {
- File file = createRandomFile("findFile.expected");
+ File file = createRandomFile();
String hash = sha256(file);
GridFSInputFile inputFile = gridFS.createFile(new FileInputStream(file));
inputFile.put("_id", hash);
inputFile.save();
- GridFSDBFile dbFile = dao.findOne(hash);
+ InputStream dbInputStream = dao.findOne(hash);
- assertNotNull(dbFile, "Expected to find file with name " + hash);
+ assertNotNull(dbInputStream, "Expected to find file with name " + hash);
File actualFile = new File(dataDir, "findFile.actual");
- StreamUtil.copy(dbFile.getInputStream(), new FileOutputStream(actualFile), true);
+ StreamUtil.copy(dbInputStream, new FileOutputStream(actualFile), true);
- assertTrue(actualFile.exists(), "Expected to file " + actualFile.getPath());
+ assertTrue(actualFile.exists(), "Expected to find file " + actualFile.getPath());
}
- private File createRandomFile(String fileName) throws Exception {
- File file = new File(dataDir, fileName);
- FileOutputStream stream = new FileOutputStream(file);
+ @Test(enabled = ENABLED)
+ public void saveAndFindFile() throws Exception {
+ File file = createRandomFile();
+ String hash = file.getName();
+
+ dao.save(file);
+ InputStream dbInputStream = dao.findOne(hash);
+
+ assertNotNull(dbInputStream, "Expected to find file with name " + hash);
+ File actualFile = new File(dataDir, "saveAndFindFile.actual");
+ StreamUtil.copy(dbInputStream, new FileOutputStream(actualFile), true);
+
+ assertTrue(actualFile.exists(), "Expected to find file " + actualFile.getPath());
+ }
+
+ private File createRandomFile() throws Exception {
byte[] bytes = new byte[32];
random.nextBytes(bytes);
+ File file = new File(dataDir, sha256(bytes));
+ FileOutputStream stream = new FileOutputStream(file);
write(bytes, stream);
stream.close();
return file;
}
+ protected String sha256(byte[] bytes) {
+ try {
+ return digestGenerator.calcDigestString(bytes);
+ } catch (IOException e) {
+ throw new RuntimeException("Failed to calculate SHA-256 hash", e);
+ }
+ }
+
protected String sha256(File file) {
try {
return digestGenerator.calcDigestString(file);
commit 7739090a34afd0d618bbdf13794eb1ecc3c13846
Author: John Sanda <jsanda(a)redhat.com>
Date: Sat Sep 17 10:55:32 2011 -0400
Updating MongoDB drift plugin to store file contents.
Now when a change set is reported by the agent, the mongodb plugin
checks the database to see if the content is already there. If it isn't,
it sends a request to the agent for the content. When the agent sends
the content, the plugin saves the bits to the database using GridFS.
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
index b37299a..ceeacfd 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
@@ -24,6 +24,8 @@ import java.io.File;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.zip.ZipEntry;
@@ -40,6 +42,7 @@ import org.rhq.common.drift.ChangeSetReader;
import org.rhq.common.drift.ChangeSetReaderImpl;
import org.rhq.common.drift.FileEntry;
import org.rhq.common.drift.Headers;
+import org.rhq.core.clientapi.agent.drift.DriftAgentService;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.DriftChangeSetCriteria;
import org.rhq.core.domain.criteria.DriftCriteria;
@@ -58,6 +61,7 @@ import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.util.ZipUtil;
import org.rhq.core.util.file.FileUtil;
+import org.rhq.enterprise.server.agentclient.AgentClient;
import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent;
import org.rhq.enterprise.server.plugin.pc.ServerPluginContext;
import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
@@ -68,6 +72,7 @@ import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBChangeSet
import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBFile;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
+import static org.rhq.enterprise.server.util.LookupUtil.getAgentManager;
import static org.rhq.enterprise.server.util.LookupUtil.getResourceManager;
public class MongoDBDriftServer implements DriftServerPluginFacet, ServerPluginComponent {
@@ -117,6 +122,8 @@ public class MongoDBDriftServer implements DriftServerPluginFacet, ServerPluginC
ChangeSetReader reader = new ChangeSetReaderImpl(new BufferedReader(new InputStreamReader(stream)));
Headers headers = reader.getHeaders();
+ List<DriftFileDTO> missingContent = new LinkedList<DriftFileDTO>();
+
MongoDBChangeSet changeSet = new MongoDBChangeSet();
changeSet.setCategory(headers.getType());
changeSet.setResourceId(resourceId);
@@ -134,6 +141,29 @@ public class MongoDBDriftServer implements DriftServerPluginFacet, ServerPluginC
MongoDBChangeSetEntry entry = new MongoDBChangeSetEntry();
entry.setCategory(fileEntry.getType());
entry.setPath(path);
+
+ switch (fileEntry.getType()) {
+ case FILE_ADDED:
+ entry.setNewFileHash(fileEntry.getNewSHA());
+ if (fileDAO.findOne(fileEntry.getNewSHA()) == null) {
+ missingContent.add(newDriftFile(fileEntry.getNewSHA()));
+ }
+ break;
+ case FILE_CHANGED:
+ entry.setOldFileHash(fileEntry.getOldSHA());
+ entry.setNewFileHash(fileEntry.getNewSHA());
+ if (fileDAO.findOne(fileEntry.getNewSHA()) == null) {
+ missingContent.add(newDriftFile(fileEntry.getNewSHA()));
+ }
+ if (fileDAO.findOne(fileEntry.getOldSHA()) == null) {
+ missingContent.add(newDriftFile(fileEntry.getNewSHA()));
+ }
+ break;
+ default: // FILE_REMOVED
+ if (fileDAO.findOne(fileEntry.getOldSHA()) == null) {
+ missingContent.add(newDriftFile(fileEntry.getOldSHA()));
+ }
+ }
changeSet.add(entry);
// we are taking advantage of the fact that we know the summary is only used by the server
@@ -146,6 +176,13 @@ public class MongoDBDriftServer implements DriftServerPluginFacet, ServerPluginC
}
ds.save(changeSet);
+
+ if (!missingContent.isEmpty()) {
+ AgentClient agent = getAgentManager().getAgentClient(subject, resourceId);
+ DriftAgentService driftService = agent.getDriftAgentService();
+ driftService.requestDriftFiles(resourceId, headers, missingContent);
+ }
+
return true;
}
});
@@ -153,8 +190,24 @@ public class MongoDBDriftServer implements DriftServerPluginFacet, ServerPluginC
return summary;
}
+ private DriftFileDTO newDriftFile(String hash) {
+ DriftFileDTO file = new DriftFileDTO();
+ file.setHashId(hash);
+ return file;
+ }
+
@Override
public void saveChangeSetFiles(final Subject subject, final File changeSetFilesZip) throws Exception {
+ String zipFileName = changeSetFilesZip.getName();
+ File tmpDir = new File(System.getProperty("java.io.tmpdir"));
+ File dir = new File(tmpDir, zipFileName.substring(0, zipFileName.indexOf(".")));
+ dir.mkdir();
+
+ ZipUtil.unzipFile(changeSetFilesZip, dir);
+ for (File file : dir.listFiles()) {
+ fileDAO.save(file);
+ file.delete();
+ }
}
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java
index 445c3bb..869b6b3 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java
@@ -19,10 +19,16 @@
package org.rhq.enterprise.server.plugins.drift.mongodb.dao;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
+import com.mongodb.gridfs.GridFSInputFile;
public class FileDAO {
@@ -35,8 +41,14 @@ public class FileDAO {
gridFS = new GridFS(this.db);
}
- GridFSDBFile findOne(String hash) {
+ public GridFSDBFile findOne(String hash) {
return gridFS.findOne(new BasicDBObject("_id", hash));
}
+ public void save(File file) throws IOException {
+ GridFSInputFile inputFile = gridFS.createFile(new BufferedInputStream(new FileInputStream(file)));
+ inputFile.put("_id", file.getName());
+ inputFile.save();
+ }
+
}
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBChangeSetEntry.java b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBChangeSetEntry.java
index 737d2c1..e236266 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBChangeSetEntry.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBChangeSetEntry.java
@@ -46,6 +46,10 @@ public class MongoDBChangeSetEntry implements Drift<MongoDBChangeSet, MongoDBFil
private MongoDBFile newFile;
+ private String oldFileHash;
+
+ private String newFileHash;
+
public MongoDBChangeSetEntry() {
}
@@ -141,7 +145,23 @@ public class MongoDBChangeSetEntry implements Drift<MongoDBChangeSet, MongoDBFil
this.path = path;
}
- @Override
+ public String getOldFileHash() {
+ return oldFileHash;
+ }
+
+ public void setOldFileHash(String oldFileHash) {
+ this.oldFileHash = oldFileHash;
+ }
+
+ public String getNewFileHash() {
+ return newFileHash;
+ }
+
+ public void setNewFileHash(String newFileHash) {
+ this.newFileHash = newFileHash;
+ }
+
+ @Override
public MongoDBFile getOldDriftFile() {
return oldFile;
}
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBFile.java b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBFile.java
index abdf836..a3ecfbc 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBFile.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBFile.java
@@ -7,6 +7,10 @@ import com.google.code.morphia.annotations.Embedded;
import org.rhq.core.domain.drift.DriftFile;
import org.rhq.core.domain.drift.DriftFileStatus;
+/**
+ * Note that this class might go away. I am not certain that it is needed. Files are
+ * stored in fs.files collection when using the GridFS API as we are.
+ */
@Embedded
public class MongoDBFile implements Serializable, DriftFile {
@@ -20,6 +24,13 @@ public class MongoDBFile implements Serializable, DriftFile {
private DriftFileStatus status;
+ public MongoDBFile() {
+ }
+
+ public MongoDBFile(String hash) {
+ this.hash = hash;
+ }
+
@Override
public String getHashId() {
return hash;
commit ed114bc67ebcc61a820b4479d90ed1f04447dd77
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Sep 16 22:00:06 2011 -0400
Set the change set version from the headers
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
index 3b56711..b37299a 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
@@ -62,6 +62,7 @@ import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent;
import org.rhq.enterprise.server.plugin.pc.ServerPluginContext;
import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginFacet;
+import org.rhq.enterprise.server.plugins.drift.mongodb.dao.FileDAO;
import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBChangeSet;
import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBChangeSetEntry;
import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBFile;
@@ -79,13 +80,14 @@ public class MongoDBDriftServer implements DriftServerPluginFacet, ServerPluginC
private Datastore ds;
- static int changeSetVersions = 0;
+ private FileDAO fileDAO;
@Override
public void initialize(ServerPluginContext context) throws Exception {
connection = new Mongo("localhost");
morphia = new Morphia().map(MongoDBChangeSet.class).map(MongoDBChangeSetEntry.class).map(MongoDBFile.class);
ds = morphia.createDatastore(connection, "rhq");
+ fileDAO = new FileDAO(ds.getDB());
}
@Override
@@ -120,7 +122,7 @@ public class MongoDBDriftServer implements DriftServerPluginFacet, ServerPluginC
changeSet.setResourceId(resourceId);
changeSet.setDriftConfigurationId(headers.getDriftCofigurationId());
changeSet.setDriftHandlingMode(DriftHandlingMode.normal);
- changeSet.setVersion(changeSetVersions++);
+ changeSet.setVersion(headers.getVersion());
summary.setCategory(headers.getType());
summary.setResourceId(resourceId);
commit 9953e04e402f873f5b5f7b0a73a70a51b73dcd85
Merge: 16af52a 3b0218f
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Sep 16 21:28:27 2011 -0400
Merge branch 'mongodb-drift'
commit 16af52a8cdbf0f87f8c092c5987e82daa564c78e
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Sep 16 16:10:55 2011 -0400
Updating test to set change set version from headers
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
index b46f003..1e1cc90 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
@@ -145,6 +145,7 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
headers.setDriftConfigurationName("test-1");
headers.setBasedir(rootDir.getAbsolutePath());
headers.setType(COVERAGE);
+ headers.setVersion(0);
String file1Hash = sha256("test-1-file-1");
@@ -176,6 +177,7 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
// the second change set should report drift
String modifiedFile1Hash = sha256("test-2-file-1-modified");
headers.setType(DRIFT);
+ headers.setVersion(1);
File changeSet2 = new File(changeSetsDir, "changeset-2.txt");
writer = new ChangeSetWriterImpl(changeSet2, headers);
commit 2b6b27a9e973264dec03743660da82583e751b4e
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Sep 16 16:03:36 2011 -0400
Have the agent track and store the change set version number
DriftDetector now updates the version header in the snapshot file and in
the drift change set file. The server now gets the change set version
that it stores in the db from the headers.
This change will allow the server to determine whether or not the agent
and server are in sync.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
index 6bad1b1..0beeb19 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
@@ -22,8 +22,9 @@ package org.rhq.core.pc.drift;
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -42,6 +43,7 @@ import static org.rhq.common.drift.FileEntry.changedFileEntry;
import static org.rhq.common.drift.FileEntry.removedFileEntry;
import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
+import static org.rhq.core.util.file.FileUtil.copyFile;
import static org.rhq.core.util.file.FileUtil.forEachFile;
public class DriftDetector implements Runnable {
@@ -102,12 +104,12 @@ public class DriftDetector implements Runnable {
int changes = 0;
try {
- if (changeSetMgr.changeSetExists(schedule.getResourceId(), createHeaders(schedule, COVERAGE))) {
+ if (changeSetMgr.changeSetExists(schedule.getResourceId(), createHeaders(schedule, COVERAGE, 0))) {
changeSetType = DRIFT;
changes = generateDriftChangeSet(schedule);
} else {
changeSetType = COVERAGE;
- generateCoverageChangeSet(schedule);
+ generateSnapshot(schedule);
}
} catch (IOException e) {
// TODO Call ChangeSetManager here to rollback any thing that was written to disk.
@@ -138,17 +140,14 @@ public class DriftDetector implements Runnable {
private int generateDriftChangeSet(final DriftDetectionSchedule schedule) throws IOException {
log.debug("Generating drift change set for " + schedule);
- final File basedir = new File(basedir(schedule.getResourceId(), schedule.getDriftConfiguration()));
- final ChangeSetWriter driftWriter = changeSetMgr.getChangeSetWriter(schedule.getResourceId(), createHeaders(
- schedule, DRIFT));
+ final File basedir = new File(basedir(schedule.getResourceId(), schedule.getDriftConfiguration()));
final ChangeSetReader coverageReader = changeSetMgr.getChangeSetReader(schedule.getResourceId(), schedule
.getDriftConfiguration().getName());
- final ChangeSetWriter coverageWriter = changeSetMgr.getChangeSetWriterForUpdate(schedule.getResourceId(),
- createHeaders(schedule, COVERAGE));
- final AtomicInteger changes = new AtomicInteger(0);
-
final Set<File> processedFiles = new HashSet<File>();
+ final List<FileEntry> snapshotEntries = new LinkedList<FileEntry>();
+ final List<FileEntry> deltaEntries = new LinkedList<FileEntry>();
+ int newVersion = coverageReader.getHeaders().getVersion() + 1;
// First look for files that have either been modified or deleted
for (FileEntry entry : coverageReader) {
@@ -158,26 +157,24 @@ public class DriftDetector implements Runnable {
if (log.isInfoEnabled()) {
log.info("Detected deleted file for " + schedule + " --> " + file.getAbsolutePath());
}
- driftWriter.write(removedFileEntry(entry.getFile(), entry.getNewSHA()));
- changes.incrementAndGet();
+ deltaEntries.add(removedFileEntry(entry.getFile(), entry.getNewSHA()));
} else {
processedFiles.add(file);
String currentSHA = sha256(file);
if (!currentSHA.equals(entry.getNewSHA())) {
- // The file has been updated
if (log.isInfoEnabled()) {
log.info("Detected modified file for " + schedule + " --> " + file.getAbsolutePath());
}
FileEntry modifiedEntry = changedFileEntry(entry.getFile(), entry.getNewSHA(), currentSHA);
- driftWriter.write(modifiedEntry);
- coverageWriter.write(modifiedEntry);
- changes.incrementAndGet();
+ deltaEntries.add(modifiedEntry);
+ snapshotEntries.add(modifiedEntry);
} else {
// The file has not changed
- coverageWriter.write(entry);
+ snapshotEntries.add(entry);
}
}
}
+ coverageReader.close();
// If the basedir is still valid we need to do a directory tree scan to look for newly added files
if (basedir.isDirectory()) {
@@ -195,9 +192,8 @@ public class DriftDetector implements Runnable {
}
FileEntry newEntry = addedFileEntry(relativePath(basedir, file), sha256(file));
- driftWriter.write(newEntry);
- coverageWriter.write(newEntry);
- changes.incrementAndGet();
+ deltaEntries.add(newEntry);
+ snapshotEntries.add(newEntry);
} catch (IOException e) {
log.error("An error occurred while generating a drift change set for " + schedule + ": "
+ e.getMessage());
@@ -208,18 +204,41 @@ public class DriftDetector implements Runnable {
}));
}
- driftWriter.close();
- coverageWriter.close();
- changeSetMgr.updateChangeSet(schedule.getResourceId(), createHeaders(schedule, COVERAGE));
+ if (deltaEntries.isEmpty()) {
+ // If nothing has changed, there is no need to add/update any files
+ return 0;
+ }
+
+ File snapshotFile = changeSetMgr.findChangeSet(schedule.getResourceId(),
+ schedule.getDriftConfiguration().getName(), COVERAGE);
+ File backupSnapshotFile = new File(snapshotFile.getParentFile(), snapshotFile.getName() + ".bak");
+ copyFile(snapshotFile, snapshotFile);
+
+ Headers deltaHeaders = createHeaders(schedule, DRIFT, newVersion);
+ Headers snapshotHeaders = createHeaders(schedule, COVERAGE, newVersion);
+
+ ChangeSetWriter deltaWriter = changeSetMgr.getChangeSetWriter(schedule.getResourceId(), deltaHeaders);
+ ChangeSetWriter snapshotWriter = changeSetMgr.getChangeSetWriter(schedule.getResourceId(), snapshotHeaders);
+
+ for (FileEntry entry : deltaEntries) {
+ deltaWriter.write(entry);
+ }
+ deltaWriter.close();
+
+ for (FileEntry entry : snapshotEntries) {
+ snapshotWriter.write(entry);
+ }
+ snapshotWriter.close();
+ backupSnapshotFile.delete();
- return changes.get();
+ return deltaEntries.size();
}
- private void generateCoverageChangeSet(final DriftDetectionSchedule schedule) throws IOException {
+ private void generateSnapshot(final DriftDetectionSchedule schedule) throws IOException {
log.debug("Generating coverage change set for " + schedule);
final ChangeSetWriter writer = changeSetMgr.getChangeSetWriter(schedule.getResourceId(), createHeaders(
- schedule, COVERAGE));
+ schedule, COVERAGE, 0));
final DriftConfiguration config = schedule.getDriftConfiguration();
final File basedir = new File(basedir(schedule.getResourceId(), config));
if (basedir.isDirectory()) {
@@ -262,13 +281,14 @@ public class DriftDetector implements Runnable {
return driftClient.getAbsoluteBaseDirectory(resourceId, driftConfig).getAbsolutePath();
}
- private Headers createHeaders(DriftDetectionSchedule schedule, DriftChangeSetCategory type) {
+ private Headers createHeaders(DriftDetectionSchedule schedule, DriftChangeSetCategory type, int version) {
Headers headers = new Headers();
headers.setResourceId(schedule.getResourceId());
headers.setDriftCofigurationId(schedule.getDriftConfiguration().getId());
headers.setDriftConfigurationName(schedule.getDriftConfiguration().getName());
headers.setBasedir(basedir(schedule.getResourceId(), schedule.getDriftConfiguration()));
headers.setType(type);
+ headers.setVersion(version);
return headers;
}
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
index 5d25e9d..21ec45b 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
@@ -46,6 +46,8 @@ import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
import static org.rhq.test.AssertUtils.assertCollectionMatchesNoOrder;
import static org.rhq.test.AssertUtils.assertPropertiesMatch;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
public class DriftDetectorTest extends DriftTest {
@@ -163,6 +165,34 @@ public class DriftDetectorTest extends DriftTest {
@SuppressWarnings("unchecked")
@Test
+ public void doNotUpdateSnapshotOrGenerateDriftChangeSetIfNothingChanges() throws Exception {
+ File confDir = mkdir(resourceDir, "conf");
+ File serverConf = createRandomFile(confDir, "server.conf");
+
+ DriftConfiguration config = driftConfiguration("nothing-to-update", resourceDir.getAbsolutePath());
+
+ scheduleQueue.addSchedule(new DriftDetectionSchedule(resourceId(), config));
+ detector.run();
+
+ File changeSet = changeSet(config.getName(), COVERAGE);
+ String originalHash = sha256(changeSet);
+
+ // Run the detector again. Note that nothing has changed so the snapshot should
+ // remain the same and no drift change set file should be generated.
+ detector.run();
+
+ String newHash = sha256(changeSet);
+
+ assertEquals(newHash, originalHash, "The snapshot file should not have changed since there was no drift.");
+
+ File driftChangeSet = changeSet(config.getName(), DRIFT);
+
+ assertFalse(driftChangeSet.exists(), "A drift change set file should not have been generated since there was "
+ + "no drift");
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
public void skipScheduledThatHasConfigDisabled() throws Exception {
detector.setDriftClient(new DriftClientTestStub() {
{
@@ -210,7 +240,7 @@ public class DriftDetectorTest extends DriftTest {
// verify that the drift change set was generated
assertTrue(driftChangeSet.exists(), "Expected to find drift change set " + driftChangeSet.getPath());
- assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT));
+ assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT, 1));
assertFileEntriesMatch("The drift change set does not match the expected values", driftEntries, driftChangeSet);
File coverageChangeSet = changeSet(config.getName(), COVERAGE);
@@ -219,7 +249,7 @@ public class DriftDetectorTest extends DriftTest {
addedFileEntry("conf/server-2.conf", sha256(server2Conf)));
// verify that the coverage change set was updated
- assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE));
+ assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE, 1));
assertFileEntriesMatch("The coverage change set was not updated as expected", coverageEntries,
coverageChangeSet);
}
@@ -250,14 +280,14 @@ public class DriftDetectorTest extends DriftTest {
// verify that the drift change set was generated
assertTrue(driftChangeSet.exists(), "Expected to find drift change set " + driftChangeSet.getPath());
- assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT));
+ assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT, 1));
assertFileEntriesMatch("The drift change set does not match the expected values", driftEntries, driftChangeSet);
File coverageChangeSet = changeSet(config.getName(), COVERAGE);
List<FileEntry> coverageEntries = asList(changedFileEntry("conf/server-1.conf", oldHash, newHash));
// verify that the coverage change set was updated
- assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE));
+ assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE, 1));
assertFileEntriesMatch("The coverage change set was not updated as expected", coverageEntries,
coverageChangeSet);
}
@@ -286,7 +316,7 @@ public class DriftDetectorTest extends DriftTest {
// verify that the drift change set was generated
assertTrue(driftChangeSet.exists(), "Expected to find drift change set " + driftChangeSet.getPath());
- assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT));
+ assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT, 1));
assertFileEntriesMatch("The drift change set does not match the expected values", driftEntries, driftChangeSet);
File coverageChangeSet = changeSet(config.getName(), COVERAGE);
@@ -295,7 +325,7 @@ public class DriftDetectorTest extends DriftTest {
addedFileEntry("conf/subconf/server-2.conf", sha256(server2Conf)));
// verify that the coverage change set was updated
- assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE));
+ assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE, 1));
assertFileEntriesMatch("The coverage change set was not updated as expected", coverageEntries,
coverageChangeSet);
}
@@ -327,20 +357,20 @@ public class DriftDetectorTest extends DriftTest {
// verify that the drift change set was generated
assertTrue(driftChangeSet.exists(), "Expected to find drift change set " + driftChangeSet.getPath());
- assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT));
+ assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT, 1));
assertFileEntriesMatch("The drift change set does not match the expected values", driftEntries, driftChangeSet);
// verify that the coverage change set was updated
File coverageChangeSet = changeSet(config.getName(), COVERAGE);
List<FileEntry> coverageEntries = asList(addedFileEntry("conf/server-1.conf", sha256(server1Conf)));
- assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE));
+ assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE, 1));
assertFileEntriesMatch("The coverage change set was not updated as expected", coverageEntries,
coverageChangeSet);
}
@SuppressWarnings("unchecked")
- @Test(enabled = false)
+ @Test
public void includeFilesInRemovedDirectoryInDriftChangeSet() throws Exception {
DriftConfiguration config = driftConfiguration("dir-removed-test", resourceDir.getAbsolutePath());
@@ -356,19 +386,22 @@ public class DriftDetectorTest extends DriftTest {
server1Conf.delete();
confDir.delete();
+ scheduleQueue.addSchedule(new DriftDetectionSchedule(resourceId(), config));
+ detector.run();
+
File driftChangeSet = changeSet(config.getName(), DRIFT);
List<FileEntry> driftEntries = asList(removedFileEntry("conf/server-1.conf", server1Hash));
// verify that the drift change set was generated
assertTrue(driftChangeSet.exists(), "Expected to find drift change set " + driftChangeSet.getPath());
- assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT));
+ assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT, 1));
assertFileEntriesMatch("The drift change set does not match the expected values", driftEntries, driftChangeSet);
// verify that the coverage change set was updated
File coverageChangeSet = changeSet(config.getName(), COVERAGE);
List<FileEntry> coverageEntries = emptyList();
- assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE));
+ assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE, 1));
assertFileEntriesMatch("The coverage change set was not updated as expected", coverageEntries,
coverageChangeSet);
}
@@ -392,12 +425,17 @@ public class DriftDetectorTest extends DriftTest {
}
Headers createHeaders(DriftConfiguration driftConfig, DriftChangeSetCategory type) {
+ return createHeaders(driftConfig, type, 0);
+ }
+
+ Headers createHeaders(DriftConfiguration driftConfig, DriftChangeSetCategory type, int version) {
Headers headers = new Headers();
headers.setResourceId(resourceId());
headers.setDriftCofigurationId(driftConfig.getId());
headers.setDriftConfigurationName(driftConfig.getName());
headers.setBasedir(resourceDir.getAbsolutePath());
headers.setType(type);
+ headers.setVersion(version);
return headers;
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
index f44000f..03705cd 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
@@ -19,9 +19,6 @@
*/
package org.rhq.enterprise.server.drift;
-import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
-import static org.rhq.core.domain.drift.DriftFileStatus.LOADED;
-
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
@@ -80,6 +77,9 @@ import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
+import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
+import static org.rhq.core.domain.drift.DriftFileStatus.LOADED;
+
/**
* The SLSB method implementation needed to support the JPA (RHQ Default) Drift Server Plugin.
*
@@ -253,7 +253,13 @@ public class JPADriftServerBean implements JPADriftServerLocal {
+ "]. Change set cannot be saved.");
return false;
}
- int version = getChangeSetVersion(resource, config);
+ // Commenting out the following line for now. We want to set the
+ // version to the value specified in the headers, but we also
+ // want to get the latest version we have in the database so that
+ // we can make sure that the agent is in sync with the server.
+ //
+ //int version = getChangeSetVersion(resource, config);
+ int version = reader.getHeaders().getVersion();
DriftChangeSetCategory category = reader.getHeaders().getType();
driftChangeSet = new JPADriftChangeSet(resource, version, category, config);
commit 74aa8d05d1ca8cc2c0055453ac108e49e640aa20
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Sep 16 14:29:14 2011 -0400
add configurability to the logging of the hibernate detach utility. with this checkin, the following happens:
1. by default, we only log at DEBUG level the number of objects detached and the duration it took IF it took longer than 10s
2. you can have it log a more detailed message at a certain threshold if you set the sysprop "rhq.server.hibernate-detach-utility.dump-stack-thresholds"
you set it to two numbers separated by a :, for example "5000:10000" means a message will be logged at the WARN
level IF the detach took longer that 5000ms OR the number of objects detached was over 10K.
We log the duration, number of objects AND the class of the object being detached (we can't log the object's toString because
that would be very long, especially for very large PageList of compound objects).
We also log the full stack trace so we know where the object came from.
diff --git a/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/safeinvoker/HibernateDetachUtility.java b/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/safeinvoker/HibernateDetachUtility.java
index 23f73ee..08c02e2 100644
--- a/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/safeinvoker/HibernateDetachUtility.java
+++ b/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/safeinvoker/HibernateDetachUtility.java
@@ -89,6 +89,11 @@ public class HibernateDetachUtility {
private static final String THROW_EXCEPTION_ON_DEPTH_LIMIT_SYSPROP = "rhq.server.hibernate-detach-utility.throw-exception-on-depth-limit";
private static final int depthAllowed;
private static final boolean throwExceptionOnDepthLimit;
+ private static final String DUMP_STACK_THRESHOLDS_SYSPROP = "rhq.server.hibernate-detach-utility.dump-stack-thresholds"; // e.g. "5000:10000" (millis:num-objects)
+ private static final boolean dumpStackOnThresholdLimit;
+ private static final long millisThresholdLimit;
+ private static final int sizeThresholdLimit;
+
static {
int value;
try {
@@ -107,6 +112,32 @@ public class HibernateDetachUtility {
booleanValue = true;
}
throwExceptionOnDepthLimit = booleanValue;
+
+ boolean tmp_dumpStackOnThresholdLimit;
+ long tmp_millisThresholdLimit;
+ int tmp_sizeThresholdLimit;
+ String prop = null;
+ try {
+ prop = System.getProperty(DUMP_STACK_THRESHOLDS_SYSPROP);
+ if (prop != null) {
+ String[] nums = prop.split(":");
+ tmp_dumpStackOnThresholdLimit = true;
+ tmp_millisThresholdLimit = Long.parseLong(nums[0]);
+ tmp_sizeThresholdLimit = Integer.parseInt(nums[1]);
+ } else {
+ tmp_dumpStackOnThresholdLimit = false;
+ tmp_millisThresholdLimit = Long.MAX_VALUE;
+ tmp_sizeThresholdLimit = Integer.MAX_VALUE;
+ }
+ } catch (Throwable t) {
+ LOG.warn("Bad value for [" + DUMP_STACK_THRESHOLDS_SYSPROP + "]=[" + prop + "]: " + t.toString());
+ tmp_dumpStackOnThresholdLimit = true; // they wanted to set it to something, so give them some defaults
+ tmp_millisThresholdLimit = 5000L; // 5 seconds
+ tmp_sizeThresholdLimit = 10000; // 10K objects
+ }
+ dumpStackOnThresholdLimit = tmp_dumpStackOnThresholdLimit;
+ millisThresholdLimit = tmp_millisThresholdLimit;
+ sizeThresholdLimit = tmp_sizeThresholdLimit;
}
public static void nullOutUninitializedFields(Object value, SerializationType serializationType) throws Exception {
@@ -115,11 +146,21 @@ public class HibernateDetachUtility {
Map<Integer, List<Object>> checkedObjectCollisionMap = new HashMap<Integer, List<Object>>();
nullOutUninitializedFields(value, checkedObjectMap, checkedObjectCollisionMap, 0, serializationType);
long duration = System.currentTimeMillis() - start;
- if (duration > 1000) {
- LOG.info("Detached [" + checkedObjectMap.size() + "] objects in [" + duration + "]ms");
+
+ if (dumpStackOnThresholdLimit) {
+ int numObjectsProcessed = checkedObjectMap.size();
+ if (duration > millisThresholdLimit || numObjectsProcessed > sizeThresholdLimit) {
+ String rootObjectString = (value != null) ? value.getClass().toString() : "null";
+ LOG.warn("Detached [" + numObjectsProcessed + "] objects in [" + duration + "]ms from root object ["
+ + rootObjectString + "]", new Throwable("HIBERNATE DETACH UTILITY STACK TRACE"));
+ }
} else {
- LOG.debug("Detached [" + checkedObjectMap.size() + "] objects in [" + duration + "]ms");
+ // 10s is really long, log SOMETHING
+ if (duration > 10000L && LOG.isDebugEnabled()) {
+ LOG.debug("Detached [" + checkedObjectMap.size() + "] objects in [" + duration + "]ms");
+ }
}
+
// help the garbage collector be clearing these before we leave
checkedObjectMap.clear();
checkedObjectCollisionMap.clear();
commit 3b0218f80107b98a02ed0d97b31fb50cdbc8ec28
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Sep 16 11:50:08 2011 -0400
Initial commit for FileDAO and FileDAO test
The work in this commit mainly involves getting more familiar with the
GridFS which to my pleasant suprise is very easy to use. So far FileDAO
has a finder method for fething a file by id. That may be the only
finder method needed. And FileDAO test not only tests the finder but
also demonstrates writing a file to MongoDB using GridFS.
diff --git a/modules/enterprise/server/plugins/drift-mongodb/pom.xml b/modules/enterprise/server/plugins/drift-mongodb/pom.xml
index 2cb4bbf..1f49403 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/pom.xml
+++ b/modules/enterprise/server/plugins/drift-mongodb/pom.xml
@@ -70,6 +70,13 @@
<version>1.0</version>
<optional>true</optional>
</dependency>
+
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.4</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
index 6c51441..3b56711 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
@@ -19,8 +19,6 @@
package org.rhq.enterprise.server.plugins.drift.mongodb;
-import static org.rhq.enterprise.server.util.LookupUtil.getResourceManager;
-
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
@@ -50,9 +48,9 @@ import org.rhq.core.domain.drift.Drift;
import org.rhq.core.domain.drift.DriftChangeSet;
import org.rhq.core.domain.drift.DriftChangeSetCategory;
import org.rhq.core.domain.drift.DriftComposite;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
import org.rhq.core.domain.drift.DriftFile;
import org.rhq.core.domain.drift.DriftSnapshot;
-import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
import org.rhq.core.domain.drift.dto.DriftChangeSetDTO;
import org.rhq.core.domain.drift.dto.DriftDTO;
import org.rhq.core.domain.drift.dto.DriftFileDTO;
@@ -69,6 +67,8 @@ import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBChangeSet
import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBFile;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
+import static org.rhq.enterprise.server.util.LookupUtil.getResourceManager;
+
public class MongoDBDriftServer implements DriftServerPluginFacet, ServerPluginComponent {
//private final Log log = LogFactory.getLog(MongoDBDriftServer.class);
@@ -113,14 +113,12 @@ public class MongoDBDriftServer implements DriftServerPluginFacet, ServerPluginC
@Override
public boolean visit(ZipEntry zipEntry, ZipInputStream stream) throws Exception {
ChangeSetReader reader = new ChangeSetReaderImpl(new BufferedReader(new InputStreamReader(stream)));
-
Headers headers = reader.getHeaders();
+
MongoDBChangeSet changeSet = new MongoDBChangeSet();
changeSet.setCategory(headers.getType());
changeSet.setResourceId(resourceId);
- // TODO Figure out how best to handle drift config reference
- changeSet.setDriftConfigurationId(1);
- // TODO Figure out how best to handle drift config drift handling mode
+ changeSet.setDriftConfigurationId(headers.getDriftCofigurationId());
changeSet.setDriftHandlingMode(DriftHandlingMode.normal);
changeSet.setVersion(changeSetVersions++);
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java
new file mode 100644
index 0000000..445c3bb
--- /dev/null
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java
@@ -0,0 +1,42 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.plugins.drift.mongodb.dao;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.DB;
+import com.mongodb.gridfs.GridFS;
+import com.mongodb.gridfs.GridFSDBFile;
+
+public class FileDAO {
+
+ private DB db;
+
+ private GridFS gridFS;
+
+ public FileDAO(DB db) {
+ this.db = db;
+ gridFS = new GridFS(this.db);
+ }
+
+ GridFSDBFile findOne(String hash) {
+ return gridFS.findOne(new BasicDBObject("_id", hash));
+ }
+
+}
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBFile.java b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBFile.java
index b771ae3..abdf836 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBFile.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBFile.java
@@ -54,4 +54,5 @@ public class MongoDBFile implements Serializable, DriftFile {
public void setStatus(DriftFileStatus status) {
this.status = status;
}
+
}
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/GridFSTest.java b/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/GridFSTest.java
index 057dfc5..da14b84 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/GridFSTest.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/GridFSTest.java
@@ -41,6 +41,10 @@ import static org.testng.Assert.assertNotNull;
public class GridFSTest {
+ // Tests need to be disabled when committed/pushed to the remote repo until we get
+ // mongodb installed on the hudson slave
+ static final boolean ENABLED = false;
+
Mongo connection;
DB db;
@@ -53,7 +57,7 @@ public class GridFSTest {
}
- @Test(enabled = false)
+ @Test(enabled = ENABLED)
public void writeAndReadFile() throws Exception {
GridFS gridFS = new GridFS(db);
File file = new File("/home/jsanda/clojure-plugin.tar");
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAOTest.java b/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAOTest.java
index 50b4572..bfcc480 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAOTest.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/ChangeSetDAOTest.java
@@ -42,7 +42,7 @@ import static org.rhq.core.domain.drift.DriftCategory.FILE_CHANGED;
import static org.rhq.core.domain.drift.DriftCategory.FILE_REMOVED;
import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
-import static org.rhq.core.domain.drift.DriftFileStatus.EMPTY;
+import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal;
import static org.rhq.test.AssertUtils.assertCollectionMatchesNoOrder;
import static org.rhq.test.AssertUtils.assertPropertiesMatch;
import static org.testng.Assert.assertNotNull;
@@ -89,6 +89,7 @@ public class ChangeSetDAOTest {
expected.setVersion(1);
expected.setDriftConfigurationId(1);
expected.setResourceId(1);
+ expected.setDriftHandlingMode(normal);
dao.save(expected);
MongoDBChangeSet actual = dao.get(expected.getObjectId());
@@ -108,12 +109,16 @@ public class ChangeSetDAOTest {
entry.setCategory(FILE_ADDED);
entry.setPath("foo");
- MongoDBFile file = new MongoDBFile();
- file.setDataSize(1024L);
- file.setHashId("a1b2c3d4");
- file.setStatus(EMPTY);
+ // Adding the file to the change set entry causes the test to fail because the
+ // custom assert uses the equals method when comparing the MongoDBFile objects and
+ // MongoDBFile does not implement equals/hashCode...yet.
- entry.setNewDriftFile(file);
+// MongoDBFile file = new MongoDBFile();
+// file.setDataSize(1024L);
+// file.setHashId("a1b2c3d4");
+// file.setStatus(EMPTY);
+//
+// entry.setNewDriftFile(file);
expected.add(entry);
dao.save(expected);
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAOTest.java b/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAOTest.java
new file mode 100644
index 0000000..ce2af01
--- /dev/null
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAOTest.java
@@ -0,0 +1,137 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.plugins.drift.mongodb.dao;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Random;
+
+import com.google.code.morphia.Datastore;
+import com.google.code.morphia.Morphia;
+import com.mongodb.BasicDBObject;
+import com.mongodb.Mongo;
+import com.mongodb.gridfs.GridFS;
+import com.mongodb.gridfs.GridFSDBFile;
+import com.mongodb.gridfs.GridFSInputFile;
+
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import org.rhq.core.util.MessageDigestGenerator;
+import org.rhq.core.util.stream.StreamUtil;
+import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBChangeSet;
+import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBChangeSetEntry;
+import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBFile;
+
+import static org.apache.commons.io.IOUtils.write;
+import static org.rhq.core.util.file.FileUtil.purge;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+public class FileDAOTest {
+ // Tests need to be disabled when committed/pushed to the remote repo until we get
+ // mongodb installed on the hudson slave
+ static final boolean ENABLED = false;
+
+ Mongo connection;
+
+ Morphia morphia;
+
+ Datastore ds;
+
+ FileDAO dao;
+
+ private File dataDir;
+
+ private GridFS gridFS;
+
+ private Random random;
+
+ private MessageDigestGenerator digestGenerator;
+
+ @BeforeClass
+ public void initDB() throws Exception {
+ connection = new Mongo("localhost");
+
+ morphia = new Morphia()
+ .map(MongoDBChangeSet.class)
+ .map(MongoDBChangeSetEntry.class)
+ .map(MongoDBFile.class);
+
+ ds = morphia.createDatastore(connection, "rhqtest");
+ gridFS = new GridFS(connection.getDB("rhqtest"));
+
+ dataDir = new File("target", getClass().getSimpleName());
+ if (dataDir.exists()) {
+ purge(dataDir, false);
+ }
+ dataDir.mkdirs();
+
+ random = new Random();
+ digestGenerator = new MessageDigestGenerator(MessageDigestGenerator.SHA_256);
+
+ dao = new FileDAO(connection.getDB("rhqtest"));
+ }
+
+ @BeforeMethod
+ public void clearCollections() {
+ gridFS.remove(new BasicDBObject());
+ }
+
+ @Test(enabled = ENABLED)
+ public void findFile() throws Exception {
+ File file = createRandomFile("findFile.expected");
+ String hash = sha256(file);
+
+ GridFSInputFile inputFile = gridFS.createFile(new FileInputStream(file));
+ inputFile.put("_id", hash);
+ inputFile.save();
+
+ GridFSDBFile dbFile = dao.findOne(hash);
+
+ assertNotNull(dbFile, "Expected to find file with name " + hash);
+ File actualFile = new File(dataDir, "findFile.actual");
+ StreamUtil.copy(dbFile.getInputStream(), new FileOutputStream(actualFile), true);
+
+ assertTrue(actualFile.exists(), "Expected to file " + actualFile.getPath());
+ }
+
+ private File createRandomFile(String fileName) throws Exception {
+ File file = new File(dataDir, fileName);
+ FileOutputStream stream = new FileOutputStream(file);
+ byte[] bytes = new byte[32];
+ random.nextBytes(bytes);
+ write(bytes, stream);
+ stream.close();
+
+ return file;
+ }
+
+ protected String sha256(File file) {
+ try {
+ return digestGenerator.calcDigestString(file);
+ } catch (IOException e) {
+ throw new RuntimeException("Failed to calculate SHA-256 hash for " + file.getPath(), e);
+ }
+ }
+}
commit d14cef63f02799b315e555cc3a7dd0b8d0072a58
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Fri Sep 16 08:16:46 2011 -0500
One more ignore added to git to avoid committing files used only for ci.
diff --git a/.gitignore b/.gitignore
index 93e206d..c72cd95 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,3 +26,4 @@ modules/enterprise/gui/coregui/build/classes/*
modules/enterprise/gui/content_http-war/build/classes/*
settings.xml
*rsa
+*_private.sh
commit ad51846da80118b42dad40216e6a2ce2d0f7b229
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Thu Sep 15 23:27:00 2011 -0500
Added two ignores required by the release scripts to prevent environment files to get committed to the repo.
diff --git a/.gitignore b/.gitignore
index e4ae4cd..93e206d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,5 @@ gwt-tmp/
modules/enterprise/gui/portal-war/build/classes/*
modules/enterprise/gui/coregui/build/classes/*
modules/enterprise/gui/content_http-war/build/classes/*
+settings.xml
+*rsa
commit eb50b72dad1558e042bfee3d7e4211e40d39cf91
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 15 22:57:51 2011 -0400
[BZ 738614] fix condition pretty printing - this is for email alert messages and other notifications
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
index 5bffb48..1275e26 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
@@ -60,7 +60,6 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.common.EntityContext;
import org.rhq.core.domain.criteria.AlertCriteria;
-import org.rhq.core.domain.measurement.MeasurementSchedule;
import org.rhq.core.domain.measurement.MeasurementUnits;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.resource.Resource;
@@ -79,7 +78,6 @@ import org.rhq.enterprise.server.authz.PermissionException;
import org.rhq.enterprise.server.authz.RequiredPermission;
import org.rhq.enterprise.server.core.EmailManagerLocal;
import org.rhq.enterprise.server.measurement.instrumentation.MeasurementMonitor;
-import org.rhq.enterprise.server.measurement.util.MeasurementFormatter;
import org.rhq.enterprise.server.operation.OperationManagerLocal;
import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer;
import org.rhq.enterprise.server.plugin.pc.alert.AlertSender;
@@ -814,94 +812,269 @@ public class AlertManagerBean implements AlertManagerLocal, AlertManagerRemote {
}
private String prettyPrintAlertCondition(AlertCondition condition, boolean shortVersion) {
- StringBuilder builder = new StringBuilder();
+ StringBuilder str = new StringBuilder();
AlertConditionCategory category = condition.getCategory();
+ switch (category) {
+ case AVAILABILITY: {
+ if ("up".equalsIgnoreCase(condition.getOption())) {
+ if (shortVersion) {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_AVAILABILITY_UP_SHORT));
+ } else {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_AVAILABILITY_UP));
+ }
+ } else {
+ if (shortVersion) {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_AVAILABILITY_DOWN_SHORT));
+ } else {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_AVAILABILITY_DOWN));
+ }
+ }
- // first format the LHS of the operator
- if (category == AlertConditionCategory.CONTROL) {
+ break;
+ }
+ case THRESHOLD: {
+ double value = condition.getThreshold();
+ MeasurementUnits units = condition.getMeasurementDefinition().getUnits();
+ String formatted = MeasurementConverter.format(value, units, true);
+
+ if (condition.getOption() == null) {
+ String metricName = condition.getName();
+ String comparator = condition.getComparator();
+ str.append(metricName).append(' ').append(comparator).append(' ').append(formatted);
+ } else {
+ // this is a calltime threshold condition
+ String metricName = "";
+ if (condition.getMeasurementDefinition() != null) {
+ metricName = condition.getMeasurementDefinition().getDisplayName();
+ }
+
+ String limit = condition.getOption(); // MIN, MAX, AVG (never null)
+ String comparator = condition.getComparator(); // <, >, =
+
+ if (condition.getName() != null && condition.getName().length() > 0) {
+ String regex = condition.getName();
+ if (shortVersion) {
+ str.append(AlertI18NFactory.getMessage(
+ AlertI18NResourceKeys.ALERT_METRIC_CALLTIME_THRESHOLD_WITH_EXPR_SHORT, metricName, limit,
+ comparator, formatted, regex));
+ } else {
+ str.append(AlertI18NFactory.getMessage(
+ AlertI18NResourceKeys.ALERT_METRIC_CALLTIME_THRESHOLD_WITH_EXPR, metricName, limit,
+ comparator, formatted, regex));
+ }
+ } else {
+ if (shortVersion) {
+ str.append(AlertI18NFactory.getMessage(
+ AlertI18NResourceKeys.ALERT_METRIC_CALLTIME_THRESHOLD_SHORT, metricName, limit, comparator,
+ formatted));
+ } else {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_METRIC_CALLTIME_THRESHOLD,
+ metricName, limit, comparator, formatted));
+ }
+ }
+ }
+ break;
+ }
+ case BASELINE: {
+ String metricName = condition.getName();
+ String comparator = condition.getComparator();
+ double value = condition.getThreshold();
+ MeasurementUnits units = MeasurementUnits.PERCENTAGE;
+ String percentage = MeasurementConverter.format(value, units, true);
+ String baselineThreshold = condition.getOption(); // mean, min, max
+
+ if (shortVersion) {
+ if (baselineThreshold.equalsIgnoreCase("min")) {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_BASELINE_MIN_SHORT, metricName,
+ comparator, percentage));
+ } else if (baselineThreshold.equalsIgnoreCase("max")) {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_BASELINE_MAX_SHORT, metricName,
+ comparator, percentage));
+ } else { // mean
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_BASELINE_MEAN_SHORT, metricName,
+ comparator, percentage));
+ }
+ } else {
+ if (baselineThreshold.equalsIgnoreCase("min")) {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_BASELINE_MIN, metricName,
+ comparator, percentage));
+ } else if (baselineThreshold.equalsIgnoreCase("max")) {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_BASELINE_MAX, metricName,
+ comparator, percentage));
+ } else { // mean
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_BASELINE_MEAN, metricName,
+ comparator, percentage));
+ }
+ }
+ break;
+ }
+ case CHANGE: {
+ if (condition.getOption() == null) {
+ String metricName = condition.getName();
+ if (shortVersion) {
+ str.append(AlertI18NFactory
+ .getMessage(AlertI18NResourceKeys.ALERT_METRIC_CHANGED_SHORT, metricName));
+ } else {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_METRIC_CHANGED, metricName));
+ }
+ } else {
+ // this is a calltime change condition
+ double value = condition.getThreshold();
+ MeasurementUnits units = MeasurementUnits.PERCENTAGE;
+ String formatted = MeasurementConverter.format(value, units, true);
+
+ String comparator;
+ if ("HI".equalsIgnoreCase(condition.getComparator())) {
+ comparator = AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_METRIC_CALLTIME_CHANGE_GROWS);
+ } else if ("LO".equalsIgnoreCase(condition.getComparator())) {
+ comparator = AlertI18NFactory
+ .getMessage(AlertI18NResourceKeys.ALERT_METRIC_CALLTIME_CHANGE_SHRINKS);
+ } else { // CH
+ comparator = AlertI18NFactory
+ .getMessage(AlertI18NResourceKeys.ALERT_METRIC_CALLTIME_CHANGE_CHANGES);
+ }
+
+ String metricName = "";
+ if (condition.getMeasurementDefinition() != null) {
+ metricName = condition.getMeasurementDefinition().getDisplayName();
+ }
+
+ String limit = condition.getOption(); // MIN, MAX, AVG (never null)
+
+ if (condition.getName() != null && condition.getName().length() > 0) {
+ String regex = condition.getName();
+ if (shortVersion) {
+ str.append(AlertI18NFactory.getMessage(
+ AlertI18NResourceKeys.ALERT_METRIC_CALLTIME_CHANGE_WITH_EXPR_SHORT, metricName, limit,
+ comparator, formatted, regex));
+ } else {
+ str.append(AlertI18NFactory.getMessage(
+ AlertI18NResourceKeys.ALERT_METRIC_CALLTIME_CHANGE_WITH_EXPR, metricName, limit,
+ comparator, formatted, regex));
+ }
+ } else {
+ if (shortVersion) {
+ str.append(AlertI18NFactory.getMessage(
+ AlertI18NResourceKeys.ALERT_METRIC_CALLTIME_CHANGE_SHORT, metricName, limit, comparator,
+ formatted));
+ } else {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_METRIC_CALLTIME_CHANGE,
+ metricName, limit, comparator, formatted));
+ }
+ }
+ }
+ break;
+ }
+ case TRAIT: {
+ String metricName = condition.getName();
+ if (shortVersion) {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_METRIC_CHANGED_SHORT, metricName));
+ } else {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_METRIC_CHANGED, metricName));
+ }
+ break;
+ }
+ case CONTROL: {
+ String opName;
try {
Integer resourceTypeId = condition.getAlertDefinition().getResource().getResourceType().getId();
String operationName = condition.getName();
OperationDefinition definition = operationManager.getOperationDefinitionByResourceTypeAndName(
resourceTypeId, operationName, false);
- builder.append(definition.getDisplayName()).append(' ');
+ opName = definition.getDisplayName();
} catch (Exception e) {
- builder.append(condition.getName()).append(' ');
+ opName = condition.getName(); // can't look up the op display name (are we in a test?), just use the op name
}
- } else {
- if (category.getName() != null) // this is null for e.g. availability
- builder.append(condition.getName()).append(' ');
- }
-
- // next format the RHS
- if (category == AlertConditionCategory.CONTROL) {
- builder.append(condition.getOption());
- } else if ((category == AlertConditionCategory.THRESHOLD) || (category == AlertConditionCategory.BASELINE)) {
- builder.append(condition.getComparator());
- builder.append(' ');
-
- MeasurementSchedule schedule = null;
- MeasurementUnits units;
- double value = condition.getThreshold();
- if (category == AlertConditionCategory.THRESHOLD) {
- units = condition.getMeasurementDefinition().getUnits();
- } else // ( category == AlertConditionCategory.BASELINE )
- {
- units = MeasurementUnits.PERCENTAGE;
+ String status = condition.getOption();
+ if (shortVersion) {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_OPERATION_SHORT, opName, status));
+ } else {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_OPERATION, opName, status));
}
- String formatted = MeasurementConverter.format(value, units, true);
- builder.append(formatted);
-
- if (category == AlertConditionCategory.BASELINE) {
- builder.append(" of ");
- builder.append(MeasurementFormatter.getBaselineText(condition.getOption(), schedule));
+ break;
+ }
+ case RESOURCE_CONFIG: {
+ if (shortVersion) {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_RESOURCECONFIGCHANGE_SHORT));
+ } else {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_RESOURCECONFIGCHANGE));
}
- } else if ((category == AlertConditionCategory.RESOURCE_CONFIG) || (category == AlertConditionCategory.CHANGE)
- || (category == AlertConditionCategory.TRAIT)) {
-
- if (shortVersion)
- builder.append(AlertI18NFactory
- .getMessage(AlertI18NResourceKeys.ALERT_CURRENT_LIST_VALUE_CHANGED_SHORT));
- else
- builder.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_CURRENT_LIST_VALUE_CHANGED));
-
- } else if (category == AlertConditionCategory.EVENT) {
- if ((condition.getOption() != null) && (condition.getOption().length() > 0)) {
- String propsCbEventSeverityRegexMatch;
- if (shortVersion)
- propsCbEventSeverityRegexMatch = AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_EVENT_SEVERITY_REGEX_MATCH_SHORT;
- else
- propsCbEventSeverityRegexMatch = AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_EVENT_SEVERITY_REGEX_MATCH;
-
- builder.append(AlertI18NFactory.getMessage(propsCbEventSeverityRegexMatch, condition.getName(),
- condition.getOption()));
+ break;
+ }
+ case EVENT: {
+ String severity = condition.getName();
+ if (condition.getOption() != null && condition.getOption().length() > 0) {
+ String expression = condition.getOption();
+ if (shortVersion) {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_EVENT_WITH_EXPR_SHORT, severity,
+ expression));
+ } else {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_EVENT_WITH_EXPR, severity,
+ expression));
+ }
} else {
- if (shortVersion)
- builder.append(AlertI18NFactory.getMessage(
- AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_EVENT_SEVERITY_SHORT, condition.getName()));
- else
- builder.append(AlertI18NFactory.getMessage(
- AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_EVENT_SEVERITY, condition.getName()));
+ if (shortVersion) {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_EVENT_SHORT, severity));
+ } else {
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_EVENT, severity));
+ }
}
- } else if (category == AlertConditionCategory.AVAILABILITY) {
- if (shortVersion)
- builder.append(AlertI18NFactory.getMessage(
- AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_AVAILABILITY_SHORT, condition.getOption()));
- else
- builder.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_AVAILABILITY,
- condition.getOption()));
- } else if (category == AlertConditionCategory.DRIFT) {
- if (shortVersion)
- builder.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_DRIFT_SHORT,
- condition.getOption()));
- else
- builder.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_DRIFT, condition
- .getOption()));
- } else if (category == AlertConditionCategory.RANGE) {
+ break;
+ }
+ case DRIFT: {
+ String configNameRegex = condition.getName();
+ String pathNameRegex = condition.getOption();
+ if (shortVersion) {
+ if (configNameRegex == null || configNameRegex.length() == 0) {
+ if (pathNameRegex == null || pathNameRegex.length() == 0) {
+ // neither a config name regex nor path regex was specified
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_DRIFT_SHORT));
+ } else {
+ // a path name regex was specified, but not a config name regex
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_DRIFT_ONLYPATHS_SHORT,
+ pathNameRegex));
+ }
+ } else {
+ if (pathNameRegex == null || pathNameRegex.length() == 0) {
+ // a config name regex was specified, but not a path name regex
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_DRIFT_ONLYCONFIG_SHORT,
+ configNameRegex));
+ } else {
+ // both a config name regex and a path regex was specified
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_DRIFT_CONFIGPATHS_SHORT,
+ pathNameRegex, configNameRegex));
+ }
+ }
+ } else {
+ if (configNameRegex == null || configNameRegex.length() == 0) {
+ if (pathNameRegex == null || pathNameRegex.length() == 0) {
+ // neither a config name regex nor path regex was specified
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_DRIFT));
+ } else {
+ // a path name regex was specified, but not a config name regex
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_DRIFT_ONLYPATHS,
+ pathNameRegex));
+ }
+ } else {
+ if (pathNameRegex == null || pathNameRegex.length() == 0) {
+ // a config name regex was specified, but not a path name regex
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_DRIFT_ONLYCONFIG,
+ configNameRegex));
+ } else {
+ // both a config name regex and a path regex was specified
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_DRIFT_CONFIGPATHS,
+ pathNameRegex, configNameRegex));
+ }
+ }
+ }
+ break;
+ }
+ case RANGE: {
+ String metricName = condition.getName();
Double loValue = condition.getThreshold();
String hiValueStr = condition.getOption();
@@ -920,55 +1093,55 @@ public class AlertManagerBean implements AlertManagerLocal, AlertManagerRemote {
}
}
+ // < means "inside the range", > means "outside the range" - exclusive
+ // <= means "inside the range", >= means "outside the range" - inclusive
+
if ("<".equals(condition.getComparator())) {
if (shortVersion) {
- builder.append(AlertI18NFactory.getMessage(
- AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_INSIDE_EXCL_RANGE_SHORT, loValueFormatted,
- hiValueFormatted));
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_RANGE_INSIDE_EXCL_SHORT,
+ metricName, loValueFormatted, hiValueFormatted));
} else {
- builder.append(AlertI18NFactory.getMessage(
- AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_INSIDE_EXCL_RANGE, loValueFormatted,
- hiValueFormatted));
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_RANGE_INSIDE_EXCL, metricName,
+ loValueFormatted, hiValueFormatted));
}
} else if (">".equals(condition.getComparator())) {
if (shortVersion) {
- builder.append(AlertI18NFactory.getMessage(
- AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_OUTSIDE_EXCL_RANGE_SHORT, loValueFormatted,
- hiValueFormatted));
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_RANGE_OUTSIDE_EXCL_SHORT,
+ metricName, loValueFormatted, hiValueFormatted));
} else {
- builder.append(AlertI18NFactory.getMessage(
- AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_OUTSIDE_EXCL_RANGE, loValueFormatted,
- hiValueFormatted));
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_RANGE_OUTSIDE_EXCL, metricName,
+ loValueFormatted, hiValueFormatted));
}
} else if ("<=".equals(condition.getComparator())) {
if (shortVersion) {
- builder.append(AlertI18NFactory.getMessage(
- AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_INSIDE_INCL_RANGE_SHORT, loValueFormatted,
- hiValueFormatted));
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_RANGE_INSIDE_INCL_SHORT,
+ metricName, loValueFormatted, hiValueFormatted));
} else {
- builder.append(AlertI18NFactory.getMessage(
- AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_INSIDE_INCL_RANGE, loValueFormatted,
- hiValueFormatted));
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_RANGE_INSIDE_INCL, metricName,
+ loValueFormatted, hiValueFormatted));
}
} else if (">=".equals(condition.getComparator())) {
if (shortVersion) {
- builder.append(AlertI18NFactory.getMessage(
- AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_OUTSIDE_INCL_RANGE_SHORT, loValueFormatted,
- hiValueFormatted));
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_RANGE_OUTSIDE_INCL_SHORT,
+ metricName, loValueFormatted, hiValueFormatted));
} else {
- builder.append(AlertI18NFactory.getMessage(
- AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_OUTSIDE_INCL_RANGE, loValueFormatted,
- hiValueFormatted));
+ str.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_RANGE_OUTSIDE_INCL, metricName,
+ loValueFormatted, hiValueFormatted));
}
} else {
- builder.append("invalid range comparator [" + condition.getComparator() + "] (" + loValueFormatted
- + "," + hiValueFormatted + ")");
+ str.append("invalid range comparator [" + condition.getComparator() + "] (" + loValueFormatted + ","
+ + hiValueFormatted + ")");
}
- } else {
- // do nothing
+
+ break;
+ }
+ default: {
+ str.append("unknown category [" + category.name() + "]");
+ break;
+ }
}
- return builder.toString();
+ return str.toString();
}
public String prettyPrintAlertURL(Alert alert) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/i18n/AlertI18NResourceKeys.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/i18n/AlertI18NResourceKeys.java
index d48f93a..f3ab9a6 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/i18n/AlertI18NResourceKeys.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/i18n/AlertI18NResourceKeys.java
@@ -22,77 +22,172 @@ import mazz.i18n.annotation.I18NMessage;
import mazz.i18n.annotation.I18NMessages;
import mazz.i18n.annotation.I18NResourceBundle;
-/**
- * @author Joseph Marques
- */
-
@I18NResourceBundle(baseName = "alert-messages", defaultLocale = "en")
public interface AlertI18NResourceKeys {
- @I18NMessages( { @I18NMessage("value is between {0} and {1}, inclusive"),
- @I18NMessage(locale = "de", value = "Der Wert zwischen {0} und {1}, pauschal") })
- String ALERT_CONFIG_PROPS_CB_INSIDE_INCL_RANGE = "alert.config.props.CB.InsideRange.incl.";
+ @I18NMessages( { @I18NMessage("Availability goes UP"),
+ @I18NMessage(locale = "de", value = "Verfï¿œgbarkeit wird AUF") })
+ String ALERT_AVAILABILITY_UP = "alert.condition.availability.up";
+
+ @I18NMessages( { @I18NMessage("Avail goes UP"), @I18NMessage(locale = "de", value = "Verf. wird AUF") })
+ String ALERT_AVAILABILITY_UP_SHORT = "alert.condition.availability.up.short";
+
+ @I18NMessages( { @I18NMessage("Availability goes DOWN"),
+ @I18NMessage(locale = "de", value = "Verfï¿œgbarkeit wird NACH UNTEN") })
+ String ALERT_AVAILABILITY_DOWN = "alert.condition.availability.down";
+
+ @I18NMessages( { @I18NMessage("Avail goes DOWN"), @I18NMessage(locale = "de", value = "Verf. wird NACH UNTEN") })
+ String ALERT_AVAILABILITY_DOWN_SHORT = "alert.condition.availability.down.short";
+
+ // Foo Prop > 10.0% of Baseline Mean Value
+ @I18NMessages( { @I18NMessage("{0} {1} {2} of Baseline Mean Value") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_BASELINE_MEAN = "alert.condition.baseline.mean";
+
+ // Foo Prop > 10.0% bl mean
+ @I18NMessages( { @I18NMessage("{0} {1} {2} bl mean") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_BASELINE_MEAN_SHORT = "alert.condition.baseline.mean.short";
+
+ @I18NMessages( { @I18NMessage("{0} {1} {2} of Baseline Minimum Value") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_BASELINE_MIN = "alert.condition.baseline.min";
+
+ @I18NMessages( { @I18NMessage("{0} {1} {2} bl min") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_BASELINE_MIN_SHORT = "alert.condition.baseline.min.short";
+
+ @I18NMessages( { @I18NMessage("{0} {1} {2} of Baseline Maximum Value") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_BASELINE_MAX = "alert.condition.baseline.max";
+
+ @I18NMessages( { @I18NMessage("{0} {1} {2} bl max") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_BASELINE_MAX_SHORT = "alert.condition.baseline.max.short";
+
+ // Calltime Metric Foo MAX > 1.0 with calltime destination matching "*.txt"
+ @I18NMessages( { @I18NMessage("Calltime Metric {0} {1} {2} {3} with calltime destination matching \"{4}\"") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_METRIC_CALLTIME_THRESHOLD_WITH_EXPR = "alert.condition.calltime-threshold-with-expr";
+
+ // Foo MAX > 1.0 matching "*.txt"
+ @I18NMessages( { @I18NMessage("{0} {1} {2} {3} matching \"{4}\"") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_METRIC_CALLTIME_THRESHOLD_WITH_EXPR_SHORT = "alert.condition.calltime-threshold-with-expr.short";
+
+ // Calltime Metric Foo MAX > 1.0
+ @I18NMessages( { @I18NMessage("Calltime Metric {0} {1} {2} {3}") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_METRIC_CALLTIME_THRESHOLD = "alert.condition.calltime-threshold";
+
+ // Foo MAX > 1.0
+ @I18NMessages( { @I18NMessage("{0} {1} {2} {3}") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_METRIC_CALLTIME_THRESHOLD_SHORT = "alert.condition.calltime-threshold.short";
+
+ @I18NMessages( { @I18NMessage("grows") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_METRIC_CALLTIME_CHANGE_GROWS = "alert.condition.calltime-change.grows";
+
+ @I18NMessages( { @I18NMessage("shrinks") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_METRIC_CALLTIME_CHANGE_SHRINKS = "alert.condition.calltime-change.shrinks";
+
+ @I18NMessages( { @I18NMessage("changes") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_METRIC_CALLTIME_CHANGE_CHANGES = "alert.condition.calltime-change.changes";
+
+ // Calltime Metric Foo MAX (grows/shrinks/changes) by at least 1% with calltime destination matching "*.txt"
+ @I18NMessages( { @I18NMessage("Calltime Metric {0} {1} {2} by at least {3} with calltime destination matching \"{4}\"") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_METRIC_CALLTIME_CHANGE_WITH_EXPR = "alert.condition.calltime-change-with-expr";
+
+ // Foo MAX (grows/shrinks/changes) by 1% matching "*.txt"
+ @I18NMessages( { @I18NMessage("{0} {1} {2} by {3} matching \"{4}\"") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_METRIC_CALLTIME_CHANGE_WITH_EXPR_SHORT = "alert.condition.calltime-change-with-expr.short";
+
+ // Calltime Metric Foo MAX (grows/shrinks/changes) by at least 1%
+ @I18NMessages( { @I18NMessage("Calltime Metric {0} {1} {2} by at least {3}") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_METRIC_CALLTIME_CHANGE = "alert.condition.calltime-change";
+
+ // Foo MAX (grows/shrinks/changes) by 1%
+ @I18NMessages( { @I18NMessage("{0} {1} {2} by {3}") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_METRIC_CALLTIME_CHANGE_SHORT = "alert.condition.calltime-change.short";
+
+ // Foo Value Changed
+ @I18NMessages( { @I18NMessage("{0} Value Changed"),
+ @I18NMessage(locale = "de", value = "{0} Der Wert hat sich geï¿œndert") })
+ String ALERT_METRIC_CHANGED = "alert.condition.metric.changed";
+
+ @I18NMessages( { @I18NMessage("{0} Val Chg"), @I18NMessage(locale = "de", value = "{0} Wertï¿œnd.") })
+ String ALERT_METRIC_CHANGED_SHORT = "alert.condition.metric.changed.short";
+
+ @I18NMessages( { @I18NMessage("Operation [{0}] has status=[{1}]") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_OPERATION = "alert.condition.op";
+
+ @I18NMessages( { @I18NMessage("Op [{0}]={1}") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_OPERATION_SHORT = "alert.condition.op.short";
+
+ @I18NMessages( { @I18NMessage("Resource Configuration Changed") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_RESOURCECONFIGCHANGE = "alert.condition.resconfigchange";
+
+ @I18NMessages( { @I18NMessage("Res Config Chg") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_RESOURCECONFIGCHANGE_SHORT = "alert.condition.resconfigchange.short";
+
+ @I18NMessages( { @I18NMessage("Event With Severity [{0}]") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_EVENT = "alert.condition.event";
+
+ // [WARN] Event
+ @I18NMessages( { @I18NMessage("[{0}] Event") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_EVENT_SHORT = "alert.condition.event.short";
+
+ @I18NMessages( { @I18NMessage("Event With Severity [{0}] Matching Expression \"{1}\"") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_EVENT_WITH_EXPR = "alert.condition.event-with-expr";
- @I18NMessages( { @I18NMessage("between {0} and {1}, incl"),
- @I18NMessage(locale = "de", value = "zwischen {0} und {1}, paus") })
- String ALERT_CONFIG_PROPS_CB_INSIDE_INCL_RANGE_SHORT = "alert.config.props.CB.InsideRange.incl.short";
+ @I18NMessages( { @I18NMessage("[{0}] Event Matching \"{1}\"") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_EVENT_WITH_EXPR_SHORT = "alert.condition.event-with-expr.short";
- @I18NMessages( { @I18NMessage("value is between {0} and {1}, exclusive"),
- @I18NMessage(locale = "de", value = "Der Wert zwischen {0} und {1}, exklusiv") })
- String ALERT_CONFIG_PROPS_CB_INSIDE_EXCL_RANGE = "alert.config.props.CB.InsideRange.excl";
+ @I18NMessages( { @I18NMessage("Drift Detected") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_DRIFT = "alert.condition.drift";
- @I18NMessages( { @I18NMessage("between {0} and {1}, excl"),
- @I18NMessage(locale = "de", value = "zwischen {0} und {1}, exkl.") })
- String ALERT_CONFIG_PROPS_CB_INSIDE_EXCL_RANGE_SHORT = "alert.config.props.CB.InsideRange.excl.short";
+ @I18NMessages( { @I18NMessage("Drift!") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_DRIFT_SHORT = "alert.condition.drift.short";
- @I18NMessages( { @I18NMessage("value is outside {0} and {1}, inclusive"),
- @I18NMessage(locale = "de", value = "Der Wert auÃerhalb {0} und {1}, pauschal") })
- String ALERT_CONFIG_PROPS_CB_OUTSIDE_INCL_RANGE = "alert.config.props.CB.OutsideRange.incl";
+ @I18NMessages( { @I18NMessage("Drift detected for files that match \"{0}\" and for drift configuration [{1}]") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_DRIFT_CONFIGPATHS = "alert.condition.drift.configpaths";
- @I18NMessages( { @I18NMessage("outside {0} and {1}, incl"),
- @I18NMessage(locale = "de", value = "auÃerhalb {0} und {1}, paus") })
- String ALERT_CONFIG_PROPS_CB_OUTSIDE_INCL_RANGE_SHORT = "alert.config.props.CB.OutsideRange.incl.short";
+ @I18NMessages( { @I18NMessage("Drift matching \"{0}\", config=[{1}]") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_DRIFT_CONFIGPATHS_SHORT = "alert.condition.drift.configpaths.short";
- @I18NMessages( { @I18NMessage("value is outside {0} and {1}, exclusive"),
- @I18NMessage(locale = "de", value = "Der Wert auÃerhalb {0} und {1}, exklusiv") })
- String ALERT_CONFIG_PROPS_CB_OUTSIDE_EXCL_RANGE = "alert.config.props.CB.OutsideRange.excl";
+ @I18NMessages( { @I18NMessage("Drift detected for drift configuration [{0}]") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_DRIFT_ONLYCONFIG = "alert.condition.drift.onlyconfig";
- @I18NMessages( { @I18NMessage("outside {0} and {1}, excl"),
- @I18NMessage(locale = "de", value = "auÃerhalb {0} und {1}, exkl") })
- String ALERT_CONFIG_PROPS_CB_OUTSIDE_EXCL_RANGE_SHORT = "alert.config.props.CB.OutsideRange.excl.short";
+ @I18NMessages( { @I18NMessage("Drift! config=[{0}]") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_DRIFT_ONLYCONFIG_SHORT = "alert.condition.drift.onlyconfig.short";
- @I18NMessages( { @I18NMessage("Drift detected"), @I18NMessage(locale = "de", value = "Ãnderung erkannt") })
- String ALERT_CONFIG_PROPS_CB_DRIFT = "alert.config.props.CB.Drift";
+ @I18NMessages( { @I18NMessage("Drift detected for files that match \"{0}\"") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_DRIFT_ONLYPATHS = "alert.condition.drift.onlypaths";
- @I18NMessages( { @I18NMessage("Drift detected"), @I18NMessage(locale = "de", value = "Ãnderung erkannt") })
- String ALERT_CONFIG_PROPS_CB_DRIFT_SHORT = "alert.config.props.CB.Drift.short";
+ @I18NMessages( { @I18NMessage("Drift matching \"{0}\"") /*, @I18NMessage(locale = "de", value = "") */})
+ String ALERT_DRIFT_ONLYPATHS_SHORT = "alert.condition.drift.onlypaths.short";
- @I18NMessages( { @I18NMessage("Availability goes {0}"),
- @I18NMessage(locale = "de", value = "Verfï¿œgbarkeit wird {0}") })
- String ALERT_CONFIG_PROPS_CB_AVAILABILITY = "alert.config.props.CB.Availability";
+ // Foo Value is Between 1.0B and 2.0B, Inclusive
+ @I18NMessages( { @I18NMessage("{0} Value is Between {1} and {2}, Inclusive"),
+ @I18NMessage(locale = "de", value = "{0} Der Wert zwischen {1} und {2}, pauschal") })
+ String ALERT_RANGE_INSIDE_INCL = "alert.condition.range.in.incl";
- @I18NMessages( { @I18NMessage("Avail goes {0}"), @I18NMessage(locale = "de", value = "Verf. wird {0}") })
- String ALERT_CONFIG_PROPS_CB_AVAILABILITY_SHORT = "alert.config.props.CB.Availability.short";
+ @I18NMessages( { @I18NMessage("{0} Between {1} - {2}, incl"),
+ @I18NMessage(locale = "de", value = "{0} zwischen {1} und {2}, paus") })
+ String ALERT_RANGE_INSIDE_INCL_SHORT = "alert.condition.range.in.incl.short";
- @I18NMessages( { @I18NMessage("Event Severity: {0}"),
- @I18NMessage(locale = "de", value = "Schwere des Ereignesses: {0}") })
- String ALERT_CONFIG_PROPS_CB_EVENT_SEVERITY = "alert.config.props.CB.EventSeverity";
+ @I18NMessages( { @I18NMessage("{0} Value is Between {1} and {2}, Exclusive"),
+ @I18NMessage(locale = "de", value = "{0} Der Wert zwischen {1} und {2}, exklusiv") })
+ String ALERT_RANGE_INSIDE_EXCL = "alert.condition.range.in.excl";
- @I18NMessages( { @I18NMessage("Sev: {0}"), @I18NMessage(locale = "de", value = "Schwere: {0}") })
- String ALERT_CONFIG_PROPS_CB_EVENT_SEVERITY_SHORT = "alert.config.props.CB.EventSeverity.short";
+ @I18NMessages( { @I18NMessage("{0} Between {1} - {2}, excl"),
+ @I18NMessage(locale = "de", value = "{0} zwischen {1} - {2}, exkl.") })
+ String ALERT_RANGE_INSIDE_EXCL_SHORT = "alert.condition.range.in.excl.short";
- @I18NMessages( { @I18NMessage("Event Severity: {0} and matching expression \"{1}\""),
- @I18NMessage(locale = "de", value = "Schwere des Ereignesses: {0} und zugehï¿œriger Ausdruck \"{1}\"") })
- String ALERT_CONFIG_PROPS_CB_EVENT_SEVERITY_REGEX_MATCH = "alert.config.props.CB.EventSeverity.RegexMatch";
+ @I18NMessages( { @I18NMessage("{0} Value is Outside {1} and {2}, Inclusive"),
+ @I18NMessage(locale = "de", value = "{0} Der Wert auÃerhalb {1} und {2}, pauschal") })
+ String ALERT_RANGE_OUTSIDE_INCL = "alert.condition.range.out.incl";
- @I18NMessages( { @I18NMessage("Sev: {0} & exp \"{1}\""),
- @I18NMessage(locale = "de", value = "Schwere: {0} & Ausdruck \"{1}\"") })
- String ALERT_CONFIG_PROPS_CB_EVENT_SEVERITY_REGEX_MATCH_SHORT = "alert.config.props.CB.EventSeverity.RegexMatch.short";
+ @I18NMessages( { @I18NMessage("{0} Outside {1} - {2}, incl"),
+ @I18NMessage(locale = "de", value = "{0} auÃerhalb {1} und {2}, paus") })
+ String ALERT_RANGE_OUTSIDE_INCL_SHORT = "alert.condition.range.out.incl.short";
- @I18NMessages( { @I18NMessage("value changed"), @I18NMessage(locale = "de", value = "Der Wert hat sich geï¿œndert") })
- String ALERT_CURRENT_LIST_VALUE_CHANGED = "alert.current.list.ValueChanged";
+ @I18NMessages( { @I18NMessage("{0} Value is Outside {1} and {2}, Exclusive"),
+ @I18NMessage(locale = "de", value = "{0} Der Wert auÃerhalb {1} und {2}, exklusiv") })
+ String ALERT_RANGE_OUTSIDE_EXCL = "alert.condition.range.out.excl";
- @I18NMessages( { @I18NMessage("val chg"), @I18NMessage(locale = "de", value = "Wertï¿œnd.") })
- String ALERT_CURRENT_LIST_VALUE_CHANGED_SHORT = "alert.current.list.ValueChanged.short";
+ @I18NMessages( { @I18NMessage("{0} Outside {1} - {2}, excl"),
+ @I18NMessage(locale = "de", value = "{0} auÃerhalb {1} und {2}, exkl") })
+ String ALERT_RANGE_OUTSIDE_EXCL_SHORT = "alert.condition.range.out.excl.short";
@I18NMessages( {
@I18NMessage("\\ - Condition {0}: {1}\\n\\\n" + "\\ - Date/Time: {2}\\n\\\n" + "\\ - Details: {3}\\n\\\n"),
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java
new file mode 100644
index 0000000..7f502f5
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java
@@ -0,0 +1,370 @@
+package org.rhq.enterprise.server.alert.test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.alert.Alert;
+import org.rhq.core.domain.alert.AlertCondition;
+import org.rhq.core.domain.alert.AlertConditionCategory;
+import org.rhq.core.domain.alert.AlertConditionLog;
+import org.rhq.core.domain.event.EventSeverity;
+import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.domain.measurement.DataType;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.MeasurementUnits;
+import org.rhq.core.domain.measurement.NumericType;
+import org.rhq.core.domain.operation.OperationRequestStatus;
+import org.rhq.core.domain.resource.ResourceCategory;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.enterprise.server.alert.AlertManagerBean;
+
+@Test
+public class AlertManagerBeanTest {
+
+ private String pretty;
+
+ public void testPrettyPrintAVAILABILITY() {
+ AlertCondition condition = createCondition(AlertConditionCategory.AVAILABILITY, null, null, null,
+ AvailabilityType.UP.name(), null);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Availability goes UP".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Avail goes UP".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.AVAILABILITY, null, null, null,
+ AvailabilityType.DOWN.name(), null);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Availability goes DOWN".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Avail goes DOWN".equals(pretty) : pretty;
+ }
+
+ public void testPrettyPrintTHRESHOLD() {
+ MeasurementDefinition md = createDynamicMeasurementDefinition();
+ AlertCondition condition = createCondition(AlertConditionCategory.THRESHOLD, md.getDisplayName(), ">", 12.5d,
+ null, md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Foo Prop > 12.5B".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Foo Prop > 12.5B".equals(pretty) : pretty;
+ }
+
+ public void testPrettyPrintTHRESHOLD_Calltime() {
+ MeasurementDefinition md = createCalltimeMeasurementDefinition();
+ String regex = "some.*(reg)?ex$"; // this is the "name" of the condition
+
+ AlertCondition condition = createCondition(AlertConditionCategory.THRESHOLD, regex, ">", 12.5d, "MAX", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Calltime Metric CT Prop MAX > 12.5B with calltime destination matching \"some.*(reg)?ex$\""
+ .equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "CT Prop MAX > 12.5B matching \"some.*(reg)?ex$\"".equals(pretty) : pretty;
+
+ // no regex
+ condition = createCondition(AlertConditionCategory.THRESHOLD, null, ">", 12.5d, "MAX", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Calltime Metric CT Prop MAX > 12.5B".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "CT Prop MAX > 12.5B".equals(pretty) : pretty;
+ }
+
+ public void testPrettyPrintBASELINE() {
+ MeasurementDefinition md = createDynamicMeasurementDefinition();
+ AlertCondition condition = createCondition(AlertConditionCategory.BASELINE, md.getDisplayName(), ">", 0.10d,
+ "mean", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Foo Prop > 10.0% of Baseline Mean Value".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Foo Prop > 10.0% bl mean".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.BASELINE, md.getDisplayName(), ">", 0.10d, "min", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Foo Prop > 10.0% of Baseline Minimum Value".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Foo Prop > 10.0% bl min".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.BASELINE, md.getDisplayName(), ">", 0.10d, "max", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Foo Prop > 10.0% of Baseline Maximum Value".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Foo Prop > 10.0% bl max".equals(pretty) : pretty;
+ }
+
+ public void testPrettyPrintCHANGE() {
+ MeasurementDefinition md = createDynamicMeasurementDefinition();
+ AlertCondition condition = createCondition(AlertConditionCategory.CHANGE, md.getDisplayName(), null, null,
+ null, md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Foo Prop Value Changed".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Foo Prop Val Chg".equals(pretty) : pretty;
+ }
+
+ public void testPrettyPrintCHANGE_Calltime() {
+ MeasurementDefinition md = createCalltimeMeasurementDefinition();
+ String regex = "some.*(reg)?ex$"; // this is the "name" of the condition
+
+ AlertCondition condition = createCondition(AlertConditionCategory.CHANGE, regex, "LO", 0.10d, "MIN", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Calltime Metric CT Prop MIN shrinks by at least 10.0% with calltime destination matching \"some.*(reg)?ex$\""
+ .equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "CT Prop MIN shrinks by 10.0% matching \"some.*(reg)?ex$\"".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.CHANGE, regex, "CH", 0.10d, "MIN", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Calltime Metric CT Prop MIN changes by at least 10.0% with calltime destination matching \"some.*(reg)?ex$\""
+ .equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "CT Prop MIN changes by 10.0% matching \"some.*(reg)?ex$\"".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.CHANGE, regex, "HI", 0.10d, "MIN", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Calltime Metric CT Prop MIN grows by at least 10.0% with calltime destination matching \"some.*(reg)?ex$\""
+ .equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "CT Prop MIN grows by 10.0% matching \"some.*(reg)?ex$\"".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.CHANGE, regex, "LO", 0.10d, "MAX", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Calltime Metric CT Prop MAX shrinks by at least 10.0% with calltime destination matching \"some.*(reg)?ex$\""
+ .equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "CT Prop MAX shrinks by 10.0% matching \"some.*(reg)?ex$\"".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.CHANGE, regex, "CH", 0.10d, "MAX", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Calltime Metric CT Prop MAX changes by at least 10.0% with calltime destination matching \"some.*(reg)?ex$\""
+ .equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "CT Prop MAX changes by 10.0% matching \"some.*(reg)?ex$\"".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.CHANGE, regex, "HI", 0.10d, "MAX", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Calltime Metric CT Prop MAX grows by at least 10.0% with calltime destination matching \"some.*(reg)?ex$\""
+ .equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "CT Prop MAX grows by 10.0% matching \"some.*(reg)?ex$\"".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.CHANGE, regex, "LO", 0.10d, "AVG", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Calltime Metric CT Prop AVG shrinks by at least 10.0% with calltime destination matching \"some.*(reg)?ex$\""
+ .equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "CT Prop AVG shrinks by 10.0% matching \"some.*(reg)?ex$\"".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.CHANGE, regex, "CH", 0.10d, "AVG", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Calltime Metric CT Prop AVG changes by at least 10.0% with calltime destination matching \"some.*(reg)?ex$\""
+ .equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "CT Prop AVG changes by 10.0% matching \"some.*(reg)?ex$\"".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.CHANGE, regex, "HI", 0.10d, "AVG", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Calltime Metric CT Prop AVG grows by at least 10.0% with calltime destination matching \"some.*(reg)?ex$\""
+ .equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "CT Prop AVG grows by 10.0% matching \"some.*(reg)?ex$\"".equals(pretty) : pretty;
+
+ // no regex
+ condition = createCondition(AlertConditionCategory.CHANGE, null, "LO", 0.10d, "AVG", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Calltime Metric CT Prop AVG shrinks by at least 10.0%".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "CT Prop AVG shrinks by 10.0%".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.CHANGE, null, "CH", 0.10d, "AVG", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Calltime Metric CT Prop AVG changes by at least 10.0%".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "CT Prop AVG changes by 10.0%".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.CHANGE, null, "HI", 0.10d, "AVG", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Calltime Metric CT Prop AVG grows by at least 10.0%".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "CT Prop AVG grows by 10.0%".equals(pretty) : pretty;
+ }
+
+ public void testPrettyPrintTRAIT() {
+ MeasurementDefinition md = createTraitMeasurementDefinition();
+ AlertCondition condition = createCondition(AlertConditionCategory.TRAIT, md.getDisplayName(), null, null, null,
+ md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Blah Trait Value Changed".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Blah Trait Val Chg".equals(pretty) : pretty;
+ }
+
+ public void testPrettyPrintCONTROL() {
+ AlertCondition condition = createCondition(AlertConditionCategory.CONTROL, "opNameHere", null, null,
+ OperationRequestStatus.FAILURE.name(), null);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Operation [opNameHere] has status=[FAILURE]".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Op [opNameHere]=FAILURE".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.CONTROL, "opNameHere", null, null,
+ OperationRequestStatus.SUCCESS.name(), null);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Operation [opNameHere] has status=[SUCCESS]".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Op [opNameHere]=SUCCESS".equals(pretty) : pretty;
+ }
+
+ public void testPrettyPrintEVENT() {
+ String regex = "some.*(reg)?ex$";
+
+ AlertCondition condition = createCondition(AlertConditionCategory.EVENT, EventSeverity.WARN.name(), null, null,
+ regex, null);
+ pretty = getPrettyAlertConditionString(condition);
+ assert ("Event With Severity [WARN] Matching Expression \"" + regex + "\"").equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert ("[WARN] Event Matching \"" + regex + "\"").equals(pretty) : pretty;
+
+ // no regex
+ condition = createCondition(AlertConditionCategory.EVENT, EventSeverity.WARN.name(), null, null, null, null);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Event With Severity [WARN]".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "[WARN] Event".equals(pretty) : pretty;
+ }
+
+ public void testPrettyPrintRESOURCECONFIG() {
+ AlertCondition condition = createCondition(AlertConditionCategory.RESOURCE_CONFIG, null, null, null, null, null);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Resource Configuration Changed".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Res Config Chg".equals(pretty) : pretty;
+ }
+
+ public void testPrettyPrintDRIFT() {
+ AlertCondition condition = createCondition(AlertConditionCategory.DRIFT, "?riftName", null, null, "fil.*", null);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Drift detected for files that match \"fil.*\" and for drift configuration [?riftName]".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Drift matching \"fil.*\", config=[?riftName]".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.DRIFT, null, null, null, "fil.*", null);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Drift detected for files that match \"fil.*\"".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Drift matching \"fil.*\"".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.DRIFT, "?riftName", null, null, null, null);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Drift detected for drift configuration [?riftName]".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Drift! config=[?riftName]".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.DRIFT, null, null, null, null, null);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Drift Detected".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Drift!".equals(pretty) : pretty;
+ }
+
+ public void testPrettyPrintRANGE() {
+ MeasurementDefinition md = createDynamicMeasurementDefinition();
+ AlertCondition condition = createCondition(AlertConditionCategory.RANGE, md.getDisplayName(), "<=", 1.0,
+ "22.2", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Foo Prop Value is Between 1.0B and 22.2B, Inclusive".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Foo Prop Between 1.0B - 22.2B, incl".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.RANGE, md.getDisplayName(), ">=", 1.0, "22.2", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Foo Prop Value is Outside 1.0B and 22.2B, Inclusive".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Foo Prop Outside 1.0B - 22.2B, incl".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.RANGE, md.getDisplayName(), "<", 1.0, "22.2", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Foo Prop Value is Between 1.0B and 22.2B, Exclusive".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Foo Prop Between 1.0B - 22.2B, excl".equals(pretty) : pretty;
+
+ condition = createCondition(AlertConditionCategory.RANGE, md.getDisplayName(), ">", 1.0, "22.2", md);
+ pretty = getPrettyAlertConditionString(condition);
+ assert "Foo Prop Value is Outside 1.0B and 22.2B, Exclusive".equals(pretty) : pretty;
+ pretty = getShortPrettyAlertConditionString(condition);
+ assert "Foo Prop Outside 1.0B - 22.2B, excl".equals(pretty) : pretty;
+ }
+
+ private String getPrettyAlertConditionString(AlertCondition condition) {
+ AlertManagerBean pojo = new AlertManagerBean();
+ String s = extractCondition(pojo.prettyPrintAlertConditions(createAlert(condition), false));
+ System.out.println("long===>" + s);
+ return s;
+ }
+
+ private String getShortPrettyAlertConditionString(AlertCondition condition) {
+ AlertManagerBean pojo = new AlertManagerBean();
+ String s = extractCondition(pojo.prettyPrintAlertConditions(createAlert(condition), true));
+ System.out.println("short-->" + s);
+ return s;
+ }
+
+ private MeasurementDefinition createDynamicMeasurementDefinition() {
+ ResourceType resourceType = new ResourceType("testType", "testPlugin", ResourceCategory.PLATFORM, null);
+ MeasurementDefinition md = new MeasurementDefinition(resourceType, "fooMetric");
+ md.setDataType(DataType.MEASUREMENT);
+ md.setDisplayName("Foo Prop");
+ md.setMeasurementType(NumericType.DYNAMIC);
+ md.setRawNumericType(NumericType.DYNAMIC);
+ md.setUnits(MeasurementUnits.BYTES);
+ return md;
+ }
+
+ private MeasurementDefinition createCalltimeMeasurementDefinition() {
+ ResourceType resourceType = new ResourceType("testType", "testPlugin", ResourceCategory.PLATFORM, null);
+ MeasurementDefinition md = new MeasurementDefinition(resourceType, "ctMetric");
+ md.setDataType(DataType.CALLTIME);
+ md.setDisplayName("CT Prop");
+ md.setMeasurementType(NumericType.DYNAMIC);
+ md.setRawNumericType(NumericType.DYNAMIC);
+ md.setUnits(MeasurementUnits.BYTES);
+ md.setDestinationType("/wot gorilla");
+ return md;
+ }
+
+ private MeasurementDefinition createTraitMeasurementDefinition() {
+ ResourceType resourceType = new ResourceType("testType", "testPlugin", ResourceCategory.PLATFORM, null);
+ MeasurementDefinition md = new MeasurementDefinition(resourceType, "traitMetric");
+ md.setDataType(DataType.TRAIT);
+ md.setDisplayName("Blah Trait");
+ md.setUnits(MeasurementUnits.BYTES);
+ return md;
+ }
+
+ private Alert createAlert(AlertCondition condition) {
+ Alert alert = new Alert();
+ AlertConditionLog conditionLog = new AlertConditionLog(condition, System.currentTimeMillis());
+ alert.addConditionLog(conditionLog);
+ return alert;
+ }
+
+ private AlertCondition createCondition(AlertConditionCategory category, String name, String comparator,
+ Double threshold, String option, MeasurementDefinition measDef) {
+ AlertCondition condition = new AlertCondition();
+ condition.setCategory(category);
+ condition.setName(name);
+ condition.setComparator(comparator);
+ condition.setThreshold(threshold);
+ condition.setOption(option);
+ condition.setMeasurementDefinition(measDef);
+ return condition;
+ }
+
+ private String extractCondition(String prettyString) {
+ //System.out.println(prettyString);
+ Pattern pattern = Pattern.compile(" - Cond(?:ition)? 1: (.*)\n"); // short form has " - Cond 1: ...", long form has " - Condition 1: ..."
+ Matcher matcher = pattern.matcher(prettyString);
+ assert matcher.find() : "could not find the condition string";
+ return matcher.group(1);
+ }
+}
commit 96f48b1cf1887376bb546cb120968f3696ed3a25
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 15 12:49:13 2011 -0400
rename AlertManagerBeanTest to DeleteAlertsTest - it is still disabled, some other test isn't cleaning up properly and causing bad data to be sitting in the DB that this test fails on
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java
deleted file mode 100644
index 41b902c..0000000
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program 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 version 2 of the License.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.server.alert.test;
-
-import java.sql.Connection;
-import java.util.List;
-
-import org.dbunit.database.DatabaseConnection;
-import org.dbunit.database.IDatabaseConnection;
-import org.dbunit.dataset.IDataSet;
-import org.dbunit.dataset.xml.FlatXmlDataSet;
-import org.dbunit.dataset.xml.FlatXmlProducer;
-import org.dbunit.operation.DatabaseOperation;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-import org.xml.sax.InputSource;
-
-import org.rhq.core.domain.alert.AlertConditionLog;
-import org.rhq.core.domain.alert.notification.AlertNotificationLog;
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.common.EntityContext;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.enterprise.server.alert.AlertManagerLocal;
-import org.rhq.enterprise.server.test.AbstractEJB3Test;
-import org.rhq.enterprise.server.util.LookupUtil;
-
-/**
- * Test for {@link AlertManagerLocal} SLSB.
- */
-@Test(enabled = false)
-public class AlertManagerBeanTest extends AbstractEJB3Test {
- private AlertManagerLocal alertManager;
- private Subject superuser;
- private Resource newResource;
-
- @BeforeMethod
- public void beforeMethod() throws Exception {
- alertManager = LookupUtil.getAlertManager();
- superuser = LookupUtil.getSubjectManager().getOverlord();
-
- Connection connection = null;
-
- try {
- connection = getConnection();
- IDatabaseConnection dbUnitConnection = new DatabaseConnection(connection);
- DatabaseOperation.CLEAN_INSERT.execute(dbUnitConnection, getDataSet());
- } finally {
- if (connection != null) {
- connection.close();
- }
- }
-
- newResource = getEntityManager().find(Resource.class, 1);
- }
-
- @AfterClass
- public void cleanupDB() throws Exception {
- if ("true".equals(System.getProperty("clean.db"))) {
- Connection connection = null;
-
- try {
- connection = getConnection();
- IDatabaseConnection dbUnitConnection = new DatabaseConnection(connection);
- DatabaseOperation.DELETE_ALL.execute(dbUnitConnection, getDataSet());
- } finally {
- if (connection != null) {
- connection.close();
- }
- }
- }
- }
-
- IDataSet getDataSet() throws Exception {
- FlatXmlProducer xmlProducer = new FlatXmlProducer(new InputSource(getClass()
- .getResourceAsStream("AlertManagerBeanTest.xml")));
- xmlProducer.setColumnSensing(true);
- return new FlatXmlDataSet(xmlProducer);
- }
-
- public void deleteAlertsForResource() {
- assert 1 == alertManager.deleteAlertsByContext(superuser, EntityContext.forResource(newResource.getId()));
- }
-
- @SuppressWarnings("unchecked")
- public void deleteAlertsForResourceTemplate() {
- int resourceTypeId = 1;
- int deletedCount = alertManager.deleteAlertsByContext(superuser, EntityContext.forTemplate(resourceTypeId));
-
- List<AlertConditionLog> alertConditionLogs = getEntityManager().createQuery(
- "from AlertConditionLog log where log.id = :id")
- .setParameter("id", 2)
- .getResultList();
-
- List<AlertNotificationLog> notificationLogs = getEntityManager().createQuery(
- "from AlertNotificationLog log where log.id = :id")
- .setParameter("id", 2)
- .getResultList();
-
- assertEquals("Failed to delete alerts by template", 1, deletedCount);
- assertEquals("Failed to delete alert condition logs when deleting alerts by template", 0,
- alertConditionLogs.size());
- assertEquals("Failed to delete alert notification logs when deleting alerts by template", 0,
- notificationLogs.size());
- }
-
- public void testAlertDeleteInRange() {
- assert 2 == alertManager.deleteAlerts(0L, System.currentTimeMillis() + 600000L); // go out into the future to make sure we get our alert
- }
-
-}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/DeleteAlertsTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/DeleteAlertsTest.java
new file mode 100644
index 0000000..f0ae1b5
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/DeleteAlertsTest.java
@@ -0,0 +1,123 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.alert.test;
+
+import java.sql.Connection;
+import java.util.List;
+
+import org.dbunit.database.DatabaseConnection;
+import org.dbunit.database.IDatabaseConnection;
+import org.dbunit.dataset.IDataSet;
+import org.dbunit.dataset.xml.FlatXmlDataSet;
+import org.dbunit.dataset.xml.FlatXmlProducer;
+import org.dbunit.operation.DatabaseOperation;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+import org.xml.sax.InputSource;
+
+import org.rhq.core.domain.alert.AlertConditionLog;
+import org.rhq.core.domain.alert.notification.AlertNotificationLog;
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.common.EntityContext;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.enterprise.server.alert.AlertManagerLocal;
+import org.rhq.enterprise.server.test.AbstractEJB3Test;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+/**
+ * Test for {@link AlertManagerLocal} SLSB.
+ */
+@Test(enabled = false)
+public class DeleteAlertsTest extends AbstractEJB3Test {
+ private AlertManagerLocal alertManager;
+ private Subject superuser;
+ private Resource newResource;
+
+ @BeforeMethod
+ public void beforeMethod() throws Exception {
+ alertManager = LookupUtil.getAlertManager();
+ superuser = LookupUtil.getSubjectManager().getOverlord();
+
+ Connection connection = null;
+
+ try {
+ connection = getConnection();
+ IDatabaseConnection dbUnitConnection = new DatabaseConnection(connection);
+ DatabaseOperation.CLEAN_INSERT.execute(dbUnitConnection, getDataSet());
+ } finally {
+ if (connection != null) {
+ connection.close();
+ }
+ }
+
+ newResource = getEntityManager().find(Resource.class, 1);
+ }
+
+ @AfterClass
+ public void cleanupDB() throws Exception {
+ if ("true".equals(System.getProperty("clean.db"))) {
+ Connection connection = null;
+
+ try {
+ connection = getConnection();
+ IDatabaseConnection dbUnitConnection = new DatabaseConnection(connection);
+ DatabaseOperation.DELETE_ALL.execute(dbUnitConnection, getDataSet());
+ } finally {
+ if (connection != null) {
+ connection.close();
+ }
+ }
+ }
+ }
+
+ IDataSet getDataSet() throws Exception {
+ FlatXmlProducer xmlProducer = new FlatXmlProducer(new InputSource(getClass().getResourceAsStream(
+ "AlertManagerBeanTest.xml")));
+ xmlProducer.setColumnSensing(true);
+ return new FlatXmlDataSet(xmlProducer);
+ }
+
+ public void deleteAlertsForResource() {
+ assert 1 == alertManager.deleteAlertsByContext(superuser, EntityContext.forResource(newResource.getId()));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void deleteAlertsForResourceTemplate() {
+ int resourceTypeId = 1;
+ int deletedCount = alertManager.deleteAlertsByContext(superuser, EntityContext.forTemplate(resourceTypeId));
+
+ List<AlertConditionLog> alertConditionLogs = getEntityManager().createQuery(
+ "from AlertConditionLog log where log.id = :id").setParameter("id", 2).getResultList();
+
+ List<AlertNotificationLog> notificationLogs = getEntityManager().createQuery(
+ "from AlertNotificationLog log where log.id = :id").setParameter("id", 2).getResultList();
+
+ assertEquals("Failed to delete alerts by template", 1, deletedCount);
+ assertEquals("Failed to delete alert condition logs when deleting alerts by template", 0, alertConditionLogs
+ .size());
+ assertEquals("Failed to delete alert notification logs when deleting alerts by template", 0, notificationLogs
+ .size());
+ }
+
+ public void testAlertDeleteInRange() {
+ assert 2 == alertManager.deleteAlerts(0L, System.currentTimeMillis() + 600000L); // go out into the future to make sure we get our alert
+ }
+
+}
\ No newline at end of file
commit ffd9aa174c13d42799d0002b73dfb8b90d178463
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 15 12:48:26 2011 -0400
don't throw exception if a bad jobID is given, just log a message. this also fixes an error in our unit tests that couldn't clean up
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
index 9dbe236..4c007ae 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
@@ -407,11 +407,15 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
}
public void deleteOperationScheduleEntity(ScheduleJobId jobId) {
- OperationScheduleEntity doomed = findOperationScheduleEntity(jobId);
- if (doomed != null) {
- LOG.debug("Deleting schedule entity: " + jobId);
- entityManager.remove(doomed);
- } else {
+ try {
+ OperationScheduleEntity doomed = findOperationScheduleEntity(jobId);
+ if (doomed != null) {
+ LOG.debug("Deleting schedule entity: " + jobId);
+ entityManager.remove(doomed);
+ } else {
+ LOG.info("Asked to delete unknown schedule - ignoring: " + jobId);
+ }
+ } catch (NoResultException nre) {
LOG.info("Asked to delete unknown schedule - ignoring: " + jobId);
}
@@ -2106,7 +2110,7 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
}
private static void validateOperationNameAndParameters(ResourceType resourceType, String operationName,
- Configuration parameters) {
+ Configuration parameters) {
Set<OperationDefinition> operationDefinitions = resourceType.getOperationDefinitions();
OperationDefinition matchingOperationDefinition = null;
for (OperationDefinition operationDefinition : operationDefinitions) {
@@ -2117,14 +2121,14 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
}
if (matchingOperationDefinition == null) {
throw new IllegalArgumentException("[" + operationName
- + "] is not a valid operation name for Resources of type [" + resourceType.getName() + "]." );
+ + "] is not a valid operation name for Resources of type [" + resourceType.getName() + "].");
}
- ConfigurationDefinition parametersDefinition =
- matchingOperationDefinition.getParametersConfigurationDefinition();
+ ConfigurationDefinition parametersDefinition = matchingOperationDefinition
+ .getParametersConfigurationDefinition();
List<String> errors = ConfigurationUtility.validateConfiguration(parameters, parametersDefinition);
if (!errors.isEmpty()) {
- throw new IllegalArgumentException("Parameters for [" + operationName
- + "] on Resource of type [" + resourceType.getName() + "] are not valid: " + errors );
+ throw new IllegalArgumentException("Parameters for [" + operationName + "] on Resource of type ["
+ + resourceType.getName() + "] are not valid: " + errors);
}
}
commit 8bf3efd2ae96d482edcc4764070b39b218e4dfde
Author: John Sanda <jsanda(a)redhat.com>
Date: Thu Sep 15 22:19:29 2011 -0400
Update test/example to write and read file using GridFS
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/GridFSTest.java b/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/GridFSTest.java
index 5a76a2b..057dfc5 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/GridFSTest.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/test/java/org/rhq/enterprise/server/plugins/drift/mongodb/GridFSTest.java
@@ -19,6 +19,7 @@
package org.rhq.enterprise.server.plugins.drift.mongodb;
+import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -33,6 +34,11 @@ import org.bson.types.ObjectId;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
+import org.rhq.core.util.stream.StreamUtil;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
public class GridFSTest {
Mongo connection;
@@ -48,7 +54,7 @@ public class GridFSTest {
}
@Test(enabled = false)
- public void writeFile() throws Exception {
+ public void writeAndReadFile() throws Exception {
GridFS gridFS = new GridFS(db);
File file = new File("/home/jsanda/clojure-plugin.tar");
GridFSInputFile inputFile = gridFS.createFile(new FileInputStream(file), file.getName());
@@ -58,6 +64,16 @@ public class GridFSTest {
FileOutputStream stream = new FileOutputStream("/home/jsanda/gridfs-test.tar");
GridFSDBFile gridFSDBFile = gridFS.findOne((ObjectId) inputFile.getId());
gridFSDBFile.writeTo(stream);
+
+ GridFSDBFile dbFile = gridFS.findOne(file.getName());
+ assertNotNull(dbFile);
+
+ File outputFile = new File("/tmp/clojure-plugin.tar");
+ outputFile.delete();
+
+ StreamUtil.copy(dbFile.getInputStream(), new BufferedOutputStream(new FileOutputStream(outputFile)), true);
+
+ assertEquals(outputFile.length(), file.length());
}
}
commit 5f59b538976e11ac8f68fff53c174e13eb3f0cc5
Author: John Sanda <jsanda(a)redhat.com>
Date: Thu Sep 15 21:37:18 2011 -0400
adding javadocs
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSyncManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSyncManager.java
index efb27cc..b9df2ce 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSyncManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSyncManager.java
@@ -36,6 +36,14 @@ import org.rhq.core.pc.inventory.InventoryManager;
import static org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS;
+/**
+ * This class handles syncing drift configurations during inventory sync. This class is
+ * intended to server as the public interface (so to speak) to {@link InventoryManager} for
+ * syncing drift configurations.
+ * <br/><br/>
+ * Please review the docs for each of the setter methods to determine which properties
+ * should be set before invoking any business logic methods.
+ */
public class DriftSyncManager {
private final Log log = LogFactory.getLog(DriftSyncManager.class);
@@ -47,18 +55,36 @@ public class DriftSyncManager {
private File dataDir;
+ /**
+ * @param driftServer The interface to the remote server. This property must be set.
+ * It is injected to facilitate testing with stubs or mocks.
+ */
public void setDriftServer(DriftServerService driftServer) {
this.driftServer = driftServer;
}
+ /**
+ * @param driftManager The drift manager singleton created by the plugin container.
+ * This property must be set even if drift manager is not yet initialized. It is
+ * injected to facilitate testing with stubs or mocks.
+ */
public void setDriftManager(DriftManager driftManager) {
driftMgr = driftManager;
}
+ /**
+ * @param inventoryManager The inventory manager singleton created by the plugin
+ * container. This property must be set. It is injected to facilitate testing with stubs
+ * or mocks.
+ */
public void setInventoryManager(InventoryManager inventoryManager) {
inventoryMgr = inventoryManager;
}
+ /**
+ * @param dataDirectory The plugin container data directory where inventory files are
+ * stored. This property must be set. It is injected to facilitate testing.
+ */
public void setDataDirectory(File dataDirectory) {
dataDir = dataDirectory;
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSynchronizer.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSynchronizer.java
index 79ac3ad..757abe6 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSynchronizer.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSynchronizer.java
@@ -24,15 +24,61 @@ import java.util.Set;
import org.rhq.core.domain.drift.DriftConfiguration;
+/**
+ * A DriftSynchronizer is responsible for sycning {@link DriftConfiguration}s in the
+ * server's with those in the local inventory.
+ */
public interface DriftSynchronizer {
+ /**
+ * Determines which drift configurations for a resource have been deleted on the server
+ * and need to be purged from the local inventory. This method should not make any
+ * changes to the local inventory.
+ *
+ * @param resourceId
+ * @param configurationsFromServer A set of drift configurations belonging to the
+ * resource with the specified id. The set uses a {@link org.rhq.core.domain.drift.DriftConfigurationComparator DriftConfigurationComparator}
+ * with the compare mode set to {@link org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode#BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS}.
+ * @return A list of drift configurations that need to be purged from the local inventory.
+ */
List<DriftConfiguration> getDeletedConfigurations(int resourceId,
Set<DriftConfiguration> configurationsFromServer);
+ /**
+ * Removes the drift configurations from local inventory. Implementations are responsible
+ * for deciding how that is to be done. For example, if the plugin container is not
+ * fully initialized, then purging will involve removing configurations from the
+ * {@link org.rhq.core.pc.inventory.ResourceContainer ResourceContainer}. But if the
+ * plugin container is initialized, then drift detection will have to be unscheduled.
+ *
+ * @param resourceId
+ * @param configurations The drift configurations to purge from local inventory
+ */
void purgeFromLocalInventory(int resourceId, List<DriftConfiguration> configurations);
+ /**
+ * Determines which drift configurations for a resource have been added on the server
+ * and need to be added to the local inventory. This method should not make any changes
+ * to the local inventory.
+ *
+ * @param resourceId
+ * @param configurationsFromServer A set of drift configurations belonging to the
+ * resource with the specified id. The set uses a {@link org.rhq.core.domain.drift.DriftConfigurationComparator DriftConfigurationComparator}
+ * with the compare mode set to {@link org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode#BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS}.
+ * @return A list of drift configurations that need to be purged from the local inventory.
+ */
List<DriftConfiguration> getAddedConfigurations(int resourceId, Set<DriftConfiguration> configurationsFromServer);
+ /**
+ * Adds the drift configurations to the local inventory. Implementations are responsible
+ * for deciding how that is to be done. For example, if the plugin container is not
+ * fully initialized, then adding a configuration will involve adding it to the
+ * {@link org.rhq.core.pc.inventory.ResourceContainer ResourceContainer}. But if the
+ * plugin container is initialized, drift detection will have to be scheduled.
+ *
+ * @param resourceId
+ * @param configurations The drift configurations to add to the local inventory.
+ */
void addToLocalInventory(int resourceId, List<DriftConfiguration> configurations);
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/RuntimeSynchronizer.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/RuntimeSynchronizer.java
index e7b4aa0..9fe0a7b 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/RuntimeSynchronizer.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/RuntimeSynchronizer.java
@@ -34,6 +34,20 @@ import org.rhq.core.pc.drift.ScheduleQueue;
import static org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS;
+/**
+ * As its name implies, this class synchronizes drift configurations at runtime. By runtime
+ * we mean when {@link DriftManager} is fully initialized. Updating the local inventory is
+ * done through DriftManager. When this class determines that a drift configuration needs
+ * to be purged from the local inventory, it does so by calling DriftManager to unschedule
+ * drift detection. Likewise when this class determines that a drift configuration needs
+ * to be added to the local inventory, it does so by calling DriftManager to schedule
+ * detection.
+ * <br/><br/>
+ * Note that inventory sync happens regularly after the plugin container is initialized.
+ * Discovery scans are performed at fixed intervals. The results of a discovery scan are
+ * reported to the server, and the server sends back {@link org.rhq.core.domain.discovery.ResourceSyncInfo resource sync info}
+ * which is then used to sync with the local inventory.
+ */
class RuntimeSynchronizer implements DriftSynchronizer {
private final Log log = LogFactory.getLog(RuntimeSynchronizer.class);
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/StartupSynchronizer.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/StartupSynchronizer.java
index 4309bf8..7a472ad 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/StartupSynchronizer.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/StartupSynchronizer.java
@@ -33,6 +33,16 @@ import org.rhq.core.pc.inventory.ResourceContainer;
import static org.rhq.core.util.file.FileUtil.purge;
+/**
+ * As its name implies, this class synchronizes drift configurations at start up or any
+ * time when the plugin container is not fully initialized. If the plugin container is not
+ * fully initialized, then that means {@link org.rhq.core.pc.drift.DriftManager DriftManager}
+ * is not available to call into to schedule or unschedule drift detection.
+ * StartupSynchronizer therefore deals only with the drift configurations attached to
+ * {@link ResourceContainer} objects. As part of its initialization DriftManager
+ * creates or recreates detection schedules from the configurations attached to the
+ * resource containers.
+ */
class StartupSynchronizer implements DriftSynchronizer {
private final Log log = LogFactory.getLog(StartupSynchronizer.class);
commit 6f788d1ec4e183b26483267e9653dada84ea2b1a
Author: John Sanda <jsanda(a)redhat.com>
Date: Thu Sep 15 16:41:22 2011 -0400
Refactoring drift config sync code out of InventoryManager
There are several drivers behind this refactoring. First, there was
drift specific logic that spilled over into InventoryManager. Secondly,
there was some code duplication. Third, the refactoring will hopefully
make the code easier to test, particularly at the unit test level.
Fourth, the refactoring makes the code more self-documenting.
diff --git a/modules/core/plugin-container/mvn.out b/modules/core/plugin-container/mvn.out
deleted file mode 100644
index d269e4d..0000000
--- a/modules/core/plugin-container/mvn.out
+++ /dev/null
@@ -1,96 +0,0 @@
-[INFO]
-NOTE: Maven is executing in offline mode. Any artifacts not already in your local
-repository will be inaccessible.
-
-[INFO] Scanning for projects...
-[INFO] ------------------------------------------------------------------------
-[INFO] Building RHQ Plugin Container
-[INFO] task-segment: [clean, install]
-[INFO] ------------------------------------------------------------------------
-[INFO] [clean:clean {execution: default-clean}]
-[INFO] Deleting /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target
-[INFO] [enforcer:enforce {execution: enforce-versions}]
-[INFO] [build-helper:maven-version {execution: default}]
-[INFO] [resources:resources {execution: default-resources}]
-[INFO] Using 'ISO-8859-1' encoding to copy filtered resources.
-[INFO] skip non existing resourceDirectory /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/resources
-[INFO] [compiler:compile {execution: default-compile}]
-[INFO] Compiling 105 source files to /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target/classes
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/plugin/FileSystemPluginFinder.java:[124,32] [deprecation] toURL() in java.io.File has been deprecated
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/ResourceContainer.java:[465,49] [unchecked] unchecked conversion
-found : java.util.concurrent.Callable
-required: java.util.concurrent.Callable<T>
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/ResourceContainer.java:[465,48] [unchecked] unchecked method invocation: <T>submit(java.util.concurrent.Callable<T>) in java.util.concurrent.ExecutorService is applied to (java.util.concurrent.Callable)
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[321,76] [unchecked] unchecked call to discoverResources(org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext<T>) as a member of the raw type org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[321,76] [unchecked] unchecked conversion
-found : java.util.Set
-required: java.util.Set<org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails>
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[357,69] [unchecked] unchecked call to discoverResource(org.rhq.core.domain.configuration.Configuration,org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext<T>) as a member of the raw type org.rhq.core.pluginapi.inventory.ManualAddFacet
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[394,52] [unchecked] unchecked call to ResourceDiscoveryContext(org.rhq.core.domain.resource.ResourceType,T,org.rhq.core.pluginapi.inventory.ResourceContext,org.rhq.core.system.SystemInfo,java.util.List<org.rhq.core.pluginapi.inventory.ProcessScanResult>,java.util.List<org.rhq.core.domain.configuration.Configuration>,java.lang.String,org.rhq.core.pluginapi.inventory.PluginContainerDeployment) as a member of the raw type org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[406,60] [unchecked] unchecked call to getAdditionalClasspathUrls(org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext<T>,org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails) as a member of the raw type org.rhq.core.pluginapi.inventory.ClassLoaderFacet
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[406,60] [unchecked] unchecked conversion
-found : java.util.List
-required: java.util.List<java.net.URL>
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[1534,87] [unchecked] unchecked conversion
-found : org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent
-required: org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent<org.rhq.core.pluginapi.inventory.ResourceComponent<capture#841 of ?>>
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[1534,59] [unchecked] unchecked method invocation: <T>createResourceContext(org.rhq.core.domain.resource.Resource,T,org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent<T>) in org.rhq.core.pc.inventory.InventoryManager is applied to (org.rhq.core.domain.resource.Resource,org.rhq.core.pluginapi.inventory.ResourceComponent<capture#841 of ?>,org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent)
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[2383,47] [unchecked] unchecked call to ResourceDiscoveryContext(org.rhq.core.domain.resource.ResourceType,T,org.rhq.core.pluginapi.inventory.ResourceContext,org.rhq.core.system.SystemInfo,java.util.List<org.rhq.core.pluginapi.inventory.ProcessScanResult>,java.util.List<org.rhq.core.domain.configuration.Configuration>,java.lang.String,org.rhq.core.pluginapi.inventory.PluginContainerDeployment) as a member of the raw type org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[2436,30] [unchecked] unchecked conversion
-found : java.util.Set
-required: java.util.Set<org.rhq.core.domain.resource.Resource>
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementCollectorRunner.java:[111,85] [unchecked] unchecked cast
-found : java.util.Set<capture#736 of ? extends org.rhq.core.domain.measurement.MeasurementScheduleRequest>
-required: java.util.Set<org.rhq.core.domain.measurement.MeasurementScheduleRequest>
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryFile.java:[116,85] [unchecked] unchecked cast
-found : java.lang.Object
-required: java.util.Map<java.lang.String,org.rhq.core.pc.inventory.ResourceContainer>
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/util/InventoryPrinter.java:[285,41] [unchecked] unchecked call to HashSet(java.util.Collection<? extends E>) as a member of the raw type java.util.HashSet
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/util/InventoryPrinter.java:[285,41] [unchecked] unchecked conversion
-found : java.util.HashSet
-required: java.util.Set<org.rhq.core.domain.resource.Resource>
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagement.java:[58,25] [unchecked] unchecked conversion
-found : java.util.Set
-required: java.util.Set<org.rhq.core.domain.configuration.RawConfiguration>
-[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/SnapshotGenerator.java:[106,19] [unchecked] unchecked call to add(E) as a member of the raw type java.util.Collection
-[INFO] [resources:testResources {execution: default-testResources}]
-[INFO] Using 'ISO-8859-1' encoding to copy filtered resources.
-[INFO] Copying 5 resources
-[WARNING] DEPRECATED [tasks]: Use target instead
-[INFO] [antrun:run {execution: process-test-resources}]
-[WARNING] Parameter tasks is deprecated, use target instead
-[INFO] Executing tasks
-
-main:
- [echo] SIGAR java library version used is 1.6.5.132
- [echo] Copying/unzipping SIGAR native libraries (version 1.6.5.132) to local build directory
- [mkdir] Created dir: /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target/jboss-sigar
- [copy] Copying 1 file to /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target/jboss-sigar
- [unzip] Expanding: /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target/jboss-sigar/sigar-dist-1.6.5.132.zip into /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target/jboss-sigar
- [move] Moving 22 files to /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target/jboss-sigar
-[INFO] Executed tasks
-[INFO] [compiler:testCompile {execution: default-testCompile}]
-[INFO] Not compiling test sources
-[WARNING] DEPRECATED [tasks]: Use target instead
-[INFO] [antrun:run {execution: process-test-classes}]
-[WARNING] Parameter tasks is deprecated, use target instead
-[INFO] Executing tasks
-
-main:
-[INFO] Executed tasks
-[INFO] [surefire:test {execution: default-test}]
-[INFO] Tests are skipped.
-[INFO] [jar:jar {execution: default-jar}]
-[INFO] Building jar: /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target/rhq-core-plugin-container-4.1.0-SNAPSHOT.jar
-[INFO] [jar:jar {execution: default}]
-[INFO] [jar:test-jar {execution: default}]
-[INFO] Skipping packaging of the test-jar
-[INFO] [install:install {execution: default-install}]
-[INFO] Installing /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target/rhq-core-plugin-container-4.1.0-SNAPSHOT.jar to /home/jsanda/.m2/repository/org/rhq/rhq-core-plugin-container/4.1.0-SNAPSHOT/rhq-core-plugin-container-4.1.0-SNAPSHOT.jar
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESSFUL
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time: 7 seconds
-[INFO] Finished at: Tue Sep 13 16:43:45 EDT 2011
-[INFO] Final Memory: 59M/481M
-[INFO] ------------------------------------------------------------------------
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSyncManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSyncManager.java
new file mode 100644
index 0000000..efb27cc
--- /dev/null
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSyncManager.java
@@ -0,0 +1,121 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.core.pc.drift.sync;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.core.clientapi.server.drift.DriftServerService;
+import org.rhq.core.domain.drift.DriftConfiguration;
+import org.rhq.core.domain.drift.DriftConfigurationComparator;
+import org.rhq.core.pc.drift.DriftManager;
+import org.rhq.core.pc.inventory.InventoryManager;
+
+import static org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS;
+
+public class DriftSyncManager {
+ private final Log log = LogFactory.getLog(DriftSyncManager.class);
+
+ private DriftServerService driftServer;
+
+ private DriftManager driftMgr;
+
+ private InventoryManager inventoryMgr;
+
+ private File dataDir;
+
+ public void setDriftServer(DriftServerService driftServer) {
+ this.driftServer = driftServer;
+ }
+
+ public void setDriftManager(DriftManager driftManager) {
+ driftMgr = driftManager;
+ }
+
+ public void setInventoryManager(InventoryManager inventoryManager) {
+ inventoryMgr = inventoryManager;
+ }
+
+ public void setDataDirectory(File dataDirectory) {
+ dataDir = dataDirectory;
+ }
+
+ public void syncConfigsWithServer(Set<Integer> resourceIds) {
+ log.info("Starting server sync for drift configurations...");
+ long startTime = System.currentTimeMillis();
+
+ Map<Integer, List<DriftConfiguration>> configs = driftServer.getDriftConfigurations(resourceIds);
+ DriftConfigurationComparator comparator = new DriftConfigurationComparator(
+ BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS);
+ DriftSynchronizerFactory synchronizerFactory = new DriftSynchronizerFactory();
+ DriftSynchronizer synchronizer;
+
+ if (isStartUpSync()) {
+ synchronizer = synchronizerFactory.getStartUpSynchronizer(inventoryMgr, dataDir);
+ } else {
+ synchronizer = synchronizerFactory.getRuntimeSynchronizer(driftMgr);
+ }
+
+ int totalDeleted = 0;
+ int totalAdded = 0;
+
+ for (Integer resourceId : configs.keySet()) {
+ Set<DriftConfiguration> resourceConfigsOnServer = new TreeSet<DriftConfiguration>(comparator);
+ resourceConfigsOnServer.addAll(configs.get(resourceId));
+
+ List<DriftConfiguration> deletedConfigs = synchronizer.getDeletedConfigurations(resourceId,
+ resourceConfigsOnServer);
+ totalDeleted += deletedConfigs.size();
+ synchronizer.purgeFromLocalInventory(resourceId, deletedConfigs);
+
+ List<DriftConfiguration> addedConfigs = synchronizer.getAddedConfigurations(resourceId,
+ resourceConfigsOnServer);
+ totalAdded += addedConfigs.size();
+ synchronizer.addToLocalInventory(resourceId, addedConfigs);
+ }
+
+ long endTime = System.currentTimeMillis();
+ if (log.isInfoEnabled()) {
+ log.info("Finished server sync for drift configurations. " + totalAdded + " added and " + totalDeleted +
+ " deleted in " + (endTime - startTime) + " ms");
+ }
+ }
+
+ /**
+ * This method determines whether or not this is a sync being done at start up (or
+ * more precisely during PC initialization). It does by checking to see if
+ * DriftManager is initialized. The only time DriftManager should not be initialized
+ * is during PC initialization which happens at start up or at runtime when the PC is
+ * rebooted.
+ *
+ * @return true if this is a sync being performed at start up or plugin container
+ * initialization.
+ */
+ private boolean isStartUpSync() {
+ return driftMgr == null || !driftMgr.isInitialized();
+ }
+
+}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSynchronizer.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSynchronizer.java
new file mode 100644
index 0000000..79ac3ad
--- /dev/null
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSynchronizer.java
@@ -0,0 +1,38 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.core.pc.drift.sync;
+
+import java.util.List;
+import java.util.Set;
+
+import org.rhq.core.domain.drift.DriftConfiguration;
+
+public interface DriftSynchronizer {
+
+ List<DriftConfiguration> getDeletedConfigurations(int resourceId,
+ Set<DriftConfiguration> configurationsFromServer);
+
+
+ void purgeFromLocalInventory(int resourceId, List<DriftConfiguration> configurations);
+
+ List<DriftConfiguration> getAddedConfigurations(int resourceId, Set<DriftConfiguration> configurationsFromServer);
+
+ void addToLocalInventory(int resourceId, List<DriftConfiguration> configurations);
+}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSynchronizerFactory.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSynchronizerFactory.java
new file mode 100644
index 0000000..5da9d49
--- /dev/null
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/DriftSynchronizerFactory.java
@@ -0,0 +1,37 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.core.pc.drift.sync;
+
+import java.io.File;
+
+import org.rhq.core.pc.drift.DriftManager;
+import org.rhq.core.pc.inventory.InventoryManager;
+
+public class DriftSynchronizerFactory {
+
+ public DriftSynchronizer getStartUpSynchronizer(InventoryManager inventoryManager, File dataDir) {
+ return new StartupSynchronizer(inventoryManager, dataDir);
+ }
+
+ public DriftSynchronizer getRuntimeSynchronizer(DriftManager driftManager) {
+ return new RuntimeSynchronizer(driftManager);
+ }
+
+}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/RuntimeSynchronizer.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/RuntimeSynchronizer.java
new file mode 100644
index 0000000..e7b4aa0
--- /dev/null
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/RuntimeSynchronizer.java
@@ -0,0 +1,123 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.core.pc.drift.sync;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.core.domain.drift.DriftConfiguration;
+import org.rhq.core.domain.drift.DriftConfigurationComparator;
+import org.rhq.core.pc.drift.DriftDetectionSchedule;
+import org.rhq.core.pc.drift.DriftManager;
+import org.rhq.core.pc.drift.ScheduleQueue;
+
+import static org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS;
+
+class RuntimeSynchronizer implements DriftSynchronizer {
+ private final Log log = LogFactory.getLog(RuntimeSynchronizer.class);
+
+ private DriftManager driftMgr;
+
+ public RuntimeSynchronizer(DriftManager driftManager) {
+ driftMgr = driftManager;
+ }
+
+ @Override
+ public List<DriftConfiguration> getDeletedConfigurations(int resourceId,
+ Set<DriftConfiguration> configurationsFromServer) {
+ log.debug("Checking for drift configurations that need to be deleted for resource id " + resourceId);
+ List<DriftConfiguration> deleted = new LinkedList<DriftConfiguration>();
+ ScheduleQueue queue = driftMgr.getSchedulesQueue();
+
+ for (DriftDetectionSchedule schedule : getSchedulesForResource(resourceId, queue.toArray())) {
+ if (!configurationsFromServer.contains(schedule.getDriftConfiguration())) {
+ if (log.isDebugEnabled()) {
+ log.debug("Detected stale drift configuration that needs to be purged - " +
+ toString(resourceId, schedule.getDriftConfiguration()));
+ }
+ deleted.add(schedule.getDriftConfiguration());
+ }
+ }
+ return deleted;
+ }
+
+ @Override
+ public void purgeFromLocalInventory(int resourceId, List<DriftConfiguration> configurations) {
+ log.debug("Preparing to unschedule drift detection and purge from local inventory drift configurations " +
+ "that have been deleted on the server for resource id " + resourceId);
+
+ for (DriftConfiguration c : configurations) {
+ driftMgr.unscheduleDriftDetection(resourceId, c);
+ }
+ }
+
+ @Override
+ public List<DriftConfiguration> getAddedConfigurations(int resourceId,
+ Set<DriftConfiguration> configurationsFromServer) {
+ log.debug("Checking for drift configurations that need to be added for resource id " + resourceId);
+
+ ScheduleQueue queue = driftMgr.getSchedulesQueue();
+ DriftConfigurationComparator comparator = new DriftConfigurationComparator(
+ BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS);
+ List<DriftConfiguration> added = new LinkedList<DriftConfiguration>();
+
+ for (DriftConfiguration c : configurationsFromServer) {
+ if (!queue.contains(resourceId, c, comparator)) {
+ if (log.isDebugEnabled()) {
+ log.debug("Detected new drift configuration that needs to be added to local inventory - " +
+ toString(resourceId, c));
+ }
+ added.add(c);
+ }
+ }
+ return added;
+ }
+
+ @Override
+ public void addToLocalInventory(int resourceId, List<DriftConfiguration> configurations) {
+ log.debug("Adding drift configurations to local inventory and creating drift detection schedules for " +
+ "resource id " + resourceId);
+
+ for (DriftConfiguration c : configurations) {
+ if (log.isDebugEnabled()) {
+ log.debug("Adding " + toString(resourceId, c) + " to local inventory");
+ }
+ driftMgr.scheduleDriftDetection(resourceId, c);
+ }
+ }
+
+ private String toString(int rid, DriftConfiguration c) {
+ return "DriftConfiguration[id: " + c.getId() + ", name: " + c.getName() + ", resourceId: " + rid + "]";
+ }
+
+ private List<DriftDetectionSchedule> getSchedulesForResource(int resourceId, DriftDetectionSchedule[] schedules) {
+ List<DriftDetectionSchedule> resourceSchedules = new LinkedList<DriftDetectionSchedule>();
+ for (DriftDetectionSchedule s : schedules) {
+ if (s.getResourceId() == resourceId) {
+ resourceSchedules.add(s);
+ }
+ }
+ return resourceSchedules;
+ }
+}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/StartupSynchronizer.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/StartupSynchronizer.java
new file mode 100644
index 0000000..4309bf8
--- /dev/null
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/sync/StartupSynchronizer.java
@@ -0,0 +1,127 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.core.pc.drift.sync;
+
+import java.io.File;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.core.domain.drift.DriftConfiguration;
+import org.rhq.core.pc.inventory.InventoryManager;
+import org.rhq.core.pc.inventory.ResourceContainer;
+
+import static org.rhq.core.util.file.FileUtil.purge;
+
+class StartupSynchronizer implements DriftSynchronizer {
+ private final Log log = LogFactory.getLog(StartupSynchronizer.class);
+
+ private InventoryManager inventoryMgr;
+
+ private File snapshotsDir;
+
+ public StartupSynchronizer(InventoryManager inventoryManager, File dataDirectory) {
+ inventoryMgr = inventoryManager;
+ snapshotsDir = new File(dataDirectory, "changesets");
+ }
+
+ @Override
+ public List<DriftConfiguration> getDeletedConfigurations(int resourceId,
+ Set<DriftConfiguration> configurationsFromServer) {
+ log.debug("Checking for drift configurations that need to be deleted for resource id " + resourceId);
+ List<DriftConfiguration> deleted = new LinkedList<DriftConfiguration>();
+ ResourceContainer container = inventoryMgr.getResourceContainer(resourceId);
+
+ for (DriftConfiguration c : container.getDriftConfigurations()) {
+ if (!configurationsFromServer.contains(c)) {
+ if (log.isDebugEnabled()) {
+ log.debug("Detected stale drift configuration that needs to be purged - " +
+ toString(resourceId, c));
+ }
+ deleted.add(c);
+ }
+ }
+
+ return deleted;
+ }
+
+ @Override
+ public void purgeFromLocalInventory(int resourceId, List<DriftConfiguration> configurations) {
+ log.debug("Preparing to purge from local inventory drift configurations that have been deleted on the server "
+ + "for resource id " + resourceId);
+ ResourceContainer container = inventoryMgr.getResourceContainer(resourceId);
+ File resourceSnapshotsDir = new File(snapshotsDir, Integer.toString(resourceId));
+
+ for (DriftConfiguration c : configurations) {
+ if (log.isDebugEnabled()) {
+ log.debug("Purging " + toString(resourceId, c) + " from local inventory");
+ }
+ container.removeDriftConfiguration(c);
+ File snapshotDir = new File(resourceSnapshotsDir, c.getName());
+ if (snapshotDir.exists()) {
+ if (log.isDebugEnabled()) {
+ log.debug("Puring snapshot directory " + snapshotDir.getPath());
+ }
+ purge(snapshotDir, true);
+ }
+ }
+ }
+
+ @Override
+ public List<DriftConfiguration> getAddedConfigurations(int resourceId,
+ Set<DriftConfiguration> configurationsFromServer) {
+ log.debug("Checking for drift configurations that need to be added for resource id " + resourceId);
+
+ ResourceContainer container = inventoryMgr.getResourceContainer(resourceId);
+ List<DriftConfiguration> added = new LinkedList<DriftConfiguration>();
+
+
+ for (DriftConfiguration c : configurationsFromServer) {
+ if (!container.containsDriftConfiguration(c)) {
+ if (log.isDebugEnabled()) {
+ log.debug("Detected new drift configuration that needs to be added to local inventory - " +
+ toString(resourceId, c));
+ }
+ added.add(c);
+ }
+ }
+ return added;
+ }
+
+ @Override
+ public void addToLocalInventory(int resourceId, List<DriftConfiguration> configurations) {
+ log.debug("Adding drift configurations to local inventory for resource id " + resourceId);
+ ResourceContainer container = inventoryMgr.getResourceContainer(resourceId);
+
+ for (DriftConfiguration c : configurations) {
+ if (log.isDebugEnabled()) {
+ log.debug("Adding " + toString(resourceId, c) + " to local inventory");
+ }
+ container.addDriftConfiguration(c);
+ }
+ }
+
+ private String toString(int rid, DriftConfiguration c) {
+ return "DriftConfiguration[id: " + c.getId() + ", name: " + c.getName() + ", resourceId: " + rid + "]";
+ }
+}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
index a4f292f..5d03d0c 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
@@ -22,9 +22,6 @@
*/
package org.rhq.core.pc.inventory;
-import static org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS;
-import static org.rhq.core.util.file.FileUtil.purge;
-
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
@@ -39,7 +36,6 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.TreeSet;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
@@ -69,8 +65,6 @@ import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.discovery.AvailabilityReport;
import org.rhq.core.domain.discovery.MergeResourceResponse;
import org.rhq.core.domain.discovery.ResourceSyncInfo;
-import org.rhq.core.domain.drift.DriftConfiguration;
-import org.rhq.core.domain.drift.DriftConfigurationComparator;
import org.rhq.core.domain.measurement.Availability;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.ResourceMeasurementScheduleRequest;
@@ -91,9 +85,7 @@ import org.rhq.core.pc.agent.AgentRegistrar;
import org.rhq.core.pc.agent.AgentService;
import org.rhq.core.pc.availability.AvailabilityCollectorThreadPool;
import org.rhq.core.pc.content.ContentContextImpl;
-import org.rhq.core.pc.drift.DriftDetectionSchedule;
-import org.rhq.core.pc.drift.DriftManager;
-import org.rhq.core.pc.drift.ScheduleQueue;
+import org.rhq.core.pc.drift.sync.DriftSyncManager;
import org.rhq.core.pc.event.EventContextImpl;
import org.rhq.core.pc.inventory.ResourceContainer.ResourceComponentState;
import org.rhq.core.pc.operation.OperationContextImpl;
@@ -2042,9 +2034,9 @@ public class InventoryManager extends AgentService implements ContainerService,
resources.push(child);
}
}
- Map<Integer, List<DriftConfiguration>> configs = configuration.getServerServices().getDriftServerService()
- .getDriftConfigurations(resourceIds);
- installDriftConfigurations(configs);
+
+ DriftSyncManager driftSyncMgr = createDriftSyncManager();
+ driftSyncMgr.syncConfigsWithServer(resourceIds);
}
private boolean supportsDriftManagement(Resource r) {
@@ -2090,9 +2082,8 @@ public class InventoryManager extends AgentService implements ContainerService,
}
}
- Map<Integer, List<DriftConfiguration>> driftConfigs = configuration.getServerServices().getDriftServerService()
- .getDriftConfigurations(committedResourceIds);
- installDriftConfigurations(driftConfigs);
+ DriftSyncManager driftSyncMgr = createDriftSyncManager();
+ driftSyncMgr.syncConfigsWithServer(committedResourceIds);
}
private void postProcessNewlyCommittedResources(Set<Resource> resources) {
@@ -2133,108 +2124,13 @@ public class InventoryManager extends AgentService implements ContainerService,
}
}
- private void installDriftConfigurations(Map<Integer, List<DriftConfiguration>> configsFromServer) {
- log.info("Syncing drift configurations from server with local inventory...");
- DriftManager driftMgr = PluginContainer.getInstance().getDriftManager();
- if (driftMgr != null && driftMgr.isInitialized()) {
- DriftConfigurationComparator comparator = new DriftConfigurationComparator(
- BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS);
- ScheduleQueue queue = driftMgr.getSchedulesQueue();
-
- // First check for drift configurations that have been deleted
- log.info("Checking for drift configurations that have been deleted on the server");
- for (Integer resourceId : configsFromServer.keySet()) {
- Set<DriftConfiguration> configsFromServerSet = new TreeSet<DriftConfiguration>(comparator);
- configsFromServerSet.addAll(configsFromServer.get(resourceId));
-
- List<DriftConfiguration> deleted = new ArrayList<DriftConfiguration>();
-
- for (DriftDetectionSchedule schedule : getSchedulesForResource(resourceId, queue.toArray())) {
- if (!configsFromServerSet.contains(schedule.getDriftConfiguration())) {
- if (log.isDebugEnabled()) {
- log.debug("Detected stale drift configuration. Preparing to unschedule " + schedule);
- }
- deleted.add(schedule.getDriftConfiguration());
- }
- }
- for (DriftConfiguration c : deleted) {
- driftMgr.unscheduleDriftDetection(resourceId, c);
- }
- }
-
- // add new drift configurations received from the server
- log.info("Checking for new drift configurations");
- for (Integer resourceId : configsFromServer.keySet()) {
- for (DriftConfiguration c : configsFromServer.get(resourceId)) {
- if (!queue.contains(resourceId, c, comparator)) {
- if (log.isDebugEnabled()) {
- log.debug("Detected new drift configuration. Creating new schedule for "
- + "DriftConfiguration[name: " + c.getName() + ", resourceId: " + resourceId + "]");
- }
- driftMgr.scheduleDriftDetection(resourceId, c);
- }
- }
- }
- } else {
- log.info("DriftManager is not available. Drift configurations will be persisted but detection will not "
- + "be scheduled.");
-
- // First check for drift configurations that have been deleted
- log.debug("Checking for stale drift configurations that need to be purged from inventory");
- File changeSetsDir = new File(configuration.getDataDirectory(), "changesets");
- for (Integer resourceId : configsFromServer.keySet()) {
- File resourceDir = new File(changeSetsDir, resourceId.toString());
- ResourceContainer container = getResourceContainer(resourceId);
- Set<DriftConfiguration> resourceConfigs = new TreeSet<DriftConfiguration>(
- new DriftConfigurationComparator(BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS));
- resourceConfigs.addAll(configsFromServer.get(resourceId));
-
- List<DriftConfiguration> deleted = new ArrayList<DriftConfiguration>();
-
- for (DriftConfiguration c : container.getDriftConfigurations()) {
- if (!resourceConfigs.contains(c)) {
- if (log.isDebugEnabled()) {
- log.debug("Detected stale drift configuration. Preparing to delete DriftConfiguration["
- + "name: " + c.getName() + ", resourceId: " + resourceId + "]");
- }
- deleted.add(c);
- }
- }
-
- for (DriftConfiguration c : deleted) {
- container.removeDriftConfiguration(c);
- File changeSetDir = new File(resourceDir, c.getName());
- if (changeSetDir.exists()) {
- log.debug("Purging " + changeSetDir.getPath());
- purge(changeSetDir, true);
- }
- }
- }
-
- // Now add any any drift configurations received from the server. These
- // could be new or updated configurations.
- log.debug("Checking for new drift configurations");
- for (Integer resourceId : configsFromServer.keySet()) {
- ResourceContainer container = getResourceContainer(resourceId);
- for (DriftConfiguration c : configsFromServer.get(resourceId)) {
- if (log.isDebugEnabled()) {
- log.debug("Adding DriftConfiguration[name: " + c.getName() + ", resourceId: " + resourceId
- + "]");
- }
- container.addDriftConfiguration(c);
- }
- }
- }
- }
-
- private List<DriftDetectionSchedule> getSchedulesForResource(int resourceId, DriftDetectionSchedule[] schedules) {
- List<DriftDetectionSchedule> resourceSchedules = new LinkedList<DriftDetectionSchedule>();
- for (DriftDetectionSchedule s : schedules) {
- if (s.getResourceId() == resourceId) {
- resourceSchedules.add(s);
- }
- }
- return resourceSchedules;
+ private DriftSyncManager createDriftSyncManager() {
+ DriftSyncManager mgr = new DriftSyncManager();
+ mgr.setDriftServer(configuration.getServerServices().getDriftServerService());
+ mgr.setDataDirectory(configuration.getDataDirectory());
+ mgr.setDriftManager(PluginContainer.getInstance().getDriftManager());
+ mgr.setInventoryManager(this);
+ return mgr;
}
/**
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/ResourceContainer.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/ResourceContainer.java
index f0722ed..791857b 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/ResourceContainer.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/ResourceContainer.java
@@ -251,6 +251,12 @@ public class ResourceContainer implements Serializable {
}
}
+ public boolean containsDriftConfiguration(DriftConfiguration c) {
+ synchronized (this) {
+ return driftConfigurations.containsKey(c.getName());
+ }
+ }
+
public void addDriftConfiguration(DriftConfiguration c) {
synchronized (this) {
driftConfigurations.put(c.getName(), c);
commit 4763164025895abfa107599527cbe00e3faaa5e2
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Thu Sep 15 16:18:47 2011 -0400
BZ 735403 : repackaging to avoid signed jar issues causing ClassNotFound errors.
i)moved three classes ii)updated classes and tests to use the new package.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/util/SerialUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/util/SerialUtility.java
index 8e1499b..3b3bc90 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/util/SerialUtility.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/util/SerialUtility.java
@@ -25,7 +25,7 @@ import java.io.ObjectOutputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.rhq.enterprise.server.util.HibernateDetachUtility;
+import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility;
/**
* @author Greg Hinkle
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/ExternalizableStrategyCommandListener.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/ExternalizableStrategyCommandListener.java
index a845c39..7ca48b2 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/ExternalizableStrategyCommandListener.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/ExternalizableStrategyCommandListener.java
@@ -23,7 +23,7 @@ import org.rhq.enterprise.communications.command.Command;
import org.rhq.enterprise.communications.command.CommandResponse;
import org.rhq.enterprise.communications.command.client.CommandPreprocessor;
import org.rhq.enterprise.communications.command.server.CommandListener;
-import org.rhq.enterprise.server.util.HibernateDetachUtility;
+import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility;
/**
* This is a listener for commands coming into the {@link ServiceContainer}'s {@link CommandPreprocessor} and will
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/impl/AgentClientImpl.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/impl/AgentClientImpl.java
index d1956d5..76d9c3e 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/impl/AgentClientImpl.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/impl/AgentClientImpl.java
@@ -36,7 +36,7 @@ import org.rhq.enterprise.communications.command.client.ClientCommandSender;
import org.rhq.enterprise.communications.command.client.ClientRemotePojoFactory;
import org.rhq.enterprise.communications.command.client.SendCallback;
import org.rhq.enterprise.server.agentclient.AgentClient;
-import org.rhq.enterprise.server.util.HibernateDetachUtility;
+import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility;
/**
* Provides the mechanism by which you obtain remote interface proxies to a particular agent. Using those remote
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index 139efe4..ee3a1ba 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -101,10 +101,10 @@ import org.rhq.enterprise.server.core.AgentManagerLocal;
import org.rhq.enterprise.server.plugin.pc.bundle.BundleServerPluginManager;
import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
+import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility;
+import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility.SerializationType;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
-import org.rhq.enterprise.server.util.HibernateDetachUtility;
-import org.rhq.enterprise.server.util.HibernateDetachUtility.SerializationType;
/**
* Manages the creation and usage of bundles.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleServerServiceImpl.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleServerServiceImpl.java
index 1fc6e1a..65a1209 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleServerServiceImpl.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleServerServiceImpl.java
@@ -36,9 +36,9 @@ import org.rhq.core.domain.criteria.PackageVersionCriteria;
import org.rhq.core.util.exception.WrappedRemotingException;
import org.rhq.enterprise.server.content.ContentManagerLocal;
import org.rhq.enterprise.server.content.ContentSourceManagerLocal;
-import org.rhq.enterprise.server.util.HibernateDetachUtility;
+import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility;
+import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility.SerializationType;
import org.rhq.enterprise.server.util.LookupUtil;
-import org.rhq.enterprise.server.util.HibernateDetachUtility.SerializationType;
/**
* Server-side implementation of the <code>BundleServerService</code>. This implmentation simply forwards
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteSafeInvocationHandler.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteSafeInvocationHandler.java
index 70ab414..d11cc03 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteSafeInvocationHandler.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteSafeInvocationHandler.java
@@ -37,7 +37,7 @@ import org.jboss.remoting.invocation.NameBasedInvocation;
import org.rhq.core.server.ExternalizableStrategy;
import org.rhq.core.util.exception.WrappedRemotingException;
-import org.rhq.enterprise.server.util.HibernateDetachUtility;
+import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility;
/**
* Handle remote invocations. Note that we perform only invocations defined in the remote interfaces.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteWsInvocationHandler.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteWsInvocationHandler.java
index c681bbc..22cbddb 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteWsInvocationHandler.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteWsInvocationHandler.java
@@ -28,7 +28,7 @@ import org.jboss.remoting.callback.InvokerCallbackHandler;
import org.jboss.remoting.invocation.NameBasedInvocation;
import org.rhq.core.server.ExternalizableStrategy;
-import org.rhq.enterprise.server.util.HibernateDetachUtility;
+import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility;
public class RemoteWsInvocationHandler implements ServerInvocationHandler {
diff --git a/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/safeinvoker/EJB3SafeEndpointInvoker.java b/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/safeinvoker/EJB3SafeEndpointInvoker.java
new file mode 100644
index 0000000..b236f5f
--- /dev/null
+++ b/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/safeinvoker/EJB3SafeEndpointInvoker.java
@@ -0,0 +1,58 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.safeinvoker;
+
+import java.lang.reflect.Method;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.jboss.ws.core.EndpointInvocation;
+import org.jboss.ws.core.server.ServiceEndpointInvoker;
+import org.jboss.wsf.spi.invocation.InvocationContext;
+
+/**
+ * This invoker will take an uninitialized relationships or references from EJB3 pojo's and null them out so that we can
+ * pass them as normal objects to the webservice binding layer. (Avoiding LazyInitializationExceptions)
+ *
+ * @author Greg Hinkle
+ */
+public class EJB3SafeEndpointInvoker extends ServiceEndpointInvoker {
+ private static final Log LOG = LogFactory.getLog(EJB3SafeEndpointInvoker.class);
+
+ @Override
+ public void invoke(InvocationContext invocationContext) throws Exception {
+ super.invoke(invocationContext);
+ EndpointInvocation inv = invocationContext.getAttachment(EndpointInvocation.class);
+ Object value = inv.getReturnValue();
+ if (value != null) {
+ try {
+ Method m = value.getClass().getMethod("getReturn");
+ if (m != null) {
+ HibernateDetachUtility.nullOutUninitializedFields(value,
+ HibernateDetachUtility.SerializationType.JAXB);
+ }
+
+ inv.setReturnValue(value);
+ } catch (NoSuchMethodException nsme) {
+ // Expected for void return types
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/safeinvoker/EJB3SafeEndpointInvokerDeploymentAspect.java b/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/safeinvoker/EJB3SafeEndpointInvokerDeploymentAspect.java
new file mode 100644
index 0000000..9dd0264
--- /dev/null
+++ b/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/safeinvoker/EJB3SafeEndpointInvokerDeploymentAspect.java
@@ -0,0 +1,59 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.safeinvoker;
+
+import java.util.Iterator;
+
+import org.jboss.ws.core.server.ServiceEndpointInvoker;
+import org.jboss.ws.core.server.ServiceEndpointInvokerEJB21;
+import org.jboss.wsf.spi.deployment.Deployment;
+import org.jboss.wsf.spi.deployment.DeploymentAspect;
+import org.jboss.wsf.spi.deployment.Endpoint;
+
+/**
+ * This class installs the EJB3SafeEndpointInvoker into the deployment aspect for the endpoint.
+ *
+ * @author Greg Hinkle
+ */
+public class EJB3SafeEndpointInvokerDeploymentAspect extends DeploymentAspect {
+ @Override
+ public void start(Deployment dep) {
+ Iterator i$ = dep.getService().getEndpoints().iterator();
+ do {
+ if (!i$.hasNext()) {
+ break;
+ }
+
+ Endpoint ep = (Endpoint) i$.next();
+ ServiceEndpointInvoker epInvoker = ep.getAttachment(ServiceEndpointInvoker.class);
+ if (epInvoker == null) {
+ org.jboss.wsf.spi.deployment.Deployment.DeploymentType depType = ep.getService().getDeployment()
+ .getType();
+ if (depType == org.jboss.wsf.spi.deployment.Deployment.DeploymentType.JAXRPC_EJB21) {
+ epInvoker = new ServiceEndpointInvokerEJB21();
+ } else {
+ epInvoker = new EJB3SafeEndpointInvoker();
+ }
+
+ ep.addAttachment(org.jboss.ws.core.server.ServiceEndpointInvoker.class, epInvoker);
+ epInvoker.init(ep);
+ }
+ } while (true);
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/safeinvoker/HibernateDetachUtility.java b/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/safeinvoker/HibernateDetachUtility.java
new file mode 100644
index 0000000..23f73ee
--- /dev/null
+++ b/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/safeinvoker/HibernateDetachUtility.java
@@ -0,0 +1,569 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.safeinvoker;
+
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Hibernate;
+import org.hibernate.proxy.HibernateProxy;
+
+/**
+ * This is a single static utility that is used to process any object just prior to sending it over the wire
+ * to remote clients (like GWT clients or remote web service clients).
+ *
+ * Essentially this utility scrubs the object of all Hibernate proxies, cleaning it such that it
+ * can be serialized over the wire successfully.
+ *
+ * @author Greg Hinkle
+ * @author Jay Shaughnessy
+ * @author John Mazzitelli
+ */
+@SuppressWarnings("unchecked")
+public class HibernateDetachUtility {
+
+ private static final Log LOG = LogFactory.getLog(HibernateDetachUtility.class);
+
+ public static enum SerializationType {
+ SERIALIZATION, JAXB
+ }
+
+ /*
+ * This is the type of object that will be used to generate identity
+ * hashcodes for objects that are being scanned during the detach.
+ * During production runtime, the hashCodeGenerator will use the
+ * java.lang.System mechanism, but since this is package scoped,
+ * tests can override this since. (See BZ 732089).
+ */
+ static interface HashCodeGenerator {
+ Integer getHashCode(Object value);
+ }
+
+ static class SystemHashCodeGenerator implements HashCodeGenerator {
+ @Override
+ public Integer getHashCode(Object value) {
+ return System.identityHashCode(value);
+ }
+ }
+
+ static HashCodeGenerator hashCodeGenerator = new SystemHashCodeGenerator();
+
+ // be able to configure the deepest recursion this utility will be allowed to go (see BZ 702109 that precipitated this need)
+ private static final String DEPTH_ALLOWED_SYSPROP = "rhq.server.hibernate-detach-utility.depth-allowed";
+ private static final String THROW_EXCEPTION_ON_DEPTH_LIMIT_SYSPROP = "rhq.server.hibernate-detach-utility.throw-exception-on-depth-limit";
+ private static final int depthAllowed;
+ private static final boolean throwExceptionOnDepthLimit;
+ static {
+ int value;
+ try {
+ String str = System.getProperty(DEPTH_ALLOWED_SYSPROP, "100");
+ value = Integer.parseInt(str);
+ } catch (Throwable t) {
+ value = 100;
+ }
+ depthAllowed = value;
+
+ boolean booleanValue;
+ try {
+ String str = System.getProperty(THROW_EXCEPTION_ON_DEPTH_LIMIT_SYSPROP, "true");
+ booleanValue = Boolean.parseBoolean(str);
+ } catch (Throwable t) {
+ booleanValue = true;
+ }
+ throwExceptionOnDepthLimit = booleanValue;
+ }
+
+ public static void nullOutUninitializedFields(Object value, SerializationType serializationType) throws Exception {
+ long start = System.currentTimeMillis();
+ Map<Integer, Object> checkedObjectMap = new HashMap<Integer, Object>();
+ Map<Integer, List<Object>> checkedObjectCollisionMap = new HashMap<Integer, List<Object>>();
+ nullOutUninitializedFields(value, checkedObjectMap, checkedObjectCollisionMap, 0, serializationType);
+ long duration = System.currentTimeMillis() - start;
+ if (duration > 1000) {
+ LOG.info("Detached [" + checkedObjectMap.size() + "] objects in [" + duration + "]ms");
+ } else {
+ LOG.debug("Detached [" + checkedObjectMap.size() + "] objects in [" + duration + "]ms");
+ }
+ // help the garbage collector be clearing these before we leave
+ checkedObjectMap.clear();
+ checkedObjectCollisionMap.clear();
+ }
+
+ /**
+ * @param value the object needing to be detached/scrubbed.
+ * @param checkedObjectMap This maps identityHashCodes to Objects we've already detached. In that way we can
+ * quickly determine if we've already done the work for the incoming value and avoid taversing it again. This
+ * works well almost all of the time, but it is possible that two different objects can have the same identity hash
+ * (conflicts are always possible with a hash). In that case we utilize the checkedObjectCollisionMap (see below).
+ * @param checkedObjectCollisionMap checkedObjectMap maps the identityhash to the *first* object with that hash. In
+ * most cases there will only be mapping for one hash, but it is possible to encounter the same hash for multiple
+ * objects, especially on 32bit or IBM JVMs. It is important to know if an object has already been detached
+ * because if it is somehow self-referencing, we have to stop the recursion. This map holds the 2nd..Nth mapping
+ * for a single hash and is used to ensure we never try to detach an object already processed.
+ * @param depth used to stop infinite recursion, defaults to a depth we don't expectto see, but it is configurable.
+ * @param serializationType
+ * @throws Exception if a problem occurs
+ * @throws IllegalStateException if the recursion depth limit is reached
+ */
+ private static void nullOutUninitializedFields(Object value, Map<Integer, Object> checkedObjectMap,
+ Map<Integer, List<Object>> checkedObjectCollisionMap, int depth, SerializationType serializationType)
+ throws Exception {
+ if (depth > depthAllowed) {
+ String warningMessage = "Recursed too deep [" + depth + " > " + depthAllowed
+ + "], will not attempt to detach object of type ["
+ + ((value != null) ? value.getClass().getName() : "N/A")
+ + "]. This may cause serialization errors later. "
+ + "You can try to work around this by setting the system property [" + DEPTH_ALLOWED_SYSPROP
+ + "] to a value higher than [" + depth + "] or you can set the system property ["
+ + THROW_EXCEPTION_ON_DEPTH_LIMIT_SYSPROP + "] to 'false'";
+ LOG.warn(warningMessage);
+ if (throwExceptionOnDepthLimit) {
+ throw new IllegalStateException(warningMessage);
+ }
+ return;
+ }
+
+ if (null == value) {
+ return;
+ }
+
+ // System.identityHashCode is a hash code, and therefore not guaranteed to be unique. And we've seen this
+ // be the case. So, we use it to try and avoid duplicating work, but handle the case when two objects may
+ // have an identity crisis.
+ Integer valueIdentity = hashCodeGenerator.getHashCode(value);
+ Object checkedObject = checkedObjectMap.get(valueIdentity);
+
+ if (null == checkedObject) {
+ // if we have not yet encountered an object with this hash, store it in our map and start scrubbing
+ checkedObjectMap.put(valueIdentity, value);
+
+ } else if (value == checkedObject) {
+ // if we have scrubbed this already, no more work to be done
+ return;
+
+ } else {
+ // we have a situation where multiple objects have the same identity hashcode, work with our
+ // collision map to decide whether it needs to be scrubbed and add if necessary.
+ // Note that this code block is infrequently hit, it is by design that we've pushed the extra
+ // work, map, etc, involved for this infrequent case into its own block. The standard cases must
+ // be as fast and lean as possible.
+
+ boolean alreadyDetached = false;
+ List<Object> collisionObjects = checkedObjectCollisionMap.get(valueIdentity);
+
+ if (null == collisionObjects) {
+ // if this is the 2nd occurrence for this hash, create a new map entry
+ collisionObjects = new ArrayList<Object>(1);
+ checkedObjectCollisionMap.put(valueIdentity, collisionObjects);
+
+ } else {
+ // if we have scrubbed this already, no more work to be done
+ for (Object collisionObject : collisionObjects) {
+ if (value == collisionObject) {
+ alreadyDetached = true;
+ break;
+ }
+ }
+ }
+
+ if (LOG.isDebugEnabled()) {
+ StringBuilder message = new StringBuilder("\n\tIDENTITY HASHCODE COLLISION [hash=");
+ message.append(valueIdentity);
+ message.append(", alreadyDetached=");
+ message.append(alreadyDetached);
+ message.append("]");
+ message.append("\n\tCurrent : ");
+ message.append(value.getClass().getName());
+ message.append("\n\t ");
+ message.append(value);
+ message.append("\n\tPrevious : ");
+ message.append(checkedObject.getClass().getName());
+ message.append("\n\t ");
+ message.append(checkedObject);
+ for (Object collisionObject : collisionObjects) {
+ message.append("\n\tPrevious : ");
+ message.append(collisionObject.getClass().getName());
+ message.append("\n\t ");
+ message.append(collisionObject);
+ }
+
+ LOG.debug(message);
+ }
+
+ // now that we've done our logging, if already detached we're done. Otherwise add to the list of collision
+ // objects for this hash, and start scrubbing
+ if (alreadyDetached) {
+ return;
+ }
+
+ collisionObjects.add(value);
+ }
+
+ // Perform the detaching
+ if (value instanceof Object[]) {
+ Object[] objArray = (Object[]) value;
+ for (int i = 0; i < objArray.length; i++) {
+ Object listEntry = objArray[i];
+ Object replaceEntry = replaceObject(listEntry);
+ if (replaceEntry != null) {
+ objArray[i] = replaceEntry;
+ }
+ nullOutUninitializedFields(objArray[i], checkedObjectMap, checkedObjectCollisionMap, depth + 1,
+ serializationType);
+ }
+ } else if (value instanceof List) {
+ // Null out any entries in initialized collections
+ ListIterator i = ((List) value).listIterator();
+ while (i.hasNext()) {
+ Object val = i.next();
+ Object replace = replaceObject(val);
+ if (replace != null) {
+ val = replace;
+ i.set(replace);
+ }
+ nullOutUninitializedFields(val, checkedObjectMap, checkedObjectCollisionMap, depth + 1,
+ serializationType);
+ }
+
+ } else if (value instanceof Collection) {
+ Collection collection = (Collection) value;
+ Collection itemsToBeReplaced = new ArrayList();
+ Collection replacementItems = new ArrayList();
+ for (Object item : collection) {
+ Object replacementItem = replaceObject(item);
+ if (replacementItem != null) {
+ itemsToBeReplaced.add(item);
+ replacementItems.add(replacementItem);
+ item = replacementItem;
+ }
+ nullOutUninitializedFields(item, checkedObjectMap, checkedObjectCollisionMap, depth + 1,
+ serializationType);
+ }
+ collection.removeAll(itemsToBeReplaced);
+ collection.addAll(replacementItems); // watch out! if this collection is a Set, HashMap$MapSet doesn't support addAll. See BZ 688000
+ } else if (value instanceof Map) {
+ Map originalMap = (Map) value;
+ HashMap<Object, Object> replaceMap = new HashMap<Object, Object>();
+ for (Iterator i = originalMap.keySet().iterator(); i.hasNext();) {
+ // get original key and value - these might be hibernate proxies
+ Object originalKey = i.next();
+ Object originalKeyValue = originalMap.get(originalKey);
+
+ // replace with non-hibernate classes, if appropriate (will be null otherwise)
+ Object replaceKey = replaceObject(originalKey);
+ Object replaceValue = replaceObject(originalKeyValue);
+
+ // if either original key or original value was a hibernate proxy object, we have to
+ // remove it from the original map, and remember the replacement objects for later
+ if (replaceKey != null || replaceValue != null) {
+ Object newKey = (replaceKey != null) ? replaceKey : originalKey;
+ Object newValue = (replaceValue != null) ? replaceValue : originalKeyValue;
+ replaceMap.put(newKey, newValue);
+ i.remove();
+ }
+ }
+
+ // all hibernate proxies have been removed, we need to replace them with their
+ // non-proxy object representations that we got from replaceObject() calls
+ originalMap.putAll(replaceMap);
+
+ // now go through each item in the map and null out their internal fields
+ for (Object key : originalMap.keySet()) {
+ nullOutUninitializedFields(originalMap.get(key), checkedObjectMap, checkedObjectCollisionMap,
+ depth + 1, serializationType);
+ nullOutUninitializedFields(key, checkedObjectMap, checkedObjectCollisionMap, depth + 1,
+ serializationType);
+ }
+ } else if (value instanceof Enum) {
+ // don't need to detach enums, treat them as special objects
+ return;
+ }
+
+ if (serializationType == SerializationType.JAXB) {
+ XmlAccessorType at = value.getClass().getAnnotation(XmlAccessorType.class);
+ if (at != null && at.value() == XmlAccessType.FIELD) {
+ nullOutFieldsByFieldAccess(value, checkedObjectMap, checkedObjectCollisionMap, depth, serializationType);
+ } else {
+ nullOutFieldsByAccessors(value, checkedObjectMap, checkedObjectCollisionMap, depth, serializationType);
+ }
+ } else if (serializationType == SerializationType.SERIALIZATION) {
+ nullOutFieldsByFieldAccess(value, checkedObjectMap, checkedObjectCollisionMap, depth, serializationType);
+ }
+
+ }
+
+ private static void nullOutFieldsByFieldAccess(Object object, Map<Integer, Object> checkedObjects,
+ Map<Integer, List<Object>> checkedObjectCollisionMap, int depth, SerializationType serializationType)
+ throws Exception {
+
+ Class tmpClass = object.getClass();
+ List<Field> fieldsToClean = new ArrayList<Field>();
+ while (tmpClass != null && tmpClass != Object.class) {
+ Field[] declaredFields = tmpClass.getDeclaredFields();
+ for (Field declaredField : declaredFields) {
+ // do not process static final or transient fields since they won't be serialized anyway
+ int modifiers = declaredField.getModifiers();
+ if (!((Modifier.isFinal(modifiers) && Modifier.isStatic(modifiers)) || Modifier.isTransient(modifiers))) {
+ fieldsToClean.add(declaredField);
+ }
+ }
+ tmpClass = tmpClass.getSuperclass();
+ }
+
+ nullOutFieldsByFieldAccess(object, fieldsToClean, checkedObjects, checkedObjectCollisionMap, depth,
+ serializationType);
+ }
+
+ private static void nullOutFieldsByFieldAccess(Object object, List<Field> classFields,
+ Map<Integer, Object> checkedObjects, Map<Integer, List<Object>> checkedObjectCollisionMap, int depth,
+ SerializationType serializationType) throws Exception {
+
+ boolean accessModifierFlag = false;
+ for (Field field : classFields) {
+ accessModifierFlag = false;
+ if (!field.isAccessible()) {
+ field.setAccessible(true);
+ accessModifierFlag = true;
+ }
+
+ Object fieldValue = field.get(object);
+
+ if (fieldValue instanceof HibernateProxy) {
+
+ Object replacement = null;
+ String assistClassName = fieldValue.getClass().getName();
+ if (assistClassName.contains("javassist") || assistClassName.contains("EnhancerByCGLIB")) {
+
+ Class assistClass = fieldValue.getClass();
+ try {
+ Method m = assistClass.getMethod("writeReplace");
+ replacement = m.invoke(fieldValue);
+
+ String assistNameDelimiter = assistClassName.contains("javassist") ? "_$$_" : "$$";
+
+ assistClassName = assistClassName.substring(0, assistClassName.indexOf(assistNameDelimiter));
+ if (!replacement.getClass().getName().contains("hibernate")) {
+ nullOutUninitializedFields(replacement, checkedObjects, checkedObjectCollisionMap,
+ depth + 1, serializationType);
+
+ field.set(object, replacement);
+ } else {
+ replacement = null;
+ }
+ } catch (Exception e) {
+ LOG.error("Unable to write replace object " + fieldValue.getClass(), e);
+ }
+ }
+
+ if (replacement == null) {
+
+ String className = ((HibernateProxy) fieldValue).getHibernateLazyInitializer().getEntityName();
+
+ //see if there is a context classloader we should use instead of the current one.
+ ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+
+ Class clazz = contextClassLoader == null ? Class.forName(className) : Class.forName(className,
+ true, contextClassLoader);
+ Class[] constArgs = { Integer.class };
+ Constructor construct = null;
+
+ try {
+ construct = clazz.getConstructor(constArgs);
+ replacement = construct.newInstance((Integer) ((HibernateProxy) fieldValue)
+ .getHibernateLazyInitializer().getIdentifier());
+ field.set(object, replacement);
+ } catch (NoSuchMethodException nsme) {
+
+ try {
+ Field idField = clazz.getDeclaredField("id");
+ Constructor ct = clazz.getDeclaredConstructor();
+ ct.setAccessible(true);
+ replacement = ct.newInstance();
+ if (!idField.isAccessible()) {
+ idField.setAccessible(true);
+ }
+ idField.set(replacement, (Integer) ((HibernateProxy) fieldValue)
+ .getHibernateLazyInitializer().getIdentifier());
+ } catch (Exception e) {
+ e.printStackTrace();
+ LOG.error("No id constructor and unable to set field id for base bean " + className, e);
+ }
+
+ field.set(object, replacement);
+ }
+ }
+
+ } else {
+ if (fieldValue instanceof org.hibernate.collection.PersistentCollection) {
+ // Replace hibernate specific collection types
+
+ if (!((org.hibernate.collection.PersistentCollection) fieldValue).wasInitialized()) {
+ field.set(object, null);
+ } else {
+
+ Object replacement = null;
+ boolean needToNullOutFields = true; // needed for BZ 688000
+ if (fieldValue instanceof Map) {
+ replacement = new HashMap((Map) fieldValue);
+ } else if (fieldValue instanceof List) {
+ replacement = new ArrayList((List) fieldValue);
+ } else if (fieldValue instanceof Set) {
+ ArrayList l = new ArrayList((Set) fieldValue); // cannot recurse Sets, see BZ 688000
+ nullOutUninitializedFields(l, checkedObjects, checkedObjectCollisionMap, depth + 1,
+ serializationType);
+ replacement = new HashSet(l); // convert it back to a Set since that's the type of the real collection, see BZ 688000
+ needToNullOutFields = false;
+ } else if (fieldValue instanceof Collection) {
+ replacement = new ArrayList((Collection) fieldValue);
+ }
+ setField(object, field.getName(), replacement);
+
+ if (needToNullOutFields) {
+ nullOutUninitializedFields(replacement, checkedObjects, checkedObjectCollisionMap,
+ depth + 1, serializationType);
+ }
+ }
+
+ } else {
+ if (fieldValue != null
+ && (fieldValue.getClass().getName().contains("org.rhq") || fieldValue instanceof Collection
+ || fieldValue instanceof Object[] || fieldValue instanceof Map))
+ nullOutUninitializedFields((fieldValue), checkedObjects, checkedObjectCollisionMap, depth + 1,
+ serializationType);
+ }
+ }
+ if (accessModifierFlag) {
+ field.setAccessible(false);
+ }
+ }
+
+ }
+
+ private static Object replaceObject(Object object) {
+ Object replacement = null;
+
+ if (object instanceof HibernateProxy) {
+ if (object.getClass().getName().contains("javassist")) {
+ Class assistClass = object.getClass();
+ try {
+ Method m = assistClass.getMethod("writeReplace");
+ replacement = m.invoke(object);
+
+ } catch (Exception e) {
+ LOG.error("Unable to write replace object " + object.getClass(), e);
+ }
+ }
+ }
+ return replacement;
+ }
+
+ private static void nullOutFieldsByAccessors(Object value, Map<Integer, Object> checkedObjects,
+ Map<Integer, List<Object>> checkedObjectCollisionMap, int depth, SerializationType serializationType)
+ throws Exception {
+ // Null out any collections that aren't loaded
+ BeanInfo bi = Introspector.getBeanInfo(value.getClass(), Object.class);
+
+ PropertyDescriptor[] pds = bi.getPropertyDescriptors();
+ for (PropertyDescriptor pd : pds) {
+ Object propertyValue = null;
+ try {
+ propertyValue = pd.getReadMethod().invoke(value);
+ } catch (Throwable lie) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Couldn't load: " + pd.getName() + " off of " + value.getClass().getSimpleName(), lie);
+ }
+ }
+
+ if (!Hibernate.isInitialized(propertyValue)) {
+ try {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Nulling out: " + pd.getName() + " off of " + value.getClass().getSimpleName());
+ }
+
+ Method writeMethod = pd.getWriteMethod();
+ if ((writeMethod != null) && (writeMethod.getAnnotation(XmlTransient.class) == null)) {
+ pd.getWriteMethod().invoke(value, new Object[] { null });
+ } else {
+ nullOutField(value, pd.getName());
+ }
+ } catch (Exception lie) {
+ LOG.debug("Couldn't null out: " + pd.getName() + " off of " + value.getClass().getSimpleName()
+ + " trying field access", lie);
+ nullOutField(value, pd.getName());
+ }
+ } else {
+ if ((propertyValue instanceof Collection)
+ || ((propertyValue != null) && propertyValue.getClass().getName().startsWith("org.rhq.core.domain"))) {
+ nullOutUninitializedFields(propertyValue, checkedObjects, checkedObjectCollisionMap, depth + 1,
+ serializationType);
+ }
+ }
+ }
+ }
+
+ private static void setField(Object object, String fieldName, Object newValue) {
+ try {
+ Field f = object.getClass().getDeclaredField(fieldName);
+ if (f != null) {
+ // try to set the field this way
+ f.setAccessible(true);
+ f.set(object, newValue);
+ }
+ } catch (NoSuchFieldException e) {
+ // ignore this
+ } catch (IllegalAccessException e) {
+ // ignore this
+ }
+ }
+
+ private static void nullOutField(Object value, String fieldName) {
+ try {
+ Field f = value.getClass().getDeclaredField(fieldName);
+ if (f != null) {
+ // try to set the field this way
+ f.setAccessible(true);
+ f.set(value, null);
+ }
+ } catch (NoSuchFieldException e) {
+ // ignore this
+ } catch (IllegalAccessException e) {
+ // ignore this
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/util/EJB3SafeEndpointInvoker.java b/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/util/EJB3SafeEndpointInvoker.java
deleted file mode 100644
index f605df1..0000000
--- a/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/util/EJB3SafeEndpointInvoker.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program 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 version 2 of the License.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.server.util;
-
-import java.lang.reflect.Method;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.jboss.ws.core.EndpointInvocation;
-import org.jboss.ws.core.server.ServiceEndpointInvoker;
-import org.jboss.wsf.spi.invocation.InvocationContext;
-
-/**
- * This invoker will take an uninitialized relationships or references from EJB3 pojo's and null them out so that we can
- * pass them as normal objects to the webservice binding layer. (Avoiding LazyInitializationExceptions)
- *
- * @author Greg Hinkle
- */
-public class EJB3SafeEndpointInvoker extends ServiceEndpointInvoker {
- private static final Log LOG = LogFactory.getLog(EJB3SafeEndpointInvoker.class);
-
- @Override
- public void invoke(InvocationContext invocationContext) throws Exception {
- super.invoke(invocationContext);
- EndpointInvocation inv = invocationContext.getAttachment(EndpointInvocation.class);
- Object value = inv.getReturnValue();
- if (value != null) {
- try {
- Method m = value.getClass().getMethod("getReturn");
- if (m != null) {
- HibernateDetachUtility.nullOutUninitializedFields(value,
- HibernateDetachUtility.SerializationType.JAXB);
- }
-
- inv.setReturnValue(value);
- } catch (NoSuchMethodException nsme) {
- // Expected for void return types
- }
- }
- }
-}
\ No newline at end of file
diff --git a/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/util/EJB3SafeEndpointInvokerDeploymentAspect.java b/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/util/EJB3SafeEndpointInvokerDeploymentAspect.java
deleted file mode 100644
index 9d90417..0000000
--- a/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/util/EJB3SafeEndpointInvokerDeploymentAspect.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program 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 version 2 of the License.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.server.util;
-
-import java.util.Iterator;
-
-import org.jboss.ws.core.server.ServiceEndpointInvoker;
-import org.jboss.ws.core.server.ServiceEndpointInvokerEJB21;
-import org.jboss.wsf.spi.deployment.Deployment;
-import org.jboss.wsf.spi.deployment.DeploymentAspect;
-import org.jboss.wsf.spi.deployment.Endpoint;
-
-/**
- * This class installs the EJB3SafeEndpointInvoker into the deployment aspect for the endpoint.
- *
- * @author Greg Hinkle
- */
-public class EJB3SafeEndpointInvokerDeploymentAspect extends DeploymentAspect {
- @Override
- public void start(Deployment dep) {
- Iterator i$ = dep.getService().getEndpoints().iterator();
- do {
- if (!i$.hasNext()) {
- break;
- }
-
- Endpoint ep = (Endpoint) i$.next();
- ServiceEndpointInvoker epInvoker = ep.getAttachment(ServiceEndpointInvoker.class);
- if (epInvoker == null) {
- org.jboss.wsf.spi.deployment.Deployment.DeploymentType depType = ep.getService().getDeployment()
- .getType();
- if (depType == org.jboss.wsf.spi.deployment.Deployment.DeploymentType.JAXRPC_EJB21) {
- epInvoker = new ServiceEndpointInvokerEJB21();
- } else {
- epInvoker = new EJB3SafeEndpointInvoker();
- }
-
- ep.addAttachment(org.jboss.ws.core.server.ServiceEndpointInvoker.class, epInvoker);
- epInvoker.init(ep);
- }
- } while (true);
- }
-}
\ No newline at end of file
diff --git a/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/util/HibernateDetachUtility.java b/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/util/HibernateDetachUtility.java
deleted file mode 100644
index 51b78ee..0000000
--- a/modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/util/HibernateDetachUtility.java
+++ /dev/null
@@ -1,569 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program 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 version 2 of the License.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.server.util;
-
-import java.beans.BeanInfo;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Set;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlTransient;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.Hibernate;
-import org.hibernate.proxy.HibernateProxy;
-
-/**
- * This is a single static utility that is used to process any object just prior to sending it over the wire
- * to remote clients (like GWT clients or remote web service clients).
- *
- * Essentially this utility scrubs the object of all Hibernate proxies, cleaning it such that it
- * can be serialized over the wire successfully.
- *
- * @author Greg Hinkle
- * @author Jay Shaughnessy
- * @author John Mazzitelli
- */
-@SuppressWarnings("unchecked")
-public class HibernateDetachUtility {
-
- private static final Log LOG = LogFactory.getLog(HibernateDetachUtility.class);
-
- public static enum SerializationType {
- SERIALIZATION, JAXB
- }
-
- /*
- * This is the type of object that will be used to generate identity
- * hashcodes for objects that are being scanned during the detach.
- * During production runtime, the hashCodeGenerator will use the
- * java.lang.System mechanism, but since this is package scoped,
- * tests can override this since. (See BZ 732089).
- */
- static interface HashCodeGenerator {
- Integer getHashCode(Object value);
- }
-
- static class SystemHashCodeGenerator implements HashCodeGenerator {
- @Override
- public Integer getHashCode(Object value) {
- return System.identityHashCode(value);
- }
- }
-
- static HashCodeGenerator hashCodeGenerator = new SystemHashCodeGenerator();
-
- // be able to configure the deepest recursion this utility will be allowed to go (see BZ 702109 that precipitated this need)
- private static final String DEPTH_ALLOWED_SYSPROP = "rhq.server.hibernate-detach-utility.depth-allowed";
- private static final String THROW_EXCEPTION_ON_DEPTH_LIMIT_SYSPROP = "rhq.server.hibernate-detach-utility.throw-exception-on-depth-limit";
- private static final int depthAllowed;
- private static final boolean throwExceptionOnDepthLimit;
- static {
- int value;
- try {
- String str = System.getProperty(DEPTH_ALLOWED_SYSPROP, "100");
- value = Integer.parseInt(str);
- } catch (Throwable t) {
- value = 100;
- }
- depthAllowed = value;
-
- boolean booleanValue;
- try {
- String str = System.getProperty(THROW_EXCEPTION_ON_DEPTH_LIMIT_SYSPROP, "true");
- booleanValue = Boolean.parseBoolean(str);
- } catch (Throwable t) {
- booleanValue = true;
- }
- throwExceptionOnDepthLimit = booleanValue;
- }
-
- public static void nullOutUninitializedFields(Object value, SerializationType serializationType) throws Exception {
- long start = System.currentTimeMillis();
- Map<Integer, Object> checkedObjectMap = new HashMap<Integer, Object>();
- Map<Integer, List<Object>> checkedObjectCollisionMap = new HashMap<Integer, List<Object>>();
- nullOutUninitializedFields(value, checkedObjectMap, checkedObjectCollisionMap, 0, serializationType);
- long duration = System.currentTimeMillis() - start;
- if (duration > 1000) {
- LOG.info("Detached [" + checkedObjectMap.size() + "] objects in [" + duration + "]ms");
- } else {
- LOG.debug("Detached [" + checkedObjectMap.size() + "] objects in [" + duration + "]ms");
- }
- // help the garbage collector be clearing these before we leave
- checkedObjectMap.clear();
- checkedObjectCollisionMap.clear();
- }
-
- /**
- * @param value the object needing to be detached/scrubbed.
- * @param checkedObjectMap This maps identityHashCodes to Objects we've already detached. In that way we can
- * quickly determine if we've already done the work for the incoming value and avoid taversing it again. This
- * works well almost all of the time, but it is possible that two different objects can have the same identity hash
- * (conflicts are always possible with a hash). In that case we utilize the checkedObjectCollisionMap (see below).
- * @param checkedObjectCollisionMap checkedObjectMap maps the identityhash to the *first* object with that hash. In
- * most cases there will only be mapping for one hash, but it is possible to encounter the same hash for multiple
- * objects, especially on 32bit or IBM JVMs. It is important to know if an object has already been detached
- * because if it is somehow self-referencing, we have to stop the recursion. This map holds the 2nd..Nth mapping
- * for a single hash and is used to ensure we never try to detach an object already processed.
- * @param depth used to stop infinite recursion, defaults to a depth we don't expectto see, but it is configurable.
- * @param serializationType
- * @throws Exception if a problem occurs
- * @throws IllegalStateException if the recursion depth limit is reached
- */
- private static void nullOutUninitializedFields(Object value, Map<Integer, Object> checkedObjectMap,
- Map<Integer, List<Object>> checkedObjectCollisionMap, int depth, SerializationType serializationType)
- throws Exception {
- if (depth > depthAllowed) {
- String warningMessage = "Recursed too deep [" + depth + " > " + depthAllowed
- + "], will not attempt to detach object of type ["
- + ((value != null) ? value.getClass().getName() : "N/A")
- + "]. This may cause serialization errors later. "
- + "You can try to work around this by setting the system property [" + DEPTH_ALLOWED_SYSPROP
- + "] to a value higher than [" + depth + "] or you can set the system property ["
- + THROW_EXCEPTION_ON_DEPTH_LIMIT_SYSPROP + "] to 'false'";
- LOG.warn(warningMessage);
- if (throwExceptionOnDepthLimit) {
- throw new IllegalStateException(warningMessage);
- }
- return;
- }
-
- if (null == value) {
- return;
- }
-
- // System.identityHashCode is a hash code, and therefore not guaranteed to be unique. And we've seen this
- // be the case. So, we use it to try and avoid duplicating work, but handle the case when two objects may
- // have an identity crisis.
- Integer valueIdentity = hashCodeGenerator.getHashCode(value);
- Object checkedObject = checkedObjectMap.get(valueIdentity);
-
- if (null == checkedObject) {
- // if we have not yet encountered an object with this hash, store it in our map and start scrubbing
- checkedObjectMap.put(valueIdentity, value);
-
- } else if (value == checkedObject) {
- // if we have scrubbed this already, no more work to be done
- return;
-
- } else {
- // we have a situation where multiple objects have the same identity hashcode, work with our
- // collision map to decide whether it needs to be scrubbed and add if necessary.
- // Note that this code block is infrequently hit, it is by design that we've pushed the extra
- // work, map, etc, involved for this infrequent case into its own block. The standard cases must
- // be as fast and lean as possible.
-
- boolean alreadyDetached = false;
- List<Object> collisionObjects = checkedObjectCollisionMap.get(valueIdentity);
-
- if (null == collisionObjects) {
- // if this is the 2nd occurrence for this hash, create a new map entry
- collisionObjects = new ArrayList<Object>(1);
- checkedObjectCollisionMap.put(valueIdentity, collisionObjects);
-
- } else {
- // if we have scrubbed this already, no more work to be done
- for (Object collisionObject : collisionObjects) {
- if (value == collisionObject) {
- alreadyDetached = true;
- break;
- }
- }
- }
-
- if (LOG.isDebugEnabled()) {
- StringBuilder message = new StringBuilder("\n\tIDENTITY HASHCODE COLLISION [hash=");
- message.append(valueIdentity);
- message.append(", alreadyDetached=");
- message.append(alreadyDetached);
- message.append("]");
- message.append("\n\tCurrent : ");
- message.append(value.getClass().getName());
- message.append("\n\t ");
- message.append(value);
- message.append("\n\tPrevious : ");
- message.append(checkedObject.getClass().getName());
- message.append("\n\t ");
- message.append(checkedObject);
- for (Object collisionObject : collisionObjects) {
- message.append("\n\tPrevious : ");
- message.append(collisionObject.getClass().getName());
- message.append("\n\t ");
- message.append(collisionObject);
- }
-
- LOG.debug(message);
- }
-
- // now that we've done our logging, if already detached we're done. Otherwise add to the list of collision
- // objects for this hash, and start scrubbing
- if (alreadyDetached) {
- return;
- }
-
- collisionObjects.add(value);
- }
-
- // Perform the detaching
- if (value instanceof Object[]) {
- Object[] objArray = (Object[]) value;
- for (int i = 0; i < objArray.length; i++) {
- Object listEntry = objArray[i];
- Object replaceEntry = replaceObject(listEntry);
- if (replaceEntry != null) {
- objArray[i] = replaceEntry;
- }
- nullOutUninitializedFields(objArray[i], checkedObjectMap, checkedObjectCollisionMap, depth + 1,
- serializationType);
- }
- } else if (value instanceof List) {
- // Null out any entries in initialized collections
- ListIterator i = ((List) value).listIterator();
- while (i.hasNext()) {
- Object val = i.next();
- Object replace = replaceObject(val);
- if (replace != null) {
- val = replace;
- i.set(replace);
- }
- nullOutUninitializedFields(val, checkedObjectMap, checkedObjectCollisionMap, depth + 1,
- serializationType);
- }
-
- } else if (value instanceof Collection) {
- Collection collection = (Collection) value;
- Collection itemsToBeReplaced = new ArrayList();
- Collection replacementItems = new ArrayList();
- for (Object item : collection) {
- Object replacementItem = replaceObject(item);
- if (replacementItem != null) {
- itemsToBeReplaced.add(item);
- replacementItems.add(replacementItem);
- item = replacementItem;
- }
- nullOutUninitializedFields(item, checkedObjectMap, checkedObjectCollisionMap, depth + 1,
- serializationType);
- }
- collection.removeAll(itemsToBeReplaced);
- collection.addAll(replacementItems); // watch out! if this collection is a Set, HashMap$MapSet doesn't support addAll. See BZ 688000
- } else if (value instanceof Map) {
- Map originalMap = (Map) value;
- HashMap<Object, Object> replaceMap = new HashMap<Object, Object>();
- for (Iterator i = originalMap.keySet().iterator(); i.hasNext();) {
- // get original key and value - these might be hibernate proxies
- Object originalKey = i.next();
- Object originalKeyValue = originalMap.get(originalKey);
-
- // replace with non-hibernate classes, if appropriate (will be null otherwise)
- Object replaceKey = replaceObject(originalKey);
- Object replaceValue = replaceObject(originalKeyValue);
-
- // if either original key or original value was a hibernate proxy object, we have to
- // remove it from the original map, and remember the replacement objects for later
- if (replaceKey != null || replaceValue != null) {
- Object newKey = (replaceKey != null) ? replaceKey : originalKey;
- Object newValue = (replaceValue != null) ? replaceValue : originalKeyValue;
- replaceMap.put(newKey, newValue);
- i.remove();
- }
- }
-
- // all hibernate proxies have been removed, we need to replace them with their
- // non-proxy object representations that we got from replaceObject() calls
- originalMap.putAll(replaceMap);
-
- // now go through each item in the map and null out their internal fields
- for (Object key : originalMap.keySet()) {
- nullOutUninitializedFields(originalMap.get(key), checkedObjectMap, checkedObjectCollisionMap,
- depth + 1, serializationType);
- nullOutUninitializedFields(key, checkedObjectMap, checkedObjectCollisionMap, depth + 1,
- serializationType);
- }
- } else if (value instanceof Enum) {
- // don't need to detach enums, treat them as special objects
- return;
- }
-
- if (serializationType == SerializationType.JAXB) {
- XmlAccessorType at = value.getClass().getAnnotation(XmlAccessorType.class);
- if (at != null && at.value() == XmlAccessType.FIELD) {
- nullOutFieldsByFieldAccess(value, checkedObjectMap, checkedObjectCollisionMap, depth, serializationType);
- } else {
- nullOutFieldsByAccessors(value, checkedObjectMap, checkedObjectCollisionMap, depth, serializationType);
- }
- } else if (serializationType == SerializationType.SERIALIZATION) {
- nullOutFieldsByFieldAccess(value, checkedObjectMap, checkedObjectCollisionMap, depth, serializationType);
- }
-
- }
-
- private static void nullOutFieldsByFieldAccess(Object object, Map<Integer, Object> checkedObjects,
- Map<Integer, List<Object>> checkedObjectCollisionMap, int depth, SerializationType serializationType)
- throws Exception {
-
- Class tmpClass = object.getClass();
- List<Field> fieldsToClean = new ArrayList<Field>();
- while (tmpClass != null && tmpClass != Object.class) {
- Field[] declaredFields = tmpClass.getDeclaredFields();
- for (Field declaredField : declaredFields) {
- // do not process static final or transient fields since they won't be serialized anyway
- int modifiers = declaredField.getModifiers();
- if (!((Modifier.isFinal(modifiers) && Modifier.isStatic(modifiers)) || Modifier.isTransient(modifiers))) {
- fieldsToClean.add(declaredField);
- }
- }
- tmpClass = tmpClass.getSuperclass();
- }
-
- nullOutFieldsByFieldAccess(object, fieldsToClean, checkedObjects, checkedObjectCollisionMap, depth,
- serializationType);
- }
-
- private static void nullOutFieldsByFieldAccess(Object object, List<Field> classFields,
- Map<Integer, Object> checkedObjects, Map<Integer, List<Object>> checkedObjectCollisionMap, int depth,
- SerializationType serializationType) throws Exception {
-
- boolean accessModifierFlag = false;
- for (Field field : classFields) {
- accessModifierFlag = false;
- if (!field.isAccessible()) {
- field.setAccessible(true);
- accessModifierFlag = true;
- }
-
- Object fieldValue = field.get(object);
-
- if (fieldValue instanceof HibernateProxy) {
-
- Object replacement = null;
- String assistClassName = fieldValue.getClass().getName();
- if (assistClassName.contains("javassist") || assistClassName.contains("EnhancerByCGLIB")) {
-
- Class assistClass = fieldValue.getClass();
- try {
- Method m = assistClass.getMethod("writeReplace");
- replacement = m.invoke(fieldValue);
-
- String assistNameDelimiter = assistClassName.contains("javassist") ? "_$$_" : "$$";
-
- assistClassName = assistClassName.substring(0, assistClassName.indexOf(assistNameDelimiter));
- if (!replacement.getClass().getName().contains("hibernate")) {
- nullOutUninitializedFields(replacement, checkedObjects, checkedObjectCollisionMap,
- depth + 1, serializationType);
-
- field.set(object, replacement);
- } else {
- replacement = null;
- }
- } catch (Exception e) {
- LOG.error("Unable to write replace object " + fieldValue.getClass(), e);
- }
- }
-
- if (replacement == null) {
-
- String className = ((HibernateProxy) fieldValue).getHibernateLazyInitializer().getEntityName();
-
- //see if there is a context classloader we should use instead of the current one.
- ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
-
- Class clazz = contextClassLoader == null ? Class.forName(className) : Class.forName(className,
- true, contextClassLoader);
- Class[] constArgs = { Integer.class };
- Constructor construct = null;
-
- try {
- construct = clazz.getConstructor(constArgs);
- replacement = construct.newInstance((Integer) ((HibernateProxy) fieldValue)
- .getHibernateLazyInitializer().getIdentifier());
- field.set(object, replacement);
- } catch (NoSuchMethodException nsme) {
-
- try {
- Field idField = clazz.getDeclaredField("id");
- Constructor ct = clazz.getDeclaredConstructor();
- ct.setAccessible(true);
- replacement = ct.newInstance();
- if (!idField.isAccessible()) {
- idField.setAccessible(true);
- }
- idField.set(replacement, (Integer) ((HibernateProxy) fieldValue)
- .getHibernateLazyInitializer().getIdentifier());
- } catch (Exception e) {
- e.printStackTrace();
- LOG.error("No id constructor and unable to set field id for base bean " + className, e);
- }
-
- field.set(object, replacement);
- }
- }
-
- } else {
- if (fieldValue instanceof org.hibernate.collection.PersistentCollection) {
- // Replace hibernate specific collection types
-
- if (!((org.hibernate.collection.PersistentCollection) fieldValue).wasInitialized()) {
- field.set(object, null);
- } else {
-
- Object replacement = null;
- boolean needToNullOutFields = true; // needed for BZ 688000
- if (fieldValue instanceof Map) {
- replacement = new HashMap((Map) fieldValue);
- } else if (fieldValue instanceof List) {
- replacement = new ArrayList((List) fieldValue);
- } else if (fieldValue instanceof Set) {
- ArrayList l = new ArrayList((Set) fieldValue); // cannot recurse Sets, see BZ 688000
- nullOutUninitializedFields(l, checkedObjects, checkedObjectCollisionMap, depth + 1,
- serializationType);
- replacement = new HashSet(l); // convert it back to a Set since that's the type of the real collection, see BZ 688000
- needToNullOutFields = false;
- } else if (fieldValue instanceof Collection) {
- replacement = new ArrayList((Collection) fieldValue);
- }
- setField(object, field.getName(), replacement);
-
- if (needToNullOutFields) {
- nullOutUninitializedFields(replacement, checkedObjects, checkedObjectCollisionMap,
- depth + 1, serializationType);
- }
- }
-
- } else {
- if (fieldValue != null
- && (fieldValue.getClass().getName().contains("org.rhq") || fieldValue instanceof Collection
- || fieldValue instanceof Object[] || fieldValue instanceof Map))
- nullOutUninitializedFields((fieldValue), checkedObjects, checkedObjectCollisionMap, depth + 1,
- serializationType);
- }
- }
- if (accessModifierFlag) {
- field.setAccessible(false);
- }
- }
-
- }
-
- private static Object replaceObject(Object object) {
- Object replacement = null;
-
- if (object instanceof HibernateProxy) {
- if (object.getClass().getName().contains("javassist")) {
- Class assistClass = object.getClass();
- try {
- Method m = assistClass.getMethod("writeReplace");
- replacement = m.invoke(object);
-
- } catch (Exception e) {
- LOG.error("Unable to write replace object " + object.getClass(), e);
- }
- }
- }
- return replacement;
- }
-
- private static void nullOutFieldsByAccessors(Object value, Map<Integer, Object> checkedObjects,
- Map<Integer, List<Object>> checkedObjectCollisionMap, int depth, SerializationType serializationType)
- throws Exception {
- // Null out any collections that aren't loaded
- BeanInfo bi = Introspector.getBeanInfo(value.getClass(), Object.class);
-
- PropertyDescriptor[] pds = bi.getPropertyDescriptors();
- for (PropertyDescriptor pd : pds) {
- Object propertyValue = null;
- try {
- propertyValue = pd.getReadMethod().invoke(value);
- } catch (Throwable lie) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Couldn't load: " + pd.getName() + " off of " + value.getClass().getSimpleName(), lie);
- }
- }
-
- if (!Hibernate.isInitialized(propertyValue)) {
- try {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Nulling out: " + pd.getName() + " off of " + value.getClass().getSimpleName());
- }
-
- Method writeMethod = pd.getWriteMethod();
- if ((writeMethod != null) && (writeMethod.getAnnotation(XmlTransient.class) == null)) {
- pd.getWriteMethod().invoke(value, new Object[] { null });
- } else {
- nullOutField(value, pd.getName());
- }
- } catch (Exception lie) {
- LOG.debug("Couldn't null out: " + pd.getName() + " off of " + value.getClass().getSimpleName()
- + " trying field access", lie);
- nullOutField(value, pd.getName());
- }
- } else {
- if ((propertyValue instanceof Collection)
- || ((propertyValue != null) && propertyValue.getClass().getName().startsWith("org.rhq.core.domain"))) {
- nullOutUninitializedFields(propertyValue, checkedObjects, checkedObjectCollisionMap, depth + 1,
- serializationType);
- }
- }
- }
- }
-
- private static void setField(Object object, String fieldName, Object newValue) {
- try {
- Field f = object.getClass().getDeclaredField(fieldName);
- if (f != null) {
- // try to set the field this way
- f.setAccessible(true);
- f.set(object, newValue);
- }
- } catch (NoSuchFieldException e) {
- // ignore this
- } catch (IllegalAccessException e) {
- // ignore this
- }
- }
-
- private static void nullOutField(Object value, String fieldName) {
- try {
- Field f = value.getClass().getDeclaredField(fieldName);
- if (f != null) {
- // try to set the field this way
- f.setAccessible(true);
- f.set(value, null);
- }
- } catch (NoSuchFieldException e) {
- // ignore this
- } catch (IllegalAccessException e) {
- // ignore this
- }
- }
-}
\ No newline at end of file
diff --git a/modules/enterprise/server/safe-invoker/src/test/java/org/rhq/enterprise/server/safeinvoker/HibernateDetachUtilityTest.java b/modules/enterprise/server/safe-invoker/src/test/java/org/rhq/enterprise/server/safeinvoker/HibernateDetachUtilityTest.java
new file mode 100644
index 0000000..08a0201
--- /dev/null
+++ b/modules/enterprise/server/safe-invoker/src/test/java/org/rhq/enterprise/server/safeinvoker/HibernateDetachUtilityTest.java
@@ -0,0 +1,142 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * 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 and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.enterprise.server.safeinvoker;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.testng.annotations.Test;
+
+import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility;
+import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility.SerializationType;
+
+@Test
+public class HibernateDetachUtilityTest {
+ /**
+ * This tests the rare, but very possible, condition where two objects
+ * have the same identity hashcode (System.identityHashCode(A) == System.identityHashCode(B))
+ * but are not identical objects (A != B). We have seen this as a valid condition
+ * on both SUN and IBM JRE implementations.
+ */
+ public void testIdenticalHashCodesNonIdenticalObjects() throws Exception {
+ class ArrayObject implements Serializable {
+ private static final long serialVersionUID = 1L;
+ long id;
+ Integer[] array;
+ ArrayObject object; // needed for self-referencing
+
+ ArrayObject(long key, ArrayObject obj, Integer... members) {
+ id = key;
+ object = obj;
+ array = members;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("ArrayObject [id=").append(id).append(", object=").append(
+ (object == null) ? "null" : object.id).append(", array=").append(Arrays.toString(array))
+ .append("]");
+ return builder.toString();
+ }
+
+ }
+
+ class DuplicateHashCodeGenerator implements HibernateDetachUtility.HashCodeGenerator {
+ public Integer getHashCode(Object value) {
+ if (value instanceof Integer && ((Integer) value).intValue() >= 2) {
+ return 11111;
+ } else if (value instanceof ArrayObject) {
+ return 22222;
+ } else {
+ return System.identityHashCode(value);
+ }
+ }
+ }
+
+ ArrayObject array1 = new ArrayObject(1, null, 1, 2, 3);
+ ArrayObject array2 = new ArrayObject(2, array1, 2, 3);
+ array1.object = array2; // now 1 references 2 and 2 reference 1, circular dependency
+ ArrayObject array3 = new ArrayObject(3, array2, 3);
+ array3.object = array3;
+ ArrayList<ArrayObject> array = new ArrayList<ArrayObject>(3);
+ array.add(array1);
+ array.add(array2);
+ array.add(array3);
+
+ // SANITY CHECK - make sure our setup is as we expect it to be
+ assert array.get(0).array[0] == Integer.valueOf(1);
+ assert array.get(0).array[1] == Integer.valueOf(2);
+ assert array.get(0).array[2] == Integer.valueOf(3);
+ assert array.get(1).array[0] == Integer.valueOf(2);
+ assert array.get(1).array[1] == Integer.valueOf(3);
+ assert array.get(2).array[0] == Integer.valueOf(3);
+
+ // make sure array1 still references array2 and vice versa
+ assertObjectEquals(array.get(0).object, array.get(1));
+ assertObjectEquals(array.get(1).object, array.get(0));
+
+ // make sure array3 still self-references
+ assertObjectEquals(array.get(2).object, array.get(2));
+
+ // simulate rare condition
+ HibernateDetachUtility.hashCodeGenerator = new DuplicateHashCodeGenerator();
+ HibernateDetachUtility.nullOutUninitializedFields(array, SerializationType.SERIALIZATION);
+ assert array.get(0).array[0] == Integer.valueOf(1);
+ assert array.get(0).array[1] == Integer.valueOf(2);
+ assert array.get(0).array[2] == Integer.valueOf(3);
+ assert array.get(1).array[0] == Integer.valueOf(2);
+ assert array.get(1).array[1] == Integer.valueOf(3);
+ assert array.get(2).array[0] == Integer.valueOf(3);
+
+ // make sure array1 still references array2 and vice versa
+ assertObjectEquals(array.get(0).object, array.get(1));
+ assertObjectEquals(array.get(1).object, array.get(0));
+
+ // make sure array3 still self-references
+ assertObjectEquals(array.get(2).object, array.get(2));
+
+ // put it back the way it was
+ HibernateDetachUtility.hashCodeGenerator = new HibernateDetachUtility.SystemHashCodeGenerator();
+ HibernateDetachUtility.nullOutUninitializedFields(array, SerializationType.SERIALIZATION);
+ assert array.get(0).array[0] == Integer.valueOf(1);
+ assert array.get(0).array[1] == Integer.valueOf(2);
+ assert array.get(0).array[2] == Integer.valueOf(3);
+ assert array.get(1).array[0] == Integer.valueOf(2);
+ assert array.get(1).array[1] == Integer.valueOf(3);
+ assert array.get(2).array[0] == Integer.valueOf(3);
+
+ // make sure array1 still references array2 and vice versa
+ assertObjectEquals(array.get(0).object, array.get(1));
+ assertObjectEquals(array.get(1).object, array.get(0));
+
+ // make sure array3 still self-references
+ assertObjectEquals(array.get(2).object, array.get(2));
+ }
+
+ private void assertObjectEquals(Object o1, Object o2) {
+ assert o1 == o2 : "Object [" + o1 + "] does not equal object [" + o2 + "]";
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/server/safe-invoker/src/test/java/org/rhq/enterprise/server/util/HibernateDetachUtilityTest.java b/modules/enterprise/server/safe-invoker/src/test/java/org/rhq/enterprise/server/util/HibernateDetachUtilityTest.java
deleted file mode 100644
index 3df5403..0000000
--- a/modules/enterprise/server/safe-invoker/src/test/java/org/rhq/enterprise/server/util/HibernateDetachUtilityTest.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2011 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * 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 and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-package org.rhq.enterprise.server.util;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import org.testng.annotations.Test;
-
-import org.rhq.enterprise.server.util.HibernateDetachUtility.SerializationType;
-
-@Test
-public class HibernateDetachUtilityTest {
- /**
- * This tests the rare, but very possible, condition where two objects
- * have the same identity hashcode (System.identityHashCode(A) == System.identityHashCode(B))
- * but are not identical objects (A != B). We have seen this as a valid condition
- * on both SUN and IBM JRE implementations.
- */
- public void testIdenticalHashCodesNonIdenticalObjects() throws Exception {
- class ArrayObject implements Serializable {
- private static final long serialVersionUID = 1L;
- long id;
- Integer[] array;
- ArrayObject object; // needed for self-referencing
-
- ArrayObject(long key, ArrayObject obj, Integer... members) {
- id = key;
- object = obj;
- array = members;
- }
-
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("ArrayObject [id=").append(id).append(", object=").append(
- (object == null) ? "null" : object.id).append(", array=").append(Arrays.toString(array))
- .append("]");
- return builder.toString();
- }
-
- }
-
- class DuplicateHashCodeGenerator implements HibernateDetachUtility.HashCodeGenerator {
- public Integer getHashCode(Object value) {
- if (value instanceof Integer && ((Integer) value).intValue() >= 2) {
- return 11111;
- } else if (value instanceof ArrayObject) {
- return 22222;
- } else {
- return System.identityHashCode(value);
- }
- }
- }
-
- ArrayObject array1 = new ArrayObject(1, null, 1, 2, 3);
- ArrayObject array2 = new ArrayObject(2, array1, 2, 3);
- array1.object = array2; // now 1 references 2 and 2 reference 1, circular dependency
- ArrayObject array3 = new ArrayObject(3, array2, 3);
- array3.object = array3;
- ArrayList<ArrayObject> array = new ArrayList<ArrayObject>(3);
- array.add(array1);
- array.add(array2);
- array.add(array3);
-
- // SANITY CHECK - make sure our setup is as we expect it to be
- assert array.get(0).array[0] == Integer.valueOf(1);
- assert array.get(0).array[1] == Integer.valueOf(2);
- assert array.get(0).array[2] == Integer.valueOf(3);
- assert array.get(1).array[0] == Integer.valueOf(2);
- assert array.get(1).array[1] == Integer.valueOf(3);
- assert array.get(2).array[0] == Integer.valueOf(3);
-
- // make sure array1 still references array2 and vice versa
- assertObjectEquals(array.get(0).object, array.get(1));
- assertObjectEquals(array.get(1).object, array.get(0));
-
- // make sure array3 still self-references
- assertObjectEquals(array.get(2).object, array.get(2));
-
- // simulate rare condition
- HibernateDetachUtility.hashCodeGenerator = new DuplicateHashCodeGenerator();
- HibernateDetachUtility.nullOutUninitializedFields(array, SerializationType.SERIALIZATION);
- assert array.get(0).array[0] == Integer.valueOf(1);
- assert array.get(0).array[1] == Integer.valueOf(2);
- assert array.get(0).array[2] == Integer.valueOf(3);
- assert array.get(1).array[0] == Integer.valueOf(2);
- assert array.get(1).array[1] == Integer.valueOf(3);
- assert array.get(2).array[0] == Integer.valueOf(3);
-
- // make sure array1 still references array2 and vice versa
- assertObjectEquals(array.get(0).object, array.get(1));
- assertObjectEquals(array.get(1).object, array.get(0));
-
- // make sure array3 still self-references
- assertObjectEquals(array.get(2).object, array.get(2));
-
- // put it back the way it was
- HibernateDetachUtility.hashCodeGenerator = new HibernateDetachUtility.SystemHashCodeGenerator();
- HibernateDetachUtility.nullOutUninitializedFields(array, SerializationType.SERIALIZATION);
- assert array.get(0).array[0] == Integer.valueOf(1);
- assert array.get(0).array[1] == Integer.valueOf(2);
- assert array.get(0).array[2] == Integer.valueOf(3);
- assert array.get(1).array[0] == Integer.valueOf(2);
- assert array.get(1).array[1] == Integer.valueOf(3);
- assert array.get(2).array[0] == Integer.valueOf(3);
-
- // make sure array1 still references array2 and vice versa
- assertObjectEquals(array.get(0).object, array.get(1));
- assertObjectEquals(array.get(1).object, array.get(0));
-
- // make sure array3 still self-references
- assertObjectEquals(array.get(2).object, array.get(2));
- }
-
- private void assertObjectEquals(Object o1, Object o2) {
- assert o1 == o2 : "Object [" + o1 + "] does not equal object [" + o2 + "]";
- }
-}
\ No newline at end of file
commit c98d6b5d34dce6e97b8875683264cc8c063a9c42
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Sep 15 15:33:36 2011 -0400
add commented lines that can be uncommented to enable JProfiler agent
diff --git a/modules/enterprise/server/container/src/main/bin-resources/bin/rhq-server.sh b/modules/enterprise/server/container/src/main/bin-resources/bin/rhq-server.sh
index b255914..fd88242 100644
--- a/modules/enterprise/server/container/src/main/bin-resources/bin/rhq-server.sh
+++ b/modules/enterprise/server/container/src/main/bin-resources/bin/rhq-server.sh
@@ -54,7 +54,13 @@
# is mainly used to augment the Server's
# default set of options. This can be
# left unset if it is not needed.
-#RHQ_SERVER_ADDITIONAL_JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n
+# Enable remote debugging
+#RHQ_SERVER_ADDITIONAL_JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"
+# Enable JProfiler
+#JPROFILER_HOME="/opt/jprofiler6"
+#RHQ_SERVER_ADDITIONAL_JAVA_OPTS="$RHQ_SERVER_ADDITIONAL_JAVA_OPTS -agentlib:jprofilerti=port=8849 -Xbootclasspath/a:$JPROFILER_HOME/bin/agent.jar"
+#export PATH="$PATH:$JPROFILER_HOME/bin"
+#export LD_LIBRARY_PATH="$JPROFILER_HOME/bin/linux-x64"
#
# RHQ_SERVER_CMDLINE_OPTS - If this is defined, these are the command line
# arguments that will be passed to the RHQ Server
commit c74567558ed10769eeb0e636c12553f95c9cbb6e
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Thu Sep 15 12:45:36 2011 -0400
BZ 736077: applied patches from bz and one other fix(to disable TitleBar from hardcoding RHQ) to get JON and not RHQ in browser titles.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
index 88801e0..2916bdb 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
@@ -64,6 +64,8 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.message.MessageCenter;
import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
+import java.util.List;
+
/**
* The GWT {@link EntryPoint entry point} to the RHQ GUI.
*
@@ -276,6 +278,7 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String>, Event.Na
public void onSuccess(ProductInfo result) {
productInfo = result;
+ Window.setTitle(productInfo.getName());
buildCoreUI();
}
});
@@ -470,22 +473,25 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String>, Event.Na
setHeight100();
}
+ // TODO (ips, 09/06/11): i18n the title.
private String getViewPathTitle(ViewPath viewPath) {
- // default title is the path minus any IDs we find. That should give a least some nice default title.
+ // Set the default title to the view path minus any IDs.
StringBuilder viewPathTitle = new StringBuilder();
- for (ViewId viewId : viewPath.getViewPath()) {
- // none of our path elements start with a digit that is NOT an ID; if we see an ID, skip it
- if (!Character.isDigit(viewId.getPath().charAt(0))) {
- if (viewPathTitle.length() > 0) {
+ String productName = (productInfo != null) ? productInfo.getName() : "RHQ";
+ List<ViewId> viewIds = viewPath.getViewPath();
+ if (!viewIds.isEmpty()) {
+ viewPathTitle.append(productName).append(": ");
+ viewPathTitle.append(viewIds.get(0));
+ for (int i = 1, viewPathSize = viewIds.size(); i < viewPathSize; i++) {
+ ViewId viewId = viewIds.get(i);
+ // None of our path elements start with a digit that is NOT an ID, so if we see an ID, skip it.
+ if (!Character.isDigit(viewId.getPath().charAt(0))) {
viewPathTitle.append(" | ");
+ viewPathTitle.append(viewId.getPath());
}
- viewPathTitle.append(viewId.getPath());
}
}
- if (viewPathTitle.length() == 0) {
- viewPathTitle.append("Core Application");
- }
- return "RHQ: " + viewPathTitle.toString();
+ return viewPathTitle.toString();
}
public void initCanvas() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/AboutModalWindow.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/AboutModalWindow.java
index b476f66..e219837 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/AboutModalWindow.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/AboutModalWindow.java
@@ -76,6 +76,7 @@ public class AboutModalWindow extends LocatableWindow {
LocatableVLayout contentPane = new LocatableVLayout(extendLocatorId("Content"));
contentPane.setPadding(10);
+ // TODO (ips, 09/06/11): Convert this raw HTML to SmartGWT widgets.
HTMLPane htmlPane = new HTMLPane();
String html = "<span class=\"DisplaySubhead\">\n" + " <a href=\"" + productInfo.getUrl() + "\" title=\""
+ productInfo.getFullName() + " " + productInfo.getUrl() + "\" target=\"_blank\">"
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/TitleBar.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/TitleBar.java
index 3ded730..84c6113 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/TitleBar.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/TitleBar.java
@@ -19,7 +19,6 @@
*/
package org.rhq.enterprise.gui.coregui.client.components;
-import com.google.gwt.user.client.Window;
import com.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.widgets.Label;
@@ -91,15 +90,16 @@ public class TitleBar extends LocatableToolStrip {
String contents;
String windowTitle;
- if (title == null) {
- contents = null;
- windowTitle = "RHQ";
- } else {
- contents = "<span class='HeaderLabel'>" + title + "</span>";
- windowTitle = "RHQ: " + title;
- }
- this.label.setContents(contents);
- Window.setTitle(windowTitle);
+ //spinder 9/15/11: Commenting out to let CoreGUI handle all title setting.
+ // if (title == null) {
+ // contents = null;
+ // windowTitle = "RHQ";
+ // } else {
+ // contents = "<span class='HeaderLabel'>" + title + "</span>";
+ // windowTitle = "RHQ: " + title;
+ // }
+ // this.label.setContents(contents);
+ // Window.setTitle(windowTitle);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.html b/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.html
index 94d9621..21acc5d 100644
--- a/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.html
+++ b/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.html
@@ -13,7 +13,7 @@
<!-- support internationalized characters -->
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
- <title>RHQ Core Application</title>
+ <title>RHQ</title>
<link rel="icon" type="image/png" href="/images/favicon.png" />
<link rel="apple-touch-icon" href="/images/favicon.png" />
commit 6d50ee623ff7a6279931dd5ad90bc958c86f11fe
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 15 11:56:02 2011 -0400
make the test group names unique from other tests so we can tell what tests created what groups
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/operation/OperationHistoryTest.java b/modules/core/domain/src/test/java/org/rhq/core/domain/operation/OperationHistoryTest.java
index df93193..b0fef5c 100644
--- a/modules/core/domain/src/test/java/org/rhq/core/domain/operation/OperationHistoryTest.java
+++ b/modules/core/domain/src/test/java/org/rhq/core/domain/operation/OperationHistoryTest.java
@@ -321,7 +321,7 @@ public class OperationHistoryTest extends AbstractEJB3Test {
resource.setUuid("" + new Random().nextInt());
em.persist(resource);
- ResourceGroup group = new ResourceGroup("testgroup" + System.currentTimeMillis(), resourceType);
+ ResourceGroup group = new ResourceGroup("testgroupOH" + System.currentTimeMillis(), resourceType);
em.persist(group);
group.addExplicitResource(resource);
} catch (Exception e) {
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ResourceGroupTest.java b/modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ResourceGroupTest.java
index 4ab3f4a..5ff2879 100644
--- a/modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ResourceGroupTest.java
+++ b/modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ResourceGroupTest.java
@@ -78,7 +78,7 @@ public class ResourceGroupTest extends AbstractEJB3Test {
resource.setUuid("" + new Random().nextInt());
em.persist(resource);
- ResourceGroup group = new ResourceGroup("testgroup" + System.currentTimeMillis(), resourceType);
+ ResourceGroup group = new ResourceGroup("testgroupRG" + System.currentTimeMillis(), resourceType);
em.persist(group);
group.addExplicitResource(resource);
} catch (Exception e) {
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/operation/OperationManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/operation/OperationManagerBeanTest.java
index 2f47aa2..f068ead 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/operation/OperationManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/operation/OperationManagerBeanTest.java
@@ -1576,7 +1576,7 @@ public class OperationManagerBeanTest extends AbstractEJB3Test {
resource.setInventoryStatus(InventoryStatus.COMMITTED);
em.persist(resource);
- ResourceGroup group = new ResourceGroup("testgroup" + System.currentTimeMillis(), resourceType);
+ ResourceGroup group = new ResourceGroup("testgroupOMB" + System.currentTimeMillis(), resourceType);
em.persist(group);
group.addExplicitResource(resource);
} catch (Exception e) {
commit 457e6d126578c74a7cf16a4d4f84123d6dcf5d2e
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 15 10:01:49 2011 -0400
don't show the refresh button in the alert details view - they don't do anything and when you click it, they get disabled and never enabled again.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDetailsView.java
index c206db6..1ee0b09 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDetailsView.java
@@ -197,6 +197,7 @@ public class AlertDetailsView extends LocatableVLayout implements BookmarkableVi
this.record = record;
setHeight("35%");
setWidth100();
+ setShowFooterRefresh(false);
}
@Override
@@ -263,6 +264,7 @@ public class AlertDetailsView extends LocatableVLayout implements BookmarkableVi
this.record = record;
setHeight("35%");
setWidth100();
+ setShowFooterRefresh(false);
}
@Override
commit 1a667256e025ccfc134528613dae82625d0cc1a9
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 15 01:19:51 2011 -0400
[BZ 698600] do some null checks, because i am paranoid
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
index 154336b..4e15bd9 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
@@ -78,8 +78,10 @@ public class AlertFormatUtility {
// this is a calltime threshold condition
str.append(MSG.view_alert_common_tab_conditions_type_metric_calltime_threshold());
str.append(" [");
- str.append(condition.getMeasurementDefinition().getDisplayName());
- str.append(" ");
+ if (condition.getMeasurementDefinition() != null) {
+ str.append(condition.getMeasurementDefinition().getDisplayName());
+ str.append(" ");
+ }
str.append(condition.getOption()); // MIN, MAX, AVG (never null)
str.append(" ");
str.append(condition.getComparator()); // <, >, =
@@ -124,8 +126,10 @@ public class AlertFormatUtility {
// this is a calltime change condition
str.append(MSG.view_alert_common_tab_conditions_type_metric_calltime_change());
str.append(" [");
- str.append(condition.getMeasurementDefinition().getDisplayName());
- str.append(" ");
+ if (condition.getMeasurementDefinition() != null) {
+ str.append(condition.getMeasurementDefinition().getDisplayName());
+ str.append(" ");
+ }
str.append(condition.getOption()); // MIN, MAX, AVG (never null)
str.append(" ");
str.append(getCalltimeChangeComparator(condition.getComparator())); // LO, HI, CH
commit a4122c29a8788b93f85f5a97e8f3895bb89aa028
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 15 01:19:05 2011 -0400
[BZ 698600] fix UI so users can enter units and see units in alert condition UI
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
index 6c41e21..154336b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
@@ -76,16 +76,15 @@ public class AlertFormatUtility {
str.append("]");
} else {
// this is a calltime threshold condition
- // the name of the metric is only obtainable by querying for the name from the meas def ID
- // but since most times (all the time?) there is only one calltime metric per resource,
- // not showing the metric name probably isn't detrimental
str.append(MSG.view_alert_common_tab_conditions_type_metric_calltime_threshold());
str.append(" [");
+ str.append(condition.getMeasurementDefinition().getDisplayName());
+ str.append(" ");
str.append(condition.getOption()); // MIN, MAX, AVG (never null)
str.append(" ");
str.append(condition.getComparator()); // <, >, =
str.append(" ");
- str.append(condition.getThreshold());
+ str.append(formatted);
str.append("]");
if (condition.getName() != null && condition.getName().length() > 0) {
str.append(" ");
@@ -123,11 +122,10 @@ public class AlertFormatUtility {
str.append("]");
} else {
// this is a calltime change condition
- // the name of the metric is only obtainable by querying for the name from the meas def ID
- // but since most times (all the time?) there is only one calltime metric per resource,
- // not showing the metric name probably isn't detrimental
str.append(MSG.view_alert_common_tab_conditions_type_metric_calltime_change());
str.append(" [");
+ str.append(condition.getMeasurementDefinition().getDisplayName());
+ str.append(" ");
str.append(condition.getOption()); // MIN, MAX, AVG (never null)
str.append(" ");
str.append(getCalltimeChangeComparator(condition.getComparator())); // LO, HI, CH
@@ -276,129 +274,4 @@ public class AlertFormatUtility {
}
return recoveryInfo;
}
- /* THIS IS THE OLD CODE - IT HAS LOTS OF TODOs AND DIDN'T FULLY WORK
-
- public static String formatAlertConditionForDisplay(AlertCondition condition) {
- AlertConditionCategory category = condition.getCategory();
-
- StringBuilder textValue = new StringBuilder();
-
- // first format the LHS of the operator
- if (category == AlertConditionCategory.CONTROL) {
- try {
- String operationName = condition.getName();
- //Integer resourceTypeId = condition.getAlertDefinition().getResource().getResourceType().getId();
- //OperationManagerLocal operationManager = LookupUtil.getOperationManager();
- //OperationDefinition definition = operationManager.getOperationDefinitionByResourceTypeAndName(
- // resourceTypeId, operationName, false);
- //String operationDisplayName = definition.getDisplayName();
- textValue.append(operationName).append(' ');
- } catch (Exception e) {
- textValue.append(condition.getName()).append(' ');
- }
- } else if (category == AlertConditionCategory.RESOURCE_CONFIG) {
- textValue.append("Resource Configuration").append(' ');
- } else {
- textValue.append(condition.getName()).append(' ');
- }
-
- // next format the RHS
- if (category == AlertConditionCategory.CONTROL) {
- textValue.append(condition.getOption());
- } else if ((category == AlertConditionCategory.THRESHOLD) || (category == AlertConditionCategory.BASELINE)) {
- textValue.append(condition.getComparator());
- textValue.append(' ');
-
- MeasurementSchedule schedule = null;
-
- MeasurementUnits units;
- double value = condition.getThreshold();
- if (category == AlertConditionCategory.THRESHOLD) {
- units = condition.getMeasurementDefinition().getUnits();
- } else // ( category == AlertConditionCategory.BASELINE )
- {
- units = MeasurementUnits.PERCENTAGE;
- }
-
- String formatted = MeasurementConverterClient.format(value, units, true);
- textValue.append(formatted);
-
- if (category == AlertConditionCategory.BASELINE) {
- textValue.append(" of ");
- textValue.append(getBaselineText(condition.getOption(), schedule));
- }
- } else if (category == AlertConditionCategory.RESOURCE_CONFIG || category == AlertConditionCategory.CHANGE
- || category == AlertConditionCategory.TRAIT) {
- textValue.append("Value Changed");
- } else if (category == AlertConditionCategory.EVENT) {
- String msgKey = "alert.config.props.CB.EventSeverity";
- List<String> args = new ArrayList<String>(2);
-
- args.add(condition.getName());
- if ((condition.getOption() != null) && (condition.getOption().length() > 0)) {
- msgKey += ".RegexMatch";
- args.add(condition.getOption());
- }
- // TODO
- textValue.append("TODO ").append(args);
- } else if (category == AlertConditionCategory.AVAILABILITY) {
- // TODO
- textValue.append("Availability ").append(condition.getOption());
- } else {
- // do nothing
- }
-
- return textValue.toString();
- }
-
- private static String getBaselineText(String baselineOption, MeasurementSchedule schedule) {
- final String BASELINE_OPT_MEAN = "mean";
- final String BASELINE_OPT_MIN = "min";
- final String BASELINE_OPT_MAX = "max";
-
- final String MEASUREMENT_BASELINE_MIN_TEXT = "Min Value";
- final String MEASUREMENT_BASELINE_MEAN_TEXT = "Baseline Value";
- final String MEASUREMENT_BASELINE_MAX_TEXT = "Max Value";
-
- if ((null != schedule) && (null != schedule.getBaseline())) {
- MeasurementBaseline baseline = schedule.getBaseline();
-
- String lookupText = null;
- Double value = null;
-
- if (baselineOption.equals(BASELINE_OPT_MIN)) {
- lookupText = MEASUREMENT_BASELINE_MIN_TEXT;
- value = baseline.getMin();
- } else if (baselineOption.equals(BASELINE_OPT_MEAN)) {
- lookupText = MEASUREMENT_BASELINE_MEAN_TEXT;
- value = baseline.getMean();
- } else if (baselineOption.equals(BASELINE_OPT_MAX)) {
- lookupText = MEASUREMENT_BASELINE_MAX_TEXT;
- value = baseline.getMax();
- }
-
- if (value != null) {
- try {
- String formatted = MeasurementConverterClient.scaleAndFormat(value, schedule, true);
- return formatted + " (" + lookupText + ")";
- } catch (MeasurementConversionException mce) {
- return lookupText;
- }
- }
-
- // will need a fall-through here because the value was null; this can happen when the user requests to view
- // the formatted baseline before the first time it has been calculated
- }
-
- // here is the fall-through
- if (BASELINE_OPT_MIN.equals(baselineOption)) {
- return MEASUREMENT_BASELINE_MIN_TEXT;
- } else if (BASELINE_OPT_MAX.equals(baselineOption)) {
- return MEASUREMENT_BASELINE_MAX_TEXT;
- } else {
- return MEASUREMENT_BASELINE_MEAN_TEXT;
- }
- }
-
- */
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
index 2ee65a3..81ba472 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
@@ -44,7 +44,6 @@ import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
-import com.smartgwt.client.widgets.form.validator.IsFloatValidator;
import org.rhq.core.domain.alert.AlertCondition;
import org.rhq.core.domain.alert.AlertConditionCategory;
@@ -53,11 +52,14 @@ import org.rhq.core.domain.event.EventSeverity;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.MeasurementUnits;
import org.rhq.core.domain.measurement.NumericType;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.operation.OperationRequestStatus;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.components.form.NumberWithUnitsValidator;
+import org.rhq.enterprise.gui.coregui.client.util.measurement.MeasurementParser;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
@@ -286,169 +288,187 @@ public class NewConditionEditor extends LocatableDynamicForm {
private boolean saveNewCondition() {
- // Find out if this is using the ALL conjunction - if it is, we can't have more than one conditional use the same metric.
- // If we do, immediately abort and warn the user. See BZ 737565
- if ((BooleanExpression.ALL.name().equals(this.conditionExpression.getValue().toString()))
- && (supportsMetrics && this.resourceType.getMetricDefinitions() != null)) {
-
- Map<Integer, String> metricIdsUsed = new HashMap<Integer, String>();
- for (AlertCondition condition : this.conditions) {
- if (condition.getMeasurementDefinition() != null) {
- Integer id = Integer.valueOf(condition.getMeasurementDefinition().getId());
- if (metricIdsUsed.containsKey(id)) {
- String msg = MSG.view_alert_definition_condition_editor_metricswarning(metricIdsUsed.get(id));
- Message warning = new Message(msg, Severity.Warning, EnumSet.of(Message.Option.Transient));
- CoreGUI.getMessageCenter().notify(warning);
- return false; // multiple conditions used the same metric with ALL conjunction, this doesn't work - abort (BZ 737565)
+ try {
+ // Find out if this is using the ALL conjunction - if it is, we can't have more than one conditional use the same metric.
+ // If we do, immediately abort and warn the user. See BZ 737565
+ if ((BooleanExpression.ALL.name().equals(this.conditionExpression.getValue().toString()))
+ && (supportsMetrics && this.resourceType.getMetricDefinitions() != null)) {
+
+ Map<Integer, String> metricIdsUsed = new HashMap<Integer, String>();
+ for (AlertCondition condition : this.conditions) {
+ if (condition.getMeasurementDefinition() != null) {
+ Integer id = Integer.valueOf(condition.getMeasurementDefinition().getId());
+ if (metricIdsUsed.containsKey(id)) {
+ String msg = MSG.view_alert_definition_condition_editor_metricswarning(metricIdsUsed
+ .get(id));
+ Message warning = new Message(msg, Severity.Warning, EnumSet.of(Message.Option.Transient));
+ CoreGUI.getMessageCenter().notify(warning);
+ return false; // multiple conditions used the same metric with ALL conjunction, this doesn't work - abort (BZ 737565)
+ }
+ metricIdsUsed.put(id, condition.getMeasurementDefinition().getDisplayName());
}
- metricIdsUsed.put(id, condition.getMeasurementDefinition().getDisplayName());
}
}
- }
- final boolean calltimeCategory;
- final AlertConditionCategory category;
+ final boolean calltimeCategory;
+ final AlertConditionCategory category;
- String selectedCategory = conditionTypeSelectItem.getValue().toString();
- if (selectedCategory.equals(ALERT_CONDITION_CATEGORY_CALLTIME_THRESHOLD)) {
- calltimeCategory = true;
- category = AlertConditionCategory.THRESHOLD;
- } else if (selectedCategory.equals(ALERT_CONDITION_CATEGORY_CALLTIME_CHANGE)) {
- calltimeCategory = true;
- category = AlertConditionCategory.CHANGE;
- } else {
- calltimeCategory = false;
- category = AlertConditionCategory.valueOf(selectedCategory);
- }
+ String selectedCategory = conditionTypeSelectItem.getValue().toString();
+ if (selectedCategory.equals(ALERT_CONDITION_CATEGORY_CALLTIME_THRESHOLD)) {
+ calltimeCategory = true;
+ category = AlertConditionCategory.THRESHOLD;
+ } else if (selectedCategory.equals(ALERT_CONDITION_CATEGORY_CALLTIME_CHANGE)) {
+ calltimeCategory = true;
+ category = AlertConditionCategory.CHANGE;
+ } else {
+ calltimeCategory = false;
+ category = AlertConditionCategory.valueOf(selectedCategory);
+ }
- AlertCondition newCondition = new AlertCondition();
- newCondition.setCategory(category);
-
- switch (category) {
- case AVAILABILITY: {
- newCondition.setName(null);
- newCondition.setComparator(null);
- newCondition.setThreshold(null);
- newCondition.setOption(getValueAsString(AVAILABILITY_ITEMNAME));
- newCondition.setMeasurementDefinition(null);
- break;
- }
+ AlertCondition newCondition = new AlertCondition();
+ newCondition.setCategory(category);
- case THRESHOLD: {
- if (!calltimeCategory) {
- MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(THRESHOLD_METRIC_ITEMNAME));
+ switch (category) {
+ case AVAILABILITY: {
+ newCondition.setName(null);
+ newCondition.setComparator(null);
+ newCondition.setThreshold(null);
+ newCondition.setOption(getValueAsString(AVAILABILITY_ITEMNAME));
+ newCondition.setMeasurementDefinition(null);
+ break;
+ }
+
+ case THRESHOLD: {
+ if (!calltimeCategory) {
+ MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(THRESHOLD_METRIC_ITEMNAME));
+ newCondition.setName(measDef.getDisplayName());
+ newCondition.setThreshold(getMeasurementValue(measDef,
+ getValueAsString(THRESHOLD_ABSVALUE_ITEMNAME)));
+ newCondition.setComparator(getValueAsString(THRESHOLD_COMPARATOR_ITEMNAME));
+ newCondition.setOption(null);
+ newCondition.setMeasurementDefinition(measDef);
+ } else {
+ MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(CALLTIME_THRESHOLD_METRIC_ITEMNAME));
+ newCondition.setName(getValueAsString(CALLTIME_THRESHOLD_REGEX_ITEMNAME));
+ newCondition.setThreshold(getMeasurementValue(measDef,
+ getValueAsString(CALLTIME_THRESHOLD_ABSVALUE_ITEMNAME)));
+ newCondition.setComparator(getValueAsString(CALLTIME_THRESHOLD_COMPARATOR_ITEMNAME));
+ newCondition.setOption(getValueAsString(CALLTIME_THRESHOLD_MINMAXAVG_ITEMNAME));
+ newCondition.setMeasurementDefinition(measDef);
+ }
+ break;
+ }
+
+ case BASELINE: {
+ MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(BASELINE_METRIC_ITEMNAME));
newCondition.setName(measDef.getDisplayName());
- newCondition.setThreshold(Double.valueOf(getValueAsString(THRESHOLD_ABSVALUE_ITEMNAME)));
- newCondition.setComparator(getValueAsString(THRESHOLD_COMPARATOR_ITEMNAME));
- newCondition.setOption(null);
- newCondition.setMeasurementDefinition(measDef);
- } else {
- MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(CALLTIME_THRESHOLD_METRIC_ITEMNAME));
- newCondition.setName(getValueAsString(CALLTIME_THRESHOLD_REGEX_ITEMNAME));
- newCondition.setThreshold(Double.valueOf(getValueAsString(CALLTIME_THRESHOLD_ABSVALUE_ITEMNAME)));
- newCondition.setComparator(getValueAsString(CALLTIME_THRESHOLD_COMPARATOR_ITEMNAME));
- newCondition.setOption(getValueAsString(CALLTIME_THRESHOLD_MINMAXAVG_ITEMNAME));
+ newCondition.setThreshold(getMeasurementValueByUnits(MeasurementUnits.PERCENTAGE,
+ getValueAsString(BASELINE_PERCENTAGE_ITEMNAME)));
+ newCondition.setComparator(getValueAsString(BASELINE_COMPARATOR_ITEMNAME));
+ newCondition.setOption(getValueAsString(BASELINE_SELECTION_ITEMNAME));
newCondition.setMeasurementDefinition(measDef);
+ break;
}
- break;
- }
- case BASELINE: {
- MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(BASELINE_METRIC_ITEMNAME));
- newCondition.setName(measDef.getDisplayName());
- newCondition.setThreshold(Double.valueOf(getValueAsString(BASELINE_PERCENTAGE_ITEMNAME)) / 100.0);
- newCondition.setComparator(getValueAsString(BASELINE_COMPARATOR_ITEMNAME));
- newCondition.setOption(getValueAsString(BASELINE_SELECTION_ITEMNAME));
- newCondition.setMeasurementDefinition(measDef);
- break;
- }
+ case CHANGE: {
+ if (!calltimeCategory) {
+ MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(CHANGE_METRIC_ITEMNAME));
+ newCondition.setName(measDef.getDisplayName());
+ newCondition.setComparator(null);
+ newCondition.setThreshold(null);
+ newCondition.setOption(null);
+ newCondition.setMeasurementDefinition(measDef);
+ } else {
+ MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(CALLTIME_CHANGE_METRIC_ITEMNAME));
+ newCondition.setName(getValueAsString(CALLTIME_CHANGE_REGEX_ITEMNAME));
+ newCondition.setThreshold(getMeasurementValueByUnits(MeasurementUnits.PERCENTAGE,
+ getValueAsString(CALLTIME_CHANGE_PERCENTAGE_ITEMNAME)));
+ newCondition.setComparator(getValueAsString(CALLTIME_CHANGE_COMPARATOR_ITEMNAME));
+ newCondition.setOption(getValueAsString(CALLTIME_CHANGE_MINMAXAVG_ITEMNAME));
+ newCondition.setMeasurementDefinition(measDef);
+ }
+ break;
+ }
- case CHANGE: {
- if (!calltimeCategory) {
- MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(CHANGE_METRIC_ITEMNAME));
+ case TRAIT: {
+ MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(TRAIT_METRIC_ITEMNAME));
newCondition.setName(measDef.getDisplayName());
newCondition.setComparator(null);
newCondition.setThreshold(null);
newCondition.setOption(null);
newCondition.setMeasurementDefinition(measDef);
- } else {
- MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(CALLTIME_CHANGE_METRIC_ITEMNAME));
- newCondition.setName(getValueAsString(CALLTIME_CHANGE_REGEX_ITEMNAME));
- newCondition
- .setThreshold(Double.valueOf(getValueAsString(CALLTIME_CHANGE_PERCENTAGE_ITEMNAME)) / 100.0);
- newCondition.setComparator(getValueAsString(CALLTIME_CHANGE_COMPARATOR_ITEMNAME));
- newCondition.setOption(getValueAsString(CALLTIME_CHANGE_MINMAXAVG_ITEMNAME));
- newCondition.setMeasurementDefinition(measDef);
+ break;
}
- break;
- }
- case TRAIT: {
- MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(TRAIT_METRIC_ITEMNAME));
- newCondition.setName(measDef.getDisplayName());
- newCondition.setComparator(null);
- newCondition.setThreshold(null);
- newCondition.setOption(null);
- newCondition.setMeasurementDefinition(measDef);
- break;
- }
+ case CONTROL: {
+ newCondition.setName(getValueAsString(OPERATION_NAME_ITEMNAME));
+ newCondition.setComparator(null);
+ newCondition.setThreshold(null);
+ newCondition.setOption(getValueAsString(OPERATION_RESULTS_ITEMNAME));
+ newCondition.setMeasurementDefinition(null);
+ break;
+ }
- case CONTROL: {
- newCondition.setName(getValueAsString(OPERATION_NAME_ITEMNAME));
- newCondition.setComparator(null);
- newCondition.setThreshold(null);
- newCondition.setOption(getValueAsString(OPERATION_RESULTS_ITEMNAME));
- newCondition.setMeasurementDefinition(null);
- break;
- }
+ case EVENT: {
+ newCondition.setName(getValueAsString(EVENT_SEVERITY_ITEMNAME));
+ newCondition.setComparator(null);
+ newCondition.setThreshold(null);
+ newCondition.setOption(getValueAsString(EVENT_REGEX_ITEMNAME));
+ newCondition.setMeasurementDefinition(null);
+ break;
+ }
- case EVENT: {
- newCondition.setName(getValueAsString(EVENT_SEVERITY_ITEMNAME));
- newCondition.setComparator(null);
- newCondition.setThreshold(null);
- newCondition.setOption(getValueAsString(EVENT_REGEX_ITEMNAME));
- newCondition.setMeasurementDefinition(null);
- break;
- }
+ case RESOURCE_CONFIG: {
+ newCondition.setName(null);
+ newCondition.setComparator(null);
+ newCondition.setThreshold(null);
+ newCondition.setOption(null);
+ newCondition.setMeasurementDefinition(null);
+ break;
+ }
- case RESOURCE_CONFIG: {
- newCondition.setName(null);
- newCondition.setComparator(null);
- newCondition.setThreshold(null);
- newCondition.setOption(null);
- newCondition.setMeasurementDefinition(null);
- break;
- }
+ case DRIFT: {
+ newCondition.setName(getValueAsString(DRIFT_CONFIGNAME_REGEX_ITEMNAME));
+ newCondition.setComparator(null);
+ newCondition.setThreshold(null);
+ newCondition.setOption(getValueAsString(DRIFT_PATHNAME_REGEX_ITEMNAME));
+ newCondition.setMeasurementDefinition(null);
+ break;
+ }
- case DRIFT: {
- newCondition.setName(getValueAsString(DRIFT_CONFIGNAME_REGEX_ITEMNAME));
- newCondition.setComparator(null);
- newCondition.setThreshold(null);
- newCondition.setOption(getValueAsString(DRIFT_PATHNAME_REGEX_ITEMNAME));
- newCondition.setMeasurementDefinition(null);
- break;
- }
+ case RANGE: {
+ MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(RANGE_METRIC_ITEMNAME));
+ newCondition.setName(measDef.getDisplayName());
+ newCondition.setThreshold(getMeasurementValue(measDef, getValueAsString(RANGE_LO_ABSVALUE_ITEMNAME)));
+ newCondition.setComparator(getValueAsString(RANGE_COMPARATOR_ITEMNAME));
+ newCondition.setOption(getMeasurementValue(measDef, getValueAsString(RANGE_HI_ABSVALUE_ITEMNAME))
+ .toString());
+ newCondition.setMeasurementDefinition(measDef);
+ break;
+ }
- case RANGE: {
- MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(RANGE_METRIC_ITEMNAME));
- newCondition.setName(measDef.getDisplayName());
- newCondition.setThreshold(Double.valueOf(getValueAsString(RANGE_LO_ABSVALUE_ITEMNAME)));
- newCondition.setComparator(getValueAsString(RANGE_COMPARATOR_ITEMNAME));
- newCondition.setOption(Double.valueOf(getValueAsString(RANGE_HI_ABSVALUE_ITEMNAME)).toString());
- newCondition.setMeasurementDefinition(measDef);
- break;
- }
+ default: {
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_alert_common_tab_invalid_condition_category(category.name())); // should never happen
+ break;
+ }
+ }
- default: {
- CoreGUI.getErrorHandler()
- .handleError(MSG.view_alert_common_tab_invalid_condition_category(category.name())); // should never happen
- break;
- }
+ this.conditions.add(newCondition);
+
+ return true;
+ } catch (Exception e) {
+ CoreGUI.getErrorHandler().handleError("Problem creating condition", e);
+ return false;
}
+ }
- this.conditions.add(newCondition);
+ private Double getMeasurementValue(MeasurementDefinition measDef, String userEnteredValue) {
+ return getMeasurementValueByUnits(measDef.getUnits(), userEnteredValue);
+ }
- return true;
+ private Double getMeasurementValueByUnits(MeasurementUnits units, String userEnteredValue) {
+ return MeasurementParser.parse(userEnteredValue, units).getValue();
}
private ArrayList<FormItem> buildMetricThresholdFormItems() {
@@ -471,7 +491,8 @@ public class NewConditionEditor extends LocatableDynamicForm {
absoluteValue.setTooltip(MSG.view_alert_definition_condition_editor_metric_threshold_value_tooltip());
absoluteValue.setHoverWidth(200);
absoluteValue.setValidateOnChange(true);
- absoluteValue.setValidators(new IsFloatValidator());
+ absoluteValue.setValidators(new NumberWithUnitsValidator(this.resourceType.getMetricDefinitions(),
+ metricDropDownMenu));
absoluteValue.setShowIfCondition(ifFunc);
formItems.add(absoluteValue);
} else {
@@ -503,7 +524,8 @@ public class NewConditionEditor extends LocatableDynamicForm {
absoluteLowValue.setTooltip(MSG.view_alert_definition_condition_editor_metric_range_lovalue_tooltip());
absoluteLowValue.setHoverWidth(200);
absoluteLowValue.setValidateOnChange(true);
- absoluteLowValue.setValidators(new IsFloatValidator());
+ absoluteLowValue.setValidators(new NumberWithUnitsValidator(this.resourceType.getMetricDefinitions(),
+ metricDropDownMenu));
absoluteLowValue.setShowIfCondition(ifFunc);
formItems.add(absoluteLowValue);
@@ -514,7 +536,8 @@ public class NewConditionEditor extends LocatableDynamicForm {
absoluteHighValue.setTooltip(MSG.view_alert_definition_condition_editor_metric_range_hivalue_tooltip());
absoluteHighValue.setHoverWidth(200);
absoluteHighValue.setValidateOnChange(true);
- absoluteHighValue.setValidators(new IsFloatValidator());
+ absoluteHighValue.setValidators(new NumberWithUnitsValidator(this.resourceType.getMetricDefinitions(),
+ metricDropDownMenu));
absoluteHighValue.setShowIfCondition(ifFunc);
formItems.add(absoluteHighValue);
} else {
@@ -550,7 +573,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
baselinePercentage.setHoverWidth(200);
baselinePercentage.setShowIfCondition(ifFunc);
baselinePercentage.setValidateOnChange(true);
- baselinePercentage.setValidators(new IsFloatValidator());
+ baselinePercentage.setValidators(new NumberWithUnitsValidator(MeasurementUnits.PERCENTAGE));
formItems.add(baselinePercentage);
SelectItem baselineSelection = new SelectItem(BASELINE_SELECTION_ITEMNAME, MSG
@@ -605,7 +628,8 @@ public class NewConditionEditor extends LocatableDynamicForm {
StaticTextItem helpItem = buildHelpTextItem("calltimeThresholdHelp", helpStr, ifFunc);
formItems.add(helpItem);
- formItems.add(buildCalltimeMetricDropDownMenu(CALLTIME_THRESHOLD_METRIC_ITEMNAME, ifFunc));
+ SelectItem metricDropDownMenu = buildCalltimeMetricDropDownMenu(CALLTIME_THRESHOLD_METRIC_ITEMNAME, ifFunc);
+ formItems.add(metricDropDownMenu);
SelectItem minMaxAvgSelection = new SelectItem(CALLTIME_THRESHOLD_MINMAXAVG_ITEMNAME, MSG
.view_alert_definition_condition_editor_metric_calltime_common_limit());
@@ -633,7 +657,8 @@ public class NewConditionEditor extends LocatableDynamicForm {
absoluteValue.setHoverWidth(200);
absoluteValue.setShowIfCondition(ifFunc);
absoluteValue.setValidateOnChange(true);
- absoluteValue.setValidators(new IsFloatValidator());
+ absoluteValue.setValidators(new NumberWithUnitsValidator(this.resourceType.getMetricDefinitions(),
+ metricDropDownMenu));
formItems.add(absoluteValue);
TextItem regex = new TextItem(CALLTIME_THRESHOLD_REGEX_ITEMNAME, MSG
@@ -686,7 +711,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
percentage.setHoverWidth(200);
percentage.setShowIfCondition(ifFunc);
percentage.setValidateOnChange(true);
- percentage.setValidators(new IsFloatValidator());
+ percentage.setValidators(new NumberWithUnitsValidator(MeasurementUnits.PERCENTAGE));
formItems.add(percentage);
TextItem regex = new TextItem(CALLTIME_CHANGE_REGEX_ITEMNAME, MSG
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/NumberWithUnitsValidator.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/NumberWithUnitsValidator.java
new file mode 100644
index 0000000..37e5589
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/NumberWithUnitsValidator.java
@@ -0,0 +1,112 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.gui.coregui.client.components.form;
+
+import java.util.Set;
+
+import com.smartgwt.client.widgets.form.fields.SelectItem;
+import com.smartgwt.client.widgets.form.validator.CustomValidator;
+
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.MeasurementUnits;
+import org.rhq.enterprise.gui.coregui.client.util.measurement.MeasurementParser;
+
+/**
+ * Validates user entered numbers with units. This validator can be given
+ * the units directly or it can derive the units based on a selection component
+ * whose keys are measurement definition IDs - the measurement definitions must be
+ * given so the ID can be looked up.
+ *
+ * @author John Mazzitelli
+ */
+public class NumberWithUnitsValidator extends CustomValidator {
+
+ private final MeasurementUnits units;
+ private final Set<MeasurementDefinition> metricDefs;
+ private final SelectItem metricDropDownMenu;
+
+ public NumberWithUnitsValidator(Set<MeasurementDefinition> metricDefs, SelectItem metricDropDownMenu) {
+ if (metricDefs == null) {
+ throw new NullPointerException("metricDefs == null");
+ }
+ if (metricDropDownMenu == null) {
+ throw new NullPointerException("metricDropDownMenu == null");
+ }
+ this.metricDefs = metricDefs;
+ this.metricDropDownMenu = metricDropDownMenu;
+ this.units = null;
+ }
+
+ public NumberWithUnitsValidator(MeasurementUnits units) {
+ if (units == null) {
+ throw new NullPointerException("units == null");
+ }
+ this.metricDefs = null;
+ this.metricDropDownMenu = null;
+ this.units = units;
+ }
+
+ @Override
+ protected boolean condition(Object value) {
+ // don't know if this is the right thing to do, but assume the value was optional.
+ // if there is no value or its empty, assume that is OK and will be considered a 0
+ if (value == null || value.toString().trim().length() == 0) {
+ return true;
+ }
+
+ MeasurementUnits unitsToUse = this.units;
+
+ if (unitsToUse == null) {
+ // units weren't directly given to us, find it from the selected metric definition
+ try {
+ String idString = metricDropDownMenu.getValueAsString();
+ Integer id = Integer.parseInt(idString);
+ for (MeasurementDefinition metricDef : this.metricDefs) {
+ if (metricDef.getId() == id.intValue()) {
+ unitsToUse = metricDef.getUnits();
+ break;
+ }
+ }
+ } catch (Exception e) {
+ unitsToUse = null;
+ }
+ }
+
+ if (unitsToUse != null) {
+ try {
+ if (MeasurementParser.parse(value.toString(), unitsToUse) != null) {
+ return true;
+ } else {
+ return false;
+ }
+ } catch (Exception e) {
+ return false;
+ }
+ } else {
+ // no units? just see if its a valid floating point number
+ try {
+ Double.parseDouble(value.toString());
+ return true;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestNumberFormatView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestNumberFormatView.java
new file mode 100644
index 0000000..30b11d4
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestNumberFormatView.java
@@ -0,0 +1,78 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.gui.coregui.client.test;
+
+import java.util.EnumSet;
+import java.util.LinkedHashMap;
+
+import com.smartgwt.client.widgets.form.fields.ButtonItem;
+import com.smartgwt.client.widgets.form.fields.SelectItem;
+import com.smartgwt.client.widgets.form.fields.StaticTextItem;
+import com.smartgwt.client.widgets.form.fields.TextItem;
+import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
+import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
+
+import org.rhq.core.domain.measurement.MeasurementUnits;
+import org.rhq.core.domain.measurement.composite.MeasurementNumericValueAndUnits;
+import org.rhq.enterprise.gui.coregui.client.util.measurement.MeasurementParser;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+
+public class TestNumberFormatView extends LocatableVLayout {
+
+ public TestNumberFormatView(String locatorId) {
+ super(locatorId);
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+
+ LinkedHashMap<String, String> unitsChoices = new LinkedHashMap<String, String>();
+ for (MeasurementUnits unit : EnumSet.allOf(MeasurementUnits.class)) {
+ unitsChoices.put(unit.name(), unit.name());
+ }
+
+ final SelectItem unitsMenu = new SelectItem("unitsItem", "Units");
+ unitsMenu.setValueMap(unitsChoices);
+ unitsMenu.setDefaultValue(MeasurementUnits.BYTES.name());
+
+ final TextItem textItem = new TextItem("valueItem", "Value");
+
+ final StaticTextItem resultsValueItem = new StaticTextItem("resultsValue", "Results Value");
+ final StaticTextItem resultsUnitItem = new StaticTextItem("resultsUnits", "Results Units");
+
+ ButtonItem button = new ButtonItem("convertItem", "Convert");
+ button.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent event) {
+ MeasurementUnits units = MeasurementUnits.valueOf(unitsMenu.getValueAsString());
+ String value = textItem.getValueAsString();
+ MeasurementNumericValueAndUnits vu = MeasurementParser.parse(value, units);
+ resultsValueItem.setValue(vu.getValue().toString());
+ resultsUnitItem.setValue(vu.getUnits().name());
+ }
+ });
+
+ LocatableDynamicForm form = new LocatableDynamicForm(extendLocatorId("form"));
+ form.setItems(unitsMenu, textItem, button, resultsValueItem, resultsUnitItem);
+
+ addMember(form);
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestTopView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestTopView.java
index a9e131b..94bdd1e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestTopView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestTopView.java
@@ -78,6 +78,7 @@ public class TestTopView extends AbstractSectionedLeftNavigationView {
// view IDs for Misc section
private static final ViewName MISC_SECTION_VIEW_ID = new ViewName("Misc");
private static final ViewName PAGE_PLURALIZATION_TEST = new ViewName("PluralizationTest");
+ private static final ViewName PAGE_NUMBER_FORMAT_TEST = new ViewName("NumberFormatTest");
private static final ViewName PAGE_ASYNC = new ViewName("Async");
private static final ViewName PAGE_RPC = new ViewName("Rpc");
@@ -224,6 +225,12 @@ public class TestTopView extends AbstractSectionedLeftNavigationView {
}
private NavigationSection buildMiscSection() {
+ NavigationItem numberFormatItem = new NavigationItem(PAGE_NUMBER_FORMAT_TEST, null, new ViewFactory() {
+ public Canvas createView() {
+ return new TestNumberFormatView(extendLocatorId(PAGE_NUMBER_FORMAT_TEST.getName()));
+ }
+ });
+
NavigationItem pluralizationItem = new NavigationItem(PAGE_PLURALIZATION_TEST, null, new ViewFactory() {
public Canvas createView() {
return new TestPluralizationView(extendLocatorId(PAGE_PLURALIZATION_TEST.getName()));
@@ -242,7 +249,7 @@ public class TestTopView extends AbstractSectionedLeftNavigationView {
}
});
- return new NavigationSection(MISC_SECTION_VIEW_ID, pluralizationItem, asyncItem, rpcItem);
+ return new NavigationSection(MISC_SECTION_VIEW_ID, numberFormatItem, pluralizationItem, asyncItem, rpcItem);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/measurement/MeasurementParser.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/measurement/MeasurementParser.java
new file mode 100644
index 0000000..8ce0777
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/measurement/MeasurementParser.java
@@ -0,0 +1,121 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.util.measurement;
+
+import com.google.gwt.i18n.client.NumberFormat;
+
+import org.rhq.core.domain.measurement.MeasurementUnits;
+import org.rhq.core.domain.measurement.composite.MeasurementNumericValueAndUnits;
+import org.rhq.core.domain.measurement.util.MeasurementConversionException;
+import org.rhq.enterprise.gui.coregui.client.util.MeasurementConverterClient;
+
+/**
+ * Parses measurement strings given in the typical form of "[sign] magnitude [units]" such as:
+ *
+ * -1.0
+ * +1.0s
+ * 200MB
+ *
+ * This is purposefully written without java.text and java.util.regex classes so GWT 2.0
+ * can use this class.
+ *
+ * @author Greg Hinkle
+ * @author John Mazzitelli
+ */
+public class MeasurementParser {
+
+ public static MeasurementNumericValueAndUnits parse(String input, MeasurementUnits targetUnits)
+ throws MeasurementConversionException {
+
+ if (input == null) {
+ return new MeasurementNumericValueAndUnits(Double.valueOf(0.0), targetUnits);
+ }
+
+ input = input.trim();
+
+ if (input.length() == 0) {
+ return new MeasurementNumericValueAndUnits(Double.valueOf(0.0), targetUnits);
+ }
+
+ int i = 0;
+
+ // skip over the sign, we'll deal with that later
+ if (input.startsWith("+") || input.startsWith("-")) {
+ i = 1;
+ }
+
+ // find the end of the magnitude (i.e. the number itself)
+ // note we allow for decimals - and we allow for either "." or "," as the decimal point for i18n purposes
+ for (; i < input.length(); i++) {
+ char ch = input.charAt(i);
+ if (!(Character.isDigit(ch) || ch == '.' || ch == ',')) {
+ break;
+ }
+ }
+
+ String magnitude = input.substring(0, i);
+ String units = "";
+
+ if (i <= input.length()) {
+ // gobble everything after the magnitude and consider it the units
+ units = input.substring(i);
+ units = units.trim();
+ }
+
+ MeasurementUnits fromUnits;
+ if (units.equals("")) {
+ /*
+ * no units is valid, and we assume the passed targetUnits; however, we will
+ * still need to check that the number is well-formed, so continue processing.
+ */
+ fromUnits = targetUnits;
+ } else {
+ fromUnits = MeasurementUnits.getUsingDisplayUnits(units, targetUnits.getFamily());
+
+ if ((fromUnits == null) || (!fromUnits.isComparableTo(targetUnits))) {
+ throw new MeasurementConversionException("The units in '" + input + "' were not valid, " + "expected '"
+ + targetUnits.getFamily() + "' units, received '" + units + "' units");
+ }
+ }
+
+ try {
+ if (magnitude.startsWith("+")) {
+ magnitude = magnitude.substring(1);
+ }
+
+ Number convertedMagnitude = NumberFormat.getDecimalFormat().parse(magnitude);
+ Double scaledMagnitude;
+
+ // apply relative scale if applicable, otherwise perform standard scaling
+ if (MeasurementUnits.Family.RELATIVE == targetUnits.getFamily()) {
+ scaledMagnitude = MeasurementUnits.scaleDown(convertedMagnitude.doubleValue(), targetUnits);
+ } else {
+ MeasurementNumericValueAndUnits valueAndUnits = new MeasurementNumericValueAndUnits(convertedMagnitude
+ .doubleValue(), fromUnits);
+ scaledMagnitude = MeasurementConverterClient.scale(valueAndUnits, targetUnits);
+ }
+
+ return new MeasurementNumericValueAndUnits(scaledMagnitude, targetUnits);
+ } catch (Exception e) {
+ throw new MeasurementConversionException("The magnitude in '" + input + "' did not parse correctly "
+ + "as a valid, localized, stringified number ");
+ }
+
+ }
+}
commit 99a931748c2a9017880fb8b82cf19102743ae11a
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 15 01:09:17 2011 -0400
trivial - clean up imports, add TODO to mark a possible duplicate class
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/MeasurementConverterClient.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/MeasurementConverterClient.java
index c538e2b..5842729 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/MeasurementConverterClient.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/MeasurementConverterClient.java
@@ -29,7 +29,6 @@ import com.google.gwt.i18n.client.NumberFormat;
import org.rhq.core.domain.measurement.MeasurementSchedule;
import org.rhq.core.domain.measurement.MeasurementUnits;
-import org.rhq.core.domain.measurement.MeasurementUnits.Family;
import org.rhq.core.domain.measurement.composite.MeasurementNumericValueAndUnits;
import org.rhq.core.domain.measurement.util.MeasurementConversionException;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/measurement/GwtMeasurementConverter.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/measurement/GwtMeasurementConverter.java
index a8577e3..6833d07 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/measurement/GwtMeasurementConverter.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/measurement/GwtMeasurementConverter.java
@@ -5,7 +5,6 @@ import java.util.HashSet;
import java.util.Set;
import com.google.gwt.i18n.client.NumberFormat;
-import com.google.gwt.i18n.client.TimeZone;
import org.rhq.core.domain.measurement.MeasurementSchedule;
import org.rhq.core.domain.measurement.MeasurementUnits;
@@ -17,10 +16,9 @@ import org.rhq.core.domain.measurement.util.MeasurementConversionException;
*
* @author Simeon Pinder
*/
+// TODO: what is different here vs. MeasurementConverterClient? we should combine the two
public class GwtMeasurementConverter {
- public static TimeZone tz = null;
-
private static final int MAX_PRECISION_DIGITS = 4;
private static final String NULL_OR_NAN_FORMATTED_VALUE = "--no data available--";
commit de2e667b239e40f261e9de116c5149889f217e64
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Wed Sep 14 21:26:23 2011 -0500
More wildcard updates propagated upwards from the agent api.
diff --git a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java
index ec0dee8..03dcec0 100644
--- a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java
+++ b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationComponent.java
@@ -24,7 +24,6 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
-import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;
@@ -68,7 +67,7 @@ import org.rhq.plugins.augeas.helper.AugeasNode;
* @author Ian Springer
* @author Lukas Krejci
*/
-public class AugeasConfigurationComponent<T extends ResourceComponent> implements ResourceComponent<T>,
+public class AugeasConfigurationComponent<T extends ResourceComponent<?>> implements ResourceComponent<T>,
ConfigurationFacet, CreateChildResourceFacet, DeleteResourceFacet {
/* Plugin config prop names */
public static final String INCLUDE_GLOBS_PROP = "configurationFilesInclusionPatterns";
@@ -78,7 +77,7 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
public static final String AUGEAS_ROOT_PATH_PROP = "augeasRootPath";
private static final boolean IS_WINDOWS = (File.separatorChar == '\\');
- public static final String DEFAULT_AUGEAS_ROOT_PATH = (IS_WINDOWS) ? "C:/" : "/";
+ public static final String DEFAULT_AUGEAS_ROOT_PATH = (IS_WINDOWS) ? "C:/" : "/";
private final Log log = LogFactory.getLog(this.getClass());
@@ -90,7 +89,7 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
private AugeasNode resourceConfigRootNode;
private String augeasRootPath;
private String augeasLoadPath;
-
+
protected String getAugeasRootPath() {
return augeasRootPath;
}
@@ -102,7 +101,7 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
protected String getAugeasLoadPath() {
return augeasLoadPath;
}
-
+
public void start(ResourceContext<T> resourceContext) throws InvalidPluginConfigurationException, Exception {
this.resourceContext = resourceContext;
this.resourceDescription = this.resourceContext.getResourceType() + " Resource with key ["
@@ -112,9 +111,10 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
Configuration pluginConfig = this.resourceContext.getPluginConfiguration();
this.augeasRootPath = pluginConfig.getSimpleValue(AUGEAS_ROOT_PATH_PROP, DEFAULT_AUGEAS_ROOT_PATH);
log.debug("Augeas Root Path = \"" + this.augeasRootPath + "\"");
-
- augeasLoadPath = resourceContext.getDataDirectory().getAbsolutePath() + File.separator + AugeasPluginLifecycleListener.LENSES_SUBDIRECTORY_NAME;
-
+
+ augeasLoadPath = resourceContext.getDataDirectory().getAbsolutePath() + File.separator
+ + AugeasPluginLifecycleListener.LENSES_SUBDIRECTORY_NAME;
+
if (isAugeasAvailable()) {
initAugeas();
} else {
@@ -755,16 +755,16 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
}
}
}
-
+
private void checkModuleErrors(Augeas augeas) {
List<String> errors = augeas.match("/augeas/load//error");
if (errors != null && errors.size() > 0) {
StringBuilder errorMessage = new StringBuilder();
- for(String nodePath : errors) {
+ for (String nodePath : errors) {
AugeasNode node = new AugeasNode(nodePath);
String moduleName = node.getParent().getName();
String errorText = augeas.get(nodePath);
-
+
errorMessage.append("Module '").append(moduleName).append("' failed with the following errors:\n");
errorMessage.append(errorText);
errorMessage.append("\n\n");
@@ -772,7 +772,7 @@ public class AugeasConfigurationComponent<T extends ResourceComponent> implement
throw new IllegalStateException("Augeas modules didn't load cleanly.\n" + errorMessage);
}
}
-
+
/* (non-Javadoc)
* @see java.lang.Object#finalize()
*/
diff --git a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationDiscoveryComponent.java b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationDiscoveryComponent.java
index 292e6df..5bc1d1d 100644
--- a/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationDiscoveryComponent.java
+++ b/modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/AugeasConfigurationDiscoveryComponent.java
@@ -28,6 +28,7 @@ import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.rhq.augeas.util.Glob;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.resource.ResourceType;
@@ -37,13 +38,12 @@ import org.rhq.core.pluginapi.inventory.ManualAddFacet;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
-import org.rhq.augeas.util.Glob;
/**
* @author Ian Springer
* @author Lukas Krejci
*/
-public class AugeasConfigurationDiscoveryComponent<T extends ResourceComponent> implements
+public class AugeasConfigurationDiscoveryComponent<T extends ResourceComponent<?>> implements
ResourceDiscoveryComponent<T>, ManualAddFacet<T> {
private final Log log = LogFactory.getLog(this.getClass());
@@ -87,8 +87,8 @@ public class AugeasConfigurationDiscoveryComponent<T extends ResourceComponent>
Configuration pluginConfig) {
ResourceType resourceType = discoveryContext.getResourceType();
String resourceKey = composeResourceKey(pluginConfig);
- DiscoveredResourceDetails resource = new DiscoveredResourceDetails(resourceType, resourceKey, resourceType
- .getName(), null, resourceType.getDescription(), pluginConfig, null);
+ DiscoveredResourceDetails resource = new DiscoveredResourceDetails(resourceType, resourceKey,
+ resourceType.getName(), null, resourceType.getDescription(), pluginConfig, null);
return resource;
}
@@ -122,7 +122,7 @@ public class AugeasConfigurationDiscoveryComponent<T extends ResourceComponent>
.getSimple(AugeasConfigurationComponent.EXCLUDE_GLOBS_PROP);
String augeasRootPath = pluginConfiguration.getSimpleValue(AugeasConfigurationComponent.AUGEAS_ROOT_PATH_PROP,
- AugeasConfigurationComponent.DEFAULT_AUGEAS_ROOT_PATH);
+ AugeasConfigurationComponent.DEFAULT_AUGEAS_ROOT_PATH);
File root = new File(augeasRootPath);
List<String> includeGlobs = getGlobList(includeGlobsProp);
diff --git a/modules/plugins/database/src/main/java/org/rhq/plugins/database/AbstractDatabaseComponent.java b/modules/plugins/database/src/main/java/org/rhq/plugins/database/AbstractDatabaseComponent.java
index 498270a..1170668 100644
--- a/modules/plugins/database/src/main/java/org/rhq/plugins/database/AbstractDatabaseComponent.java
+++ b/modules/plugins/database/src/main/java/org/rhq/plugins/database/AbstractDatabaseComponent.java
@@ -19,13 +19,14 @@
package org.rhq.plugins.database;
import java.sql.Connection;
+
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceContext;
/**
* @author Greg Hinkle
*/
-public abstract class AbstractDatabaseComponent<T extends DatabaseComponent> implements DatabaseComponent {
+public abstract class AbstractDatabaseComponent<T extends DatabaseComponent<?>> implements DatabaseComponent {
protected ResourceContext<T> resourceContext;
public void start(ResourceContext resourceContext) throws InvalidPluginConfigurationException, Exception {
diff --git a/modules/plugins/database/src/main/java/org/rhq/plugins/database/CustomTableComponent.java b/modules/plugins/database/src/main/java/org/rhq/plugins/database/CustomTableComponent.java
index f8ddcd8..d8906f7 100644
--- a/modules/plugins/database/src/main/java/org/rhq/plugins/database/CustomTableComponent.java
+++ b/modules/plugins/database/src/main/java/org/rhq/plugins/database/CustomTableComponent.java
@@ -26,6 +26,7 @@ import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.MeasurementReport;
@@ -41,13 +42,13 @@ import org.rhq.core.util.jdbc.JDBCUtil;
*
* @author Greg Hinkle
*/
-public class CustomTableComponent implements DatabaseComponent<DatabaseComponent>, MeasurementFacet {
- private ResourceContext<DatabaseComponent> context;
+public class CustomTableComponent implements DatabaseComponent<DatabaseComponent<?>>, MeasurementFacet {
+ private ResourceContext<DatabaseComponent<?>> context;
private static final Log log = LogFactory.getLog(CustomTableComponent.class);
-
- public void start(ResourceContext<DatabaseComponent> resourceContext) throws InvalidPluginConfigurationException,
- Exception {
+
+ public void start(ResourceContext<DatabaseComponent<?>> resourceContext)
+ throws InvalidPluginConfigurationException, Exception {
this.context = resourceContext;
}
@@ -73,16 +74,22 @@ public class CustomTableComponent implements DatabaseComponent<DatabaseComponent
public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception {
String query = this.context.getPluginConfiguration().getSimpleValue("metricQuery", null);
-
+
if (query == null) {
ResourceType type = this.context.getResourceType();
String resourceKey = this.context.getResourceKey();
- log.info("Resource " + resourceKey + " (" + type.getName() + ", plugin " + type.getPlugin()
+ log.info("Resource "
+ + resourceKey
+ + " ("
+ + type.getName()
+ + ", plugin "
+ + type.getPlugin()
+ "): The plugin configuration doesn't specify 'metricQuery' property. Ignoring the measurement request.");
return;
}
-
- query = CustomTableRowDiscoveryComponent.formatMessage(query, this.context.getPluginConfiguration().getSimpleValue("key",null));
+
+ query = CustomTableRowDiscoveryComponent.formatMessage(query, this.context.getPluginConfiguration()
+ .getSimpleValue("key", null));
Map<String, Double> values = DatabaseQueryUtility.getNumericQueryValues(this, query);
for (MeasurementScheduleRequest request : metrics) {
diff --git a/modules/plugins/database/src/main/java/org/rhq/plugins/database/CustomTableDiscoveryComponent.java b/modules/plugins/database/src/main/java/org/rhq/plugins/database/CustomTableDiscoveryComponent.java
index 633c28c..f25a8b1 100644
--- a/modules/plugins/database/src/main/java/org/rhq/plugins/database/CustomTableDiscoveryComponent.java
+++ b/modules/plugins/database/src/main/java/org/rhq/plugins/database/CustomTableDiscoveryComponent.java
@@ -39,9 +39,9 @@ import org.rhq.core.util.jdbc.JDBCUtil;
*
* @author Greg Hinkle
*/
-public class CustomTableDiscoveryComponent implements ManualAddFacet<DatabaseComponent>, ResourceDiscoveryComponent<DatabaseComponent> {
+public class CustomTableDiscoveryComponent implements ManualAddFacet<DatabaseComponent<?>>, ResourceDiscoveryComponent<DatabaseComponent<?>> {
public Set<DiscoveredResourceDetails> discoverResources(
- ResourceDiscoveryContext<DatabaseComponent> resourceDiscoveryContext)
+ ResourceDiscoveryContext<DatabaseComponent<?>> resourceDiscoveryContext)
throws InvalidPluginConfigurationException, Exception {
Statement statement = null;
try {
@@ -75,7 +75,7 @@ public class CustomTableDiscoveryComponent implements ManualAddFacet<DatabaseCom
return Collections.emptySet();
}
- public DiscoveredResourceDetails discoverResource(Configuration pluginConfiguration, ResourceDiscoveryContext<DatabaseComponent> discoveryContext)
+ public DiscoveredResourceDetails discoverResource(Configuration pluginConfiguration, ResourceDiscoveryContext<DatabaseComponent<?>> discoveryContext)
throws InvalidPluginConfigurationException {
Configuration config = pluginConfiguration;
diff --git a/modules/plugins/database/src/main/java/org/rhq/plugins/database/CustomTableRowDiscoveryComponent.java b/modules/plugins/database/src/main/java/org/rhq/plugins/database/CustomTableRowDiscoveryComponent.java
index 4b40d86..e4d9392 100644
--- a/modules/plugins/database/src/main/java/org/rhq/plugins/database/CustomTableRowDiscoveryComponent.java
+++ b/modules/plugins/database/src/main/java/org/rhq/plugins/database/CustomTableRowDiscoveryComponent.java
@@ -40,9 +40,9 @@ import org.rhq.core.util.jdbc.JDBCUtil;
*
* @author Greg Hinkle
*/
-public class CustomTableRowDiscoveryComponent implements ResourceDiscoveryComponent<DatabaseComponent> {
+public class CustomTableRowDiscoveryComponent implements ResourceDiscoveryComponent<DatabaseComponent<?>> {
public Set<DiscoveredResourceDetails> discoverResources(
- ResourceDiscoveryContext<DatabaseComponent> resourceDiscoveryContext)
+ ResourceDiscoveryContext<DatabaseComponent<?>> resourceDiscoveryContext)
throws InvalidPluginConfigurationException, Exception {
Statement statement = null;
ResultSet resultSet = null;
diff --git a/modules/plugins/database/src/main/java/org/rhq/plugins/database/DatabaseComponent.java b/modules/plugins/database/src/main/java/org/rhq/plugins/database/DatabaseComponent.java
index 336554c..5b8ad5f 100644
--- a/modules/plugins/database/src/main/java/org/rhq/plugins/database/DatabaseComponent.java
+++ b/modules/plugins/database/src/main/java/org/rhq/plugins/database/DatabaseComponent.java
@@ -19,12 +19,13 @@
package org.rhq.plugins.database;
import java.sql.Connection;
+
import org.rhq.core.pluginapi.inventory.ResourceComponent;
/**
* @author Greg Hinkle
*/
-public interface DatabaseComponent<T extends ResourceComponent> extends ResourceComponent<T> {
+public interface DatabaseComponent<T extends ResourceComponent<?>> extends ResourceComponent<T> {
Connection getConnection();
void removeConnection();
diff --git a/modules/plugins/hibernate/src/main/java/org/rhq/plugins/hibernate/EntityComponent.java b/modules/plugins/hibernate/src/main/java/org/rhq/plugins/hibernate/EntityComponent.java
index 0803ed6..2ed80c8 100644
--- a/modules/plugins/hibernate/src/main/java/org/rhq/plugins/hibernate/EntityComponent.java
+++ b/modules/plugins/hibernate/src/main/java/org/rhq/plugins/hibernate/EntityComponent.java
@@ -1,25 +1,25 @@
- /*
- * Jopr Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * 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 and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
+/*
+ * Jopr Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * 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 and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
package org.rhq.plugins.hibernate;
import java.util.Set;
@@ -38,12 +38,12 @@ import org.rhq.plugins.jmx.MBeanResourceComponent;
* @author Greg Hinkle
* @author John Mazzitelli
*/
-public class EntityComponent extends MBeanResourceComponent<MBeanResourceComponent> {
+public class EntityComponent extends MBeanResourceComponent<MBeanResourceComponent<?>> {
@Override
protected EmsBean loadBean() {
return getResourceContext().getParentResourceComponent().getEmsBean();
}
-
+
@Override
public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> requests) {
EmsOperation operation = getEmsBean().getOperation("getEntityStatistics");
diff --git a/modules/plugins/hibernate/src/main/java/org/rhq/plugins/hibernate/EntityDiscoveryComponent.java b/modules/plugins/hibernate/src/main/java/org/rhq/plugins/hibernate/EntityDiscoveryComponent.java
index c21cde7..2bc5191 100644
--- a/modules/plugins/hibernate/src/main/java/org/rhq/plugins/hibernate/EntityDiscoveryComponent.java
+++ b/modules/plugins/hibernate/src/main/java/org/rhq/plugins/hibernate/EntityDiscoveryComponent.java
@@ -1,30 +1,32 @@
- /*
- * Jopr Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * 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 and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
+/*
+ * Jopr Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * 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 and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
package org.rhq.plugins.hibernate;
import java.util.HashSet;
import java.util.Set;
+
import org.mc4j.ems.connection.bean.EmsBean;
+
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
@@ -35,8 +37,8 @@ import org.rhq.plugins.jmx.MBeanResourceComponent;
*
* @author Greg Hinkle
*/
-public class EntityDiscoveryComponent implements ResourceDiscoveryComponent<MBeanResourceComponent> {
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<MBeanResourceComponent> context) {
+public class EntityDiscoveryComponent implements ResourceDiscoveryComponent<MBeanResourceComponent<?>> {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<MBeanResourceComponent<?>> context) {
Set<DiscoveredResourceDetails> entities = new HashSet<DiscoveredResourceDetails>();
EmsBean statsBean = context.getParentResourceComponent().getEmsBean();
diff --git a/modules/plugins/hibernate/src/main/java/org/rhq/plugins/hibernate/StatisticsComponent.java b/modules/plugins/hibernate/src/main/java/org/rhq/plugins/hibernate/StatisticsComponent.java
index b42c966..bb00686 100644
--- a/modules/plugins/hibernate/src/main/java/org/rhq/plugins/hibernate/StatisticsComponent.java
+++ b/modules/plugins/hibernate/src/main/java/org/rhq/plugins/hibernate/StatisticsComponent.java
@@ -1,25 +1,25 @@
- /*
- * Jopr Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * 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 and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
+/*
+ * Jopr Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * 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 and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
package org.rhq.plugins.hibernate;
import org.rhq.core.domain.configuration.Configuration;
@@ -48,16 +48,16 @@ public class StatisticsComponent extends MBeanResourceComponent {
Object queryStatistics = getEmsBean().getOperation("getQueryStatistics").invoke(
new Object[] { queryString });
- Long executionCount = (Long) queryStatistics.getClass().getMethod("getExecutionCount").invoke(
- queryStatistics);
+ Long executionCount = (Long) queryStatistics.getClass().getMethod("getExecutionCount")
+ .invoke(queryStatistics);
Long executionRowCount = (Long) queryStatistics.getClass().getMethod("getExecutionRowCount")
.invoke(queryStatistics);
- Long executionMinTime = (Long) queryStatistics.getClass().getMethod("getExecutionMinTime").invoke(
- queryStatistics);
- Long executionMaxTime = (Long) queryStatistics.getClass().getMethod("getExecutionMaxTime").invoke(
- queryStatistics);
- Long executionAvgTime = (Long) queryStatistics.getClass().getMethod("getExecutionAvgTime").invoke(
- queryStatistics);
+ Long executionMinTime = (Long) queryStatistics.getClass().getMethod("getExecutionMinTime")
+ .invoke(queryStatistics);
+ Long executionMaxTime = (Long) queryStatistics.getClass().getMethod("getExecutionMaxTime")
+ .invoke(queryStatistics);
+ Long executionAvgTime = (Long) queryStatistics.getClass().getMethod("getExecutionAvgTime")
+ .invoke(queryStatistics);
PropertyMap query = new PropertyMap("query", new PropertySimple("query", queryString),
new PropertySimple("executionCount", executionCount), new PropertySimple("executionRowCount",
diff --git a/modules/plugins/hudson/src/main/java/org/rhq/plugins/hudson/HudsonServerComponent.java b/modules/plugins/hudson/src/main/java/org/rhq/plugins/hudson/HudsonServerComponent.java
index 17bcee7..f565052 100644
--- a/modules/plugins/hudson/src/main/java/org/rhq/plugins/hudson/HudsonServerComponent.java
+++ b/modules/plugins/hudson/src/main/java/org/rhq/plugins/hudson/HudsonServerComponent.java
@@ -18,21 +18,21 @@
*/
package org.rhq.plugins.hudson;
+import java.util.HashMap;
+import java.util.Map;
+
import org.json.JSONArray;
import org.json.JSONObject;
+
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
-import java.util.HashMap;
-import java.util.Map;
-
/**
* @author Greg Hinkle
*/
-public class HudsonServerComponent implements ResourceComponent {
-
+public class HudsonServerComponent implements ResourceComponent<ResourceComponent<?>> {
private ResourceContext resourceContext;
private Map<String, JSONArray> healthMap = new HashMap<String, JSONArray>();
@@ -46,8 +46,8 @@ public class HudsonServerComponent implements ResourceComponent {
public AvailabilityType getAvailability() {
try {
- JSONObject server = HudsonJSONUtility.getData(this.resourceContext.getPluginConfiguration().getSimple("urlBase").getStringValue(), 1);
-
+ JSONObject server = HudsonJSONUtility.getData(
+ this.resourceContext.getPluginConfiguration().getSimple("urlBase").getStringValue(), 1);
JSONArray jobs = server.getJSONArray("jobs");
for (int i = 0; i < jobs.length(); i++) {
diff --git a/modules/plugins/iis/src/main/java/org/rhq/plugins/iis/IISServerComponent.java b/modules/plugins/iis/src/main/java/org/rhq/plugins/iis/IISServerComponent.java
index 67d7621..83495fc 100644
--- a/modules/plugins/iis/src/main/java/org/rhq/plugins/iis/IISServerComponent.java
+++ b/modules/plugins/iis/src/main/java/org/rhq/plugins/iis/IISServerComponent.java
@@ -46,7 +46,8 @@ import org.rhq.plugins.iis.util.Win32ServiceControlDelegate;
* @author Greg Hinkle
* @author Joseph Marques
*/
-public class IISServerComponent implements ResourceComponent, MeasurementFacet, OperationFacet {
+public class IISServerComponent<T extends ResourceComponent<?>> implements ResourceComponent<T>, MeasurementFacet,
+ OperationFacet {
private static final String WINDOWS_SERVICE_NAME = "W3SVC";
private static final long SERVICE_CONTROL_TIMEOUT = 30000L;
diff --git a/modules/plugins/iis/src/main/java/org/rhq/plugins/iis/IISVHostComponent.java b/modules/plugins/iis/src/main/java/org/rhq/plugins/iis/IISVHostComponent.java
index 9d264b9..8c2b92f 100644
--- a/modules/plugins/iis/src/main/java/org/rhq/plugins/iis/IISVHostComponent.java
+++ b/modules/plugins/iis/src/main/java/org/rhq/plugins/iis/IISVHostComponent.java
@@ -40,15 +40,15 @@ import org.rhq.core.pluginapi.util.ResponseTimeConfiguration;
* @author Greg Hinkle
* @author Joseph Marques
*/
-public class IISVHostComponent implements ResourceComponent<IISServerComponent>, MeasurementFacet {
+public class IISVHostComponent implements ResourceComponent<IISServerComponent<?>>, MeasurementFacet {
- private ResourceContext<IISServerComponent> resourceContext;
+ private ResourceContext<IISServerComponent<?>> resourceContext;
private IISResponseTimeDelegate responseTimeDelegate;
private Log log = LogFactory.getLog(IISVHostComponent.class);
- public void start(ResourceContext<IISServerComponent> resourceContext) throws InvalidPluginConfigurationException,
- Exception {
+ public void start(ResourceContext<IISServerComponent<?>> resourceContext)
+ throws InvalidPluginConfigurationException, Exception {
this.resourceContext = resourceContext;
String logDirectory = getLogDirectory();
@@ -59,7 +59,7 @@ public class IISVHostComponent implements ResourceComponent<IISServerComponent>,
if (logFormat == null) {
throw new InvalidPluginConfigurationException("The 'responseTimeLogFormat' property must be specified.");
}
-
+
responseTimeDelegate = new IISResponseTimeDelegate(logDirectory, logFormat, responseTimeConfiguration
/*,collectionTZ.equals("true")*/);
}
diff --git a/modules/plugins/iis/src/main/java/org/rhq/plugins/iis/IISVHostDiscoveryComponent.java b/modules/plugins/iis/src/main/java/org/rhq/plugins/iis/IISVHostDiscoveryComponent.java
index 0cd5cd8..be3bd15 100644
--- a/modules/plugins/iis/src/main/java/org/rhq/plugins/iis/IISVHostDiscoveryComponent.java
+++ b/modules/plugins/iis/src/main/java/org/rhq/plugins/iis/IISVHostDiscoveryComponent.java
@@ -38,13 +38,13 @@ import org.rhq.plugins.iis.util.IISMetaBase;
*
* @author Greg Hinkle
*/
-public class IISVHostDiscoveryComponent implements ResourceDiscoveryComponent<IISServerComponent> {
+public class IISVHostDiscoveryComponent implements ResourceDiscoveryComponent<IISServerComponent<?>> {
private static final String PDH_WEB_SERVICE = "Web Service";
private static final String PDH_TOTAL = "_Total";
public Set<DiscoveredResourceDetails> discoverResources(
- ResourceDiscoveryContext<IISServerComponent> resourceDiscoveryContext)
+ ResourceDiscoveryContext<IISServerComponent<?>> resourceDiscoveryContext)
throws InvalidPluginConfigurationException, Exception {
List<String> vhosts = new ArrayList<String>();
diff --git a/modules/plugins/irc/src/main/java/org/rhq/plugins/irc/IRCServerComponent.java b/modules/plugins/irc/src/main/java/org/rhq/plugins/irc/IRCServerComponent.java
index 5f169e8..b29293d 100644
--- a/modules/plugins/irc/src/main/java/org/rhq/plugins/irc/IRCServerComponent.java
+++ b/modules/plugins/irc/src/main/java/org/rhq/plugins/irc/IRCServerComponent.java
@@ -24,7 +24,7 @@ import org.jibble.pircbot.PircBot;
/**
* @author Greg Hinkle
*/
-public class IRCServerComponent implements ResourceComponent, OperationFacet {
+public class IRCServerComponent implements ResourceComponent<ResourceComponent<?>>, OperationFacet {
private final Log log = LogFactory.getLog(this.getClass());
private Bot bot;
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedComponent.java
index bde5b37..d463007 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedComponent.java
@@ -30,35 +30,29 @@ import org.rhq.plugins.jbossas5.connection.ProfileServiceConnection;
/**
* @author Ian Springer
*/
-public abstract class AbstractManagedComponent implements ProfileServiceComponent<ProfileServiceComponent>
-{
- private ResourceContext<ProfileServiceComponent> resourceContext;
+public abstract class AbstractManagedComponent implements ProfileServiceComponent<ProfileServiceComponent<?>> {
+ private ResourceContext<ProfileServiceComponent<?>> resourceContext;
private String resourceDescription;
- public void start(ResourceContext<ProfileServiceComponent> resourceContext) throws Exception
- {
+ public void start(ResourceContext<ProfileServiceComponent<?>> resourceContext) throws Exception {
this.resourceContext = resourceContext;
- this.resourceDescription = this.resourceContext.getResourceType()
- + " Resource with key [" + this.resourceContext.getResourceKey() + "]";
+ this.resourceDescription = this.resourceContext.getResourceType() + " Resource with key ["
+ + this.resourceContext.getResourceKey() + "]";
}
- public void stop()
- {
+ public void stop() {
return;
- }
+ }
- public ResourceContext<ProfileServiceComponent> getResourceContext()
- {
+ public ResourceContext<ProfileServiceComponent<?>> getResourceContext() {
return this.resourceContext;
}
- public ProfileServiceConnection getConnection()
- {
+ public ProfileServiceConnection getConnection() {
return this.resourceContext.getParentResourceComponent().getConnection();
}
- protected String getResourceDescription()
- {
+ protected String getResourceDescription() {
return this.resourceDescription;
}
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedDeploymentComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedDeploymentComponent.java
index 1703036..f554f60 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedDeploymentComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedDeploymentComponent.java
@@ -83,7 +83,7 @@ public abstract class AbstractManagedDeploymentComponent extends AbstractManaged
// ----------- ResourceComponent Implementation ------------
- public void start(ResourceContext<ProfileServiceComponent> resourceContext) throws Exception {
+ public void start(ResourceContext<ProfileServiceComponent<?>> resourceContext) throws Exception {
super.start(resourceContext);
Configuration pluginConfig = getResourceContext().getPluginConfiguration();
this.deploymentName = pluginConfig.getSimple(DEPLOYMENT_NAME_PROPERTY).getStringValue();
@@ -96,10 +96,9 @@ public abstract class AbstractManagedDeploymentComponent extends AbstractManaged
try {
getManagedDeployment();
} catch (Exception e) {
- log
- .warn("The underlying file ["
- + this.deploymentFile
- + "] no longer exists. It may have been deleted from the filesystem external to RHQ. If you wish to remove this Resource from inventory, you may add &debug=true to the URL for the Browse Resources > Services page and then click the UNINVENTORY button next to this Resource.");
+ log.warn("The underlying file ["
+ + this.deploymentFile
+ + "] no longer exists. It may have been deleted from the filesystem external to RHQ. If you wish to remove this Resource from inventory, you may add &debug=true to the URL for the Browse Resources > Services page and then click the UNINVENTORY button next to this Resource.");
}
}
@@ -112,16 +111,16 @@ public abstract class AbstractManagedDeploymentComponent extends AbstractManaged
+ e.getLocalizedMessage());
return AvailabilityType.DOWN;
} catch (Throwable t) {
- log.debug("Could not get deployment state for " + this.deploymentType + " deployment '"
- + this.deploymentName + "', cause: ", t);
+ log.debug("Could not get deployment state for " + this.deploymentType + " deployment '"
+ + this.deploymentName + "', cause: ", t);
return AvailabilityType.DOWN;
}
if (deploymentState == DeploymentState.STARTED) {
return AvailabilityType.UP;
} else {
- log.debug(this.deploymentType + " deployment '" + this.deploymentName +
- "' was not running, state was: " + deploymentState);
+ log.debug(this.deploymentType + " deployment '" + this.deploymentName + "' was not running, state was: "
+ + deploymentState);
return AvailabilityType.DOWN;
}
}
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedDeploymentDiscoveryComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedDeploymentDiscoveryComponent.java
index 9ab49b7..c3084fb 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedDeploymentDiscoveryComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/AbstractManagedDeploymentDiscoveryComponent.java
@@ -30,13 +30,19 @@ import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
+import org.jboss.deployers.spi.management.KnownDeploymentTypes;
+import org.jboss.deployers.spi.management.ManagementView;
import org.jboss.deployers.spi.management.deploy.DeploymentManager;
import org.jboss.deployers.spi.management.deploy.DeploymentProgress;
import org.jboss.deployers.spi.management.deploy.DeploymentStatus;
import org.jboss.managed.api.DeploymentState;
+import org.jboss.managed.api.ManagedDeployment;
+import org.jboss.profileservice.spi.NoSuchDeploymentException;
import org.jboss.profileservice.spi.Profile;
import org.jboss.profileservice.spi.ProfileKey;
import org.jboss.profileservice.spi.ProfileService;
+
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.ResourceUpgradeReport;
@@ -47,64 +53,54 @@ import org.rhq.core.pluginapi.upgrade.ResourceUpgradeContext;
import org.rhq.core.pluginapi.upgrade.ResourceUpgradeFacet;
import org.rhq.plugins.jbossas5.util.ConversionUtils;
-import org.jboss.deployers.spi.management.KnownDeploymentTypes;
-import org.jboss.deployers.spi.management.ManagementView;
-import org.jboss.managed.api.ManagedDeployment;
-import org.jboss.profileservice.spi.NoSuchDeploymentException;
-
/**
* Discovery component for discovering JBAS 5.x/6.x deployments (EARs, WARs, EJB-JARs, etc.).
*
* @author Mark Spritzler
* @author Ian Springer
*/
-public abstract class AbstractManagedDeploymentDiscoveryComponent
- implements ResourceDiscoveryComponent<ProfileServiceComponent>, ResourceUpgradeFacet<ProfileServiceComponent>
-{
+public abstract class AbstractManagedDeploymentDiscoveryComponent implements
+ ResourceDiscoveryComponent<ProfileServiceComponent<?>>, ResourceUpgradeFacet<ProfileServiceComponent<?>> {
private final Log log = LogFactory.getLog(this.getClass());
public Set<DiscoveredResourceDetails> discoverResources(
- ResourceDiscoveryContext<ProfileServiceComponent> discoveryContext)
- {
+ ResourceDiscoveryContext<ProfileServiceComponent<?>> discoveryContext) {
ResourceType resourceType = discoveryContext.getResourceType();
log.trace("Discovering " + resourceType.getName() + " Resources...");
KnownDeploymentTypes deploymentType = ConversionUtils.getDeploymentType(resourceType);
String deploymentTypeString = deploymentType.getType();
- ManagementView managementView = discoveryContext.getParentResourceComponent().getConnection().getManagementView();
+ ManagementView managementView = discoveryContext.getParentResourceComponent().getConnection()
+ .getManagementView();
// TODO (ips): Only refresh the ManagementView *once* per runtime discovery scan, rather than every time this
// method is called. Do this by providing a runtime scan id in the ResourceDiscoveryContext.
managementView.load();
Set<String> deploymentNames = null;
- try
- {
+ try {
deploymentNames = managementView.getDeploymentNamesForType(deploymentTypeString);
- }
- catch (Exception e)
- {
+ } catch (Exception e) {
log.error("Unable to get deployment names for type " + deploymentTypeString, e);
}
- Set<DiscoveredResourceDetails> discoveredResources = new HashSet<DiscoveredResourceDetails>(deploymentNames.size());
+ Set<DiscoveredResourceDetails> discoveredResources = new HashSet<DiscoveredResourceDetails>(
+ deploymentNames.size());
- ProfileService profileService = discoveryContext.getParentResourceComponent().getConnection().getProfileService();
+ ProfileService profileService = discoveryContext.getParentResourceComponent().getConnection()
+ .getProfileService();
// Create a resource details for each managed deployment found.
- for (String deploymentName : deploymentNames)
- {
+ for (String deploymentName : deploymentNames) {
// example of a deployment name: vfszip:/C:/opt/jboss-6.0.0.Final/server/default/deploy/http-invoker.sar/invoker.war/
- try
- {
+ try {
ManagedDeployment managedDeployment = managementView.getDeployment(deploymentName);
if (!accept(managedDeployment)) {
continue;
}
String resourceName = managedDeployment.getSimpleName();
// @TODO remove this when AS5 actually implements this for sars, and some other DeploymentTypes that haven't implemented getSimpleName()
- if (resourceName.equals("%Generated%"))
- {
+ if (resourceName.equals("%Generated%")) {
resourceName = getResourceName(deploymentName);
}
@@ -113,26 +109,17 @@ public abstract class AbstractManagedDeploymentDiscoveryComponent
managedDeployment.getSimpleName();
String version = null; // TODO (ManagedDeployment "version" property?)
- DiscoveredResourceDetails resource =
- new DiscoveredResourceDetails(resourceType,
- resourceKey,
- resourceName,
- version,
- resourceType.getDescription(),
- discoveryContext.getDefaultPluginConfiguration(),
- null);
+ DiscoveredResourceDetails resource = new DiscoveredResourceDetails(resourceType, resourceKey,
+ resourceName, version, resourceType.getDescription(),
+ discoveryContext.getDefaultPluginConfiguration(), null);
resource.getPluginConfiguration().put(
- new PropertySimple(AbstractManagedDeploymentComponent.DEPLOYMENT_NAME_PROPERTY, deploymentName));
+ new PropertySimple(AbstractManagedDeploymentComponent.DEPLOYMENT_NAME_PROPERTY, deploymentName));
discoveredResources.add(resource);
- }
- catch (NoSuchDeploymentException e)
- {
+ } catch (NoSuchDeploymentException e) {
// This is a bug in the profile service that occurs often, so don't log the stack trace.
log.error("ManagementView.getDeploymentNamesForType() returned [" + deploymentName
- + "] as a deployment name, but calling getDeployment() with that name failed.");
- }
- catch (Exception e)
- {
+ + "] as a deployment name, but calling getDeployment() with that name failed.");
+ } catch (Exception e) {
log.error("An error occurred while discovering " + resourceType + " Resources.", e);
}
}
@@ -142,7 +129,7 @@ public abstract class AbstractManagedDeploymentDiscoveryComponent
}
@Override
- public ResourceUpgradeReport upgrade(ResourceUpgradeContext<ProfileServiceComponent> upgradeContext) {
+ public ResourceUpgradeReport upgrade(ResourceUpgradeContext<ProfileServiceComponent<?>> upgradeContext) {
String inventoriedResourceKey = upgradeContext.getResourceKey();
// check if the inventoried resource already has the new resource key format.
@@ -182,8 +169,7 @@ public abstract class AbstractManagedDeploymentDiscoveryComponent
deploymentAncestrySimpleNames.add(0, parentDeployment.getSimpleName());
} while ((parentDeployment = parentDeployment.getParent()) != null);
- for (int i = 0, deploymentAncestrySimpleNamesSize = deploymentAncestrySimpleNames.size();
- i < deploymentAncestrySimpleNamesSize; i++) {
+ for (int i = 0, deploymentAncestrySimpleNamesSize = deploymentAncestrySimpleNames.size(); i < deploymentAncestrySimpleNamesSize; i++) {
String deploymentSimpleName = deploymentAncestrySimpleNames.get(i);
resourceKey.append(deploymentSimpleName);
if (i != (deploymentAncestrySimpleNamesSize - 1)) {
@@ -234,8 +220,7 @@ public abstract class AbstractManagedDeploymentDiscoveryComponent
protected abstract boolean accept(ManagedDeployment managedDeployment);
- private static String getResourceName(String fullPath)
- {
+ private static String getResourceName(String fullPath) {
int lastSlashIndex = fullPath.lastIndexOf("/");
return fullPath.substring(lastSlashIndex + 1);
}
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java
index 5bacccb..299bdcd 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java
@@ -100,8 +100,9 @@ import org.rhq.plugins.jbossas5.util.ManagedComponentUtils;
* @author Mark Spritzler
* @author Ian Springer
*/
-public class ApplicationServerComponent implements ResourceComponent, ProfileServiceComponent,
- CreateChildResourceFacet, MeasurementFacet, ConfigurationFacet, ProgressListener, ContentFacet, OperationFacet {
+public class ApplicationServerComponent<T extends ResourceComponent<?>> implements ResourceComponent<T>,
+ ProfileServiceComponent<T>, CreateChildResourceFacet, MeasurementFacet, ConfigurationFacet, ProgressListener,
+ ContentFacet, OperationFacet {
private static final Pattern METRIC_NAME_PATTERN = Pattern.compile("(.*)\\|(.*)\\|(.*)\\|(.*)");
@@ -148,8 +149,8 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
//this component represents. This is to prevent 2 servers
//with the same JNP URL to be reported as UP when just one
//of them can be up at a time.
- ManagedComponent serverConfig = managementView.getComponentsForType(
- new ComponentType("MCBean", "ServerConfig")).iterator().next();
+ ManagedComponent serverConfig = managementView
+ .getComponentsForType(new ComponentType("MCBean", "ServerConfig")).iterator().next();
String reportedServerHomeDirPath = (String) ((SimpleValue) serverConfig.getProperty("serverHomeDir")
.getValue()).getValue();
@@ -464,8 +465,8 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
public OperationResult invokeOperation(String name, Configuration parameters) throws InterruptedException,
Exception {
- ApplicationServerSupportedOperations operation = Enum.valueOf(ApplicationServerSupportedOperations.class, name
- .toUpperCase());
+ ApplicationServerSupportedOperations operation = Enum.valueOf(ApplicationServerSupportedOperations.class,
+ name.toUpperCase());
return this.operationDelegate.invoke(operation, parameters);
}
@@ -509,8 +510,8 @@ public class ApplicationServerComponent implements ResourceComponent, ProfileSer
private JBPMWorkflowManager createJbpmWorkflowManager(ResourceContext resourceContext) {
ContentContext contentContext = resourceContext.getContentContext();
ControlActionFacade controlActionFacade = initControlActionFacade();
- JBPMWorkflowManager workflowManager = new JBPMWorkflowManager(contentContext, controlActionFacade, this
- .getJBossASPaths());
+ JBPMWorkflowManager workflowManager = new JBPMWorkflowManager(contentContext, controlActionFacade,
+ this.getJBossASPaths());
return workflowManager;
}
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossMessagingComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossMessagingComponent.java
index af47587..e864117 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossMessagingComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossMessagingComponent.java
@@ -22,6 +22,8 @@
*/
package org.rhq.plugins.jbossas5;
+import java.util.Set;
+
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.MeasurementReport;
import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
@@ -31,23 +33,21 @@ import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
import org.rhq.plugins.jbossas5.helper.CreateChildResourceFacetDelegate;
-import java.util.Set;
-
/**
* The ResourceComponent for the singleton JBoss Messaging ResourceType, which supports creation of two child
* ResourceTypes - Queue and Topic.
*
* @author Ian Springer
*/
-public class JBossMessagingComponent extends ManagedComponentComponent
- implements CreateChildResourceFacet, MeasurementFacet {
+public class JBossMessagingComponent extends ManagedComponentComponent implements CreateChildResourceFacet,
+ MeasurementFacet {
private CreateChildResourceFacetDelegate createChildResourceDelegate;
public AvailabilityType getAvailability() {
return super.getAvailability();
}
- public void start(ResourceContext resourceContext) throws Exception {
+ public void start(ResourceContext<ProfileServiceComponent<?>> resourceContext) throws Exception {
super.start(resourceContext);
this.createChildResourceDelegate = new CreateChildResourceFacetDelegate(this);
}
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossMessagingDiscoveryComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossMessagingDiscoveryComponent.java
index a88ac44..b953599 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossMessagingDiscoveryComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossMessagingDiscoveryComponent.java
@@ -34,11 +34,11 @@ import java.util.Set;
*
* @author Ian Springer
*/
-public class JBossMessagingDiscoveryComponent extends ManagedComponentDiscoveryComponent<ApplicationServerComponent> {
+public class JBossMessagingDiscoveryComponent extends ManagedComponentDiscoveryComponent<ApplicationServerComponent<?>> {
private static final String DEFAULT_RESOURCE_NAME = "JBoss Messaging";
@Override
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<ApplicationServerComponent> discoveryContext)
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<ApplicationServerComponent<?>> discoveryContext)
throws Exception {
return super.discoverResources(discoveryContext);
}
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossWebComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossWebComponent.java
index 9ac7274..2cdce10 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossWebComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossWebComponent.java
@@ -23,42 +23,38 @@
package org.rhq.plugins.jbossas5;
import org.jetbrains.annotations.NotNull;
+import org.mc4j.ems.connection.EmsConnection;
+
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.plugins.jbossas5.connection.ProfileServiceConnection;
-import org.mc4j.ems.connection.EmsConnection;
/**
* A ResourceComponent for managing the JBoss Web servlet container within a JBoss AS instance.
*
* @author Ian Springer
*/
-public class JBossWebComponent implements ProfileServiceComponent<ProfileServiceComponent>
-{
- private ResourceContext<ProfileServiceComponent> resourceContext;
+public class JBossWebComponent implements ProfileServiceComponent<ProfileServiceComponent<?>> {
+ private ResourceContext<ProfileServiceComponent<?>> resourceContext;
- public void start(ResourceContext<ProfileServiceComponent> resourceContext) throws Exception
- {
+ public void start(ResourceContext<ProfileServiceComponent<?>> resourceContext) throws Exception {
this.resourceContext = resourceContext;
}
- public void stop()
- {
+ public void stop() {
return;
}
- public AvailabilityType getAvailability()
- {
+ public AvailabilityType getAvailability() {
return AvailabilityType.UP;
}
@NotNull
- public ResourceContext<ProfileServiceComponent> getResourceContext() {
+ public ResourceContext<ProfileServiceComponent<?>> getResourceContext() {
return this.resourceContext;
}
- public ProfileServiceConnection getConnection()
- {
+ public ProfileServiceConnection getConnection() {
return this.resourceContext.getParentResourceComponent().getConnection();
}
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossWebDiscoveryComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossWebDiscoveryComponent.java
index bdabf9d..1e19e4e 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossWebDiscoveryComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JBossWebDiscoveryComponent.java
@@ -37,12 +37,12 @@ import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
*
* @author Ian Springer
*/
-public class JBossWebDiscoveryComponent implements ResourceDiscoveryComponent<ProfileServiceComponent>
+public class JBossWebDiscoveryComponent implements ResourceDiscoveryComponent<ProfileServiceComponent<?>>
{
private final Log log = LogFactory.getLog(this.getClass());
public Set<DiscoveredResourceDetails> discoverResources(
- ResourceDiscoveryContext<ProfileServiceComponent> discoveryContext)
+ ResourceDiscoveryContext<ProfileServiceComponent<?>> discoveryContext)
{
Set<DiscoveredResourceDetails> discoveredResources = new HashSet<DiscoveredResourceDetails>();
ResourceType resourceType = discoveryContext.getResourceType();
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JmsDestinationDiscoveryComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JmsDestinationDiscoveryComponent.java
index 43a1722..02c5bed 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JmsDestinationDiscoveryComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/JmsDestinationDiscoveryComponent.java
@@ -31,7 +31,7 @@ import org.rhq.plugins.jbossas5.util.ManagedComponentUtils;
*
* @author Ian Springer
*/
-public class JmsDestinationDiscoveryComponent extends ManagedComponentDiscoveryComponent<ApplicationServerComponent> {
+public class JmsDestinationDiscoveryComponent extends ManagedComponentDiscoveryComponent<ApplicationServerComponent<?>> {
private static final String NAME_MANAGED_PROPERTY = "name";
@Override
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java
index bca27da..23f8b2d 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java
@@ -129,7 +129,7 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
}
}
- public void start(ResourceContext<ProfileServiceComponent> resourceContext) throws Exception {
+ public void start(ResourceContext<ProfileServiceComponent<?>> resourceContext) throws Exception {
super.start(resourceContext);
this.componentType = ConversionUtils.getComponentType(getResourceContext().getResourceType());
Configuration pluginConfig = resourceContext.getPluginConfiguration();
@@ -271,8 +271,8 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
if (null == isRuntimeMetric) {
//log.info("\nADDING MAP ENTRY FOR METRIC=" + request.getName());
ManagedProperty managedProp = getManagedProperty(managedComponent, request);
- runtimeMetricMap.put(request.getName(), Boolean.valueOf((null == managedProp || managedProp
- .hasViewUse(ViewUse.RUNTIME))));
+ runtimeMetricMap.put(request.getName(),
+ Boolean.valueOf((null == managedProp || managedProp.hasViewUse(ViewUse.RUNTIME))));
}
if (Boolean.FALSE.equals(runtimeMetricMap.get(request.getName()))) {
@@ -284,7 +284,7 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
return getManagedComponent(forceRefresh);
}
-
+
protected String getMeasurement(ManagedComponent component, String metricName) throws Exception {
if ("runState".equals(metricName)) {
return component.getRunState().name();
@@ -293,7 +293,7 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
return value == null ? null : toString(value);
}
}
-
+
protected void updateComponent(ManagedComponent managedComponent) throws Exception {
log.trace("Updating " + getResourceDescription() + " with component " + toString(managedComponent) + "...");
ManagementView managementView = getConnection().getManagementView();
@@ -340,7 +340,7 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
}
return getInnerValue(metaValue);
}
-
+
/**
* The name of the measurement schedule request (i.e. the metric name) can be in one of two forms:
* <p/>
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentDiscoveryComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentDiscoveryComponent.java
index a0a62ea..573f62c 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentDiscoveryComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentDiscoveryComponent.java
@@ -27,9 +27,11 @@ import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.jboss.deployers.spi.management.ManagementView;
import org.jboss.managed.api.ComponentType;
import org.jboss.managed.api.ManagedComponent;
+
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
@@ -45,7 +47,7 @@ import org.rhq.plugins.jbossas5.util.ConversionUtils;
* @author Mark Spritzer
* @author Ian Springer
*/
-public class ManagedComponentDiscoveryComponent<P extends ProfileServiceComponent> implements
+public class ManagedComponentDiscoveryComponent<P extends ProfileServiceComponent<?>> implements
ResourceDiscoveryComponent<P> {
private final Log log = LogFactory.getLog(this.getClass());
@@ -68,9 +70,8 @@ public class ManagedComponentDiscoveryComponent<P extends ProfileServiceComponen
throw new IllegalStateException("Failed to get component types for " + resourceType + ".", e);
}
if (resourceType.isSingleton() && components.size() > 1) {
- throw new IllegalStateException("Discovered multiple [" + componentType
- + "] managed components during [" + resourceType
- + "] discovery, but expected to find no more than one - components were: " + components);
+ throw new IllegalStateException("Discovered multiple [" + componentType + "] managed components during ["
+ + resourceType + "] discovery, but expected to find no more than one - components were: " + components);
}
Set<DiscoveredResourceDetails> discoveredResources = new HashSet<DiscoveredResourceDetails>(components.size());
@@ -92,8 +93,8 @@ public class ManagedComponentDiscoveryComponent<P extends ProfileServiceComponen
String version = getResourceVersion(component);
DiscoveredResourceDetails resource = new DiscoveredResourceDetails(resourceType, resourceKey,
- resourceName, version, resourceType.getDescription(), discoveryContext
- .getDefaultPluginConfiguration(), null);
+ resourceName, version, resourceType.getDescription(),
+ discoveryContext.getDefaultPluginConfiguration(), null);
resource.getPluginConfiguration().put(
new PropertySimple(ManagedComponentComponent.Config.COMPONENT_NAME, resourceKey));
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedDeploymentDiscoveryComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedDeploymentDiscoveryComponent.java
index 946120d..edac239 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedDeploymentDiscoveryComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedDeploymentDiscoveryComponent.java
@@ -45,12 +45,12 @@ import org.jboss.profileservice.spi.NoSuchDeploymentException;
* @author Mark Spritzler
* @author Ian Springer
*/
-public abstract class ManagedDeploymentDiscoveryComponent implements ResourceDiscoveryComponent<ApplicationServerComponent>
+public abstract class ManagedDeploymentDiscoveryComponent implements ResourceDiscoveryComponent<ApplicationServerComponent<?>>
{
private final Log log = LogFactory.getLog(this.getClass());
public Set<DiscoveredResourceDetails> discoverResources(
- ResourceDiscoveryContext<ApplicationServerComponent> discoveryContext)
+ ResourceDiscoveryContext<ApplicationServerComponent<?>> discoveryContext)
{
Set<DiscoveredResourceDetails> discoveredResources = new HashSet<DiscoveredResourceDetails>();
ResourceType resourceType = discoveryContext.getResourceType();
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/PlatformComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/PlatformComponent.java
index 2c8e6d9..acfdb06 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/PlatformComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/PlatformComponent.java
@@ -7,6 +7,9 @@ import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.jetbrains.annotations.NotNull;
+import org.mc4j.ems.connection.EmsConnection;
+
import org.jboss.deployers.spi.management.ManagementView;
import org.jboss.managed.api.ManagedComponent;
import org.jboss.managed.api.ManagedDeployment;
@@ -16,7 +19,7 @@ import org.jboss.managed.api.ManagedProperty;
import org.jboss.metatype.api.types.MetaType;
import org.jboss.metatype.api.values.MetaValue;
import org.jboss.profileservice.spi.NoSuchDeploymentException;
-import org.jetbrains.annotations.NotNull;
+
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.DataType;
@@ -40,240 +43,214 @@ import org.rhq.plugins.jbossas5.adapter.impl.measurement.SimpleMetaValueMeasurem
import org.rhq.plugins.jbossas5.connection.ProfileServiceConnection;
import org.rhq.plugins.jbossas5.util.ConversionUtils;
import org.rhq.plugins.jbossas5.util.ResourceTypeUtils;
-import org.mc4j.ems.connection.EmsConnection;
-public class PlatformComponent implements
- ProfileServiceComponent<ProfileServiceComponent>, MeasurementFacet,
- OperationFacet, ConfigurationFacet {
- private final Log log = LogFactory.getLog(this.getClass());
- private ResourceContext<ProfileServiceComponent> context;
- private String deployName;
- private String componentName;
+public class PlatformComponent implements ProfileServiceComponent<ProfileServiceComponent<?>>, MeasurementFacet,
+ OperationFacet, ConfigurationFacet {
+ private final Log log = LogFactory.getLog(this.getClass());
+ private ResourceContext<ProfileServiceComponent<?>> context;
+ private String deployName;
+ private String componentName;
- public PlatformComponent() {
- }
+ public PlatformComponent() {
+ }
- public void start(ResourceContext<ProfileServiceComponent> context)
- throws InvalidPluginConfigurationException, Exception {
- this.context = context;
- }
+ public void start(ResourceContext<ProfileServiceComponent<?>> context) throws InvalidPluginConfigurationException,
+ Exception {
+ this.context = context;
+ }
- public void stop() {
- return;
- }
+ public void stop() {
+ return;
+ }
@NotNull
- public ResourceContext<ProfileServiceComponent> getResourceContext() {
+ public ResourceContext<ProfileServiceComponent<?>> getResourceContext() {
return this.context;
}
public ProfileServiceConnection getConnection() {
- ApplicationServerComponent component = (ApplicationServerComponent) context
- .getParentResourceComponent();
- return component.getConnection();
+ ApplicationServerComponent component = (ApplicationServerComponent) context.getParentResourceComponent();
+ return component.getConnection();
- }
+ }
public EmsConnection getEmsConnection() {
return context.getParentResourceComponent().getEmsConnection();
}
public CreateResourceReport createResource(CreateResourceReport report) {
- // TODO Auto-generated method stub
- return null;
- }
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ // ------------ MeasurementFacet Implementation ------------
+
+ public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> requests) {
+ try {
+ ManagedComponent component = loadComponent();
+ String[] propertyName;
- // ------------ MeasurementFacet Implementation ------------
+ for (MeasurementScheduleRequest request : requests) {
+ String metricName = request.getName();
- public void getValues(MeasurementReport report,
- Set<MeasurementScheduleRequest> requests) {
- try {
- ManagedComponent component = loadComponent();
- String[] propertyName;
+ propertyName = parsePropertyName(metricName);
+ if (propertyName.length == 0)
+ continue;
- for (MeasurementScheduleRequest request : requests) {
- String metricName = request.getName();
+ ManagedProperty prop = component.getProperties().get(propertyName[0]);
- propertyName = parsePropertyName(metricName);
- if (propertyName.length == 0)
- continue;
+ if (prop != null) {
+ MetaType type = prop.getMetaType();
+ MetaValue value = prop.getValue();
- ManagedProperty prop = component.getProperties().get(
- propertyName[0]);
+ if (value != null) {
+ MeasurementDefinition measurementDefinition = ResourceTypeUtils.getMeasurementDefinition(
+ context.getResourceType(), metricName);
- if (prop != null) {
- MetaType type = prop.getMetaType();
- MetaValue value = prop.getValue();
+ if (type.isSimple()) {
+ MeasurementAdapter measurementAdapter = new SimpleMetaValueMeasurementAdapter();
+ if (measurementDefinition != null & measurementAdapter != null)
+ measurementAdapter.setMeasurementData(report, value, request, measurementDefinition);
+ }
+ if (type.isComposite()) {
- if (value != null) {
- MeasurementDefinition measurementDefinition = ResourceTypeUtils
- .getMeasurementDefinition(context
- .getResourceType(), metricName);
+ ManagedObject obj = prop.getManagedObject();
+ Object attachment = obj.getAttachment();
+
+ for (int i = 0; i < propertyName.length; i++) {
+ attachment = getObjectProperty(attachment, propertyName[i]);
+ }
+
+ setMeasurementData(report, attachment, request, measurementDefinition);
+
+ }
+
+ }
+ }
+ }
+
+ } catch (NoSuchDeploymentException e) {
+ log.error("Loaded component does not exist: " + e);
+ } catch (SecurityException e) {
+ log.error("Security Exception: " + e);
+
+ }
+ }
+
+ public Configuration loadResourceConfiguration() throws Exception {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public void updateResourceConfiguration(ConfigurationUpdateReport report) {
+ // TODO Auto-generated method stub
+
+ }
- if (type.isSimple()) {
- MeasurementAdapter measurementAdapter = new SimpleMetaValueMeasurementAdapter();
- if (measurementDefinition != null
- & measurementAdapter != null)
- measurementAdapter.setMeasurementData(report,
- value, request, measurementDefinition);
- }
- if (type.isComposite()) {
+ private ManagedComponent loadComponent() throws NoSuchDeploymentException {
- ManagedObject obj = prop.getManagedObject();
- Object attachment = obj.getAttachment();
+ deployName = context.getPluginConfiguration().getSimple(PlatformDiscoveryComponent.PLATFORM_DEPLOYMENT_NAME)
+ .getStringValue();
- for (int i = 0; i < propertyName.length; i++) {
- attachment = getObjectProperty(attachment,
- propertyName[i]);
- }
-
- setMeasurementData(report, attachment, request,
- measurementDefinition);
-
- }
-
- }
- }
- }
-
- } catch (NoSuchDeploymentException e) {
- log.error("Loaded component does not exist: " + e);
- } catch (SecurityException e) {
- log.error("Security Exception: " + e);
-
- }
- }
-
- public Configuration loadResourceConfiguration() throws Exception {
- // TODO Auto-generated method stub
- return null;
- }
-
- public void updateResourceConfiguration(ConfigurationUpdateReport report) {
- // TODO Auto-generated method stub
-
- }
-
- private ManagedComponent loadComponent() throws NoSuchDeploymentException {
-
- deployName = context.getPluginConfiguration().getSimple(
- PlatformDiscoveryComponent.PLATFORM_DEPLOYMENT_NAME)
- .getStringValue();
-
- componentName = context.getPluginConfiguration().getSimple(
- PlatformDiscoveryComponent.PLATFORM_COMPONENT_NAME)
- .getStringValue();
-
- ProfileServiceConnection connection = context
- .getParentResourceComponent().getConnection();
-
- ManagementView managementView = connection.getManagementView();
-
- ManagedDeployment deploy = managementView.getDeployment(deployName);
- if (deploy != null) {
- Map<String, ManagedComponent> components = deploy.getComponents();
-
- return components.get(componentName);
- }
-
- return null;
- }
-
- public AvailabilityType getAvailability() {
- // TODO Auto-generated method stub
- return null;
- }
-
- public String[] parsePropertyName(String name) {
-
- String[] ps;
-
- if (name.indexOf('{') == -1) {
- ps = new String[1];
- ps[0] = name;
- return ps;
- }
- name = name.substring(name.indexOf('{') + 1, name.indexOf('}'));
- ps = name.split("\\.");
-
- return ps;
- }
-
- protected Object getObjectProperty(Object value, String property) {
-
- try {
- PropertyDescriptor[] pds = Introspector.getBeanInfo(
- value.getClass()).getPropertyDescriptors();
- for (PropertyDescriptor pd : pds) {
- if (pd.getName().equals(property)) {
- pd.getReadMethod().setAccessible(true);
- value = pd.getReadMethod().invoke(value);
- }
- }
- } catch (Exception e) {
- log.error("Object " + value.toString()
- + " does not contain property " + property, e);
- }
-
- return value;
- }
-
- public void setMeasurementData(MeasurementReport report, Object value,
- MeasurementScheduleRequest request,
- MeasurementDefinition measurementDefinition) {
-
- DataType dataType = measurementDefinition.getDataType();
- switch (dataType) {
- case MEASUREMENT:
- try {
- MeasurementDataNumeric dataNumeric = new MeasurementDataNumeric(
- request, new Double(value.toString()));
- report.addData(dataNumeric);
- } catch (NumberFormatException e) {
- log
- .warn(
- "Measurement request: "
- + request.getName()
- + " did not return a numeric value from the Profile Service",
- e);
- }
- break;
- case TRAIT:
- MeasurementDataTrait dataTrait = new MeasurementDataTrait(request,
- String.valueOf(value));
- report.addData(dataTrait);
- break;
- default:
- throw new IllegalStateException(
- "Unsupported measurement data type: " + dataType);
- }
- }
-
- public OperationResult invokeOperation(String name, Configuration parameters)
- throws InterruptedException, Exception {
-
- ResourceType resourceType = context.getResourceType();
- OperationDefinition operationDefinition = ResourceTypeUtils
- .getOperationDefinition(resourceType, name);
-
- ManagedComponent component = loadComponent();
- Set<ManagedOperation> operations = component.getOperations();
-
- for (ManagedOperation operation : operations) {
- if (operation.getName().equals(name)) {
- MetaValue[] params = ConversionUtils
- .convertOperationsParametersToMetaValues(operation,
- parameters, operationDefinition);
- MetaValue operationResult = operation.invoke(params);
-
- OperationResult result = new OperationResult();
- ConversionUtils.convertManagedOperationResults(operation,
- operationResult, result.getComplexResults(),
- operationDefinition);
-
- return result;
- }
- }
- return null;
- }
+ componentName = context.getPluginConfiguration().getSimple(PlatformDiscoveryComponent.PLATFORM_COMPONENT_NAME)
+ .getStringValue();
+
+ ProfileServiceConnection connection = context.getParentResourceComponent().getConnection();
+
+ ManagementView managementView = connection.getManagementView();
+
+ ManagedDeployment deploy = managementView.getDeployment(deployName);
+ if (deploy != null) {
+ Map<String, ManagedComponent> components = deploy.getComponents();
+
+ return components.get(componentName);
+ }
+
+ return null;
+ }
+
+ public AvailabilityType getAvailability() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String[] parsePropertyName(String name) {
+
+ String[] ps;
+
+ if (name.indexOf('{') == -1) {
+ ps = new String[1];
+ ps[0] = name;
+ return ps;
+ }
+ name = name.substring(name.indexOf('{') + 1, name.indexOf('}'));
+ ps = name.split("\\.");
+
+ return ps;
+ }
+
+ protected Object getObjectProperty(Object value, String property) {
+
+ try {
+ PropertyDescriptor[] pds = Introspector.getBeanInfo(value.getClass()).getPropertyDescriptors();
+ for (PropertyDescriptor pd : pds) {
+ if (pd.getName().equals(property)) {
+ pd.getReadMethod().setAccessible(true);
+ value = pd.getReadMethod().invoke(value);
+ }
+ }
+ } catch (Exception e) {
+ log.error("Object " + value.toString() + " does not contain property " + property, e);
+ }
+
+ return value;
+ }
+
+ public void setMeasurementData(MeasurementReport report, Object value, MeasurementScheduleRequest request,
+ MeasurementDefinition measurementDefinition) {
+
+ DataType dataType = measurementDefinition.getDataType();
+ switch (dataType) {
+ case MEASUREMENT:
+ try {
+ MeasurementDataNumeric dataNumeric = new MeasurementDataNumeric(request, new Double(value.toString()));
+ report.addData(dataNumeric);
+ } catch (NumberFormatException e) {
+ log.warn("Measurement request: " + request.getName()
+ + " did not return a numeric value from the Profile Service", e);
+ }
+ break;
+ case TRAIT:
+ MeasurementDataTrait dataTrait = new MeasurementDataTrait(request, String.valueOf(value));
+ report.addData(dataTrait);
+ break;
+ default:
+ throw new IllegalStateException("Unsupported measurement data type: " + dataType);
+ }
+ }
+
+ public OperationResult invokeOperation(String name, Configuration parameters) throws InterruptedException,
+ Exception {
+
+ ResourceType resourceType = context.getResourceType();
+ OperationDefinition operationDefinition = ResourceTypeUtils.getOperationDefinition(resourceType, name);
+
+ ManagedComponent component = loadComponent();
+ Set<ManagedOperation> operations = component.getOperations();
+
+ for (ManagedOperation operation : operations) {
+ if (operation.getName().equals(name)) {
+ MetaValue[] params = ConversionUtils.convertOperationsParametersToMetaValues(operation, parameters,
+ operationDefinition);
+ MetaValue operationResult = operation.invoke(params);
+
+ OperationResult result = new OperationResult();
+ ConversionUtils.convertManagedOperationResults(operation, operationResult, result.getComplexResults(),
+ operationDefinition);
+
+ return result;
+ }
+ }
+ return null;
+ }
}
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/PlatformDiscoveryComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/PlatformDiscoveryComponent.java
index eddbd23..d930ebf 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/PlatformDiscoveryComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/PlatformDiscoveryComponent.java
@@ -5,11 +5,13 @@ import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.jboss.deployers.spi.management.ManagementView;
import org.jboss.managed.api.ComponentType;
import org.jboss.managed.api.ManagedComponent;
import org.jboss.managed.api.ManagedDeployment;
import org.jboss.profileservice.spi.NoSuchDeploymentException;
+
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.resource.ResourceType;
@@ -20,98 +22,82 @@ import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
import org.rhq.plugins.jbossas5.connection.ProfileServiceConnection;
import org.rhq.plugins.jbossas5.util.ManagedComponentUtils;
-public class PlatformDiscoveryComponent implements
- ResourceDiscoveryComponent<ApplicationServerComponent> {
+public class PlatformDiscoveryComponent implements ResourceDiscoveryComponent<ApplicationServerComponent<?>> {
- private final Log log = LogFactory.getLog(this.getClass());
- public static String PLATFORM_DEPLOYMENT_NAME = "deployment";
- public static String PLATFORM_COMPONENT_NAME = "componentName";
+ private final Log log = LogFactory.getLog(this.getClass());
+ public static String PLATFORM_DEPLOYMENT_NAME = "deployment";
+ public static String PLATFORM_COMPONENT_NAME = "componentName";
- public Set discoverResources(
- ResourceDiscoveryContext<ApplicationServerComponent> context)
- throws InvalidPluginConfigurationException, Exception {
+ public Set discoverResources(ResourceDiscoveryContext<ApplicationServerComponent<?>> context)
+ throws InvalidPluginConfigurationException, Exception {
- log.trace("Discovering " + context.getResourceType().getName()
- + " Resources...");
+ log.trace("Discovering " + context.getResourceType().getName() + " Resources...");
- Set<DiscoveredResourceDetails> resources = new HashSet<DiscoveredResourceDetails>();
- ResourceType resourceType = context.getResourceType();
+ Set<DiscoveredResourceDetails> resources = new HashSet<DiscoveredResourceDetails>();
+ ResourceType resourceType = context.getResourceType();
- Set<ManagedComponent> components = new HashSet<ManagedComponent>();
+ Set<ManagedComponent> components = new HashSet<ManagedComponent>();
- Configuration config = context.getDefaultPluginConfiguration();
+ Configuration config = context.getDefaultPluginConfiguration();
- String deployName = config.getSimple(
- PlatformDiscoveryComponent.PLATFORM_DEPLOYMENT_NAME)
- .getStringValue();
+ String deployName = config.getSimple(PlatformDiscoveryComponent.PLATFORM_DEPLOYMENT_NAME).getStringValue();
- String componentName = config.getSimple(
- PlatformDiscoveryComponent.PLATFORM_COMPONENT_NAME)
- .getStringValue();
+ String componentName = config.getSimple(PlatformDiscoveryComponent.PLATFORM_COMPONENT_NAME).getStringValue();
- components.addAll(addManagedDeploymentComponent(deployName,
- componentName, context));
+ components.addAll(addManagedDeploymentComponent(deployName, componentName, context));
- for (ManagedComponent component : components) {
+ for (ManagedComponent component : components) {
- ComponentType type = component.getType();
- String displayName;
+ ComponentType type = component.getType();
+ String displayName;
- try {
- displayName = (String) ManagedComponentUtils
- .getSimplePropertyValue(component, "name");
- } catch (IllegalStateException il) {
- displayName = component.getName();
- }
+ try {
+ displayName = (String) ManagedComponentUtils.getSimplePropertyValue(component, "name");
+ } catch (IllegalStateException il) {
+ displayName = component.getName();
+ }
- try {
- String resourceName = (String) component.getName();
+ try {
+ String resourceName = (String) component.getName();
- String resourceKey = component.getType() + "|"
- + type.getSubtype() + "|" + resourceName;
+ String resourceKey = component.getType() + "|" + type.getSubtype() + "|" + resourceName;
- String version = "";
- Configuration pluginConfig = new Configuration();
- pluginConfig.put(new PropertySimple(PLATFORM_DEPLOYMENT_NAME,
- deployName));
- pluginConfig.put(new PropertySimple(PLATFORM_COMPONENT_NAME,
- resourceName));
+ String version = "";
+ Configuration pluginConfig = new Configuration();
+ pluginConfig.put(new PropertySimple(PLATFORM_DEPLOYMENT_NAME, deployName));
+ pluginConfig.put(new PropertySimple(PLATFORM_COMPONENT_NAME, resourceName));
- resources.add(new DiscoveredResourceDetails(context
- .getResourceType(), resourceKey, displayName, version,
- resourceType.getDescription(), pluginConfig, null));
- } catch (Exception e) {
- log.error("failed discovering the platform Mbeans", e);
- }
- }
+ resources.add(new DiscoveredResourceDetails(context.getResourceType(), resourceKey, displayName,
+ version, resourceType.getDescription(), pluginConfig, null));
+ } catch (Exception e) {
+ log.error("failed discovering the platform Mbeans", e);
+ }
+ }
- return resources;
- }
+ return resources;
+ }
- private Set<ManagedComponent> addManagedDeploymentComponent(
- String deployName, String componentName,
- ResourceDiscoveryContext<ApplicationServerComponent> context)
- throws NoSuchDeploymentException {
+ private Set<ManagedComponent> addManagedDeploymentComponent(String deployName, String componentName,
+ ResourceDiscoveryContext<ApplicationServerComponent<?>> context) throws NoSuchDeploymentException {
- ProfileServiceConnection connection = context
- .getParentResourceComponent().getConnection();
+ ProfileServiceConnection connection = context.getParentResourceComponent().getConnection();
- ManagementView managementView = connection.getManagementView();
+ ManagementView managementView = connection.getManagementView();
- Set<ManagedComponent> components = new HashSet<ManagedComponent>();
- ManagedDeployment deploy = managementView.getDeployment(deployName);
- if (deploy != null) {
- if (componentName == null || componentName.equals("*"))
- components.addAll(deploy.getComponents().values());
- else {
- for (ManagedComponent comp : deploy.getComponents().values()) {
- if (comp.getName().equals(componentName))
- components.add(comp);
- }
- }
- }
+ Set<ManagedComponent> components = new HashSet<ManagedComponent>();
+ ManagedDeployment deploy = managementView.getDeployment(deployName);
+ if (deploy != null) {
+ if (componentName == null || componentName.equals("*"))
+ components.addAll(deploy.getComponents().values());
+ else {
+ for (ManagedComponent comp : deploy.getComponents().values()) {
+ if (comp.getName().equals(componentName))
+ components.add(comp);
+ }
+ }
+ }
- return components;
- }
+ return components;
+ }
}
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ProfileServiceComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ProfileServiceComponent.java
index 4e13a96..afd73a3 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ProfileServiceComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ProfileServiceComponent.java
@@ -33,7 +33,7 @@ import org.rhq.plugins.jmx.JMXComponent;
/**
* @author Ian Springer
*/
-public interface ProfileServiceComponent<T extends ResourceComponent> extends ResourceComponent<T>, JMXComponent<T> {
+public interface ProfileServiceComponent<T extends ResourceComponent<?>> extends ResourceComponent<T>, JMXComponent<T> {
@Nullable
ProfileServiceConnection getConnection();
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/WebApplicationContextComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/WebApplicationContextComponent.java
index 9c5f938..0d96b2b 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/WebApplicationContextComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/WebApplicationContextComponent.java
@@ -23,7 +23,6 @@
package org.rhq.plugins.jbossas5;
import java.io.File;
-import java.util.LinkedHashSet;
import java.util.Set;
import org.apache.commons.logging.Log;
@@ -53,8 +52,7 @@ import org.rhq.plugins.jbossas5.util.ResourceComponentUtils;
*
* @author Ian Springer
*/
-public class WebApplicationContextComponent extends ManagedComponentComponent
-{
+public class WebApplicationContextComponent extends ManagedComponentComponent {
public static final String VIRTUAL_HOST_PROPERTY = "virtualHost";
public static final String CONTEXT_PATH_PROPERTY = "contextPath";
@@ -65,12 +63,10 @@ public class WebApplicationContextComponent extends ManagedComponentComponent
private static final String CLUSTERED_TRAIT = "clustered";
private static final String DISTRIBUTABLE_MANAGED_PROPERTY = "Distributable";
-
+
// A regex for the names of all MBean:Servlet components for a WAR.
- private static final String SERVLET_COMPONENT_NAMES_REGEX_TEMPLATE =
- "jboss.web:J2EEApplication=none,J2EEServer=none,"
- + "WebModule=//%" + VIRTUAL_HOST_PROPERTY + "%"
- + "%" + CONTEXT_PATH_PROPERTY + "%,j2eeType=Servlet,name=[^,]+";
+ private static final String SERVLET_COMPONENT_NAMES_REGEX_TEMPLATE = "jboss.web:J2EEApplication=none,J2EEServer=none,"
+ + "WebModule=//%" + VIRTUAL_HOST_PROPERTY + "%" + "%" + CONTEXT_PATH_PROPERTY + "%,j2eeType=Servlet,name=[^,]+";
private static final String SERVLET_METRIC_PREFIX = "Servlet.";
@@ -87,15 +83,13 @@ public class WebApplicationContextComponent extends ManagedComponentComponent
private ResponseTimeLogParser logParser;
private boolean clustered;
-
+
@Override
- public void start(ResourceContext<ProfileServiceComponent> resourceContext) throws Exception
- {
+ public void start(ResourceContext<ProfileServiceComponent<?>> resourceContext) throws Exception {
super.start(resourceContext);
Configuration pluginConfig = getResourceContext().getPluginConfiguration();
- this.servletComponentNamesRegex =
- ResourceComponentUtils.replacePropertyExpressionsInTemplate(SERVLET_COMPONENT_NAMES_REGEX_TEMPLATE,
- pluginConfig);
+ this.servletComponentNamesRegex = ResourceComponentUtils.replacePropertyExpressionsInTemplate(
+ SERVLET_COMPONENT_NAMES_REGEX_TEMPLATE, pluginConfig);
ResponseTimeConfiguration responseTimeConfig = new ResponseTimeConfiguration(pluginConfig);
File logFile = responseTimeConfig.getLogFile();
if (logFile != null) {
@@ -111,80 +105,67 @@ public class WebApplicationContextComponent extends ManagedComponentComponent
clustered = distributable != null && distributable.booleanValue();
}
} catch (Exception e) {
- log.warn("Failed to determine whether the web app context " + resourceContext.getResourceKey() + " is clustered or not.", e);
+ log.warn("Failed to determine whether the web app context " + resourceContext.getResourceKey()
+ + " is clustered or not.", e);
}
}
@Override
- public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> requests)
- throws Exception
- {
+ public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> requests) throws Exception {
ProfileServiceComponent warComponent = getResourceContext().getParentResourceComponent();
ManagementView managementView = warComponent.getConnection().getManagementView();
-
+
ManagedComponent component = prepareForMetricCollection(requests);
- for (MeasurementScheduleRequest request : requests)
- {
+ for (MeasurementScheduleRequest request : requests) {
String metricName = request.getName();
- try
- {
- if (metricName.startsWith(SERVLET_METRIC_PREFIX))
- {
+ try {
+ if (metricName.startsWith(SERVLET_METRIC_PREFIX)) {
Double value = getServletMetric(managementView, metricName);
MeasurementDataNumeric metric = new MeasurementDataNumeric(request, value);
report.addData(metric);
- }
- else if (metricName.equals(VIRTUAL_HOST_TRAIT))
- {
+ } else if (metricName.equals(VIRTUAL_HOST_TRAIT)) {
Configuration pluginConfig = getResourceContext().getPluginConfiguration();
String virtualHost = pluginConfig.getSimple(VIRTUAL_HOST_PROPERTY).getStringValue();
MeasurementDataTrait trait = new MeasurementDataTrait(request, virtualHost);
report.addData(trait);
- }
- else if (metricName.equals(RESPONSE_TIME_METRIC)) {
- if (this.logParser != null) {
- try {
- CallTimeData callTimeData = new CallTimeData(request);
- this.logParser.parseLog(callTimeData);
- report.addData(callTimeData);
- } catch (Exception e) {
- log.error("Failed to retrieve HTTP call-time data.", e);
- }
- } else {
- log.error("The '" + RESPONSE_TIME_METRIC + "' metric is enabled for WAR resource '"
- + getComponentName() + "', but no value is defined for the '"
- + RESPONSE_TIME_LOG_FILE_CONFIG_PROP + "' connection property.");
- // TODO: Communicate this error back to the server for display in the GUI.
- }
- }
- else if (metricName.equals(CLUSTERED_TRAIT))
- {
+ } else if (metricName.equals(RESPONSE_TIME_METRIC)) {
+ if (this.logParser != null) {
+ try {
+ CallTimeData callTimeData = new CallTimeData(request);
+ this.logParser.parseLog(callTimeData);
+ report.addData(callTimeData);
+ } catch (Exception e) {
+ log.error("Failed to retrieve HTTP call-time data.", e);
+ }
+ } else {
+ log.error("The '" + RESPONSE_TIME_METRIC + "' metric is enabled for WAR resource '"
+ + getComponentName() + "', but no value is defined for the '"
+ + RESPONSE_TIME_LOG_FILE_CONFIG_PROP + "' connection property.");
+ // TODO: Communicate this error back to the server for display in the GUI.
+ }
+ } else if (metricName.equals(CLUSTERED_TRAIT)) {
MeasurementDataTrait trait = new MeasurementDataTrait(request, Boolean.toString(clustered));
report.addData(trait);
- }
- else
- {
+ } else {
String metricNameToUse = metricName;
if (clustered && !"runState".equals(metricName)) {
metricNameToUse = toUpperCaseFirstLetter(metricName);
}
-
+
String value = getMeasurement(component, metricNameToUse);
-
+
if (clustered && !"runState".equals(metricName) && value == null) {
//hmm... so it looks like https://issues.jboss.org/browse/JBPAPP-7172 has been fixed
//and we're getting the metric names in lower case even for clustered contexts
value = getMeasurement(component, metricName);
}
-
+
addValueToMeasurementReport(report, request, value);
}
- }
- catch (Exception e)
- {
+ } catch (Exception e) {
// Don't let one bad apple spoil the barrel.
log.error("Failed to collect metric '" + metricName + "' for " + getResourceContext().getResourceType()
- + " Resource with key " + getResourceContext().getResourceKey() + ".", e);
+ + " Resource with key " + getResourceContext().getResourceKey() + ".", e);
}
}
}
@@ -192,99 +173,78 @@ public class WebApplicationContextComponent extends ManagedComponentComponent
public boolean isClustered() {
return clustered;
}
-
- private Double getServletMetric(ManagementView managementView, String metricName) throws Exception
- {
+
+ private Double getServletMetric(ManagementView managementView, String metricName) throws Exception {
ComponentType servletComponentType = MoreKnownComponentTypes.MBean.Servlet.getType();
//Set<ManagedComponent> servletComponents = managementView.getMatchingComponents(this.servletComponentNamesRegex,
// servletComponentType, new RegularExpressionNameMatcher());
Set<ManagedComponent> servletComponents = ManagedComponentUtils.getManagedComponents(managementView,
- servletComponentType, this.servletComponentNamesRegex, new RegularExpressionNameMatcher());
+ servletComponentType, this.servletComponentNamesRegex, new RegularExpressionNameMatcher());
long min = Long.MAX_VALUE;
long max = 0;
long processingTime = 0;
int requestCount = 0;
int errorCount = 0;
- for (ManagedComponent servletComponent : servletComponents)
- {
- if (metricName.equals(SERVLET_MINIMUM_RESPONSE_TIME_METRIC))
- {
- Long longValue = (Long)ManagedComponentUtils.getSimplePropertyValue(servletComponent, "minTime");
+ for (ManagedComponent servletComponent : servletComponents) {
+ if (metricName.equals(SERVLET_MINIMUM_RESPONSE_TIME_METRIC)) {
+ Long longValue = (Long) ManagedComponentUtils.getSimplePropertyValue(servletComponent, "minTime");
if (longValue < min)
min = longValue;
- }
- else if (metricName.equals(SERVLET_MAXIMUM_RESPONSE_TIME_METRIC))
- {
- Long longValue = (Long)ManagedComponentUtils.getSimplePropertyValue(servletComponent, "maxTime");
+ } else if (metricName.equals(SERVLET_MAXIMUM_RESPONSE_TIME_METRIC)) {
+ Long longValue = (Long) ManagedComponentUtils.getSimplePropertyValue(servletComponent, "maxTime");
if (longValue > max)
max = longValue;
- }
- else if (metricName.equals(SERVLET_AVERAGE_RESPONSE_TIME_METRIC))
- {
- Long longValue = (Long)ManagedComponentUtils.getSimplePropertyValue(servletComponent, "processingTime");
+ } else if (metricName.equals(SERVLET_AVERAGE_RESPONSE_TIME_METRIC)) {
+ Long longValue = (Long) ManagedComponentUtils
+ .getSimplePropertyValue(servletComponent, "processingTime");
processingTime += longValue;
- Integer intValue = (Integer)ManagedComponentUtils.getSimplePropertyValue(servletComponent, "requestCount");
+ Integer intValue = (Integer) ManagedComponentUtils.getSimplePropertyValue(servletComponent,
+ "requestCount");
requestCount += intValue;
- }
- else if (metricName.equals(SERVLET_REQUEST_COUNT_METRIC))
- {
- Integer intValue = (Integer)ManagedComponentUtils.getSimplePropertyValue(servletComponent, "requestCount");
+ } else if (metricName.equals(SERVLET_REQUEST_COUNT_METRIC)) {
+ Integer intValue = (Integer) ManagedComponentUtils.getSimplePropertyValue(servletComponent,
+ "requestCount");
requestCount += intValue;
- }
- else if (metricName.equals(SERVLET_ERROR_COUNT_METRIC))
- {
- Integer intValue = (Integer)ManagedComponentUtils.getSimplePropertyValue(servletComponent, "errorCount");
+ } else if (metricName.equals(SERVLET_ERROR_COUNT_METRIC)) {
+ Integer intValue = (Integer) ManagedComponentUtils.getSimplePropertyValue(servletComponent,
+ "errorCount");
errorCount += intValue;
- }
- else if (metricName.equals(SERVLET_TOTAL_RESPONSE_TIME_METRIC))
- {
- Long longValue = (Long)ManagedComponentUtils.getSimplePropertyValue(servletComponent, "processingTime");
+ } else if (metricName.equals(SERVLET_TOTAL_RESPONSE_TIME_METRIC)) {
+ Long longValue = (Long) ManagedComponentUtils
+ .getSimplePropertyValue(servletComponent, "processingTime");
processingTime += longValue;
}
}
Double result;
- if (metricName.equals(SERVLET_AVERAGE_RESPONSE_TIME_METRIC))
- {
- result = (requestCount > 0) ? ((double)processingTime / (double)requestCount) : Double.NaN;
- }
- else if (metricName.equals(SERVLET_MINIMUM_RESPONSE_TIME_METRIC))
- {
- result = (min != Long.MAX_VALUE) ? (double)min : Double.NaN;
- }
- else if (metricName.equals(SERVLET_MAXIMUM_RESPONSE_TIME_METRIC))
- {
- result = (max != 0) ? (double)max : Double.NaN;
- }
- else if (metricName.equals(SERVLET_ERROR_COUNT_METRIC))
- {
- result = (double)errorCount;
- }
- else if (metricName.equals(SERVLET_REQUEST_COUNT_METRIC))
- {
- result = (double)requestCount;
- }
- else if (metricName.equals(SERVLET_TOTAL_RESPONSE_TIME_METRIC))
- {
- result = (double)processingTime;
- }
- else
- {
+ if (metricName.equals(SERVLET_AVERAGE_RESPONSE_TIME_METRIC)) {
+ result = (requestCount > 0) ? ((double) processingTime / (double) requestCount) : Double.NaN;
+ } else if (metricName.equals(SERVLET_MINIMUM_RESPONSE_TIME_METRIC)) {
+ result = (min != Long.MAX_VALUE) ? (double) min : Double.NaN;
+ } else if (metricName.equals(SERVLET_MAXIMUM_RESPONSE_TIME_METRIC)) {
+ result = (max != 0) ? (double) max : Double.NaN;
+ } else if (metricName.equals(SERVLET_ERROR_COUNT_METRIC)) {
+ result = (double) errorCount;
+ } else if (metricName.equals(SERVLET_REQUEST_COUNT_METRIC)) {
+ result = (double) requestCount;
+ } else if (metricName.equals(SERVLET_TOTAL_RESPONSE_TIME_METRIC)) {
+ result = (double) processingTime;
+ } else {
// fallback
result = Double.NaN;
}
return result;
}
-
+
private static String toUpperCaseFirstLetter(String name) {
if (name == null || name.length() == 0) {
return name;
}
-
+
char first = name.charAt(0);
-
+
return Character.toUpperCase(first) + name.substring(1);
}
}
\ No newline at end of file
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/script/ScriptComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/script/ScriptComponent.java
index fd283f5..36682c4 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/script/ScriptComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/script/ScriptComponent.java
@@ -40,6 +40,7 @@ import java.util.regex.Pattern;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jetbrains.annotations.NotNull;
+
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.content.PackageDetailsKey;
@@ -66,7 +67,6 @@ import org.rhq.core.util.MessageDigestGenerator;
import org.rhq.plugins.jbossas5.ApplicationServerComponent;
import org.rhq.plugins.jbossas5.ApplicationServerPluginConfigurationProperties;
import org.rhq.plugins.jbossas5.connection.ProfileServiceConnection;
-import org.rhq.plugins.jbossas5.deploy.Deployer;
import org.rhq.plugins.jbossas5.deploy.RemoteDownloader;
import org.rhq.plugins.jbossas5.deploy.ScriptDeployer;
@@ -76,13 +76,14 @@ import org.rhq.plugins.jbossas5.deploy.ScriptDeployer;
* @author Ian Springer
* @author Lukas Krejci
*/
-public class ScriptComponent implements ResourceComponent<ApplicationServerComponent>, OperationFacet, DeleteResourceFacet, ContentFacet {
+public class ScriptComponent implements ResourceComponent<ApplicationServerComponent<?>>, OperationFacet,
+ DeleteResourceFacet, ContentFacet {
public static final String TYPE_NAME = "Script";
public static final String PACKAGE_TYPE = "script";
-
+
public static final String PATH_CONFIG_PROP = "path";
public static final String ENVIRONMENT_VARIABLES_CONFIG_PROP = "environmentVariables";
-
+
public static final String EXECUTE_OPERATION = "execute";
public static final String COMMAND_LINE_ARGUMENTS_PARAM_PROP = "commandLineArguments";
@@ -92,12 +93,12 @@ public class ScriptComponent implements ResourceComponent<ApplicationServerCompo
private static final String PACKAGE_VERSION = "none";
private static final String PACKAGE_ARCHITECTURE = "noarch";
-
+
private final Log log = LogFactory.getLog(this.getClass());
- private ResourceContext<ApplicationServerComponent> resourceContext;
+ private ResourceContext<ApplicationServerComponent<?>> resourceContext;
- public void start(ResourceContext<ApplicationServerComponent> resourceContext) {
+ public void start(ResourceContext<ApplicationServerComponent<?>> resourceContext) {
this.resourceContext = resourceContext;
}
@@ -160,14 +161,14 @@ public class ScriptComponent implements ResourceComponent<ApplicationServerCompo
public void deleteResource() throws Exception {
String path = resourceContext.getPluginConfiguration().getSimpleValue(PATH_CONFIG_PROP, null);
-
+
File f = new File(path);
-
+
if (!f.delete()) {
throw new IOException("Failed to delete the file on the configured path: " + path);
}
}
-
+
public List<DeployPackageStep> generateInstallationSteps(ResourcePackageDetails packageDetails) {
return null;
}
@@ -180,24 +181,28 @@ public class ScriptComponent implements ResourceComponent<ApplicationServerCompo
response.setOverallRequestErrorMessage("Only one script can be updated at a time.");
return response;
}
-
+
try {
- String jbossHomeDir = resourceContext.getParentResourceComponent().getResourceContext().getPluginConfiguration().getSimpleValue(ApplicationServerPluginConfigurationProperties.HOME_DIR, null);
+ String jbossHomeDir = resourceContext.getParentResourceComponent().getResourceContext()
+ .getPluginConfiguration().getSimpleValue(ApplicationServerPluginConfigurationProperties.HOME_DIR, null);
SystemInfo systemInfo = resourceContext.getSystemInformation();
- ProfileServiceConnection profileServiceConnection = resourceContext.getParentResourceComponent().getConnection();
-
- ScriptDeployer deployer = new ScriptDeployer(jbossHomeDir, systemInfo, new RemoteDownloader(resourceContext, true, profileServiceConnection));
+ ProfileServiceConnection profileServiceConnection = resourceContext.getParentResourceComponent()
+ .getConnection();
+
+ ScriptDeployer deployer = new ScriptDeployer(jbossHomeDir, systemInfo, new RemoteDownloader(
+ resourceContext, true, profileServiceConnection));
ResourcePackageDetails packageDetails = packages.iterator().next();
-
- DeployIndividualPackageResponse scriptUpdateResult = deployer.update(packageDetails, resourceContext.getResourceType());
-
- response.setOverallRequestResult(scriptUpdateResult.getResult());
- response.addPackageResponse(scriptUpdateResult);
+
+ DeployIndividualPackageResponse scriptUpdateResult = deployer.update(packageDetails,
+ resourceContext.getResourceType());
+
+ response.setOverallRequestResult(scriptUpdateResult.getResult());
+ response.addPackageResponse(scriptUpdateResult);
} catch (Exception e) {
response.setOverallRequestErrorMessage(e.getMessage());
response.setOverallRequestResult(ContentResponseResult.FAILURE);
}
-
+
return response;
}
@@ -209,8 +214,9 @@ public class ScriptComponent implements ResourceComponent<ApplicationServerCompo
Set<ResourcePackageDetails> results = new HashSet<ResourcePackageDetails>();
if (PACKAGE_TYPE.equals(type.getName())) {
File scriptFile = new File(resourceContext.getResourceKey());
-
- PackageDetailsKey key = new PackageDetailsKey(scriptFile.getName(), PACKAGE_VERSION, PACKAGE_TYPE, PACKAGE_ARCHITECTURE);
+
+ PackageDetailsKey key = new PackageDetailsKey(scriptFile.getName(), PACKAGE_VERSION, PACKAGE_TYPE,
+ PACKAGE_ARCHITECTURE);
ResourcePackageDetails details = new ResourcePackageDetails(key);
details.setDisplayName(scriptFile.getName());
details.setFileName(scriptFile.getAbsolutePath());
@@ -219,24 +225,26 @@ public class ScriptComponent implements ResourceComponent<ApplicationServerCompo
details.setFileCreatedDate(scriptFile.lastModified());
details.setInstallationTimestamp(System.currentTimeMillis());
try {
- details.setSHA256(new MessageDigestGenerator(MessageDigestGenerator.SHA_256).calcDigestString(scriptFile));
+ details.setSHA256(new MessageDigestGenerator(MessageDigestGenerator.SHA_256)
+ .calcDigestString(scriptFile));
} catch (IOException e) {
log.warn("Failed to compute the SHA256 digest of the script: " + scriptFile.getAbsolutePath(), e);
}
results.add(details);
}
-
+
return results;
}
public InputStream retrievePackageBits(ResourcePackageDetails packageDetails) {
- String jbossHomeDir = resourceContext.getParentResourceComponent().getResourceContext().getPluginConfiguration().getSimpleValue(ApplicationServerPluginConfigurationProperties.HOME_DIR, null);
+ String jbossHomeDir = resourceContext.getParentResourceComponent().getResourceContext()
+ .getPluginConfiguration().getSimpleValue(ApplicationServerPluginConfigurationProperties.HOME_DIR, null);
File binDir = new File(jbossHomeDir, "bin");
String scriptName = packageDetails.getKey().getName();
-
+
File script = new File(binDir, scriptName);
-
+
try {
return new FileInputStream(script);
} catch (FileNotFoundException e) {
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/script/ScriptDiscoveryComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/script/ScriptDiscoveryComponent.java
index 8010081..a9d6166 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/script/ScriptDiscoveryComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/script/ScriptDiscoveryComponent.java
@@ -31,6 +31,7 @@ import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.resource.ResourceUpgradeReport;
@@ -50,18 +51,18 @@ import org.rhq.plugins.jbossas5.ApplicationServerComponent;
*
* @author Ian Springer
*/
-public class ScriptDiscoveryComponent implements ResourceDiscoveryComponent<ApplicationServerComponent>,
- ManualAddFacet<ApplicationServerComponent>, ResourceUpgradeFacet<ApplicationServerComponent> {
+public class ScriptDiscoveryComponent implements ResourceDiscoveryComponent<ApplicationServerComponent<?>>,
+ ManualAddFacet<ApplicationServerComponent<?>>, ResourceUpgradeFacet<ApplicationServerComponent<?>> {
private final Log log = LogFactory.getLog(this.getClass());
static final String SERVER_HOME_DIR = "homeDir";
public Set<DiscoveredResourceDetails> discoverResources(
- ResourceDiscoveryContext<ApplicationServerComponent> discoveryContext)
+ ResourceDiscoveryContext<ApplicationServerComponent<?>> discoveryContext)
throws InvalidPluginConfigurationException {
Set<DiscoveredResourceDetails> resources = new HashSet<DiscoveredResourceDetails>();
- ResourceContext parentResourceContext = discoveryContext.getParentResourceContext();
+ ResourceContext<?> parentResourceContext = discoveryContext.getParentResourceContext();
File binDir = getServerBinDirectory(parentResourceContext);
log.debug("Searching for scripts beneath JBossAS server bin directory (" + binDir + ")...");
ScriptFileFinder scriptFileFinder = new ScriptFileFinder(discoveryContext.getSystemInformation(), binDir);
@@ -81,8 +82,8 @@ public class ScriptDiscoveryComponent implements ResourceDiscoveryComponent<Appl
}
public DiscoveredResourceDetails discoverResource(Configuration pluginConfig,
- ResourceDiscoveryContext<ApplicationServerComponent> discoveryContext)
- throws InvalidPluginConfigurationException {
+ ResourceDiscoveryContext<ApplicationServerComponent<?>> discoveryContext)
+ throws InvalidPluginConfigurationException {
File path = new File(pluginConfig.getSimple(ScriptComponent.PATH_CONFIG_PROP).getStringValue());
validatePath(path);
@@ -90,12 +91,12 @@ public class ScriptDiscoveryComponent implements ResourceDiscoveryComponent<Appl
File binDir = getServerBinDirectory(parentResourceContext);
DiscoveredResourceDetails resource = createResourceDetails(discoveryContext, pluginConfig, binDir);
log.debug("Manually added script service: " + resource);
-
+
return resource;
}
@Override
- public ResourceUpgradeReport upgrade(ResourceUpgradeContext<ApplicationServerComponent> upgradeContext) {
+ public ResourceUpgradeReport upgrade(ResourceUpgradeContext<ApplicationServerComponent<?>> upgradeContext) {
String inventoriedResourceKey = upgradeContext.getResourceKey();
ResourceContext<?> parentResourceContext = upgradeContext.getParentResourceContext();
@@ -124,8 +125,8 @@ public class ScriptDiscoveryComponent implements ResourceDiscoveryComponent<Appl
}
private static String buildResourceKey(String scriptPath, File binDir) {
- return (scriptPath.startsWith(binDir.getPath())) ? scriptPath.substring(binDir.getPath().length() + 1) :
- scriptPath;
+ return (scriptPath.startsWith(binDir.getPath())) ? scriptPath.substring(binDir.getPath().length() + 1)
+ : scriptPath;
}
private void validatePath(File path) {
@@ -164,7 +165,7 @@ public class ScriptDiscoveryComponent implements ResourceDiscoveryComponent<Appl
}
private DiscoveredResourceDetails createResourceDetails(
- ResourceDiscoveryContext<ApplicationServerComponent> discoveryContext, Configuration pluginConfig,
+ ResourceDiscoveryContext<ApplicationServerComponent<?>> discoveryContext, Configuration pluginConfig,
File binDir) {
String path = pluginConfig.getSimple(ScriptComponent.PATH_CONFIG_PROP).getStringValue();
String key = buildResourceKey(path, binDir);
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/AbstractBaseDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/AbstractBaseDiscovery.java
index daa0447..49fabef 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/AbstractBaseDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/AbstractBaseDiscovery.java
@@ -40,7 +40,7 @@ import org.rhq.core.system.ProcessInfo;
* in the area of processes and host.xml
* @author Heiko W. Rupp
*/
-public abstract class AbstractBaseDiscovery<T extends ResourceComponent> implements ResourceDiscoveryComponent<T> {
+public abstract class AbstractBaseDiscovery<T extends ResourceComponent<?>> implements ResourceDiscoveryComponent<T> {
static final String DORG_JBOSS_BOOT_LOG_FILE = "-Dorg.jboss.boot.log.file=";
private static final String DJBOSS_SERVER_HOME_DIR = "-Djboss.home.dir";
static final int DEFAULT_MGMT_PORT = 9990;
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
index 0eb49db..0ad794c 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java
@@ -70,7 +70,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-public class BaseComponent implements ResourceComponent, MeasurementFacet, ConfigurationFacet, DeleteResourceFacet,
+public class BaseComponent<T extends ResourceComponent<?>> implements ResourceComponent<T>, MeasurementFacet, ConfigurationFacet, DeleteResourceFacet,
CreateChildResourceFacet, OperationFacet
{
private static final String INTERNAL = "_internal:";
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
index 7584a68..9b3e3a3 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/SubsystemDiscovery.java
@@ -18,16 +18,6 @@
*/
package org.rhq.modules.plugins.jbossas7;
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
-import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
-import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
-import org.rhq.modules.plugins.jbossas7.json.Address;
-import org.rhq.modules.plugins.jbossas7.json.ReadChildrenNames;
-import org.rhq.modules.plugins.jbossas7.json.ReadResource;
-import org.rhq.modules.plugins.jbossas7.json.Result;
-
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
@@ -39,6 +29,16 @@ import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+import org.rhq.modules.plugins.jbossas7.json.Address;
+import org.rhq.modules.plugins.jbossas7.json.ReadChildrenNames;
+import org.rhq.modules.plugins.jbossas7.json.ReadResource;
+import org.rhq.modules.plugins.jbossas7.json.Result;
+
/**
* Discover subsystems. We need to distinguish two cases denoted by the path
* plugin config:
@@ -55,28 +55,26 @@ import org.codehaus.jackson.map.ObjectMapper;
*
* @author Heiko W. Rupp
*/
-@SuppressWarnings("unused")
-public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseComponent> {
+public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseComponent<?>> {
private final Log log = LogFactory.getLog(this.getClass());
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<BaseComponent> context)
- throws Exception {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<BaseComponent<?>> context)
+ throws Exception {
Set<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>();
ObjectMapper mapper = new ObjectMapper();
- mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
- mapper.configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING,true);
+ mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ mapper.configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING, true);
BaseComponent parentComponent = context.getParentResourceComponent();
ASConnection connection = parentComponent.getASConnection();
-
Configuration config = context.getDefaultPluginConfiguration();
String confPath = config.getSimpleValue("path", "");
- if (confPath==null || confPath.isEmpty()) {
- log.error("Path plugin config is null for ResourceType [" + context.getResourceType().getName() +"].");
+ if (confPath == null || confPath.isEmpty()) {
+ log.error("Path plugin config is null for ResourceType [" + context.getResourceType().getName() + "].");
return details;
}
@@ -89,7 +87,7 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
// Construct the full path including the parent
String path;
String parentPath = parentComponent.getPath();
- if (parentPath==null || parentPath.isEmpty())
+ if (parentPath == null || parentPath.isEmpty())
path = "";
else
path = parentPath;
@@ -97,7 +95,6 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
if (Boolean.getBoolean("as7plugin.verbose"))
log.info("total path: [" + path + "]");
-
if (lookForChildren) {
// Looking for multiple resource of type 'childType'
@@ -105,11 +102,9 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
List<String> subTypes = new ArrayList<String>();
if (confPath.contains("|")) {
subTypes.addAll(Arrays.asList(confPath.split("\\|")));
- }
- else
+ } else
subTypes.add(confPath);
-
for (String cpath : subTypes) {
Address addr = new Address(parentPath);
@@ -128,31 +123,28 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
String resKey;
- if (path==null||path.isEmpty())
+ if (path == null || path.isEmpty())
resKey = newPath;
else {
if (path.startsWith(","))
path = path.substring(1);
- resKey = path + "," +cpath + "=" + val;
+ resKey = path + "," + cpath + "=" + val;
}
- PropertySimple pathProp = new PropertySimple("path",resKey);
+ PropertySimple pathProp = new PropertySimple("path", resKey);
config2.put(pathProp);
- DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
- context.getResourceType(), // DataType
- resKey, // Key
- val, // Name
- null, // Version
- context.getResourceType().getDescription(), // subsystem.description
- config2,
- null);
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(context.getResourceType(), // DataType
+ resKey, // Key
+ val, // Name
+ null, // Version
+ context.getResourceType().getDescription(), // subsystem.description
+ config2, null);
details.add(detail);
}
}
}
- }
- else {
+ } else {
// Single subsystem
path += "," + confPath;
if (path.startsWith(","))
@@ -163,17 +155,15 @@ public class SubsystemDiscovery implements ResourceDiscoveryComponent<BaseCompon
String resKey = path;
String name = resKey.substring(resKey.lastIndexOf("=") + 1);
Configuration config2 = context.getDefaultPluginConfiguration();
- PropertySimple pathProp = new PropertySimple("path",path);
+ PropertySimple pathProp = new PropertySimple("path", path);
config2.put(pathProp);
- DiscoveredResourceDetails detail = new DiscoveredResourceDetails(
- context.getResourceType(), // DataType
- path, // Key
- name, // Name
- null, // Version
- context.getResourceType().getDescription(), // Description
- config2,
- null);
+ DiscoveredResourceDetails detail = new DiscoveredResourceDetails(context.getResourceType(), // DataType
+ path, // Key
+ name, // Name
+ null, // Version
+ context.getResourceType().getDescription(), // Description
+ config2, null);
details.add(detail);
}
}
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/AbstractMessagingComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/AbstractMessagingComponent.java
index 7c48ed4..01077c9 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/AbstractMessagingComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/AbstractMessagingComponent.java
@@ -1,25 +1,25 @@
- /*
- * Jopr Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * 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 and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
+/*
+ * Jopr Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * 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 and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
package org.rhq.plugins.jbossas;
@@ -59,7 +59,7 @@ import org.rhq.plugins.jmx.MBeanResourceComponent;
* Common base class for Messaging related stuff
* @author Heiko W. Rupp
*/
-public abstract class AbstractMessagingComponent extends MBeanResourceComponent<JBossASServerComponent> implements
+public abstract class AbstractMessagingComponent extends MBeanResourceComponent<JBossASServerComponent<?>> implements
CreateChildResourceFacet {
private static final Pattern PROPERTY_PATTERN = Pattern.compile("^(.*:.*):(.*)$");
@@ -73,7 +73,7 @@ public abstract class AbstractMessagingComponent extends MBeanResourceComponent<
protected Log LOG = null;
- public void start(ResourceContext<JBossASServerComponent> resourceContext, XMLConfigurationEditor editor) {
+ public void start(ResourceContext<JBossASServerComponent<?>> resourceContext, XMLConfigurationEditor editor) {
super.start(resourceContext);
this.resourceType = resourceContext.getResourceType();
xmlEditor = editor;
@@ -126,7 +126,7 @@ public abstract class AbstractMessagingComponent extends MBeanResourceComponent<
JBossASServerComponent jasco = getOurJBossASComponent();
File deploymentFile = jasco.getDeploymentFilePath(resourceKey);
Configuration loadedConfiguration = xmlEditor.loadConfiguration(deploymentFile, this.name);
- if (loadedConfiguration==null)
+ if (loadedConfiguration == null)
return null;
String boundJNDIName = DeploymentUtility.getJndiNameBinding(getEmsBean());
loadedConfiguration.put(new PropertySimple("JNDIBinding", boundJNDIName));
@@ -158,9 +158,8 @@ public abstract class AbstractMessagingComponent extends MBeanResourceComponent<
String mBeanName = report.getConfiguration().getSimpleValue(MBEAN_NAME_PROP, null);
boolean mBeanNameChanged = false;
if (!mBeanName.equals(this.name)) {
- LOG
- .info("The MBEan Name for this Topic/Queue has been changed. This change will appear in the <mbean> tag for"
- + "this Topic/Queue.");
+ LOG.info("The MBEan Name for this Topic/Queue has been changed. This change will appear in the <mbean> tag for"
+ + "this Topic/Queue.");
// User has changed the name, so update the plugin configuration.
PropertySimple nameProp = getResourceContext().getPluginConfiguration().getSimple(PLUGIN_CONFIG_NAME_PROP);
@@ -169,8 +168,7 @@ public abstract class AbstractMessagingComponent extends MBeanResourceComponent<
}
if ((deploymentFile == null) || !deploymentFile.exists()) {
- deploymentFile = new File(jasco.getConfigurationPath(), name
- + ".xml");
+ deploymentFile = new File(jasco.getConfigurationPath(), name + ".xml");
}
xmlEditor.updateConfiguration(deploymentFile, this.name, report);
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/AbstractMessagingDiscoveryComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/AbstractMessagingDiscoveryComponent.java
index 6c247aa..4d1d19d 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/AbstractMessagingDiscoveryComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/AbstractMessagingDiscoveryComponent.java
@@ -44,7 +44,7 @@ import org.rhq.plugins.jmx.ObjectNameQueryUtility;
* Abstract base class to discover JBossMessaging and JBossMQ related stuff
* @author Heiko W. Rupp
*/
-public abstract class AbstractMessagingDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent> {
+public abstract class AbstractMessagingDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent<?>> {
/**
* Do the real discovery
@@ -55,7 +55,7 @@ public abstract class AbstractMessagingDiscoveryComponent extends MBeanResourceD
* @param versionSource A string that determines how to obtain the version. See {@link #getVersionFromSource(org.mc4j.ems.connection.EmsConnection, String)}
* @return The details of a discovered resource.
*/
- protected Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent> context, String objectName, String resourceName, String resourceDescription, String versionSource) {
+ protected Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent<?>> context, String objectName, String resourceName, String resourceDescription, String versionSource) {
Set<DiscoveredResourceDetails> result = new HashSet<DiscoveredResourceDetails>();
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/ApplicationComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/ApplicationComponent.java
index 0bde101..a7c70db 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/ApplicationComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/ApplicationComponent.java
@@ -64,7 +64,7 @@ import org.rhq.plugins.jmx.MBeanResourceComponent;
*
* @author Ian Springer
*/
-public class ApplicationComponent extends MBeanResourceComponent<JBossASServerComponent> implements ContentFacet,
+public class ApplicationComponent extends MBeanResourceComponent<JBossASServerComponent<?>> implements ContentFacet,
DeleteResourceFacet, OperationFacet {
private static final String BACKUP_FILE_EXTENSION = ".rej";
public static final String RHQ_SHA256 = "RHQ-Sha256";
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/ApplicationDiscoveryComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/ApplicationDiscoveryComponent.java
index 5f56681..5368d1d 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/ApplicationDiscoveryComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/ApplicationDiscoveryComponent.java
@@ -31,6 +31,7 @@ import java.util.Map;
import java.util.Set;
import org.mc4j.ems.connection.EmsConnection;
+
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.resource.ResourceType;
@@ -46,10 +47,10 @@ import org.rhq.plugins.jmx.MBeanResourceDiscoveryComponent;
*
* @author Jason Dobies
*/
-public class ApplicationDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent> {
+public class ApplicationDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent<?>> {
// ResourceDiscoveryComponent Implementation --------------------------------------------
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent> context) {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent<?>> context) {
// Parent will discover deployed applications through JMX
Set<DiscoveredResourceDetails> jmxResources = super.discoverResources(context);
@@ -57,7 +58,8 @@ public class ApplicationDiscoveryComponent extends MBeanResourceDiscoveryCompone
JMXComponent parentComponent = context.getParentResourceComponent();
ApplicationServerComponent applicationServerComponent = (ApplicationServerComponent) parentComponent;
EmsConnection emsConnection = parentComponent.getEmsConnection();
- String deployDirectoryPath = generateDeployDirectory(applicationServerComponent.getConfigurationPath().getPath());
+ String deployDirectoryPath = generateDeployDirectory(applicationServerComponent.getConfigurationPath()
+ .getPath());
List<String> earNames = new ArrayList<String>();
for (DiscoveredResourceDetails jmxResource : jmxResources) {
@@ -95,14 +97,15 @@ public class ApplicationDiscoveryComponent extends MBeanResourceDiscoveryCompone
* @return set of all applications discovered on the file system; this should include at least some of the
* applications discovered through JMX as well
*/
- private Set<DiscoveredResourceDetails> discoverFileSystem(ResourceDiscoveryContext<JMXComponent> context) {
+ private Set<DiscoveredResourceDetails> discoverFileSystem(ResourceDiscoveryContext<JMXComponent<?>> context) {
Configuration defaultConfiguration = context.getDefaultPluginConfiguration();
// Find the location of the deploy directory
JMXComponent parentComponent = context.getParentResourceComponent();
ApplicationServerComponent applicationServerComponent = (ApplicationServerComponent) parentComponent;
- String deployDirectoryPath = generateDeployDirectory(applicationServerComponent.getConfigurationPath().getPath());
+ String deployDirectoryPath = generateDeployDirectory(applicationServerComponent.getConfigurationPath()
+ .getPath());
File deployDirectory = new File(deployDirectoryPath);
// Set up filter for application type
@@ -120,7 +123,8 @@ public class ApplicationDiscoveryComponent extends MBeanResourceDiscoveryCompone
String resourceName = file.getName();
String description = defaultConfiguration.getSimple("descriptionTemplate").getStringValue();
- DiscoveredResourceDetails resource = new DiscoveredResourceDetails(resourceType, resourceKey, resourceName, "", description, null, null);
+ DiscoveredResourceDetails resource = new DiscoveredResourceDetails(resourceType, resourceKey, resourceName,
+ "", description, null, null);
Configuration resourcePluginConfiguration = resource.getPluginConfiguration();
resourcePluginConfiguration.put(new PropertySimple("name", resourceName));
resourcePluginConfiguration.put(new PropertySimple("objectName", objectName));
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/ConnectionFactoryComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/ConnectionFactoryComponent.java
index 90473ae..5db0679 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/ConnectionFactoryComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/ConnectionFactoryComponent.java
@@ -42,7 +42,7 @@ import java.util.Set;
/**
* @author Mark Spritzler
*/
-public class ConnectionFactoryComponent extends MBeanResourceComponent<JBossASServerComponent> implements ConfigurationFacet,
+public class ConnectionFactoryComponent extends MBeanResourceComponent<JBossASServerComponent<?>> implements ConfigurationFacet,
DeleteResourceFacet {
private static final String CONNECTION_POOL_OBJECT_NAME = "jboss.jca:name=%NAME%,service=ManagedConnectionPool";
@@ -56,7 +56,7 @@ public class ConnectionFactoryComponent extends MBeanResourceComponent<JBossASSe
}
@Override
- public void start(ResourceContext<JBossASServerComponent> resourceContext) {
+ public void start(ResourceContext<JBossASServerComponent<?>> resourceContext) {
super.start(resourceContext);
this.name = getResourceContext().getPluginConfiguration().getSimpleValue("name", null);
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/DatasourceComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/DatasourceComponent.java
index 7e1bfd1..f98dce8 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/DatasourceComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/DatasourceComponent.java
@@ -45,7 +45,7 @@ import org.rhq.plugins.jmx.MBeanResourceComponent;
/**
* @author Greg Hinkle
*/
-public class DatasourceComponent extends MBeanResourceComponent<JBossASServerComponent> implements ConfigurationFacet,
+public class DatasourceComponent extends MBeanResourceComponent<JBossASServerComponent<?>> implements ConfigurationFacet,
DeleteResourceFacet, OperationFacet
{
private static final String CONNECTION_POOL_OBJECT_NAME = "jboss.jca:name=%NAME%,service=ManagedConnectionPool";
@@ -62,7 +62,7 @@ public class DatasourceComponent extends MBeanResourceComponent<JBossASServerCom
}
@Override
- public void start(ResourceContext<JBossASServerComponent> resourceContext)
+ public void start(ResourceContext<JBossASServerComponent<?>> resourceContext)
{
super.start(resourceContext);
this.name = getResourceContext().getPluginConfiguration().getSimpleValue("name", null);
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/EJB2BeanComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/EJB2BeanComponent.java
index 07fa732..2865441 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/EJB2BeanComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/EJB2BeanComponent.java
@@ -48,7 +48,7 @@ import org.rhq.plugins.jmx.MBeanResourceComponent;
* @author Ian Springer
* @author John Mazzitelli
*/
-public class EJB2BeanComponent extends MBeanResourceComponent<JBossASServerComponent> {
+public class EJB2BeanComponent extends MBeanResourceComponent<JBossASServerComponent<?>> {
private final Log log = LogFactory.getLog(EJB2BeanComponent.class);
private Map<Integer, CallTimeData> previousRawCallTimeDatas = new HashMap<Integer, CallTimeData>();
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/EJB3BeanComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/EJB3BeanComponent.java
index af96d54..302440a 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/EJB3BeanComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/EJB3BeanComponent.java
@@ -53,7 +53,7 @@ import org.rhq.plugins.jmx.MBeanResourceComponent;
* @author Greg Hinkle
* @author Ian Springer
*/
-public class EJB3BeanComponent extends MBeanResourceComponent<JBossASServerComponent> {
+public class EJB3BeanComponent extends MBeanResourceComponent<JBossASServerComponent<?>> {
private final Log log = LogFactory.getLog(EJB3BeanComponent.class);
private Map<Integer, CallTimeData> previousRawCallTimeDatas = new HashMap<Integer, CallTimeData>();
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/EmbeddedWarDiscoveryComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/EmbeddedWarDiscoveryComponent.java
index cbd027d..18a6b38 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/EmbeddedWarDiscoveryComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/EmbeddedWarDiscoveryComponent.java
@@ -39,37 +39,42 @@ import org.rhq.plugins.jmx.MBeanResourceDiscoveryComponent;
* @author Jason Dobies
* @author Ian Springer
*/
-public class EmbeddedWarDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent> {
+public class EmbeddedWarDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent<?>> {
// ResourceDiscoveryComponent Implementation --------------------------------------------
@Override
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent> context) {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent<?>> context) {
// Generate object name based on the parent EAR with the following format.
// jboss.management.local:J2EEApplication=rhq.ear,J2EEServer=Local,j2eeType=WebModule,name=on-portal.war
ApplicationComponent parentEarComponent = (ApplicationComponent) context.getParentResourceComponent();
String parentEar = parentEarComponent.getApplicationName();
- String objectName = "jboss.management.local:J2EEApplication=" + parentEar + ",J2EEServer=Local,j2eeType=WebModule,name=%name%";
+ String objectName = "jboss.management.local:J2EEApplication=" + parentEar
+ + ",J2EEServer=Local,j2eeType=WebModule,name=%name%";
// Stuff the object name into the default plugin configuration to look like any other JMX discovery
// where the objectName is read from the default plugin configuration
Configuration defaultPluginConfiguration = context.getDefaultPluginConfiguration();
- defaultPluginConfiguration.put(new PropertySimple(MBeanResourceDiscoveryComponent.PROPERTY_OBJECT_NAME, objectName));
+ defaultPluginConfiguration.put(new PropertySimple(MBeanResourceDiscoveryComponent.PROPERTY_OBJECT_NAME,
+ objectName));
// Call the base MBean discovery method to perform the actual discovery
- Set<DiscoveredResourceDetails> resourceDetails = super.performDiscovery(defaultPluginConfiguration, parentEarComponent, context.getResourceType());
+ Set<DiscoveredResourceDetails> resourceDetails = super.performDiscovery(defaultPluginConfiguration,
+ parentEarComponent, context.getResourceType());
// Once we've finished making sure the plugin configurations have the data we need:
// 1) First the stuff generic to all WARs...
JBossASServerComponent grandparentJBossASComponent = parentEarComponent.getParentResourceComponent();
- resourceDetails = WarDiscoveryHelper.initPluginConfigurations(grandparentJBossASComponent, resourceDetails,parentEarComponent);
+ resourceDetails = WarDiscoveryHelper.initPluginConfigurations(grandparentJBossASComponent, resourceDetails,
+ parentEarComponent);
// 2) Then the stuff specific to embedded WARs...
String parentEarFullFileName = parentEarComponent.getFileName() + File.separator;
for (DiscoveredResourceDetails resource : resourceDetails) {
Configuration pluginConfiguration = resource.getPluginConfiguration();
- pluginConfiguration.put(new PropertySimple(WarComponent.FILE_NAME, parentEarFullFileName + resource.getResourceName()));
+ pluginConfiguration.put(new PropertySimple(WarComponent.FILE_NAME, parentEarFullFileName
+ + resource.getResourceName()));
}
return resourceDetails;
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBMDestinationDiscoveryComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBMDestinationDiscoveryComponent.java
index ba4d76e..7d71e7b 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBMDestinationDiscoveryComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBMDestinationDiscoveryComponent.java
@@ -35,10 +35,10 @@ import org.rhq.plugins.jmx.MBeanResourceDiscoveryComponent;
* @author Heiko W. Rupp
*
*/
-public class JBMDestinationDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent> {
+public class JBMDestinationDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent<?>> {
@Override
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent> context) {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent<?>> context) {
// Discover Queues and Topics via JMX
Set<DiscoveredResourceDetails> results = super.discoverResources(context);
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASServerComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASServerComponent.java
index f241200..a8481cc 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASServerComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASServerComponent.java
@@ -90,6 +90,7 @@ import org.rhq.core.pluginapi.inventory.ApplicationServerComponent;
import org.rhq.core.pluginapi.inventory.CreateChildResourceFacet;
import org.rhq.core.pluginapi.inventory.CreateResourceReport;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
import org.rhq.core.pluginapi.operation.OperationFacet;
@@ -122,8 +123,8 @@ import org.rhq.plugins.jmx.ObjectNameQueryUtility;
* @author Jason Dobies
* @author Ian Springer
*/
-public class JBossASServerComponent implements MeasurementFacet, OperationFacet, JMXComponent,
- CreateChildResourceFacet, ApplicationServerComponent, ContentFacet, SupportFacet {
+public class JBossASServerComponent<T extends ResourceComponent<?>> implements MeasurementFacet, OperationFacet,
+ JMXComponent<T>, CreateChildResourceFacet, ApplicationServerComponent, ContentFacet, SupportFacet {
// Constants --------------------------------------------
private static final String LOCALHOST = "localhost";
@@ -404,8 +405,8 @@ public class JBossASServerComponent implements MeasurementFacet, OperationFacet,
// OperationFacet Implementation --------------------------------------------
public OperationResult invokeOperation(String name, Configuration configuration) throws InterruptedException {
- JBossASServerSupportedOperations operation = Enum.valueOf(JBossASServerSupportedOperations.class, name
- .toUpperCase());
+ JBossASServerSupportedOperations operation = Enum.valueOf(JBossASServerSupportedOperations.class,
+ name.toUpperCase());
return operationsDelegate.invoke(operation, configuration);
}
@@ -1149,14 +1150,15 @@ public class JBossASServerComponent implements MeasurementFacet, OperationFacet,
// Since the connection is attempted each time it's used, failure to connect could result in log
// file spamming. Log it once for every 10 consecutive times it's encountered.
if (consecutiveConnectionErrors % 10 == 0) {
- log.warn("Could not establish connection to the JBoss AS instance ["
- + (consecutiveConnectionErrors + 1) + "] times for resource ["
- + resourceContext.getResourceKey() + "]", e);
+ log.warn(
+ "Could not establish connection to the JBoss AS instance [" + (consecutiveConnectionErrors + 1)
+ + "] times for resource [" + resourceContext.getResourceKey() + "]", e);
}
if (log.isDebugEnabled())
- log.debug("Could not connect to the JBoss AS instance for resource ["
- + resourceContext.getResourceKey() + "]", e);
+ log.debug(
+ "Could not connect to the JBoss AS instance for resource [" + resourceContext.getResourceKey()
+ + "]", e);
consecutiveConnectionErrors++;
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatConnectorDiscoveryComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatConnectorDiscoveryComponent.java
index 1603c37..30068e8 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatConnectorDiscoveryComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatConnectorDiscoveryComponent.java
@@ -33,6 +33,7 @@ import org.apache.commons.logging.LogFactory;
import org.mc4j.ems.connection.EmsConnection;
import org.mc4j.ems.connection.bean.EmsBean;
import org.mc4j.ems.connection.bean.EmsBeanName;
+
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
@@ -48,13 +49,13 @@ import org.rhq.plugins.jmx.ObjectNameQueryUtility;
* @author Jason Dobies
* @author Ian Springer
*/
-public class JBossASTomcatConnectorDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent> {
+public class JBossASTomcatConnectorDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent<?>> {
private final Log log = LogFactory.getLog(this.getClass());
// MBeanResourceDiscoveryComponent Overridden Methods --------------------------------------------
@Override
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent> context) {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent<?>> context) {
Set<DiscoveredResourceDetails> resourceDetails = super.discoverResources(context);
/*
@@ -62,7 +63,8 @@ public class JBossASTomcatConnectorDiscoveryComponent extends MBeanResourceDisco
* corresponding jboss.web:type=Connector,* primary connector MBeans.
*/
EmsConnection connection = context.getParentResourceComponent().getEmsConnection();
- ObjectNameQueryUtility queryUtility = new ObjectNameQueryUtility("jboss.web:type=GlobalRequestProcessor,name=%name%");
+ ObjectNameQueryUtility queryUtility = new ObjectNameQueryUtility(
+ "jboss.web:type=GlobalRequestProcessor,name=%name%");
List<EmsBean> beans = connection.queryBeans(queryUtility.getTranslatedQuery());
// We can't populate the name and scheme in the plugin config if the GlobalRequestProcessor MBeans aren't
@@ -104,7 +106,8 @@ public class JBossASTomcatConnectorDiscoveryComponent extends MBeanResourceDisco
for (DiscoveredResourceDetails resource : resourceDetails) {
Configuration pluginConfiguration = resource.getPluginConfiguration();
- String dirtyAddress = pluginConfiguration.getSimple(JBossASTomcatConnectorComponent.PROPERTY_ADDRESS).getStringValue();
+ String dirtyAddress = pluginConfiguration.getSimple(JBossASTomcatConnectorComponent.PROPERTY_ADDRESS)
+ .getStringValue();
String cleanAddress;
if (dirtyAddress.startsWith("%2F")) {
@@ -119,21 +122,20 @@ public class JBossASTomcatConnectorDiscoveryComponent extends MBeanResourceDisco
}
String port = pluginConfiguration.getSimple(JBossASTomcatConnectorComponent.PROPERTY_PORT).getStringValue();
-
+
// Add the address to the Resource name (e.g. "Tomcat Connector (127.0.0.1:8080)").
-
- String resourceName = resource.getResourceName();
- //resourceName = resourceName.replace("(", "(" + cleanAddress + ":");
- resource.setResourceName(resourceName);
-
+ String resourceName = resource.getResourceName();
+ //resourceName = resourceName.replace("(", "(" + cleanAddress + ":");
+ resource.setResourceName(resourceName);
String scheme = schemeMap.get(port);
pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_SCHEMA, scheme));
// Update the "address" and "dash" plugin config props, or remove them if not needed.
if (addressPresentMap.containsKey(port)) {
- pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_ADDRESS, cleanAddress));
+ pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_ADDRESS,
+ cleanAddress));
pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_DASH, "-"));
} else {
pluginConfiguration.put(new PropertySimple(JBossASTomcatConnectorComponent.PROPERTY_ADDRESS, ""));
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatDiscoveryComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatDiscoveryComponent.java
index 4966c49..8283423 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatDiscoveryComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatDiscoveryComponent.java
@@ -1,25 +1,25 @@
- /*
- * Jopr Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * 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 and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
+/*
+ * Jopr Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * 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 and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
package org.rhq.plugins.jbossas;
import java.io.File;
@@ -48,14 +48,14 @@ import org.rhq.core.system.ProcessInfo;
* @author Greg Hinkle
* @author Ian Springer
*/
-public class JBossASTomcatDiscoveryComponent implements ResourceDiscoveryComponent<JBossASServerComponent> {
+public class JBossASTomcatDiscoveryComponent implements ResourceDiscoveryComponent<JBossASServerComponent<?>> {
private final Log log = LogFactory.getLog(JBossASTomcatDiscoveryComponent.class);
public static final String EMBEDDED_TOMCAT_PRE42_DIR = "jbossweb-tomcat";
public static final String EMBEDDED_TOMCAT_42_DIR = "jboss-web.";
private static final String SERVER_INFO_PROPERTIES_RESOURCE = "org/apache/catalina/util/ServerInfo.properties";
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JBossASServerComponent> context)
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JBossASServerComponent<?>> context)
throws InvalidPluginConfigurationException, Exception {
log.debug("Discovering Tomcat servers embedded in JBossAS server...");
@@ -86,8 +86,8 @@ public class JBossASTomcatDiscoveryComponent implements ResourceDiscoveryCompone
+ File.separator + ")";
Configuration pluginConfig = null;
ProcessInfo processInfo = null;
- DiscoveredResourceDetails resource = new DiscoveredResourceDetails(context.getResourceType(), key, getResourceName(pre42),
- version, description, pluginConfig, processInfo);
+ DiscoveredResourceDetails resource = new DiscoveredResourceDetails(context.getResourceType(), key,
+ getResourceName(pre42), version, description, pluginConfig, processInfo);
set.add(resource);
}
@@ -97,7 +97,7 @@ public class JBossASTomcatDiscoveryComponent implements ResourceDiscoveryCompone
private String getResourceName(boolean pre42) {
return pre42 ? "Embedded Tomcat Server" : "Embedded JBossWeb Server";
}
-
+
private String getVersion(File jbossWebDir) throws IOException {
boolean pre42 = jbossWebDir.getName().startsWith(EMBEDDED_TOMCAT_PRE42_DIR);
String jarFileName = (pre42) ? "catalina.jar" : "jbossweb.jar";
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatServerComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatServerComponent.java
index 62b5b31..f240650 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatServerComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatServerComponent.java
@@ -48,12 +48,12 @@ import org.rhq.plugins.jmx.JMXComponent;
* @author John Mazzitelli
*/
public class JBossASTomcatServerComponent implements MeasurementFacet, OperationFacet, ConfigurationFacet,
- JMXComponent<JMXComponent> {
+ JMXComponent<JMXComponent<?>> {
private static Log log = LogFactory.getLog(JBossASTomcatServerComponent.class);
- private ResourceContext<JMXComponent> resourceContext;
+ private ResourceContext<JMXComponent<?>> resourceContext;
- public void start(ResourceContext<JMXComponent> context) {
+ public void start(ResourceContext<JMXComponent<?>> context) {
resourceContext = context;
}
@@ -99,7 +99,7 @@ public class JBossASTomcatServerComponent implements MeasurementFacet, Operation
return this.resourceContext.getParentResourceComponent().getEmsConnection();
}
- ResourceContext<JMXComponent> getResourceContext() {
+ ResourceContext<JMXComponent<?>> getResourceContext() {
return resourceContext;
}
}
\ No newline at end of file
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatVHostDiscoveryService.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatVHostDiscoveryService.java
index cafe78c..59989b6 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatVHostDiscoveryService.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatVHostDiscoveryService.java
@@ -37,12 +37,12 @@ import org.rhq.plugins.jmx.MBeanResourceDiscoveryComponent;
* @author Heiko W. Rupp
*
*/
-public class JBossASTomcatVHostDiscoveryService extends MBeanResourceDiscoveryComponent<JMXComponent> {
+public class JBossASTomcatVHostDiscoveryService extends MBeanResourceDiscoveryComponent<JMXComponent<?>> {
static Pattern pattern = Pattern.compile(".*host=([\\w.]+).*");
@Override
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent> discoveryContext) {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent<?>> discoveryContext) {
Set<DiscoveredResourceDetails> resources = super.discoverResources(discoveryContext);
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatVHostService.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatVHostService.java
index e17f7a6..35411a5 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatVHostService.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASTomcatVHostService.java
@@ -1,25 +1,25 @@
- /*
- * Jopr Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * 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 and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
+/*
+ * Jopr Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * 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 and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
package org.rhq.plugins.jbossas;
@@ -41,7 +41,7 @@ import org.rhq.plugins.jmx.MBeanResourceComponent;
* @author Heiko W. Rupp
*
*/
-public class JBossASTomcatVHostService extends MBeanResourceComponent<JMXComponent> implements MeasurementFacet {
+public class JBossASTomcatVHostService extends MBeanResourceComponent<JMXComponent<?>> implements MeasurementFacet {
/* (non-Javadoc)
* @see org.rhq.core.pluginapi.inventory.ResourceComponent#getAvailability()
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossMQDiscoveryComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossMQDiscoveryComponent.java
index 65844b6..7ac105e 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossMQDiscoveryComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossMQDiscoveryComponent.java
@@ -41,7 +41,7 @@ public class JBossMQDiscoveryComponent extends AbstractMessagingDiscoveryCompone
private static final String VERSION_SOURCE = "jboss.mq:service=DestinationManager;Interceptor";
@Override
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent> context) {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent<?>> context) {
String objectNameQueryTemplate = "jboss.mq:service=DestinationManager";
Set<DiscoveredResourceDetails> result = super.discoverResources(context, objectNameQueryTemplate,
DEFAULT_RESOURCE_NAME, DEFAULT_RESOURCE_DESCRIPTION,
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossMessagingComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossMessagingComponent.java
index e06b5cf..bf8d94f 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossMessagingComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossMessagingComponent.java
@@ -1,25 +1,25 @@
- /*
- * Jopr Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * 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 and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
+/*
+ * Jopr Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * 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 and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
package org.rhq.plugins.jbossas;
@@ -67,7 +67,7 @@ public class JBossMessagingComponent extends AbstractMessagingComponent implemen
}
@Override
- public void start(ResourceContext<JBossASServerComponent> context) {
+ public void start(ResourceContext<JBossASServerComponent<?>> context) {
super.start(context, new JBossMessagingConfigurationEditor(context.getResourceType().getName()));
}
@@ -111,8 +111,7 @@ public class JBossMessagingComponent extends AbstractMessagingComponent implemen
xmlEditor.updateConfiguration(deploymentFile, name, report);
try {
parentResourceComponent.deployFile(deploymentFile);
- }
- catch (Exception e) {
+ } catch (Exception e) {
JBossASServerComponent.setErrorOnCreateResourceReport(report, e.getLocalizedMessage(), e);
return report;
}
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossMessagingDiscoveryComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossMessagingDiscoveryComponent.java
index 9feeb42..975d668 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossMessagingDiscoveryComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossMessagingDiscoveryComponent.java
@@ -39,7 +39,7 @@ public class JBossMessagingDiscoveryComponent extends AbstractMessagingDiscovery
private static final String DEFAULT_RESOURCE_DESCRIPTION = "JBoss Messaging subsystem";
@Override
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent> context) {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent<?>> context) {
String objectNameQueryTemplate = "jboss.messaging:service=PostOffice";
Set<DiscoveredResourceDetails> result = super.discoverResources(context, objectNameQueryTemplate,
DEFAULT_RESOURCE_NAME, DEFAULT_RESOURCE_DESCRIPTION,
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JMSComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JMSComponent.java
index a4cb1c7..9bdc4ab 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JMSComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JMSComponent.java
@@ -1,25 +1,25 @@
- /*
- * Jopr Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * 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 and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
+/*
+ * Jopr Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * 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 and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
package org.rhq.plugins.jbossas;
import java.io.File;
@@ -72,7 +72,7 @@ public class JMSComponent extends AbstractMessagingComponent implements Configur
}
@Override
- public void start(ResourceContext<JBossASServerComponent> context) {
+ public void start(ResourceContext<JBossASServerComponent<?>> context) {
super.start(context, new JMSConfigurationEditor(context.getResourceType().getName()));
}
@@ -115,8 +115,7 @@ public class JMSComponent extends AbstractMessagingComponent implements Configur
xmlEditor.updateConfiguration(deploymentFile, name, report);
try {
parentResourceComponent.deployFile(deploymentFile);
- }
- catch (Exception e) {
+ } catch (Exception e) {
JBossASServerComponent.setErrorOnCreateResourceReport(report, e.getLocalizedMessage(), e);
return report;
}
@@ -124,7 +123,7 @@ public class JMSComponent extends AbstractMessagingComponent implements Configur
// This key needs to be the same as the object name string used in discovery, defined in the plugin descriptor
// jboss.mq.destination:service=<Queue|Topic,name=%name%
String serviceString = (isTopic ? "Topic" : "Queue");
-
+
String objectName = "jboss.mq.destination:name=" + name + ",service=" + serviceString;
try {
// IMPORTANT: The object name must be canonicalized so it matches the resource key that
@@ -136,7 +135,7 @@ public class JMSComponent extends AbstractMessagingComponent implements Configur
return report;
}
report.setResourceName(rName);
-
+
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/WarDiscoveryComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/WarDiscoveryComponent.java
index 179859d..059f90e 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/WarDiscoveryComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/WarDiscoveryComponent.java
@@ -36,7 +36,7 @@ import org.rhq.plugins.jmx.JMXComponent;
*/
public class WarDiscoveryComponent extends ApplicationDiscoveryComponent {
@Override
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent> discoveryContext) {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent<?>> discoveryContext) {
Set<DiscoveredResourceDetails> resources = super.discoverResources(discoveryContext);
JBossASServerComponent parentJBossASComponent = (JBossASServerComponent) discoveryContext
.getParentResourceComponent();
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/script/ScriptComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/script/ScriptComponent.java
index f62b3aa..736f0eb 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/script/ScriptComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/script/ScriptComponent.java
@@ -34,6 +34,7 @@ import java.util.regex.Pattern;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jetbrains.annotations.NotNull;
+
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.measurement.AvailabilityType;
@@ -52,7 +53,7 @@ import org.rhq.plugins.jbossas.JBossASServerComponent;
*
* @author Ian Springer
*/
-public class ScriptComponent implements ResourceComponent<JBossASServerComponent>, OperationFacet {
+public class ScriptComponent implements ResourceComponent<JBossASServerComponent<?>>, OperationFacet {
public static final String PATH_CONFIG_PROP = "path";
public static final String ENVIRONMENT_VARIABLES_CONFIG_PROP = "environmentVariables";
@@ -65,9 +66,9 @@ public class ScriptComponent implements ResourceComponent<JBossASServerComponent
private final Log log = LogFactory.getLog(this.getClass());
- private ResourceContext<JBossASServerComponent> resourceContext;
+ private ResourceContext<JBossASServerComponent<?>> resourceContext;
- public void start(ResourceContext<JBossASServerComponent> resourceContext) {
+ public void start(ResourceContext<JBossASServerComponent<?>> resourceContext) {
this.resourceContext = resourceContext;
}
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/script/ScriptDiscoveryComponent.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/script/ScriptDiscoveryComponent.java
index 667d10f..93a768a 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/script/ScriptDiscoveryComponent.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/script/ScriptDiscoveryComponent.java
@@ -1,25 +1,25 @@
- /*
- * Jopr Management Platform
- * Copyright (C) 2005-2011 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * 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 and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
+/*
+ * Jopr Management Platform
+ * Copyright (C) 2005-2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * 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 and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
package org.rhq.plugins.jbossas.script;
import java.io.File;
@@ -28,16 +28,18 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.resource.ResourceUpgradeReport;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
-import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.upgrade.ResourceUpgradeContext;
import org.rhq.core.pluginapi.upgrade.ResourceUpgradeFacet;
import org.rhq.core.system.ProcessInfo;
@@ -48,14 +50,14 @@ import org.rhq.plugins.jbossas.JBossASServerComponent;
*
* @author Ian Springer
*/
-public class ScriptDiscoveryComponent implements ResourceDiscoveryComponent<JBossASServerComponent>,
- ResourceUpgradeFacet<JBossASServerComponent> {
+public class ScriptDiscoveryComponent implements ResourceDiscoveryComponent<JBossASServerComponent<?>>,
+ ResourceUpgradeFacet<JBossASServerComponent<?>> {
private final Log log = LogFactory.getLog(this.getClass());
public Set<DiscoveredResourceDetails> discoverResources(
- ResourceDiscoveryContext<JBossASServerComponent> discoveryContext)
- throws InvalidPluginConfigurationException {
+ ResourceDiscoveryContext<JBossASServerComponent<?>> discoveryContext)
+ throws InvalidPluginConfigurationException {
Set<DiscoveredResourceDetails> resources = new HashSet<DiscoveredResourceDetails>();
// TODO: Upgrade to new manual discovery API.
List<Configuration> pluginConfigs = discoveryContext.getPluginConfigurations();
@@ -68,7 +70,7 @@ public class ScriptDiscoveryComponent implements ResourceDiscoveryComponent<JBos
}
@Override
- public ResourceUpgradeReport upgrade(ResourceUpgradeContext<JBossASServerComponent> upgradeContext) {
+ public ResourceUpgradeReport upgrade(ResourceUpgradeContext<JBossASServerComponent<?>> upgradeContext) {
String inventoriedResourceKey = upgradeContext.getResourceKey();
ResourceContext parentResourceContext = upgradeContext.getParentResourceContext();
@@ -92,17 +94,18 @@ public class ScriptDiscoveryComponent implements ResourceDiscoveryComponent<JBos
private File getServerBinDirectory(ResourceContext parentResourceContext) {
Configuration parentPluginConfig = parentResourceContext.getPluginConfiguration();
- String homeDir = parentPluginConfig.getSimple(JBossASServerComponent.JBOSS_HOME_DIR_CONFIG_PROP).getStringValue();
+ String homeDir = parentPluginConfig.getSimple(JBossASServerComponent.JBOSS_HOME_DIR_CONFIG_PROP)
+ .getStringValue();
return new File(homeDir, "bin");
}
private static String buildResourceKey(String scriptPath, File binDir) {
- return (scriptPath.startsWith(binDir.getPath())) ? scriptPath.substring(binDir.getPath().length() + 1) :
- scriptPath;
+ return (scriptPath.startsWith(binDir.getPath())) ? scriptPath.substring(binDir.getPath().length() + 1)
+ : scriptPath;
}
- private void processAutoDiscoveredResources(ResourceDiscoveryContext<JBossASServerComponent> discoveryContext,
- Set<DiscoveredResourceDetails> resources) {
+ private void processAutoDiscoveredResources(ResourceDiscoveryContext<JBossASServerComponent<?>> discoveryContext,
+ Set<DiscoveredResourceDetails> resources) {
ResourceContext parentResourceContext = discoveryContext.getParentResourceContext();
File binDir = getServerBinDirectory(parentResourceContext);
log.debug("Searching for scripts beneath JBossAS server bin directory (" + binDir + ")...");
@@ -120,8 +123,8 @@ public class ScriptDiscoveryComponent implements ResourceDiscoveryComponent<JBos
}
}
- private void processManuallyAddedResources(ResourceDiscoveryContext<JBossASServerComponent> discoveryContext,
- Set<DiscoveredResourceDetails> resources, List<Configuration> pluginConfigs) {
+ private void processManuallyAddedResources(ResourceDiscoveryContext<JBossASServerComponent<?>> discoveryContext,
+ Set<DiscoveredResourceDetails> resources, List<Configuration> pluginConfigs) {
ResourceContext parentResourceContext = discoveryContext.getParentResourceContext();
File binDir = getServerBinDirectory(parentResourceContext);
for (Configuration pluginConfig : pluginConfigs) {
@@ -167,7 +170,7 @@ public class ScriptDiscoveryComponent implements ResourceDiscoveryComponent<JBos
}
private DiscoveredResourceDetails createResourceDetails(
- ResourceDiscoveryContext<JBossASServerComponent> discoveryContext, Configuration pluginConfig, File homeDir) {
+ ResourceDiscoveryContext<JBossASServerComponent<?>> discoveryContext, Configuration pluginConfig, File homeDir) {
String path = pluginConfig.getSimple(ScriptComponent.PATH_CONFIG_PROP).getStringValue();
String key = buildResourceKey(path, homeDir);
String name = new File(path).getName();
diff --git a/modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheComponent.java b/modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheComponent.java
index 17a2b1e..883c49d 100644
--- a/modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheComponent.java
+++ b/modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheComponent.java
@@ -27,6 +27,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jetbrains.annotations.NotNull;
import org.mc4j.ems.connection.EmsConnection;
+
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
@@ -39,54 +40,51 @@ import org.rhq.plugins.jbossas5.connection.ProfileServiceConnection;
* @author Filip Drabek
*
*/
-public class JBossCacheComponent implements
- ProfileServiceComponent<ProfileServiceComponent> {
+public class JBossCacheComponent implements ProfileServiceComponent<ProfileServiceComponent<?>> {
- private final Log log = LogFactory.getLog(this.getClass());
+ private final Log log = LogFactory.getLog(this.getClass());
- public static String CACHE_SEARCH_STRING = "searchString";
+ public static String CACHE_SEARCH_STRING = "searchString";
- private ProfileServiceComponent parentComp;
+ private ProfileServiceComponent<?> parentComp;
- private String beanName;
+ private String beanName;
- private ResourceContext<ProfileServiceComponent> resourceContext;
+ private ResourceContext<ProfileServiceComponent<?>> resourceContext;
- public void start(ResourceContext<ProfileServiceComponent> context)
- throws InvalidPluginConfigurationException, Exception {
+ public void start(ResourceContext<ProfileServiceComponent<?>> context) throws InvalidPluginConfigurationException,
+ Exception {
resourceContext = context;
- parentComp = context.getParentResourceComponent();
+ parentComp = context.getParentResourceComponent();
- Configuration configuration = context.getPluginConfiguration();
+ Configuration configuration = context.getPluginConfiguration();
- if (configuration.get(JBossCacheComponent.CACHE_SEARCH_STRING) != null)
- beanName = configuration.getSimple(
- JBossCacheComponent.CACHE_SEARCH_STRING).getStringValue();
- else
- throw new InvalidPluginConfigurationException(
- "Invalid plugin configuration in JBossCache component.");
+ if (configuration.get(JBossCacheComponent.CACHE_SEARCH_STRING) != null)
+ beanName = configuration.getSimple(JBossCacheComponent.CACHE_SEARCH_STRING).getStringValue();
+ else
+ throw new InvalidPluginConfigurationException("Invalid plugin configuration in JBossCache component.");
- }
+ }
- public void stop() {
- return;
- }
+ public void stop() {
+ return;
+ }
- public AvailabilityType getAvailability() {
- return parentComp.getAvailability();
- }
+ public AvailabilityType getAvailability() {
+ return parentComp.getAvailability();
+ }
- public ProfileServiceConnection getConnection() {
- return parentComp.getConnection();
- }
+ public ProfileServiceConnection getConnection() {
+ return parentComp.getConnection();
+ }
- public EmsConnection getEmsConnection() {
- return parentComp.getEmsConnection();
- }
+ public EmsConnection getEmsConnection() {
+ return parentComp.getEmsConnection();
+ }
@NotNull
- public ResourceContext<ProfileServiceComponent> getResourceContext() {
+ public ResourceContext<ProfileServiceComponent<?>> getResourceContext() {
return resourceContext;
}
}
diff --git a/modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheDetailComponent.java b/modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheDetailComponent.java
index 844da14..281ce80 100644
--- a/modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheDetailComponent.java
+++ b/modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheDetailComponent.java
@@ -53,16 +53,16 @@ import org.rhq.plugins.jbossas5.connection.ProfileServiceConnection;
*
*/
public class JBossCacheDetailComponent implements MeasurementFacet,
- OperationFacet, ProfileServiceComponent<ProfileServiceComponent> {
+ OperationFacet, ProfileServiceComponent<ProfileServiceComponent<?>> {
public static String JMX_NAME = "jmx-name";
public static String CACHE_DETAIL_BEAN_NAME = "bean-name";
public ProfileServiceComponent parentComponent;
private String beanName;
private final Log log = LogFactory.getLog(this.getClass());
- private ResourceContext<ProfileServiceComponent> resourceContext;
+ private ResourceContext<ProfileServiceComponent<?>> resourceContext;
- public void start(ResourceContext<ProfileServiceComponent> context)
+ public void start(ResourceContext<ProfileServiceComponent<?>> context)
throws InvalidPluginConfigurationException, Exception {
resourceContext = context;
@@ -104,7 +104,7 @@ public class JBossCacheDetailComponent implements MeasurementFacet,
}
@NotNull
- public ResourceContext<ProfileServiceComponent> getResourceContext() {
+ public ResourceContext<ProfileServiceComponent<?>> getResourceContext() {
return resourceContext;
}
diff --git a/modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheDetailDiscoveryComponent.java b/modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheDetailDiscoveryComponent.java
index 764bf64..5d522de 100644
--- a/modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheDetailDiscoveryComponent.java
+++ b/modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheDetailDiscoveryComponent.java
@@ -45,7 +45,7 @@ import org.rhq.plugins.jbossas5.ProfileServiceComponent;
*
*/
public class JBossCacheDetailDiscoveryComponent implements
- ResourceDiscoveryComponent<ProfileServiceComponent> {
+ ResourceDiscoveryComponent<ProfileServiceComponent<?>> {
public static String CACHE_JMX_NAME = "jmx-resource";
private final Log log = LogFactory.getLog(this.getClass());
@@ -53,7 +53,7 @@ public class JBossCacheDetailDiscoveryComponent implements
private ProfileServiceComponent parentComponent;
public Set<DiscoveredResourceDetails> discoverResources(
- ResourceDiscoveryContext<ProfileServiceComponent> context)
+ ResourceDiscoveryContext<ProfileServiceComponent<?>> context)
throws InvalidPluginConfigurationException, Exception {
ResourceType resourceType = context.getResourceType();
diff --git a/modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheDiscoveryComponent.java b/modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheDiscoveryComponent.java
index 88fd836..86bd02f 100644
--- a/modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheDiscoveryComponent.java
+++ b/modules/plugins/jboss-cache-v3/src/main/java/org/rhq/plugins/jbosscache3/JBossCacheDiscoveryComponent.java
@@ -48,13 +48,13 @@ import org.rhq.plugins.jmx.ObjectNameQueryUtility;
*
*/
public class JBossCacheDiscoveryComponent implements
- ResourceDiscoveryComponent<ProfileServiceComponent> {
+ ResourceDiscoveryComponent<ProfileServiceComponent<?>> {
private String REGEX = "(,|:)jmx-resource=[^,]*(,|\\z)";
private static String[] RESOURCE_NAME_KEY_PROPS = { "cluster", "config" };
private static final String DEFAULT_RESOURCE_DESCRIPTION = "JBoss Cache";
public Set<DiscoveredResourceDetails> discoverResources(
- ResourceDiscoveryContext<ProfileServiceComponent> context)
+ ResourceDiscoveryContext<ProfileServiceComponent<?>> context)
throws InvalidPluginConfigurationException, Exception {
ProfileServiceComponent parentComponent = context
diff --git a/modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheComponent.java b/modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheComponent.java
index daa7cdb..1ee8500 100644
--- a/modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheComponent.java
+++ b/modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheComponent.java
@@ -69,7 +69,7 @@ import org.rhq.plugins.jmx.ObjectNameQueryUtility;
* @author Heiko W. Rupp
*
*/
-public class JBossCacheComponent implements ResourceComponent<JMXComponent>, MeasurementFacet, OperationFacet,
+public class JBossCacheComponent implements ResourceComponent<JMXComponent<?>>, MeasurementFacet, OperationFacet,
ConfigurationFacet {
private final static Log log = LogFactory.getLog(JBossCacheComponent.class);
@@ -86,7 +86,7 @@ public class JBossCacheComponent implements ResourceComponent<JMXComponent>, Mea
this.context = context;
PropertySimple tcProp = context.getPluginConfiguration().getSimple("isTreeCache");
- if (tcProp==null || tcProp.getBooleanValue()==null)
+ if (tcProp == null || tcProp.getBooleanValue() == null)
throw new InvalidPluginConfigurationException("Cache flavour not provided");
else
isTreeCache = tcProp.getBooleanValue();
@@ -200,7 +200,7 @@ public class JBossCacheComponent implements ResourceComponent<JMXComponent>, Mea
public Configuration loadResourceConfiguration() throws Exception {
File file = DeploymentUtility.getDescriptorFile(parentServer.getEmsConnection(), context.getResourceKey());
- if (file==null) {
+ if (file == null) {
log.warn("Can not find the deployment descriptor for this cache ");
return null;
}
@@ -286,7 +286,7 @@ public class JBossCacheComponent implements ResourceComponent<JMXComponent>, Mea
report.setErrorMessage("Failed to determine the deployment descriptor file for mbean '" + mbeanName + "'.");
return;
}
-
+
CacheConfigurationHelper helper = new CacheConfigurationHelper();
try {
helper.writeConfig(file, newOne, mbeanName, true);
diff --git a/modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheDiscoveryComponent.java b/modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheDiscoveryComponent.java
index f37099e..4d1eecf 100644
--- a/modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheDiscoveryComponent.java
+++ b/modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheDiscoveryComponent.java
@@ -49,7 +49,7 @@ import org.rhq.plugins.jmx.MBeanResourceDiscoveryComponent;
*
* @author Heiko W. Rupp
*/
-public class JBossCacheDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent> {
+public class JBossCacheDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent<?>> {
private static final Log log = LogFactory.getLog(JBossCacheDiscoveryComponent.class);
@@ -57,10 +57,10 @@ public class JBossCacheDiscoveryComponent extends MBeanResourceDiscoveryComponen
* @see org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent#discoverResources(org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext)
*/
@Override
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent> context) {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent<?>> context) {
ResourceContext parentCtx = context.getParentResourceContext();
- JMXComponent<JBossASServerComponent> gparentComponent = (JMXComponent<JBossASServerComponent>) parentCtx.getParentResourceComponent();
+ JMXComponent<JBossASServerComponent<?>> gparentComponent = (JMXComponent<JBossASServerComponent<?>>) parentCtx.getParentResourceComponent();
Set<DiscoveredResourceDetails> discovered = super.performDiscovery(context.getDefaultPluginConfiguration(), gparentComponent, context.getResourceType(), false);
diff --git a/modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheSubsystemComponent.java b/modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheSubsystemComponent.java
index 13acbec..d167d51 100644
--- a/modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheSubsystemComponent.java
+++ b/modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheSubsystemComponent.java
@@ -47,7 +47,7 @@ import org.rhq.plugins.jmx.JMXComponent;
*
* @author Heiko W. Rupp
*/
-public class JBossCacheSubsystemComponent<T extends JMXComponent<JBossASServerComponent>> implements
+public class JBossCacheSubsystemComponent<T extends JMXComponent<JBossASServerComponent<?>>> implements
ResourceComponent<T>, CreateChildResourceFacet {
private final Log log = LogFactory.getLog(JBossCacheSubsystemComponent.class);
diff --git a/modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheSubsystemDiscovery.java b/modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheSubsystemDiscovery.java
index 9a0a3ce..514d390 100644
--- a/modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheSubsystemDiscovery.java
+++ b/modules/plugins/jboss-cache/src/main/java/org/rhq/plugins/jbosscache/JBossCacheSubsystemDiscovery.java
@@ -28,7 +28,7 @@ import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
*
* @author Heiko W. Rupp
*/
-public class JBossCacheSubsystemDiscovery implements ResourceDiscoveryComponent<JBossCacheSubsystemComponent>
+public class JBossCacheSubsystemDiscovery implements ResourceDiscoveryComponent<JBossCacheSubsystemComponent<?>>
{
private static final String JBOSS_CACHE_SUBSYSTEM = "JBoss Cache subsystem";
@@ -38,7 +38,7 @@ public class JBossCacheSubsystemDiscovery implements ResourceDiscoveryComponent<
*
* @see org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent#discoverResources(org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext)
*/
- public Set<DiscoveredResourceDetails> discoverResources( ResourceDiscoveryContext<JBossCacheSubsystemComponent> context)
+ public Set<DiscoveredResourceDetails> discoverResources( ResourceDiscoveryContext<JBossCacheSubsystemComponent<?>> context)
throws InvalidPluginConfigurationException, Exception {
Set<DiscoveredResourceDetails> subsystem = new HashSet<DiscoveredResourceDetails>(1);
diff --git a/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/EmbeddedJMXServerDiscoveryComponent.java b/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/EmbeddedJMXServerDiscoveryComponent.java
index f79daed..4b48067 100644
--- a/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/EmbeddedJMXServerDiscoveryComponent.java
+++ b/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/EmbeddedJMXServerDiscoveryComponent.java
@@ -22,9 +22,9 @@
*/
package org.rhq.plugins.jmx;
+import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
-import java.lang.reflect.Method;
import org.mc4j.ems.connection.EmsConnection;
import org.mc4j.ems.connection.bean.EmsBean;
@@ -47,8 +47,8 @@ import org.rhq.core.system.ProcessInfo;
*
* @author Greg Hinkle
*/
-public class EmbeddedJMXServerDiscoveryComponent implements ResourceDiscoveryComponent<JMXComponent> {
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent> context)
+public class EmbeddedJMXServerDiscoveryComponent implements ResourceDiscoveryComponent<JMXComponent<?>> {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent<?>> context)
throws Exception {
Set<DiscoveredResourceDetails> discoveredServers = new HashSet<DiscoveredResourceDetails>();
@@ -98,8 +98,8 @@ public class EmbeddedJMXServerDiscoveryComponent implements ResourceDiscoveryCom
if (runtimeMBean != null) {
String version = getSystemProperty(runtimeMBean, "java.version");
DiscoveredResourceDetails server = new DiscoveredResourceDetails(context.getResourceType(), "JVM",
- ParentDefinedJMXServerNamingUtility.getJVMName(context), version, context.getResourceType().getDescription(),
- configuration, null);
+ ParentDefinedJMXServerNamingUtility.getJVMName(context), version, context.getResourceType()
+ .getDescription(), configuration, null);
discoveredServers.add(server);
}
@@ -111,11 +111,11 @@ public class EmbeddedJMXServerDiscoveryComponent implements ResourceDiscoveryCom
// ClassCastExceptions due to EMS having used a different classloader than us to load them.
Object tabularDataObj = runtimeMBean.getAttribute("systemProperties").refresh();
Method getMethod = tabularDataObj.getClass().getMethod("get",
- new Class[] { Class.forName("[Ljava.lang.Object;") });
+ new Class[] { Class.forName("[Ljava.lang.Object;") });
// varargs don't work out when the arg itself is an array, so specify the parameters explicitly using arrays.
- Object compositeDataObj = getMethod.invoke(tabularDataObj, new Object[] { new Object[] { propertyName }});
+ Object compositeDataObj = getMethod.invoke(tabularDataObj, new Object[] { new Object[] { propertyName } });
getMethod = compositeDataObj.getClass().getMethod("get", String.class);
- String version = (String)getMethod.invoke(compositeDataObj, "value");
+ String version = (String) getMethod.invoke(compositeDataObj, "value");
return version;
}
}
\ No newline at end of file
diff --git a/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/InternalJMXServerDiscoveryComponent.java b/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/InternalJMXServerDiscoveryComponent.java
index 8973b54..fcd16fc 100644
--- a/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/InternalJMXServerDiscoveryComponent.java
+++ b/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/InternalJMXServerDiscoveryComponent.java
@@ -42,8 +42,8 @@ public class InternalJMXServerDiscoveryComponent implements ResourceDiscoveryCom
Set<DiscoveredResourceDetails> found = new HashSet<DiscoveredResourceDetails>();
DiscoveredResourceDetails localVM = new DiscoveredResourceDetails(context.getResourceType(), "InternalVM",
- ParentDefinedJMXServerNamingUtility.getJVMName(context), System.getProperty("java.version"), "VM of plugin container", null,
- null);
+ ParentDefinedJMXServerNamingUtility.getJVMName(context), System.getProperty("java.version"),
+ "VM of plugin container", null, null);
Configuration configuration = localVM.getPluginConfiguration();
configuration.put(new PropertySimple(JMXDiscoveryComponent.CONNECTOR_ADDRESS_CONFIG_PROPERTY,
"Local Connection"));
diff --git a/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/JMXServerComponent.java b/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/JMXServerComponent.java
index 29b36e8..1f77f48 100644
--- a/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/JMXServerComponent.java
+++ b/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/JMXServerComponent.java
@@ -44,6 +44,7 @@ import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
/**
@@ -59,7 +60,7 @@ import org.rhq.core.pluginapi.inventory.ResourceContext;
* @author Greg Hinkle
* @author John Mazzitelli
*/
-public class JMXServerComponent implements JMXComponent {
+public class JMXServerComponent<T extends ResourceComponent<?>> implements JMXComponent<T> {
private static Log log = LogFactory.getLog(JMXServerComponent.class);
private EmsConnection connection;
diff --git a/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/MBeanResourceComponent.java b/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/MBeanResourceComponent.java
index 8da6a2d..f10c150 100644
--- a/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/MBeanResourceComponent.java
+++ b/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/MBeanResourceComponent.java
@@ -75,7 +75,7 @@ import org.rhq.core.util.exception.ThrowableUtil;
* @author Greg Hinkle
* @author John Mazzitelli
*/
-public class MBeanResourceComponent<T extends JMXComponent> implements MeasurementFacet, OperationFacet,
+public class MBeanResourceComponent<T extends JMXComponent<?>> implements MeasurementFacet, OperationFacet,
ConfigurationFacet, JMXComponent<T> {
/**
diff --git a/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/MBeanResourceDiscoveryComponent.java b/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/MBeanResourceDiscoveryComponent.java
index 94bc89c..c4e1c5d 100644
--- a/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/MBeanResourceDiscoveryComponent.java
+++ b/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/MBeanResourceDiscoveryComponent.java
@@ -50,7 +50,7 @@ import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
*
* @author Greg Hinkle
*/
-public class MBeanResourceDiscoveryComponent<T extends JMXComponent> implements ResourceDiscoveryComponent<T> {
+public class MBeanResourceDiscoveryComponent<T extends JMXComponent<?>> implements ResourceDiscoveryComponent<T> {
// Constants --------------------------------------------
/**
@@ -93,8 +93,8 @@ public class MBeanResourceDiscoveryComponent<T extends JMXComponent> implements
public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<T> context,
boolean skipUnknownProps) {
this.discoveryContext = context;
- return performDiscovery(context.getDefaultPluginConfiguration(), context.getParentResourceComponent(), context
- .getResourceType(), skipUnknownProps);
+ return performDiscovery(context.getDefaultPluginConfiguration(), context.getParentResourceComponent(),
+ context.getResourceType(), skipUnknownProps);
}
/**
@@ -161,12 +161,10 @@ public class MBeanResourceDiscoveryComponent<T extends JMXComponent> implements
String resourceKey = bean.getBeanName().getCanonicalName(); // The detected object name
String nameTemplate = (pluginConfiguration.getSimple(PROPERTY_NAME_TEMPLATE) != null) ? pluginConfiguration
- .getSimple(PROPERTY_NAME_TEMPLATE).getStringValue()
- : null;
+ .getSimple(PROPERTY_NAME_TEMPLATE).getStringValue() : null;
String descriptionTemplate = (pluginConfiguration.getSimple(PROPERTY_DESCRIPTION_TEMPLATE) != null) ? pluginConfiguration
- .getSimple(PROPERTY_DESCRIPTION_TEMPLATE).getStringValue()
- : null;
+ .getSimple(PROPERTY_DESCRIPTION_TEMPLATE).getStringValue() : null;
String name = resourceKey;
if (nameTemplate != null) {
diff --git a/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/ClassNameMBeanComponent.java b/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/ClassNameMBeanComponent.java
index fc8b818..2d0b55e 100644
--- a/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/ClassNameMBeanComponent.java
+++ b/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/ClassNameMBeanComponent.java
@@ -30,8 +30,8 @@ import org.rhq.plugins.jmx.MBeanResourceComponent;
* @author Stefan Negrea
*
*/
-@SuppressWarnings({ "rawtypes", "deprecation" })
-public class ClassNameMBeanComponent extends MBeanResourceComponent<JMXComponent> {
+@SuppressWarnings({ "deprecation" })
+public class ClassNameMBeanComponent extends MBeanResourceComponent<JMXComponent<?>> {
private static final Log log = LogFactory.getLog(WebappContextComponent.class);
private static final String CLASS_NAME = "className";
diff --git a/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/ClassNameMBeanDiscoveryComponent.java b/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/ClassNameMBeanDiscoveryComponent.java
index 686642a..8487704 100644
--- a/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/ClassNameMBeanDiscoveryComponent.java
+++ b/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/ClassNameMBeanDiscoveryComponent.java
@@ -35,8 +35,7 @@ import org.rhq.plugins.jmx.MBeanResourceDiscoveryComponent;
*
* @author Stefan Negrea
*/
-@SuppressWarnings("rawtypes")
-public class ClassNameMBeanDiscoveryComponent<T extends JMXComponent> extends MBeanResourceDiscoveryComponent<T> {
+public class ClassNameMBeanDiscoveryComponent<T extends JMXComponent<?>> extends MBeanResourceDiscoveryComponent<T> {
private static final Log log = LogFactory.getLog(FileConfiguredMBeanResourceComponent.class);
diff --git a/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/LoadMetricDiscoveryComponent.java b/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/LoadMetricDiscoveryComponent.java
index 31530d7..1c5f894 100644
--- a/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/LoadMetricDiscoveryComponent.java
+++ b/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/LoadMetricDiscoveryComponent.java
@@ -33,11 +33,10 @@ import org.rhq.plugins.jmx.MBeanResourceDiscoveryComponent;
* @author Stefan Negrea
*
*/
-@SuppressWarnings("rawtypes")
-public class LoadMetricDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent> {
+public class LoadMetricDiscoveryComponent extends MBeanResourceDiscoveryComponent<JMXComponent<?>> {
@Override
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent> context,
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<JMXComponent<?>> context,
boolean skipUnknownProps) {
Set<DiscoveredResourceDetails> results = super.discoverResources(context, skipUnknownProps);
@@ -83,7 +82,7 @@ public class LoadMetricDiscoveryComponent extends MBeanResourceDiscoveryComponen
* @param objectName
* @return
*/
- private String getBeanConfiguredClassName(ResourceDiscoveryContext<JMXComponent> context, String objectName) {
+ private String getBeanConfiguredClassName(ResourceDiscoveryContext<JMXComponent<?>> context, String objectName) {
EmsConnection connection = context.getParentResourceComponent().getEmsConnection();
EmsBean emsBean = loadBean(connection, objectName);
diff --git a/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/WebappContextComponent.java b/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/WebappContextComponent.java
index 6131578..f7010a0 100644
--- a/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/WebappContextComponent.java
+++ b/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/WebappContextComponent.java
@@ -36,8 +36,8 @@ import org.rhq.plugins.modcluster.model.ProxyInfo;
*
* @author Stefan Negrea
*/
-@SuppressWarnings({ "rawtypes", "deprecation" })
-public class WebappContextComponent extends MBeanResourceComponent<MBeanResourceComponent> {
+@SuppressWarnings({ "deprecation" })
+public class WebappContextComponent extends MBeanResourceComponent<MBeanResourceComponent<?>> {
private static final Log log = LogFactory.getLog(WebappContextComponent.class);
diff --git a/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/WebappContextDiscoveryComponent.java b/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/WebappContextDiscoveryComponent.java
index 559e1b6..faa9795 100644
--- a/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/WebappContextDiscoveryComponent.java
+++ b/modules/plugins/mod-cluster/src/main/java/org/rhq/plugins/modcluster/WebappContextDiscoveryComponent.java
@@ -37,8 +37,7 @@ import org.rhq.plugins.modcluster.model.ProxyInfo;
*
* @author Stefan Negrea
*/
-@SuppressWarnings("rawtypes")
-public class WebappContextDiscoveryComponent implements ResourceDiscoveryComponent<MBeanResourceComponent> {
+public class WebappContextDiscoveryComponent implements ResourceDiscoveryComponent<MBeanResourceComponent<?>> {
private static final String JVM_ROUTE_PROPERTY = "jvmRoute";
private static final String ENGINE_OBJECT_NAME = "engineObjectName";
@@ -46,7 +45,7 @@ public class WebappContextDiscoveryComponent implements ResourceDiscoveryCompone
/* (non-Javadoc)
* @see org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent#discoverResources(org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext)
*/
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<MBeanResourceComponent> context) {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<MBeanResourceComponent<?>> context) {
String jvmRoute = this.getJvmRoute(context);
EmsBean configBean = context.getParentResourceComponent().getEmsBean();
@@ -72,7 +71,7 @@ public class WebappContextDiscoveryComponent implements ResourceDiscoveryCompone
* @param context the discovery context
* @return node's jvm route
*/
- private String getJvmRoute(ResourceDiscoveryContext<MBeanResourceComponent> context) {
+ private String getJvmRoute(ResourceDiscoveryContext<MBeanResourceComponent<?>> context) {
Configuration pluginConfig = context.getParentResourceComponent().getResourceContext().getPluginConfiguration();
String engineObjectName = pluginConfig.getSimple(ENGINE_OBJECT_NAME).getStringValue();
EmsBean engineBean = this.loadBean(engineObjectName, context.getParentResourceComponent());
diff --git a/modules/plugins/mysql/src/main/java/org/rhq/plugins/mysql/MySqlComponent.java b/modules/plugins/mysql/src/main/java/org/rhq/plugins/mysql/MySqlComponent.java
index 325ed20..f1a16e4 100644
--- a/modules/plugins/mysql/src/main/java/org/rhq/plugins/mysql/MySqlComponent.java
+++ b/modules/plugins/mysql/src/main/java/org/rhq/plugins/mysql/MySqlComponent.java
@@ -50,7 +50,8 @@ import org.rhq.plugins.database.DatabaseQueryUtility;
* @author Greg Hinkle
* @author Steve Millidge
*/
-public class MySqlComponent implements DatabaseComponent, ResourceComponent, MeasurementFacet {
+public class MySqlComponent implements DatabaseComponent<ResourceComponent<?>>,
+ ResourceComponent<ResourceComponent<?>>, MeasurementFacet {
private ResourceContext resourceContext;
private AggregateProcessInfo aggregateProcessInfo;
diff --git a/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemDiscoveryComponent.java b/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemDiscoveryComponent.java
index b1367b6..b213063 100644
--- a/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemDiscoveryComponent.java
+++ b/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemDiscoveryComponent.java
@@ -1,25 +1,25 @@
- /*
- * RHQ Management Platform
- * Copyright (C) 2005-2011 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * 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 and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * 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 and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
package org.rhq.plugins.platform;
import java.util.LinkedHashSet;
@@ -40,7 +40,6 @@ import org.rhq.core.system.SystemInfo;
* @author Greg Hinkle
* @author Ian Springer
*/
-@SuppressWarnings({"UnusedDeclaration"})
public class FileSystemDiscoveryComponent implements ResourceDiscoveryComponent<PlatformComponent> {
private static final String SYS_TYPE_NAME_LOFS = "lofs";
@@ -65,21 +64,20 @@ public class FileSystemDiscoveryComponent implements ResourceDiscoveryComponent<
int fsType = fs.getType();
// We only support local, network (nfs), lofs, or tmpfs filesystems - skip any other types.
switch (fsType) {
- case FileSystem.TYPE_LOCAL_DISK:
- case FileSystem.TYPE_NETWORK:
- break;
- default:
- String sysTypeName = fs.getSysTypeName();
- if (!(SYS_TYPE_NAME_LOFS.equals(sysTypeName) || SYS_TYPE_NAME_TMPFS.equals(sysTypeName))) {
- continue;
- }
+ case FileSystem.TYPE_LOCAL_DISK:
+ case FileSystem.TYPE_NETWORK:
+ break;
+ default:
+ String sysTypeName = fs.getSysTypeName();
+ if (!(SYS_TYPE_NAME_LOFS.equals(sysTypeName) || SYS_TYPE_NAME_TMPFS.equals(sysTypeName))) {
+ continue;
+ }
}
try {
String key = fsInfo.getMountPoint();
String name = fsInfo.getMountPoint();
- String description = fsInfo.getFileSystem().getDevName() + ": "
- + fsInfo.getFileSystem().getDirName();
+ String description = fsInfo.getFileSystem().getDevName() + ": " + fsInfo.getFileSystem().getDirName();
Configuration pluginConfig = discoveryContext.getDefaultPluginConfiguration();
DiscoveredResourceDetails details = new DiscoveredResourceDetails(discoveryContext.getResourceType(),
key, name, null, description, pluginConfig, null);
diff --git a/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/PlatformComponent.java b/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/PlatformComponent.java
index 4cf56a3..757c812 100644
--- a/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/PlatformComponent.java
+++ b/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/PlatformComponent.java
@@ -65,7 +65,8 @@ import org.rhq.core.system.SystemInfo;
*
* @author John Mazzitelli
*/
-public class PlatformComponent implements ResourceComponent, ConfigurationFacet, MeasurementFacet, OperationFacet {
+public class PlatformComponent implements ResourceComponent<PlatformComponent>, ConfigurationFacet, MeasurementFacet,
+ OperationFacet {
private final Log log = LogFactory.getLog(PlatformComponent.class);
@@ -229,9 +230,7 @@ public class PlatformComponent implements ResourceComponent, ConfigurationFacet,
pm.put(new PropertySimple("name", process.getBaseName()));
pm.put(new PropertySimple("size", (process.getMemory() != null) ? process.getMemory().getSize() : "0"));
pm.put(new PropertySimple("userTime", (process.getTime() != null) ? process.getTime().getUser() : "0"));
- pm
- .put(new PropertySimple("kernelTime", (process.getTime() != null) ? process.getTime().getSys()
- : "0"));
+ pm.put(new PropertySimple("kernelTime", (process.getTime() != null) ? process.getTime().getSys() : "0"));
processList.add(pm);
}
diff --git a/modules/plugins/postfix/src/main/java/org/rhq/plugins/postfix/PostfixAccessDiscoveryComponent.java b/modules/plugins/postfix/src/main/java/org/rhq/plugins/postfix/PostfixAccessDiscoveryComponent.java
index 0a34baa..8102eb6 100644
--- a/modules/plugins/postfix/src/main/java/org/rhq/plugins/postfix/PostfixAccessDiscoveryComponent.java
+++ b/modules/plugins/postfix/src/main/java/org/rhq/plugins/postfix/PostfixAccessDiscoveryComponent.java
@@ -26,6 +26,7 @@ import java.util.Set;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
import org.rhq.plugins.augeas.AugeasConfigurationDiscoveryComponent;
@@ -33,11 +34,11 @@ import org.rhq.plugins.augeas.AugeasConfigurationDiscoveryComponent;
* @author paji
*
*/
-public class PostfixAccessDiscoveryComponent extends AugeasConfigurationDiscoveryComponent<PostfixAccessComponent> {
+public class PostfixAccessDiscoveryComponent extends AugeasConfigurationDiscoveryComponent<ResourceComponent<?>> {
public static final String RESOURCE_KEY = "Access";
public Set<DiscoveredResourceDetails> discoverResources(
- ResourceDiscoveryContext<PostfixAccessComponent> discoveryContext) throws InvalidPluginConfigurationException,
+ ResourceDiscoveryContext<ResourceComponent<?>> discoveryContext) throws InvalidPluginConfigurationException,
Exception {
Set<DiscoveredResourceDetails> details = new HashSet<DiscoveredResourceDetails>();
diff --git a/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresDatabaseComponent.java b/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresDatabaseComponent.java
index fec4c0f..d6380b7 100644
--- a/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresDatabaseComponent.java
+++ b/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresDatabaseComponent.java
@@ -46,11 +46,11 @@ import org.rhq.core.pluginapi.operation.OperationResult;
import org.rhq.core.util.jdbc.JDBCUtil;
import org.rhq.plugins.database.DatabaseComponent;
-public class PostgresDatabaseComponent implements DatabaseComponent<PostgresServerComponent>, MeasurementFacet,
+public class PostgresDatabaseComponent implements DatabaseComponent<PostgresServerComponent<?>>, MeasurementFacet,
CreateChildResourceFacet, OperationFacet {
private Log log = LogFactory.getLog(PostgresDatabaseComponent.class);
- private ResourceContext<PostgresServerComponent> resourceContext;
+ private ResourceContext<PostgresServerComponent<?>> resourceContext;
private Connection databaseConnection;
@@ -89,7 +89,7 @@ public class PostgresDatabaseComponent implements DatabaseComponent<PostgresServ
this.databaseConnection = null;
}
- public void start(ResourceContext<PostgresServerComponent> context) {
+ public void start(ResourceContext<PostgresServerComponent<?>> context) {
this.resourceContext = context;
}
diff --git a/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresDatabaseDiscoveryComponent.java b/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresDatabaseDiscoveryComponent.java
index 5236fd3..f7f6f56 100644
--- a/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresDatabaseDiscoveryComponent.java
+++ b/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresDatabaseDiscoveryComponent.java
@@ -22,6 +22,7 @@ import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashSet;
import java.util.Set;
+
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
@@ -31,8 +32,8 @@ import org.rhq.core.util.jdbc.JDBCUtil;
/**
* @author Greg Hinkle
*/
-public class PostgresDatabaseDiscoveryComponent implements ResourceDiscoveryComponent<PostgresServerComponent> {
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<PostgresServerComponent> context)
+public class PostgresDatabaseDiscoveryComponent implements ResourceDiscoveryComponent<PostgresServerComponent<?>> {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<PostgresServerComponent<?>> context)
throws Exception {
Set<DiscoveredResourceDetails> databases = new HashSet<DiscoveredResourceDetails>();
@@ -45,8 +46,7 @@ public class PostgresDatabaseDiscoveryComponent implements ResourceDiscoveryComp
while (resultSet.next()) {
String databaseName = resultSet.getString("datname");
DiscoveredResourceDetails database = new DiscoveredResourceDetails(context.getResourceType(),
- databaseName, databaseName, null, "The " + databaseName
- + " Postgres Database Instance", null, null);
+ databaseName, databaseName, null, "The " + databaseName + " Postgres Database Instance", null, null);
database.getPluginConfiguration().put(new PropertySimple("databaseName", databaseName));
databases.add(database);
}
diff --git a/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresServerComponent.java b/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresServerComponent.java
index 8308a23..f80f288 100644
--- a/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresServerComponent.java
+++ b/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresServerComponent.java
@@ -55,6 +55,7 @@ import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.core.pluginapi.inventory.CreateChildResourceFacet;
import org.rhq.core.pluginapi.inventory.CreateResourceReport;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
import org.rhq.core.pluginapi.operation.OperationFacet;
@@ -70,7 +71,7 @@ import org.rhq.plugins.postgres.util.PostgresqlConfFile;
*
* @author Greg Hinkle
*/
-public class PostgresServerComponent implements DatabaseComponent, ConfigurationFacet, MeasurementFacet,
+public class PostgresServerComponent<T extends ResourceComponent<?>> implements DatabaseComponent<T>, ConfigurationFacet, MeasurementFacet,
OperationFacet, CreateChildResourceFacet {
private static Log log = LogFactory.getLog(PostgresServerComponent.class);
diff --git a/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresUserComponent.java b/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresUserComponent.java
index 6312c4d..92a5203 100644
--- a/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresUserComponent.java
+++ b/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresUserComponent.java
@@ -44,11 +44,11 @@ import org.rhq.plugins.database.DatabaseQueryUtility;
/**
* @author Greg Hinkle
*/
-public class PostgresUserComponent implements DatabaseComponent<PostgresServerComponent>, MeasurementFacet,
+public class PostgresUserComponent implements DatabaseComponent<PostgresServerComponent<?>>, MeasurementFacet,
ConfigurationFacet, DeleteResourceFacet {
- private ResourceContext<PostgresServerComponent> resourceContext;
+ private ResourceContext<PostgresServerComponent<?>> resourceContext;
- public void start(ResourceContext<PostgresServerComponent> resourceContext) {
+ public void start(ResourceContext<PostgresServerComponent<?>> resourceContext) {
this.resourceContext = resourceContext;
}
diff --git a/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresUserDiscoveryComponent.java b/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresUserDiscoveryComponent.java
index c0d0273..4eab143 100644
--- a/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresUserDiscoveryComponent.java
+++ b/modules/plugins/postgres/src/main/java/org/rhq/plugins/postgres/PostgresUserDiscoveryComponent.java
@@ -23,8 +23,10 @@ import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashSet;
import java.util.Set;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
@@ -36,12 +38,12 @@ import org.rhq.core.util.jdbc.JDBCUtil;
*
* @author Greg Hinkle
*/
-public class PostgresUserDiscoveryComponent implements ResourceDiscoveryComponent<PostgresServerComponent> {
+public class PostgresUserDiscoveryComponent implements ResourceDiscoveryComponent<PostgresServerComponent<?>> {
private static final Log log = LogFactory.getLog(PostgresTableDiscoveryComponent.class);
public static final String USERS_QUERY = "select * from pg_roles";
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<PostgresServerComponent> context)
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<PostgresServerComponent<?>> context)
throws Exception {
log.info("Discovering postgres users");
Set<DiscoveredResourceDetails> discoveredUsers = new HashSet<DiscoveredResourceDetails>();
diff --git a/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentEnvironmentScriptComponent.java b/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentEnvironmentScriptComponent.java
index 8b8e1f9..e21a456 100644
--- a/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentEnvironmentScriptComponent.java
+++ b/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentEnvironmentScriptComponent.java
@@ -47,12 +47,12 @@ import org.rhq.enterprise.agent.EnvironmentScriptFileUpdate.NameValuePair;
*
* @author John Mazzitelli
*/
-public class AgentEnvironmentScriptComponent implements ResourceComponent<AgentServerComponent>, ConfigurationFacet {
+public class AgentEnvironmentScriptComponent implements ResourceComponent<AgentServerComponent<?>>, ConfigurationFacet {
private Log log = LogFactory.getLog(AgentEnvironmentScriptComponent.class);
private File script;
- public void start(ResourceContext<AgentServerComponent> resourceContext) throws Exception {
+ public void start(ResourceContext<AgentServerComponent<?>> resourceContext) throws Exception {
Configuration pc = resourceContext.getPluginConfiguration();
PropertySimple pathnameProp = pc.getSimple(AgentEnvironmentScriptDiscoveryComponent.PLUGINCONFIG_PATHNAME);
if (pathnameProp == null) {
diff --git a/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentEnvironmentScriptDiscoveryComponent.java b/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentEnvironmentScriptDiscoveryComponent.java
index ff312f8..31523d8 100644
--- a/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentEnvironmentScriptDiscoveryComponent.java
+++ b/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentEnvironmentScriptDiscoveryComponent.java
@@ -39,7 +39,7 @@ import org.rhq.enterprise.agent.Version;
*
* @author John Mazzitelli
*/
-public class AgentEnvironmentScriptDiscoveryComponent implements ResourceDiscoveryComponent<AgentServerComponent> {
+public class AgentEnvironmentScriptDiscoveryComponent implements ResourceDiscoveryComponent<AgentServerComponent<?>> {
private final Log log = LogFactory.getLog(AgentEnvironmentScriptDiscoveryComponent.class);
/**
@@ -53,7 +53,7 @@ public class AgentEnvironmentScriptDiscoveryComponent implements ResourceDiscove
*
* @see ResourceDiscoveryComponent#discoverResources(ResourceDiscoveryContext)
*/
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<AgentServerComponent> context) {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<AgentServerComponent<?>> context) {
log.info("Discovering RHQ Agent's environment setup script...");
HashSet<DiscoveredResourceDetails> set = new HashSet<DiscoveredResourceDetails>();
@@ -90,7 +90,7 @@ public class AgentEnvironmentScriptDiscoveryComponent implements ResourceDiscove
*
* @return <code>true</code> if this method discovers the script; <code>false</code> if not
*/
- private boolean findInAgentHome(ResourceDiscoveryContext<AgentServerComponent> context, String version,
+ private boolean findInAgentHome(ResourceDiscoveryContext<AgentServerComponent<?>> context, String version,
String baseName, HashSet<DiscoveredResourceDetails> discoveries) {
try {
@@ -111,7 +111,7 @@ public class AgentEnvironmentScriptDiscoveryComponent implements ResourceDiscove
}
}
- private DiscoveredResourceDetails createDetails(ResourceDiscoveryContext<AgentServerComponent> context,
+ private DiscoveredResourceDetails createDetails(ResourceDiscoveryContext<AgentServerComponent<?>> context,
String version, File discoveredScript) {
String key = "environment-setup-script"; // this is a singleton resource; only ever one of these
diff --git a/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentJavaServiceWrapperComponent.java b/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentJavaServiceWrapperComponent.java
index 2b5b041..cff8181 100644
--- a/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentJavaServiceWrapperComponent.java
+++ b/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentJavaServiceWrapperComponent.java
@@ -54,19 +54,19 @@ import org.rhq.enterprise.agent.EnvironmentScriptFileUpdate.NameValuePair;
*
* @author John Mazzitelli
*/
-public class AgentJavaServiceWrapperComponent implements ResourceComponent<AgentServerComponent>, ConfigurationFacet,
- OperationFacet {
+public class AgentJavaServiceWrapperComponent implements ResourceComponent<AgentServerComponent<?>>,
+ ConfigurationFacet, OperationFacet {
private Log log = LogFactory.getLog(AgentJavaServiceWrapperComponent.class);
- private ResourceContext<AgentServerComponent> resourceContext;
+ private ResourceContext<AgentServerComponent<?>> resourceContext;
private File launcherScript;
private File configFile;
private File environmentFile;
private File includeFile;
- public void start(ResourceContext<AgentServerComponent> rc) throws Exception {
+ public void start(ResourceContext<AgentServerComponent<?>> rc) throws Exception {
this.resourceContext = rc;
diff --git a/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentJavaServiceWrapperDiscoveryComponent.java b/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentJavaServiceWrapperDiscoveryComponent.java
index fd9c4bc..85fa609 100644
--- a/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentJavaServiceWrapperDiscoveryComponent.java
+++ b/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentJavaServiceWrapperDiscoveryComponent.java
@@ -41,7 +41,7 @@ import org.rhq.enterprise.agent.Version;
*
* @author John Mazzitelli
*/
-public class AgentJavaServiceWrapperDiscoveryComponent implements ResourceDiscoveryComponent<AgentServerComponent> {
+public class AgentJavaServiceWrapperDiscoveryComponent implements ResourceDiscoveryComponent<AgentServerComponent<?>> {
private final Log log = LogFactory.getLog(AgentJavaServiceWrapperDiscoveryComponent.class);
/**
@@ -73,7 +73,7 @@ public class AgentJavaServiceWrapperDiscoveryComponent implements ResourceDiscov
*
* @see ResourceDiscoveryComponent#discoverResources(ResourceDiscoveryContext)
*/
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<AgentServerComponent> context) {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<AgentServerComponent<?>> context) {
log.info("Discovering RHQ Agent's JSW service...");
HashSet<DiscoveredResourceDetails> set = new HashSet<DiscoveredResourceDetails>();
@@ -115,7 +115,7 @@ public class AgentJavaServiceWrapperDiscoveryComponent implements ResourceDiscov
*
* @return <code>true</code> if this method discovers the JSW; <code>false</code> if not
*/
- private boolean findInAgentHome(ResourceDiscoveryContext<AgentServerComponent> context, String version,
+ private boolean findInAgentHome(ResourceDiscoveryContext<AgentServerComponent<?>> context, String version,
String baseName, HashSet<DiscoveredResourceDetails> discoveries) {
try {
@@ -136,7 +136,7 @@ public class AgentJavaServiceWrapperDiscoveryComponent implements ResourceDiscov
}
}
- private DiscoveredResourceDetails createDetails(ResourceDiscoveryContext<AgentServerComponent> context,
+ private DiscoveredResourceDetails createDetails(ResourceDiscoveryContext<AgentServerComponent<?>> context,
String version, File discoveredLocation) {
String key = "jsw"; // this is a singleton resource; only ever one of these
diff --git a/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentLauncherScriptComponent.java b/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentLauncherScriptComponent.java
index 6cefec8..f51febf 100644
--- a/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentLauncherScriptComponent.java
+++ b/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentLauncherScriptComponent.java
@@ -42,15 +42,15 @@ import org.rhq.core.system.SystemInfo;
*
* @author John Mazzitelli
*/
-public class AgentLauncherScriptComponent implements ResourceComponent<AgentServerComponent>, OperationFacet {
+public class AgentLauncherScriptComponent implements ResourceComponent<AgentServerComponent<?>>, OperationFacet {
private Log log = LogFactory.getLog(AgentLauncherScriptComponent.class);
- private ResourceContext<AgentServerComponent> resourceContext;
+ private ResourceContext<AgentServerComponent<?>> resourceContext;
private File launcherScript;
- public void start(ResourceContext<AgentServerComponent> rc) throws Exception {
+ public void start(ResourceContext<AgentServerComponent<?>> rc) throws Exception {
this.resourceContext = rc;
Configuration pc = this.resourceContext.getPluginConfiguration();
diff --git a/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentLauncherScriptDiscoveryComponent.java b/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentLauncherScriptDiscoveryComponent.java
index b386f59..ddbdbeb 100644
--- a/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentLauncherScriptDiscoveryComponent.java
+++ b/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentLauncherScriptDiscoveryComponent.java
@@ -43,7 +43,7 @@ import org.rhq.enterprise.agent.Version;
*
* @author John Mazzitelli
*/
-public class AgentLauncherScriptDiscoveryComponent implements ResourceDiscoveryComponent<AgentServerComponent> {
+public class AgentLauncherScriptDiscoveryComponent implements ResourceDiscoveryComponent<AgentServerComponent<?>> {
private final Log log = LogFactory.getLog(AgentLauncherScriptDiscoveryComponent.class);
/**
@@ -57,7 +57,7 @@ public class AgentLauncherScriptDiscoveryComponent implements ResourceDiscoveryC
*
* @see ResourceDiscoveryComponent#discoverResources(ResourceDiscoveryContext)
*/
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<AgentServerComponent> context) {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<AgentServerComponent<?>> context) {
log.info("Discovering RHQ Agent's launcher script service...");
HashSet<DiscoveredResourceDetails> set = new HashSet<DiscoveredResourceDetails>();
@@ -99,7 +99,7 @@ public class AgentLauncherScriptDiscoveryComponent implements ResourceDiscoveryC
*
* @return <code>true</code> if this method discovers the launcher script; <code>false</code> if not
*/
- private boolean findInAgentHome(ResourceDiscoveryContext<AgentServerComponent> context, String version,
+ private boolean findInAgentHome(ResourceDiscoveryContext<AgentServerComponent<?>> context, String version,
String baseName, HashSet<DiscoveredResourceDetails> discoveries) {
try {
@@ -120,7 +120,7 @@ public class AgentLauncherScriptDiscoveryComponent implements ResourceDiscoveryC
}
}
- private DiscoveredResourceDetails createDetails(ResourceDiscoveryContext<AgentServerComponent> context,
+ private DiscoveredResourceDetails createDetails(ResourceDiscoveryContext<AgentServerComponent<?>> context,
String version, File discoveredLocation) {
String key = "launcherscript"; // this is a singleton resource; only ever one of these
diff --git a/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentServerComponent.java b/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentServerComponent.java
index d352ae9..82179ab 100644
--- a/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentServerComponent.java
+++ b/modules/plugins/rhq-agent/src/main/java/org/rhq/plugins/agent/AgentServerComponent.java
@@ -50,6 +50,7 @@ import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.core.pluginapi.event.log.LogFileEventResourceComponentHelper;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
import org.rhq.core.pluginapi.operation.OperationFacet;
@@ -70,8 +71,8 @@ import org.rhq.plugins.jmx.JMXServerComponent;
*
* @author John Mazzitelli
*/
-public class AgentServerComponent extends JMXServerComponent implements JMXComponent, MeasurementFacet, OperationFacet,
- ConfigurationFacet, SupportFacet {
+public class AgentServerComponent<T extends ResourceComponent<?>> extends JMXServerComponent<T> implements
+ JMXComponent<T>, MeasurementFacet, OperationFacet, ConfigurationFacet, SupportFacet {
private static Log log = LogFactory.getLog(AgentServerComponent.class);
/**
diff --git a/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java b/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java
index d50f324..f9f2648 100644
--- a/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java
+++ b/modules/plugins/samba/src/main/java/org/rhq/plugins/samba/SambaServerComponent.java
@@ -18,9 +18,13 @@
*/
package org.rhq.plugins.samba;
+import java.util.List;
+import java.util.Set;
+
import net.augeas.Augeas;
-import org.rhq.core.domain.configuration.*;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
@@ -30,23 +34,25 @@ import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.core.pluginapi.inventory.CreateResourceReport;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
import org.rhq.core.pluginapi.operation.OperationFacet;
import org.rhq.core.pluginapi.operation.OperationResult;
import org.rhq.core.pluginapi.util.ObjectUtil;
-import org.rhq.core.system.*;
+import org.rhq.core.system.NetworkStats;
+import org.rhq.core.system.ProcessExecution;
+import org.rhq.core.system.ProcessExecutionResults;
+import org.rhq.core.system.ProcessInfo;
+import org.rhq.core.system.SystemInfo;
import org.rhq.plugins.augeas.AugeasConfigurationComponent;
import org.rhq.plugins.augeas.helper.AugeasNode;
-import java.util.List;
-import java.util.Set;
-
-
/**
* TODO
*/
-public class SambaServerComponent extends AugeasConfigurationComponent implements OperationFacet, MeasurementFacet {
+public class SambaServerComponent extends AugeasConfigurationComponent<ResourceComponent<?>> implements OperationFacet,
+ MeasurementFacet {
static final String ENABLE_RECYCLING = "enableRecycleBin";
static final String AUTHCONFIG_PATH = "/usr/bin/authconfig";
@@ -57,7 +63,6 @@ public class SambaServerComponent extends AugeasConfigurationComponent implement
private ResourceContext resourceContext;
-
public void start(ResourceContext resourceContext) throws Exception {
this.resourceContext = resourceContext;
super.start(resourceContext);
@@ -141,8 +146,8 @@ public class SambaServerComponent extends AugeasConfigurationComponent implement
private void getProcess() {
- List<ProcessInfo> procs =
- resourceContext.getSystemInformation().getProcesses("process|basename|match=smbd,process|basename|nomatch|parent=smbd");
+ List<ProcessInfo> procs = resourceContext.getSystemInformation().getProcesses(
+ "process|basename|match=smbd,process|basename|nomatch|parent=smbd");
if (procs.size() == 1) {
this.processInfo = procs.get(0).getAggregateProcessTree();
@@ -153,7 +158,7 @@ public class SambaServerComponent extends AugeasConfigurationComponent implement
NetworkStats stats = resourceContext.getSystemInformation().getNetworkStats("localhost", PORT);
- if (processInfo!=null) {
+ if (processInfo != null) {
processInfo.refresh();
for (MeasurementScheduleRequest request : metrics) {
@@ -161,7 +166,8 @@ public class SambaServerComponent extends AugeasConfigurationComponent implement
int val = stats.getByName(request.getName().substring("NetworkStat.".length()));
report.addData(new MeasurementDataNumeric(request, (double) val));
} else if (request.getName().startsWith("Process.")) {
- Double value = ObjectUtil.lookupDeepNumericAttributeProperty(processInfo, request.getName().substring("Process.".length()));
+ Double value = ObjectUtil.lookupDeepNumericAttributeProperty(processInfo, request.getName()
+ .substring("Process.".length()));
report.addData(new MeasurementDataNumeric(request, value));
}
}
@@ -173,10 +179,9 @@ public class SambaServerComponent extends AugeasConfigurationComponent implement
OperationResult result = null;
if (name.equals("join")) {
- result = updateSmbAds(params);
- }
- else if (name.equals("disconnect")) {
- result = disconnectSmbAds(params);
+ result = updateSmbAds(params);
+ } else if (name.equals("disconnect")) {
+ result = disconnectSmbAds(params);
}
return result;
}
@@ -279,6 +284,6 @@ public class SambaServerComponent extends AugeasConfigurationComponent implement
ProcessExecutionResults results = sysInfo.executeProcess(processExecution);
return results;
- }
+ }
}
diff --git a/modules/plugins/snmptrapd/src/main/java/org/rhq/plugins/snmptrapd/SnmpTrapdComponent.java b/modules/plugins/snmptrapd/src/main/java/org/rhq/plugins/snmptrapd/SnmpTrapdComponent.java
index 9e0de67..7967e15 100644
--- a/modules/plugins/snmptrapd/src/main/java/org/rhq/plugins/snmptrapd/SnmpTrapdComponent.java
+++ b/modules/plugins/snmptrapd/src/main/java/org/rhq/plugins/snmptrapd/SnmpTrapdComponent.java
@@ -47,7 +47,7 @@ import org.rhq.core.util.exception.ThrowableUtil;
* @author Heiko W. Rupp
*
*/
-public class SnmpTrapdComponent implements ResourceComponent, MeasurementFacet {
+public class SnmpTrapdComponent implements ResourceComponent<ResourceComponent<?>>, MeasurementFacet {
private final Log log = LogFactory.getLog(SnmpTrapdComponent.class);
diff --git a/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatConnectorComponent.java b/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatConnectorComponent.java
index 0265123..4f334a4 100644
--- a/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatConnectorComponent.java
+++ b/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatConnectorComponent.java
@@ -54,7 +54,7 @@ import org.rhq.plugins.jmx.ObjectNameQueryUtility;
* @author Jay Shaughnessy
* @author Jason Dobies
*/
-public class TomcatConnectorComponent extends MBeanResourceComponent<TomcatServerComponent> {
+public class TomcatConnectorComponent extends MBeanResourceComponent<TomcatServerComponent<?>> {
/**
* property name for the protocol of the connector
@@ -103,7 +103,7 @@ public class TomcatConnectorComponent extends MBeanResourceComponent<TomcatServe
}
@Override
- public void start(ResourceContext<TomcatServerComponent> context) {
+ public void start(ResourceContext<TomcatServerComponent<?>> context) {
if (UNKNOWN.equals(context.getPluginConfiguration().getSimple(PLUGIN_CONFIG_HANDLER).getStringValue())) {
throw new InvalidPluginConfigurationException(
"The connector is not listening for requests on the configured port. This is most likely due to the configured port being in use at Tomcat startup. In some cases (AJP connectors) Tomcat will assign an open port. This happens most often when there are multiple Tomcat servers running on the same platform. Check your Tomcat configuration for conflicts: "
@@ -206,7 +206,7 @@ public class TomcatConnectorComponent extends MBeanResourceComponent<TomcatServe
public void updateResourceConfiguration(ConfigurationUpdateReport report) {
// When starting the component get the connector type specific property keys
- ResourceContext<TomcatServerComponent> context = getResourceContext();
+ ResourceContext<TomcatServerComponent<?>> context = getResourceContext();
ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition();
String protocol = report.getConfiguration().getSimpleValue(CONFIG_PROTOCOL, null);
if ((null == protocol) || protocol.toUpperCase().contains("HTTP")) {
diff --git a/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatConnectorDiscoveryComponent.java b/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatConnectorDiscoveryComponent.java
index f6ad696..0940910 100644
--- a/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatConnectorDiscoveryComponent.java
+++ b/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatConnectorDiscoveryComponent.java
@@ -33,6 +33,7 @@ import org.apache.commons.logging.LogFactory;
import org.mc4j.ems.connection.EmsConnection;
import org.mc4j.ems.connection.bean.EmsBean;
import org.mc4j.ems.connection.bean.EmsBeanName;
+
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
@@ -48,13 +49,13 @@ import org.rhq.plugins.jmx.ObjectNameQueryUtility;
* @author Jason Dobies
* @author Ian Springer
*/
-public class TomcatConnectorDiscoveryComponent extends MBeanResourceDiscoveryComponent<TomcatServerComponent> {
+public class TomcatConnectorDiscoveryComponent extends MBeanResourceDiscoveryComponent<TomcatServerComponent<?>> {
private final Log log = LogFactory.getLog(this.getClass());
// MBeanResourceDiscoveryComponent Overridden Methods --------------------------------------------
@Override
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<TomcatServerComponent> context) {
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<TomcatServerComponent<?>> context) {
// Connector objectNames can have two formats:
// Catalina:type=Connector,port=%port% (this is the default for the connector type in the plugin desc)
diff --git a/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatServerComponent.java b/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatServerComponent.java
index d67f072..bc843ef 100644
--- a/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatServerComponent.java
+++ b/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatServerComponent.java
@@ -48,6 +48,7 @@ import org.rhq.core.domain.measurement.MeasurementDataTrait;
import org.rhq.core.domain.measurement.MeasurementReport;
import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
import org.rhq.core.pluginapi.operation.OperationFacet;
@@ -60,8 +61,8 @@ import org.rhq.plugins.jmx.JMXDiscoveryComponent;
*
* @author Jay Shaughnessy
*/
-@SuppressWarnings("unchecked")
-public class TomcatServerComponent implements JMXComponent, MeasurementFacet, OperationFacet {
+public class TomcatServerComponent<T extends ResourceComponent<?>> implements JMXComponent<T>, MeasurementFacet,
+ OperationFacet {
public enum SupportedOperations {
/**
@@ -251,14 +252,15 @@ public class TomcatServerComponent implements JMXComponent, MeasurementFacet, Op
// Since the connection is attempted each time it's used, failure to connect could result in log
// file spamming. Log it once for every 10 consecutive times it's encountered.
if (consecutiveConnectionErrors % 10 == 0) {
- log.warn("Could not establish connection to the Tomcat instance ["
- + (consecutiveConnectionErrors + 1) + "] times for resource ["
- + resourceContext.getResourceKey() + "]", e);
+ log.warn(
+ "Could not establish connection to the Tomcat instance [" + (consecutiveConnectionErrors + 1)
+ + "] times for resource [" + resourceContext.getResourceKey() + "]", e);
}
if (log.isDebugEnabled())
- log.debug("Could not connect to the Tomcat instance for resource ["
- + resourceContext.getResourceKey() + "]", e);
+ log.debug(
+ "Could not connect to the Tomcat instance for resource [" + resourceContext.getResourceKey()
+ + "]", e);
consecutiveConnectionErrors++;
diff --git a/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatUserDatabaseComponent.java b/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatUserDatabaseComponent.java
index 880ecc5..bb13097 100644
--- a/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatUserDatabaseComponent.java
+++ b/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatUserDatabaseComponent.java
@@ -24,6 +24,7 @@
package org.jboss.on.plugins.tomcat;
import org.jboss.on.plugins.tomcat.helper.CreateResourceHelper;
+
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.resource.CreateResourceStatus;
import org.rhq.core.pluginapi.inventory.CreateChildResourceFacet;
@@ -35,7 +36,8 @@ import org.rhq.plugins.jmx.MBeanResourceComponent;
*
* @author Jay Shaughnessy
*/
-public class TomcatUserDatabaseComponent extends MBeanResourceComponent<TomcatServerComponent> implements CreateChildResourceFacet {
+public class TomcatUserDatabaseComponent extends MBeanResourceComponent<TomcatServerComponent<?>> implements
+ CreateChildResourceFacet {
public CreateResourceReport createResource(CreateResourceReport report) {
String resourceTypeName = report.getResourceType().getName();
diff --git a/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatVHostComponent.java b/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatVHostComponent.java
index 2746c5b..7f600a7 100644
--- a/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatVHostComponent.java
+++ b/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatVHostComponent.java
@@ -64,7 +64,7 @@ import org.rhq.plugins.jmx.MBeanResourceComponent;
* @author Heiko W. Rupp
*
*/
-public class TomcatVHostComponent extends MBeanResourceComponent<TomcatServerComponent> implements
+public class TomcatVHostComponent extends MBeanResourceComponent<TomcatServerComponent<?>> implements
ApplicationServerComponent, CreateChildResourceFacet {
public static final String CONFIG_ALIASES = "aliases";
@@ -358,9 +358,8 @@ public class TomcatVHostComponent extends MBeanResourceComponent<TomcatServerCom
deployer = new TomcatApplicationDeployer(connection, getName());
}
} catch (Throwable e) {
- log
- .error("Unable to access Deployer MBean required for creation and deletion of managed resources - this should never happen. Cause: "
- + e);
+ log.error("Unable to access Deployer MBean required for creation and deletion of managed resources - this should never happen. Cause: "
+ + e);
}
return deployer;
diff --git a/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatVHostDiscoveryComponent.java b/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatVHostDiscoveryComponent.java
index 7b3f0a1..5cf6143 100644
--- a/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatVHostDiscoveryComponent.java
+++ b/modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatVHostDiscoveryComponent.java
@@ -37,16 +37,17 @@ import org.rhq.plugins.jmx.MBeanResourceDiscoveryComponent;
* @author Jay Shaughnessy
* @author Heiko W. Rupp
*/
-public class TomcatVHostDiscoveryComponent extends MBeanResourceDiscoveryComponent<TomcatServerComponent> {
-
- static Pattern pattern = Pattern.compile(".*host=([\\w.]+).*");
+public class TomcatVHostDiscoveryComponent extends MBeanResourceDiscoveryComponent<TomcatServerComponent<?>> {
+
+ static Pattern pattern = Pattern.compile(".*host=([\\w.]+).*");
@Override
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<TomcatServerComponent> discoveryContext) {
+ public Set<DiscoveredResourceDetails> discoverResources(
+ ResourceDiscoveryContext<TomcatServerComponent<?>> discoveryContext) {
Set<DiscoveredResourceDetails> resources = super.discoverResources(discoveryContext);
- for (DiscoveredResourceDetails detail : resources) {
+ for (DiscoveredResourceDetails detail : resources) {
String name = detail.getResourceName();
Matcher m = pattern.matcher(name);
if (m.matches()) {
diff --git a/modules/plugins/twitter/src/main/java/org/rhq/plugins/twitter/TwitterComponent.java b/modules/plugins/twitter/src/main/java/org/rhq/plugins/twitter/TwitterComponent.java
index eab4634..f6283ce 100644
--- a/modules/plugins/twitter/src/main/java/org/rhq/plugins/twitter/TwitterComponent.java
+++ b/modules/plugins/twitter/src/main/java/org/rhq/plugins/twitter/TwitterComponent.java
@@ -54,7 +54,7 @@ import org.rhq.core.pluginapi.operation.OperationResult;
*
* @author Heiko W. Rupp
*/
-public class TwitterComponent implements ResourceComponent, OperationFacet, MeasurementFacet
+public class TwitterComponent implements ResourceComponent<ResourceComponent<?>>, OperationFacet, MeasurementFacet
{
private final Log log = LogFactory.getLog(this.getClass());
diff --git a/modules/plugins/virt/src/main/java/org/rhq/plugins/virt/VirtualizationHostComponent.java b/modules/plugins/virt/src/main/java/org/rhq/plugins/virt/VirtualizationHostComponent.java
index 0c9b9cd..33f0478 100644
--- a/modules/plugins/virt/src/main/java/org/rhq/plugins/virt/VirtualizationHostComponent.java
+++ b/modules/plugins/virt/src/main/java/org/rhq/plugins/virt/VirtualizationHostComponent.java
@@ -47,7 +47,7 @@ import org.rhq.plugins.virt.LibVirtConnection.HVInfo;
*
* @author Greg Hinkle
*/
-public class VirtualizationHostComponent implements ResourceComponent, MeasurementFacet, ConfigurationFacet,
+public class VirtualizationHostComponent implements ResourceComponent<ResourceComponent<?>>, MeasurementFacet, ConfigurationFacet,
CreateChildResourceFacet {
private Log log = LogFactory.getLog(VirtualizationDomainComponent.class);
commit 57e2de0e2dffbee8bc6aa7d9777542a700e71a62
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Wed Sep 14 17:40:54 2011 -0400
add commented out skipTests=true prop in overrides profile
diff --git a/etc/m2/settings.xml b/etc/m2/settings.xml
index bf489e0..7c4e855 100644
--- a/etc/m2/settings.xml
+++ b/etc/m2/settings.xml
@@ -61,6 +61,7 @@
<!--<enforcer.skip>true</enforcer.skip>-->
<!-- *** surefire plugin settings *** -->
+ <!--<skipTests>true</skipTests>-->
<!--<maven.test.skip>true</maven.test.skip>-->
<!--<maven.test.failure.ignore>true</maven.test.failure.ignore>-->
<!--<maven.test.error.ignore>true</maven.test.error.ignore>-->
commit e83562248e5ec6296afe826417bb5af70c32643e
Merge: 63a0592 40bdc06
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Wed Sep 14 17:38:57 2011 -0400
Merge branch 'master' of ssh://git.fedorahosted.org/git/rhq/rhq
commit 40bdc0627dc468d6e968ce01fb35d216f315ae52
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Sep 14 17:10:47 2011 -0400
Filter queue by resource id when checking for deleted configs
When resources are discovered after the agent has already been running,
an inventory sync is triggered, and for syncing drift configs this has a
different execution path than an inventory sync at start up because
DriftManager is already initialized. In this execution path I was
detecting deleted configs incorrectly. When comparings the configs from
the server against the configs in the schedule queue, we need to filter
the queue by resource id.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
index 414c232..a4f292f 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
@@ -2149,7 +2149,7 @@ public class InventoryManager extends AgentService implements ContainerService,
List<DriftConfiguration> deleted = new ArrayList<DriftConfiguration>();
- for (DriftDetectionSchedule schedule : queue.toArray()) {
+ for (DriftDetectionSchedule schedule : getSchedulesForResource(resourceId, queue.toArray())) {
if (!configsFromServerSet.contains(schedule.getDriftConfiguration())) {
if (log.isDebugEnabled()) {
log.debug("Detected stale drift configuration. Preparing to unschedule " + schedule);
@@ -2227,6 +2227,16 @@ public class InventoryManager extends AgentService implements ContainerService,
}
}
+ private List<DriftDetectionSchedule> getSchedulesForResource(int resourceId, DriftDetectionSchedule[] schedules) {
+ List<DriftDetectionSchedule> resourceSchedules = new LinkedList<DriftDetectionSchedule>();
+ for (DriftDetectionSchedule s : schedules) {
+ if (s.getResourceId() == resourceId) {
+ resourceSchedules.add(s);
+ }
+ }
+ return resourceSchedules;
+ }
+
/**
* Calling this method will immediately perform an availability check on all inventories resources. The availability
* checks will be made asynchronously; this method will not block.
commit 50b7ebaa0106ff1995d21ea54b58ef2a49cbd571
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Wed Sep 14 14:28:49 2011 -0500
Merge branch 'master' of ssh://git.fedorahosted.org/git/rhq/rhq
Conflicts:
modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
index 416e90a..414c232 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
@@ -23,6 +23,7 @@
package org.rhq.core.pc.inventory;
import static org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS;
+import static org.rhq.core.util.file.FileUtil.purge;
import java.io.File;
import java.net.URL;
@@ -125,9 +126,6 @@ import org.rhq.core.system.SystemInfoFactory;
import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.core.util.exception.WrappedRemotingException;
-import static org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS;
-import static org.rhq.core.util.file.FileUtil.purge;
-
/**
* Manages the process of both auto-detection of servers and runtime detection of services across all plugins. Manages
* their scheduling and result sending as well as the general inventory model.
@@ -2178,8 +2176,8 @@ public class InventoryManager extends AgentService implements ContainerService,
}
}
} else {
- log.info("DriftManager is not available. Drift configurations will be persisted but detection will not " +
- "be scheduled.");
+ log.info("DriftManager is not available. Drift configurations will be persisted but detection will not "
+ + "be scheduled.");
// First check for drift configurations that have been deleted
log.debug("Checking for stale drift configurations that need to be purged from inventory");
@@ -2220,8 +2218,8 @@ public class InventoryManager extends AgentService implements ContainerService,
ResourceContainer container = getResourceContainer(resourceId);
for (DriftConfiguration c : configsFromServer.get(resourceId)) {
if (log.isDebugEnabled()) {
- log.debug("Adding DriftConfiguration[name: " + c.getName() + ", resourceId: " + resourceId +
- "]");
+ log.debug("Adding DriftConfiguration[name: " + c.getName() + ", resourceId: " + resourceId
+ + "]");
}
container.addDriftConfiguration(c);
}
commit 8e8c1d9068d0d7ab3da91b9ef3c2b9e3fdb36adb
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Wed Sep 14 13:52:10 2011 -0500
First set of wildcard generic updates. The change was mainly done in the plugin-api module but updated all the code directly affected by the change.
diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/event/log/LogFileEventResourceComponentHelper.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/event/log/LogFileEventResourceComponentHelper.java
index 02430c2..962764a 100644
--- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/event/log/LogFileEventResourceComponentHelper.java
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/event/log/LogFileEventResourceComponentHelper.java
@@ -24,23 +24,23 @@ import java.text.SimpleDateFormat;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PropertyList;
import org.rhq.core.domain.configuration.Property;
+import org.rhq.core.domain.configuration.PropertyList;
import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.event.EventSeverity;
+import org.rhq.core.pluginapi.event.EventContext;
+import org.rhq.core.pluginapi.event.EventPoller;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceContext;
-import org.rhq.core.pluginapi.event.EventPoller;
-import org.rhq.core.pluginapi.event.EventContext;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
/**
* @author Ian Springer
*/
-public class LogFileEventResourceComponentHelper
-{
+public class LogFileEventResourceComponentHelper {
public static final String LOG_ENTRY_EVENT_TYPE = "logEntry";
public static final String LOG_EVENT_SOURCES_CONFIG_PROP = "logEventSources";
@@ -56,10 +56,9 @@ public class LogFileEventResourceComponentHelper
private final Log log = LogFactory.getLog(this.getClass());
- private ResourceContext resourceContext;
+ private ResourceContext<?> resourceContext;
- public LogFileEventResourceComponentHelper(ResourceContext resourceContext)
- {
+ public LogFileEventResourceComponentHelper(ResourceContext<?> resourceContext) {
this.resourceContext = resourceContext;
}
@@ -71,13 +70,14 @@ public class LogFileEventResourceComponentHelper
Boolean enabled = Boolean.valueOf(logEventSource.getSimpleValue(LogEventSourcePropertyNames.ENABLED, null));
if (enabled) {
String logFilePathname = logEventSource.getSimpleValue(LogEventSourcePropertyNames.LOG_FILE_PATH, null);
- if (logFilePathname==null) {
+ if (logFilePathname == null) {
log.info("LOGFILE: No logfile path given, can not watch this event log.");
return;
}
File logFile = new File(logFilePathname);
if (!logFile.exists() || !logFile.canRead()) {
- log.error("LOGFILE: Logfile at location " + logFilePathname + " does not exist or is not readable. Can not start watching the event log.");
+ log.error("LOGFILE: Logfile at location " + logFilePathname
+ + " does not exist or is not readable. Can not start watching the event log.");
return;
}
diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ClassLoaderFacet.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ClassLoaderFacet.java
index c08449e..df7dc31 100644
--- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ClassLoaderFacet.java
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ClassLoaderFacet.java
@@ -37,7 +37,7 @@ import java.util.List;
*
* @author John Mazzitelli
*/
-public interface ClassLoaderFacet<T extends ResourceComponent> {
+public interface ClassLoaderFacet<T extends ResourceComponent<?>> {
/**
* This method provides the location for additional jars that are needed in the resource's classloader
* in order to properly connect and talk to the managed resource.
diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ManualAddFacet.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ManualAddFacet.java
index 62ef20c..476e8d8 100644
--- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ManualAddFacet.java
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ManualAddFacet.java
@@ -40,7 +40,7 @@ import org.rhq.core.domain.configuration.Configuration;
*
* @author Ian Springer
*/
-public interface ManualAddFacet<T extends ResourceComponent> {
+public interface ManualAddFacet<T extends ResourceComponent<?>> {
/**
* Using the specified plugin configuration, creates a DiscoveredResourceDetails object describing a new Resource
* to be added to inventory.
diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceComponent.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceComponent.java
index 6d1147a..aebea7f 100644
--- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceComponent.java
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceComponent.java
@@ -54,7 +54,7 @@ import org.rhq.core.pluginapi.support.SupportFacet;
* @param <T> the parent resource component type for this component. This means you can nest a hierarchy of resource
* components that mimic the resource type hierarchy as defined in a plugin deployment descriptor.
*/
-public interface ResourceComponent<T extends ResourceComponent> extends AvailabilityFacet {
+public interface ResourceComponent<T extends ResourceComponent<?>> extends AvailabilityFacet {
/**
* Initializes the resource component, possibly connecting to the managed resource itself. The implementation can be
* custom to the plugin or resource, but the idea is that a resource component can create a single connection to
diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceContext.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceContext.java
index a86a08d..853345d 100644
--- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceContext.java
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceContext.java
@@ -58,14 +58,14 @@ import org.rhq.core.system.pquery.ProcessInfoQuery;
* @author John Mazzitelli
*/
@SuppressWarnings("unchecked")
-public class ResourceContext<T extends ResourceComponent> {
+public class ResourceContext<T extends ResourceComponent<?>> {
private final String resourceKey;
private final ResourceType resourceType;
private final String version;
private final T parentResourceComponent;
private final Configuration pluginConfiguration;
private final SystemInfo systemInformation;
- private final ResourceDiscoveryComponent resourceDiscoveryComponent;
+ private final ResourceDiscoveryComponent<T> resourceDiscoveryComponent;
private final File temporaryDirectory;
private final File dataDirectory;
private final String pluginContainerName;
@@ -105,7 +105,7 @@ public class ResourceContext<T extends ResourceComponent> {
* @param pluginContainerDeployment indicates where the plugin container is running
*/
public ResourceContext(Resource resource, T parentResourceComponent,
- ResourceDiscoveryComponent resourceDiscoveryComponent, SystemInfo systemInfo, File temporaryDirectory,
+ ResourceDiscoveryComponent<T> resourceDiscoveryComponent, SystemInfo systemInfo, File temporaryDirectory,
File dataDirectory, String pluginContainerName, EventContext eventContext, OperationContext operationContext,
ContentContext contentContext, Executor availCollectorThreadPool,
PluginContainerDeployment pluginContainerDeployment) {
@@ -221,11 +221,11 @@ public class ResourceContext<T extends ResourceComponent> {
if (this.resourceDiscoveryComponent != null) {
try {
Set<DiscoveredResourceDetails> details;
- ResourceDiscoveryContext<ResourceComponent<?>> context;
+ ResourceDiscoveryContext<T> context;
- context = new ResourceDiscoveryContext<ResourceComponent<?>>(this.resourceType,
- this.parentResourceComponent, this, this.systemInformation, getNativeProcessesForType(),
- Collections.EMPTY_LIST, getPluginContainerName(), getPluginContainerDeployment());
+ context = new ResourceDiscoveryContext<T>(this.resourceType, this.parentResourceComponent, this,
+ this.systemInformation, getNativeProcessesForType(), Collections.EMPTY_LIST,
+ getPluginContainerName(), getPluginContainerDeployment());
details = this.resourceDiscoveryComponent.discoverResources(context);
diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceDiscoveryComponent.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceDiscoveryComponent.java
index e93a38b..b695290 100644
--- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceDiscoveryComponent.java
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceDiscoveryComponent.java
@@ -38,7 +38,7 @@ import java.util.Set;
*
* @see ClassLoaderFacet
*/
-public interface ResourceDiscoveryComponent<T extends ResourceComponent> {
+public interface ResourceDiscoveryComponent<T extends ResourceComponent<?>> {
/**
* <p>Asks the discovery component to discover all of its resources. The plugin container may or may not have already
* {@link ResourceDiscoveryContext#getAutoDiscoveredProcesses() auto-discovered} some resources for this component
diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceDiscoveryContext.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceDiscoveryContext.java
index 3c45e79..b9e9bcd 100644
--- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceDiscoveryContext.java
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceDiscoveryContext.java
@@ -53,7 +53,7 @@ import org.rhq.core.system.SystemInfo;
*
* @author John Mazzitelli
*/
-public class ResourceDiscoveryContext<T extends ResourceComponent> {
+public class ResourceDiscoveryContext<T extends ResourceComponent<?>> {
private final ResourceType resourceType;
private final T parentComponent;
private final PluginContainerDeployment pluginContainerDeployment;
@@ -61,7 +61,7 @@ public class ResourceDiscoveryContext<T extends ResourceComponent> {
/**
* @since 1.0.1
*/
- private final ResourceContext parentResourceContext;
+ private final ResourceContext<?> parentResourceContext;
private final SystemInfo systemInformation;
private final List<ProcessScanResult> processScanResults;
private final List<Configuration> pluginConfigurations;
@@ -86,12 +86,11 @@ public class ResourceDiscoveryContext<T extends ResourceComponent> {
* can be assured this name is unique across <b>all</b> plugin containers/agents running
* @param pluginContainerDeployment indicates where the plugin container is running
*/
- @SuppressWarnings("unchecked")
public ResourceDiscoveryContext(ResourceType resourceType, T parentComponent,
- ResourceContext parentResourceContext, SystemInfo systemInfo, List<ProcessScanResult> processScanResults,
+ ResourceContext<?> parentResourceContext, SystemInfo systemInfo, List<ProcessScanResult> processScanResults,
String pluginContainerName, PluginContainerDeployment pluginContainerDeployment) {
this(resourceType, parentComponent, parentResourceContext, systemInfo, processScanResults, null,
- pluginContainerName, pluginContainerDeployment);
+ pluginContainerName, pluginContainerDeployment);
}
/**
@@ -119,7 +118,7 @@ public class ResourceDiscoveryContext<T extends ResourceComponent> {
*/
@SuppressWarnings("unchecked")
public ResourceDiscoveryContext(ResourceType resourceType, T parentComponent,
- ResourceContext parentResourceContext, SystemInfo systemInfo, List<ProcessScanResult> processScanResults,
+ ResourceContext<?> parentResourceContext, SystemInfo systemInfo, List<ProcessScanResult> processScanResults,
List<Configuration> pluginConfigurations, String pluginContainerName,
PluginContainerDeployment pluginContainerDeployment) {
this.resourceType = resourceType;
@@ -161,7 +160,7 @@ public class ResourceDiscoveryContext<T extends ResourceComponent> {
* @return the resource context for the parent
* @since 1.0.1
*/
- public ResourceContext getParentResourceContext() {
+ public ResourceContext<?> getParentResourceContext() {
return parentResourceContext;
}
diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/upgrade/ResourceUpgradeContext.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/upgrade/ResourceUpgradeContext.java
index c56d280..b4c6192 100644
--- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/upgrade/ResourceUpgradeContext.java
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/upgrade/ResourceUpgradeContext.java
@@ -44,27 +44,26 @@ import org.rhq.core.system.SystemInfo;
*
* @author Lukas Krejci
*/
-@SuppressWarnings("rawtypes")
-public class ResourceUpgradeContext<T extends ResourceComponent> extends ResourceContext<T> {
+public class ResourceUpgradeContext<T extends ResourceComponent<?>> extends ResourceContext<T> {
private final Configuration resourceConfiguration;
private final String name;
private final String description;
private ResourceContext<?> parentResourceContext;
-
+
/**
* @see ResourceContext#ResourceContext(Resource, ResourceComponent, ResourceDiscoveryComponent, SystemInfo, File, File, String, EventContext, OperationContext, ContentContext, Executor, PluginContainerDeployment)
*/
- public ResourceUpgradeContext(Resource resource, ResourceContext<?> parentResourceContext, T parentResourceComponent,
- ResourceDiscoveryComponent resourceDiscoveryComponent, SystemInfo systemInfo, File temporaryDirectory,
- File dataDirectory, String pluginContainerName, EventContext eventContext, OperationContext operationContext,
- ContentContext contentContext, Executor availCollectorThreadPool,
+ public ResourceUpgradeContext(Resource resource, ResourceContext<?> parentResourceContext,
+ T parentResourceComponent, ResourceDiscoveryComponent<T> resourceDiscoveryComponent, SystemInfo systemInfo,
+ File temporaryDirectory, File dataDirectory, String pluginContainerName, EventContext eventContext,
+ OperationContext operationContext, ContentContext contentContext, Executor availCollectorThreadPool,
PluginContainerDeployment pluginContainerDeployment) {
-
- super(resource, parentResourceComponent, resourceDiscoveryComponent, systemInfo, temporaryDirectory, dataDirectory,
- pluginContainerName, eventContext, operationContext, contentContext, availCollectorThreadPool,
- pluginContainerDeployment);
-
+
+ super(resource, parentResourceComponent, resourceDiscoveryComponent, systemInfo, temporaryDirectory,
+ dataDirectory, pluginContainerName, eventContext, operationContext, contentContext,
+ availCollectorThreadPool, pluginContainerDeployment);
+
this.parentResourceContext = parentResourceContext;
this.resourceConfiguration = resource.getResourceConfiguration();
this.name = resource.getName();
@@ -72,9 +71,9 @@ public class ResourceUpgradeContext<T extends ResourceComponent> extends Resourc
}
public ResourceContext<?> getParentResourceContext() {
- return parentResourceContext;
+ return parentResourceContext;
}
-
+
public Configuration getResourceConfiguration() {
return resourceConfiguration;
}
diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/upgrade/ResourceUpgradeFacet.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/upgrade/ResourceUpgradeFacet.java
index 915a9e7..13c155a 100644
--- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/upgrade/ResourceUpgradeFacet.java
+++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/upgrade/ResourceUpgradeFacet.java
@@ -34,7 +34,7 @@ import org.rhq.core.pluginapi.inventory.ResourceComponent;
*
* @author Lukas Krejci
*/
-public interface ResourceUpgradeFacet<T extends ResourceComponent> {
+public interface ResourceUpgradeFacet<T extends ResourceComponent<?>> {
/**
* Specifies what data should change on the provided resource to upgrade it to the current version.
*
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
index fe15bb5..416e90a 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
@@ -22,6 +22,8 @@
*/
package org.rhq.core.pc.inventory;
+import static org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS;
+
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
@@ -251,16 +253,19 @@ public class InventoryManager extends AgentService implements ContainerService,
// inside EmbJopr).
if (configuration.isInsideAgent()) {
// After an initial delay (5s by default), periodically run an availability check (every 1m by default).
- availabilityThreadPoolExecutor.scheduleWithFixedDelay(availabilityExecutor, configuration
- .getAvailabilityScanInitialDelay(), configuration.getAvailabilityScanPeriod(), TimeUnit.SECONDS);
+ availabilityThreadPoolExecutor.scheduleWithFixedDelay(availabilityExecutor,
+ configuration.getAvailabilityScanInitialDelay(), configuration.getAvailabilityScanPeriod(),
+ TimeUnit.SECONDS);
// After an initial delay (10s by default), periodically run a server discovery scan (every 15m by default).
- inventoryThreadPoolExecutor.scheduleWithFixedDelay(serverScanExecutor, configuration
- .getServerDiscoveryInitialDelay(), configuration.getServerDiscoveryPeriod(), TimeUnit.SECONDS);
+ inventoryThreadPoolExecutor.scheduleWithFixedDelay(serverScanExecutor,
+ configuration.getServerDiscoveryInitialDelay(), configuration.getServerDiscoveryPeriod(),
+ TimeUnit.SECONDS);
// After an initial delay (20s by default), periodically run a service discovery scan (every 1d by default).
- inventoryThreadPoolExecutor.scheduleWithFixedDelay(serviceScanExecutor, configuration
- .getServiceDiscoveryInitialDelay(), configuration.getServiceDiscoveryPeriod(), TimeUnit.SECONDS);
+ inventoryThreadPoolExecutor.scheduleWithFixedDelay(serviceScanExecutor,
+ configuration.getServiceDiscoveryInitialDelay(), configuration.getServiceDiscoveryPeriod(),
+ TimeUnit.SECONDS);
}
} finally {
inventoryLock.writeLock().unlock();
@@ -317,8 +322,8 @@ public class InventoryManager extends AgentService implements ContainerService,
long timeout = getDiscoveryComponentTimeout(context.getResourceType());
try {
- ResourceDiscoveryComponent proxy = this.discoveryComponentProxyFactory.getDiscoveryComponentProxy(context
- .getResourceType(), component, timeout, parentResourceContainer);
+ ResourceDiscoveryComponent proxy = this.discoveryComponentProxyFactory.getDiscoveryComponentProxy(
+ context.getResourceType(), component, timeout, parentResourceContainer);
Set<DiscoveredResourceDetails> results = proxy.discoverResources(context);
return results;
} catch (TimeoutException te) {
@@ -348,13 +353,13 @@ public class InventoryManager extends AgentService implements ContainerService,
* @throws Exception if the discovery component threw an exception
*/
private DiscoveredResourceDetails discoverResource(ResourceDiscoveryComponent component,
- Configuration pluginConfig, ResourceDiscoveryContext context,
- ResourceContainer parentResourceContainer) throws Exception {
+ Configuration pluginConfig, ResourceDiscoveryContext context, ResourceContainer parentResourceContainer)
+ throws Exception {
long timeout = getDiscoveryComponentTimeout(context.getResourceType());
try {
- ManualAddFacet proxy = this.discoveryComponentProxyFactory.getDiscoveryComponentProxy(context
- .getResourceType(), component, timeout, ManualAddFacet.class, parentResourceContainer);
+ ManualAddFacet proxy = this.discoveryComponentProxyFactory.getDiscoveryComponentProxy(
+ context.getResourceType(), component, timeout, ManualAddFacet.class, parentResourceContainer);
DiscoveredResourceDetails result = proxy.discoverResource(pluginConfig, context);
return result;
} catch (TimeoutException te) {
@@ -393,8 +398,8 @@ public class InventoryManager extends AgentService implements ContainerService,
component, timeout, ClassLoaderFacet.class, parentContainer);
ResourceDiscoveryContext discoveryContext = new ResourceDiscoveryContext(resourceType, parentComponent,
- parentResourceContext, SystemInfoFactory.createSystemInfo(), null, null, this.configuration
- .getContainerName(), this.configuration.getPluginContainerDeployment());
+ parentResourceContext, SystemInfoFactory.createSystemInfo(), null, null,
+ this.configuration.getContainerName(), this.configuration.getPluginContainerDeployment());
// Configurations are not immutable, so clone the plugin config, so the plugin will not be able to change the
// actual PC-managed plugin config.
@@ -409,9 +414,9 @@ public class InventoryManager extends AgentService implements ContainerService,
return results;
}
- public <T extends ResourceComponent> ResourceUpgradeReport invokeDiscoveryComponentResourceUpgradeFacet(
- ResourceType resourceType, ResourceDiscoveryComponent<T> component,
- ResourceUpgradeContext<T> inventoriedResource, ResourceContainer parentResourceContainer) throws Throwable {
+ public <T extends ResourceComponent<?>> ResourceUpgradeReport invokeDiscoveryComponentResourceUpgradeFacet(
+ ResourceType resourceType, ResourceDiscoveryComponent<T> component,
+ ResourceUpgradeContext<T> inventoriedResource, ResourceContainer parentResourceContainer) throws Throwable {
long timeout = getDiscoveryComponentTimeout(resourceType);
try {
@@ -679,16 +684,16 @@ public class InventoryManager extends AgentService implements ContainerService,
DiscoveredResourceDetails discoveredResourceDetails;
if (discoveryComponent instanceof ManualAddFacet) {
// The plugin is using the new manual add API.
- ResourceDiscoveryContext<ResourceComponent> discoveryContext = new ResourceDiscoveryContext<ResourceComponent>(
+ ResourceDiscoveryContext<ResourceComponent<?>> discoveryContext = new ResourceDiscoveryContext<ResourceComponent<?>>(
resourceType, parentResourceComponent, parentResourceContainer.getResourceContext(),
SystemInfoFactory.createSystemInfo(), new ArrayList<ProcessScanResult>(0),
- new ArrayList<Configuration>(0), this.configuration.getContainerName(), this.configuration
- .getPluginContainerDeployment());
+ new ArrayList<Configuration>(0), this.configuration.getContainerName(),
+ this.configuration.getPluginContainerDeployment());
// Ask the plugin's discovery component to find the new resource, throwing exceptions if it cannot be
// found at all.
discoveredResourceDetails = discoverResource(discoveryComponent, pluginConfiguration, discoveryContext,
- parentResourceContainer);
+ parentResourceContainer);
if (discoveredResourceDetails == null) {
log.info("Plugin Error: During manual add, discovery component method ["
+ discoveryComponent.getClass().getName() + ".discoverResource()] returned null "
@@ -706,7 +711,7 @@ public class InventoryManager extends AgentService implements ContainerService,
+ "rather than the new ManualAddFacet interface.");
List<Configuration> pluginConfigurations = new ArrayList<Configuration>(1);
pluginConfigurations.add(pluginConfiguration);
- ResourceDiscoveryContext<ResourceComponent> discoveryContext = new ResourceDiscoveryContext<ResourceComponent>(
+ ResourceDiscoveryContext<ResourceComponent<?>> discoveryContext = new ResourceDiscoveryContext<ResourceComponent<?>>(
resourceType, parentResourceComponent, parentResourceContainer.getResourceContext(),
SystemInfoFactory.createSystemInfo(), new ArrayList<ProcessScanResult>(0), pluginConfigurations,
this.configuration.getContainerName(), this.configuration.getPluginContainerDeployment());
@@ -885,8 +890,7 @@ public class InventoryManager extends AgentService implements ContainerService,
if ((this.platform != null) && (this.platform.getInventoryStatus() == InventoryStatus.NEW)
&& newPlatformWasDeletedRecently) {
// let's make sure we are registered; its probable that our platform was deleted and we need to re-register
- log
- .info("No committed resources to send in our availability report - the platform/agent was deleted, let's re-register again");
+ log.info("No committed resources to send in our availability report - the platform/agent was deleted, let's re-register again");
registerWithServer();
newPlatformWasDeletedRecently = false; // we've tried to recover from our platform being deleted, let's not do it again
}
@@ -929,8 +933,8 @@ public class InventoryManager extends AgentService implements ContainerService,
log.debug("Availability report content: " + report.toString(log.isTraceEnabled()));
}
- boolean ok = configuration.getServerServices().getDiscoveryServerService().mergeAvailabilityReport(
- report);
+ boolean ok = configuration.getServerServices().getDiscoveryServerService()
+ .mergeAvailabilityReport(report);
if (!ok) {
// I guess I could immediately call executeAvailabilityScanImmediately and pass its results to
// mergeAvailabilityReport again right now, but what happens if we've queued up a bunch of
@@ -976,9 +980,9 @@ public class InventoryManager extends AgentService implements ContainerService,
(System.currentTimeMillis() - startTime)));
}
} catch (StaleTypeException e) {
- log.error("Failed to merge inventory report with server. The report contains one or more resource types " +
- "that have been marked for deletion. Notifying the plugin container that a reboot is needed to purge " +
- "stale types.");
+ log.error("Failed to merge inventory report with server. The report contains one or more resource types "
+ + "that have been marked for deletion. Notifying the plugin container that a reboot is needed to purge "
+ + "stale types.");
PluginContainer.getInstance().notifyRebootRequestListener();
return false;
} catch (InvalidInventoryReportException e) {
@@ -986,8 +990,7 @@ public class InventoryManager extends AgentService implements ContainerService,
if ((this.platform != null) && (this.platform.getInventoryStatus() == InventoryStatus.NEW)
&& newPlatformWasDeletedRecently) {
// let's make sure we are registered; its probable that our platform was deleted and we need to re-register
- log
- .info("The inventory report was invalid probably because the platform/Agent was deleted; let's re-register...");
+ log.info("The inventory report was invalid probably because the platform/Agent was deleted; let's re-register...");
registerWithServer();
newPlatformWasDeletedRecently = false; // we've tried to recover from our platform being deleted, let's not do it again
}
@@ -1183,8 +1186,8 @@ public class InventoryManager extends AgentService implements ContainerService,
parent.removeChildResource(resource);
}
- PluginContainer.getInstance().getMeasurementManager().unscheduleCollection(
- Collections.singleton(resource.getId()));
+ PluginContainer.getInstance().getMeasurementManager()
+ .unscheduleCollection(Collections.singleton(resource.getId()));
if (this.resourceContainers.remove(resource.getUuid()) == null) {
if (log.isDebugEnabled()) {
@@ -1290,8 +1293,8 @@ public class InventoryManager extends AgentService implements ContainerService,
logMessage.append("description, ");
}
- logMessage.replace(logMessage.length() - 1, logMessage.length(), "to become [").append(
- existingResource.toString()).append("]");
+ logMessage.replace(logMessage.length() - 1, logMessage.length(), "to become [")
+ .append(existingResource.toString()).append("]");
log.info(logMessage.toString());
} else {
@@ -1452,22 +1455,24 @@ public class InventoryManager extends AgentService implements ContainerService,
* @throws PluginContainerException
* @return true the resource has been successfully prepared and can be started. False if the resource should not be started.
*/
- private boolean prepareResourceForActivation(Resource resource, @NotNull ResourceContainer container, boolean forceReinitialization) throws InvalidPluginConfigurationException, PluginContainerException {
+ private boolean prepareResourceForActivation(Resource resource, @NotNull ResourceContainer container,
+ boolean forceReinitialization) throws InvalidPluginConfigurationException, PluginContainerException {
if (resourceUpgradeDelegate.hasUpgradeFailed(resource)) {
if (log.isTraceEnabled()) {
log.trace("Skipping activation of " + resource + " - it has failed to upgrade.");
}
return false;
}
-
+
ResourceComponent component = container.getResourceComponent();
// if the component already exists and is started, and the resource's plugin config has not changed, there is
// nothing to do, so return immediately
- if ((component != null) && (container.getResourceComponentState() == ResourceComponentState.STARTED
- && !forceReinitialization)) {
+ if ((component != null)
+ && (container.getResourceComponentState() == ResourceComponentState.STARTED && !forceReinitialization)) {
if (log.isTraceEnabled()) {
- log.trace("No need to prepare the activation of resource " + resource + " - its component is already started and its plugin "
+ log.trace("No need to prepare the activation of resource " + resource
+ + " - its component is already started and its plugin "
+ "config has not been updated since it was last started.");
}
return false;
@@ -1475,7 +1480,8 @@ public class InventoryManager extends AgentService implements ContainerService,
if (log.isDebugEnabled()) {
log.debug("Preparing component for [" + resource + "] for activation, current state=["
- + container.getResourceComponentState() + "], forcing reinitialization=[" + forceReinitialization + "]...");
+ + container.getResourceComponentState() + "], forcing reinitialization=[" + forceReinitialization
+ + "]...");
}
// If the component does not even exist yet, we need to instantiate it and set it on the container.
@@ -1494,7 +1500,7 @@ public class InventoryManager extends AgentService implements ContainerService,
//this is a transient field, so reinitialize it just in case this is invoked just after
//loadFromDisk()
container.setResourceComponentState(ResourceComponentState.STOPPED);
-
+
// start the resource, but only if its parent component is running. If the parent is null, that means
// the resource is, itself, the root platform and we always activate that.
ResourceContainer parentResourceContainer;
@@ -1524,8 +1530,8 @@ public class InventoryManager extends AgentService implements ContainerService,
log.warn("Cannot give activated resource its discovery component. Cause: " + e);
}
- ConfigurationUtility.normalizeConfiguration(resource.getPluginConfiguration(), type
- .getPluginConfigurationDefinition());
+ ConfigurationUtility.normalizeConfiguration(resource.getPluginConfiguration(),
+ type.getPluginConfigurationDefinition());
ResourceComponent<?> parentComponent = null;
if (resource.getParentResource() != null) {
@@ -1539,13 +1545,14 @@ public class InventoryManager extends AgentService implements ContainerService,
return true;
} else {
if (log.isDebugEnabled()) {
- log.debug("Resource [" + resource + "] not being prepared for activation; parent isn't started: " + parentResourceContainer);
+ log.debug("Resource [" + resource + "] not being prepared for activation; parent isn't started: "
+ + parentResourceContainer);
}
-
+
return false;
}
}
-
+
/**
* This will start the resource's plugin component, creating it first if it has not yet been created. If the
* component is already created and started, this method is a no-op.
@@ -1570,12 +1577,12 @@ public class InventoryManager extends AgentService implements ContainerService,
}
if (prepareResourceForActivation(resource, container, updatedPluginConfig)) {
-
+
ResourceContext context = container.getResourceContext();
-
+
// Wrap the component in a proxy that will provide locking and a timeout for the call to start().
- ResourceComponent component = container.createResourceComponentProxy(ResourceComponent.class, FacetLockType.READ,
- COMPONENT_START_TIMEOUT, true, false);
+ ResourceComponent component = container.createResourceComponentProxy(ResourceComponent.class,
+ FacetLockType.READ, COMPONENT_START_TIMEOUT, true, false);
try {
// One last check to make sure another thread didn't beat us to the punch.
@@ -1613,7 +1620,7 @@ public class InventoryManager extends AgentService implements ContainerService,
}
}
- private <T extends ResourceComponent> ResourceContext<T> createResourceContext(Resource resource,
+ private <T extends ResourceComponent<?>> ResourceContext<T> createResourceContext(Resource resource,
T parentComponent, ResourceDiscoveryComponent<T> discoveryComponent) {
File pluginDataDir = new File(this.configuration.getDataDirectory(), resource.getResourceType().getPlugin());
@@ -1631,7 +1638,7 @@ public class InventoryManager extends AgentService implements ContainerService,
this.configuration.getPluginContainerDeployment()); // helps components make determinations of what to do
}
- public <T extends ResourceComponent> ResourceUpgradeContext<T> createResourceUpgradeContext(Resource resource,
+ public <T extends ResourceComponent<?>> ResourceUpgradeContext<T> createResourceUpgradeContext(Resource resource,
ResourceContext<?> parentResourceContext, T parentComponent, ResourceDiscoveryComponent<T> discoveryComponent) {
File pluginDataDir = new File(this.configuration.getDataDirectory(), resource.getResourceType().getPlugin());
@@ -1662,8 +1669,8 @@ public class InventoryManager extends AgentService implements ContainerService,
resource.setConnected(false); // invalid plugin configuration infers the resource component is disconnected
// Give the server-side an error message describing the connection failure that can be
// displayed on the resource's Inventory page.
- ResourceError resourceError = new ResourceError(resource, ResourceErrorType.INVALID_PLUGIN_CONFIGURATION, t
- .getLocalizedMessage(), ThrowableUtil.getStackAsString(t), System.currentTimeMillis());
+ ResourceError resourceError = new ResourceError(resource, ResourceErrorType.INVALID_PLUGIN_CONFIGURATION,
+ t.getLocalizedMessage(), ThrowableUtil.getStackAsString(t), System.currentTimeMillis());
return sendResourceErrorToServer(resourceError);
}
@@ -1922,8 +1929,7 @@ public class InventoryManager extends AgentService implements ContainerService,
}
} else {
// This is very strange - there are no platform types - we should never be missing the built-in platform plugin.
- log
- .error("Missing platform plugin(s) - falling back to dummy platform impl; this should only occur in tests!");
+ log.error("Missing platform plugin(s) - falling back to dummy platform impl; this should only occur in tests!");
// TODO: Set sysprop (e.g. rhq.test.mode=true) in integration tests,
// and throw a runtime exception here if that sysprop is not set.
return getTestPlatform();
@@ -2133,8 +2139,8 @@ public class InventoryManager extends AgentService implements ContainerService,
log.info("Syncing drift configurations from server with local inventory...");
DriftManager driftMgr = PluginContainer.getInstance().getDriftManager();
if (driftMgr != null && driftMgr.isInitialized()) {
- DriftConfigurationComparator comparator =
- new DriftConfigurationComparator(BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS);
+ DriftConfigurationComparator comparator = new DriftConfigurationComparator(
+ BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS);
ScheduleQueue queue = driftMgr.getSchedulesQueue();
// First check for drift configurations that have been deleted
@@ -2164,8 +2170,8 @@ public class InventoryManager extends AgentService implements ContainerService,
for (DriftConfiguration c : configsFromServer.get(resourceId)) {
if (!queue.contains(resourceId, c, comparator)) {
if (log.isDebugEnabled()) {
- log.debug("Detected new drift configuration. Creating new schedule for " +
- "DriftConfiguration[name: " + c.getName() + ", resourceId: " + resourceId + "]");
+ log.debug("Detected new drift configuration. Creating new schedule for "
+ + "DriftConfiguration[name: " + c.getName() + ", resourceId: " + resourceId + "]");
}
driftMgr.scheduleDriftDetection(resourceId, c);
}
@@ -2190,8 +2196,8 @@ public class InventoryManager extends AgentService implements ContainerService,
for (DriftConfiguration c : container.getDriftConfigurations()) {
if (!resourceConfigs.contains(c)) {
if (log.isDebugEnabled()) {
- log.debug("Detected stale drift configuration. Preparing to delete DriftConfiguration[" +
- "name: " + c.getName() + ", resourceId: " + resourceId + "]");
+ log.debug("Detected stale drift configuration. Preparing to delete DriftConfiguration["
+ + "name: " + c.getName() + ", resourceId: " + resourceId + "]");
}
deleted.add(c);
}
@@ -2394,8 +2400,8 @@ public class InventoryManager extends AgentService implements ContainerService,
try {
ResourceDiscoveryContext context = new ResourceDiscoveryContext(resourceType, parentComponent,
parentResourceContext, SystemInfoFactory.createSystemInfo(), processScanResults,
- Collections.EMPTY_LIST, this.configuration.getContainerName(), this.configuration
- .getPluginContainerDeployment());
+ Collections.EMPTY_LIST, this.configuration.getContainerName(),
+ this.configuration.getPluginContainerDeployment());
newResources = new HashSet<Resource>();
try {
Set<DiscoveredResourceDetails> discoveredResources = invokeDiscoveryComponent(parentContainer,
@@ -2631,8 +2637,8 @@ public class InventoryManager extends AgentService implements ContainerService,
if (log.isDebugEnabled()) {
log.debug("Merging [" + modifiedResourceIds.size() + "] modified Resources into local inventory...");
}
- Set<Resource> modifiedResources = configuration.getServerServices().getDiscoveryServerService().getResources(
- modifiedResourceIds, false);
+ Set<Resource> modifiedResources = configuration.getServerServices().getDiscoveryServerService()
+ .getResources(modifiedResourceIds, false);
syncSchedules(modifiedResources); // RHQ-792, mtime is the indicator that schedules should be sync'ed too
syncDriftConfigurations(modifiedResources);
for (Resource modifiedResource : modifiedResources) {
@@ -2830,7 +2836,7 @@ public class InventoryManager extends AgentService implements ContainerService,
//don't do anything during upgrade. The resources are only started during the upgrade process.
return;
}
-
+
Resource resource = container.getResource();
switch (resource.getInventoryStatus()) {
case COMMITTED: {
@@ -2859,20 +2865,21 @@ public class InventoryManager extends AgentService implements ContainerService,
log.info("Starting resource activation and upgrade.");
long start = System.currentTimeMillis();
-
+
log.info("Executing the initial inventory synchronization before upgrade.");
-
+
boolean syncResult = handleReport(new InventoryReport(getAgent()));
if (!syncResult) {
log.warn("Failed to sync up the inventory with the server. The resource upgrade will be disabled.");
}
log.info("Starting to activate (and upgrade) resources.");
-
+
activateAndUpgradeResourceRecursively(getPlatform(), syncResult);
- log.info("Inventory activated and upgrade requests gathered in " + (System.currentTimeMillis() - start) + "ms.");
-
+ log.info("Inventory activated and upgrade requests gathered in " + (System.currentTimeMillis() - start)
+ + "ms.");
+
log.info("Sending the upgrade requests to the server.");
resourceUpgradeDelegate.sendRequests();
@@ -2880,18 +2887,20 @@ public class InventoryManager extends AgentService implements ContainerService,
log.info("Resource activation and upgrade finished.");
} catch (Throwable t) {
- log.error("Resource activation or upgrade failed with an exception. An attempt to merely activate the resources will be made now.", t);
+ log.error(
+ "Resource activation or upgrade failed with an exception. An attempt to merely activate the resources will be made now.",
+ t);
//make sure to at least activate the resources
activateAndUpgradeResourceRecursively(getPlatform(), false);
}
}
- private void activateAndUpgradeResourceRecursively(Resource resource, boolean doUpgrade) {
+ private void activateAndUpgradeResourceRecursively(Resource resource, boolean doUpgrade) {
ResourceContainer container = initResourceContainer(resource);
-
+
boolean activate = true;
-
+
//only do upgrade inside the agent. it does not make sense in embedded mode.
if (doUpgrade && configuration.isInsideAgent()) {
try {
@@ -2902,7 +2911,7 @@ public class InventoryManager extends AgentService implements ContainerService,
activate = false;
}
}
-
+
if (activate) {
try {
activateResource(resource, container, false);
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/upgrade/ResourceUpgradeDelegate.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/upgrade/ResourceUpgradeDelegate.java
index 6dff613..c32ca97 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/upgrade/ResourceUpgradeDelegate.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/upgrade/ResourceUpgradeDelegate.java
@@ -148,7 +148,7 @@ public class ResourceUpgradeDelegate {
try {
//check the validity of the upgrades now that we have a complete picture
//about the changes and the inventory looks like it was already upgraded.
- for(ResourceUpgradeRequest request : requests) {
+ for (ResourceUpgradeRequest request : requests) {
ResourceContainer container = inventoryManager.getResourceContainer(request.getResourceId());
if (container != null) {
Resource resource = container.getResource();
@@ -158,12 +158,12 @@ public class ResourceUpgradeDelegate {
//in the code below. Let's use the original resource for the error message so that we don't confuse
//the user.
ResourceUpgradeRequest orig = findOriginal(request);
-
+
//orig should never be null, but let's be paranoid
- if (orig != null) {
+ if (orig != null) {
orig.updateResource(resource);
}
-
+
String errorString = "Upgrading the resource [" + resource + "] using these updates ["
+ request + "] would render the inventory invalid because of the following reasons: "
+ upgradeErrors;
@@ -240,7 +240,7 @@ public class ResourceUpgradeDelegate {
}
@SuppressWarnings("unchecked")
- private <T extends ResourceComponent> boolean executeResourceUpgradeFacetAndStoreRequest(
+ private <T extends ResourceComponent<?>> boolean executeResourceUpgradeFacetAndStoreRequest(
ResourceContainer resourceContainer) throws PluginContainerException {
ResourceComponent<T> parentResourceComponent = resourceContainer.getResourceContext()
@@ -318,7 +318,7 @@ public class ResourceUpgradeDelegate {
s.append("After the upgrade, the following resources would have the same resource key which is illegal. This is an issue of either the old or the new version of the plugin '"
+ resource.getResourceType().getPlugin()
+ "'. Please consult the documentation of the plugin to see what are the recommended steps to resolve this situation:\n");
-
+
//ok, this is a little tricky
//this method is called when the inventory is in the state as it would look after a
//successful upgrade.
@@ -330,19 +330,19 @@ public class ResourceUpgradeDelegate {
for (Resource r : duplicitSiblings) {
ResourceUpgradeRequest fakeRequest = new ResourceUpgradeRequest(r.getId());
fakeRequest.fillInFromResource(r);
-
+
ResourceUpgradeRequest orig = findOriginal(fakeRequest);
-
+
//we might not find the original, because this resource might not need an upgrade.
//in that case, the reporting will be accurate because upgrade didn't touch the resource.
if (orig != null) {
orig.updateResource(r);
}
-
+
//now we have the resource as it looked before the upgrade kicked in (which is in this
//case also what it will look like after the upgrade finishes, because we're failing it).
s.append(r).append(",\n");
-
+
//and revert the resource back to what it looked like (i.e. back to the upgraded state so
//that we don't introduce side-effects in this method).
if (orig != null) {
@@ -395,14 +395,14 @@ public class ResourceUpgradeDelegate {
failedResourceTypesInParent.add(resource.getResourceType());
}
-
+
private ResourceUpgradeRequest findOriginal(ResourceUpgradeRequest request) {
- for(ResourceUpgradeRequest original : originalResourceData) {
+ for (ResourceUpgradeRequest original : originalResourceData) {
if (original.equals(request)) {
return original;
}
}
-
+
return null;
}
}
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/failing/DiscComponent.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/failing/DiscComponent.java
index 75bfbd7..65890c2 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/failing/DiscComponent.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/failing/DiscComponent.java
@@ -37,16 +37,16 @@ import org.rhq.core.pluginapi.upgrade.ResourceUpgradeFacet;
*
* @author Lukas Krejci
*/
-public class DiscComponent implements ResourceDiscoveryComponent<ResourceComponent>,
- ResourceUpgradeFacet<ResourceComponent> {
-
+public class DiscComponent<T extends ResourceComponent<?>> implements ResourceDiscoveryComponent<T>,
+ ResourceUpgradeFacet<T> {
+
private static final String RESOURCE_KEY = "resource-key-failing";
private static final String RESOURCE_NAME = "resource-name-failing";
private static final String RESOURCE_DESCRIPTION = "resource-description-failing";
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<ResourceComponent> context)
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<T> context)
throws InvalidPluginConfigurationException, Exception {
-
+
//create a marker file so that the testing code knows this method has run
File dataDir = context.getParentResourceContext().getDataDirectory();
if (dataDir != null) {
@@ -59,12 +59,12 @@ public class DiscComponent implements ResourceDiscoveryComponent<ResourceCompone
} catch (IOException e) {
}
}
-
+
return Collections.singleton(new DiscoveredResourceDetails(context.getResourceType(), RESOURCE_KEY,
RESOURCE_NAME, null, RESOURCE_DESCRIPTION, context.getDefaultPluginConfiguration(), null));
}
- public ResourceUpgradeReport upgrade(ResourceUpgradeContext<ResourceComponent> inventoriedResource) {
+ public ResourceUpgradeReport upgrade(ResourceUpgradeContext<T> inventoriedResource) {
throw new RuntimeException("Failing the upgrade purposefully.");
}
}
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/failing/ResComponent.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/failing/ResComponent.java
index 4c33adc..7df5729 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/failing/ResComponent.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/failing/ResComponent.java
@@ -21,6 +21,7 @@ package org.rhq.core.pc.upgrade.plugins.failing;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
@@ -30,17 +31,18 @@ import org.rhq.core.pluginapi.inventory.ResourceContext;
*
* @author Lukas Krejci
*/
-public class ResComponent implements ResourceComponent<ResourceComponent> {
+public class ResComponent<T extends ResourceComponent<?>> implements ResourceComponent<T> {
private static final Log log = LogFactory.getLog(ResComponent.class);
-
+
public AvailabilityType getAvailability() {
return AvailabilityType.UP;
}
-
- public void start(ResourceContext<ResourceComponent> context) throws InvalidPluginConfigurationException, Exception {
- log.info("~~~ starting the resource upgrade test failing component with resource key: " + context.getResourceKey());
+
+ public void start(ResourceContext<T> context) throws InvalidPluginConfigurationException, Exception {
+ log.info("~~~ starting the resource upgrade test failing component with resource key: "
+ + context.getResourceKey());
}
-
+
public void stop() {
}
}
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/BaseDiscoveryComponent.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/BaseDiscoveryComponent.java
index a03dff5..ae5dcbd 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/BaseDiscoveryComponent.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/BaseDiscoveryComponent.java
@@ -34,7 +34,7 @@ import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
*
* @author Lukas Krejci
*/
-public class BaseDiscoveryComponent<T extends ResourceComponent> implements ResourceDiscoveryComponent<T> {
+public class BaseDiscoveryComponent<T extends ResourceComponent<?>> implements ResourceDiscoveryComponent<T> {
public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<T> context)
throws InvalidPluginConfigurationException, Exception {
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/BaseResourceComponent.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/BaseResourceComponent.java
index 04d3767..5b40d2c 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/BaseResourceComponent.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/BaseResourceComponent.java
@@ -26,6 +26,7 @@ import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.PropertyList;
@@ -40,11 +41,12 @@ import org.rhq.core.pluginapi.inventory.ResourceContext;
*
* @author Lukas Krejci
*/
-public class BaseResourceComponent<T extends ResourceComponent> implements ResourceComponent<T>, BaseResourceComponentInterface {
+public class BaseResourceComponent<T extends ResourceComponent<?>> implements ResourceComponent<T>,
+ BaseResourceComponentInterface {
private ResourceContext<T> context;
private final Log log = LogFactory.getLog(getClass());
-
+
public AvailabilityType getAvailability() {
return AvailabilityType.UP;
}
@@ -53,7 +55,7 @@ public class BaseResourceComponent<T extends ResourceComponent> implements Resou
log.info("Starting multi resource child component with resource key '" + context.getResourceKey() + "'.");
this.context = context;
}
-
+
public void stop() {
log.info("Stopping multi resource child component with resource key '" + context.getResourceKey() + "'.");
}
@@ -61,58 +63,58 @@ public class BaseResourceComponent<T extends ResourceComponent> implements Resou
public int getOrdinal() {
return context.getPluginConfiguration().getSimple("ordinal").getIntegerValue();
}
-
+
public Map<String, Set<Integer>> getChildrenToFailUpgrade() {
-
+
Map<String, Set<Integer>> ret = new HashMap<String, Set<Integer>>();
-
+
Configuration pluginConfig = context.getPluginConfiguration();
PropertyList childrenToFail = pluginConfig.getList("childrenToFail");
-
+
if (childrenToFail != null) {
- for(Property p : childrenToFail.getList()) {
+ for (Property p : childrenToFail.getList()) {
PropertyMap entry = (PropertyMap) p;
-
+
String type = entry.getSimpleValue("type", null);
-
+
PropertyList typeList = entry.getList("children");
-
+
if (type != null && typeList != null) {
Set<Integer> ordinals = new HashSet<Integer>();
-
- for(Property pp : typeList.getList()) {
- ordinals.add(((PropertySimple)pp).getIntegerValue());
+
+ for (Property pp : typeList.getList()) {
+ ordinals.add(((PropertySimple) pp).getIntegerValue());
}
-
+
ret.put(type, ordinals);
}
}
}
-
+
return ret;
}
-
+
public Configuration createPluginConfigurationWithMarkedFailures(Map<String, Set<Integer>> childrenToFailUpgrade) {
Configuration ret = context.getPluginConfiguration().clone();
PropertyList list = new PropertyList("childrenToFail");
-
- for(Map.Entry<String, Set<Integer>> entry : childrenToFailUpgrade.entrySet()) {
+
+ for (Map.Entry<String, Set<Integer>> entry : childrenToFailUpgrade.entrySet()) {
PropertyMap configEntry = new PropertyMap("childrenInType");
configEntry.put(new PropertySimple("type", entry.getKey()));
-
+
PropertyList typeList = new PropertyList("children");
-
- for(Integer childOrdinal : entry.getValue()) {
+
+ for (Integer childOrdinal : entry.getValue()) {
typeList.add(new PropertySimple("ordinal", childOrdinal));
}
-
+
configEntry.put(typeList);
-
+
list.add(configEntry);
}
-
+
ret.put(list);
-
+
return ret;
}
}
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/BaseUpgradingDiscoveryComponent.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/BaseUpgradingDiscoveryComponent.java
index a1acf50..d76328f 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/BaseUpgradingDiscoveryComponent.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/BaseUpgradingDiscoveryComponent.java
@@ -30,7 +30,7 @@ import org.rhq.core.pluginapi.upgrade.ResourceUpgradeFacet;
*
* @author Lukas Krejci
*/
-public class BaseUpgradingDiscoveryComponent<T extends BaseResourceComponent> extends BaseDiscoveryComponent<T>
+public class BaseUpgradingDiscoveryComponent<T extends BaseResourceComponent<?>> extends BaseDiscoveryComponent<T>
implements ResourceUpgradeFacet<T> {
public ResourceUpgradeReport upgrade(ResourceUpgradeContext<T> inventoriedResource) {
@@ -45,16 +45,16 @@ public class BaseUpgradingDiscoveryComponent<T extends BaseResourceComponent> ex
if (!fail && parent != null) {
String typeName = inventoriedResource.getResourceType().getName();
Set<Integer> failingOrdinals = parent.getChildrenToFailUpgrade().get(typeName);
-
+
fail = failingOrdinals != null && failingOrdinals.contains(Integer.valueOf(ordinal));
}
if (fail) {
throw new RuntimeException("Failing the resource upgrade purposefully.");
}
-
+
boolean checkParentUpgraded = Boolean.parseBoolean(pluginConfig.getSimpleValue("checkParentUpgraded", "false"));
-
+
if (checkParentUpgraded) {
if (!inventoriedResource.getParentResourceContext().getResourceKey().startsWith("UPGRADED")) {
throw new RuntimeException("The parent resource ["
@@ -62,7 +62,7 @@ public class BaseUpgradingDiscoveryComponent<T extends BaseResourceComponent> ex
+ "] doesn't seem like it's upgraded but this resource expects it to be.");
}
}
-
+
String newKey = pluginConfig.getSimpleValue("upgradedKey", null);
if (newKey == null) {
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/NothingDiscoveringDiscoveryComponent.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/NothingDiscoveringDiscoveryComponent.java
index b6189e5..a706246 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/NothingDiscoveringDiscoveryComponent.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/multi/base/NothingDiscoveringDiscoveryComponent.java
@@ -32,7 +32,8 @@ import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
*
* @author Lukas Krejci
*/
-public class NothingDiscoveringDiscoveryComponent<T extends ResourceComponent> implements ResourceDiscoveryComponent<T> {
+public class NothingDiscoveringDiscoveryComponent<T extends ResourceComponent<?>> implements
+ ResourceDiscoveryComponent<T> {
public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<T> context)
throws InvalidPluginConfigurationException, Exception {
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v1/DiscComponent.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v1/DiscComponent.java
index 5fbca32..7b6bcc7 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v1/DiscComponent.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v1/DiscComponent.java
@@ -9,12 +9,12 @@ import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
-public class DiscComponent implements ResourceDiscoveryComponent<ResourceComponent> {
+public class DiscComponent<T extends ResourceComponent<?>> implements ResourceDiscoveryComponent<T> {
private static final String RESOURCE_KEY = "resource-key-v1";
private static final String RESOURCE_NAME = "resource-name-v1";
private static final String RESOURCE_DESCRIPTION = "resource-description-v1";
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<ResourceComponent> context)
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<T> context)
throws InvalidPluginConfigurationException, Exception {
return Collections.singleton(new DiscoveredResourceDetails(context.getResourceType(), RESOURCE_KEY,
RESOURCE_NAME, null, RESOURCE_DESCRIPTION, context.getDefaultPluginConfiguration(), null));
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v1/ResComponent.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v1/ResComponent.java
index cc21fc3..e336987 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v1/ResComponent.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v1/ResComponent.java
@@ -6,12 +6,12 @@ import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
-public class ResComponent implements ResourceComponent<ResourceComponent> {
+public class ResComponent<T extends ResourceComponent<?>> implements ResourceComponent<T> {
public AvailabilityType getAvailability() {
return AvailabilityType.UP;
}
- public void start(ResourceContext<ResourceComponent> context) {
+ public void start(ResourceContext<T> context) {
LogFactory.getLog(this.getClass()).info(
"~~~ Starting resource upgrade test plugin v1 component: key=" + context.getResourceKey());
}
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v2/DiscComponent.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v2/DiscComponent.java
index d113d1c..d6ca18f 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v2/DiscComponent.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v2/DiscComponent.java
@@ -14,20 +14,20 @@ import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
import org.rhq.core.pluginapi.upgrade.ResourceUpgradeContext;
import org.rhq.core.pluginapi.upgrade.ResourceUpgradeFacet;
-public class DiscComponent implements ResourceDiscoveryComponent<ResourceComponent>,
- ResourceUpgradeFacet<ResourceComponent> {
+public class DiscComponent<T extends ResourceComponent<?>> implements ResourceDiscoveryComponent<T>,
+ ResourceUpgradeFacet<T> {
private static final String V1_RESOURCE_KEY = "resource-key-v1";
private static final String RESOURCE_KEY = "resource-key-v2";
private static final String RESOURCE_NAME = "resource-name-v2";
private static final String RESOURCE_DESCRIPTION = "resource-description-v2";
- public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<ResourceComponent> context)
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<T> context)
throws InvalidPluginConfigurationException, Exception {
return Collections.singleton(new DiscoveredResourceDetails(context.getResourceType(), RESOURCE_KEY,
RESOURCE_NAME, null, RESOURCE_DESCRIPTION, context.getDefaultPluginConfiguration(), null));
}
- public ResourceUpgradeReport upgrade(ResourceUpgradeContext<ResourceComponent> inventoriedResource) {
+ public ResourceUpgradeReport upgrade(ResourceUpgradeContext<T> inventoriedResource) {
if (V1_RESOURCE_KEY.equals(inventoriedResource.getResourceKey())) {
ResourceUpgradeReport report = new ResourceUpgradeReport();
report.setNewResourceKey(RESOURCE_KEY);
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v2/ResComponent.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v2/ResComponent.java
index 83144b2..2d31236 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v2/ResComponent.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/upgrade/plugins/v2/ResComponent.java
@@ -6,12 +6,12 @@ import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
-public class ResComponent implements ResourceComponent<ResourceComponent> {
+public class ResComponent<T extends ResourceComponent<?>> implements ResourceComponent<T> {
public AvailabilityType getAvailability() {
return AvailabilityType.UP;
}
- public void start(ResourceContext<ResourceComponent> context) {
+ public void start(ResourceContext<T> context) {
LogFactory.getLog(this.getClass()).info(
"~~~ Starting resource upgrade test plugin v2 component: key=" + context.getResourceKey());
}
diff --git a/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/JMXComponent.java b/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/JMXComponent.java
index e7b1164..d5f08a8 100644
--- a/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/JMXComponent.java
+++ b/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/JMXComponent.java
@@ -32,7 +32,7 @@ import org.rhq.core.pluginapi.inventory.ResourceComponent;
*
* @author Greg Hinkle
*/
-public interface JMXComponent<T extends ResourceComponent> extends ResourceComponent<T> {
+public interface JMXComponent<T extends ResourceComponent<?>> extends ResourceComponent<T> {
public static final String PRINCIPAL_CONFIG_PROP = "principal";
public static final String CREDENTIALS_CONFIG_PROP = "credentials";
commit 78bff76c5e5a860d5ba1e6c8abc169d8a87f3c0c
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Sep 14 14:45:09 2011 -0400
make sure we show the proper values in the alert conditions, formatted based on their units.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java
index b5a41a1..92913f9 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java
@@ -42,6 +42,7 @@ import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.alert.AlertCondition;
import org.rhq.core.domain.configuration.definition.ConfigurationTemplate;
import org.rhq.core.domain.criteria.Criteria;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.gui.coregui.client.alert.AlertFormatUtility;
import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
@@ -84,6 +85,23 @@ public class ConditionsEditor extends LocatableVLayout {
public void setConditions(Set<AlertCondition> set) {
conditions = new HashSet<AlertCondition>(); // make our own copy
if (set != null) {
+
+ // we need to make sure we have the full measurement definition, including the units.
+ // this is so we can display the condition values with the proper units. If an alert
+ // condition is a measurement condition, but the measurement definition isn't the full
+ // definition, look up the full definition from the resource type and use it.
+ for (AlertCondition alertCondition : set) {
+ MeasurementDefinition measDef = alertCondition.getMeasurementDefinition();
+ if (measDef != null) {
+ if (measDef.getUnits() == null) {
+ MeasurementDefinition fullMeasDef = findMeasurementDefinition(measDef.getId());
+ if (fullMeasDef != null) {
+ alertCondition.setMeasurementDefinition(fullMeasDef);
+ }
+ }
+ }
+ }
+
conditions.addAll(set);
}
if (table != null) {
@@ -91,6 +109,18 @@ public class ConditionsEditor extends LocatableVLayout {
}
}
+ private MeasurementDefinition findMeasurementDefinition(int measurementDefinitionId) {
+ Set<MeasurementDefinition> measDefs = this.resourceType.getMetricDefinitions();
+ if (measDefs != null) {
+ for (MeasurementDefinition measDef : measDefs) {
+ if (measDef.getId() == measurementDefinitionId) {
+ return measDef;
+ }
+ }
+ }
+ return null;
+ }
+
@Override
protected void onInit() {
super.onInit();
commit 76a98c3c950f1cda16209e59466403284b4fc736
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Sep 14 14:21:35 2011 -0400
Adding more logging around drift detection and inventory sync
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
index 210fb78..6bad1b1 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
@@ -69,7 +69,12 @@ public class DriftDetector implements Runnable {
@Override
public void run() {
+ log.debug("Starting drift detection..");
+ long startTime = System.currentTimeMillis();
try {
+ if (log.isDebugEnabled()) {
+ log.debug("Fetching next schedule from " + scheduleQueue);
+ }
DriftDetectionSchedule schedule = scheduleQueue.getNextSchedule();
if (schedule == null) {
@@ -78,7 +83,6 @@ public class DriftDetector implements Runnable {
}
if (log.isDebugEnabled()) {
- log.debug("Preparing to run drift detection for the next schedule in " + scheduleQueue);
log.debug("Processing " + schedule);
}
@@ -121,6 +125,8 @@ public class DriftDetector implements Runnable {
} finally {
try {
scheduleQueue.deactivateSchedule();
+ long endTime = System.currentTimeMillis();
+ log.debug("Finished drift detection in " + (endTime - startTime) + " ms");
} catch (Throwable t) {
Throwable cause = t.getCause();
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
index 3ee0b7d..56e66f3 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
@@ -126,7 +126,7 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
private void initSchedules(Resource r, InventoryManager inventoryMgr) {
if (r.getId() == 0) {
- log.debug("Will not reschedule drift detection schedules for " + r + ". It is not sync'ed yet.");
+ log.debug("Will not reschedule drift detection for " + r + ". It is not sync'ed yet.");
return;
}
@@ -136,7 +136,7 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
return;
}
- log.debug("Rescheduling drift detection schedules for " + r);
+ log.debug("Rescheduling drift detection for " + r);
for (DriftConfiguration c : container.getDriftConfigurations()) {
try {
syncWithServer(r, c);
@@ -166,9 +166,15 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
// drift configuration while the agent is offline for example. At
// this point we just return and allow the agent to generate the
// initial snapshot file.
+ if (log.isDebugEnabled()) {
+ log.debug("The server does not have any change sets for " + toString(resource, configuration) +
+ ". An initial snapshot needs to be generated.");
+ }
return;
}
+ log.info("Preparing to write snapshot at version " + snapshot.getVersion() + " to disk for " +
+ toString(resource, configuration));
ChangeSetWriter writer = changeSetMgr.getChangeSetWriter(resource.getId(), headers);
for (Drift drift : snapshot.getEntries()) {
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
index 5f04fe5..fe15bb5 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
@@ -2130,6 +2130,7 @@ public class InventoryManager extends AgentService implements ContainerService,
}
private void installDriftConfigurations(Map<Integer, List<DriftConfiguration>> configsFromServer) {
+ log.info("Syncing drift configurations from server with local inventory...");
DriftManager driftMgr = PluginContainer.getInstance().getDriftManager();
if (driftMgr != null && driftMgr.isInitialized()) {
DriftConfigurationComparator comparator =
@@ -2137,6 +2138,7 @@ public class InventoryManager extends AgentService implements ContainerService,
ScheduleQueue queue = driftMgr.getSchedulesQueue();
// First check for drift configurations that have been deleted
+ log.info("Checking for drift configurations that have been deleted on the server");
for (Integer resourceId : configsFromServer.keySet()) {
Set<DriftConfiguration> configsFromServerSet = new TreeSet<DriftConfiguration>(comparator);
configsFromServerSet.addAll(configsFromServer.get(resourceId));
@@ -2157,6 +2159,7 @@ public class InventoryManager extends AgentService implements ContainerService,
}
// add new drift configurations received from the server
+ log.info("Checking for new drift configurations");
for (Integer resourceId : configsFromServer.keySet()) {
for (DriftConfiguration c : configsFromServer.get(resourceId)) {
if (!queue.contains(resourceId, c, comparator)) {
@@ -2169,7 +2172,8 @@ public class InventoryManager extends AgentService implements ContainerService,
}
}
} else {
- log.info("DriftManager is not available. Drift configurations will be persisted but not scheduled.");
+ log.info("DriftManager is not available. Drift configurations will be persisted but detection will not " +
+ "be scheduled.");
// First check for drift configurations that have been deleted
log.debug("Checking for stale drift configurations that need to be purged from inventory");
@@ -2197,6 +2201,7 @@ public class InventoryManager extends AgentService implements ContainerService,
container.removeDriftConfiguration(c);
File changeSetDir = new File(resourceDir, c.getName());
if (changeSetDir.exists()) {
+ log.debug("Purging " + changeSetDir.getPath());
purge(changeSetDir, true);
}
}
@@ -2204,15 +2209,14 @@ public class InventoryManager extends AgentService implements ContainerService,
// Now add any any drift configurations received from the server. These
// could be new or updated configurations.
- log.debug("Checking for new or updated drift configurations");
+ log.debug("Checking for new drift configurations");
for (Integer resourceId : configsFromServer.keySet()) {
ResourceContainer container = getResourceContainer(resourceId);
for (DriftConfiguration c : configsFromServer.get(resourceId)) {
if (log.isDebugEnabled()) {
- log.debug("Adding or updating DriftConfiguration[name: " + c.getName() + ", resourceId: " +
- resourceId + "]");
+ log.debug("Adding DriftConfiguration[name: " + c.getName() + ", resourceId: " + resourceId +
+ "]");
}
- // TODO does this handle renamed configs?
container.addDriftConfiguration(c);
}
}
commit d012274e9e688c2484a5f0196a5a55a08ef59056
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Sep 14 13:44:44 2011 -0400
remove the Refresh button since there is nothing to refresh (the table is always fully populated)
and when you click Refresh, it gets disabled and never re-enables.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
index 03484a4..966b14e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
@@ -334,6 +334,7 @@ public class BundleDeploymentView extends LocatableVLayout implements Bookmarkab
@SuppressWarnings("unchecked")
private Table addMemberDeploymentsTable() {
Table table = new Table(extendLocatorId("Deployments"), MSG.view_bundle_deploy_deploymentPlatforms());
+ table.setShowFooterRefresh(false);
table.setTitleComponent(new HTMLFlow(MSG.view_bundle_deploy_selectARow()));
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/file/FileListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/file/FileListView.java
index 5b33200..5afe667 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/file/FileListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/file/FileListView.java
@@ -63,6 +63,7 @@ public class FileListView extends LocatableVLayout {
private void viewFiles(PageList<BundleFile> files) {
Table table = new Table(extendLocatorId("BundleFiles"), MSG.view_bundle_bundleFiles());
+ table.setShowFooterRefresh(false);
ListGridField id = new ListGridField(ID, MSG.common_title_id());
ListGridField name = new ListGridField(NAME, MSG.common_title_name());
commit 54dff23edceba487daa2da3868917ad4901080e5
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Sep 14 12:32:36 2011 -0400
fix version in pom
diff --git a/modules/core/plugindoc/pom.xml b/modules/core/plugindoc/pom.xml
index 8364995..5586534 100644
--- a/modules/core/plugindoc/pom.xml
+++ b/modules/core/plugindoc/pom.xml
@@ -5,7 +5,7 @@
<parent>
<groupId>org.rhq</groupId>
<artifactId>rhq-core-parent</artifactId>
- <version>4.1.1-BETA1</version>
+ <version>4.1.0-SNAPSHOT</version>
</parent>
<groupId>org.rhq</groupId>
commit 767438de0ce97f10adae37afe99b5e7fccecf24a
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Sep 14 12:32:27 2011 -0400
upgrade ems version in eclipse classpath
diff --git a/.classpath b/.classpath
index 93a80cc..36d4e8c 100644
--- a/.classpath
+++ b/.classpath
@@ -56,7 +56,7 @@
<classpathentry exported="true" kind="var" path="M2_REPO/javax/faces/jsf-impl/1.2_14/jsf-impl-1.2_14.jar" sourcepath="/M2_REPO/javax/faces/jsf-impl/1.2_14/jsf-impl-1.2_14-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/javax/el/el-api/1.0/el-api-1.0.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/com/sun/facelets/jsf-facelets/1.1.15.B1/jsf-facelets-1.1.15.B1.jar" sourcepath="/M2_REPO/com/sun/facelets/jsf-facelets/1.1.15.B1/jsf-facelets-1.1.15.B1-sources.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/mc4j/org-mc4j-ems/1.2.15.1/org-mc4j-ems-1.2.15.1.jar" sourcepath="/M2_REPO/mc4j/org-mc4j-ems/1.2.15.1/org-mc4j-ems-1.2.15.1-sources.jar"/>
+ <classpathentry exported="true" kind="var" path="M2_REPO/mc4j/org-mc4j-ems/1.2.16/org-mc4j-ems-1.2.16.jar" sourcepath="/M2_REPO/mc4j/org-mc4j-ems/1.2.16/org-mc4j-ems-1.2.16-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/opensymphony/quartz/quartz/1.6.5/quartz-1.6.5.jar" sourcepath="/M2_REPO/org/opensymphony/quartz/quartz/1.6.5/quartz-1.6.5-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/javax/mail/mail/1.4.2/mail-1.4.2.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/commons-fileupload/commons-fileupload/1.2/commons-fileupload-1.2.jar"/>
commit dc9776dc3ac82bd8232f01a8b2d9ec1f7b83bbd7
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Sep 14 12:07:55 2011 -0400
Do not purge change set directories for configs that have not been deleted
Prior to this commit, DriftManager was incorrectly purging change set
directories at start up. This resulted in a new coverage change set
being generated. Now at start up and during inventory sync, when we
detect that a config has been deleted and only when it has been deleted,
we purge its change set directory. There are a couple reasons we purge
those directories. First, we do not want to clutter up the managed
system with old, unused change set data. Secondly, and more importantly,
the deletion has to be done to support renamed configs. A user can
delete a config, and the create a new one with the same name. This might
happen when changing filters for instance. Even though the configs have
the same names, they are different, and the new config cannot use the
old change set data.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftSnapshot.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftSnapshot.java
index 58a11c7..e5b1835 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftSnapshot.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftSnapshot.java
@@ -18,13 +18,13 @@
*/
package org.rhq.core.domain.drift;
-import static org.rhq.core.domain.drift.DriftCategory.FILE_REMOVED;
-
import java.io.Serializable;
import java.util.Collection;
import java.util.Map;
import java.util.TreeMap;
+import static org.rhq.core.domain.drift.DriftCategory.FILE_REMOVED;
+
/**
* A representation of an agent's drift file monitoring.
*
@@ -34,7 +34,11 @@ public class DriftSnapshot implements Serializable {
private static final long serialVersionUID = 1L;
- private int version;
+ /**
+ * The version is initially -1 which indicates that there are no
+ * change sets as opposed to an empty change set.
+ */
+ private int version = -1;
private Map<String, Drift<?, ?>> entries = new TreeMap<String, Drift<?, ?>>();
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/drift/DriftSnapshotTest.java b/modules/core/domain/src/test/java/org/rhq/core/domain/drift/DriftSnapshotTest.java
new file mode 100644
index 0000000..97f7faa
--- /dev/null
+++ b/modules/core/domain/src/test/java/org/rhq/core/domain/drift/DriftSnapshotTest.java
@@ -0,0 +1,403 @@
+package org.rhq.core.domain.drift;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
+
+import static java.util.Arrays.asList;
+import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED;
+import static org.rhq.core.domain.drift.DriftCategory.FILE_CHANGED;
+import static org.rhq.core.domain.drift.DriftCategory.FILE_REMOVED;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
+import static org.rhq.core.domain.drift.DriftFileStatus.LOADED;
+import static org.rhq.test.AssertUtils.assertCollectionMatchesNoOrder;
+import static org.testng.Assert.assertEquals;
+
+@SuppressWarnings("unchecked")
+public class DriftSnapshotTest {
+
+ @Test
+ public void addChangeSetWithAddedFile() {
+ int configId = 1;
+
+ FakeDriftChangeSet changeSet = new FakeDriftChangeSet(0, COVERAGE, configId).add(new FakeDrift(FILE_ADDED,
+ null, new FakeDriftFile("a1b2c3", 1024, LOADED), "/drift/1.txt"));
+
+ DriftSnapshot snapshot = new DriftSnapshot().add(changeSet);
+
+ assertCollectionMatchesNoOrder(changeSet.getDrifts(), snapshot.getEntries(), "Failed to build "
+ + "a snapshot that contains a single change set");
+ assertEquals(snapshot.getVersion(), changeSet.getVersion(), "Snapshot version is wrong");
+ }
+
+ @Test
+ public void addChangeSetsWithAddedFiles() {
+ int configId = 1;
+
+ Drift<?, ?> entry1 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("a1b2c3", 1024, LOADED), "/drift/1.txt");
+ FakeDriftChangeSet changeSet1 = new FakeDriftChangeSet(0, COVERAGE, configId).add(entry1);
+
+ Drift<?, ?> entry2 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("4a5b6c", 1024, LOADED), "/drift/2.txt");
+ FakeDriftChangeSet changeSet2 = new FakeDriftChangeSet(1, DRIFT, configId).add(entry2);
+
+ DriftSnapshot snapshot = new DriftSnapshot().add(changeSet1).add(changeSet2);
+
+ // not sure but asSet with one arg was not working for me, so create Set manually
+ Set set = new HashSet<Drift<?, ?>>();
+ set.add(entry1);
+ set.add(entry2);
+ assertCollectionMatchesNoOrder(set, snapshot.getEntries(), "Failed to build snapshot "
+ + "with two change sets and file added in second change set");
+ assertEquals(snapshot.getVersion(), changeSet2.getVersion(), "Snapshot version is wrong");
+ }
+
+ @Test
+ public void replaceFileWithChangedVersion() {
+ int configId = 1;
+
+ Drift<?, ?> entry1 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("a1b2c3", 1024, LOADED), "/drift/1.txt");
+ FakeDriftChangeSet changeSet1 = new FakeDriftChangeSet(0, COVERAGE, configId).add(entry1);
+
+ Drift<?, ?> entry2 = new FakeDrift(FILE_CHANGED, new FakeDriftFile("a1b2c3", 1024, LOADED), new FakeDriftFile(
+ "4d5e6f", 1024, LOADED), "/drift/1.txt");
+ FakeDriftChangeSet changeSet2 = new FakeDriftChangeSet(1, DRIFT, configId).add(entry2);
+
+ DriftSnapshot snapshot = new DriftSnapshot().add(changeSet1).add(changeSet2);
+
+ // not sure but asSet with one arg was not working for me, so create Set manually
+ Set set = new HashSet<Drift<?, ?>>();
+ set.add(entry2);
+ assertCollectionMatchesNoOrder(set, snapshot.getEntries(), "Failed to build snapshot with file changed");
+ }
+
+ @Test
+ public void deleteFileThatHasBeenRemoved() {
+ int configId = 1;
+
+ Drift<?, ?> entry1 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("a1b2c3", 1024, LOADED), "/drift/1.txt");
+ Drift<?, ?> entry2 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("d1f2a3", 1024, LOADED), "/drift/2.txt");
+ FakeDriftChangeSet changeSet1 = new FakeDriftChangeSet(0, COVERAGE, configId).add(entry1).add(entry2);
+
+ Drift entry3 = new FakeDrift(FILE_REMOVED, new FakeDriftFile("a1b2c3", 1024, LOADED), null, "/drift/1.txt");
+ FakeDriftChangeSet changeSet2 = new FakeDriftChangeSet(1, DRIFT, configId).add(entry3);
+
+ DriftSnapshot snapshot = new DriftSnapshot().add(changeSet1).add(changeSet2);
+
+ // not sure but asSet with one arg was not working for me, so create Set manually
+ Set set = new HashSet<Drift<?, ?>>();
+ set.add(entry2);
+ assertCollectionMatchesNoOrder(set, snapshot.getEntries(), "Failed to build snapshot with a file " + "removed.");
+ }
+
+ @Test
+ public void diffShowsEntriesInLeftAndNotInRight() {
+ int configId = 1;
+
+ Drift entry1 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("a1b2c3", 1024, LOADED), "/drift/1.txt");
+ FakeDriftChangeSet changeSet1 = new FakeDriftChangeSet(0, COVERAGE, configId).add(entry1);
+ DriftSnapshot right = new DriftSnapshot().add(changeSet1);
+
+ Drift entry2 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("a3b6c9", 1024, LOADED), "/drift/2.txt");
+ FakeDriftChangeSet changeSet2 = new FakeDriftChangeSet(0, COVERAGE, configId).add(entry1).add(entry2);
+ DriftSnapshot left = new DriftSnapshot().add(changeSet1).add(changeSet2);
+
+ DriftDiffReport diff = left.diff(right);
+
+ assertCollectionMatchesNoOrder(asList(entry2), diff.getElementsNotInRight(), "Diff report does not contain "
+ + "elements that are in the left but not in the right.");
+ }
+
+ @Test
+ public void diffShowsEntriesInRightAndNotInLeft() {
+ int configId = 1;
+
+ Drift entry1 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("a1b2c3", 1024, LOADED), "/drift/1.txt");
+ FakeDriftChangeSet changeSet1 = new FakeDriftChangeSet(0, COVERAGE, configId).add(entry1);
+ DriftSnapshot right = new DriftSnapshot().add(changeSet1);
+
+ Drift entry2 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("a3b6c9", 1024, LOADED), "/drift/2.txt");
+ FakeDriftChangeSet changeSet2 = new FakeDriftChangeSet(0, COVERAGE, configId).add(entry2);
+ DriftSnapshot left = new DriftSnapshot().add(changeSet2);
+
+ DriftDiffReport diff = left.diff(right);
+
+ assertCollectionMatchesNoOrder(asList(entry1), diff.getElementsNotInLeft(), "Diff report does not contain "
+ + "elements that are in the left but not in the right");
+ }
+
+ @Test
+ public void diffShowsEntriesInLeftAndRightThatAreInConflict() {
+ int configId = 1;
+
+ Drift entry1 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("a1b2c3", 1024, LOADED), "/drfit/1.txt");
+ FakeDriftChangeSet changeSet1 = new FakeDriftChangeSet(0, COVERAGE, configId).add(entry1);
+ DriftSnapshot right = new DriftSnapshot().add(changeSet1);
+
+ Drift entry2 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("c3b2a1", 1024, LOADED), "/drfit/1.txt");
+ FakeDriftChangeSet changeSet2 = new FakeDriftChangeSet(1, DRIFT, configId).add(entry2);
+ DriftSnapshot left = new DriftSnapshot().add(changeSet2);
+
+ DriftDiffReport diff = left.diff(right);
+
+ assertCollectionMatchesNoOrder(asList(entry2), diff.getElementsInConflict(), "Diff report does not contain "
+ + "element that are in both left and right and are in conflict");
+ }
+
+ <E> Set<E> asSet(E... elements) {
+ HashSet<E> set = new HashSet<E>();
+ for (E element : elements) {
+ set.add(element);
+ }
+ return set;
+ }
+
+ static class FakeDriftChangeSet implements DriftChangeSet {
+
+ private String id;
+ private int version;
+ private DriftChangeSetCategory category;
+ private int configId;
+ private DriftHandlingMode mode = DriftHandlingMode.normal;
+ private Set<Drift> drifts = new HashSet<Drift>();
+ private long ctime = System.currentTimeMillis();
+
+ public FakeDriftChangeSet() {
+ }
+
+ public FakeDriftChangeSet(int version, DriftChangeSetCategory category, int configId) {
+ this.version = version;
+ this.category = category;
+ this.configId = configId;
+ }
+
+ @Override
+ public String getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ @Override
+ public Long getCtime() {
+ return ctime;
+ }
+
+ @Override
+ public int getVersion() {
+ return version;
+ }
+
+ @Override
+ public void setVersion(int version) {
+ this.version = version;
+ }
+
+ @Override
+ public DriftChangeSetCategory getCategory() {
+ return category;
+ }
+
+ @Override
+ public void setCategory(DriftChangeSetCategory category) {
+ this.category = category;
+ }
+
+ @Override
+ public int getDriftConfigurationId() {
+ return configId;
+ }
+
+ @Override
+ public void setDriftConfigurationId(int id) {
+ configId = id;
+ }
+
+ @Override
+ public int getResourceId() {
+ return 0;
+ }
+
+ @Override
+ public Set getDrifts() {
+ return drifts;
+ }
+
+ @Override
+ public void setDrifts(Set drifts) {
+ this.drifts = drifts;
+ }
+
+ public FakeDriftChangeSet add(Drift drift) {
+ drifts.add(drift);
+ return this;
+ }
+
+ @Override
+ public DriftHandlingMode getDriftHandlingMode() {
+ return this.mode;
+ }
+
+ @Override
+ public void setDriftHandlingMode(DriftHandlingMode mode) {
+ this.mode = mode;
+ }
+ }
+
+ static class FakeDrift implements Drift {
+
+ private String id;
+ private DriftCategory category;
+ private String path;
+ private DriftFile oldFile;
+ private DriftFile newFile;
+ private long ctime = System.currentTimeMillis();
+
+ public FakeDrift() {
+ }
+
+ public FakeDrift(DriftCategory category, DriftFile oldFile, DriftFile newFile, String path) {
+ this.category = category;
+ this.oldFile = oldFile;
+ this.newFile = newFile;
+ this.path = path;
+ }
+
+ @Override
+ public String getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ @Override
+ public Long getCtime() {
+ return ctime;
+ }
+
+ @Override
+ public DriftChangeSet getChangeSet() {
+ return null;
+ }
+
+ @Override
+ public void setChangeSet(DriftChangeSet changeSet) {
+
+ }
+
+ @Override
+ public DriftCategory getCategory() {
+ return category;
+ }
+
+ @Override
+ public void setCategory(DriftCategory category) {
+ this.category = category;
+ }
+
+ @Override
+ public String getPath() {
+ return path;
+ }
+
+ @Override
+ public void setPath(String path) {
+ this.path = path;
+ }
+
+ @Override
+ public DriftFile getOldDriftFile() {
+ return oldFile;
+ }
+
+ @Override
+ public void setOldDriftFile(DriftFile oldDriftFile) {
+ this.oldFile = oldDriftFile;
+ }
+
+ @Override
+ public DriftFile getNewDriftFile() {
+ return newFile;
+ }
+
+ @Override
+ public void setNewDriftFile(DriftFile newDriftFile) {
+ newFile = newDriftFile;
+ }
+
+ @Override
+ public String toString() {
+ return "Drift[category: " + category.code() + ", oldFile: " + oldFile + ", newFile: " + newFile
+ + ", path: " + path + "]";
+ }
+ }
+
+ static class FakeDriftFile implements Serializable, DriftFile {
+
+ private static final long serialVersionUID = 1L;
+ private String hash;
+ private long size;
+ private DriftFileStatus status;
+ private long ctime = System.currentTimeMillis();
+
+ public FakeDriftFile() {
+ }
+
+ public FakeDriftFile(String hash, long size, DriftFileStatus status) {
+ this.hash = hash;
+ this.size = size;
+ this.status = status;
+ }
+
+ @Override
+ public String getHashId() {
+ return hash;
+ }
+
+ @Override
+ public void setHashId(String hashId) {
+ hash = hashId;
+ }
+
+ @Override
+ public Long getCtime() {
+ return ctime;
+ }
+
+ @Override
+ public Long getDataSize() {
+ return size;
+ }
+
+ @Override
+ public void setDataSize(Long size) {
+ this.size = size;
+ }
+
+ @Override
+ public DriftFileStatus getStatus() {
+ return status;
+ }
+
+ @Override
+ public void setStatus(DriftFileStatus status) {
+ this.status = status;
+ }
+
+ @Override
+ public String toString() {
+ return "DriftFile[hashId: " + hash + ", dataSize: " + size + ", status: " + status.ordinal() + "]";
+ }
+ }
+
+}
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/drift/SnapshotTest.java b/modules/core/domain/src/test/java/org/rhq/core/domain/drift/SnapshotTest.java
deleted file mode 100644
index 42cf146..0000000
--- a/modules/core/domain/src/test/java/org/rhq/core/domain/drift/SnapshotTest.java
+++ /dev/null
@@ -1,403 +0,0 @@
-package org.rhq.core.domain.drift;
-
-import static java.util.Arrays.asList;
-import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED;
-import static org.rhq.core.domain.drift.DriftCategory.FILE_CHANGED;
-import static org.rhq.core.domain.drift.DriftCategory.FILE_REMOVED;
-import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
-import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
-import static org.rhq.core.domain.drift.DriftFileStatus.LOADED;
-import static org.rhq.test.AssertUtils.assertCollectionMatchesNoOrder;
-import static org.testng.Assert.assertEquals;
-
-import java.io.Serializable;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.testng.annotations.Test;
-
-import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
-
-@SuppressWarnings("unchecked")
-public class SnapshotTest {
-
- @Test
- public void addChangeSetWithAddedFile() {
- int configId = 1;
-
- FakeDriftChangeSet changeSet = new FakeDriftChangeSet(0, COVERAGE, configId).add(new FakeDrift(FILE_ADDED,
- null, new FakeDriftFile("a1b2c3", 1024, LOADED), "/drift/1.txt"));
-
- DriftSnapshot snapshot = new DriftSnapshot().add(changeSet);
-
- assertCollectionMatchesNoOrder(changeSet.getDrifts(), snapshot.getEntries(), "Failed to build "
- + "a snapshot that contains a single change set");
- assertEquals(snapshot.getVersion(), changeSet.getVersion(), "Snapshot version is wrong");
- }
-
- @Test
- public void addChangeSetsWithAddedFiles() {
- int configId = 1;
-
- Drift<?, ?> entry1 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("a1b2c3", 1024, LOADED), "/drift/1.txt");
- FakeDriftChangeSet changeSet1 = new FakeDriftChangeSet(0, COVERAGE, configId).add(entry1);
-
- Drift<?, ?> entry2 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("4a5b6c", 1024, LOADED), "/drift/2.txt");
- FakeDriftChangeSet changeSet2 = new FakeDriftChangeSet(1, DRIFT, configId).add(entry2);
-
- DriftSnapshot snapshot = new DriftSnapshot().add(changeSet1).add(changeSet2);
-
- // not sure but asSet with one arg was not working for me, so create Set manually
- Set set = new HashSet<Drift<?, ?>>();
- set.add(entry1);
- set.add(entry2);
- assertCollectionMatchesNoOrder(set, snapshot.getEntries(), "Failed to build snapshot "
- + "with two change sets and file added in second change set");
- assertEquals(snapshot.getVersion(), changeSet2.getVersion(), "Snapshot version is wrong");
- }
-
- @Test
- public void replaceFileWithChangedVersion() {
- int configId = 1;
-
- Drift<?, ?> entry1 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("a1b2c3", 1024, LOADED), "/drift/1.txt");
- FakeDriftChangeSet changeSet1 = new FakeDriftChangeSet(0, COVERAGE, configId).add(entry1);
-
- Drift<?, ?> entry2 = new FakeDrift(FILE_CHANGED, new FakeDriftFile("a1b2c3", 1024, LOADED), new FakeDriftFile(
- "4d5e6f", 1024, LOADED), "/drift/1.txt");
- FakeDriftChangeSet changeSet2 = new FakeDriftChangeSet(1, DRIFT, configId).add(entry2);
-
- DriftSnapshot snapshot = new DriftSnapshot().add(changeSet1).add(changeSet2);
-
- // not sure but asSet with one arg was not working for me, so create Set manually
- Set set = new HashSet<Drift<?, ?>>();
- set.add(entry2);
- assertCollectionMatchesNoOrder(set, snapshot.getEntries(), "Failed to build snapshot with file changed");
- }
-
- @Test
- public void deleteFileThatHasBeenRemoved() {
- int configId = 1;
-
- Drift<?, ?> entry1 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("a1b2c3", 1024, LOADED), "/drift/1.txt");
- Drift<?, ?> entry2 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("d1f2a3", 1024, LOADED), "/drift/2.txt");
- FakeDriftChangeSet changeSet1 = new FakeDriftChangeSet(0, COVERAGE, configId).add(entry1).add(entry2);
-
- Drift entry3 = new FakeDrift(FILE_REMOVED, new FakeDriftFile("a1b2c3", 1024, LOADED), null, "/drift/1.txt");
- FakeDriftChangeSet changeSet2 = new FakeDriftChangeSet(1, DRIFT, configId).add(entry3);
-
- DriftSnapshot snapshot = new DriftSnapshot().add(changeSet1).add(changeSet2);
-
- // not sure but asSet with one arg was not working for me, so create Set manually
- Set set = new HashSet<Drift<?, ?>>();
- set.add(entry2);
- assertCollectionMatchesNoOrder(set, snapshot.getEntries(), "Failed to build snapshot with a file " + "removed.");
- }
-
- @Test
- public void diffShowsEntriesInLeftAndNotInRight() {
- int configId = 1;
-
- Drift entry1 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("a1b2c3", 1024, LOADED), "/drift/1.txt");
- FakeDriftChangeSet changeSet1 = new FakeDriftChangeSet(0, COVERAGE, configId).add(entry1);
- DriftSnapshot right = new DriftSnapshot().add(changeSet1);
-
- Drift entry2 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("a3b6c9", 1024, LOADED), "/drift/2.txt");
- FakeDriftChangeSet changeSet2 = new FakeDriftChangeSet(0, COVERAGE, configId).add(entry1).add(entry2);
- DriftSnapshot left = new DriftSnapshot().add(changeSet1).add(changeSet2);
-
- DriftDiffReport diff = left.diff(right);
-
- assertCollectionMatchesNoOrder(asList(entry2), diff.getElementsNotInRight(), "Diff report does not contain "
- + "elements that are in the left but not in the right.");
- }
-
- @Test
- public void diffShowsEntriesInRightAndNotInLeft() {
- int configId = 1;
-
- Drift entry1 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("a1b2c3", 1024, LOADED), "/drift/1.txt");
- FakeDriftChangeSet changeSet1 = new FakeDriftChangeSet(0, COVERAGE, configId).add(entry1);
- DriftSnapshot right = new DriftSnapshot().add(changeSet1);
-
- Drift entry2 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("a3b6c9", 1024, LOADED), "/drift/2.txt");
- FakeDriftChangeSet changeSet2 = new FakeDriftChangeSet(0, COVERAGE, configId).add(entry2);
- DriftSnapshot left = new DriftSnapshot().add(changeSet2);
-
- DriftDiffReport diff = left.diff(right);
-
- assertCollectionMatchesNoOrder(asList(entry1), diff.getElementsNotInLeft(), "Diff report does not contain "
- + "elements that are in the left but not in the right");
- }
-
- @Test
- public void diffShowsEntriesInLeftAndRightThatAreInConflict() {
- int configId = 1;
-
- Drift entry1 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("a1b2c3", 1024, LOADED), "/drfit/1.txt");
- FakeDriftChangeSet changeSet1 = new FakeDriftChangeSet(0, COVERAGE, configId).add(entry1);
- DriftSnapshot right = new DriftSnapshot().add(changeSet1);
-
- Drift entry2 = new FakeDrift(FILE_ADDED, null, new FakeDriftFile("c3b2a1", 1024, LOADED), "/drfit/1.txt");
- FakeDriftChangeSet changeSet2 = new FakeDriftChangeSet(1, DRIFT, configId).add(entry2);
- DriftSnapshot left = new DriftSnapshot().add(changeSet2);
-
- DriftDiffReport diff = left.diff(right);
-
- assertCollectionMatchesNoOrder(asList(entry2), diff.getElementsInConflict(), "Diff report does not contain "
- + "element that are in both left and right and are in conflict");
- }
-
- <E> Set<E> asSet(E... elements) {
- HashSet<E> set = new HashSet<E>();
- for (E element : elements) {
- set.add(element);
- }
- return set;
- }
-
- static class FakeDriftChangeSet implements DriftChangeSet {
-
- private String id;
- private int version;
- private DriftChangeSetCategory category;
- private int configId;
- private DriftHandlingMode mode = DriftHandlingMode.normal;
- private Set<Drift> drifts = new HashSet<Drift>();
- private long ctime = System.currentTimeMillis();
-
- public FakeDriftChangeSet() {
- }
-
- public FakeDriftChangeSet(int version, DriftChangeSetCategory category, int configId) {
- this.version = version;
- this.category = category;
- this.configId = configId;
- }
-
- @Override
- public String getId() {
- return id;
- }
-
- @Override
- public void setId(String id) {
- this.id = id;
- }
-
- @Override
- public Long getCtime() {
- return ctime;
- }
-
- @Override
- public int getVersion() {
- return version;
- }
-
- @Override
- public void setVersion(int version) {
- this.version = version;
- }
-
- @Override
- public DriftChangeSetCategory getCategory() {
- return category;
- }
-
- @Override
- public void setCategory(DriftChangeSetCategory category) {
- this.category = category;
- }
-
- @Override
- public int getDriftConfigurationId() {
- return configId;
- }
-
- @Override
- public void setDriftConfigurationId(int id) {
- configId = id;
- }
-
- @Override
- public int getResourceId() {
- return 0;
- }
-
- @Override
- public Set getDrifts() {
- return drifts;
- }
-
- @Override
- public void setDrifts(Set drifts) {
- this.drifts = drifts;
- }
-
- public FakeDriftChangeSet add(Drift drift) {
- drifts.add(drift);
- return this;
- }
-
- @Override
- public DriftHandlingMode getDriftHandlingMode() {
- return this.mode;
- }
-
- @Override
- public void setDriftHandlingMode(DriftHandlingMode mode) {
- this.mode = mode;
- }
- }
-
- static class FakeDrift implements Drift {
-
- private String id;
- private DriftCategory category;
- private String path;
- private DriftFile oldFile;
- private DriftFile newFile;
- private long ctime = System.currentTimeMillis();
-
- public FakeDrift() {
- }
-
- public FakeDrift(DriftCategory category, DriftFile oldFile, DriftFile newFile, String path) {
- this.category = category;
- this.oldFile = oldFile;
- this.newFile = newFile;
- this.path = path;
- }
-
- @Override
- public String getId() {
- return id;
- }
-
- @Override
- public void setId(String id) {
- this.id = id;
- }
-
- @Override
- public Long getCtime() {
- return ctime;
- }
-
- @Override
- public DriftChangeSet getChangeSet() {
- return null;
- }
-
- @Override
- public void setChangeSet(DriftChangeSet changeSet) {
-
- }
-
- @Override
- public DriftCategory getCategory() {
- return category;
- }
-
- @Override
- public void setCategory(DriftCategory category) {
- this.category = category;
- }
-
- @Override
- public String getPath() {
- return path;
- }
-
- @Override
- public void setPath(String path) {
- this.path = path;
- }
-
- @Override
- public DriftFile getOldDriftFile() {
- return oldFile;
- }
-
- @Override
- public void setOldDriftFile(DriftFile oldDriftFile) {
- this.oldFile = oldDriftFile;
- }
-
- @Override
- public DriftFile getNewDriftFile() {
- return newFile;
- }
-
- @Override
- public void setNewDriftFile(DriftFile newDriftFile) {
- newFile = newDriftFile;
- }
-
- @Override
- public String toString() {
- return "Drift[category: " + category.code() + ", oldFile: " + oldFile + ", newFile: " + newFile
- + ", path: " + path + "]";
- }
- }
-
- static class FakeDriftFile implements Serializable, DriftFile {
-
- private static final long serialVersionUID = 1L;
- private String hash;
- private long size;
- private DriftFileStatus status;
- private long ctime = System.currentTimeMillis();
-
- public FakeDriftFile() {
- }
-
- public FakeDriftFile(String hash, long size, DriftFileStatus status) {
- this.hash = hash;
- this.size = size;
- this.status = status;
- }
-
- @Override
- public String getHashId() {
- return hash;
- }
-
- @Override
- public void setHashId(String hashId) {
- hash = hashId;
- }
-
- @Override
- public Long getCtime() {
- return ctime;
- }
-
- @Override
- public Long getDataSize() {
- return size;
- }
-
- @Override
- public void setDataSize(Long size) {
- this.size = size;
- }
-
- @Override
- public DriftFileStatus getStatus() {
- return status;
- }
-
- @Override
- public void setStatus(DriftFileStatus status) {
- this.status = status;
- }
-
- @Override
- public String toString() {
- return "DriftFile[hashId: " + hash + ", dataSize: " + size + ", status: " + status.ordinal() + "]";
- }
- }
-
-}
diff --git a/modules/core/plugin-container/mvn.out b/modules/core/plugin-container/mvn.out
new file mode 100644
index 0000000..d269e4d
--- /dev/null
+++ b/modules/core/plugin-container/mvn.out
@@ -0,0 +1,96 @@
+[INFO]
+NOTE: Maven is executing in offline mode. Any artifacts not already in your local
+repository will be inaccessible.
+
+[INFO] Scanning for projects...
+[INFO] ------------------------------------------------------------------------
+[INFO] Building RHQ Plugin Container
+[INFO] task-segment: [clean, install]
+[INFO] ------------------------------------------------------------------------
+[INFO] [clean:clean {execution: default-clean}]
+[INFO] Deleting /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target
+[INFO] [enforcer:enforce {execution: enforce-versions}]
+[INFO] [build-helper:maven-version {execution: default}]
+[INFO] [resources:resources {execution: default-resources}]
+[INFO] Using 'ISO-8859-1' encoding to copy filtered resources.
+[INFO] skip non existing resourceDirectory /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/resources
+[INFO] [compiler:compile {execution: default-compile}]
+[INFO] Compiling 105 source files to /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target/classes
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/plugin/FileSystemPluginFinder.java:[124,32] [deprecation] toURL() in java.io.File has been deprecated
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/ResourceContainer.java:[465,49] [unchecked] unchecked conversion
+found : java.util.concurrent.Callable
+required: java.util.concurrent.Callable<T>
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/ResourceContainer.java:[465,48] [unchecked] unchecked method invocation: <T>submit(java.util.concurrent.Callable<T>) in java.util.concurrent.ExecutorService is applied to (java.util.concurrent.Callable)
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[321,76] [unchecked] unchecked call to discoverResources(org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext<T>) as a member of the raw type org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[321,76] [unchecked] unchecked conversion
+found : java.util.Set
+required: java.util.Set<org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails>
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[357,69] [unchecked] unchecked call to discoverResource(org.rhq.core.domain.configuration.Configuration,org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext<T>) as a member of the raw type org.rhq.core.pluginapi.inventory.ManualAddFacet
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[394,52] [unchecked] unchecked call to ResourceDiscoveryContext(org.rhq.core.domain.resource.ResourceType,T,org.rhq.core.pluginapi.inventory.ResourceContext,org.rhq.core.system.SystemInfo,java.util.List<org.rhq.core.pluginapi.inventory.ProcessScanResult>,java.util.List<org.rhq.core.domain.configuration.Configuration>,java.lang.String,org.rhq.core.pluginapi.inventory.PluginContainerDeployment) as a member of the raw type org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[406,60] [unchecked] unchecked call to getAdditionalClasspathUrls(org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext<T>,org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails) as a member of the raw type org.rhq.core.pluginapi.inventory.ClassLoaderFacet
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[406,60] [unchecked] unchecked conversion
+found : java.util.List
+required: java.util.List<java.net.URL>
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[1534,87] [unchecked] unchecked conversion
+found : org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent
+required: org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent<org.rhq.core.pluginapi.inventory.ResourceComponent<capture#841 of ?>>
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[1534,59] [unchecked] unchecked method invocation: <T>createResourceContext(org.rhq.core.domain.resource.Resource,T,org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent<T>) in org.rhq.core.pc.inventory.InventoryManager is applied to (org.rhq.core.domain.resource.Resource,org.rhq.core.pluginapi.inventory.ResourceComponent<capture#841 of ?>,org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent)
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[2383,47] [unchecked] unchecked call to ResourceDiscoveryContext(org.rhq.core.domain.resource.ResourceType,T,org.rhq.core.pluginapi.inventory.ResourceContext,org.rhq.core.system.SystemInfo,java.util.List<org.rhq.core.pluginapi.inventory.ProcessScanResult>,java.util.List<org.rhq.core.domain.configuration.Configuration>,java.lang.String,org.rhq.core.pluginapi.inventory.PluginContainerDeployment) as a member of the raw type org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java:[2436,30] [unchecked] unchecked conversion
+found : java.util.Set
+required: java.util.Set<org.rhq.core.domain.resource.Resource>
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/measurement/MeasurementCollectorRunner.java:[111,85] [unchecked] unchecked cast
+found : java.util.Set<capture#736 of ? extends org.rhq.core.domain.measurement.MeasurementScheduleRequest>
+required: java.util.Set<org.rhq.core.domain.measurement.MeasurementScheduleRequest>
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryFile.java:[116,85] [unchecked] unchecked cast
+found : java.lang.Object
+required: java.util.Map<java.lang.String,org.rhq.core.pc.inventory.ResourceContainer>
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/util/InventoryPrinter.java:[285,41] [unchecked] unchecked call to HashSet(java.util.Collection<? extends E>) as a member of the raw type java.util.HashSet
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/util/InventoryPrinter.java:[285,41] [unchecked] unchecked conversion
+found : java.util.HashSet
+required: java.util.Set<org.rhq.core.domain.resource.Resource>
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/StructuredAndRawConfigManagement.java:[58,25] [unchecked] unchecked conversion
+found : java.util.Set
+required: java.util.Set<org.rhq.core.domain.configuration.RawConfiguration>
+[WARNING] /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/SnapshotGenerator.java:[106,19] [unchecked] unchecked call to add(E) as a member of the raw type java.util.Collection
+[INFO] [resources:testResources {execution: default-testResources}]
+[INFO] Using 'ISO-8859-1' encoding to copy filtered resources.
+[INFO] Copying 5 resources
+[WARNING] DEPRECATED [tasks]: Use target instead
+[INFO] [antrun:run {execution: process-test-resources}]
+[WARNING] Parameter tasks is deprecated, use target instead
+[INFO] Executing tasks
+
+main:
+ [echo] SIGAR java library version used is 1.6.5.132
+ [echo] Copying/unzipping SIGAR native libraries (version 1.6.5.132) to local build directory
+ [mkdir] Created dir: /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target/jboss-sigar
+ [copy] Copying 1 file to /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target/jboss-sigar
+ [unzip] Expanding: /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target/jboss-sigar/sigar-dist-1.6.5.132.zip into /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target/jboss-sigar
+ [move] Moving 22 files to /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target/jboss-sigar
+[INFO] Executed tasks
+[INFO] [compiler:testCompile {execution: default-testCompile}]
+[INFO] Not compiling test sources
+[WARNING] DEPRECATED [tasks]: Use target instead
+[INFO] [antrun:run {execution: process-test-classes}]
+[WARNING] Parameter tasks is deprecated, use target instead
+[INFO] Executing tasks
+
+main:
+[INFO] Executed tasks
+[INFO] [surefire:test {execution: default-test}]
+[INFO] Tests are skipped.
+[INFO] [jar:jar {execution: default-jar}]
+[INFO] Building jar: /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target/rhq-core-plugin-container-4.1.0-SNAPSHOT.jar
+[INFO] [jar:jar {execution: default}]
+[INFO] [jar:test-jar {execution: default}]
+[INFO] Skipping packaging of the test-jar
+[INFO] [install:install {execution: default-install}]
+[INFO] Installing /home/jsanda/Development/redhat/rhq/modules/core/plugin-container/target/rhq-core-plugin-container-4.1.0-SNAPSHOT.jar to /home/jsanda/.m2/repository/org/rhq/rhq-core-plugin-container/4.1.0-SNAPSHOT/rhq-core-plugin-container-4.1.0-SNAPSHOT.jar
+[INFO] ------------------------------------------------------------------------
+[INFO] BUILD SUCCESSFUL
+[INFO] ------------------------------------------------------------------------
+[INFO] Total time: 7 seconds
+[INFO] Finished at: Tue Sep 13 16:43:45 EDT 2011
+[INFO] Final Memory: 59M/481M
+[INFO] ------------------------------------------------------------------------
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
index fa0ce28..3ee0b7d 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
@@ -159,6 +159,16 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
"server");
DriftSnapshot snapshot = pluginContainerConfiguration.getServerServices().getDriftServerService()
.getCurrentSnapshot(configuration.getId());
+
+ if (snapshot.getVersion() == -1) {
+ // A version of -1 indicates that no change sets have been reported
+ // for this configuration. This can occur when a user creates a
+ // drift configuration while the agent is offline for example. At
+ // this point we just return and allow the agent to generate the
+ // initial snapshot file.
+ return;
+ }
+
ChangeSetWriter writer = changeSetMgr.getChangeSetWriter(resource.getId(), headers);
for (Drift drift : snapshot.getEntries()) {
@@ -187,7 +197,7 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
for (File configDir : resourceDir.listFiles()) {
DriftConfiguration config = new DriftConfiguration(new Configuration());
config.setName(configDir.getName());
- if (!schedulesQueue.contains(resourceId, config, comparator)) {
+ if (!schedulesQueue.contains(resourceId, config)) {
log.info("Detected deleted drift configuration, DriftConfiguration[name: " + config.getName() +
", resourceId: " + resourceId + "]");
log.info("Deleting drift configuration directory " + configDir.getPath());
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
index c89575d..5f04fe5 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
@@ -124,6 +124,7 @@ import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.core.util.exception.WrappedRemotingException;
import static org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS;
+import static org.rhq.core.util.file.FileUtil.purge;
/**
* Manages the process of both auto-detection of servers and runtime detection of services across all plugins. Manages
@@ -2172,7 +2173,9 @@ public class InventoryManager extends AgentService implements ContainerService,
// First check for drift configurations that have been deleted
log.debug("Checking for stale drift configurations that need to be purged from inventory");
+ File changeSetsDir = new File(configuration.getDataDirectory(), "changesets");
for (Integer resourceId : configsFromServer.keySet()) {
+ File resourceDir = new File(changeSetsDir, resourceId.toString());
ResourceContainer container = getResourceContainer(resourceId);
Set<DriftConfiguration> resourceConfigs = new TreeSet<DriftConfiguration>(
new DriftConfigurationComparator(BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS));
@@ -2192,6 +2195,10 @@ public class InventoryManager extends AgentService implements ContainerService,
for (DriftConfiguration c : deleted) {
container.removeDriftConfiguration(c);
+ File changeSetDir = new File(resourceDir, c.getName());
+ if (changeSetDir.exists()) {
+ purge(changeSetDir, true);
+ }
}
}
@@ -2205,6 +2212,7 @@ public class InventoryManager extends AgentService implements ContainerService,
log.debug("Adding or updating DriftConfiguration[name: " + c.getName() + ", resourceId: " +
resourceId + "]");
}
+ // TODO does this handle renamed configs?
container.addDriftConfiguration(c);
}
}
commit 63a0592f09d8d426e499ed5163c46db9463edfc6
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Wed Sep 14 11:01:02 2011 -0400
fix minor bug where as/as5 server discovery failed to parse the --properties
command-line option if the cwd was unknown, even if the arg to the option was
a relative path
(cherry picked from commit 43d0562c62abd1f45f926d4d51c4438489f84061)
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/helper/JBossInstanceInfo.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/helper/JBossInstanceInfo.java
index 991c68c..24083840 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/helper/JBossInstanceInfo.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/helper/JBossInstanceInfo.java
@@ -150,14 +150,15 @@ public class JBossInstanceInfo {
case 'P': // 'P' (--properties)
{
- // cwd can be null if native support is not able to determine CWD.
- if (null == currentWorkingDir) {
- log.error("Could not determine CWD. Failed to parse argument to --properties option: "
+ String arg = options.getOptarg();
+
+ // cwd can be null if native support (i.e. SIGAR) is not able to determine it.
+ if (!new File(arg).isAbsolute() && currentWorkingDir == null) {
+ log.error("Could not determine current working directory. Failed to parse relative path argument to --properties option: "
+ options.getOptarg());
break;
}
- String arg = options.getOptarg();
URL url;
try {
File workingDir = new File(currentWorkingDir);
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/util/JBossConfigurationUtility.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/util/JBossConfigurationUtility.java
index 5554414..553d890 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/util/JBossConfigurationUtility.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/util/JBossConfigurationUtility.java
@@ -58,7 +58,7 @@ public class JBossConfigurationUtility
if (url.getProtocol().equals("file"))
{
File file = (new File(url.getFile())).getCanonicalFile();
- url = file.toURL();
+ url = file.toURI().toURL();
}
}
catch (Exception e)
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/helper/JBossInstanceInfo.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/helper/JBossInstanceInfo.java
index 3ae813e..9dadd39 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/helper/JBossInstanceInfo.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/helper/JBossInstanceInfo.java
@@ -150,14 +150,15 @@ public class JBossInstanceInfo {
case 'P': // 'P' (--properties)
{
- // cwd can be null if native support is not able to determine CWD.
- if (null == currentWorkingDir) {
- log.error("Could not determine CWD. Failed to parse argument to --properties option: "
+ String arg = options.getOptarg();
+
+ // cwd can be null if native support (i.e. SIGAR) is not able to determine it.
+ if (!new File(arg).isAbsolute() && currentWorkingDir == null) {
+ log.error("Could not determine current working directory. Failed to parse relative path argument to --properties option: "
+ options.getOptarg());
break;
}
- String arg = options.getOptarg();
URL url;
try {
File workingDir = new File(currentWorkingDir);
diff --git a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/util/JBossConfigurationUtility.java b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/util/JBossConfigurationUtility.java
index dff5b82..8b94c6e 100644
--- a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/util/JBossConfigurationUtility.java
+++ b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/util/JBossConfigurationUtility.java
@@ -53,7 +53,7 @@ public class JBossConfigurationUtility {
url = new URL(urlSpec);
if (url.getProtocol().equals("file")) {
File file = (new File(url.getFile())).getCanonicalFile();
- url = file.toURL();
+ url = file.toURI().toURL();
}
}
catch (Exception e) {
commit 95e6afc28475db9bdc8a216500e4650831d63140
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Wed Sep 14 09:56:57 2011 -0500
Integration tests for mod_cluster should be run on JBoss AS6 Final going forward.
diff --git a/modules/integration-tests/mod_cluster-plugin-test/pom.xml b/modules/integration-tests/mod_cluster-plugin-test/pom.xml
index ba94746..32d5429 100644
--- a/modules/integration-tests/mod_cluster-plugin-test/pom.xml
+++ b/modules/integration-tests/mod_cluster-plugin-test/pom.xml
@@ -18,7 +18,8 @@
<properties>
<scm.module.path>modules/integration-tests/mod_cluster-plugin-test</scm.module.path>
<!-- jbossas.version>6.0.0.20100429-M3</jbossas.version-->
- <jbossas.version>6.0.0.M1</jbossas.version>
+ <!-- jbossas.version>6.0.0.M1</jbossas.version-->
+ <jbossas.version>6.0.0.Final</jbossas.version>
</properties>
@@ -49,11 +50,11 @@
<scope>provided</scope>
</dependency>
- <dependency>
+ <!-- dependency>
<groupId>org.jboss.integration</groupId>
<artifactId>jboss-profileservice-spi</artifactId>
<scope>provided</scope>
- </dependency>
+ </dependency-->
<dependency>
<groupId>${rhq.groupId}</groupId>
@@ -82,11 +83,11 @@
<scope>test</scope>
</dependency>
- <dependency>
+ <!--dependency>
<groupId>org.jboss.microcontainer</groupId>
<artifactId>jboss-kernel</artifactId>
<scope>test</scope>
- </dependency>
+ </dependency-->
<dependency>
<groupId>org.jboss.jbossas</groupId>
@@ -108,11 +109,11 @@
<scope>test</scope>
</dependency>
- <dependency>
+ <!-- dependency>
<groupId>org.jboss.security</groupId>
<artifactId>jboss-security-spi</artifactId>
<scope>test</scope>
- </dependency>
+ </dependency-->
<!-- dependency>
<groupId>org.jboss.javaee</groupId>
commit 866f957378256adfd16f7ec2c8d96380411f4f22
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Tue Sep 13 18:15:45 2011 -0400
Update to use the right build property for brew.
diff --git a/pom.xml b/pom.xml
index 3c84ff1..d4a2fd3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1242,7 +1242,7 @@
</tstamp>
<mkdir dir="target"/>
<echo file="${product.buildPropertiesFile}">buildTime = ${buildTime}${line.separator}</echo>
- <echo file="${product.buildPropertiesFile}" append="true">buildNumber = ${buildNumber}${line.separator}</echo>
+ <echo file="${product.buildPropertiesFile}" append="true">buildNumber = ${rhq.build.number}${line.separator}</echo>
</tasks>
</configuration>
</execution>
commit 6b727542a50806a040a772708aa3f1d7142d7a01
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Tue Sep 13 13:23:45 2011 -0400
refactor to use one build-property file.
diff --git a/pom.xml b/pom.xml
index 4297d66..3c84ff1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,6 +53,7 @@
<product.supportEmail>info(a)rhq-project.org</product.supportEmail>
<product.version>${project.version}</product.version>
<product.helpDocRoot>http://support.rhq-project.org/display/RHQ/</product.helpDocRoot>
+ <product.buildPropertiesFile>target/build.properties</product.buildPropertiesFile>
<doUpdate>false</doUpdate>
@@ -1155,14 +1156,14 @@
<tstamp>
<format property="buildTime" pattern="MM/dd/yy hh:mm aa z" locale="en,US" timezone="GMT" />
</tstamp>
- <echo file="target/build.properties">buildTime = ${buildTime}${line.separator}</echo>
+ <echo file="${product.buildPropertiesFile}">buildTime = ${buildTime}${line.separator}</echo>
<exec executable="git" outputproperty="buildNumber" failonerror="false" failifexecutionfails="false">
<arg value="log" />
<arg value="--pretty=format:%h" />
<arg value="-n1" />
</exec>
- <echo file="target/build.properties" append="true">buildNumber = ${buildNumber}${line.separator}</echo>
+ <echo file="${product.buildPropertiesFile}" append="true">buildNumber = ${buildNumber}${line.separator}</echo>
</tasks>
</configuration>
</execution>
@@ -1202,7 +1203,7 @@
</goals>
<configuration>
<files>
- <file>${project.build.directory}/build.properties</file>
+ <file>${product.buildPropertiesFile}</file>
</files>
<quiet>true</quiet>
</configuration>
@@ -1240,8 +1241,8 @@
timezone="GMT"/>
</tstamp>
<mkdir dir="target"/>
- <echo file="target/build-time.properties" level="error">buildTime = ${maven.build.timestamp}</echo>
- <echo file="target/build-number.properties" level="error">buildNumber = ${rhq.build.number}</echo>
+ <echo file="${product.buildPropertiesFile}">buildTime = ${buildTime}${line.separator}</echo>
+ <echo file="${product.buildPropertiesFile}" append="true">buildNumber = ${buildNumber}${line.separator}</echo>
</tasks>
</configuration>
</execution>
@@ -1255,7 +1256,7 @@
</goals>
<configuration>
<tasks>
- <echo level="debug">buildTime = ${maven.build.timestamp}</echo>
+ <echo level="debug">buildTime = ${buildTime}</echo>
<echo level="debug">buildNumber = ${rhq.build.number}</echo>
</tasks>
</configuration>
@@ -1274,8 +1275,7 @@
</goals>
<configuration>
<files>
- <file>${project.build.directory}/build-time.properties</file>
- <file>${project.build.directory}/build-number.properties</file>
+ <file>${product.buildPropertiesFile}</file>
</files>
</configuration>
</execution>
commit 5279f3cdb5cef4ff6b380e3688606b583b9df809
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Sep 13 16:48:57 2011 -0400
Adding more detailed logging
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
index 87a4c6c..210fb78 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
@@ -19,13 +19,6 @@
package org.rhq.core.pc.drift;
-import static org.rhq.common.drift.FileEntry.addedFileEntry;
-import static org.rhq.common.drift.FileEntry.changedFileEntry;
-import static org.rhq.common.drift.FileEntry.removedFileEntry;
-import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
-import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
-import static org.rhq.core.util.file.FileUtil.forEachFile;
-
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
@@ -44,6 +37,13 @@ import org.rhq.core.domain.drift.DriftConfiguration;
import org.rhq.core.util.MessageDigestGenerator;
import org.rhq.core.util.file.FileVisitor;
+import static org.rhq.common.drift.FileEntry.addedFileEntry;
+import static org.rhq.common.drift.FileEntry.changedFileEntry;
+import static org.rhq.common.drift.FileEntry.removedFileEntry;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
+import static org.rhq.core.util.file.FileUtil.forEachFile;
+
public class DriftDetector implements Runnable {
private Log log = LogFactory.getLog(DriftDetector.class);
@@ -78,7 +78,9 @@ public class DriftDetector implements Runnable {
}
if (log.isDebugEnabled()) {
+ log.debug("Preparing to run drift detection for the next schedule in " + scheduleQueue);
log.debug("Processing " + schedule);
+
}
if (schedule.getNextScan() > (System.currentTimeMillis() + 100L)) {
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
index 8ec8ad7..fa0ce28 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
@@ -432,7 +432,8 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
if (updatedSchedule == null) {
updatedSchedule = new DriftDetectionSchedule(resourceId, driftConfiguration);
if (log.isInfoEnabled()) {
- log.info("Adding " + updatedSchedule + " to " + schedulesQueue);
+ log.info("No matching schedule was found in the queue. This must be a request to add a new " +
+ "schedule. Adding " + updatedSchedule + " to " + schedulesQueue);
}
boolean added = schedulesQueue.addSchedule(updatedSchedule);
if (added) {
@@ -442,6 +443,12 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
} else {
log.warn("Failed to add " + updatedSchedule + " to " + schedulesQueue);
}
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug(updatedSchedule + " has been updated and added back to " + schedulesQueue);
+ } else if (log.isInfoEnabled()) {
+ log.info(updatedSchedule + " has been updated.");
+ }
}
InventoryManager inventoryMgr = PluginContainer.getInstance().getInventoryManager();
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ScheduleQueueImpl.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ScheduleQueueImpl.java
index dc02b40..e5fa56e 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ScheduleQueueImpl.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ScheduleQueueImpl.java
@@ -1,6 +1,9 @@
package org.rhq.core.pc.drift;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Iterator;
+import java.util.List;
import java.util.PriorityQueue;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -197,15 +200,36 @@ public class ScheduleQueueImpl implements ScheduleQueue {
}
}
+ /**
+ * Generates a string representation of the schedules in the queue. The schedules that
+ * appear in the string are in sorted order. If there is an active schedule it will
+ * appear first. This method can be useful for debugging since it shows the contents of
+ * the queue in sorted order. Use it cautiously however as writes to the queue are
+ * blocked until this method returns.
+ *
+ * @return A string representation of the queue with the schedules appearing in sorted
+ * order.
+ */
@Override
public String toString() {
try {
lock.readLock().lock();
- if (queue.isEmpty()) {
+
+ if (activeSchedule == null && queue.isEmpty()) {
return "ScheduleQueue[]";
}
+
+ DriftDetectionSchedule[] schedules = toArray();
+ Arrays.sort(schedules);
+
+ List<DriftDetectionSchedule> list = new ArrayList<DriftDetectionSchedule>(schedules.length + 1);
+ if (activeSchedule != null) {
+ list.add(activeSchedule);
+ }
+ list.addAll(Arrays.asList(schedules));
+
StringBuilder buffer = new StringBuilder("ScheduleQueue[");
- for (DriftDetectionSchedule schedule : queue) {
+ for (DriftDetectionSchedule schedule : list) {
buffer.append(schedule).append(", ");
}
int end = buffer.length();
commit 0eab5446fa935b7c465a305e2c5b5682234fa73f
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Sep 13 15:28:07 2011 -0400
Change rhq_drift_config.mode column to rhq_drift_config.drift_handling_mode
as 'mode' is a reserved word on oracle.
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
index e1875fe..1ad1b18 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
@@ -671,7 +671,7 @@
<column name="NAME" type="VARCHAR2" size="512" required="true"/>
<column name="INTERVAL" type="LONG" required="true"/>
<column name="IS_ENABLED" type="BOOLEAN" required="true"/>
- <column name="MODE" type="VARCHAR2" size="20" required="true"/>
+ <column name="DRIFT_HANDLING_MODE" type="VARCHAR2" size="20" required="true"/>
<column name="CONFIG_ID" type="INTEGER" required="true" references="RHQ_CONFIG"/>
<column name="RESOURCE_ID" type="INTEGER" required="false" references="RHQ_RESOURCE"/>
</table>
@@ -685,6 +685,7 @@
<column name="CATEGORY" type="VARCHAR2" size="20" required="true"/>
<column name="RESOURCE_ID" type="INTEGER" required="true" references="RHQ_RESOURCE"/>
<column name="DRIFT_CONFIG_ID" type="INTEGER" required="true" references="RHQ_DRIFT_CONFIG"/>
+ <!-- the drift handling mode at changeset creation time -->
<column name="DRIFT_CONFIG_MODE" type="VARCHAR2" size="20" required="true"/>
</table>
diff --git a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
index 949f5bd..c02463e 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -3474,8 +3474,8 @@
<schema-alterColumn table="RHQ_DRIFT_CONFIG" column="INTERVAL" nullable="FALSE" />
<schema-addColumn table="RHQ_DRIFT_CONFIG" column="IS_ENABLED" columnType="BOOLEAN" />
<schema-alterColumn table="RHQ_DRIFT_CONFIG" column="IS_ENABLED" nullable="FALSE" />
- <schema-addColumn table="RHQ_DRIFT_CONFIG" column="MODE" columnType="VARCHAR2" precision="20" />
- <schema-alterColumn table="RHQ_DRIFT_CONFIG" column="MODE" nullable="FALSE" />
+ <schema-addColumn table="RHQ_DRIFT_CONFIG" column="DRIFT_HANDLING_MODE" columnType="VARCHAR2" precision="20" />
+ <schema-alterColumn table="RHQ_DRIFT_CONFIG" column="DRIFT_HANDLING_MODE" nullable="FALSE" />
<schema-addColumn table="RHQ_DRIFT_CONFIG" column="CONFIG_ID" columnType="INTEGER" />
<schema-alterColumn table="RHQ_DRIFT_CONFIG" column="CONFIG_ID" nullable="FALSE" />
<schema-directSQL>
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java
index 244b9c0..d7ac85a 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java
@@ -81,7 +81,7 @@ public class DriftConfiguration implements Serializable {
@Column(name = "IS_ENABLED", nullable = false)
private boolean isEnabled;
- @Column(name = "MODE", nullable = false)
+ @Column(name = "DRIFT_HANDLING_MODE", nullable = false)
@Enumerated(EnumType.STRING)
private DriftHandlingMode driftHandlingMode;
commit 922581d0ccb38838abfbaa505a63b7e886ebfbbe
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Sep 13 15:33:21 2011 -0400
merge two antrun plugin sections into one with two executions
diff --git a/modules/enterprise/server/jar/pom.xml b/modules/enterprise/server/jar/pom.xml
index 77750c0..f49af4e 100644
--- a/modules/enterprise/server/jar/pom.xml
+++ b/modules/enterprise/server/jar/pom.xml
@@ -549,14 +549,7 @@ Build-OS-Version=${os.version}
</goals>
</execution>
- </executions>
- </plugin>
-
- <!-- in order to get JMS to work properly in embedded test container, extract jms-rs.rar classes -->
- <plugin>
- <artifactId>maven-antrun-plugin</artifactId>
- <executions>
-
+ <!-- in order to get JMS to work properly in embedded test container, extract jms-rs.rar classes -->
<execution>
<id>Extract JMS classes from RAR needed for JMS tests</id>
<phase>process-classes</phase>
@@ -582,7 +575,7 @@ Build-OS-Version=${os.version}
</executions>
</plugin>
- <plugin>
+ <plugin>
<artifactId>maven-surefire-plugin</artifactId>
<!-- Everything but the web service tests, this is the standard test execution -->
<configuration>
commit 80561b8d01946b8e818216437245f1138b8a7c98
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Sep 13 15:42:15 2011 -0400
fixing test failure
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/inventory/ResourceContainerTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/inventory/ResourceContainerTest.java
index fd3e68a..5432eff 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/inventory/ResourceContainerTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/inventory/ResourceContainerTest.java
@@ -49,7 +49,9 @@ public class ResourceContainerTest {
@BeforeClass
public void beforeClass() {
PluginContainerConfiguration config = new PluginContainerConfiguration();
- config.setDataDirectory(new File("target/PluginContainerTest"));
+ File dataDir = new File("target/PluginContainerTest");
+ dataDir.mkdirs();
+ config.setDataDirectory(dataDir);
PluginContainer pc = PluginContainer.getInstance();
pc.setConfiguration(config);
pc.initialize();
commit 352b2a8f03936fc306557f5bdfe55af817310813
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Sep 13 15:04:49 2011 -0400
Removing commented out, obsolete code
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
index 9b2396b..c89575d 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
@@ -2165,8 +2165,6 @@ public class InventoryManager extends AgentService implements ContainerService,
}
driftMgr.scheduleDriftDetection(resourceId, c);
}
-// driftMgr.unscheduleDriftDetection(resourceId, c);
-// driftMgr.scheduleDriftDetection(resourceId, c);
}
}
} else {
commit f52d27129e6fa57b9932d05f35e16e4e6c889d70
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Sep 13 12:48:25 2011 -0400
Add change set version to headers in change set report
diff --git a/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReaderImpl.java b/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReaderImpl.java
index 5ccd8bb..b8c383a 100644
--- a/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReaderImpl.java
+++ b/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReaderImpl.java
@@ -19,10 +19,6 @@
package org.rhq.common.drift;
-import static org.rhq.common.drift.FileEntry.addedFileEntry;
-import static org.rhq.common.drift.FileEntry.changedFileEntry;
-import static org.rhq.common.drift.FileEntry.removedFileEntry;
-
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
@@ -35,6 +31,10 @@ import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.drift.DriftChangeSetCategory;
+import static org.rhq.common.drift.FileEntry.addedFileEntry;
+import static org.rhq.common.drift.FileEntry.changedFileEntry;
+import static org.rhq.common.drift.FileEntry.removedFileEntry;
+
/**
* Note that this implementation does not do any validation for the most part. It assumes
* that entries in the change set file contain valid, 64 character SHA-256 hashes. It
@@ -99,6 +99,7 @@ public class ChangeSetReaderImpl implements ChangeSetReader {
headers.setDriftConfigurationName(reader.readLine());
headers.setBasedir(reader.readLine());
headers.setType(DriftChangeSetCategory.fromCode(reader.readLine()));
+ headers.setVersion(Integer.parseInt(reader.readLine()));
} catch (IOException e) {
throw e;
} catch (Throwable t) {
diff --git a/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriter.java b/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriter.java
index 44bf20e..f778e5c 100644
--- a/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriter.java
+++ b/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriter.java
@@ -42,6 +42,7 @@ import java.io.IOException;
* <li>drift configuration name</li>
* <li>drift configuration base directory</li>
* <li>change set type flag indicating whether this is a coverage or drift changeset</li>
+ * <li>change set version number</li>
* </ul>
* <br/>
* <br/>
diff --git a/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriterImpl.java b/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriterImpl.java
index b694540..fb6d7c3 100644
--- a/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriterImpl.java
+++ b/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetWriterImpl.java
@@ -51,6 +51,7 @@ public class ChangeSetWriterImpl implements ChangeSetWriter {
writer.write(headers.getDriftConfigurationName() + "\n");
writer.write(headers.getBasedir() + "\n");
writer.write(headers.getType().code() + "\n");
+ writer.write(headers.getVersion() + "\n");
}
public void write(FileEntry entry) throws IOException {
diff --git a/modules/common/drift/src/main/java/org/rhq/common/drift/Headers.java b/modules/common/drift/src/main/java/org/rhq/common/drift/Headers.java
index 2799a3c..f482ccb 100644
--- a/modules/common/drift/src/main/java/org/rhq/common/drift/Headers.java
+++ b/modules/common/drift/src/main/java/org/rhq/common/drift/Headers.java
@@ -42,6 +42,8 @@ public class Headers implements Serializable {
private int resourceId;
+ private int version;
+
/**
* This is the id of the resource to which the change set belongs
*
@@ -112,4 +114,18 @@ public class Headers implements Serializable {
this.type = type;
}
+ /**
+ * @return The change set version
+ */
+ public int getVersion() {
+ return version;
+ }
+
+ /**
+ * @param version The change set version
+ */
+ public void setVersion(int version) {
+ this.version = version;
+ }
+
}
diff --git a/modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetReaderImplTest.java b/modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetReaderImplTest.java
index c6bd763..6df07f0 100644
--- a/modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetReaderImplTest.java
+++ b/modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetReaderImplTest.java
@@ -23,6 +23,7 @@ public class ChangeSetReaderImplTest {
"file-added-test\n" +
"myresource\n" +
"C\n" +
+ "1\n" +
"A " + sha + " 0 conf/myconf.conf";
ChangeSetReaderImpl reader = new ChangeSetReaderImpl(new StringReader(changeset));
@@ -34,6 +35,7 @@ public class ChangeSetReaderImplTest {
expectedHeaders.setDriftConfigurationName("file-added-test");
expectedHeaders.setBasedir("myresource");
expectedHeaders.setType(COVERAGE);
+ expectedHeaders.setVersion(1);
assertHeadersEquals(actualHeaders, expectedHeaders);
@@ -53,6 +55,7 @@ public class ChangeSetReaderImplTest {
"file-removed-test\n" +
"myresource\n" +
"C\n" +
+ "1\n" +
"R 0 " + sha + " conf/myconf.conf";
ChangeSetReaderImpl reader = new ChangeSetReaderImpl(new StringReader(changeset));
@@ -64,6 +67,7 @@ public class ChangeSetReaderImplTest {
expectedHeaders.setDriftConfigurationName("file-removed-test");
expectedHeaders.setBasedir("myresource");
expectedHeaders.setType(COVERAGE);
+ expectedHeaders.setVersion(1);
assertHeadersEquals(actualHeaders, expectedHeaders);
@@ -84,6 +88,7 @@ public class ChangeSetReaderImplTest {
"file-changed-test\n" +
"myresource\n" +
"C\n" +
+ "1\n" +
"C " + newSha + " " + oldSha + " conf/myconf.conf";
ChangeSetReaderImpl reader = new ChangeSetReaderImpl(new StringReader(changeset));
@@ -95,6 +100,7 @@ public class ChangeSetReaderImplTest {
expectedHeaders.setDriftConfigurationName("file-changed-test");
expectedHeaders.setBasedir("myresource");
expectedHeaders.setType(COVERAGE);
+ expectedHeaders.setVersion(1);
assertHeadersEquals(actualHeaders, expectedHeaders);
@@ -114,6 +120,7 @@ public class ChangeSetReaderImplTest {
"file-name-test\n" +
"myresource\n" +
"C\n" +
+ "1\n" +
"A " + sha + " 0 conf/file with spaces.conf";
ChangeSetReaderImpl reader = new ChangeSetReaderImpl(new StringReader(changeset));
@@ -125,6 +132,7 @@ public class ChangeSetReaderImplTest {
expectedHeaders.setDriftConfigurationName("file-name-test");
expectedHeaders.setBasedir("myresource");
expectedHeaders.setType(COVERAGE);
+ expectedHeaders.setVersion(1);
assertHeadersEquals(actualHeaders, expectedHeaders);
@@ -153,6 +161,7 @@ public class ChangeSetReaderImplTest {
"multiple-dir-entries-test\n" +
"myresource\n" +
"C\n" +
+ "1\n" +
"A " + sha256("resource.conf") + " 0 conf/resource.conf\n" +
"A " + sha256("resource.jar") + " 0 lib/resource.jar";
@@ -175,6 +184,7 @@ public class ChangeSetReaderImplTest {
"single-dir-entry-test\n" +
"myresource\n" +
"C\n" +
+ "1\n" +
"A " + sha + " 0 conf/resource.conf\n";
ChangeSetReaderImpl reader = new ChangeSetReaderImpl(new StringReader(changeset));
@@ -198,7 +208,8 @@ public class ChangeSetReaderImplTest {
"1\n" +
"empty-changeset-test\n" +
"myresouce\n" +
- "C\n";
+ "C\n" +
+ "1\n";
ChangeSetReaderImpl reader = new ChangeSetReaderImpl(new StringReader(changeset));
int numEntries = 0;
diff --git a/modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetWriterImplTest.java b/modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetWriterImplTest.java
index e9efddd..40fff48 100644
--- a/modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetWriterImplTest.java
+++ b/modules/common/drift/src/test/java/org/rhq/common/drift/ChangeSetWriterImplTest.java
@@ -67,6 +67,7 @@ public class ChangeSetWriterImplTest {
headers.setDriftConfigurationName("add-file-test");
headers.setBasedir(resourceDir.getAbsolutePath());
headers.setType(COVERAGE);
+ headers.setVersion(1);
ChangeSetWriterImpl writer = new ChangeSetWriterImpl(changeSetFile, headers);
@@ -76,10 +77,10 @@ public class ChangeSetWriterImplTest {
File metaDataFile = writer.getChangeSetFile();
List<String> lines = readLines(new FileInputStream(metaDataFile));
- assertEquals(lines.size(), 6, "Expected to find seven lines in " + metaDataFile.getPath() +
- " - five for the header followed by one file entry.");
+ assertEquals(lines.size(), 7, "Expected to find seven lines in " + metaDataFile.getPath() +
+ " - six for the header followed by one file entry.");
assertHeadersEquals(lines, headers);
- assertFileEntryEquals(lines.get(5), "A a34ef6 0 conf/myconf.conf");
+ assertFileEntryEquals(lines.get(6), "A a34ef6 0 conf/myconf.conf");
}
@Test
@@ -94,6 +95,7 @@ public class ChangeSetWriterImplTest {
headers.setDriftConfigurationName("removed-file-test");
headers.setBasedir(resourceDir.getAbsolutePath());
headers.setType(COVERAGE);
+ headers.setVersion(1);
ChangeSetWriterImpl writer = new ChangeSetWriterImpl(changeSetFile, headers);
@@ -103,10 +105,10 @@ public class ChangeSetWriterImplTest {
File metaDataFile = writer.getChangeSetFile();
List<String> lines = readLines(new FileInputStream(metaDataFile));
- assertEquals(lines.size(), 6, "Expected to find six lines in " + metaDataFile.getPath() +
- " - five for the header followed by one file entry.");
+ assertEquals(lines.size(), 7, "Expected to find seven lines in " + metaDataFile.getPath() +
+ " - six for the header followed by one file entry.");
assertHeadersEquals(lines, headers);
- assertFileEntryEquals(lines.get(5), "R 0 a34ef6 conf/myconf.conf");
+ assertFileEntryEquals(lines.get(6), "R 0 a34ef6 conf/myconf.conf");
}
@Test
@@ -121,6 +123,7 @@ public class ChangeSetWriterImplTest {
headers.setDriftConfigurationName("changed-file-test");
headers.setBasedir(resourceDir.getAbsolutePath());
headers.setType(COVERAGE);
+ headers.setVersion(1);
ChangeSetWriterImpl writer = new ChangeSetWriterImpl(changeSetFile, headers);
@@ -130,10 +133,10 @@ public class ChangeSetWriterImplTest {
File metaDataFile = writer.getChangeSetFile();
List<String> lines = readLines(new FileInputStream(metaDataFile));
- assertEquals(lines.size(), 6, "Expected to find six lines in " + metaDataFile.getPath() +
- " - five for the header followed by one file entry.");
+ assertEquals(lines.size(), 7, "Expected to find seven lines in " + metaDataFile.getPath() +
+ " - six for the header followed by one file entry.");
assertHeadersEquals(lines, headers);
- assertFileEntryEquals(lines.get(5), "C c2d55f a34ef6 conf/myconf.conf");
+ assertFileEntryEquals(lines.get(6), "C c2d55f a34ef6 conf/myconf.conf");
}
/**
@@ -154,6 +157,8 @@ public class ChangeSetWriterImplTest {
"base directory.");
assertEquals(lines.get(4), headers.getType().code(), "The fifth header entry should be the change set " +
"category code");
+ assertEquals(Integer.parseInt(lines.get(5)), headers.getVersion(),
+ "The sixth header entry should be the change set version.");
}
/**
@@ -168,8 +173,8 @@ public class ChangeSetWriterImplTest {
String[] expectedFields = expected.split(" ");
String[] actualFields = actual.split(" ");
- assertEquals(4, expectedFields.length, "<" + expected + "> should contain 4 fields");
- assertEquals(4, actualFields.length, "<" + expected + "> should contain 4 fields");
+ assertEquals(expectedFields.length, 4, "<" + expected + "> should contain 4 fields");
+ assertEquals(actualFields.length, 4, "<" + actual + "> should contain 4 fields");
assertEquals(actualFields[0], expectedFields[0], "The first column, the SHA-256, is wrong");
assertEquals(actualFields[1], expectedFields[1], "The second column, the old SHA-256, is wrong");
commit 0b8f83bf0d49e01f3d554a4fcd72258b0f95e08d
Author: John Sanda <jsanda(a)redhat.com>
Date: Mon Sep 12 16:38:49 2011 -0400
No need to reschedule drift configs that have not changed
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
index 3c768b9..9b2396b 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
@@ -2128,20 +2128,22 @@ public class InventoryManager extends AgentService implements ContainerService,
}
}
- private void installDriftConfigurations(Map<Integer, List<DriftConfiguration>> driftConfigurations) {
+ private void installDriftConfigurations(Map<Integer, List<DriftConfiguration>> configsFromServer) {
DriftManager driftMgr = PluginContainer.getInstance().getDriftManager();
if (driftMgr != null && driftMgr.isInitialized()) {
+ DriftConfigurationComparator comparator =
+ new DriftConfigurationComparator(BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS);
+ ScheduleQueue queue = driftMgr.getSchedulesQueue();
+
// First check for drift configurations that have been deleted
- for (Integer resourceId : driftConfigurations.keySet()) {
- Set<DriftConfiguration> resourceConfigs = new TreeSet<DriftConfiguration>(
- new DriftConfigurationComparator(BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS));
- resourceConfigs.addAll(driftConfigurations.get(resourceId));
+ for (Integer resourceId : configsFromServer.keySet()) {
+ Set<DriftConfiguration> configsFromServerSet = new TreeSet<DriftConfiguration>(comparator);
+ configsFromServerSet.addAll(configsFromServer.get(resourceId));
List<DriftConfiguration> deleted = new ArrayList<DriftConfiguration>();
- ScheduleQueue queue = driftMgr.getSchedulesQueue();
for (DriftDetectionSchedule schedule : queue.toArray()) {
- if (!resourceConfigs.contains(schedule.getDriftConfiguration())) {
+ if (!configsFromServerSet.contains(schedule.getDriftConfiguration())) {
if (log.isDebugEnabled()) {
log.debug("Detected stale drift configuration. Preparing to unschedule " + schedule);
}
@@ -2153,12 +2155,18 @@ public class InventoryManager extends AgentService implements ContainerService,
}
}
- // add drift configurations received from the server. These could be
- // new or updated configurations.
- for (Integer resourceId : driftConfigurations.keySet()) {
- for (DriftConfiguration c : driftConfigurations.get(resourceId)) {
- driftMgr.unscheduleDriftDetection(resourceId, c);
- driftMgr.scheduleDriftDetection(resourceId, c);
+ // add new drift configurations received from the server
+ for (Integer resourceId : configsFromServer.keySet()) {
+ for (DriftConfiguration c : configsFromServer.get(resourceId)) {
+ if (!queue.contains(resourceId, c, comparator)) {
+ if (log.isDebugEnabled()) {
+ log.debug("Detected new drift configuration. Creating new schedule for " +
+ "DriftConfiguration[name: " + c.getName() + ", resourceId: " + resourceId + "]");
+ }
+ driftMgr.scheduleDriftDetection(resourceId, c);
+ }
+// driftMgr.unscheduleDriftDetection(resourceId, c);
+// driftMgr.scheduleDriftDetection(resourceId, c);
}
}
} else {
@@ -2166,11 +2174,11 @@ public class InventoryManager extends AgentService implements ContainerService,
// First check for drift configurations that have been deleted
log.debug("Checking for stale drift configurations that need to be purged from inventory");
- for (Integer resourceId : driftConfigurations.keySet()) {
+ for (Integer resourceId : configsFromServer.keySet()) {
ResourceContainer container = getResourceContainer(resourceId);
Set<DriftConfiguration> resourceConfigs = new TreeSet<DriftConfiguration>(
new DriftConfigurationComparator(BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS));
- resourceConfigs.addAll(driftConfigurations.get(resourceId));
+ resourceConfigs.addAll(configsFromServer.get(resourceId));
List<DriftConfiguration> deleted = new ArrayList<DriftConfiguration>();
@@ -2192,9 +2200,9 @@ public class InventoryManager extends AgentService implements ContainerService,
// Now add any any drift configurations received from the server. These
// could be new or updated configurations.
log.debug("Checking for new or updated drift configurations");
- for (Integer resourceId : driftConfigurations.keySet()) {
+ for (Integer resourceId : configsFromServer.keySet()) {
ResourceContainer container = getResourceContainer(resourceId);
- for (DriftConfiguration c : driftConfigurations.get(resourceId)) {
+ for (DriftConfiguration c : configsFromServer.get(resourceId)) {
if (log.isDebugEnabled()) {
log.debug("Adding or updating DriftConfiguration[name: " + c.getName() + ", resourceId: " +
resourceId + "]");
commit 8bb8c6d6a71a9f9cf391e822d96d8f22d8daa39f
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Tue Sep 13 13:44:15 2011 -0400
[BZ 738031] upgrade EMS from 1.2.15.1 to 1.2.16 to fix failure of as5 plugin to initialize the EMS connection to an AS 6.0 instance (https://bugzilla.redhat.com/show_bug.cgi?id=738031)
(cherry picked from commit a49952619b9f61fc67631583a2e679e580f97b0c)
diff --git a/pom.xml b/pom.xml
index a023da4..4297d66 100644
--- a/pom.xml
+++ b/pom.xml
@@ -85,7 +85,7 @@
<jsf-api.version>1.2_14</jsf-api.version>
<jsf-impl.version>1.2_14</jsf-impl.version>
<ojdbc5.version>11.2.0.2.0</ojdbc5.version>
- <ems.version>1.2.15.1</ems.version>
+ <ems.version>1.2.16</ems.version>
<postgresql.version>9.0-801.jdbc4</postgresql.version>
<h2.version>1.2.139</h2.version>
<jtds.version>1.2.2</jtds.version>
commit 67a0771ffa3678ae0a36946fc69612b07b055d82
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Tue Sep 13 14:22:06 2011 -0400
[BZ 738050] prior to invoking plugin API methods on discovery components, make sure the context classloader is set correctly; specifically, it must be set to the parent resource component's classloader, except for platform discovery, where it must be set to the platform-plugin classloader) (https://bugzilla.redhat.com/show_bug.cgi?id=738050)
(cherry picked from commit 3cd497771b43e14d9ceb945b72301816a0e40657)
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
index 6f6b747..3c768b9 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
@@ -317,7 +317,7 @@ public class InventoryManager extends AgentService implements ContainerService,
try {
ResourceDiscoveryComponent proxy = this.discoveryComponentProxyFactory.getDiscoveryComponentProxy(context
- .getResourceType(), component, timeout);
+ .getResourceType(), component, timeout, parentResourceContainer);
Set<DiscoveredResourceDetails> results = proxy.discoverResources(context);
return results;
} catch (TimeoutException te) {
@@ -337,20 +337,23 @@ public class InventoryManager extends AgentService implements ContainerService,
* an empty set if nothing is discovered. This may return <code>null</code> if for some reason
* we could not invoke the discovery component.
*
+ *
* @param component the discovery component that will actually go out and discover resources
* @param pluginConfig the plugin configuration to be used to connect to the resource to be discovered
* @param context the context for use by the discovery component
+ * @param parentResourceContainer
* @return the details of all discovered resources, may be empty or <code>null</code>
*
* @throws Exception if the discovery component threw an exception
*/
private DiscoveredResourceDetails discoverResource(ResourceDiscoveryComponent component,
- Configuration pluginConfig, ResourceDiscoveryContext context) throws Exception {
+ Configuration pluginConfig, ResourceDiscoveryContext context,
+ ResourceContainer parentResourceContainer) throws Exception {
long timeout = getDiscoveryComponentTimeout(context.getResourceType());
try {
ManualAddFacet proxy = this.discoveryComponentProxyFactory.getDiscoveryComponentProxy(context
- .getResourceType(), component, timeout, ManualAddFacet.class);
+ .getResourceType(), component, timeout, ManualAddFacet.class, parentResourceContainer);
DiscoveredResourceDetails result = proxy.discoverResource(pluginConfig, context);
return result;
} catch (TimeoutException te) {
@@ -386,7 +389,7 @@ public class InventoryManager extends AgentService implements ContainerService,
long timeout = getDiscoveryComponentTimeout(resourceType);
ClassLoaderFacet proxy = this.discoveryComponentProxyFactory.getDiscoveryComponentProxy(resourceType,
- component, timeout, ClassLoaderFacet.class);
+ component, timeout, ClassLoaderFacet.class, parentContainer);
ResourceDiscoveryContext discoveryContext = new ResourceDiscoveryContext(resourceType, parentComponent,
parentResourceContext, SystemInfoFactory.createSystemInfo(), null, null, this.configuration
@@ -406,14 +409,14 @@ public class InventoryManager extends AgentService implements ContainerService,
}
public <T extends ResourceComponent> ResourceUpgradeReport invokeDiscoveryComponentResourceUpgradeFacet(
- ResourceType resourceType, ResourceDiscoveryComponent<T> component,
- ResourceUpgradeContext<T> inventoriedResource) throws Throwable {
+ ResourceType resourceType, ResourceDiscoveryComponent<T> component,
+ ResourceUpgradeContext<T> inventoriedResource, ResourceContainer parentResourceContainer) throws Throwable {
long timeout = getDiscoveryComponentTimeout(resourceType);
try {
@SuppressWarnings("unchecked")
ResourceUpgradeFacet<T> proxy = this.discoveryComponentProxyFactory.getDiscoveryComponentProxy(
- resourceType, component, timeout, ResourceUpgradeFacet.class);
+ resourceType, component, timeout, ResourceUpgradeFacet.class, parentResourceContainer);
return proxy.upgrade(inventoriedResource);
} catch (BlacklistedException e) {
@@ -683,7 +686,8 @@ public class InventoryManager extends AgentService implements ContainerService,
// Ask the plugin's discovery component to find the new resource, throwing exceptions if it cannot be
// found at all.
- discoveredResourceDetails = discoverResource(discoveryComponent, pluginConfiguration, discoveryContext);
+ discoveredResourceDetails = discoverResource(discoveryComponent, pluginConfiguration, discoveryContext,
+ parentResourceContainer);
if (discoveredResourceDetails == null) {
log.info("Plugin Error: During manual add, discovery component method ["
+ discoveryComponent.getClass().getName() + ".discoverResource()] returned null "
@@ -1513,7 +1517,7 @@ public class InventoryManager extends AgentService implements ContainerService,
// wrap the discovery component in a proxy to allow us to timeout discovery invocations
try {
discoveryComponent = this.discoveryComponentProxyFactory.getDiscoveryComponentProxy(type,
- discoveryComponent, getDiscoveryComponentTimeout(type));
+ discoveryComponent, getDiscoveryComponentTimeout(type), parentResourceContainer);
} catch (Exception e) {
discoveryComponent = null;
log.warn("Cannot give activated resource its discovery component. Cause: " + e);
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/plugin/PluginComponentFactory.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/plugin/PluginComponentFactory.java
index 10aae22..c0a0fae 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/plugin/PluginComponentFactory.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/plugin/PluginComponentFactory.java
@@ -89,6 +89,20 @@ public class PluginComponentFactory implements ContainerService {
log.debug("Creating discovery component [" + className + "] for resource type [" + typeName + ']');
}
+ ClassLoader classLoader = getDiscoveryComponentClassLoader(parentResourceContainer, pluginName);
+
+ ResourceDiscoveryComponent discoveryComponent = (ResourceDiscoveryComponent) instantiateClass(classLoader,
+ className);
+
+ if (log.isDebugEnabled()) {
+ log.debug("Created discovery component [" + className + "] for resource type [" + typeName + ']');
+ }
+
+ return discoveryComponent;
+ }
+
+ public ClassLoader getDiscoveryComponentClassLoader(ResourceContainer parentResourceContainer, String pluginName)
+ throws PluginContainerException {
// Determine what classloader to use to load the discovery component class. If the parent resource for newly
// discovered resources is the root platform (or if the discovered resource is going TO BE the root platform),
// we can just use the plugin classloader. If discovered resources will be children of a top level server or
@@ -109,15 +123,7 @@ public class PluginComponentFactory implements ContainerService {
classLoader = classLoaderMgr.obtainDiscoveryClassLoader(pluginName, parentClassLoader);
}
}
-
- ResourceDiscoveryComponent discoveryComponent = (ResourceDiscoveryComponent) instantiateClass(classLoader,
- className);
-
- if (log.isDebugEnabled()) {
- log.debug("Created discovery component [" + className + "] for resource type [" + typeName + ']');
- }
-
- return discoveryComponent;
+ return classLoader;
}
/**
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/upgrade/ResourceUpgradeDelegate.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/upgrade/ResourceUpgradeDelegate.java
index c659b8e..6dff613 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/upgrade/ResourceUpgradeDelegate.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/upgrade/ResourceUpgradeDelegate.java
@@ -274,7 +274,7 @@ public class ResourceUpgradeDelegate {
ResourceUpgradeReport upgradeReport = null;
try {
upgradeReport = inventoryManager.invokeDiscoveryComponentResourceUpgradeFacet(resource.getResourceType(),
- discoveryComponent, upgradeContext);
+ discoveryComponent, upgradeContext, parentResourceContainer);
} catch (Throwable t) {
log.error("ResourceUpgradeFacet threw an exception while upgrading resource [" + resource + "]", t);
request.setErrorProperties(t);
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/util/DiscoveryComponentProxyFactory.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/util/DiscoveryComponentProxyFactory.java
index bcbd31d..b72f019 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/util/DiscoveryComponentProxyFactory.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/util/DiscoveryComponentProxyFactory.java
@@ -41,8 +41,11 @@ import org.apache.commons.logging.LogFactory;
import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.pc.PluginContainer;
+import org.rhq.core.pc.inventory.ResourceContainer;
import org.rhq.core.pc.inventory.TimeoutException;
import org.rhq.core.pc.plugin.BlacklistedException;
+import org.rhq.core.pc.plugin.PluginComponentFactory;
import org.rhq.core.pluginapi.inventory.ClassLoaderFacet;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
@@ -65,20 +68,24 @@ public class DiscoveryComponentProxyFactory {
private final Set<ResourceType> blacklist = new HashSet<ResourceType>();
/**
- * Same as {@link #getDiscoveryComponentProxy(ResourceType, ResourceDiscoveryComponent, long)} except
+ * Same as {@link #getDiscoveryComponentProxy(org.rhq.core.domain.resource.ResourceType, org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent, long, org.rhq.core.pc.inventory.ResourceContainer)} except
* this lets you provide the interface of the discovery component you want to talk to. For example,
* use this to talk to the {@link ClassLoaderFacet} of a discovery component.
*/
@SuppressWarnings("unchecked")
public <T> T getDiscoveryComponentProxy(ResourceType type, ResourceDiscoveryComponent component, long timeout,
- Class<T> componentInterface) throws PluginContainerException, BlacklistedException {
+ Class<T> componentInterface, ResourceContainer parentResourceContainer)
+ throws PluginContainerException, BlacklistedException {
if (isResourceTypeBlacklisted(type)) {
throw new BlacklistedException("Discovery component for resource type [" + type + "] has been blacklisted");
}
try {
- ClassLoader pluginClassLoader = component.getClass().getClassLoader();
+ PluginComponentFactory pluginComponentFactory = PluginContainer.getInstance().getPluginComponentFactory();
+
+ ClassLoader pluginClassLoader =
+ pluginComponentFactory.getDiscoveryComponentClassLoader(parentResourceContainer, type.getPlugin());
// This is the handler that will actually invoke the method calls.
ResourceDiscoveryComponentInvocationHandler handler = new ResourceDiscoveryComponentInvocationHandler(type,
@@ -99,10 +106,12 @@ public class DiscoveryComponentProxyFactory {
* to make calls into the plugin discovery component and not deadlock if that plugin misbehaves and never returns
* (or takes too long to return).
*
+ *
* @param type the resource type that is to be discovered by the given discovery component
* @param component the discovery component to be wrapped in a timer proxy
* @param timeout the time, in milliseconds, that invocations can take to invoke discovery component methods
- *
+ *
+ * @param parentResourceContainer
* @return the discovery component wrapped in a proxy that should be used to make calls to the component
*
* @throws PluginContainerException if this method failed to create the proxy
@@ -111,9 +120,11 @@ public class DiscoveryComponentProxyFactory {
*/
@SuppressWarnings("unchecked")
public ResourceDiscoveryComponent getDiscoveryComponentProxy(ResourceType type,
- ResourceDiscoveryComponent component, long timeout) throws PluginContainerException, BlacklistedException {
-
- return getDiscoveryComponentProxy(type, component, timeout, ResourceDiscoveryComponent.class);
+ ResourceDiscoveryComponent component, long timeout,
+ ResourceContainer parentResourceContainer)
+ throws PluginContainerException, BlacklistedException {
+ return getDiscoveryComponentProxy(type, component, timeout, ResourceDiscoveryComponent.class,
+ parentResourceContainer);
}
public void initialize() {
commit 0c62a2411dbeddc5d67f30df71b7e8948225cf61
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Tue Sep 13 18:43:22 2011 +0200
BZ 737996 - Working around the property names inconsistency in the clustered web app contexts.
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java
index 0e5f00a..bca27da 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ManagedComponentComponent.java
@@ -235,6 +235,24 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
// MeasurementFacet Implementation --------------------------------------------
public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception {
+ ManagedComponent managedComponent = prepareForMetricCollection(metrics);
+ RunState runState = managedComponent.getRunState();
+ for (MeasurementScheduleRequest request : metrics) {
+ try {
+ String value = getMeasurement(managedComponent, request.getName());
+ addValueToMeasurementReport(report, request, value);
+ } catch (Exception e) {
+ if (runState == RunState.RUNNING) {
+ log.error("Failed to collect metric for " + request, e);
+ } else {
+ log.debug("Failed to collect metric for " + request
+ + ", but managed component is not in the RUNNING state.", e);
+ }
+ }
+ }
+ }
+
+ protected ManagedComponent prepareForMetricCollection(Set<MeasurementScheduleRequest> metrics) {
// this bit could be synchronized but I don't think it really hurts to perhaps go through this logic more
// than once, it will settle down near immediately
Map<String, Boolean> runtimeMetricMap = runtimeMetricMaps.get(this.getClass().getName());
@@ -264,27 +282,18 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
}
}
- ManagedComponent managedComponent = getManagedComponent(forceRefresh);
- RunState runState = managedComponent.getRunState();
- for (MeasurementScheduleRequest request : metrics) {
- try {
- if (request.getName().equals("runState")) {
- report.addData(new MeasurementDataTrait(request, runState.name()));
- } else {
- Object value = getSimpleValue(managedComponent, request);
- addValueToMeasurementReport(report, request, value);
- }
- } catch (Exception e) {
- if (runState == RunState.RUNNING) {
- log.error("Failed to collect metric for " + request, e);
- } else {
- log.debug("Failed to collect metric for " + request
- + ", but managed component is not in the RUNNING state.", e);
- }
- }
+ return getManagedComponent(forceRefresh);
+ }
+
+ protected String getMeasurement(ManagedComponent component, String metricName) throws Exception {
+ if ("runState".equals(metricName)) {
+ return component.getRunState().name();
+ } else {
+ Object value = getSimpleValue(managedComponent, metricName);
+ return value == null ? null : toString(value);
}
}
-
+
protected void updateComponent(ManagedComponent managedComponent) throws Exception {
log.trace("Updating " + getResourceDescription() + " with component " + toString(managedComponent) + "...");
ManagementView managementView = getConnection().getManagementView();
@@ -307,6 +316,11 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
@Nullable
protected Object getSimpleValue(ManagedComponent managedComponent, MeasurementScheduleRequest request) {
String metricName = request.getName();
+ return getSimpleValue(managedComponent, metricName);
+ }
+
+ @Nullable
+ protected Object getSimpleValue(ManagedComponent managedComponent, String metricName) {
int pipeIndex = metricName.indexOf(PREFIX_DELIMITER);
// Remove the prefix if there is one (e.g. "ThreadPool|currentThreadCount" -> "currentThreadCount").
String compositePropName = (pipeIndex == -1) ? metricName : metricName.substring(pipeIndex + 1);
@@ -326,7 +340,7 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
}
return getInnerValue(metaValue);
}
-
+
/**
* The name of the measurement schedule request (i.e. the metric name) can be in one of two forms:
* <p/>
@@ -352,7 +366,7 @@ public class ManagedComponentComponent extends AbstractManagedComponent implemen
// TODO: Move this to a utility class.
@Nullable
- private static Object getInnerValue(MetaValue metaValue) {
+ protected static Object getInnerValue(MetaValue metaValue) {
if (metaValue == null) {
return null;
}
diff --git a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/WebApplicationContextComponent.java b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/WebApplicationContextComponent.java
index ce4a851..9c5f938 100644
--- a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/WebApplicationContextComponent.java
+++ b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/WebApplicationContextComponent.java
@@ -32,6 +32,7 @@ import org.apache.commons.logging.LogFactory;
import org.jboss.deployers.spi.management.ManagementView;
import org.jboss.managed.api.ComponentType;
import org.jboss.managed.api.ManagedComponent;
+import org.jboss.managed.api.ManagedProperty;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
@@ -62,6 +63,9 @@ public class WebApplicationContextComponent extends ManagedComponentComponent
private static final String VIRTUAL_HOST_TRAIT = "virtualHost";
+ private static final String CLUSTERED_TRAIT = "clustered";
+ private static final String DISTRIBUTABLE_MANAGED_PROPERTY = "Distributable";
+
// A regex for the names of all MBean:Servlet components for a WAR.
private static final String SERVLET_COMPONENT_NAMES_REGEX_TEMPLATE =
"jboss.web:J2EEApplication=none,J2EEServer=none,"
@@ -82,6 +86,8 @@ public class WebApplicationContextComponent extends ManagedComponentComponent
private String servletComponentNamesRegex;
private ResponseTimeLogParser logParser;
+ private boolean clustered;
+
@Override
public void start(ResourceContext<ProfileServiceComponent> resourceContext) throws Exception
{
@@ -98,6 +104,15 @@ public class WebApplicationContextComponent extends ManagedComponentComponent
this.logParser.setTransforms(responseTimeConfig.getTransforms());
}
+ try {
+ ManagedProperty distributableProp = getManagedComponent().getProperty(DISTRIBUTABLE_MANAGED_PROPERTY);
+ if (distributableProp != null) {
+ Boolean distributable = (Boolean) getInnerValue(distributableProp.getValue());
+ clustered = distributable != null && distributable.booleanValue();
+ }
+ } catch (Exception e) {
+ log.warn("Failed to determine whether the web app context " + resourceContext.getResourceKey() + " is clustered or not.", e);
+ }
}
@Override
@@ -106,7 +121,8 @@ public class WebApplicationContextComponent extends ManagedComponentComponent
{
ProfileServiceComponent warComponent = getResourceContext().getParentResourceComponent();
ManagementView managementView = warComponent.getConnection().getManagementView();
- Set<MeasurementScheduleRequest> remainingRequests = new LinkedHashSet<MeasurementScheduleRequest>();
+
+ ManagedComponent component = prepareForMetricCollection(requests);
for (MeasurementScheduleRequest request : requests)
{
String metricName = request.getName();
@@ -140,10 +156,28 @@ public class WebApplicationContextComponent extends ManagedComponentComponent
+ RESPONSE_TIME_LOG_FILE_CONFIG_PROP + "' connection property.");
// TODO: Communicate this error back to the server for display in the GUI.
}
+ }
+ else if (metricName.equals(CLUSTERED_TRAIT))
+ {
+ MeasurementDataTrait trait = new MeasurementDataTrait(request, Boolean.toString(clustered));
+ report.addData(trait);
}
else
{
- remainingRequests.add(request);
+ String metricNameToUse = metricName;
+ if (clustered && !"runState".equals(metricName)) {
+ metricNameToUse = toUpperCaseFirstLetter(metricName);
+ }
+
+ String value = getMeasurement(component, metricNameToUse);
+
+ if (clustered && !"runState".equals(metricName) && value == null) {
+ //hmm... so it looks like https://issues.jboss.org/browse/JBPAPP-7172 has been fixed
+ //and we're getting the metric names in lower case even for clustered contexts
+ value = getMeasurement(component, metricName);
+ }
+
+ addValueToMeasurementReport(report, request, value);
}
}
catch (Exception e)
@@ -153,9 +187,12 @@ public class WebApplicationContextComponent extends ManagedComponentComponent
+ " Resource with key " + getResourceContext().getResourceKey() + ".", e);
}
}
- super.getValues(report, remainingRequests);
}
+ public boolean isClustered() {
+ return clustered;
+ }
+
private Double getServletMetric(ManagementView managementView, String metricName) throws Exception
{
ComponentType servletComponentType = MoreKnownComponentTypes.MBean.Servlet.getType();
@@ -240,4 +277,14 @@ public class WebApplicationContextComponent extends ManagedComponentComponent
return result;
}
+
+ private static String toUpperCaseFirstLetter(String name) {
+ if (name == null || name.length() == 0) {
+ return name;
+ }
+
+ char first = name.charAt(0);
+
+ return Character.toUpperCase(first) + name.substring(1);
+ }
}
\ No newline at end of file
diff --git a/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
index 5dc6600..a2d68c5 100644
--- a/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
@@ -671,6 +671,9 @@
'>
<!ENTITY webApplicationContextMetrics '
+ <metric property="clustered" dataType="trait" displayType="summary"
+ description="True if this web application context is clustered" defaultOn="true" defaultInterval="3600000" />
+
<metric property="virtualHost"
dataType="trait" displayType="summary"
description="the virtual host with which this context is associated"/>
@@ -1803,6 +1806,8 @@
defaultOn="true" defaultInterval="600000" dataType="measurement" category="utilization"
description="The timestamp of the last message add"/>
+ <metric property="clustered" dataType="trait" description="True if this queue is clustered, false otherwise" defaultInterval="3600000" defaultOn="true"/>
+
<resource-configuration>
<!-- See: https://anonsvn.jboss.org/repos/jbossas/trunk/messaging/src/main/org/jbos... -->
@@ -2140,6 +2145,8 @@
defaultOn="true" defaultInterval="600000" dataType="measurement" category="throughput"
description="The count of all non durable subscriptions to this topic"/>
+ <metric property="clustered" dataType="trait" description="True if this topic is clustered, false otherwise" defaultInterval="3600000" defaultOn="true"/>
+
<resource-configuration>
<!-- See: https://anonsvn.jboss.org/repos/jbossas/trunk/messaging/src/main/org/jbos... -->
commit c069df149d473b09550339a7602e1739f99341d5
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Sep 12 17:58:26 2011 -0400
BZ 737565 - do not allow user to pick multiple conditions using the same metric if using ALL conjunction
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsAlertDefinitionForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsAlertDefinitionForm.java
index 0e11a60..d762b23 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsAlertDefinitionForm.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsAlertDefinitionForm.java
@@ -23,16 +23,24 @@
package org.rhq.enterprise.gui.coregui.client.alert.definitions;
+import java.util.EnumSet;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
+import java.util.Map;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
+import com.smartgwt.client.widgets.form.fields.events.ChangeEvent;
+import com.smartgwt.client.widgets.form.fields.events.ChangeHandler;
import org.rhq.core.domain.alert.AlertCondition;
import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.alert.BooleanExpression;
import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
@@ -44,7 +52,7 @@ public class ConditionsAlertDefinitionForm extends LocatableVLayout implements E
private final ResourceType resourceType;
private AlertDefinition alertDefinition;
- private SelectItem conditionExpression;
+ private SelectItem conditionExpression; // this is the GWT menu where the user selects ALL or ANY conjunction
private ConditionsEditor conditionsEditor;
private StaticTextItem conditionExpressionStatic;
@@ -153,7 +161,38 @@ public class ConditionsAlertDefinitionForm extends LocatableVLayout implements E
conditionExpressionForm.setFields(conditionExpression, conditionExpressionStatic);
- conditionsEditor = new ConditionsEditor(this.extendLocatorId("conditionsEditor"), resourceType, null);
+ conditionsEditor = new ConditionsEditor(this.extendLocatorId("conditionsEditor"), conditionExpression,
+ resourceType, null);
+
+ conditionExpression.addChangeHandler(new ChangeHandler() {
+ @Override
+ public void onChange(ChangeEvent event) {
+ // Find out if this is using the ALL conjunction - if it is, we can't have more than one conditional use the same metric.
+ // If we do, immediately abort and warn the user. See BZ 737565
+ if ((BooleanExpression.ALL.name().equals(event.getValue().toString()))
+ && (resourceType != null && resourceType.getMetricDefinitions() != null)) {
+
+ HashSet<AlertCondition> conditions = conditionsEditor.getConditions();
+ Map<Integer, String> metricIdsUsed = new HashMap<Integer, String>();
+ for (AlertCondition condition : conditions) {
+ if (condition.getMeasurementDefinition() != null) {
+ Integer id = Integer.valueOf(condition.getMeasurementDefinition().getId());
+ if (metricIdsUsed.containsKey(id)) {
+ String msg = MSG
+ .view_alert_definition_condition_editor_metricswarning(metricIdsUsed.get(id));
+ Message warning = new Message(msg, Severity.Warning, EnumSet
+ .of(Message.Option.Transient));
+ CoreGUI.getMessageCenter().notify(warning);
+ event.cancel(); // multiple conditions used the same metric with ALL conjunction, this doesn't work - abort (BZ 737565)
+ break;
+ }
+ metricIdsUsed.put(id, condition.getMeasurementDefinition().getDisplayName());
+ }
+ }
+ }
+ return;
+ }
+ });
setMembers(conditionExpressionForm, conditionsEditor);
formBuilt = true;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java
index 4410315..b5a41a1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java
@@ -36,6 +36,7 @@ import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.CloseClickHandler;
import com.smartgwt.client.widgets.events.CloseClientEvent;
+import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.alert.AlertCondition;
@@ -57,12 +58,15 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
*/
public class ConditionsEditor extends LocatableVLayout {
- private ResourceType resourceType;
+ private final ResourceType resourceType;
private HashSet<AlertCondition> conditions;
private Table<ConditionDataSource> table;
+ private final SelectItem conditionExpression;
- public ConditionsEditor(String locatorId, ResourceType resourceType, HashSet<AlertCondition> conditions) {
+ public ConditionsEditor(String locatorId, SelectItem conditionExpression, ResourceType resourceType,
+ HashSet<AlertCondition> conditions) {
super(locatorId);
+ this.conditionExpression = conditionExpression;
this.resourceType = resourceType;
setConditions(conditions);
}
@@ -160,7 +164,8 @@ public class ConditionsEditor extends LocatableVLayout {
NewConditionEditor newConditionEditor = new NewConditionEditor(
extendLocatorId("newConditionEditor"), conditions,
- ConditionsEditor.this.resourceType, new Runnable() {
+ ConditionsEditor.this.conditionExpression, ConditionsEditor.this.resourceType,
+ new Runnable() {
@Override
public void run() {
winModal.markForDestroy();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
index 04012b1..2ee65a3 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
@@ -25,8 +25,11 @@ package org.rhq.enterprise.gui.coregui.client.alert.definitions;
import java.util.ArrayList;
import java.util.Comparator;
+import java.util.EnumSet;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
+import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
@@ -45,6 +48,7 @@ import com.smartgwt.client.widgets.form.validator.IsFloatValidator;
import org.rhq.core.domain.alert.AlertCondition;
import org.rhq.core.domain.alert.AlertConditionCategory;
+import org.rhq.core.domain.alert.BooleanExpression;
import org.rhq.core.domain.event.EventSeverity;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.DataType;
@@ -54,6 +58,8 @@ import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.operation.OperationRequestStatus;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
/**
@@ -70,11 +76,14 @@ public class NewConditionEditor extends LocatableDynamicForm {
private static final String THRESHOLD_METRIC_ITEMNAME = "thresholdMetric";
private static final String THRESHOLD_COMPARATOR_ITEMNAME = "thresholdComparator";
private static final String THRESHOLD_ABSVALUE_ITEMNAME = "metricAbsoluteValue";
+ private static final String THRESHOLD_NO_METRICS_ITEMNAME = "thresholdNoMetrics";
private static final String BASELINE_METRIC_ITEMNAME = "baselineMetric";
private static final String BASELINE_COMPARATOR_ITEMNAME = "baselineComparator";
private static final String BASELINE_PERCENTAGE_ITEMNAME = "baselinePercentage";
private static final String BASELINE_SELECTION_ITEMNAME = "baselineSelection";
+ private static final String BASELINE_NO_METRICS_ITEMNAME = "baselineNoMetrics";
private static final String CHANGE_METRIC_ITEMNAME = "changeMetric";
+ private static final String CHANGE_NO_METRICS_ITEMNAME = "changeNoMetrics";
private static final String CALLTIME_THRESHOLD_METRIC_ITEMNAME = "calltimeThresholdMetric";
private static final String CALLTIME_THRESHOLD_MINMAXAVG_ITEMNAME = "calltimeThresholdMinMaxAvgSelection";
private static final String CALLTIME_THRESHOLD_COMPARATOR_ITEMNAME = "calltimeThresholdComparator";
@@ -96,9 +105,11 @@ public class NewConditionEditor extends LocatableDynamicForm {
private static final String RANGE_COMPARATOR_ITEMNAME = "rangeComparator";
private static final String RANGE_LO_ABSVALUE_ITEMNAME = "rangeMetricLoValue";
private static final String RANGE_HI_ABSVALUE_ITEMNAME = "rangeMetricHiValue";
+ private static final String RANGE_NO_METRICS_ITEMNAME = "rangeNoMetrics";
private SelectItem conditionTypeSelectItem;
private HashSet<AlertCondition> conditions; // the new condition we create goes into this set
+ private final SelectItem conditionExpression; // this is the GWT menu where the user selects ALL or ANY conjunction
private boolean supportsMetrics = false;
private boolean supportsCalltimeMetrics = false;
private boolean supportsTraits = false;
@@ -109,11 +120,12 @@ public class NewConditionEditor extends LocatableDynamicForm {
private Runnable closeFunction; // this is called after a button is pressed and the editor should close
private ResourceType resourceType;
- public NewConditionEditor(String locatorId, HashSet<AlertCondition> conditions, ResourceType rtype,
- Runnable closeFunc) {
+ public NewConditionEditor(String locatorId, HashSet<AlertCondition> conditions, SelectItem conditionExpression,
+ ResourceType rtype, Runnable closeFunc) {
super(locatorId);
this.conditions = conditions;
+ this.conditionExpression = conditionExpression;
this.closeFunction = closeFunc;
this.resourceType = rtype;
@@ -219,8 +231,9 @@ public class NewConditionEditor extends LocatableDynamicForm {
@Override
public void onClick(ClickEvent event) {
if (validate(false)) {
- saveNewCondition();
- closeFunction.run();
+ if (saveNewCondition()) {
+ closeFunction.run();
+ }
}
}
});
@@ -271,7 +284,28 @@ public class NewConditionEditor extends LocatableDynamicForm {
setFields(formItems.toArray(new FormItem[formItems.size()]));
};
- private void saveNewCondition() {
+ private boolean saveNewCondition() {
+
+ // Find out if this is using the ALL conjunction - if it is, we can't have more than one conditional use the same metric.
+ // If we do, immediately abort and warn the user. See BZ 737565
+ if ((BooleanExpression.ALL.name().equals(this.conditionExpression.getValue().toString()))
+ && (supportsMetrics && this.resourceType.getMetricDefinitions() != null)) {
+
+ Map<Integer, String> metricIdsUsed = new HashMap<Integer, String>();
+ for (AlertCondition condition : this.conditions) {
+ if (condition.getMeasurementDefinition() != null) {
+ Integer id = Integer.valueOf(condition.getMeasurementDefinition().getId());
+ if (metricIdsUsed.containsKey(id)) {
+ String msg = MSG.view_alert_definition_condition_editor_metricswarning(metricIdsUsed.get(id));
+ Message warning = new Message(msg, Severity.Warning, EnumSet.of(Message.Option.Transient));
+ CoreGUI.getMessageCenter().notify(warning);
+ return false; // multiple conditions used the same metric with ALL conjunction, this doesn't work - abort (BZ 737565)
+ }
+ metricIdsUsed.put(id, condition.getMeasurementDefinition().getDisplayName());
+ }
+ }
+ }
+
final boolean calltimeCategory;
final AlertConditionCategory category;
@@ -413,6 +447,8 @@ public class NewConditionEditor extends LocatableDynamicForm {
}
this.conditions.add(newCondition);
+
+ return true;
}
private ArrayList<FormItem> buildMetricThresholdFormItems() {
@@ -424,18 +460,25 @@ public class NewConditionEditor extends LocatableDynamicForm {
StaticTextItem helpItem = buildHelpTextItem("thresholdHelp", helpStr, ifFunc);
formItems.add(helpItem);
- formItems.add(buildMetricDropDownMenu(THRESHOLD_METRIC_ITEMNAME, false, ifFunc));
- formItems.add(buildComparatorDropDownMenu(THRESHOLD_COMPARATOR_ITEMNAME, ifFunc));
- TextItem absoluteValue = new TextItem(THRESHOLD_ABSVALUE_ITEMNAME, MSG
- .view_alert_definition_condition_editor_metric_threshold_value());
- absoluteValue.setWrapTitle(false);
- absoluteValue.setRequired(true);
- absoluteValue.setTooltip(MSG.view_alert_definition_condition_editor_metric_threshold_value_tooltip());
- absoluteValue.setHoverWidth(200);
- absoluteValue.setValidateOnChange(true);
- absoluteValue.setValidators(new IsFloatValidator());
- absoluteValue.setShowIfCondition(ifFunc);
- formItems.add(absoluteValue);
+ SelectItem metricDropDownMenu = buildMetricDropDownMenu(THRESHOLD_METRIC_ITEMNAME, false, ifFunc);
+ if (metricDropDownMenu != null) {
+ formItems.add(metricDropDownMenu);
+ formItems.add(buildComparatorDropDownMenu(THRESHOLD_COMPARATOR_ITEMNAME, ifFunc));
+ TextItem absoluteValue = new TextItem(THRESHOLD_ABSVALUE_ITEMNAME, MSG
+ .view_alert_definition_condition_editor_metric_threshold_value());
+ absoluteValue.setWrapTitle(false);
+ absoluteValue.setRequired(true);
+ absoluteValue.setTooltip(MSG.view_alert_definition_condition_editor_metric_threshold_value_tooltip());
+ absoluteValue.setHoverWidth(200);
+ absoluteValue.setValidateOnChange(true);
+ absoluteValue.setValidators(new IsFloatValidator());
+ absoluteValue.setShowIfCondition(ifFunc);
+ formItems.add(absoluteValue);
+ } else {
+ String noMetricsStr = MSG.view_alert_definition_condition_editor_metric_nometrics();
+ StaticTextItem noMetrics = buildHelpTextItem(THRESHOLD_NO_METRICS_ITEMNAME, noMetricsStr, ifFunc);
+ formItems.add(noMetrics);
+ }
return formItems;
}
@@ -449,29 +492,36 @@ public class NewConditionEditor extends LocatableDynamicForm {
StaticTextItem helpItem = buildHelpTextItem("rangeHelp", helpStr, ifFunc);
formItems.add(helpItem);
- formItems.add(buildMetricDropDownMenu(RANGE_METRIC_ITEMNAME, false, ifFunc));
- formItems.add(buildRangeComparatorDropDownMenu(RANGE_COMPARATOR_ITEMNAME, ifFunc));
- TextItem absoluteLowValue = new TextItem(RANGE_LO_ABSVALUE_ITEMNAME, MSG
- .view_alert_definition_condition_editor_metric_range_lovalue());
- absoluteLowValue.setWrapTitle(false);
- absoluteLowValue.setRequired(true);
- absoluteLowValue.setTooltip(MSG.view_alert_definition_condition_editor_metric_range_lovalue_tooltip());
- absoluteLowValue.setHoverWidth(200);
- absoluteLowValue.setValidateOnChange(true);
- absoluteLowValue.setValidators(new IsFloatValidator());
- absoluteLowValue.setShowIfCondition(ifFunc);
- formItems.add(absoluteLowValue);
-
- TextItem absoluteHighValue = new TextItem(RANGE_HI_ABSVALUE_ITEMNAME, MSG
- .view_alert_definition_condition_editor_metric_range_hivalue());
- absoluteHighValue.setWrapTitle(false);
- absoluteHighValue.setRequired(true);
- absoluteHighValue.setTooltip(MSG.view_alert_definition_condition_editor_metric_range_hivalue_tooltip());
- absoluteHighValue.setHoverWidth(200);
- absoluteHighValue.setValidateOnChange(true);
- absoluteHighValue.setValidators(new IsFloatValidator());
- absoluteHighValue.setShowIfCondition(ifFunc);
- formItems.add(absoluteHighValue);
+ SelectItem metricDropDownMenu = buildMetricDropDownMenu(RANGE_METRIC_ITEMNAME, false, ifFunc);
+ if (metricDropDownMenu != null) {
+ formItems.add(metricDropDownMenu);
+ formItems.add(buildRangeComparatorDropDownMenu(RANGE_COMPARATOR_ITEMNAME, ifFunc));
+ TextItem absoluteLowValue = new TextItem(RANGE_LO_ABSVALUE_ITEMNAME, MSG
+ .view_alert_definition_condition_editor_metric_range_lovalue());
+ absoluteLowValue.setWrapTitle(false);
+ absoluteLowValue.setRequired(true);
+ absoluteLowValue.setTooltip(MSG.view_alert_definition_condition_editor_metric_range_lovalue_tooltip());
+ absoluteLowValue.setHoverWidth(200);
+ absoluteLowValue.setValidateOnChange(true);
+ absoluteLowValue.setValidators(new IsFloatValidator());
+ absoluteLowValue.setShowIfCondition(ifFunc);
+ formItems.add(absoluteLowValue);
+
+ TextItem absoluteHighValue = new TextItem(RANGE_HI_ABSVALUE_ITEMNAME, MSG
+ .view_alert_definition_condition_editor_metric_range_hivalue());
+ absoluteHighValue.setWrapTitle(false);
+ absoluteHighValue.setRequired(true);
+ absoluteHighValue.setTooltip(MSG.view_alert_definition_condition_editor_metric_range_hivalue_tooltip());
+ absoluteHighValue.setHoverWidth(200);
+ absoluteHighValue.setValidateOnChange(true);
+ absoluteHighValue.setValidators(new IsFloatValidator());
+ absoluteHighValue.setShowIfCondition(ifFunc);
+ formItems.add(absoluteHighValue);
+ } else {
+ String noMetricsStr = MSG.view_alert_definition_condition_editor_metric_nometrics();
+ StaticTextItem noMetrics = buildHelpTextItem(RANGE_NO_METRICS_ITEMNAME, noMetricsStr, ifFunc);
+ formItems.add(noMetrics);
+ }
return formItems;
}
@@ -486,33 +536,41 @@ public class NewConditionEditor extends LocatableDynamicForm {
formItems.add(helpItem);
// if a metric is trending (up or down), it will never have baselines calculated for it so only show dynamic metrics
- formItems.add(buildMetricDropDownMenu(BASELINE_METRIC_ITEMNAME, true, ifFunc));
- formItems.add(buildComparatorDropDownMenu(BASELINE_COMPARATOR_ITEMNAME, ifFunc));
-
- TextItem baselinePercentage = new TextItem(BASELINE_PERCENTAGE_ITEMNAME, MSG
- .view_alert_definition_condition_editor_metric_baseline_percentage());
- baselinePercentage.setWrapTitle(false);
- baselinePercentage.setRequired(true);
- baselinePercentage.setTooltip(MSG.view_alert_definition_condition_editor_metric_baseline_percentage_tooltip());
- baselinePercentage.setHoverWidth(200);
- baselinePercentage.setShowIfCondition(ifFunc);
- baselinePercentage.setValidateOnChange(true);
- baselinePercentage.setValidators(new IsFloatValidator());
- formItems.add(baselinePercentage);
-
- SelectItem baselineSelection = new SelectItem(BASELINE_SELECTION_ITEMNAME, MSG
- .view_alert_definition_condition_editor_metric_baseline_value());
- LinkedHashMap<String, String> baselines = new LinkedHashMap<String, String>(3);
- baselines.put("min", MSG.view_alert_definition_condition_editor_common_min()); // TODO can we have the current value of the min baseline
- baselines.put("mean", MSG.view_alert_definition_condition_editor_common_avg()); // TODO can we have the current value of the avg baseline
- baselines.put("max", MSG.view_alert_definition_condition_editor_common_max()); // TODO can we have the current value of the max baseline
- baselineSelection.setValueMap(baselines);
- baselineSelection.setDefaultValue("mean");
- baselineSelection.setWrapTitle(false);
- baselineSelection.setWidth("*");
- baselineSelection.setRedrawOnChange(true);
- baselineSelection.setShowIfCondition(ifFunc);
- formItems.add(baselineSelection);
+ SelectItem metricDropDownMenu = buildMetricDropDownMenu(BASELINE_METRIC_ITEMNAME, true, ifFunc);
+ if (metricDropDownMenu != null) {
+ formItems.add(metricDropDownMenu);
+ formItems.add(buildComparatorDropDownMenu(BASELINE_COMPARATOR_ITEMNAME, ifFunc));
+
+ TextItem baselinePercentage = new TextItem(BASELINE_PERCENTAGE_ITEMNAME, MSG
+ .view_alert_definition_condition_editor_metric_baseline_percentage());
+ baselinePercentage.setWrapTitle(false);
+ baselinePercentage.setRequired(true);
+ baselinePercentage.setTooltip(MSG
+ .view_alert_definition_condition_editor_metric_baseline_percentage_tooltip());
+ baselinePercentage.setHoverWidth(200);
+ baselinePercentage.setShowIfCondition(ifFunc);
+ baselinePercentage.setValidateOnChange(true);
+ baselinePercentage.setValidators(new IsFloatValidator());
+ formItems.add(baselinePercentage);
+
+ SelectItem baselineSelection = new SelectItem(BASELINE_SELECTION_ITEMNAME, MSG
+ .view_alert_definition_condition_editor_metric_baseline_value());
+ LinkedHashMap<String, String> baselines = new LinkedHashMap<String, String>(3);
+ baselines.put("min", MSG.view_alert_definition_condition_editor_common_min()); // TODO can we have the current value of the min baseline
+ baselines.put("mean", MSG.view_alert_definition_condition_editor_common_avg()); // TODO can we have the current value of the avg baseline
+ baselines.put("max", MSG.view_alert_definition_condition_editor_common_max()); // TODO can we have the current value of the max baseline
+ baselineSelection.setValueMap(baselines);
+ baselineSelection.setDefaultValue("mean");
+ baselineSelection.setWrapTitle(false);
+ baselineSelection.setWidth("*");
+ baselineSelection.setRedrawOnChange(true);
+ baselineSelection.setShowIfCondition(ifFunc);
+ formItems.add(baselineSelection);
+ } else {
+ String noMetricsStr = MSG.view_alert_definition_condition_editor_metric_nometrics();
+ StaticTextItem noMetrics = buildHelpTextItem(BASELINE_NO_METRICS_ITEMNAME, noMetricsStr, ifFunc);
+ formItems.add(noMetrics);
+ }
return formItems;
}
@@ -526,7 +584,14 @@ public class NewConditionEditor extends LocatableDynamicForm {
StaticTextItem helpItem = buildHelpTextItem("changeMetricHelp", helpStr, ifFunc);
formItems.add(helpItem);
- formItems.add(buildMetricDropDownMenu(CHANGE_METRIC_ITEMNAME, false, ifFunc));
+ SelectItem metricDropDownMenu = buildMetricDropDownMenu(CHANGE_METRIC_ITEMNAME, false, ifFunc);
+ if (metricDropDownMenu != null) {
+ formItems.add(metricDropDownMenu);
+ } else {
+ String noMetricsStr = MSG.view_alert_definition_condition_editor_metric_nometrics();
+ StaticTextItem noMetrics = buildHelpTextItem(CHANGE_NO_METRICS_ITEMNAME, noMetricsStr, ifFunc);
+ formItems.add(noMetrics);
+ }
return formItems;
}
@@ -808,6 +873,16 @@ public class NewConditionEditor extends LocatableDynamicForm {
private SelectItem buildMetricDropDownMenu(String itemName, boolean dynamicOnly, FormItemIfFunction ifFunc) {
+ // find out if this is the ALL - if it is, we can't have more than one conditional use the same metric (BZ 737565)
+ Set<String> metricIdsToHide = new HashSet<String>();
+ if (BooleanExpression.ALL.name().equals(this.conditionExpression.getValue().toString())) {
+ for (AlertCondition condition : this.conditions) {
+ if (condition.getMeasurementDefinition() != null) {
+ metricIdsToHide.add(String.valueOf(condition.getMeasurementDefinition().getId()));
+ }
+ }
+ }
+
LinkedHashMap<String, String> metricsMap = new LinkedHashMap<String, String>();
TreeSet<MeasurementDefinition> sortedDefs = new TreeSet<MeasurementDefinition>(
new Comparator<MeasurementDefinition>() {
@@ -822,12 +897,18 @@ public class NewConditionEditor extends LocatableDynamicForm {
for (MeasurementDefinition def : sortedDefs) {
if (def.getDataType() == DataType.MEASUREMENT) {
if (!dynamicOnly || def.getNumericType() == NumericType.DYNAMIC) {
- // use id as opposed to name for key, the name is not unique when per-minute metric is also used
- metricsMap.put(String.valueOf(def.getId()), def.getDisplayName());
+ String idString = String.valueOf(def.getId()); // use id, not name, for key; name is not unique when per-minute metric is also used
+ if (!metricIdsToHide.contains(idString)) {
+ metricsMap.put(idString, def.getDisplayName());
+ }
}
}
}
+ if (metricsMap.isEmpty()) {
+ return null; // all metrics should be hidden
+ }
+
SelectItem metricSelection = new SelectItem(itemName, MSG
.view_alert_definition_condition_editor_metric_threshold_name());
metricSelection.setValueMap(metricsMap);
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index 8a70316..8a14fb6 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -710,6 +710,7 @@ view_alert_definition_condition_editor_metric_calltime_threshold_value = Call Ti
view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
view_alert_definition_condition_editor_metric_change_tooltip = Specify the metric whose value must change to trigger the condition.
view_alert_definition_condition_editor_metric_common_definition_not_found = Should have found metric definition - something is wrong
+view_alert_definition_condition_editor_metric_nometrics = When using the ALL conjunction, you cannot use the same metric in multiple conditions and this alert uses all available metrics in currently existing conditions.
view_alert_definition_condition_editor_metric_range_comparator = Comparator
view_alert_definition_condition_editor_metric_range_comparator_inside_exclusive = Inside, exclusive
view_alert_definition_condition_editor_metric_range_comparator_inside_inclusive = Inside, inclusive
@@ -732,6 +733,7 @@ view_alert_definition_condition_editor_metric_threshold_value = Metric Value
view_alert_definition_condition_editor_metric_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
view_alert_definition_condition_editor_metric_trait_change_tooltip = Specify the trait whose value must change to trigger the condition.
view_alert_definition_condition_editor_metric_trait_change_value = Trait
+view_alert_definition_condition_editor_metricswarning = You cannot have multiple conditions that use the same metric when using the ALL conjunction. This alert definition has multiple conditions that use the metric [{0}].
view_alert_definition_condition_editor_operation_status = Operation Status
view_alert_definition_condition_editor_operation_status_canceled = Canceled
view_alert_definition_condition_editor_operation_status_failure = Failure
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
index a952137..a396be5 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
@@ -587,6 +587,7 @@ view_alert_definition_condition_editor_metric_calltime_threshold_value = Call Ti
view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.~
view_alert_definition_condition_editor_metric_change_tooltip = Specify the metric whose value must change to trigger the condition.~
view_alert_definition_condition_editor_metric_common_definition_not_found = Should have found metric definition - something is wrong~
+##view_alert_definition_condition_editor_metric_nometrics = When using the ALL conjunction, you cannot use the same metric in multiple conditions and this alert uses all available metrics in currently existing conditions.
view_alert_definition_condition_editor_metric_range_comparator = Komparator
##view_alert_definition_condition_editor_metric_range_comparator_inside_exclusive = Inside, exclusive
##view_alert_definition_condition_editor_metric_range_comparator_inside_inclusive = Inside, inclusive
@@ -609,6 +610,7 @@ view_alert_definition_condition_editor_metric_threshold_value = Wert der Metrik
view_alert_definition_condition_editor_metric_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.~
view_alert_definition_condition_editor_metric_trait_change_tooltip = Specify the trait whose value must change to trigger the condition.~
view_alert_definition_condition_editor_metric_trait_change_value = Trait~
+##view_alert_definition_condition_editor_metricswarning = You cannot have multiple conditions that use the same metric when using the ALL conjunction. This alert definition has multiple conditions that use the metric [{0}].
view_alert_definition_condition_editor_operation_status = Zustand der Operation
view_alert_definition_condition_editor_operation_status_canceled = Abgebrochen
view_alert_definition_condition_editor_operation_status_failure = Fehler
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
index f323fbc..6f6bb97 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
@@ -705,6 +705,7 @@ view_alert_definition_condition_editor_metric_calltime_threshold_value = åŒã³
view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = éžæãããæ¯èŒå(comparator)ã䜿ã£ãŠæ¯èŒãããšãæ¡ä»¶ãåŒãèµ·ããããã¡ããªãã¯ã®éŸå€
view_alert_definition_condition_editor_metric_change_tooltip = æ¡ä»¶ãåŒãèµ·ããããã«å€æŽããªããã°ãªããªãå€ãæã€ã¡ããªãã¯ãæå®ããŸã
view_alert_definition_condition_editor_metric_common_definition_not_found = ã¡ããªãã¯å®çŸ©ãèŠã€ããã¹ãã§ã - äœããããããã§ã
+##view_alert_definition_condition_editor_metric_nometrics = When using the ALL conjunction, you cannot use the same metric in multiple conditions and this alert uses all available metrics in currently existing conditions.
view_alert_definition_condition_editor_metric_range_comparator = ã³ã³ãã¬ãŒã¿
##view_alert_definition_condition_editor_metric_range_comparator_inside_exclusive = Inside, exclusive
##view_alert_definition_condition_editor_metric_range_comparator_inside_inclusive = Inside, inclusive
@@ -727,6 +728,7 @@ view_alert_definition_condition_editor_metric_threshold_value = ã¡ããªãã¯
view_alert_definition_condition_editor_metric_threshold_value_tooltip = ã¡ããªãã¯ã®éŸå€ã¯ãéžæãããã³ã³ãã¬ãŒã¿ã䜿ã£ãŠæ¯èŒããããšãã®æ¡ä»¶ã®ããªã¬ãŒã«ãªããŸã
view_alert_definition_condition_editor_metric_trait_change_tooltip = æ¡ä»¶ãåŒãèµ·ããããã«å€æŽããªããã°ãªããªãå€ãæã€ãã¬ã€ãšãæå®ããŸã
view_alert_definition_condition_editor_metric_trait_change_value = ãã¬ã€ã
+##view_alert_definition_condition_editor_metricswarning = You cannot have multiple conditions that use the same metric when using the ALL conjunction. This alert definition has multiple conditions that use the metric [{0}].
view_alert_definition_condition_editor_operation_status = ãªãã¬ãŒã·ã§ã³ã¹ããŒã¿ã¹
view_alert_definition_condition_editor_operation_status_canceled = ãã£ã³ã»ã«æž
view_alert_definition_condition_editor_operation_status_failure = 倱æ
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
index b16ca87..f3427bb 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
@@ -723,6 +723,7 @@ view_alert_definition_condition_editor_metric_calltime_threshold_value = Valor d
view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = O valor do limiar (<i>threshold</i>) da m\u00E9trica usado para disparar a condi\u00E7\u00E3o quando comparado ao mecanismo de compara\u00E7\u00E3o escolhido.
view_alert_definition_condition_editor_metric_change_tooltip = Especifica a m\u00E9trica cujo valor deve ser alterado para disparar a condi\u00E7\u00E3o.
view_alert_definition_condition_editor_metric_common_definition_not_found = Deve existir uma defini\u00E7\u00E3o para a m\u00E9trica - algo est\u00E1 incorreto
+##view_alert_definition_condition_editor_metric_nometrics = When using the ALL conjunction, you cannot use the same metric in multiple conditions and this alert uses all available metrics in currently existing conditions.
view_alert_definition_condition_editor_metric_range_comparator = Mecanismo de Compara\u00E7\u00E3o
##view_alert_definition_condition_editor_metric_range_comparator_inside_exclusive = Inside, exclusive
##view_alert_definition_condition_editor_metric_range_comparator_inside_inclusive = Inside, inclusive
@@ -745,6 +746,7 @@ view_alert_definition_condition_editor_metric_threshold_value = Valor da M\u00E9
view_alert_definition_condition_editor_metric_threshold_value_tooltip = Limiar (threshold) da m\u00E9trica utilizado na compara\u00E7\u00E3o como condi\u00E7\u00E3o de disparo.
view_alert_definition_condition_editor_metric_trait_change_tooltip = Specify the trait whose value must change to trigger the condition.
view_alert_definition_condition_editor_metric_trait_change_value = Caracter\u00EDstica
+##view_alert_definition_condition_editor_metricswarning = You cannot have multiple conditions that use the same metric when using the ALL conjunction. This alert definition has multiple conditions that use the metric [{0}].
view_alert_definition_condition_editor_operation_status = Status da Opera\u00E7\u00E3o
view_alert_definition_condition_editor_operation_status_canceled = Cancelada
view_alert_definition_condition_editor_operation_status_failure = Falha
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
index 48ca5db..c0b06b3 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
@@ -704,6 +704,7 @@ view_alert_definition_condition_editor_metric_calltime_threshold_value = Call Ti
view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
view_alert_definition_condition_editor_metric_change_tooltip = Specify the metric whose value must change to trigger the condition.
view_alert_definition_condition_editor_metric_common_definition_not_found = Should have found metric definition - something is wrong
+##view_alert_definition_condition_editor_metric_nometrics = When using the ALL conjunction, you cannot use the same metric in multiple conditions and this alert uses all available metrics in currently existing conditions.
view_alert_definition_condition_editor_metric_range_comparator = \u6bd4\u8f83
##view_alert_definition_condition_editor_metric_range_comparator_inside_exclusive = Inside, exclusive
##view_alert_definition_condition_editor_metric_range_comparator_inside_inclusive = Inside, inclusive
@@ -726,6 +727,7 @@ view_alert_definition_condition_editor_metric_threshold_value = \u6307\u6807\u50
view_alert_definition_condition_editor_metric_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
view_alert_definition_condition_editor_metric_trait_change_tooltip = Specify the trait whose value must change to trigger the condition.
view_alert_definition_condition_editor_metric_trait_change_value = \u7279\u5f81
+##view_alert_definition_condition_editor_metricswarning = You cannot have multiple conditions that use the same metric when using the ALL conjunction. This alert definition has multiple conditions that use the metric [{0}].
view_alert_definition_condition_editor_operation_status = \u64cd\u4f5c\u72b6\u6001
view_alert_definition_condition_editor_operation_status_canceled = Canceled
view_alert_definition_condition_editor_operation_status_failure = Failure
commit 1309b991da2ed95d13bf098252dd7284733fd5a5
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Tue Sep 13 08:54:33 2011 -0400
BZ:733019: changed i)plugin display name to be more consistent with AS4 and AS5
ii)renamed HostController to better show relevance to AS7 inleft navigation tree.
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index 67edbff..abd6fe3 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -42,7 +42,7 @@
]>
<plugin name="jboss-as-7"
- displayName="JBoss-AS-7-Plugin"
+ displayName="JBoss Application Server 7.x"
description="Management of JBossAS 7"
package="org.rhq.modules.plugins.jbossas7"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@@ -75,7 +75,7 @@
</server>
-->
- <server name="HostController"
+ <server name="JBossAS7 Host Controller"
discovery="BaseProcessDiscovery"
class="HostControllerComponent"
description="Domain controller (delegate) for this host"
@@ -1903,7 +1903,7 @@ working area for individual server instances</li></ul>"/>
description="A named network interface, along with required criteria for determining the IP address to associate with that interface">
<runs-inside>
- <parent-resource-type name="HostController" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7 Host Controller" plugin="jboss-as-7"/>
<parent-resource-type name="Host" plugin="jboss-as-7"/>
<parent-resource-type name="JBossAS7-Standalone" plugin="jboss-as-7"/>
</runs-inside>
@@ -1960,7 +1960,7 @@ working area for individual server instances</li></ul>"/>
class="BaseComponent"
>
<runs-inside>
- <parent-resource-type name="HostController" plugin="jboss-as-7"/>
+ <parent-resource-type name="JBossAS7 Host Controller" plugin="jboss-as-7"/>
</runs-inside>
diff --git a/modules/plugins/jboss-as-7/src/test/resources/test-plugin.xml b/modules/plugins/jboss-as-7/src/test/resources/test-plugin.xml
index 42ff024..69201e2 100644
--- a/modules/plugins/jboss-as-7/src/test/resources/test-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/test/resources/test-plugin.xml
@@ -1,5 +1,5 @@
<plugin name="jboss-as-7"
- displayName="JBoss-AS-7-Plugin"
+ displayName="JBoss Application Server 7.x"
description="Management of JBossAS 7"
package="org.rhq.modules.plugins.jbossas7"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
commit b9d4b38efd10a9d0bd2bc9790ceffe1fcb98dce5
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Mon Sep 12 14:28:13 2011 -0400
inserting missing profile. Make sure release number gets included in
artifacts in brew builds.
diff --git a/pom.xml b/pom.xml
index ab342f5..a023da4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1126,14 +1126,16 @@
</profile>
<!-- These plugins i)need to be active by default
- ii)need to be in a profile so that deactivation is possible for brew builds -->
+ ii)need to be in a profile so that deactivation is possible for brew builds
+
+ Profile activation for 'build-properties' and 'brew-generate-build-number' need to be mutually exclusive.
+ -->
<profile>
<id>build-properties</id>
<activation>
<file>
<exists>.git</exists>
</file>
-
</activation>
<build>
<plugins>
@@ -1210,6 +1212,78 @@
</plugins>
</build>
</profile>
+
+ <!-- Profile activated when -Dbrew=true passed in. Profile activation for 'build-properties' and 'brew-generate-build-number'
+ need to be mutually exclusive. -->
+ <profile>
+ <id>brew-generate-build-number</id>
+ <activation>
+ <property>
+ <name>brew</name>
+ </property>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>write-build-properties-file</id>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <phase>generate-sources</phase>
+ <configuration>
+ <tasks>
+ <tstamp>
+ <format property="buildTime" pattern="MM/dd/yy hh:mm aa z" locale="en,US"
+ timezone="GMT"/>
+ </tstamp>
+ <mkdir dir="target"/>
+ <echo file="target/build-time.properties" level="error">buildTime = ${maven.build.timestamp}</echo>
+ <echo file="target/build-number.properties" level="error">buildNumber = ${rhq.build.number}</echo>
+ </tasks>
+ </configuration>
+ </execution>
+
+ <execution>
+ <id>echo-build-properties</id>
+ <phase>compile</phase>
+ <inherited>false</inherited>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <tasks>
+ <echo level="debug">buildTime = ${maven.build.timestamp}</echo>
+ <echo level="debug">buildNumber = ${rhq.build.number}</echo>
+ </tasks>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>properties-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>read-build-properties</id>
+ <phase>process-sources</phase>
+ <goals>
+ <goal>read-project-properties</goal>
+ </goals>
+ <configuration>
+ <files>
+ <file>${project.build.directory}/build-time.properties</file>
+ <file>${project.build.directory}/build-number.properties</file>
+ </files>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
</profiles>
commit 967a430d0570014a2cb46c66471e89d13f199610
Author: John Sanda <jsanda(a)redhat.com>
Date: Mon Sep 12 11:03:44 2011 -0400
Fix test failure
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
index 1b807c1..8ec8ad7 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
@@ -94,6 +94,7 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
@Override
public void initialize() {
+ changeSetsDir.mkdir();
changeSetMgr = new ChangeSetManagerImpl(changeSetsDir);
DriftDetector driftDetector = new DriftDetector();
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/PluginContainerTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/PluginContainerTest.java
index 6c5cb3a..23a256c 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/PluginContainerTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/PluginContainerTest.java
@@ -33,7 +33,11 @@ public class PluginContainerTest {
public void testStartup() {
PluginContainerConfiguration config = new PluginContainerConfiguration();
config.setPluginFinder(new FileSystemPluginFinder(new File(".")));
- config.setDataDirectory(new File("target/PluginContainerTest"));
+
+ File dataDir = new File("target/PluginContainerTest");
+ dataDir.mkdirs();
+
+ config.setDataDirectory(dataDir);
PluginContainer pc = PluginContainer.getInstance();
pc.setConfiguration(config);
pc.initialize();
commit 77e6e81a6040677a108ae86dd57f953743c7ea50
Merge: 647831b 70a43d5
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Sep 12 10:02:04 2011 -0400
Merge commit 'origin/master' into drift
commit 647831b3d10c74b786326efbbcb7ba5ee204ef20
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Sep 9 15:51:36 2011 -0400
Detect deleted drift configs during inventory sync
This commit adds support for detecting deleted drift configs during
inventory sync. when a deleted config is detected, the change set
directory is purged.
This commit also adds supports for handling renamed configs which may be
a common scenario. Suppose for example I create a config with a set of
filters. After some drift detection, I realize the filters are not what
I want. The agent goes down, I delete the config, create a new one with
the same name but with different filters. The agent properly detects
that the original config was deleted, purges the change set directory,
and treats the new config as such, i.e., new.
The code in this commit and in the previous one are bit rough and need
some refactoring and unit tests. That is coming next...
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
index 37886f0..1b807c1 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
@@ -38,9 +38,11 @@ import org.rhq.common.drift.ChangeSetWriter;
import org.rhq.common.drift.Headers;
import org.rhq.core.clientapi.agent.drift.DriftAgentService;
import org.rhq.core.clientapi.server.drift.DriftServerService;
+import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.drift.Drift;
import org.rhq.core.domain.drift.DriftChangeSetCategory;
import org.rhq.core.domain.drift.DriftConfiguration;
+import org.rhq.core.domain.drift.DriftConfigurationComparator;
import org.rhq.core.domain.drift.DriftFile;
import org.rhq.core.domain.drift.DriftSnapshot;
import org.rhq.core.domain.resource.Resource;
@@ -56,6 +58,7 @@ import org.rhq.core.util.stream.StreamUtil;
import static org.rhq.common.drift.FileEntry.addedFileEntry;
import static org.rhq.common.drift.FileEntry.changedFileEntry;
import static org.rhq.common.drift.FileEntry.removedFileEntry;
+import static org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS;
import static org.rhq.core.util.file.FileUtil.purge;
public class DriftManager extends AgentService implements DriftAgentService, DriftClient, ContainerService {
@@ -72,6 +75,8 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
private ChangeSetManager changeSetMgr;
+ private boolean initialized;
+
public DriftManager() {
super(DriftAgentService.class);
}
@@ -83,6 +88,10 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
changeSetsDir.mkdir();
}
+ public boolean isInitialized() {
+ return initialized;
+ }
+
@Override
public void initialize() {
changeSetMgr = new ChangeSetManagerImpl(changeSetsDir);
@@ -96,9 +105,10 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
long startTime = System.currentTimeMillis();
initSchedules(inventoryMgr.getPlatform(), inventoryMgr);
long endTime = System.currentTimeMillis();
-
log.info("Finished initializing drift detection schedules in " + (endTime - startTime) + " ms");
+ purgeDeletedDriftConfigDirs();
+
driftThreadPool = new ScheduledThreadPoolExecutor(5);
long initialDelay = pluginContainerConfiguration.getDriftDetectionInitialDelay();
@@ -109,6 +119,8 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
} else {
log.info("Drift detection has been globally disabled as per plugin container configuration");
}
+
+ initialized = true;
}
private void initSchedules(Resource r, InventoryManager inventoryMgr) {
@@ -165,6 +177,25 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
}
}
+ private void purgeDeletedDriftConfigDirs() {
+ log.info("Checking for deleted drift configurations");
+ DriftConfigurationComparator comparator = new DriftConfigurationComparator(
+ BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS);
+ for (File resourceDir : changeSetsDir.listFiles()) {
+ int resourceId = Integer.parseInt(resourceDir.getName());
+ for (File configDir : resourceDir.listFiles()) {
+ DriftConfiguration config = new DriftConfiguration(new Configuration());
+ config.setName(configDir.getName());
+ if (!schedulesQueue.contains(resourceId, config, comparator)) {
+ log.info("Detected deleted drift configuration, DriftConfiguration[name: " + config.getName() +
+ ", resourceId: " + resourceId + "]");
+ log.info("Deleting drift configuration directory " + configDir.getPath());
+ purge(configDir, true);
+ }
+ }
+ }
+ }
+
private String toString(Resource r, DriftConfiguration c) {
return "DriftConfiguration[id: " + c.getId() + ", resourceId: " + r.getId() + ", name: " + c.getName() + "]";
}
@@ -192,7 +223,7 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
* This method is provided as a test hook.
* @return The schedule queue
*/
- ScheduleQueue getSchedulesQueue() {
+ public ScheduleQueue getSchedulesQueue() {
return schedulesQueue;
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ScheduleQueue.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ScheduleQueue.java
index 36fc081..a453f74 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ScheduleQueue.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ScheduleQueue.java
@@ -1,6 +1,7 @@
package org.rhq.core.pc.drift;
import org.rhq.core.domain.drift.DriftConfiguration;
+import org.rhq.core.domain.drift.DriftConfigurationComparator;
/**
* Manages the drift detection schedules that are processed by the drift detector. The
@@ -13,6 +14,8 @@ import org.rhq.core.domain.drift.DriftConfiguration;
*/
public interface ScheduleQueue {
+ DriftDetectionSchedule[] toArray();
+
/**
* Removes the head of the queue and returns a copy of the schedule that was removed.
* That schedule is also marked as the active schedule.
@@ -53,6 +56,8 @@ public interface ScheduleQueue {
*/
boolean contains(int resourceId, DriftConfiguration config);
+ boolean contains(int resourceId, DriftConfiguration config, DriftConfigurationComparator comparator);
+
/**
* This method attempts to update the schedule identified by the resource id the and
* the drift configuration. More specifically, the schedule is identified by a
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ScheduleQueueImpl.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ScheduleQueueImpl.java
index 003868d..dc02b40 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ScheduleQueueImpl.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ScheduleQueueImpl.java
@@ -5,6 +5,7 @@ import java.util.PriorityQueue;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.rhq.core.domain.drift.DriftConfiguration;
+import org.rhq.core.domain.drift.DriftConfigurationComparator;
public class ScheduleQueueImpl implements ScheduleQueue {
@@ -45,7 +46,17 @@ public class ScheduleQueueImpl implements ScheduleQueue {
} finally {
lock.readLock().unlock();
}
+ }
+ private boolean isActiveSchedule(int resourceId, DriftConfiguration config,
+ DriftConfigurationComparator comparator) {
+ try {
+ lock.readLock().lock();
+ return activeSchedule != null && activeSchedule.getResourceId() == resourceId
+ && comparator.compare(activeSchedule.getDriftConfiguration(), config) == 0;
+ } finally {
+ lock.readLock().unlock();
+ }
}
@Override
@@ -82,8 +93,8 @@ public class ScheduleQueueImpl implements ScheduleQueue {
@Override
public boolean contains(int resourceId, DriftConfiguration config) {
if (isActiveSchedule(resourceId, config)) {
- return true;
- }
+ return true;
+ }
try {
lock.readLock().lock();
for (DriftDetectionSchedule schedule : queue) {
@@ -99,6 +110,25 @@ public class ScheduleQueueImpl implements ScheduleQueue {
}
@Override
+ public boolean contains(int resourceId, DriftConfiguration config, DriftConfigurationComparator comparator) {
+ if (isActiveSchedule(resourceId, config, comparator)) {
+ return true;
+ }
+ try {
+ lock.readLock().lock();
+ for (DriftDetectionSchedule schedule : queue) {
+ if (schedule.getResourceId() == resourceId &&
+ comparator.compare(schedule.getDriftConfiguration(), config) == 0) {
+ return true;
+ }
+ }
+ return false;
+ } finally {
+ lock.readLock().unlock();
+ }
+ }
+
+ @Override
public DriftDetectionSchedule remove(int resourceId, DriftConfiguration config) {
return removeAndExecute(resourceId, config, NO_OP);
}
@@ -187,4 +217,14 @@ public class ScheduleQueueImpl implements ScheduleQueue {
lock.readLock().unlock();
}
}
+
+ @Override
+ public DriftDetectionSchedule[] toArray() {
+ try {
+ lock.readLock().lock();
+ return queue.toArray(new DriftDetectionSchedule[queue.size()]);
+ } finally {
+ lock.readLock().unlock();
+ }
+ }
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
index c503e92..6f6b747 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
@@ -36,6 +36,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.TreeSet;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
@@ -66,6 +67,7 @@ import org.rhq.core.domain.discovery.AvailabilityReport;
import org.rhq.core.domain.discovery.MergeResourceResponse;
import org.rhq.core.domain.discovery.ResourceSyncInfo;
import org.rhq.core.domain.drift.DriftConfiguration;
+import org.rhq.core.domain.drift.DriftConfigurationComparator;
import org.rhq.core.domain.measurement.Availability;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.ResourceMeasurementScheduleRequest;
@@ -86,7 +88,9 @@ import org.rhq.core.pc.agent.AgentRegistrar;
import org.rhq.core.pc.agent.AgentService;
import org.rhq.core.pc.availability.AvailabilityCollectorThreadPool;
import org.rhq.core.pc.content.ContentContextImpl;
+import org.rhq.core.pc.drift.DriftDetectionSchedule;
import org.rhq.core.pc.drift.DriftManager;
+import org.rhq.core.pc.drift.ScheduleQueue;
import org.rhq.core.pc.event.EventContextImpl;
import org.rhq.core.pc.inventory.ResourceContainer.ResourceComponentState;
import org.rhq.core.pc.operation.OperationContextImpl;
@@ -119,6 +123,8 @@ import org.rhq.core.system.SystemInfoFactory;
import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.core.util.exception.WrappedRemotingException;
+import static org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS;
+
/**
* Manages the process of both auto-detection of servers and runtime detection of services across all plugins. Manages
* their scheduling and result sending as well as the general inventory model.
@@ -2120,17 +2126,75 @@ public class InventoryManager extends AgentService implements ContainerService,
private void installDriftConfigurations(Map<Integer, List<DriftConfiguration>> driftConfigurations) {
DriftManager driftMgr = PluginContainer.getInstance().getDriftManager();
- if (driftMgr != null) {
+ if (driftMgr != null && driftMgr.isInitialized()) {
+ // First check for drift configurations that have been deleted
+ for (Integer resourceId : driftConfigurations.keySet()) {
+ Set<DriftConfiguration> resourceConfigs = new TreeSet<DriftConfiguration>(
+ new DriftConfigurationComparator(BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS));
+ resourceConfigs.addAll(driftConfigurations.get(resourceId));
+
+ List<DriftConfiguration> deleted = new ArrayList<DriftConfiguration>();
+ ScheduleQueue queue = driftMgr.getSchedulesQueue();
+
+ for (DriftDetectionSchedule schedule : queue.toArray()) {
+ if (!resourceConfigs.contains(schedule.getDriftConfiguration())) {
+ if (log.isDebugEnabled()) {
+ log.debug("Detected stale drift configuration. Preparing to unschedule " + schedule);
+ }
+ deleted.add(schedule.getDriftConfiguration());
+ }
+ }
+ for (DriftConfiguration c : deleted) {
+ driftMgr.unscheduleDriftDetection(resourceId, c);
+ }
+ }
+
+ // add drift configurations received from the server. These could be
+ // new or updated configurations.
for (Integer resourceId : driftConfigurations.keySet()) {
for (DriftConfiguration c : driftConfigurations.get(resourceId)) {
+ driftMgr.unscheduleDriftDetection(resourceId, c);
driftMgr.scheduleDriftDetection(resourceId, c);
}
}
} else {
log.info("DriftManager is not available. Drift configurations will be persisted but not scheduled.");
+
+ // First check for drift configurations that have been deleted
+ log.debug("Checking for stale drift configurations that need to be purged from inventory");
+ for (Integer resourceId : driftConfigurations.keySet()) {
+ ResourceContainer container = getResourceContainer(resourceId);
+ Set<DriftConfiguration> resourceConfigs = new TreeSet<DriftConfiguration>(
+ new DriftConfigurationComparator(BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS));
+ resourceConfigs.addAll(driftConfigurations.get(resourceId));
+
+ List<DriftConfiguration> deleted = new ArrayList<DriftConfiguration>();
+
+ for (DriftConfiguration c : container.getDriftConfigurations()) {
+ if (!resourceConfigs.contains(c)) {
+ if (log.isDebugEnabled()) {
+ log.debug("Detected stale drift configuration. Preparing to delete DriftConfiguration[" +
+ "name: " + c.getName() + ", resourceId: " + resourceId + "]");
+ }
+ deleted.add(c);
+ }
+ }
+
+ for (DriftConfiguration c : deleted) {
+ container.removeDriftConfiguration(c);
+ }
+ }
+
+ // Now add any any drift configurations received from the server. These
+ // could be new or updated configurations.
+ log.debug("Checking for new or updated drift configurations");
for (Integer resourceId : driftConfigurations.keySet()) {
ResourceContainer container = getResourceContainer(resourceId);
for (DriftConfiguration c : driftConfigurations.get(resourceId)) {
+ if (log.isDebugEnabled()) {
+ log.debug("Adding or updating DriftConfiguration[name: " + c.getName() + ", resourceId: " +
+ resourceId + "]");
+ }
container.addDriftConfiguration(c);
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
index c5e4a76..d848e1b 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
@@ -300,6 +300,7 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
@Override
public void deleteResourceDriftConfiguration(Subject subject, int resourceId, int driftConfigId) {
DriftConfiguration doomed = entityManager.getReference(DriftConfiguration.class, driftConfigId);
+ doomed.getResource().setAgentSynchronizationNeeded();
entityManager.remove(doomed);
return;
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftServerServiceImpl.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftServerServiceImpl.java
index 39330a2..16dd477 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftServerServiceImpl.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftServerServiceImpl.java
@@ -69,11 +69,11 @@ public class DriftServerServiceImpl implements DriftServerService {
PageList<DriftConfiguration> configs = getDriftManager().findDriftConfigurationsByCriteria(overlord, criteria);
Map<Integer, List<DriftConfiguration>> map = new HashMap<Integer, List<DriftConfiguration>>();
+ for (Integer resourceId : resourceIds) {
+ map.put(resourceId, new ArrayList<DriftConfiguration>());
+ }
for (DriftConfiguration c : configs) {
List<DriftConfiguration> list = map.get(c.getResource().getId());
- if (list == null) {
- list = new ArrayList<DriftConfiguration>();
- }
list.add(c);
map.put(c.getResource().getId(), list);
}
commit eb1e96f868c37a49fc2473e24e9e3d29905617e2
Author: John Sanda <jsanda(a)redhat.com>
Date: Thu Sep 8 20:41:24 2011 -0400
Adding support for syncing drift configs when agent starts with --cleanconfig
When the agent starts with --cleanconfig or --purgedata, everything
under <AGENT_HOME>/data is deleted including the inventory.dat file and
any change set files. During inventory sync and at start the agent syncs
drift configurations with the server. If snapshot files are missing, the
agent fetches them from the server and writes them out to disk so that
it can resume drift detection.
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/drift/DriftServerService.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/drift/DriftServerService.java
index f1314a3..1fe4df2 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/drift/DriftServerService.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/drift/DriftServerService.java
@@ -20,8 +20,13 @@
package org.rhq.core.clientapi.server.drift;
import java.io.InputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
import org.rhq.core.communications.command.annotation.Asynchronous;
+import org.rhq.core.domain.drift.DriftConfiguration;
+import org.rhq.core.domain.drift.DriftSnapshot;
/**
* @author Jay Shaughnessy
@@ -53,4 +58,8 @@ public interface DriftServerService {
*/
@Asynchronous(guaranteedDelivery = true)
void sendFilesZip(int resourceId, long zipSize, InputStream zipStream);
+
+ Map<Integer, List<DriftConfiguration>> getDriftConfigurations(Set<Integer> resourceIds);
+
+ DriftSnapshot getCurrentSnapshot(int driftConfigurationId);
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java
index e2b1c80..debbb17 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java
@@ -30,7 +30,7 @@ import org.rhq.core.domain.drift.DriftConfiguration;
public interface ChangeSetManager {
- boolean changeSetExists(int resourceId, Headers headers) throws IOException;
+ boolean changeSetExists(int resourceId, Headers headers);
/**
* Locates the latest coverage change set for the specified resource id and drift
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java
index e83f84d..ce257f3 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java
@@ -46,7 +46,7 @@ public class ChangeSetManagerImpl implements ChangeSetManager {
}
@Override
- public boolean changeSetExists(int resourceId, Headers headers) throws IOException {
+ public boolean changeSetExists(int resourceId, Headers headers) {
File changeSetDir = findChangeSetDir(resourceId, headers.getDriftConfigurationName());
if (changeSetDir == null || !changeSetDir.exists()) {
return false;
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
index d8ae989..37886f0 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
@@ -34,12 +34,15 @@ import java.util.zip.ZipOutputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.rhq.common.drift.ChangeSetWriter;
import org.rhq.common.drift.Headers;
import org.rhq.core.clientapi.agent.drift.DriftAgentService;
import org.rhq.core.clientapi.server.drift.DriftServerService;
+import org.rhq.core.domain.drift.Drift;
import org.rhq.core.domain.drift.DriftChangeSetCategory;
import org.rhq.core.domain.drift.DriftConfiguration;
import org.rhq.core.domain.drift.DriftFile;
+import org.rhq.core.domain.drift.DriftSnapshot;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.pc.ContainerService;
import org.rhq.core.pc.PluginContainer;
@@ -50,6 +53,9 @@ import org.rhq.core.pc.inventory.ResourceContainer;
import org.rhq.core.pc.measurement.MeasurementManager;
import org.rhq.core.util.stream.StreamUtil;
+import static org.rhq.common.drift.FileEntry.addedFileEntry;
+import static org.rhq.common.drift.FileEntry.changedFileEntry;
+import static org.rhq.common.drift.FileEntry.removedFileEntry;
import static org.rhq.core.util.file.FileUtil.purge;
public class DriftManager extends AgentService implements DriftAgentService, DriftClient, ContainerService {
@@ -87,7 +93,11 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
driftDetector.setDriftClient(this);
InventoryManager inventoryMgr = PluginContainer.getInstance().getInventoryManager();
+ long startTime = System.currentTimeMillis();
initSchedules(inventoryMgr.getPlatform(), inventoryMgr);
+ long endTime = System.currentTimeMillis();
+
+ log.info("Finished initializing drift detection schedules in " + (endTime - startTime) + " ms");
driftThreadPool = new ScheduledThreadPoolExecutor(5);
@@ -115,7 +125,13 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
log.debug("Rescheduling drift detection schedules for " + r);
for (DriftConfiguration c : container.getDriftConfigurations()) {
- schedulesQueue.addSchedule(new DriftDetectionSchedule(r.getId(), c));
+ try {
+ syncWithServer(r, c);
+ schedulesQueue.addSchedule(new DriftDetectionSchedule(r.getId(), c));
+ } catch (IOException e) {
+ log.error("Failed to sync with server for " + toString(r, c) + ". Drift detection will not be " +
+ "scheduled.", e);
+ }
}
for (Resource child : r.getChildResources()) {
@@ -123,6 +139,46 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
}
}
+ private void syncWithServer(Resource resource, DriftConfiguration configuration) throws IOException {
+ Headers headers = createHeaders(resource, configuration);
+ if (!changeSetMgr.changeSetExists(resource.getId(), headers)) {
+ log.info("No snapshot found for " + toString(resource, configuration) + ". Downloading snapshot from " +
+ "server");
+ DriftSnapshot snapshot = pluginContainerConfiguration.getServerServices().getDriftServerService()
+ .getCurrentSnapshot(configuration.getId());
+ ChangeSetWriter writer = changeSetMgr.getChangeSetWriter(resource.getId(), headers);
+
+ for (Drift drift : snapshot.getEntries()) {
+ switch (drift.getCategory()) {
+ case FILE_ADDED:
+ writer.write(addedFileEntry(drift.getPath(), drift.getNewDriftFile().getHashId()));
+ break;
+ case FILE_CHANGED:
+ writer.write(changedFileEntry(drift.getPath(), drift.getOldDriftFile().getHashId(),
+ drift.getNewDriftFile().getHashId()));
+ break;
+ default: // FILE_REMOVED
+ writer.write(removedFileEntry(drift.getPath(), drift.getOldDriftFile().getHashId()));
+ }
+ }
+ writer.close();
+ }
+ }
+
+ private String toString(Resource r, DriftConfiguration c) {
+ return "DriftConfiguration[id: " + c.getId() + ", resourceId: " + r.getId() + ", name: " + c.getName() + "]";
+ }
+
+ private Headers createHeaders(Resource resource, DriftConfiguration configuration) {
+ Headers headers = new Headers();
+ headers.setResourceId(resource.getId());
+ headers.setDriftCofigurationId(configuration.getId());
+ headers.setType(DriftChangeSetCategory.COVERAGE);
+ headers.setDriftConfigurationName(configuration.getName());
+ headers.setBasedir(getAbsoluteBaseDirectory(resource.getId(), configuration).getAbsolutePath());
+ return headers;
+ }
+
/**
* This method is provided as a test hook.
*
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
index dc58717..c503e92 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
@@ -27,10 +27,12 @@ import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
+import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.LinkedHashSet;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -63,6 +65,7 @@ import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.discovery.AvailabilityReport;
import org.rhq.core.domain.discovery.MergeResourceResponse;
import org.rhq.core.domain.discovery.ResourceSyncInfo;
+import org.rhq.core.domain.drift.DriftConfiguration;
import org.rhq.core.domain.measurement.Availability;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.ResourceMeasurementScheduleRequest;
@@ -78,17 +81,15 @@ import org.rhq.core.domain.resource.ResourceUpgradeReport;
import org.rhq.core.pc.ContainerService;
import org.rhq.core.pc.PluginContainer;
import org.rhq.core.pc.PluginContainerConfiguration;
-import org.rhq.core.pc.RebootRequestListener;
import org.rhq.core.pc.ServerServices;
import org.rhq.core.pc.agent.AgentRegistrar;
import org.rhq.core.pc.agent.AgentService;
import org.rhq.core.pc.availability.AvailabilityCollectorThreadPool;
import org.rhq.core.pc.content.ContentContextImpl;
+import org.rhq.core.pc.drift.DriftManager;
import org.rhq.core.pc.event.EventContextImpl;
import org.rhq.core.pc.inventory.ResourceContainer.ResourceComponentState;
import org.rhq.core.pc.operation.OperationContextImpl;
-import org.rhq.core.pc.operation.OperationManager;
-import org.rhq.core.pc.operation.OperationServicesAdapter;
import org.rhq.core.pc.plugin.BlacklistedException;
import org.rhq.core.pc.plugin.CanonicalResourceKey;
import org.rhq.core.pc.plugin.PluginComponentFactory;
@@ -100,7 +101,6 @@ import org.rhq.core.pc.util.FacetLockType;
import org.rhq.core.pc.util.LoggingThreadFactory;
import org.rhq.core.pluginapi.availability.AvailabilityFacet;
import org.rhq.core.pluginapi.content.ContentContext;
-import org.rhq.core.pluginapi.content.ContentServices;
import org.rhq.core.pluginapi.event.EventContext;
import org.rhq.core.pluginapi.inventory.ClassLoaderFacet;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
@@ -112,7 +112,6 @@ import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
import org.rhq.core.pluginapi.operation.OperationContext;
-import org.rhq.core.pluginapi.operation.OperationServices;
import org.rhq.core.pluginapi.upgrade.ResourceUpgradeContext;
import org.rhq.core.pluginapi.upgrade.ResourceUpgradeFacet;
import org.rhq.core.system.SystemInfo;
@@ -1978,6 +1977,12 @@ public class InventoryManager extends AgentService implements ContainerService,
performServiceScan(syncInfo.getId()); // NOTE: This will block (the initial scan blocks).
}
+ /**
+ * This method is called for a resource tree that exists in the server inventory but
+ * not in the agent's inventory.
+ *
+ * @param resource
+ */
private void syncSchedulesRecursively(Resource resource) {
if (resource.getInventoryStatus() == InventoryStatus.COMMITTED) {
if (resource.getResourceType().getCategory() == ResourceCategory.PLATFORM) {
@@ -2003,6 +2008,36 @@ public class InventoryManager extends AgentService implements ContainerService,
}
}
+ private void syncDriftConfigurationsRecursively(Resource resource) {
+ if (resource.getInventoryStatus() != InventoryStatus.COMMITTED) {
+ return;
+ }
+
+ Deque<Resource> resources = new LinkedList<Resource>();
+ resources.push(resource);
+
+ Set<Integer> resourceIds = new HashSet<Integer>();
+
+ while (!resources.isEmpty()) {
+ Resource r = resources.pop();
+ if (supportsDriftManagement(r)) {
+ resourceIds.add(r.getId());
+ }
+ for (Resource child : r.getChildResources()) {
+ resources.push(child);
+ }
+ }
+ Map<Integer, List<DriftConfiguration>> configs = configuration.getServerServices().getDriftServerService()
+ .getDriftConfigurations(resourceIds);
+ installDriftConfigurations(configs);
+ }
+
+ private boolean supportsDriftManagement(Resource r) {
+ PluginMetadataManager metaDataMgr = PluginContainer.getInstance().getPluginManager().getMetadataManager();
+ ResourceType type = metaDataMgr.getType(r.getResourceType());
+ return type.getDriftConfigurationTemplates() != null && !type.getDriftConfigurationTemplates().isEmpty();
+ }
+
private void syncSchedules(Set<Resource> resources) {
if (log.isDebugEnabled()) {
log.debug("syncSchedules(Set<Resource>) for resources: " + resources);
@@ -2024,6 +2059,27 @@ public class InventoryManager extends AgentService implements ContainerService,
installSchedules(scheduleRequests);
}
+ private void syncDriftConfigurations(Set<Resource> resources) {
+ if (log.isDebugEnabled()) {
+ log.debug("Syncing drift configurations for " + resources);
+ }
+
+ if (resources.isEmpty()) {
+ return;
+ }
+
+ Set<Integer> committedResourceIds = new HashSet<Integer>();
+ for (Resource resource : resources) {
+ if (resource.getInventoryStatus() == InventoryStatus.COMMITTED) {
+ committedResourceIds.add(resource.getId());
+ }
+ }
+
+ Map<Integer, List<DriftConfiguration>> driftConfigs = configuration.getServerServices().getDriftServerService()
+ .getDriftConfigurations(committedResourceIds);
+ installDriftConfigurations(driftConfigs);
+ }
+
private void postProcessNewlyCommittedResources(Set<Resource> resources) {
if (log.isDebugEnabled()) {
log.debug("Post-processing newly committed resources: " + resources);
@@ -2062,6 +2118,25 @@ public class InventoryManager extends AgentService implements ContainerService,
}
}
+ private void installDriftConfigurations(Map<Integer, List<DriftConfiguration>> driftConfigurations) {
+ DriftManager driftMgr = PluginContainer.getInstance().getDriftManager();
+ if (driftMgr != null) {
+ for (Integer resourceId : driftConfigurations.keySet()) {
+ for (DriftConfiguration c : driftConfigurations.get(resourceId)) {
+ driftMgr.scheduleDriftDetection(resourceId, c);
+ }
+ }
+ } else {
+ log.info("DriftManager is not available. Drift configurations will be persisted but not scheduled.");
+ for (Integer resourceId : driftConfigurations.keySet()) {
+ ResourceContainer container = getResourceContainer(resourceId);
+ for (DriftConfiguration c : driftConfigurations.get(resourceId)) {
+ container.addDriftConfiguration(c);
+ }
+ }
+ }
+ }
+
/**
* Calling this method will immediately perform an availability check on all inventories resources. The availability
* checks will be made asynchronously; this method will not block.
@@ -2473,6 +2548,7 @@ public class InventoryManager extends AgentService implements ContainerService,
Set<Resource> modifiedResources = configuration.getServerServices().getDiscoveryServerService().getResources(
modifiedResourceIds, false);
syncSchedules(modifiedResources); // RHQ-792, mtime is the indicator that schedules should be sync'ed too
+ syncDriftConfigurations(modifiedResources);
for (Resource modifiedResource : modifiedResources) {
mergeResource(modifiedResource);
}
@@ -2497,6 +2573,7 @@ public class InventoryManager extends AgentService implements ContainerService,
if (resourceType != null) {
mergeResource(unknownResource);
syncSchedulesRecursively(unknownResource);
+ syncDriftConfigurationsRecursively(unknownResource);
} else {
toBeIgnored.add(unknownResource.getId());
if (log.isDebugEnabled()) {
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftManagerTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftManagerTest.java
index 4b8b698..18d2d27 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftManagerTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftManagerTest.java
@@ -24,13 +24,16 @@ import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.clientapi.server.drift.DriftServerService;
import org.rhq.core.domain.drift.DriftConfiguration;
+import org.rhq.core.domain.drift.DriftSnapshot;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.pc.PluginContainerConfiguration;
import org.rhq.core.pc.ServerServices;
@@ -374,6 +377,16 @@ public class DriftManagerTest extends DriftTest {
callback.execute();
}
}
+
+ @Override
+ public Map<Integer, List<DriftConfiguration>> getDriftConfigurations(Set<Integer> resourceIds) {
+ return null;
+ }
+
+ @Override
+ public DriftSnapshot getCurrentSnapshot(int driftConfigurationId) {
+ return null;
+ }
}
/**
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
index 61558ae..c5e4a76 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
@@ -18,10 +18,6 @@
*/
package org.rhq.enterprise.server.drift;
-import static java.util.Arrays.asList;
-import static javax.ejb.TransactionAttributeType.NOT_SUPPORTED;
-import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
-
import java.io.File;
import java.io.InputStream;
import java.util.HashSet;
@@ -40,9 +36,6 @@ import javax.jms.Session;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
-import difflib.DiffUtils;
-import difflib.Patch;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -61,13 +54,13 @@ import org.rhq.core.domain.drift.DriftChangeSet;
import org.rhq.core.domain.drift.DriftComposite;
import org.rhq.core.domain.drift.DriftConfiguration;
import org.rhq.core.domain.drift.DriftConfigurationComparator;
+import org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode;
import org.rhq.core.domain.drift.DriftConfigurationDefinition;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
import org.rhq.core.domain.drift.DriftDetails;
import org.rhq.core.domain.drift.DriftFile;
import org.rhq.core.domain.drift.DriftSnapshot;
import org.rhq.core.domain.drift.FileDiffReport;
-import org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode;
-import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.RHQConstants;
@@ -85,6 +78,13 @@ import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
import org.rhq.enterprise.server.util.LookupUtil;
+import difflib.DiffUtils;
+import difflib.Patch;
+
+import static java.util.Arrays.asList;
+import static javax.ejb.TransactionAttributeType.NOT_SUPPORTED;
+import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
+
/**
* The SLSB supporting Drift management to clients.
*
@@ -478,6 +478,7 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
if (!isUpdated) {
resource.addDriftConfiguration(driftConfig);
}
+ resource.setAgentSynchronizationNeeded();
resource = entityManager.merge(resource);
// Do not pass attached entities to the following Agent call, which is outside Hibernate's control. Flush
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftServerServiceImpl.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftServerServiceImpl.java
index 2d58ed8..39330a2 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftServerServiceImpl.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftServerServiceImpl.java
@@ -19,11 +19,24 @@
*/
package org.rhq.enterprise.server.drift;
-import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager;
-
import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
import org.rhq.core.clientapi.server.drift.DriftServerService;
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.criteria.DriftChangeSetCriteria;
+import org.rhq.core.domain.criteria.DriftConfigurationCriteria;
+import org.rhq.core.domain.criteria.GenericDriftChangeSetCriteria;
+import org.rhq.core.domain.drift.DriftConfiguration;
+import org.rhq.core.domain.drift.DriftSnapshot;
+import org.rhq.core.domain.util.PageList;
+
+import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager;
+import static org.rhq.enterprise.server.util.LookupUtil.getSubjectManager;
public class DriftServerServiceImpl implements DriftServerService {
@Override
@@ -46,4 +59,39 @@ public class DriftServerServiceImpl implements DriftServerService {
}
}
+ @Override
+ public Map<Integer, List<DriftConfiguration>> getDriftConfigurations(Set<Integer> resourceIds) {
+ DriftConfigurationCriteria criteria = new DriftConfigurationCriteria();
+ criteria.addFilterResourceIds(resourceIds.toArray(new Integer[resourceIds.size()]));
+ criteria.fetchConfiguration(true);
+
+ Subject overlord = getSubjectManager().getOverlord();
+ PageList<DriftConfiguration> configs = getDriftManager().findDriftConfigurationsByCriteria(overlord, criteria);
+
+ Map<Integer, List<DriftConfiguration>> map = new HashMap<Integer, List<DriftConfiguration>>();
+ for (DriftConfiguration c : configs) {
+ List<DriftConfiguration> list = map.get(c.getResource().getId());
+ if (list == null) {
+ list = new ArrayList<DriftConfiguration>();
+ }
+ list.add(c);
+ map.put(c.getResource().getId(), list);
+ }
+
+ return map;
+ }
+
+ @Override
+ public DriftSnapshot getCurrentSnapshot(int driftConfigurationId) {
+ DriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria();
+ criteria.addFilterDriftConfigurationId(driftConfigurationId);
+
+ Subject overlord = getSubjectManager().getOverlord();
+
+ try {
+ return getDriftManager().createSnapshot(overlord, criteria);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
}
commit 84ec4bd2587e7bb249e15bc9690e22ec30eddb28
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Sep 9 15:01:00 2011 -0400
[BZ 735262] to support range alert definitions, we now have a "RANGE" conditional.
you can specify a range of values (low and high) and you can alert if a metric value is either outside or inside that range.
This will now allow you to avoid having to have two conditions on the same metric with the ALL conjunection.
You still can't have that - two conditions using the same metric with ALL conjunction still exhibits that typically-undesired effects as before.
But now we support a range condition that allows you to do a range check.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java
index bebcbe0..34a81c2 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java
@@ -257,6 +257,25 @@ import org.rhq.core.domain.operation.OperationRequestStatus;
+ " AND ad.deleted = FALSE " //
+ " AND ac.category = 'DRIFT' " //
+ "ORDER BY ac.id"), //
+ @NamedQuery(name = AlertCondition.QUERY_BY_CATEGORY_RANGE, query = "" //
+ + " SELECT new org.rhq.core.domain.alert.composite.AlertConditionRangeCategoryComposite " //
+ + " ( " //
+ + " ac, " //
+ + " ms.id, " //
+ + " md.dataType " //
+ + " ) " //
+ + " FROM AlertCondition AS ac " //
+ + " JOIN ac.alertDefinition ad " //
+ + " JOIN ad.resource res " //
+ + " JOIN ac.measurementDefinition md, MeasurementSchedule ms " //
+ + " WHERE " + AlertCondition.RECOVERY_CONDITIONAL_EXPRESSION //
+ + " AND ( res.agent.id = :agentId OR :agentId IS NULL ) " //
+ + " AND ad.enabled = TRUE " //
+ + " AND ad.deleted = FALSE " //
+ + " AND ms.definition = md " //
+ + " AND ms.resource = res " //
+ + " AND ac.category = 'RANGE' " //
+ + "ORDER BY ac.id"), //
@NamedQuery(name = AlertCondition.QUERY_BY_CATEGORY_COUNT_PARAMETERIZED, query = "" //
+ " SELECT count(ac.id) " //
+ " FROM AlertCondition AS ac " //
@@ -289,6 +308,7 @@ public class AlertCondition implements Serializable {
public static final String QUERY_BY_CATEGORY_EVENT = "AlertCondition.byCategoryEvent";
public static final String QUERY_BY_CATEGORY_RESOURCE_CONFIG = "AlertCondition.byCategoryResourceConfig";
public static final String QUERY_BY_CATEGORY_DRIFT = "AlertCondition.byCategoryDrift";
+ public static final String QUERY_BY_CATEGORY_RANGE = "AlertCondition.byCategoryRange";
public static final String QUERY_BY_CATEGORY_COUNT_BASELINE = "AlertCondition.byCategoryCountBaseline";
public static final String QUERY_BY_CATEGORY_COUNT_PARAMETERIZED = "AlertCondition.byCategoryCountParameterized";
@@ -416,6 +436,7 @@ public class AlertCondition implements Serializable {
* regex that allows the user to match more than one drift config if they so choose.
* (this value may be null, in which case it doesn't matter which drift configs were the ones
* in which the drift was detected)
+ * RANGE: the name of the metric (TODO: today its the display name, very bad for i18n purposes)
*
* @return additional information about the condition
*/
@@ -428,10 +449,11 @@ public class AlertCondition implements Serializable {
}
/**
- * Will be one of these comparators: "<", ">" or "=" but only for THRESHOLD
- * and BASELINE condition categories. For calltime alert conditions (i.e. category
- * CHANGE for calltime metric definitions), comparator will be one of these
- * comparators: "HI", "LO", "CH" (where "CH" means "change").
+ * THRESHOLD and BASELINE: one of these comparators: "<", ">" or "="
+ * For calltime alert conditions (i.e. category CHANGE for calltime metric definitions),
+ * comparator will be one of these comparators: "HI", "LO", "CH" (where "CH" means "change").
+ * RANGE: one of these comparators "<", ">" (meaning inside and outside the range respectively)
+ * or one of these "<=", ">=" (meaning inside and outside inclusive respectively)
*
* Other types of conditions will return <code>null</code> (i.e. this will be
* null if the condition does not compare values).
@@ -448,9 +470,12 @@ public class AlertCondition implements Serializable {
/**
* Returns the threshold to compare a measurement value to see if the condition is true.
- * This is only valid for conditions of category THRESHOLD, BASELINE and CHANGE (but
+ * This is only valid for conditions of category THRESHOLD, BASELINE, RANGE and CHANGE (but
* only where CHANGE is for a calltime metric alert condition). All other
* condition types will return <code>null</code>.
+ *
+ * Note: If RANGE condition, this threshold is always the LOW end of the range.
+ * The high end of the range is in {@link #getOption()}.
*
* @return threshold value or null
*/
@@ -473,6 +498,7 @@ public class AlertCondition implements Serializable {
* EVENT: the regular expression of the message to match (which may be empty string if not specified)
* RESOURCE_CONFIG: n/a
* DRIFT: a regular expression to match files whose content drifted (may be empty string or null if not specified)
+ * RANGE: the string form of a double value that is the HIGH end of the range (low end is {@link #getThreshold()})
*
* @return additional information about the condition
*/
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionCategory.java b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionCategory.java
index e80c221..bb7a563 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionCategory.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionCategory.java
@@ -32,7 +32,8 @@ public enum AlertConditionCategory {
ALERT("Alert Fired"), //
RESOURCE_CONFIG("Resource Configuration Property Value Change"), //
EVENT("Log Event"), //
- DRIFT("Drift Detected");
+ DRIFT("Drift Detected"), //
+ RANGE("Measurement Value Range");
/*
* legacyOrder exists to support code that still uses the old EventConstants.TYPE_* attributes, which was one-based
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/composite/AlertConditionRangeCategoryComposite.java b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/composite/AlertConditionRangeCategoryComposite.java
new file mode 100644
index 0000000..a90a2d4
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/composite/AlertConditionRangeCategoryComposite.java
@@ -0,0 +1,48 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * 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 and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.core.domain.alert.composite;
+
+import org.rhq.core.domain.alert.AlertCondition;
+import org.rhq.core.domain.measurement.DataType;
+
+public class AlertConditionRangeCategoryComposite extends AbstractAlertConditionCategoryComposite {
+
+ private final Integer scheduleId;
+ private final DataType dataType;
+
+ public AlertConditionRangeCategoryComposite(AlertCondition condition, Integer scheduleId, DataType dataType) {
+ super(condition);
+ this.scheduleId = scheduleId;
+ this.dataType = dataType;
+ }
+
+ public Integer getScheduleId() {
+ return scheduleId;
+ }
+
+ @Override
+ public DataType getDataType() {
+ return dataType;
+ }
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
index 72a6966..6c41e21 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
@@ -210,6 +210,39 @@ public class AlertFormatUtility {
}
break;
}
+ case RANGE: {
+ String metricName = condition.getName();
+ MeasurementUnits units = condition.getMeasurementDefinition().getUnits();
+ double loValue = condition.getThreshold();
+ String formattedLoValue = MeasurementConverterClient.format(loValue, units, true);
+ String formattedHiValue = condition.getOption();
+ try {
+ double hiValue = Double.parseDouble(formattedHiValue);
+ formattedHiValue = MeasurementConverterClient.format(hiValue, units, true);
+ } catch (Exception e) {
+ formattedHiValue = "?[" + formattedHiValue + "]?"; // signify something is wrong with the value
+ }
+
+ // < means "inside the range", > means "outside the range" - exclusive
+ // <= means "inside the range", >= means "outside the range" - inclusive
+
+ if (condition.getComparator().equals("<")) {
+ str.append(MSG.view_alert_common_tab_conditions_type_metric_range_inside_exclusive(metricName,
+ formattedLoValue, formattedHiValue));
+ } else if (condition.getComparator().equals(">")) {
+ str.append(MSG.view_alert_common_tab_conditions_type_metric_range_outside_exclusive(metricName,
+ formattedLoValue, formattedHiValue));
+ } else if (condition.getComparator().equals("<=")) {
+ str.append(MSG.view_alert_common_tab_conditions_type_metric_range_inside_inclusive(metricName,
+ formattedLoValue, formattedHiValue));
+ } else if (condition.getComparator().equals(">=")) {
+ str.append(MSG.view_alert_common_tab_conditions_type_metric_range_outside_inclusive(metricName,
+ formattedLoValue, formattedHiValue));
+ } else {
+ str.append("BAD COMPARATOR! Report this bug: " + condition.getComparator());
+ }
+ break;
+ }
default: {
str.append(MSG.view_alert_common_tab_invalid_condition_category(category.name()));
break;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
index f3e872d..04012b1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
@@ -92,6 +92,10 @@ public class NewConditionEditor extends LocatableDynamicForm {
private static final String EVENT_REGEX_ITEMNAME = "eventRegex";
private static final String DRIFT_CONFIGNAME_REGEX_ITEMNAME = "driftConfigNameRegex";
private static final String DRIFT_PATHNAME_REGEX_ITEMNAME = "driftPathNameRegex";
+ private static final String RANGE_METRIC_ITEMNAME = "rangeMetric";
+ private static final String RANGE_COMPARATOR_ITEMNAME = "rangeComparator";
+ private static final String RANGE_LO_ABSVALUE_ITEMNAME = "rangeMetricLoValue";
+ private static final String RANGE_HI_ABSVALUE_ITEMNAME = "rangeMetricHiValue";
private SelectItem conditionTypeSelectItem;
private HashSet<AlertCondition> conditions; // the new condition we create goes into this set
@@ -165,6 +169,8 @@ public class NewConditionEditor extends LocatableDynamicForm {
.view_alert_definition_condition_editor_option_metric_baseline());
condTypes.put(AlertConditionCategory.CHANGE.name(), MSG
.view_alert_definition_condition_editor_option_metric_change());
+ condTypes.put(AlertConditionCategory.RANGE.name(), MSG
+ .view_alert_definition_condition_editor_option_metric_range());
}
if (supportsCalltimeMetrics) {
condTypes.put(ALERT_CONDITION_CATEGORY_CALLTIME_THRESHOLD, MSG
@@ -235,6 +241,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
formItems.addAll(buildAvailabilityChangeFormItems());
if (supportsMetrics) {
formItems.addAll(buildMetricThresholdFormItems());
+ formItems.addAll(buildMetricRangeFormItems());
formItems.addAll(buildMetricBaselineFormItems());
formItems.addAll(buildMetricChangeFormItems());
}
@@ -388,6 +395,16 @@ public class NewConditionEditor extends LocatableDynamicForm {
break;
}
+ case RANGE: {
+ MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(RANGE_METRIC_ITEMNAME));
+ newCondition.setName(measDef.getDisplayName());
+ newCondition.setThreshold(Double.valueOf(getValueAsString(RANGE_LO_ABSVALUE_ITEMNAME)));
+ newCondition.setComparator(getValueAsString(RANGE_COMPARATOR_ITEMNAME));
+ newCondition.setOption(Double.valueOf(getValueAsString(RANGE_HI_ABSVALUE_ITEMNAME)).toString());
+ newCondition.setMeasurementDefinition(measDef);
+ break;
+ }
+
default: {
CoreGUI.getErrorHandler()
.handleError(MSG.view_alert_common_tab_invalid_condition_category(category.name())); // should never happen
@@ -423,6 +440,42 @@ public class NewConditionEditor extends LocatableDynamicForm {
return formItems;
}
+ private ArrayList<FormItem> buildMetricRangeFormItems() {
+ ArrayList<FormItem> formItems = new ArrayList<FormItem>();
+
+ ShowIfCategoryFunction ifFunc = new ShowIfCategoryFunction(AlertConditionCategory.RANGE);
+
+ String helpStr = MSG.view_alert_definition_condition_editor_metric_range_tooltip();
+ StaticTextItem helpItem = buildHelpTextItem("rangeHelp", helpStr, ifFunc);
+ formItems.add(helpItem);
+
+ formItems.add(buildMetricDropDownMenu(RANGE_METRIC_ITEMNAME, false, ifFunc));
+ formItems.add(buildRangeComparatorDropDownMenu(RANGE_COMPARATOR_ITEMNAME, ifFunc));
+ TextItem absoluteLowValue = new TextItem(RANGE_LO_ABSVALUE_ITEMNAME, MSG
+ .view_alert_definition_condition_editor_metric_range_lovalue());
+ absoluteLowValue.setWrapTitle(false);
+ absoluteLowValue.setRequired(true);
+ absoluteLowValue.setTooltip(MSG.view_alert_definition_condition_editor_metric_range_lovalue_tooltip());
+ absoluteLowValue.setHoverWidth(200);
+ absoluteLowValue.setValidateOnChange(true);
+ absoluteLowValue.setValidators(new IsFloatValidator());
+ absoluteLowValue.setShowIfCondition(ifFunc);
+ formItems.add(absoluteLowValue);
+
+ TextItem absoluteHighValue = new TextItem(RANGE_HI_ABSVALUE_ITEMNAME, MSG
+ .view_alert_definition_condition_editor_metric_range_hivalue());
+ absoluteHighValue.setWrapTitle(false);
+ absoluteHighValue.setRequired(true);
+ absoluteHighValue.setTooltip(MSG.view_alert_definition_condition_editor_metric_range_hivalue_tooltip());
+ absoluteHighValue.setHoverWidth(200);
+ absoluteHighValue.setValidateOnChange(true);
+ absoluteHighValue.setValidators(new IsFloatValidator());
+ absoluteHighValue.setShowIfCondition(ifFunc);
+ formItems.add(absoluteHighValue);
+
+ return formItems;
+ }
+
private ArrayList<FormItem> buildMetricBaselineFormItems() {
ArrayList<FormItem> formItems = new ArrayList<FormItem>();
@@ -843,6 +896,24 @@ public class NewConditionEditor extends LocatableDynamicForm {
return comparatorSelection;
}
+ private SelectItem buildRangeComparatorDropDownMenu(String itemName, FormItemIfFunction ifFunc) {
+
+ LinkedHashMap<String, String> comparators = new LinkedHashMap<String, String>(2);
+ comparators.put("<", MSG.view_alert_definition_condition_editor_metric_range_comparator_inside_exclusive());
+ comparators.put(">", MSG.view_alert_definition_condition_editor_metric_range_comparator_outside_exclusive());
+ comparators.put("<=", MSG.view_alert_definition_condition_editor_metric_range_comparator_inside_inclusive());
+ comparators.put(">=", MSG.view_alert_definition_condition_editor_metric_range_comparator_outside_inclusive());
+
+ SelectItem comparatorSelection = new SelectItem(itemName, MSG
+ .view_alert_definition_condition_editor_metric_range_comparator());
+ comparatorSelection.setValueMap(comparators);
+ comparatorSelection.setDefaultValue("<");
+ comparatorSelection.setTooltip(MSG.view_alert_definition_condition_editor_metric_range_comparator_tooltip());
+ comparatorSelection.setHoverWidth(200);
+ comparatorSelection.setShowIfCondition(ifFunc);
+ return comparatorSelection;
+ }
+
private StaticTextItem buildHelpTextItem(String itemName, String helpText, FormItemIfFunction ifFunc) {
StaticTextItem help = new StaticTextItem(itemName);
help.setShowTitle(false);
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index 0b336c1..8a70316 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -628,6 +628,10 @@ view_alert_common_tab_conditions_type_metric_calltime_delta_shrinks = Shrinks
view_alert_common_tab_conditions_type_metric_calltime_destination = with call destination matching
view_alert_common_tab_conditions_type_metric_calltime_threshold = Call Time Value Threshold
view_alert_common_tab_conditions_type_metric_change = Metric Value Change
+view_alert_common_tab_conditions_type_metric_range_inside_exclusive = Metric Value Range: [{0}] between [{1}] and [{2}], exclusive
+view_alert_common_tab_conditions_type_metric_range_inside_inclusive = Metric Value Range: [{0}] between [{1}] and [{2}], inclusive
+view_alert_common_tab_conditions_type_metric_range_outside_exclusive = Metric Value Range: [{0}] outside [{1}] and [{2}], exclusive
+view_alert_common_tab_conditions_type_metric_range_outside_inclusive = Metric Value Range: [{0}] outside [{1}] and [{2}], inclusive
view_alert_common_tab_conditions_type_metric_threshold = Metric Value Threshold
view_alert_common_tab_conditions_type_metric_trait_change = Trait Change
view_alert_common_tab_conditions_type_operation = Operation Execution
@@ -706,6 +710,17 @@ view_alert_definition_condition_editor_metric_calltime_threshold_value = Call Ti
view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
view_alert_definition_condition_editor_metric_change_tooltip = Specify the metric whose value must change to trigger the condition.
view_alert_definition_condition_editor_metric_common_definition_not_found = Should have found metric definition - something is wrong
+view_alert_definition_condition_editor_metric_range_comparator = Comparator
+view_alert_definition_condition_editor_metric_range_comparator_inside_exclusive = Inside, exclusive
+view_alert_definition_condition_editor_metric_range_comparator_inside_inclusive = Inside, inclusive
+view_alert_definition_condition_editor_metric_range_comparator_outside_exclusive = Outside, exclusive
+view_alert_definition_condition_editor_metric_range_comparator_outside_inclusive = Outside, inclusive
+view_alert_definition_condition_editor_metric_range_comparator_tooltip = Determines if a metric value should trigger this condition when inside the range or outside of it. If inclusive, the value is considered to be in the range if its value equals a low or high threshold value. If exclusive, the value is not considered in the range if it equals the low or high value.
+view_alert_definition_condition_editor_metric_range_hivalue = High Value
+view_alert_definition_condition_editor_metric_range_hivalue_tooltip = The high threshold value of the range.
+view_alert_definition_condition_editor_metric_range_lovalue = Low Value
+view_alert_definition_condition_editor_metric_range_lovalue_tooltip = The low threshold value of the range.
+view_alert_definition_condition_editor_metric_range_tooltip = Compares a metric value to a given low-high value range.
view_alert_definition_condition_editor_metric_threshold_comparator = Comparator
view_alert_definition_condition_editor_metric_threshold_comparator_equal = Equal to
view_alert_definition_condition_editor_metric_threshold_comparator_greater = Greater Than
@@ -732,6 +747,7 @@ view_alert_definition_condition_editor_option_metric_baseline = Measurement Base
view_alert_definition_condition_editor_option_metric_calltime_change = Call Time Value Change
view_alert_definition_condition_editor_option_metric_calltime_threshold = Call Time Value Threshold
view_alert_definition_condition_editor_option_metric_change = Measurement Value Change
+view_alert_definition_condition_editor_option_metric_range = Measurement Value Range
view_alert_definition_condition_editor_option_metric_threshold = Measurement Absolute Value Threshold
view_alert_definition_condition_editor_option_metric_trait_change = Trait Value Change
view_alert_definition_condition_editor_option_operation = Operation Execution
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
index 3b4a7d8..a952137 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
@@ -505,6 +505,10 @@ view_alert_common_tab_conditions_type_metric_calltime_delta_shrinks = Schrumpft
view_alert_common_tab_conditions_type_metric_calltime_destination = with call destination matching~
view_alert_common_tab_conditions_type_metric_calltime_threshold = Call-Time ÃŒberschreitet Schwellwert
view_alert_common_tab_conditions_type_metric_change = Wert der Metrik Àndert sich
+##view_alert_common_tab_conditions_type_metric_range_inside_exclusive = Metric Value Range: [{0}] between [{1}] and [{2}], exclusive
+##view_alert_common_tab_conditions_type_metric_range_inside_inclusive = Metric Value Range: [{0}] between [{1}] and [{2}], inclusive
+##view_alert_common_tab_conditions_type_metric_range_outside_exclusive = Metric Value Range: [{0}] outside [{1}] and [{2}], exclusive
+##view_alert_common_tab_conditions_type_metric_range_outside_inclusive = Metric Value Range: [{0}] outside [{1}] and [{2}], inclusive
view_alert_common_tab_conditions_type_metric_threshold = Metrik ÃŒberschreitet Schwellwert
view_alert_common_tab_conditions_type_metric_trait_change = Trait-Ãnderung
view_alert_common_tab_conditions_type_operation = AusfÃŒhrung der Operation
@@ -583,6 +587,17 @@ view_alert_definition_condition_editor_metric_calltime_threshold_value = Call Ti
view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.~
view_alert_definition_condition_editor_metric_change_tooltip = Specify the metric whose value must change to trigger the condition.~
view_alert_definition_condition_editor_metric_common_definition_not_found = Should have found metric definition - something is wrong~
+view_alert_definition_condition_editor_metric_range_comparator = Komparator
+##view_alert_definition_condition_editor_metric_range_comparator_inside_exclusive = Inside, exclusive
+##view_alert_definition_condition_editor_metric_range_comparator_inside_inclusive = Inside, inclusive
+##view_alert_definition_condition_editor_metric_range_comparator_outside_exclusive = Outside, exclusive
+##view_alert_definition_condition_editor_metric_range_comparator_outside_inclusive = Outside, inclusive
+##view_alert_definition_condition_editor_metric_range_comparator_tooltip = Determines if a metric value should trigger this condition when inside the range or outside of it.
+##view_alert_definition_condition_editor_metric_range_hivalue = High Value
+##view_alert_definition_condition_editor_metric_range_hivalue_tooltip = The high threshold value of the range.
+##view_alert_definition_condition_editor_metric_range_lovalue = Low Value
+##view_alert_definition_condition_editor_metric_range_lovalue_tooltip = The high threshold value of the range.
+##view_alert_definition_condition_editor_metric_range_tooltip = Compares a metric value to a given low-high value range.
view_alert_definition_condition_editor_metric_threshold_comparator = Komparator
view_alert_definition_condition_editor_metric_threshold_comparator_equal = Gleich
view_alert_definition_condition_editor_metric_threshold_comparator_greater = GröÃer als
@@ -609,6 +624,7 @@ view_alert_definition_condition_editor_option_metric_baseline = Schwelle des Ref
view_alert_definition_condition_editor_option_metric_calltime_change = Ãnderung des Call-Time-Werts
view_alert_definition_condition_editor_option_metric_calltime_threshold = Call Time Value Threshold~
view_alert_definition_condition_editor_option_metric_change = Wert der Metrik Àndert sich
+##view_alert_definition_condition_editor_option_metric_range = Measurement Value Range
view_alert_definition_condition_editor_option_metric_threshold = Absoluter Metrikschwellwert
view_alert_definition_condition_editor_option_metric_trait_change = Ãnderung des Trait-Werts
view_alert_definition_condition_editor_option_operation = AusfÃŒhrung der Operation
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
index f43ad29..f323fbc 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
@@ -623,6 +623,10 @@ view_alert_common_tab_conditions_type_metric_calltime_delta_shrinks = çž®å°
view_alert_common_tab_conditions_type_metric_calltime_destination = åŒã³åºãã®å®å
ãäžèŽ
view_alert_common_tab_conditions_type_metric_calltime_threshold = åŒã³åºãæéã®éŸå€
view_alert_common_tab_conditions_type_metric_change = ã¡ããªãã¯å€ã®å€æ
+##view_alert_common_tab_conditions_type_metric_range_inside_exclusive = Metric Value Range: [{0}] between [{1}] and [{2}], exclusive
+##view_alert_common_tab_conditions_type_metric_range_inside_inclusive = Metric Value Range: [{0}] between [{1}] and [{2}], inclusive
+##view_alert_common_tab_conditions_type_metric_range_outside_exclusive = Metric Value Range: [{0}] outside [{1}] and [{2}], exclusive
+##view_alert_common_tab_conditions_type_metric_range_outside_inclusive = Metric Value Range: [{0}] outside [{1}] and [{2}], inclusive
view_alert_common_tab_conditions_type_metric_threshold = ã¡ããªãã¯å€ã®éŸå€
view_alert_common_tab_conditions_type_metric_trait_change = ãã¬ã€ãã®å€å
view_alert_common_tab_conditions_type_operation = ãªãã¬ãŒã·ã§ã³ã®å®è¡
@@ -701,6 +705,17 @@ view_alert_definition_condition_editor_metric_calltime_threshold_value = åŒã³
view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = éžæãããæ¯èŒå(comparator)ã䜿ã£ãŠæ¯èŒãããšãæ¡ä»¶ãåŒãèµ·ããããã¡ããªãã¯ã®éŸå€
view_alert_definition_condition_editor_metric_change_tooltip = æ¡ä»¶ãåŒãèµ·ããããã«å€æŽããªããã°ãªããªãå€ãæã€ã¡ããªãã¯ãæå®ããŸã
view_alert_definition_condition_editor_metric_common_definition_not_found = ã¡ããªãã¯å®çŸ©ãèŠã€ããã¹ãã§ã - äœããããããã§ã
+view_alert_definition_condition_editor_metric_range_comparator = ã³ã³ãã¬ãŒã¿
+##view_alert_definition_condition_editor_metric_range_comparator_inside_exclusive = Inside, exclusive
+##view_alert_definition_condition_editor_metric_range_comparator_inside_inclusive = Inside, inclusive
+##view_alert_definition_condition_editor_metric_range_comparator_outside_exclusive = Outside, exclusive
+##view_alert_definition_condition_editor_metric_range_comparator_outside_inclusive = Outside, inclusive
+##view_alert_definition_condition_editor_metric_range_comparator_tooltip = Determines if a metric value should trigger this condition when inside the range or outside of it.
+##view_alert_definition_condition_editor_metric_range_hivalue = High Value
+##view_alert_definition_condition_editor_metric_range_hivalue_tooltip = The high threshold value of the range.
+##view_alert_definition_condition_editor_metric_range_lovalue = Low Value
+##view_alert_definition_condition_editor_metric_range_lovalue_tooltip = The high threshold value of the range.
+##view_alert_definition_condition_editor_metric_range_tooltip = Compares a metric value to a given low-high value range.
view_alert_definition_condition_editor_metric_threshold_comparator = ã³ã³ãã¬ãŒã¿
view_alert_definition_condition_editor_metric_threshold_comparator_equal = çãã
view_alert_definition_condition_editor_metric_threshold_comparator_greater = ãã倧ãã
@@ -727,6 +742,7 @@ view_alert_definition_condition_editor_option_metric_baseline = 枬å®ããŒã¹
view_alert_definition_condition_editor_option_metric_calltime_change = åŒã³åºãæéã®å€å
view_alert_definition_condition_editor_option_metric_calltime_threshold = åŒã³åºãæéã®éŸå€
view_alert_definition_condition_editor_option_metric_change = 枬å®å€ã®å€å
+##view_alert_definition_condition_editor_option_metric_range = Measurement Value Range
view_alert_definition_condition_editor_option_metric_threshold = 枬å®çµ¶å¯Ÿå€ã®éŸå€
view_alert_definition_condition_editor_option_metric_trait_change = ãã¬ã€ãå€ã®å€å
view_alert_definition_condition_editor_option_operation = ãªãã¬ãŒã·ã§ã³ã®å®è¡
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
index 323b8ac..b16ca87 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
@@ -639,6 +639,10 @@ view_alert_common_tab_conditions_type_metric_calltime_delta_shrinks = Redu\u00E7
view_alert_common_tab_conditions_type_metric_calltime_destination = com o destino da chamada correspondente
view_alert_common_tab_conditions_type_metric_calltime_threshold = Tempo de chamada excede o limiar (threshold)
view_alert_common_tab_conditions_type_metric_change = Mudan\u00E7a no valor da m\u00E9trica
+##view_alert_common_tab_conditions_type_metric_range_inside_exclusive = Metric Value Range: [{0}] between [{1}] and [{2}], exclusive
+##view_alert_common_tab_conditions_type_metric_range_inside_inclusive = Metric Value Range: [{0}] between [{1}] and [{2}], inclusive
+##view_alert_common_tab_conditions_type_metric_range_outside_exclusive = Metric Value Range: [{0}] outside [{1}] and [{2}], exclusive
+##view_alert_common_tab_conditions_type_metric_range_outside_inclusive = Metric Value Range: [{0}] outside [{1}] and [{2}], inclusive
view_alert_common_tab_conditions_type_metric_threshold = Valor da M\u00E9trica excede o limiar (threshold)
view_alert_common_tab_conditions_type_metric_trait_change = Mudan\u00E7a de Carater\u00EDstica
view_alert_common_tab_conditions_type_operation = Execu\u00E7\u00E3o de Opera\u00E7\u00E3o
@@ -719,6 +723,17 @@ view_alert_definition_condition_editor_metric_calltime_threshold_value = Valor d
view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = O valor do limiar (<i>threshold</i>) da m\u00E9trica usado para disparar a condi\u00E7\u00E3o quando comparado ao mecanismo de compara\u00E7\u00E3o escolhido.
view_alert_definition_condition_editor_metric_change_tooltip = Especifica a m\u00E9trica cujo valor deve ser alterado para disparar a condi\u00E7\u00E3o.
view_alert_definition_condition_editor_metric_common_definition_not_found = Deve existir uma defini\u00E7\u00E3o para a m\u00E9trica - algo est\u00E1 incorreto
+view_alert_definition_condition_editor_metric_range_comparator = Mecanismo de Compara\u00E7\u00E3o
+##view_alert_definition_condition_editor_metric_range_comparator_inside_exclusive = Inside, exclusive
+##view_alert_definition_condition_editor_metric_range_comparator_inside_inclusive = Inside, inclusive
+##view_alert_definition_condition_editor_metric_range_comparator_outside_exclusive = Outside, exclusive
+##view_alert_definition_condition_editor_metric_range_comparator_outside_inclusive = Outside, inclusive
+##view_alert_definition_condition_editor_metric_range_comparator_tooltip = Determines if a metric value should trigger this condition when inside the range or outside of it.
+##view_alert_definition_condition_editor_metric_range_hivalue = High Value
+##view_alert_definition_condition_editor_metric_range_hivalue_tooltip = The high threshold value of the range.
+##view_alert_definition_condition_editor_metric_range_lovalue = Low Value
+##view_alert_definition_condition_editor_metric_range_lovalue_tooltip = The high threshold value of the range.
+##view_alert_definition_condition_editor_metric_range_tooltip = Compares a metric value to a given low-high value range.
view_alert_definition_condition_editor_metric_threshold_comparator = Mecanismo de Compara\u00E7\u00E3o
view_alert_definition_condition_editor_metric_threshold_comparator_equal = Igual \u00E0
view_alert_definition_condition_editor_metric_threshold_comparator_greater = Maior que
@@ -745,6 +760,7 @@ view_alert_definition_condition_editor_option_metric_baseline = Threshold base d
view_alert_definition_condition_editor_option_metric_calltime_change = Mudan\u00E7a no tempo de chamada
view_alert_definition_condition_editor_option_metric_calltime_threshold = Tempo limite da chamada
view_alert_definition_condition_editor_option_metric_change = Mudan\u00E7a no valor da M\u00E9trica
+##view_alert_definition_condition_editor_option_metric_range = Measurement Value Range
view_alert_definition_condition_editor_option_metric_threshold = Threshold (valor absoluto) da M\u00E9trica
view_alert_definition_condition_editor_option_metric_trait_change = Mudan\u00E7a de Carcter\u00EDstica
view_alert_definition_condition_editor_option_operation = Execu\u00E7\u00E3o de Opera\u00E7\u00E3o
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
index 85acc40..48ca5db 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
@@ -622,6 +622,10 @@ view_alert_common_tab_conditions_type_metric_calltime_delta_shrinks = Shrinks
view_alert_common_tab_conditions_type_metric_calltime_destination = with call destination matching
view_alert_common_tab_conditions_type_metric_calltime_threshold = Call Time Value Threshold
view_alert_common_tab_conditions_type_metric_change = \u6307\u6807\u503c\u6539\u53d8
+##view_alert_common_tab_conditions_type_metric_range_inside_exclusive = Metric Value Range: [{0}] between [{1}] and [{2}], exclusive
+##view_alert_common_tab_conditions_type_metric_range_inside_inclusive = Metric Value Range: [{0}] between [{1}] and [{2}], inclusive
+##view_alert_common_tab_conditions_type_metric_range_outside_exclusive = Metric Value Range: [{0}] outside [{1}] and [{2}], exclusive
+##view_alert_common_tab_conditions_type_metric_range_outside_inclusive = Metric Value Range: [{0}] outside [{1}] and [{2}], inclusive
view_alert_common_tab_conditions_type_metric_threshold = \u6307\u6807\u9600\u503c
view_alert_common_tab_conditions_type_metric_trait_change = \u7279\u5f81\u6539\u53d8
view_alert_common_tab_conditions_type_operation = \u64cd\u4f5c\u6267\u884c
@@ -700,6 +704,17 @@ view_alert_definition_condition_editor_metric_calltime_threshold_value = Call Ti
view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = The threshold value of the metric that will trigger the condition when compared using the selected comparator.
view_alert_definition_condition_editor_metric_change_tooltip = Specify the metric whose value must change to trigger the condition.
view_alert_definition_condition_editor_metric_common_definition_not_found = Should have found metric definition - something is wrong
+view_alert_definition_condition_editor_metric_range_comparator = \u6bd4\u8f83
+##view_alert_definition_condition_editor_metric_range_comparator_inside_exclusive = Inside, exclusive
+##view_alert_definition_condition_editor_metric_range_comparator_inside_inclusive = Inside, inclusive
+##view_alert_definition_condition_editor_metric_range_comparator_outside_exclusive = Outside, exclusive
+##view_alert_definition_condition_editor_metric_range_comparator_outside_inclusive = Outside, inclusive
+##view_alert_definition_condition_editor_metric_range_comparator_tooltip = Determines if a metric value should trigger this condition when inside the range or outside of it.
+##view_alert_definition_condition_editor_metric_range_hivalue = High Value
+##view_alert_definition_condition_editor_metric_range_hivalue_tooltip = The high threshold value of the range.
+##view_alert_definition_condition_editor_metric_range_lovalue = Low Value
+##view_alert_definition_condition_editor_metric_range_lovalue_tooltip = The high threshold value of the range.
+##view_alert_definition_condition_editor_metric_range_tooltip = Compares a metric value to a given low-high value range.
view_alert_definition_condition_editor_metric_threshold_comparator = \u6bd4\u8f83
view_alert_definition_condition_editor_metric_threshold_comparator_equal = \u7b49\u4e8e
view_alert_definition_condition_editor_metric_threshold_comparator_greater = \u5927\u4e8e
@@ -726,6 +741,7 @@ view_alert_definition_condition_editor_option_metric_baseline = \u6307\u6807\u57
view_alert_definition_condition_editor_option_metric_calltime_change = Call Time Value Change
view_alert_definition_condition_editor_option_metric_calltime_threshold = Call Time Value Threshold
view_alert_definition_condition_editor_option_metric_change = Measurement Value Change
+##view_alert_definition_condition_editor_option_metric_range = Measurement Value Range
view_alert_definition_condition_editor_option_metric_threshold = Measurement Absolute Value Threshold
view_alert_definition_condition_editor_option_metric_trait_change = Trait Value Change
view_alert_definition_condition_editor_option_operation = Operation Execution
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java
index 05e2af6..2f8a8bd 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java
@@ -115,6 +115,9 @@ public class AlertConditionManagerBean implements AlertConditionManagerLocal {
} else if (category == AlertConditionCategory.DRIFT) {
queryName = AlertCondition.QUERY_BY_CATEGORY_DRIFT;
+ } else if (category == AlertConditionCategory.RANGE) {
+ queryName = AlertCondition.QUERY_BY_CATEGORY_RANGE;
+
} else {
throw new IllegalArgumentException("getAlertConditionComposites does not support category '" + category
+ "'");
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
index 1d73c1a..5bffb48 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
@@ -901,6 +901,69 @@ public class AlertManagerBean implements AlertManagerLocal, AlertManagerRemote {
else
builder.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_DRIFT, condition
.getOption()));
+ } else if (category == AlertConditionCategory.RANGE) {
+ Double loValue = condition.getThreshold();
+ String hiValueStr = condition.getOption();
+
+ String loValueFormatted;
+ String hiValueFormatted;
+ MeasurementUnits units = condition.getMeasurementDefinition().getUnits();
+ if (units == null) {
+ loValueFormatted = "" + loValue;
+ hiValueFormatted = hiValueStr;
+ } else {
+ loValueFormatted = MeasurementConverter.format(loValue, units, true);
+ try {
+ hiValueFormatted = MeasurementConverter.format(Double.parseDouble(hiValueStr), units, true);
+ } catch (Exception e) {
+ hiValueFormatted = "?[" + hiValueStr + "]?";
+ }
+ }
+
+ if ("<".equals(condition.getComparator())) {
+ if (shortVersion) {
+ builder.append(AlertI18NFactory.getMessage(
+ AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_INSIDE_EXCL_RANGE_SHORT, loValueFormatted,
+ hiValueFormatted));
+ } else {
+ builder.append(AlertI18NFactory.getMessage(
+ AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_INSIDE_EXCL_RANGE, loValueFormatted,
+ hiValueFormatted));
+ }
+ } else if (">".equals(condition.getComparator())) {
+ if (shortVersion) {
+ builder.append(AlertI18NFactory.getMessage(
+ AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_OUTSIDE_EXCL_RANGE_SHORT, loValueFormatted,
+ hiValueFormatted));
+ } else {
+ builder.append(AlertI18NFactory.getMessage(
+ AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_OUTSIDE_EXCL_RANGE, loValueFormatted,
+ hiValueFormatted));
+ }
+ } else if ("<=".equals(condition.getComparator())) {
+ if (shortVersion) {
+ builder.append(AlertI18NFactory.getMessage(
+ AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_INSIDE_INCL_RANGE_SHORT, loValueFormatted,
+ hiValueFormatted));
+ } else {
+ builder.append(AlertI18NFactory.getMessage(
+ AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_INSIDE_INCL_RANGE, loValueFormatted,
+ hiValueFormatted));
+ }
+ } else if (">=".equals(condition.getComparator())) {
+ if (shortVersion) {
+ builder.append(AlertI18NFactory.getMessage(
+ AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_OUTSIDE_INCL_RANGE_SHORT, loValueFormatted,
+ hiValueFormatted));
+ } else {
+ builder.append(AlertI18NFactory.getMessage(
+ AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_OUTSIDE_INCL_RANGE, loValueFormatted,
+ hiValueFormatted));
+ }
+ } else {
+ builder.append("invalid range comparator [" + condition.getComparator() + "] (" + loValueFormatted
+ + "," + hiValueFormatted + ")");
+ }
} else {
// do nothing
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java
index 21409e5..62994a0 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java
@@ -34,6 +34,7 @@ import org.rhq.core.domain.alert.composite.AlertConditionBaselineCategoryComposi
import org.rhq.core.domain.alert.composite.AlertConditionChangesCategoryComposite;
import org.rhq.core.domain.alert.composite.AlertConditionDriftCategoryComposite;
import org.rhq.core.domain.alert.composite.AlertConditionEventCategoryComposite;
+import org.rhq.core.domain.alert.composite.AlertConditionRangeCategoryComposite;
import org.rhq.core.domain.alert.composite.AlertConditionScheduleCategoryComposite;
import org.rhq.core.domain.alert.composite.AlertConditionTraitCategoryComposite;
import org.rhq.core.domain.auth.Subject;
@@ -60,6 +61,7 @@ import org.rhq.enterprise.server.alert.engine.model.EventCacheElement;
import org.rhq.enterprise.server.alert.engine.model.InvalidCacheElementException;
import org.rhq.enterprise.server.alert.engine.model.MeasurementBaselineCacheElement;
import org.rhq.enterprise.server.alert.engine.model.MeasurementNumericCacheElement;
+import org.rhq.enterprise.server.alert.engine.model.MeasurementRangeNumericCacheElement;
import org.rhq.enterprise.server.alert.engine.model.MeasurementTraitCacheElement;
import org.rhq.enterprise.server.alert.engine.model.NumericDoubleCacheElement;
import org.rhq.enterprise.server.alert.engine.model.CallTimeDataCacheElement.CallTimeElementValue;
@@ -123,7 +125,7 @@ class AgentConditionCache extends AbstractConditionCache {
EnumSet<AlertConditionCategory> supportedCategories = EnumSet.of(AlertConditionCategory.BASELINE,
AlertConditionCategory.CHANGE, AlertConditionCategory.TRAIT, AlertConditionCategory.THRESHOLD,
- AlertConditionCategory.EVENT, AlertConditionCategory.DRIFT);
+ AlertConditionCategory.EVENT, AlertConditionCategory.DRIFT, AlertConditionCategory.RANGE);
for (AlertConditionCategory nextCategory : supportedCategories) {
// page thru all alert definitions
@@ -189,7 +191,7 @@ class AgentConditionCache extends AbstractConditionCache {
addTo("callTimeDataCache", callTimeCache, scheduleId, cacheElement, alertConditionId, stats);
} catch (InvalidCacheElementException icee) {
- log.info("Failed to create NumericDoubleCacheElement with parameters: "
+ log.info("Failed to create CallTimeDataCacheElement with parameters: "
+ AlertConditionCacheUtils.getCacheElementErrorString(alertConditionId, alertConditionOperator,
null, alertCondition.getThreshold()));
}
@@ -204,7 +206,7 @@ class AgentConditionCache extends AbstractConditionCache {
addTo("measurementDataCache", callTimeCache, thresholdComposite.getScheduleId(), cacheElement,
alertConditionId, stats);
} catch (InvalidCacheElementException icee) {
- log.info("Failed to create NumberDoubleCacheElement with parameters: "
+ log.info("Failed to create CallTimeDataCacheElement with parameters: "
+ AlertConditionCacheUtils.getCacheElementErrorString(alertConditionId, alertConditionOperator,
null, alertCondition.getThreshold()));
}
@@ -232,7 +234,7 @@ class AgentConditionCache extends AbstractConditionCache {
addTo("measurementDataCache", measurementDataCache, baselineComposite.getScheduleId(), cacheElement,
alertConditionId, stats);
} catch (InvalidCacheElementException icee) {
- log.info("Failed to create NumericDoubleCacheElement with parameters: "
+ log.info("Failed to create MeasurementBaselineCacheElement with parameters: "
+ AlertConditionCacheUtils.getCacheElementErrorString(alertConditionId, alertConditionOperator,
null, calculatedValue));
}
@@ -248,7 +250,7 @@ class AgentConditionCache extends AbstractConditionCache {
addTo("measurementDataCache", measurementDataCache, scheduleId, cacheElement, alertConditionId, stats);
} catch (InvalidCacheElementException icee) {
- log.info("Failed to create NumericDoubleCacheElement with parameters: "
+ log.info("Failed to create MeasurementNumericCacheElement with parameters: "
+ AlertConditionCacheUtils.getCacheElementErrorString(alertConditionId, alertConditionOperator,
null, numeric));
}
@@ -268,7 +270,7 @@ class AgentConditionCache extends AbstractConditionCache {
addTo("measurementTraitCache", measurementTraitCache, traitsComposite.getScheduleId(), cacheElement,
alertConditionId, stats);
} catch (InvalidCacheElementException icee) {
- log.info("Failed to create StringCacheElement with parameters: "
+ log.info("Failed to create MeasurementTraitCacheElement with parameters: "
+ AlertConditionCacheUtils.getCacheElementErrorString(alertConditionId, alertConditionOperator,
null, value));
}
@@ -282,7 +284,7 @@ class AgentConditionCache extends AbstractConditionCache {
cacheElement = new MeasurementNumericCacheElement(alertConditionOperator, thresholdValue,
alertConditionId);
} catch (InvalidCacheElementException icee) {
- log.info("Failed to create NumberDoubleCacheElement with parameters: "
+ log.info("Failed to create MeasurementNumericCacheElement with parameters: "
+ AlertConditionCacheUtils.getCacheElementErrorString(alertConditionId, alertConditionOperator,
null, thresholdValue));
}
@@ -328,6 +330,34 @@ class AgentConditionCache extends AbstractConditionCache {
+ ", driftPathNameRegex=" + driftPathNameRegexStr);
}
addTo("driftCache", driftCache, driftComposite.getResourceId(), cacheElement, alertConditionId, stats);
+ } else if (alertConditionCategory == AlertConditionCategory.RANGE) {
+ AlertConditionRangeCategoryComposite rangeComposite = (AlertConditionRangeCategoryComposite) composite;
+ Double loValue = alertCondition.getThreshold();
+ String hiValueStr = alertCondition.getOption();
+
+ MeasurementNumericCacheElement cacheElement = null;
+ try {
+ if (hiValueStr == null) {
+ throw new NumberFormatException("The range alert condition is missing the high value");
+ }
+ Double hiValue = Double.valueOf(hiValueStr);
+ cacheElement = new MeasurementRangeNumericCacheElement(alertConditionOperator, loValue, hiValue,
+ alertConditionId);
+ } catch (InvalidCacheElementException icee) {
+ log.info("Failed to create MeasurementRangeNumericCacheElement with parameters: "
+ + AlertConditionCacheUtils.getCacheElementErrorString(alertConditionId, alertConditionOperator,
+ hiValueStr, loValue));
+ } catch (NumberFormatException nfe) {
+ log.info("Failed to create MeasurementRangeNumericCacheElement with parameters: "
+ + AlertConditionCacheUtils.getCacheElementErrorString(alertConditionId, alertConditionOperator,
+ hiValueStr, loValue));
+ }
+
+ if (cacheElement != null) {
+ addTo("measurementDataCache", measurementDataCache, rangeComposite.getScheduleId(), cacheElement,
+ alertConditionId, stats);
+
+ }
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheUtils.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheUtils.java
index 2e3ace3..b20f1a8 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheUtils.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheUtils.java
@@ -49,6 +49,19 @@ class AlertConditionCacheUtils {
return AlertConditionOperator.GREATER_THAN_OR_EQUAL_TO;
}
+ if (category == AlertConditionCategory.RANGE) {
+ // range can support <= and >=, which we look for here. It can also support < and >, which is checked down below further.
+ // note that RANGE does not support =, so we throw an exception if caller tries that
+ if (comparator.equals("<=")) {
+ return AlertConditionOperator.LESS_THAN_OR_EQUAL_TO;
+ } else if (comparator.equals(">=")) {
+ return AlertConditionOperator.GREATER_THAN_OR_EQUAL_TO;
+ } else if (comparator.equals("=")) {
+ throw new UnsupportedAlertConditionOperatorException("Comparator [" + comparator + "] "
+ + "is not supported for category: " + category.name());
+ }
+ }
+
if (category == AlertConditionCategory.DRIFT) {
// any drift that is detected infers a change to its previous state
return AlertConditionOperator.CHANGES;
@@ -89,8 +102,8 @@ class AlertConditionCacheUtils {
} else if (comparator.equals("=")) {
return AlertConditionOperator.EQUALS;
} else {
- throw new UnsupportedAlertConditionOperatorException("Comparator '" + comparator + "' "
- + "is not supported for ArtifactConditionCategory." + category.name());
+ throw new UnsupportedAlertConditionOperatorException("Comparator [" + comparator + "] "
+ + "is not supported for category: " + category.name());
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/MeasurementRangeNumericCacheElement.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/MeasurementRangeNumericCacheElement.java
new file mode 100644
index 0000000..c5439e0
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/MeasurementRangeNumericCacheElement.java
@@ -0,0 +1,95 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.alert.engine.model;
+
+public class MeasurementRangeNumericCacheElement extends MeasurementNumericCacheElement {
+
+ public MeasurementRangeNumericCacheElement(AlertConditionOperator operator, Double loValue, Double hiValue,
+ int conditionTriggerId) {
+ super(operator, loValue, conditionTriggerId);
+ this.alertConditionOperatorOption = hiValue;
+ }
+
+ @Override
+ public boolean matches(Double providedValue, Object... extraParams) {
+ // this.alertConditionValue is the low value of the range
+ // this.alertConditionOperationOption is the high value of the range
+ // both must be specified, if either are null, return false (non-match)
+
+ if (alertConditionValue == null || alertConditionValue.isNaN() || alertConditionValue.isInfinite()) {
+ return false;
+ }
+ if (alertConditionOperatorOption == null) {
+ return false;
+ }
+
+ if (providedValue == null || providedValue.isNaN() || providedValue.isInfinite()) {
+ return false;
+ }
+
+ // there are two ways we can check the value compared to the range, each with either inclusivness or exclusivness.
+ // inclusive means if value equals either the lo or hi, it is considered inside the range.
+ // exclusive means if value equals either the lo or hi, it is NOT considered inside the range, it is outside the range
+ // < - if the value is inside the range (i.e. between the low and high values), exclusive
+ // > - if the value is outside the range (i.e. lower than the low value or higher than the high value), exclusive
+ // <= - if the value is inside the range (i.e. between the low and high values), inclusive
+ // >= - if the value is outside the range (i.e. lower than the low value or higher than the high value), inclusive
+ // Example:
+ // Given a value of 20, with a low-high range of 20...50.
+ // < (inside, exclusive) - NO match - 20 is not considered inside the range but we are looking for values inside the range
+ // > (outside, exclusive) - MATCH - 20 is not considered inside the range and we are looking for values outside the range
+ // <= (inside, inclusive) - MATCH - 20 is considered inside the range and we are looking for values inside the range
+ // >= (outside, inclusive) - NO match - 20 is considered inside the range but we are looking for values outside the range
+
+ if (alertConditionOperator == AlertConditionOperator.LESS_THAN) {
+ if ((providedValue.compareTo(this.alertConditionValue) > 0)
+ && (providedValue.compareTo((Double) this.alertConditionOperatorOption) < 0)) {
+ return true;
+ }
+ } else if (alertConditionOperator == AlertConditionOperator.GREATER_THAN) {
+ if (!((providedValue.compareTo(this.alertConditionValue) > 0) && (providedValue
+ .compareTo((Double) this.alertConditionOperatorOption) < 0))) {
+ return true;
+ }
+ } else if (alertConditionOperator == AlertConditionOperator.LESS_THAN_OR_EQUAL_TO) {
+ if ((providedValue.compareTo(this.alertConditionValue) >= 0)
+ && (providedValue.compareTo((Double) this.alertConditionOperatorOption) <= 0)) {
+ return true;
+ }
+ } else if (alertConditionOperator == AlertConditionOperator.GREATER_THAN_OR_EQUAL_TO) {
+ if (!((providedValue.compareTo(this.alertConditionValue) >= 0) && (providedValue
+ .compareTo((Double) this.alertConditionOperatorOption) <= 0))) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ @Override
+ public AlertConditionOperator.Type getOperatorSupportsType(AlertConditionOperator operator) {
+ if ((operator == AlertConditionOperator.GREATER_THAN) || (operator == AlertConditionOperator.LESS_THAN)
+ || (operator == AlertConditionOperator.GREATER_THAN_OR_EQUAL_TO)
+ || (operator == AlertConditionOperator.LESS_THAN_OR_EQUAL_TO)) {
+ return operator.getDefaultType();
+ }
+
+ return AlertConditionOperator.Type.NONE;
+ }
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/i18n/AlertI18NResourceKeys.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/i18n/AlertI18NResourceKeys.java
index fb5f392..d48f93a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/i18n/AlertI18NResourceKeys.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/i18n/AlertI18NResourceKeys.java
@@ -28,6 +28,38 @@ import mazz.i18n.annotation.I18NResourceBundle;
@I18NResourceBundle(baseName = "alert-messages", defaultLocale = "en")
public interface AlertI18NResourceKeys {
+ @I18NMessages( { @I18NMessage("value is between {0} and {1}, inclusive"),
+ @I18NMessage(locale = "de", value = "Der Wert zwischen {0} und {1}, pauschal") })
+ String ALERT_CONFIG_PROPS_CB_INSIDE_INCL_RANGE = "alert.config.props.CB.InsideRange.incl.";
+
+ @I18NMessages( { @I18NMessage("between {0} and {1}, incl"),
+ @I18NMessage(locale = "de", value = "zwischen {0} und {1}, paus") })
+ String ALERT_CONFIG_PROPS_CB_INSIDE_INCL_RANGE_SHORT = "alert.config.props.CB.InsideRange.incl.short";
+
+ @I18NMessages( { @I18NMessage("value is between {0} and {1}, exclusive"),
+ @I18NMessage(locale = "de", value = "Der Wert zwischen {0} und {1}, exklusiv") })
+ String ALERT_CONFIG_PROPS_CB_INSIDE_EXCL_RANGE = "alert.config.props.CB.InsideRange.excl";
+
+ @I18NMessages( { @I18NMessage("between {0} and {1}, excl"),
+ @I18NMessage(locale = "de", value = "zwischen {0} und {1}, exkl.") })
+ String ALERT_CONFIG_PROPS_CB_INSIDE_EXCL_RANGE_SHORT = "alert.config.props.CB.InsideRange.excl.short";
+
+ @I18NMessages( { @I18NMessage("value is outside {0} and {1}, inclusive"),
+ @I18NMessage(locale = "de", value = "Der Wert auÃerhalb {0} und {1}, pauschal") })
+ String ALERT_CONFIG_PROPS_CB_OUTSIDE_INCL_RANGE = "alert.config.props.CB.OutsideRange.incl";
+
+ @I18NMessages( { @I18NMessage("outside {0} and {1}, incl"),
+ @I18NMessage(locale = "de", value = "auÃerhalb {0} und {1}, paus") })
+ String ALERT_CONFIG_PROPS_CB_OUTSIDE_INCL_RANGE_SHORT = "alert.config.props.CB.OutsideRange.incl.short";
+
+ @I18NMessages( { @I18NMessage("value is outside {0} and {1}, exclusive"),
+ @I18NMessage(locale = "de", value = "Der Wert auÃerhalb {0} und {1}, exklusiv") })
+ String ALERT_CONFIG_PROPS_CB_OUTSIDE_EXCL_RANGE = "alert.config.props.CB.OutsideRange.excl";
+
+ @I18NMessages( { @I18NMessage("outside {0} and {1}, excl"),
+ @I18NMessage(locale = "de", value = "auÃerhalb {0} und {1}, exkl") })
+ String ALERT_CONFIG_PROPS_CB_OUTSIDE_EXCL_RANGE_SHORT = "alert.config.props.CB.OutsideRange.excl.short";
+
@I18NMessages( { @I18NMessage("Drift detected"), @I18NMessage(locale = "de", value = "Ãnderung erkannt") })
String ALERT_CONFIG_PROPS_CB_DRIFT = "alert.config.props.CB.Drift";
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/engine/model/MeasurementRangeNumericCacheElementTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/engine/model/MeasurementRangeNumericCacheElementTest.java
new file mode 100644
index 0000000..075b510
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/engine/model/MeasurementRangeNumericCacheElementTest.java
@@ -0,0 +1,96 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.alert.engine.model;
+
+import org.testng.annotations.Test;
+
+/**
+ * there are two ways we can check the value compared to the range, each with either inclusivness or exclusivness.
+ * inclusive means if value equals either the lo or hi, it is considered inside the range.
+ * exclusive means if value equals either the lo or hi, it is NOT considered inside the range, it is outside the range
+ * < - if the value is inside the range (i.e. between the low and high values), exclusive
+ * > - if the value is outside the range (i.e. lower than the low value or higher than the high value), exclusive
+ * <= - if the value is inside the range (i.e. between the low and high values), inclusive
+ * >= - if the value is outside the range (i.e. lower than the low value or higher than the high value), inclusive
+ *
+ * Example:
+ * Given a value of 20, with a low-high range of 20...50.
+ * < (inside, exclusive) - NO match - 20 is not considered inside the range but we are looking for values inside the range
+ * > (outside, exclusive) - MATCH - 20 is not considered inside the range and we are looking for values outside the range
+ * <= (inside, inclusive) - MATCH - 20 is considered inside the range and we are looking for values inside the range
+ * >= (outside, inclusive) - NO match - 20 is considered inside the range but we are looking for values outside the range
+ */
+@Test
+public class MeasurementRangeNumericCacheElementTest {
+ private final Double lo = Double.valueOf(20.0);
+ private final Double hi = Double.valueOf(50.0);
+ private final Double inside = Double.valueOf(30.0); // inside the range
+ private final Double outsideLo = Double.valueOf(1.0); // outside the range on the lo side
+ private final Double outsideHi = Double.valueOf(111.0); // outside the range on the hi side
+
+ public void testInsideExclusive() {
+ MeasurementRangeNumericCacheElement ele = createCacheElement(AlertConditionOperator.LESS_THAN);
+ assert true == ele.matches(inside);
+ assert false == ele.matches(outsideLo);
+ assert false == ele.matches(outsideHi);
+ assert false == ele.matches(lo);
+ assert false == ele.matches(hi);
+ }
+
+ public void testOutsideExclusive() {
+ MeasurementRangeNumericCacheElement ele = createCacheElement(AlertConditionOperator.GREATER_THAN);
+ assert false == ele.matches(inside);
+ assert true == ele.matches(outsideLo);
+ assert true == ele.matches(outsideHi);
+ assert true == ele.matches(lo);
+ assert true == ele.matches(hi);
+ }
+
+ public void testInsideInclusive() {
+ MeasurementRangeNumericCacheElement ele = createCacheElement(AlertConditionOperator.LESS_THAN_OR_EQUAL_TO);
+ assert true == ele.matches(inside);
+ assert false == ele.matches(outsideLo);
+ assert false == ele.matches(outsideHi);
+ assert true == ele.matches(lo);
+ assert true == ele.matches(hi);
+ }
+
+ public void testOutsideInclusive() {
+ MeasurementRangeNumericCacheElement ele = createCacheElement(AlertConditionOperator.GREATER_THAN_OR_EQUAL_TO);
+ assert false == ele.matches(inside);
+ assert true == ele.matches(outsideLo);
+ assert true == ele.matches(outsideHi);
+ assert false == ele.matches(lo);
+ assert false == ele.matches(hi);
+ }
+
+ public void testUnsupportedComparator() {
+ try {
+ createCacheElement(AlertConditionOperator.EQUALS);
+ assert false : "should not be able to support EQUALS";
+ } catch (Exception ok) {
+ // this is OK and to be expected
+ }
+ }
+
+ private MeasurementRangeNumericCacheElement createCacheElement(AlertConditionOperator op) {
+ return new MeasurementRangeNumericCacheElement(op, lo, hi, 0);
+ }
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
index 7486a5f..b6c7206 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
@@ -97,16 +97,16 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
System.setProperty(RHQ_SERVER_NAME_PROPERTY, "");
}
- public void testBZ735262_RangeCondition() throws Exception {
+ public void testBZ735262_InsideRangeCondition() throws Exception {
// create our resource with alert definition
MeasurementDefinition metricDef = createResourceWithMetricSchedule();
- createAlertDefinitionWithTwoConditionsALL(metricDef, resource.getId());
+ createAlertDefinitionWithOneInsideRangeCondition(metricDef, resource.getId()); // this test would fail if we used createAlertDefinitionWithTwoConditionsALL
// re-load the resource so we get the measurement schedule
Resource resourceWithSchedules = loadResourceWithSchedules(resource.getId());
MeasurementSchedule schedule = resourceWithSchedules.getSchedules().iterator().next();
- // simulate a measurement report coming from the agent
+ // simulate a measurement report coming from the agent - two values, but neither fit in our range, so no alerts are fired
MeasurementScheduleRequest request = new MeasurementScheduleRequest(schedule);
MeasurementReport report = new MeasurementReport();
report.addData(new MeasurementDataNumeric(getTimestamp(60), request, Double.valueOf(20.0))); // 20 < 60 but !(20 > 40)
@@ -121,16 +121,56 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
PageList<Alert> alerts = getAlerts(resourceWithSchedules.getId());
assert alerts.size() == 0 : "no alerts should have fired: " + alerts;
- // purge the resource fully, which should remove all alert defs and alert conditions and condition logs
- int resourceId = resource.getId();
- deleteNewResource(resource);
- resource = null;
+ // simulate another measurement report coming from the agent - one values that fits in our range, so 1 alert is fired
+ request = new MeasurementScheduleRequest(schedule);
+ report = new MeasurementReport();
+ report.addData(new MeasurementDataNumeric(getTimestamp(15), request, Double.valueOf(50.0))); // 50 < 60 AND 50 > 40
+ dataManager.mergeMeasurementReport(report);
- AlertDefinitionManagerLocal alertDefManager = LookupUtil.getAlertDefinitionManager();
- PageList<AlertDefinition> defs = alertDefManager.findAlertDefinitions(getOverlord(), resourceId, PageControl
- .getUnlimitedInstance());
- assert defs.isEmpty() : "failed to delete the alert definition - are condition logs still around?";
+ // wait for our JMS messages to process and see if we get any alerts
+ Thread.sleep(5000);
+ // make sure one alert was triggered
+ alerts = getAlerts(resourceWithSchedules.getId());
+ assert alerts.size() == 1 : "1 alert should have fired: " + alerts;
+ return;
+ }
+
+ public void testBZ735262_OutsideRangeCondition() throws Exception {
+ // create our resource with alert definition
+ MeasurementDefinition metricDef = createResourceWithMetricSchedule();
+ createAlertDefinitionWithOneOutsideRangeCondition(metricDef, resource.getId()); // this test would fail if we used createAlertDefinitionWithTwoConditionsALL
+
+ // re-load the resource so we get the measurement schedule
+ Resource resourceWithSchedules = loadResourceWithSchedules(resource.getId());
+ MeasurementSchedule schedule = resourceWithSchedules.getSchedules().iterator().next();
+
+ // simulate a measurement report coming from the agent - one value that is inside our range, so no alerts are fired
+ MeasurementScheduleRequest request = new MeasurementScheduleRequest(schedule);
+ MeasurementReport report = new MeasurementReport();
+ report.addData(new MeasurementDataNumeric(getTimestamp(60), request, Double.valueOf(50.0))); // 50 is inside the range 40...60
+ MeasurementDataManagerLocal dataManager = LookupUtil.getMeasurementDataManager();
+ dataManager.mergeMeasurementReport(report);
+
+ // wait for our JMS messages to process and see if we get any alerts
+ Thread.sleep(5000);
+
+ // make sure no alert was triggered
+ PageList<Alert> alerts = getAlerts(resourceWithSchedules.getId());
+ assert alerts.size() == 0 : "no alerts should have fired: " + alerts;
+
+ // simulate another measurement report coming from the agent - one value that is outside the range, so 1 alert is fired
+ request = new MeasurementScheduleRequest(schedule);
+ report = new MeasurementReport();
+ report.addData(new MeasurementDataNumeric(getTimestamp(15), request, Double.valueOf(20.0))); // 20 is outside 40...60
+ dataManager.mergeMeasurementReport(report);
+
+ // wait for our JMS messages to process and see if we get any alerts
+ Thread.sleep(5000);
+
+ // make sure one alert was triggered
+ alerts = getAlerts(resourceWithSchedules.getId());
+ assert alerts.size() == 1 : "1 alert should have fired: " + alerts;
return;
}
@@ -256,6 +296,74 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
return alertDefinition;
}
+ private AlertDefinition createAlertDefinitionWithOneInsideRangeCondition(MeasurementDefinition metricDef,
+ int resourceId) {
+ // create alert definition with the range condition "metric value between 40...60"
+ HashSet<AlertCondition> conditions = new HashSet<AlertCondition>(1);
+ AlertCondition cond1 = new AlertCondition();
+ cond1.setCategory(AlertConditionCategory.RANGE);
+ cond1.setName(metricDef.getDisplayName());
+ cond1.setThreshold(Double.valueOf(40.0)); // threshold is always the low value of the range
+ cond1.setOption(Double.valueOf(60.0).toString()); // option is a stringified double that is always the high value of the range
+ cond1.setComparator("<"); // the value must be inside the range
+ cond1.setMeasurementDefinition(metricDef);
+ conditions.add(cond1);
+
+ AlertDefinition alertDefinition = new AlertDefinition();
+ alertDefinition.setName("one inside-range condition alert");
+ alertDefinition.setEnabled(true);
+ alertDefinition.setPriority(AlertPriority.HIGH);
+ alertDefinition.setAlertDampening(new AlertDampening(Category.NONE));
+ alertDefinition.setRecoveryId(Integer.valueOf(0));
+ alertDefinition.setConditionExpression(BooleanExpression.ALL);
+ alertDefinition.setConditions(conditions);
+
+ AlertDefinitionManagerLocal alertDefManager = LookupUtil.getAlertDefinitionManager();
+ int defId = alertDefManager.createAlertDefinition(getOverlord(), alertDefinition, resourceId);
+ alertDefinition = alertDefManager.getAlertDefinition(getOverlord(), defId); // load it back so we get its ID and all condition IDs
+ assert alertDefinition != null && alertDefinition.getId() > 0 : "did not persist alert def properly: "
+ + alertDefinition;
+
+ // now that we created an alert def, we have to reload the alert condition cache
+ reloadAllAlertConditionCaches();
+
+ return alertDefinition;
+ }
+
+ private AlertDefinition createAlertDefinitionWithOneOutsideRangeCondition(MeasurementDefinition metricDef,
+ int resourceId) {
+ // create alert definition with the range condition "metric value outside 40...60"
+ HashSet<AlertCondition> conditions = new HashSet<AlertCondition>(1);
+ AlertCondition cond1 = new AlertCondition();
+ cond1.setCategory(AlertConditionCategory.RANGE);
+ cond1.setName(metricDef.getDisplayName());
+ cond1.setThreshold(Double.valueOf(40.0)); // threshold is always the low value of the range
+ cond1.setOption(Double.valueOf(60.0).toString()); // option is a stringified double that is always the high value of the range
+ cond1.setComparator(">"); // the value must be outside the range
+ cond1.setMeasurementDefinition(metricDef);
+ conditions.add(cond1);
+
+ AlertDefinition alertDefinition = new AlertDefinition();
+ alertDefinition.setName("one outside-range condition alert");
+ alertDefinition.setEnabled(true);
+ alertDefinition.setPriority(AlertPriority.HIGH);
+ alertDefinition.setAlertDampening(new AlertDampening(Category.NONE));
+ alertDefinition.setRecoveryId(Integer.valueOf(0));
+ alertDefinition.setConditionExpression(BooleanExpression.ALL);
+ alertDefinition.setConditions(conditions);
+
+ AlertDefinitionManagerLocal alertDefManager = LookupUtil.getAlertDefinitionManager();
+ int defId = alertDefManager.createAlertDefinition(getOverlord(), alertDefinition, resourceId);
+ alertDefinition = alertDefManager.getAlertDefinition(getOverlord(), defId); // load it back so we get its ID and all condition IDs
+ assert alertDefinition != null && alertDefinition.getId() > 0 : "did not persist alert def properly: "
+ + alertDefinition;
+
+ // now that we created an alert def, we have to reload the alert condition cache
+ reloadAllAlertConditionCaches();
+
+ return alertDefinition;
+ }
+
/**
* Creates a resource, stores it in the "resource" data field and returns the measurement definition
* that the schedule is for.
commit 70a43d5e6ca8407bc5c0defb134462bff9f8fe4a
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Sep 8 17:07:44 2011 -0400
[BZ 736848] add new method to LinkManager that can return the appropriate form of group URL given an EntityContext; update several spots in the code to start using this new method to ensure the correct form of URL is used for the different types of compat groups (https://bugzilla.redhat.com/show_bug.cgi?id=736848)
(cherry picked from commit 34cb25f075a22714af01ea08cd0de453b638a139)
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
index 63535a8..fa9fa06 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2010 Red Hat, Inc.
+ * Copyright (C) 2005-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -101,8 +101,39 @@ public class LinkManager {
return link;
}
- public static String getResourcePluginConfigurationUpdateHistoryLink(int groupId) {
- return getResourceLink(groupId) + "/Inventory/ConnectionSettingsHistory";
+ public static String getEntityTabLink(EntityContext entityContext, String tabName, String subTabName) {
+ String link;
+ switch (entityContext.getType()) {
+ case Resource:
+ link = getResourceTabLink(entityContext.getResourceId(), tabName, subTabName);
+ break;
+ case ResourceGroup:
+ if (entityContext.isAutoGroup()) {
+ link = getAutoGroupTabLink(entityContext.getGroupId(), tabName, subTabName);
+ } else if (entityContext.isAutoCluster()) {
+ link = getAutoClusterTabLink(entityContext.getGroupId(), tabName, subTabName);
+ } else {
+ link = getResourceGroupTabLink(entityContext.getGroupId(), tabName, subTabName);
+ }
+ break;
+ case SubsystemView:
+ if (tabName.equals("Alerts") && subTabName.equals("Definitions")) {
+ link = "#Reports/Subsystems/AlertDefinitions";
+ } else if (tabName.equals("Alerts") && subTabName.equals("History")) {
+ link = "#Reports/Subsystems/RecentAlerts";
+ } else if (tabName.equals("Operations") && subTabName.equals("History")) {
+ link = "#Reports/Subsystems/RecentOperations";
+ } else if (tabName.equals("Configuration") && subTabName.equals("History")) {
+ link = "#Reports/Subsystems/ConfigurationHistoryView";
+ } else {
+ throw new IllegalArgumentException("Subsystem link not supported for tab " + tabName + ">"
+ + subTabName + ".");
+ }
+ break;
+ default:
+ throw new IllegalArgumentException("Unsupported entity context type: " + entityContext.getType());
+ }
+ return link;
}
public static String getGroupPluginConfigurationUpdateHistoryLink(int groupId, Integer groupUpdateHistoryId) {
@@ -200,18 +231,7 @@ public class LinkManager {
public static String getAlertDetailLink(EntityContext entityContext, int alertId) {
String link;
if (GWT) {
- String baseLink = getResourceLink(entityContext.getResourceId());
- switch (entityContext.getType()) {
- case Resource:
- baseLink = getResourceTabLink(entityContext.getResourceId(), "Alerts", "History");
- break;
- case ResourceGroup:
- baseLink = getResourceGroupTabLink(entityContext.getGroupId(), "Alerts", "History");
- break;
- case SubsystemView:
- baseLink = "#Reports/Subsystems/RecentAlerts";
- break;
- }
+ String baseLink = getEntityTabLink(entityContext, "Alerts", "History");
link = baseLink + "/" + alertId;
} else {
link = null; // TODO
@@ -273,7 +293,7 @@ public class LinkManager {
public static String getHubServerssLink() {
if (GWT) {
- return "#Inventory/Serers";
+ return "#Inventory/Servers";
} else {
return "/rhq/inventory/browseResources.xhtml?subtab=server";
}
@@ -321,7 +341,7 @@ public class LinkManager {
public static String getAdminUsersLink() {
if (GWT) {
- return "#Administration/Security/Manage Users";
+ return "#Administration/Security/Users";
} else {
return "/admin/user/UserAdmin.do?mode=list";
}
@@ -329,7 +349,7 @@ public class LinkManager {
public static String getAdminRolesLink() {
if (GWT) {
- return "#Administration/Security/Manage Roles";
+ return "#Administration/Security/Roles";
} else {
return "/admin/role/RoleAdmin.do?mode=list";
}
@@ -474,4 +494,5 @@ public class LinkManager {
public static String getDriftConfigurationLink(int resourceId, int driftConfigId) {
return "#Resource/" + resourceId + "/Drift/Configuration/" + driftConfigId;
}
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java
index 6f552c8..3d973d5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java
@@ -184,16 +184,7 @@ public class ResourceGroupContextMenu extends LocatableMenu {
if (pluginConfigEnabled) {
pluginConfiguration.addClickHandler(new ClickHandler() {
public void onClick(MenuItemClickEvent event) {
- if (isAutoGroup) {
- CoreGUI.goToView(LinkManager.getAutoGroupTabLink(group.getId(), "Inventory",
- "ConnectionSettings"));
- } else if (isAutoCluster) {
- CoreGUI.goToView(LinkManager.getAutoClusterTabLink(group.getId(), "Inventory",
- "ConnectionSettings"));
- } else {
- CoreGUI.goToView(LinkManager.getResourceGroupTabLink(group.getId(), "Inventory",
- "ConnectionSettings"));
- }
+ CoreGUI.goToView(LinkManager.getResourceGroupTabLink(group, "Inventory", "ConnectionSettings"));
}
});
}
@@ -207,14 +198,7 @@ public class ResourceGroupContextMenu extends LocatableMenu {
if (resourceConfigEnabled) {
resourceConfiguration.addClickHandler(new ClickHandler() {
public void onClick(MenuItemClickEvent event) {
- if (isAutoGroup) {
- CoreGUI.goToView(LinkManager.getAutoGroupTabLink(group.getId(), "Configuration", "Current"));
- } else if (isAutoCluster) {
- CoreGUI.goToView(LinkManager.getAutoClusterTabLink(group.getId(), "Configuration", "Current"));
- } else {
- CoreGUI
- .goToView(LinkManager.getResourceGroupTabLink(group.getId(), "Configuration", "Current"));
- }
+ CoreGUI.goToView(LinkManager.getResourceGroupTabLink(group, "Configuration", "Current"));
}
});
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/GroupResourceConfigurationEditView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/GroupResourceConfigurationEditView.java
index efddea7..0be3378 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/GroupResourceConfigurationEditView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/GroupResourceConfigurationEditView.java
@@ -211,7 +211,7 @@ public class GroupResourceConfigurationEditView extends LocatableVLayout impleme
}
public void onSuccess(Void result) {
- String configHistoryUrl = LinkManager.getResourceGroupTabLink(group.getId(),
+ String configHistoryUrl = LinkManager.getResourceGroupTabLink(group,
ResourceDetailView.Tab.CONFIGURATION, ResourceDetailView.ConfigurationSubTab.HISTORY);
String configHistoryView = configHistoryUrl.substring(1); // chop off the leading '#'
Message message = new Message(MSG.view_group_resConfig_edit_saveInitiated_concise(), MSG
commit f4ff63650e68b5684e7c5f2826528f885ed03fbc
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 8 14:22:00 2011 -0400
refactor to make some of the helper methods more generic
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
index 59b91c8..7486a5f 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
@@ -100,10 +100,10 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
public void testBZ735262_RangeCondition() throws Exception {
// create our resource with alert definition
MeasurementDefinition metricDef = createResourceWithMetricSchedule();
- createAlertDefinitionWithTwoConditionsALL(metricDef);
+ createAlertDefinitionWithTwoConditionsALL(metricDef, resource.getId());
// re-load the resource so we get the measurement schedule
- Resource resourceWithSchedules = loadResourceWithSchedules();
+ Resource resourceWithSchedules = loadResourceWithSchedules(resource.getId());
MeasurementSchedule schedule = resourceWithSchedules.getSchedules().iterator().next();
// simulate a measurement report coming from the agent
@@ -118,11 +118,8 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
Thread.sleep(5000);
// make sure no alert was triggered
- AlertManagerLocal alertManager = LookupUtil.getAlertManager();
- AlertCriteria alertCriteria = new AlertCriteria();
- alertCriteria.addFilterResourceIds(resourceWithSchedules.getId());
- PageList<Alert> alerts = alertManager.findAlertsByCriteria(getOverlord(), alertCriteria);
- assert alerts.size() == 0 : "0 alert should have fired: " + alerts;
+ PageList<Alert> alerts = getAlerts(resourceWithSchedules.getId());
+ assert alerts.size() == 0 : "no alerts should have fired: " + alerts;
// purge the resource fully, which should remove all alert defs and alert conditions and condition logs
int resourceId = resource.getId();
@@ -140,10 +137,10 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
public void testBZ736685_DeleteConditionLogButNoAlert() throws Exception {
// create our resource with alert definition
MeasurementDefinition metricDef = createResourceWithMetricSchedule();
- AlertDefinition alertDef = createAlertDefinitionWithTwoConditionsALL(metricDef);
+ AlertDefinition alertDef = createAlertDefinitionWithTwoConditionsALL(metricDef, resource.getId());
// re-load the resource so we get the measurement schedule
- Resource resourceWithSchedules = loadResourceWithSchedules();
+ Resource resourceWithSchedules = loadResourceWithSchedules(resource.getId());
MeasurementSchedule schedule = resourceWithSchedules.getSchedules().iterator().next();
// simulate a measurement report coming from the agent
@@ -157,12 +154,8 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
// wait for our JMS messages to process and see if we get any alerts
Thread.sleep(5000);
- // make sure no alert was triggered...
- AlertManagerLocal alertManager = LookupUtil.getAlertManager();
- AlertCriteria alertCriteria = new AlertCriteria();
- alertCriteria.addFilterResourceIds(resourceWithSchedules.getId());
- PageList<Alert> alerts = alertManager.findAlertsByCriteria(getOverlord(), alertCriteria);
- assert alerts.size() == 0 : "0 alert should have fired: " + alerts;
+ PageList<Alert> alerts = getAlerts(resourceWithSchedules.getId());
+ assert alerts.size() == 0 : "no alerts should have fired: " + alerts;
// ...but make sure a condition was true (the condition we know is true is "< 60")
int condId = 0;
@@ -192,6 +185,14 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
return;
}
+ private PageList<Alert> getAlerts(int resourceId) {
+ AlertManagerLocal alertManager = LookupUtil.getAlertManager();
+ AlertCriteria alertCriteria = new AlertCriteria();
+ alertCriteria.addFilterResourceIds(resourceId);
+ PageList<Alert> alerts = alertManager.findAlertsByCriteria(getOverlord(), alertCriteria);
+ return alerts;
+ }
+
private AlertCondition getAlertConditionWithLogs(final int conditionId) {
return JPAUtils.executeInTransaction(new TransactionCallbackWithContext<AlertCondition>() {
@Override
@@ -203,9 +204,9 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
});
}
- private Resource loadResourceWithSchedules() {
+ private Resource loadResourceWithSchedules(int resourceId) {
ResourceCriteria resourceCriteria = new ResourceCriteria();
- resourceCriteria.addFilterId(resource.getId());
+ resourceCriteria.addFilterId(resourceId);
resourceCriteria.fetchSchedules(true);
Resource resourceWithSchedules = getResource(resourceCriteria);
assert resourceWithSchedules != null : "could not obtain resource from DB";
@@ -213,7 +214,7 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
return resourceWithSchedules;
}
- private AlertDefinition createAlertDefinitionWithTwoConditionsALL(MeasurementDefinition metricDef) {
+ private AlertDefinition createAlertDefinitionWithTwoConditionsALL(MeasurementDefinition metricDef, int resourceId) {
// create alert definition with the conditions "metric value > 40 AND metric value < 60"
HashSet<AlertCondition> conditions = new HashSet<AlertCondition>(2);
AlertCondition cond1 = new AlertCondition();
@@ -244,7 +245,7 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
alertDefinition.setConditions(conditions);
AlertDefinitionManagerLocal alertDefManager = LookupUtil.getAlertDefinitionManager();
- int defId = alertDefManager.createAlertDefinition(getOverlord(), alertDefinition, resource.getId());
+ int defId = alertDefManager.createAlertDefinition(getOverlord(), alertDefinition, resourceId);
alertDefinition = alertDefManager.getAlertDefinition(getOverlord(), defId); // load it back so we get its ID and all condition IDs
assert alertDefinition != null && alertDefinition.getId() > 0 : "did not persist alert def properly: "
+ alertDefinition;
@@ -255,6 +256,13 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
return alertDefinition;
}
+ /**
+ * Creates a resource, stores it in the "resource" data field and returns the measurement definition
+ * that the schedule is for.
+ *
+ * @return measurement definition that was used to create the schedule for the new resource
+ * @throws Exception
+ */
private MeasurementDefinition createResourceWithMetricSchedule() throws Exception {
registerPlugin("type-with-metric.xml");
ResourceType resourceType = getResourceType("TypeWithMetrics");
commit b2ce7491321d37f84adb8667fefa258504eee0e5
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 8 14:12:32 2011 -0400
add test that shows bug BZ-736685
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
index 1f989b2..59b91c8 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
@@ -97,7 +97,47 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
System.setProperty(RHQ_SERVER_NAME_PROPERTY, "");
}
- public void testBZ736685() throws Exception {
+ public void testBZ735262_RangeCondition() throws Exception {
+ // create our resource with alert definition
+ MeasurementDefinition metricDef = createResourceWithMetricSchedule();
+ createAlertDefinitionWithTwoConditionsALL(metricDef);
+
+ // re-load the resource so we get the measurement schedule
+ Resource resourceWithSchedules = loadResourceWithSchedules();
+ MeasurementSchedule schedule = resourceWithSchedules.getSchedules().iterator().next();
+
+ // simulate a measurement report coming from the agent
+ MeasurementScheduleRequest request = new MeasurementScheduleRequest(schedule);
+ MeasurementReport report = new MeasurementReport();
+ report.addData(new MeasurementDataNumeric(getTimestamp(60), request, Double.valueOf(20.0))); // 20 < 60 but !(20 > 40)
+ report.addData(new MeasurementDataNumeric(getTimestamp(30), request, Double.valueOf(70.0))); // !(70 < 60) but 70 > 40
+ MeasurementDataManagerLocal dataManager = LookupUtil.getMeasurementDataManager();
+ dataManager.mergeMeasurementReport(report);
+
+ // wait for our JMS messages to process and see if we get any alerts
+ Thread.sleep(5000);
+
+ // make sure no alert was triggered
+ AlertManagerLocal alertManager = LookupUtil.getAlertManager();
+ AlertCriteria alertCriteria = new AlertCriteria();
+ alertCriteria.addFilterResourceIds(resourceWithSchedules.getId());
+ PageList<Alert> alerts = alertManager.findAlertsByCriteria(getOverlord(), alertCriteria);
+ assert alerts.size() == 0 : "0 alert should have fired: " + alerts;
+
+ // purge the resource fully, which should remove all alert defs and alert conditions and condition logs
+ int resourceId = resource.getId();
+ deleteNewResource(resource);
+ resource = null;
+
+ AlertDefinitionManagerLocal alertDefManager = LookupUtil.getAlertDefinitionManager();
+ PageList<AlertDefinition> defs = alertDefManager.findAlertDefinitions(getOverlord(), resourceId, PageControl
+ .getUnlimitedInstance());
+ assert defs.isEmpty() : "failed to delete the alert definition - are condition logs still around?";
+
+ return;
+ }
+
+ public void testBZ736685_DeleteConditionLogButNoAlert() throws Exception {
// create our resource with alert definition
MeasurementDefinition metricDef = createResourceWithMetricSchedule();
AlertDefinition alertDef = createAlertDefinitionWithTwoConditionsALL(metricDef);
commit 492396adfd1760234ea1179a5a05ca952d0a5e66
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 8 12:22:28 2011 -0400
make test better
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
index 4769053..1f989b2 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
@@ -20,6 +20,7 @@
package org.rhq.enterprise.server.alert.test;
import java.util.HashSet;
+import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
@@ -33,6 +34,7 @@ import org.testng.annotations.Test;
import org.rhq.core.domain.alert.Alert;
import org.rhq.core.domain.alert.AlertCondition;
import org.rhq.core.domain.alert.AlertConditionCategory;
+import org.rhq.core.domain.alert.AlertConditionLog;
import org.rhq.core.domain.alert.AlertDampening;
import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.alert.AlertPriority;
@@ -96,34 +98,48 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
}
public void testBZ736685() throws Exception {
- // TODO: note that once BZ 735262 is fixed, THIS test will need to be rewritten
- // TODO: since this assumes the bad behavior of 735262 to test 736685
-
// create our resource with alert definition
MeasurementDefinition metricDef = createResourceWithMetricSchedule();
- createAlertDefinitionWithTwoConditionsALL(metricDef);
+ AlertDefinition alertDef = createAlertDefinitionWithTwoConditionsALL(metricDef);
// re-load the resource so we get the measurement schedule
Resource resourceWithSchedules = loadResourceWithSchedules();
MeasurementSchedule schedule = resourceWithSchedules.getSchedules().iterator().next();
- // simulate some measurement reports coming from the agent
+ // simulate a measurement report coming from the agent
+ // with a single metric that makes a condition trigger but does not fire an alert
MeasurementScheduleRequest request = new MeasurementScheduleRequest(schedule);
MeasurementReport report = new MeasurementReport();
- report.addData(new MeasurementDataNumeric(getTimestamp(60), request, Double.valueOf(20.0))); // 20 < 60
- report.addData(new MeasurementDataNumeric(getTimestamp(30), request, Double.valueOf(50.0))); // 50 > 40, 50 < 60
+ report.addData(new MeasurementDataNumeric(getTimestamp(60), request, Double.valueOf(20.0))); // 20 < 60 but !(20 > 40)
MeasurementDataManagerLocal dataManager = LookupUtil.getMeasurementDataManager();
dataManager.mergeMeasurementReport(report);
// wait for our JMS messages to process and see if we get any alerts
Thread.sleep(5000);
+ // make sure no alert was triggered...
AlertManagerLocal alertManager = LookupUtil.getAlertManager();
AlertCriteria alertCriteria = new AlertCriteria();
alertCriteria.addFilterResourceIds(resourceWithSchedules.getId());
PageList<Alert> alerts = alertManager.findAlertsByCriteria(getOverlord(), alertCriteria);
- assert alerts.size() == 1 : "1 alert should have fired: " + alerts;
-
+ assert alerts.size() == 0 : "0 alert should have fired: " + alerts;
+
+ // ...but make sure a condition was true (the condition we know is true is "< 60")
+ int condId = 0;
+ for (AlertCondition cond : alertDef.getConditions()) {
+ if (cond.getComparator().equals("<")) {
+ condId = cond.getId();
+ break;
+ }
+ }
+ assert condId > 0 : "failed to get the condition ID - something is wrong with test setup";
+ AlertCondition conditionWithLogs = getAlertConditionWithLogs(condId); // should eagerly load logs
+ Set<AlertConditionLog> logs = conditionWithLogs.getConditionLogs();
+ assert logs != null && logs.size() > 0 : "missing condition log - we should have one that was generated";
+ AlertConditionLog log = logs.iterator().next();
+ assert log.getAlert() == null : "condition should not have fired an alert: " + logs;
+
+ // purge the resource fully, which should remove all alert defs and alert conditions and condition logs
int resourceId = resource.getId();
deleteNewResource(resource);
resource = null;
@@ -136,6 +152,17 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
return;
}
+ private AlertCondition getAlertConditionWithLogs(final int conditionId) {
+ return JPAUtils.executeInTransaction(new TransactionCallbackWithContext<AlertCondition>() {
+ @Override
+ public AlertCondition execute(TransactionManager tm, EntityManager em) throws Exception {
+ AlertCondition cond = em.find(AlertCondition.class, conditionId);
+ cond.getConditionLogs().size(); // force the load
+ return cond;
+ }
+ });
+ }
+
private Resource loadResourceWithSchedules() {
ResourceCriteria resourceCriteria = new ResourceCriteria();
resourceCriteria.addFilterId(resource.getId());
@@ -146,7 +173,7 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
return resourceWithSchedules;
}
- private void createAlertDefinitionWithTwoConditionsALL(MeasurementDefinition metricDef) {
+ private AlertDefinition createAlertDefinitionWithTwoConditionsALL(MeasurementDefinition metricDef) {
// create alert definition with the conditions "metric value > 40 AND metric value < 60"
HashSet<AlertCondition> conditions = new HashSet<AlertCondition>(2);
AlertCondition cond1 = new AlertCondition();
@@ -178,10 +205,14 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
AlertDefinitionManagerLocal alertDefManager = LookupUtil.getAlertDefinitionManager();
int defId = alertDefManager.createAlertDefinition(getOverlord(), alertDefinition, resource.getId());
- alertDefinition.setId(defId);
+ alertDefinition = alertDefManager.getAlertDefinition(getOverlord(), defId); // load it back so we get its ID and all condition IDs
+ assert alertDefinition != null && alertDefinition.getId() > 0 : "did not persist alert def properly: "
+ + alertDefinition;
// now that we created an alert def, we have to reload the alert condition cache
reloadAllAlertConditionCaches();
+
+ return alertDefinition;
}
private MeasurementDefinition createResourceWithMetricSchedule() throws Exception {
commit bbad56e4cc4bd0e2fae2d7a28e22ed6724162315
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Sep 8 12:09:19 2011 -0400
[BZ 736685 - cannot uninventory resource that has condition log not associated with an alert]
Now deletes condition logs via the alert def, not alerts, because not
every condition log may not yet be associated with an alert. Also, avoids
joining with the potentially large alert table.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionLog.java b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionLog.java
index e5f39c3..d43bb7f 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionLog.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionLog.java
@@ -42,7 +42,7 @@ import javax.persistence.Table;
* @author Joseph Marques
*/
@Entity
-@NamedQueries({
+@NamedQueries( {
@NamedQuery(name = AlertConditionLog.QUERY_FIND_UNMATCHED_LOG_BY_ALERT_CONDITION_ID, //
query = "SELECT acl " //
+ " FROM AlertConditionLog AS acl " //
@@ -63,15 +63,16 @@ import javax.persistence.Table;
+ " FROM Alert a " //
+ " JOIN a.conditionLogs ac" //
+ " WHERE a.id IN ( :alertIds ) )"),
+ // deletes condition logs via the alert def, not alerts, because not every condition log may not
+ // yet be associated with an alert. Also, avoids joining with the potentially large alert table
@NamedQuery(name = AlertConditionLog.QUERY_DELETE_BY_RESOURCES, //
query = "DELETE AlertConditionLog acl " //
- + " WHERE acl.alert.id IN ( SELECT alert.id " //
- + " FROM AlertDefinition ad " //
- + " JOIN ad.alerts alert " //
+ + " WHERE acl.condition.id IN ( SELECT ac.id " //
+ + " FROM AlertCondition ac " //
+ + " JOIN ac.alertDefinition ad " //
+ " WHERE ad.resource.id IN ( :resourceIds ) ))"),
- @NamedQuery(name = AlertConditionLog.QUERY_DELETE_BY_RESOURCE_TEMPLATE,
- query = "DELETE AlertConditionLog log "
- + " WHERE log.alert.id IN (SELECT alert.id "
+ @NamedQuery(name = AlertConditionLog.QUERY_DELETE_BY_RESOURCE_TEMPLATE, //
+ query = "DELETE AlertConditionLog log " + " WHERE log.alert.id IN (SELECT alert.id "
+ " FROM AlertDefinition alertDef "
+ " JOIN alertDef.alerts alert "
+ " WHERE alertDef.resourceType.id = :resourceTypeId)"),
commit 466987b07aa19f5959036ecad23491c8464b091f
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Sep 8 10:05:06 2011 -0400
Som boilerplate for group level drift tab
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
index ca9075f..7756bc1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
@@ -51,6 +51,8 @@ import org.rhq.enterprise.gui.coregui.client.components.tab.TwoLevelTab;
import org.rhq.enterprise.gui.coregui.client.components.tab.TwoLevelTabSelectedEvent;
import org.rhq.enterprise.gui.coregui.client.components.view.ViewFactory;
import org.rhq.enterprise.gui.coregui.client.components.view.ViewName;
+import org.rhq.enterprise.gui.coregui.client.drift.ResourceDriftConfigurationView;
+import org.rhq.enterprise.gui.coregui.client.drift.ResourceDriftHistoryView;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.inventory.InventoryView;
import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.AbstractTwoLevelTabSetView;
@@ -67,6 +69,8 @@ import org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.monitoring.
import org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.operation.history.GroupOperationHistoryListView;
import org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.operation.schedule.GroupOperationScheduleListView;
import org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.summary.ActivityView;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.ResourceDetailView.DriftSubTab;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.ResourceDetailView.Tab;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
@@ -91,6 +95,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
private TwoLevelTab inventoryTab;
private TwoLevelTab operationsTab;
private TwoLevelTab alertsTab;
+ private TwoLevelTab driftTab;
private TwoLevelTab configurationTab;
private TwoLevelTab eventsTab;
@@ -109,6 +114,8 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
private SubTab operationsSchedules;
private SubTab alertHistory;
private SubTab alertDef;
+ private SubTab driftConfig;
+ private SubTab driftHistory;
private SubTab configCurrent;
private SubTab configHistory;
private SubTab eventHistory;
@@ -225,6 +232,15 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
configurationTab.registerSubTabs(this.configCurrent, this.configHistory);
tabs.add(configurationTab);
+ driftTab = new TwoLevelTab(getTabSet().extendLocatorId(Tab.DRIFT), new ViewName(Tab.DRIFT, MSG
+ .view_tabs_common_drift()), "subsystems/drift/Drift_16.png");
+ this.driftHistory = new SubTab(driftTab.extendLocatorId(DriftSubTab.HISTORY), new ViewName(DriftSubTab.HISTORY,
+ MSG.view_tabs_common_history()), null);
+ this.driftConfig = new SubTab(driftTab.extendLocatorId(DriftSubTab.CONFIGURATION), new ViewName(
+ DriftSubTab.CONFIGURATION, MSG.view_tabs_common_configuration()), null);
+ driftTab.registerSubTabs(driftHistory, driftConfig);
+ tabs.add(driftTab);
+
return tabs;
}
@@ -247,6 +263,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
updateOperationsTab(groupCategory, facets);
updateAlertsTab(groupComposite, groupCategory);
updateConfigurationTab(groupId, groupCategory, facets);
+ updateDriftTab(groupComposite, groupCategory, facets);
updateEventsTab(groupComposite, groupCategory, facets);
this.show();
@@ -439,6 +456,29 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
}
}
+ private void updateDriftTab(final ResourceGroupComposite resourceComposite, GroupCategory groupCategory,
+ Set<ResourceTypeFacet> facets) {
+ boolean visible = (groupCategory == GroupCategory.COMPATIBLE && facets.contains(ResourceTypeFacet.DRIFT));
+ Set<Permission> groupPermissions = this.groupComposite.getResourcePermission().getPermissions();
+
+ if (updateTab(this.configurationTab, visible, visible && groupPermissions.contains(Permission.MANAGE_DRIFT))) {
+
+ updateSubTab(this.driftTab, this.driftHistory, true, true, new ViewFactory() {
+ @Override
+ public Canvas createView() {
+ return ResourceDriftHistoryView.get(driftHistory.extendLocatorId("View"), null);
+ }
+ });
+
+ updateSubTab(this.driftTab, this.driftConfig, true, true, new ViewFactory() {
+ @Override
+ public Canvas createView() {
+ return ResourceDriftConfigurationView.get(driftConfig.extendLocatorId("View"), null);
+ }
+ });
+ }
+ }
+
@Override
protected ResourceGroupComposite getSelectedItem() {
return this.groupComposite;
@@ -464,7 +504,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
new AsyncCallback<PageList<ResourceGroupComposite>>() {
public void onFailure(Throwable caught) {
Message message = new Message(MSG.view_group_detail_failLoadComp(String.valueOf(groupId)),
- Message.Severity.Warning);
+ Message.Severity.Warning);
CoreGUI.goToView(InventoryView.VIEW_ID.getName(), message);
}
commit 67405973003c25f95880771b79fe5bb43eb37434
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 8 11:46:25 2011 -0400
create the server entity with a custom name so it doesn't clash with a possibly already existing default one
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
index 32bb678..4769053 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
@@ -25,7 +25,9 @@ import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.transaction.TransactionManager;
+import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.rhq.core.domain.alert.Alert;
@@ -59,6 +61,10 @@ import org.rhq.test.TransactionCallbackWithContext;
@Test
public class AlertConditionTest extends UpdatePluginMetadataTestBase {
+ // this must match the constant found in ServerManagerBean
+ private static final String RHQ_SERVER_NAME_PROPERTY = "rhq.server.high-availability.name";
+ private static final String RHQ_SERVER_NAME_PROPERTY_VALUE = "AlertConditionTestServer";
+
private Resource resource;
private Server server;
@@ -79,6 +85,16 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
return;
}
+ @BeforeClass(alwaysRun = true)
+ public void setSysProp() {
+ System.setProperty(RHQ_SERVER_NAME_PROPERTY, RHQ_SERVER_NAME_PROPERTY_VALUE);
+ }
+
+ @AfterClass(alwaysRun = true)
+ public void unsetSysProp() {
+ System.setProperty(RHQ_SERVER_NAME_PROPERTY, "");
+ }
+
public void testBZ736685() throws Exception {
// TODO: note that once BZ 735262 is fixed, THIS test will need to be rewritten
// TODO: since this assumes the bad behavior of 735262 to test 736685
@@ -210,7 +226,7 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase {
private void createServerIdentity() {
server = new Server();
- server.setName("localhost"); // this is the default assumed in the SLSB code, we must match it
+ server.setName(RHQ_SERVER_NAME_PROPERTY_VALUE);
server.setAddress("localhost");
server.setPort(7080);
server.setSecurePort(7443);
commit be4d0cd2040e2275ad73588b2cfd9a685e80e549
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Sep 8 11:08:01 2011 -0400
[BZ 736439] prevent potential timeout of overlord session
(https://bugzilla.redhat.com/show_bug.cgi?id=736439)
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/AsyncResourceDeleteJob.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/AsyncResourceDeleteJob.java
index 75051c2..888009d 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/AsyncResourceDeleteJob.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/AsyncResourceDeleteJob.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
+ * Copyright (C) 2005-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -37,7 +37,6 @@ public class AsyncResourceDeleteJob extends AbstractStatefulJob {
private final Log log = LogFactory.getLog(AsyncResourceDeleteJob.class);
- Subject overlord = LookupUtil.getSubjectManager().getOverlord();
ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
private class AsyncDeletionStats {
@@ -53,22 +52,26 @@ public class AsyncResourceDeleteJob extends AbstractStatefulJob {
@Override
public void executeJobCode(JobExecutionContext arg0) throws JobExecutionException {
+ Subject overlord = LookupUtil.getSubjectManager().getOverlord();
List<Integer> toBeRemovedIds = resourceManager.findResourcesMarkedForAsyncDeletion(overlord);
AsyncDeletionStats stats = new AsyncDeletionStats();
for (Integer doomedResourceId : toBeRemovedIds) {
try {
+ // Lookup a new overlord subject for each iteration to ensure the overlord session does not timeout
+ // when a large number of Resources are being deleted.
+ overlord = LookupUtil.getSubjectManager().getOverlord();
// do not recurse
uninventoryResource(overlord, doomedResourceId, stats, false);
} catch (Throwable t) {
- log.debug("Simple asynchronous deletion of resource[id=" + doomedResourceId + "] failed, "
- + "trying more robust yet expensive removal method, cause: " + ThrowableUtil.getAllMessages(t));
+ log.debug("Simple asynchronous deletion of resource[id=" + doomedResourceId + "] failed; "
+ + "trying more robust yet expensive removal method - cause: " + ThrowableUtil.getAllMessages(t));
try {
// try more robust yet expensive recursive delete
uninventoryResource(overlord, doomedResourceId, stats, true);
- } catch (Throwable tt) {
+ } catch (RuntimeException re) {
log.debug("Error during asynchronous deletion of resource[id=" + doomedResourceId + "], cause: "
- + ThrowableUtil.getAllMessages(tt));
+ + ThrowableUtil.getAllMessages(re));
stats.deletedWithFailure++;
}
}
@@ -116,9 +119,9 @@ public class AsyncResourceDeleteJob extends AbstractStatefulJob {
* unscheduleResourceOperation already takes care of ignoring requests to delete unknown schedules,
* which would happen if the following sequence occurs:
*
- * - a user tries to delete a resource, gets the list of resource operation schedules - just then, one
- * or more of the schedules completes it's last scheduled firing, and is removed - then we try to
- * unschedule it here, except that the jobid will no longer be known
+ * - a user tries to delete a resource, gets the list of resource operation schedules - just then,
+ * one or more of the schedules completes it's last scheduled firing, and is removed - then we try
+ * to unschedule it here, except that the jobid will no longer be known
*/
operationManager.unscheduleResourceOperation(overlord, schedule.getJobId().toString(), resourceId);
} catch (UnscheduleException ise) {
@@ -131,4 +134,5 @@ public class AsyncResourceDeleteJob extends AbstractStatefulJob {
+ "]; will not attempt to unschedule anything", t);
}
}
+
}
commit ff79822c8ce2cf266374304e5e0b74c557ade870
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Sep 8 10:58:13 2011 -0400
guard against possible NPE; extract constants for fs sys type names
diff --git a/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemDiscoveryComponent.java b/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemDiscoveryComponent.java
index eb10088..b1367b6 100644
--- a/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemDiscoveryComponent.java
+++ b/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemDiscoveryComponent.java
@@ -43,6 +43,9 @@ import org.rhq.core.system.SystemInfo;
@SuppressWarnings({"UnusedDeclaration"})
public class FileSystemDiscoveryComponent implements ResourceDiscoveryComponent<PlatformComponent> {
+ private static final String SYS_TYPE_NAME_LOFS = "lofs";
+ private static final String SYS_TYPE_NAME_TMPFS = "tmpfs";
+
private final Log log = LogFactory.getLog(this.getClass());
public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<PlatformComponent> discoveryContext)
@@ -67,7 +70,7 @@ public class FileSystemDiscoveryComponent implements ResourceDiscoveryComponent<
break;
default:
String sysTypeName = fs.getSysTypeName();
- if (!(sysTypeName.equals("lofs") || sysTypeName.equals("tmpfs"))) {
+ if (!(SYS_TYPE_NAME_LOFS.equals(sysTypeName) || SYS_TYPE_NAME_TMPFS.equals(sysTypeName))) {
continue;
}
}
commit da3676e57a24d816a5143de063169b0559d57473
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Sep 8 10:53:18 2011 -0400
[BZ 553034] fix so Solaris lofs and tmpfs fielsystems are discovered
(https://bugzilla.redhat.com/show_bug.cgi?id=553034)
diff --git a/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemDiscoveryComponent.java b/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemDiscoveryComponent.java
index a12d556..eb10088 100644
--- a/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemDiscoveryComponent.java
+++ b/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/FileSystemDiscoveryComponent.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2010 Red Hat, Inc.
+ * Copyright (C) 2005-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -42,6 +42,7 @@ import org.rhq.core.system.SystemInfo;
*/
@SuppressWarnings({"UnusedDeclaration"})
public class FileSystemDiscoveryComponent implements ResourceDiscoveryComponent<PlatformComponent> {
+
private final Log log = LogFactory.getLog(this.getClass());
public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext<PlatformComponent> discoveryContext)
@@ -65,23 +66,27 @@ public class FileSystemDiscoveryComponent implements ResourceDiscoveryComponent<
case FileSystem.TYPE_NETWORK:
break;
default:
- if (!(fs.getDevName().equals("lofs") ||
- fs.getDevName().equals("tmpfs"))) {
- continue;
+ String sysTypeName = fs.getSysTypeName();
+ if (!(sysTypeName.equals("lofs") || sysTypeName.equals("tmpfs"))) {
+ continue;
}
}
- Configuration pluginConfig = discoveryContext.getDefaultPluginConfiguration();
try {
String key = fsInfo.getMountPoint();
+ String name = fsInfo.getMountPoint();
+ String description = fsInfo.getFileSystem().getDevName() + ": "
+ + fsInfo.getFileSystem().getDirName();
+ Configuration pluginConfig = discoveryContext.getDefaultPluginConfiguration();
DiscoveredResourceDetails details = new DiscoveredResourceDetails(discoveryContext.getResourceType(),
- key, key, null, fsInfo.getFileSystem().getDevName() + ": "
- + fsInfo.getFileSystem().getDirName(), pluginConfig, null);
+ key, name, null, description, pluginConfig, null);
results.add(details);
} catch (Exception e) {
- log.error("File system discovery failed for [" + fsInfo + "]: " + e);
+ log.error("File system discovery failed for [" + fsInfo + "].", e);
}
}
+
return results;
}
-}
\ No newline at end of file
+
+}
commit ae2204736e9dac949811c9810d08114b67205ea8
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 8 09:40:44 2011 -0400
start alert unit tests. this commit causes one test failure. need to fix 736685
to get the test to pass.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
index 728ceff..1d73c1a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
@@ -659,47 +659,48 @@ public class AlertManagerBean implements AlertManagerLocal, AlertManagerRemote {
log.debug("Sending alert notifications for " + alert.toSimpleString() + "...");
}
List<AlertNotification> alertNotifications = alert.getAlertDefinition().getAlertNotifications();
- //Set<String> emailAddresses = new LinkedHashSet<String>();
- AlertSenderPluginManager alertSenderPluginManager = getAlertPluginManager();
+ if (alertNotifications != null && alertNotifications.size() > 0) {
+ AlertSenderPluginManager alertSenderPluginManager = getAlertPluginManager();
- for (AlertNotification alertNotification : alertNotifications) {
- AlertNotificationLog notificationLog = null;
+ for (AlertNotification alertNotification : alertNotifications) {
+ AlertNotificationLog notificationLog = null;
- String senderName = alertNotification.getSenderName();
- if (senderName == null) {
- notificationLog = new AlertNotificationLog(alert, senderName, ResultState.FAILURE, "Sender '"
- + senderName + "' is not defined");
- } else {
-
- AlertSender<?> notificationSender = alertSenderPluginManager
- .getAlertSenderForNotification(alertNotification);
- if (notificationSender == null) {
- notificationLog = new AlertNotificationLog(alert, senderName, ResultState.FAILURE,
- "Failed to obtain a sender with given name");
+ String senderName = alertNotification.getSenderName();
+ if (senderName == null) {
+ notificationLog = new AlertNotificationLog(alert, senderName, ResultState.FAILURE, "Sender '"
+ + senderName + "' is not defined");
} else {
- try {
- SenderResult result = notificationSender.send(alert);
- if (log.isDebugEnabled()) {
- log.debug(result);
- }
- if (result == null) {
- notificationLog = new AlertNotificationLog(alert, senderName, ResultState.UNKNOWN,
- "Sender did not return any result");
- } else {
- notificationLog = new AlertNotificationLog(alert, senderName, result);
- }
- } catch (Throwable t) {
- log.error("Notification processing terminated abruptly" + t.getMessage());
+ AlertSender<?> notificationSender = alertSenderPluginManager
+ .getAlertSenderForNotification(alertNotification);
+ if (notificationSender == null) {
notificationLog = new AlertNotificationLog(alert, senderName, ResultState.FAILURE,
- "Notification processing terminated abruptly, cause: " + t.getMessage());
+ "Failed to obtain a sender with given name");
+ } else {
+ try {
+ SenderResult result = notificationSender.send(alert);
+ if (log.isDebugEnabled()) {
+ log.debug(result);
+ }
+
+ if (result == null) {
+ notificationLog = new AlertNotificationLog(alert, senderName, ResultState.UNKNOWN,
+ "Sender did not return any result");
+ } else {
+ notificationLog = new AlertNotificationLog(alert, senderName, result);
+ }
+ } catch (Throwable t) {
+ log.error("Notification processing terminated abruptly" + t.getMessage());
+ notificationLog = new AlertNotificationLog(alert, senderName, ResultState.FAILURE,
+ "Notification processing terminated abruptly, cause: " + t.getMessage());
+ }
}
}
- }
- entityManager.persist(notificationLog);
- alert.addAlertNotificatinLog(notificationLog);
+ entityManager.persist(notificationLog);
+ alert.addAlertNotificatinLog(notificationLog);
+ }
}
} catch (Throwable t) {
log.error("Failed to send all notifications for " + alert.toSimpleString(), t);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerBean.java
index a57c686..14b1dfb 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerBean.java
@@ -307,19 +307,21 @@ public class AlertNotificationManagerBean implements AlertNotificationManagerLoc
public boolean finalizeNotifications(Subject subject, List<AlertNotification> notifications) {
boolean hasErrors = false;
- AlertSenderPluginManager pluginManager = alertManager.getAlertPluginManager();
+ if (notifications != null && notifications.size() > 0) {
+ AlertSenderPluginManager pluginManager = alertManager.getAlertPluginManager();
- for (AlertNotification notification : notifications) {
- AlertSender<?> sender = pluginManager.getAlertSenderForNotification(notification);
+ for (AlertNotification notification : notifications) {
+ AlertSender<?> sender = pluginManager.getAlertSenderForNotification(notification);
- if (sender != null) {
- AlertSenderValidationResults validation = sender.validateAndFinalizeConfiguration(subject);
+ if (sender != null) {
+ AlertSenderValidationResults validation = sender.validateAndFinalizeConfiguration(subject);
- notification.setConfiguration(validation.getAlertParameters());
- notification.setExtraConfiguration(validation.getExtraParameters());
+ notification.setConfiguration(validation.getAlertParameters());
+ notification.setExtraConfiguration(validation.getExtraParameters());
- hasErrors = hasErrors || hasErrors(validation.getAlertParameters())
- || hasErrors(validation.getExtraParameters());
+ hasErrors = hasErrors || hasErrors(validation.getAlertParameters())
+ || hasErrors(validation.getExtraParameters());
+ }
}
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
index 8f086a6..32bb678 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
@@ -19,13 +19,221 @@
package org.rhq.enterprise.server.alert.test;
+import java.util.HashSet;
+
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.transaction.TransactionManager;
+
+import org.testng.annotations.AfterMethod;
import org.testng.annotations.Test;
-import org.rhq.enterprise.server.test.AbstractEJB3Test;
+import org.rhq.core.domain.alert.Alert;
+import org.rhq.core.domain.alert.AlertCondition;
+import org.rhq.core.domain.alert.AlertConditionCategory;
+import org.rhq.core.domain.alert.AlertDampening;
+import org.rhq.core.domain.alert.AlertDefinition;
+import org.rhq.core.domain.alert.AlertPriority;
+import org.rhq.core.domain.alert.BooleanExpression;
+import org.rhq.core.domain.alert.AlertDampening.Category;
+import org.rhq.core.domain.cloud.Server;
+import org.rhq.core.domain.criteria.AlertCriteria;
+import org.rhq.core.domain.criteria.ResourceCriteria;
+import org.rhq.core.domain.measurement.MeasurementDataNumeric;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.MeasurementReport;
+import org.rhq.core.domain.measurement.MeasurementSchedule;
+import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
+import org.rhq.core.domain.resource.Agent;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.util.PageControl;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.server.alert.AlertDefinitionManagerLocal;
+import org.rhq.enterprise.server.alert.AlertManagerLocal;
+import org.rhq.enterprise.server.measurement.MeasurementDataManagerLocal;
+import org.rhq.enterprise.server.resource.metadata.test.UpdatePluginMetadataTestBase;
+import org.rhq.enterprise.server.util.LookupUtil;
+import org.rhq.test.JPAUtils;
+import org.rhq.test.TransactionCallbackWithContext;
@Test
-public class AlertConditionTest extends AbstractEJB3Test {
- public void test() throws Exception {
- // TODO need tests here
+public class AlertConditionTest extends UpdatePluginMetadataTestBase {
+ private Resource resource;
+ private Server server;
+
+ @Override
+ protected String getSubsystemDirectory() {
+ return "alerts";
+ }
+
+ @AfterMethod(alwaysRun = true)
+ public void removePersistedResource() throws Exception {
+ if (resource != null) {
+ deleteNewResource(resource);
+ resource = null;
+ }
+
+ deleteServerIdentity();
+
+ return;
+ }
+
+ public void testBZ736685() throws Exception {
+ // TODO: note that once BZ 735262 is fixed, THIS test will need to be rewritten
+ // TODO: since this assumes the bad behavior of 735262 to test 736685
+
+ // create our resource with alert definition
+ MeasurementDefinition metricDef = createResourceWithMetricSchedule();
+ createAlertDefinitionWithTwoConditionsALL(metricDef);
+
+ // re-load the resource so we get the measurement schedule
+ Resource resourceWithSchedules = loadResourceWithSchedules();
+ MeasurementSchedule schedule = resourceWithSchedules.getSchedules().iterator().next();
+
+ // simulate some measurement reports coming from the agent
+ MeasurementScheduleRequest request = new MeasurementScheduleRequest(schedule);
+ MeasurementReport report = new MeasurementReport();
+ report.addData(new MeasurementDataNumeric(getTimestamp(60), request, Double.valueOf(20.0))); // 20 < 60
+ report.addData(new MeasurementDataNumeric(getTimestamp(30), request, Double.valueOf(50.0))); // 50 > 40, 50 < 60
+ MeasurementDataManagerLocal dataManager = LookupUtil.getMeasurementDataManager();
+ dataManager.mergeMeasurementReport(report);
+
+ // wait for our JMS messages to process and see if we get any alerts
+ Thread.sleep(5000);
+
+ AlertManagerLocal alertManager = LookupUtil.getAlertManager();
+ AlertCriteria alertCriteria = new AlertCriteria();
+ alertCriteria.addFilterResourceIds(resourceWithSchedules.getId());
+ PageList<Alert> alerts = alertManager.findAlertsByCriteria(getOverlord(), alertCriteria);
+ assert alerts.size() == 1 : "1 alert should have fired: " + alerts;
+
+ int resourceId = resource.getId();
+ deleteNewResource(resource);
+ resource = null;
+
+ AlertDefinitionManagerLocal alertDefManager = LookupUtil.getAlertDefinitionManager();
+ PageList<AlertDefinition> defs = alertDefManager.findAlertDefinitions(getOverlord(), resourceId, PageControl
+ .getUnlimitedInstance());
+ assert defs.isEmpty() : "failed to delete the alert definition - are condition logs still around?";
+
+ return;
+ }
+
+ private Resource loadResourceWithSchedules() {
+ ResourceCriteria resourceCriteria = new ResourceCriteria();
+ resourceCriteria.addFilterId(resource.getId());
+ resourceCriteria.fetchSchedules(true);
+ Resource resourceWithSchedules = getResource(resourceCriteria);
+ assert resourceWithSchedules != null : "could not obtain resource from DB";
+ assert resourceWithSchedules.getSchedules() != null && resourceWithSchedules.getSchedules().size() == 1 : "missing schedule";
+ return resourceWithSchedules;
+ }
+
+ private void createAlertDefinitionWithTwoConditionsALL(MeasurementDefinition metricDef) {
+ // create alert definition with the conditions "metric value > 40 AND metric value < 60"
+ HashSet<AlertCondition> conditions = new HashSet<AlertCondition>(2);
+ AlertCondition cond1 = new AlertCondition();
+ cond1.setCategory(AlertConditionCategory.THRESHOLD);
+ cond1.setName(metricDef.getDisplayName());
+ cond1.setComparator(">");
+ cond1.setThreshold(Double.valueOf(40.0)); // value > 40 threshold
+ cond1.setOption(null);
+ cond1.setMeasurementDefinition(metricDef);
+ conditions.add(cond1);
+
+ AlertCondition cond2 = new AlertCondition();
+ cond2.setCategory(AlertConditionCategory.THRESHOLD);
+ cond2.setName(metricDef.getDisplayName());
+ cond2.setComparator("<");
+ cond2.setThreshold(Double.valueOf(60.0)); // value < 60 threshold
+ cond2.setOption(null);
+ cond2.setMeasurementDefinition(metricDef);
+ conditions.add(cond2);
+
+ AlertDefinition alertDefinition = new AlertDefinition();
+ alertDefinition.setName("two condition ALL alert");
+ alertDefinition.setEnabled(true);
+ alertDefinition.setPriority(AlertPriority.HIGH);
+ alertDefinition.setAlertDampening(new AlertDampening(Category.NONE));
+ alertDefinition.setRecoveryId(Integer.valueOf(0));
+ alertDefinition.setConditionExpression(BooleanExpression.ALL);
+ alertDefinition.setConditions(conditions);
+
+ AlertDefinitionManagerLocal alertDefManager = LookupUtil.getAlertDefinitionManager();
+ int defId = alertDefManager.createAlertDefinition(getOverlord(), alertDefinition, resource.getId());
+ alertDefinition.setId(defId);
+
+ // now that we created an alert def, we have to reload the alert condition cache
+ reloadAllAlertConditionCaches();
+ }
+
+ private MeasurementDefinition createResourceWithMetricSchedule() throws Exception {
+ registerPlugin("type-with-metric.xml");
+ ResourceType resourceType = getResourceType("TypeWithMetrics");
+ assert resourceType != null : "failed to deploy resource type";
+ assert resourceType.getMetricDefinitions() != null : "failed to create metric defs";
+ assert resourceType.getMetricDefinitions().size() == 1 : "do not have the expected number of metric defs";
+
+ final MeasurementDefinition metricDef = resourceType.getMetricDefinitions().iterator().next();
+
+ resource = persistNewResource(resourceType.getName());
+ assert resource != null && resource.getId() > 0 : "failed to create test resource";
+
+ JPAUtils.executeInTransaction(new TransactionCallbackWithContext<Object>() {
+ @Override
+ public Object execute(TransactionManager tm, EntityManager em) throws Exception {
+ MeasurementSchedule schedule = new MeasurementSchedule(metricDef, resource);
+ em.persist(schedule);
+ return null;
+ }
+ });
+
+ // create a server which attaches our agent to it - we need this for the alert subsystem to do its thing
+ createServerIdentity();
+ return metricDef;
+ }
+
+ /**
+ * Returns a epoch millis timestamp that is the current time minus the given number of seconds.
+ * In other words, this returns a time in the past - how far in the past is determined by the
+ * number of seconds parameter.
+ * @param secondsAgo
+ */
+ private long getTimestamp(long secondsAgo) {
+ return System.currentTimeMillis() - (secondsAgo * 1000);
+ }
+
+ private void reloadAllAlertConditionCaches() {
+ LookupUtil.getAlertConditionCacheManager().reloadAllCaches();
+ }
+
+ private void createServerIdentity() {
+ server = new Server();
+ server.setName("localhost"); // this is the default assumed in the SLSB code, we must match it
+ server.setAddress("localhost");
+ server.setPort(7080);
+ server.setSecurePort(7443);
+ server.setComputePower(1);
+ server.setOperationMode(Server.OperationMode.MAINTENANCE);
+ int serverId = LookupUtil.getServerManager().create(server);
+ assert serverId > 0 : "could not create our server identity in the DB";
+
+ // simulate the agent being "connected" to the server
+ try {
+ Agent agent = getAgent(getEntityManager());
+ agent.setServer(server);
+ LookupUtil.getAgentManager().updateAgent(agent);
+ } catch (NoResultException nre) {
+ // no agent to attach
+ }
+ }
+
+ private void deleteServerIdentity() throws Exception {
+ if (server != null) {
+ cleanupAgent(); // can't remove the server before we purge the agent
+ LookupUtil.getCloudManager().deleteServer(server.getId());
+ server = null;
+ }
}
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/PluginDescriptorValidationTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/PluginDescriptorValidationTest.java
index cff1b0c..66d87e6 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/PluginDescriptorValidationTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/PluginDescriptorValidationTest.java
@@ -40,7 +40,7 @@ import org.rhq.core.clientapi.descriptor.DescriptorPackages;
* @author Heiko W. Rupp
* TODO get the plugins dynamically - see comment in {@link #testPluginDescriptors()}
*/
-public class PluginDescriptorValidationTest extends UpdateSubsytemTestBase {
+public class PluginDescriptorValidationTest extends UpdatePluginMetadataTestBase {
// we stand in modules/enterprise/jar
String BASE = "../../../plugins/";
String EXT = "/src/main/resources/META-INF/rhq-plugin.xml";
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/SubcategoryTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/SubcategoryTest.java
index 1031f42..aa3c616 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/SubcategoryTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/SubcategoryTest.java
@@ -25,7 +25,7 @@ import org.testng.annotations.Test;
*
* @author Heiko W. Rupp
*/
-public class SubcategoryTest extends UpdateSubsytemTestBase {
+public class SubcategoryTest extends UpdatePluginMetadataTestBase {
@Override
protected String getSubsystemDirectory() {
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateConfigurationSubsystemTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateConfigurationSubsystemTest.java
index d5b0261..87f78e2 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateConfigurationSubsystemTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateConfigurationSubsystemTest.java
@@ -51,7 +51,7 @@ import org.rhq.core.domain.resource.ResourceType;
*
* @author Heiko Rupp
*/
-public class UpdateConfigurationSubsystemTest extends UpdateSubsytemTestBase {
+public class UpdateConfigurationSubsystemTest extends UpdatePluginMetadataTestBase {
private static final boolean ENABLED = true;
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateContentSubsystemTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateContentSubsystemTest.java
index 270008e..d0ee3ba 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateContentSubsystemTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateContentSubsystemTest.java
@@ -18,7 +18,7 @@
*/
package org.rhq.enterprise.server.resource.metadata.test;
-public class UpdateContentSubsystemTest extends UpdateSubsytemTestBase {
+public class UpdateContentSubsystemTest extends UpdatePluginMetadataTestBase {
@Override
protected String getSubsystemDirectory() {
return "content";
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateEventsSubsystemTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateEventsSubsystemTest.java
index 4c8ab8a..08b313a 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateEventsSubsystemTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateEventsSubsystemTest.java
@@ -43,7 +43,7 @@ import org.rhq.enterprise.server.util.LookupUtil;
* Note, plugins are registered in new transactions. for tests, this means
* you can't do everything in a trans and roll back at the end. You must clean up manually.
*/
-public class UpdateEventsSubsystemTest extends UpdateSubsytemTestBase {
+public class UpdateEventsSubsystemTest extends UpdatePluginMetadataTestBase {
static final boolean ENABLED = true;
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateMeasurementSubsystemTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateMeasurementSubsystemTest.java
index c5cadf4..0acd54c 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateMeasurementSubsystemTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateMeasurementSubsystemTest.java
@@ -39,7 +39,7 @@ import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.server.util.LookupUtil;
-public class UpdateMeasurementSubsystemTest extends UpdateSubsytemTestBase {
+public class UpdateMeasurementSubsystemTest extends UpdatePluginMetadataTestBase {
static final boolean ENABLED = true;
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateNativesSubsystemTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateNativesSubsystemTest.java
index a320043..5f51d6c 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateNativesSubsystemTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateNativesSubsystemTest.java
@@ -32,7 +32,7 @@ import org.rhq.core.domain.resource.ResourceType;
* Note, plugins are registered in new transactions. for tests, this means
* you can't do everything in a trans and roll back at the end. You must clean up manually.
*/
-public class UpdateNativesSubsystemTest extends UpdateSubsytemTestBase {
+public class UpdateNativesSubsystemTest extends UpdatePluginMetadataTestBase {
@Override
protected String getSubsystemDirectory() {
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateOperationsSubsystemTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateOperationsSubsystemTest.java
index cd36f1d..c340367 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateOperationsSubsystemTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateOperationsSubsystemTest.java
@@ -39,7 +39,7 @@ import org.rhq.core.domain.resource.ResourceType;
* Note, plugins are registered in new transactions. for tests, this means
* you can't do everything in a trans and roll back at the end. You must clean up manually.
*/
-public class UpdateOperationsSubsystemTest extends UpdateSubsytemTestBase {
+public class UpdateOperationsSubsystemTest extends UpdatePluginMetadataTestBase {
private static final boolean ENABLED = true;
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdatePluginMetadataTestBase.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdatePluginMetadataTestBase.java
new file mode 100644
index 0000000..535fd06
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdatePluginMetadataTestBase.java
@@ -0,0 +1,446 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.resource.metadata.test;
+
+import java.io.FileNotFoundException;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.transaction.Status;
+import javax.transaction.TransactionManager;
+import javax.xml.XMLConstants;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.util.ValidationEventCollector;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+
+import org.rhq.core.clientapi.agent.measurement.MeasurementAgentService;
+import org.rhq.core.clientapi.descriptor.DescriptorPackages;
+import org.rhq.core.clientapi.descriptor.plugin.PluginDescriptor;
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.criteria.ResourceCriteria;
+import org.rhq.core.domain.criteria.ResourceTypeCriteria;
+import org.rhq.core.domain.measurement.MeasurementData;
+import org.rhq.core.domain.measurement.MeasurementDataRequest;
+import org.rhq.core.domain.measurement.ResourceMeasurementScheduleRequest;
+import org.rhq.core.domain.plugin.Plugin;
+import org.rhq.core.domain.resource.Agent;
+import org.rhq.core.domain.resource.InventoryStatus;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.core.util.MessageDigestGenerator;
+import org.rhq.enterprise.server.resource.ResourceManagerLocal;
+import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
+import org.rhq.enterprise.server.resource.metadata.PluginManagerLocal;
+import org.rhq.enterprise.server.test.AbstractEJB3Test;
+import org.rhq.enterprise.server.test.TestServerCommunicationsService;
+import org.rhq.enterprise.server.util.LookupUtil;
+import org.rhq.test.JPAUtils;
+import org.rhq.test.TransactionCallbackWithContext;
+
+public class UpdatePluginMetadataTestBase extends AbstractEJB3Test {
+
+ protected TestServerCommunicationsService agentServiceContainer;
+
+ protected static final String PLUGIN_NAME = "ResourceMetaDataManagerBeanTest"; // don't change this - our test descriptor .xml files use it as plugin name
+ protected static final String AGENT_NAME = "-dummy agent-";
+ protected static final String COMMON_PATH_PREFIX = "./test/metadata/";
+
+ protected static PluginManagerLocal pluginMgr;
+ protected static ResourceTypeManagerLocal resourceTypeManager;
+ protected static ResourceManagerLocal resourceManager;
+
+ @BeforeMethod
+ protected void init() {
+ try {
+ pluginMgr = LookupUtil.getPluginManager();
+ resourceTypeManager = LookupUtil.getResourceTypeManager();
+ resourceManager = LookupUtil.getResourceManager();
+ } catch (Throwable t) {
+ // Catch RuntimeExceptions and Errors and dump their stack trace, because Surefire will completely swallow them
+ // and throw a cryptic NPE (see http://jira.codehaus.org/browse/SUREFIRE-157)!
+ t.printStackTrace();
+ throw new RuntimeException(t);
+ }
+ }
+
+ @BeforeClass
+ public void beforeClass() {
+ agentServiceContainer = prepareForTestAgents();
+ prepareMockAgentServiceContainer();
+
+ prepareScheduler();
+ }
+
+ protected void prepareMockAgentServiceContainer() {
+ agentServiceContainer.measurementService = new MockMeasurementAgentService();
+ }
+
+ @AfterClass
+ public void afterClass() throws Exception {
+ unprepareForTestAgents();
+ unprepareScheduler();
+ cleanupTest();
+ }
+
+ protected ResourceType getResourceType(String typeName) {
+ return getResourceType(typeName, PLUGIN_NAME);
+ }
+
+ protected ResourceType getResourceType(String typeName, String pluginName) {
+ Subject overlord = getOverlord();
+
+ ResourceTypeCriteria resourceTypeCriteria = new ResourceTypeCriteria();
+ resourceTypeCriteria.setStrict(true);
+ resourceTypeCriteria.addFilterName(typeName);
+ resourceTypeCriteria.addFilterPluginName(pluginName);
+
+ // used in UpdateMeasurementSubsystemTest
+ resourceTypeCriteria.fetchMetricDefinitions(true);
+ // used in several UpdateResourceSubsystemTest tests
+ resourceTypeCriteria.fetchSubCategory(true);
+
+ PageList<ResourceType> results = resourceTypeManager
+ .findResourceTypesByCriteria(overlord, resourceTypeCriteria);
+ if (results.size() == 0) {
+ return null;
+ } else if (results.size() == 1) {
+ return results.get(0);
+ } else {
+ throw new IllegalStateException("Found more than one resourceType with name " + typeName + " from plugin "
+ + pluginName + ".");
+ }
+ }
+
+ protected Resource createResource(String resourceKey, String name, ResourceType type) {
+ Resource resource = new Resource(resourceKey, name, type);
+ resource.setUuid(UUID.randomUUID().toString());
+ resource.setInventoryStatus(InventoryStatus.COMMITTED);
+ return resource;
+ }
+
+ protected Resource getResource(ResourceCriteria resourceCriteria) {
+ Subject overlord = getOverlord();
+
+ PageList<Resource> results = resourceManager.findResourcesByCriteria(overlord, resourceCriteria);
+ if (results.size() == 0) {
+ return null;
+ } else if (results.size() == 1) {
+ return results.get(0);
+ } else {
+ throw new IllegalStateException("Found more than one Resource with criteria " + resourceCriteria + ".");
+ }
+ }
+
+ protected String getSubsystemDirectory() {
+ return ".";
+ }
+
+ protected void registerPlugin(String pathToDescriptor, String versionOverride) throws Exception {
+ pathToDescriptor = COMMON_PATH_PREFIX + getSubsystemDirectory() + "/" + pathToDescriptor;
+ registerPluginInternal(pathToDescriptor, versionOverride);
+ }
+
+ private void registerPluginInternal(String pathToDescriptor, String versionOverride) throws Exception {
+ System.out.println("Registering plugin with descriptor [" + pathToDescriptor + "]...");
+ String md5 = MessageDigestGenerator.getDigestString(pathToDescriptor);
+ Plugin testPlugin = new Plugin(PLUGIN_NAME, "foo.jar", md5);
+ testPlugin.setDisplayName(PLUGIN_NAME + ": " + pathToDescriptor);
+ PluginDescriptor descriptor = loadPluginDescriptor(pathToDescriptor);
+ // if caller passed in their own version, use it - otherwise, use the plugin descriptor version.
+ // this allows our tests to reuse descriptors without having to duplicate them
+ if (versionOverride != null) {
+ testPlugin.setVersion(versionOverride);
+ } else {
+ testPlugin.setVersion(descriptor.getVersion());
+ }
+ try {
+ pluginMgr.registerPlugin(getOverlord(), testPlugin, descriptor, null, true);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ throw new RuntimeException(t);
+ }
+
+ }
+
+ protected void registerPlugin(String pathToDescriptor) throws Exception {
+ registerPlugin(pathToDescriptor, null);
+ }
+
+ public PluginDescriptor loadPluginDescriptor(String descriptorFile) throws Exception {
+ URL descriptorUrl = this.getClass().getClassLoader().getResource(descriptorFile);
+
+ JAXBContext jaxbContext = JAXBContext.newInstance(DescriptorPackages.PC_PLUGIN);
+ URL pluginSchemaURL = this.getClass().getClassLoader().getResource("rhq-plugin.xsd");
+ Schema pluginSchema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(pluginSchemaURL);
+
+ Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+ ValidationEventCollector vec = new ValidationEventCollector();
+ unmarshaller.setEventHandler(vec);
+ unmarshaller.setSchema(pluginSchema);
+ if (descriptorUrl == null)
+ throw new FileNotFoundException("File " + descriptorFile + " not found");
+ return (PluginDescriptor) unmarshaller.unmarshal(descriptorUrl.openStream());
+ }
+
+ protected boolean containedIn(String string, String[] references) {
+ boolean found = false;
+ for (String ref : references) {
+ if (string.equals(ref)) {
+ found = true;
+ break;
+ }
+ }
+
+ return found;
+ }
+
+ protected int getPluginId(EntityManager entityManager) throws NoResultException {
+ Plugin existingPlugin;
+ try {
+ existingPlugin = (Plugin) entityManager.createNamedQuery(Plugin.QUERY_FIND_BY_NAME).setParameter("name",
+ PLUGIN_NAME).getSingleResult();
+ int plugin1Id = existingPlugin.getId();
+ return plugin1Id;
+ } catch (NoResultException nre) {
+ throw nre;
+ }
+ }
+
+ protected int getAgentId(EntityManager entityManager) throws NoResultException {
+ try {
+ Agent existingAgent = getAgent(entityManager);
+ int agentId = existingAgent.getId();
+ return agentId;
+ } catch (NoResultException nre) {
+ throw nre;
+ }
+ }
+
+ protected Agent getAgent(EntityManager entityManager) throws NoResultException {
+ Agent existingAgent;
+ try {
+ existingAgent = (Agent) entityManager.createNamedQuery(Agent.QUERY_FIND_BY_NAME).setParameter("name",
+ AGENT_NAME).getSingleResult();
+ return existingAgent;
+ } catch (NoResultException nre) {
+ throw nre;
+ }
+ }
+
+ protected void setUpAgent(EntityManager entityManager, Resource testResource) {
+ Agent agent;
+ try {
+ agent = getAgent(entityManager);
+ } catch (NoResultException nre) {
+ agent = new Agent(AGENT_NAME, "localhost", 12345, "http://localhost:12345/", "-dummy token-");
+ entityManager.persist(agent);
+ }
+
+ testResource.setAgent(agent);
+ agentServiceContainer.addStartedAgent(agent);
+ }
+
+ /**
+ * A dummy that needs to be set up before running ResourceManager.deleteResource()
+ */
+ public class MockMeasurementAgentService implements MeasurementAgentService {
+
+ @Override
+ public Set<MeasurementData> getRealTimeMeasurementValue(int resourceId, List<MeasurementDataRequest> requests) {
+ return null;
+ }
+
+ public void scheduleCollection(Set<ResourceMeasurementScheduleRequest> resourceSchedules) {
+ }
+
+ public void unscheduleCollection(Set<Integer> resourceIds) {
+ }
+
+ public void updateCollection(Set<ResourceMeasurementScheduleRequest> resourceSchedules) {
+ }
+
+ public Map<String, Object> getMeasurementScheduleInfoForResource(int resourceId) {
+ return null;
+ }
+ }
+
+ protected void cleanupTest() throws Exception {
+ cleanupMetadata();
+ cleanupAgent();
+ cleanupPlugin();
+ }
+
+ protected void cleanupMetadata() throws Exception {
+ String pathToDescriptor = COMMON_PATH_PREFIX + "/noTypes.xml";
+ registerPluginInternal(pathToDescriptor, null);
+ }
+
+ protected void cleanupAgent() throws Exception {
+ getTransactionManager().begin();
+ EntityManager em = getEntityManager();
+ try {
+ try {
+ int agentId = getAgentId(em);
+ Agent agent = em.getReference(Agent.class, agentId);
+ if (null != agent) {
+ em.remove(agent);
+ }
+ } catch (NoResultException nre) {
+ // ignore, nothing to clean up
+ }
+ } catch (Exception e) {
+ if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) {
+ getTransactionManager().rollback();
+ }
+ System.out.println("CANNOT CLEAN UP AGENT: " + e);
+ throw e;
+ } finally {
+ if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) {
+ getTransactionManager().commit();
+ }
+ }
+ }
+
+ protected void cleanupPlugin() throws Exception {
+ getTransactionManager().begin();
+ EntityManager em = getEntityManager();
+ try {
+ try {
+ int plugin1Id = getPluginId(em);
+ Plugin plugin1 = em.getReference(Plugin.class, plugin1Id);
+ if (null != plugin1) {
+ em.remove(plugin1);
+ }
+ } catch (NoResultException nre) {
+ // ignore, nothing to do
+ }
+ } catch (Exception e) {
+ if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) {
+ getTransactionManager().rollback();
+ }
+ System.out.println("CANNOT CLEAN UP PLUGIN: " + e);
+ throw e;
+ } finally {
+ if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) {
+ getTransactionManager().commit();
+ }
+ }
+ }
+
+ protected void cleanupResourceType(String rtName) throws Exception {
+ try {
+ ResourceType rt = getResourceType(rtName);
+
+ if (null != rt) {
+ Subject overlord = getOverlord();
+ ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
+
+ // delete any resources first
+ ResourceCriteria c = new ResourceCriteria();
+ c.setStrict(true);
+ c.addFilterResourceTypeId(rt.getId());
+ c.addFilterInventoryStatus(InventoryStatus.NEW);
+ List<Resource> doomedResources = resourceManager.findResourcesByCriteria(overlord, c);
+ c.addFilterInventoryStatus(InventoryStatus.DELETED);
+ doomedResources.addAll(resourceManager.findResourcesByCriteria(overlord, c));
+ c.addFilterInventoryStatus(InventoryStatus.UNINVENTORIED);
+ doomedResources.addAll(resourceManager.findResourcesByCriteria(overlord, c));
+ // invoke bulk delete on the resource to remove any dependencies not defined in the hibernate entity model
+ // perform in-band and out-of-band work in quick succession
+ for (Resource doomed : doomedResources) {
+ List<Integer> deletedIds = resourceManager.uninventoryResource(overlord, doomed.getId());
+ for (Integer deletedResourceId : deletedIds) {
+ resourceManager.uninventoryResourceAsyncWork(overlord, deletedResourceId);
+ }
+ }
+
+ // Measurement defs go away via cascade remove
+
+ getTransactionManager().begin();
+ EntityManager em = getEntityManager();
+
+ rt = em.find(ResourceType.class, rt.getId());
+ ResourceType parent = rt.getParentResourceTypes().isEmpty() ? null : rt.getParentResourceTypes()
+ .iterator().next();
+ em.remove(rt);
+ if (null != parent) {
+ em.remove(parent);
+ }
+ }
+ } catch (Exception e) {
+ if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) {
+ getTransactionManager().rollback();
+ }
+ System.out.println("CANNOT CLEAN UP RESOURCE TYPE: " + rtName + ": " + e);
+ throw e;
+ } finally {
+ if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) {
+ getTransactionManager().commit();
+ }
+ }
+ }
+
+ //
+ // provide some convience methods to create resources
+ //
+
+ protected Subject getOverlord() {
+ return LookupUtil.getSubjectManager().getOverlord();
+ }
+
+ protected Resource persistNewResource(final String resourceTypeName) throws Exception {
+ return JPAUtils.executeInTransaction(new TransactionCallbackWithContext<Resource>() {
+ @Override
+ public Resource execute(TransactionManager tm, EntityManager em) throws Exception {
+ ResourceType resourceType = getResourceType(resourceTypeName);
+ Resource resource = new Resource("reskey" + System.currentTimeMillis(), "resname", resourceType);
+ resource.setUuid(UUID.randomUUID().toString());
+ resource.setInventoryStatus(InventoryStatus.COMMITTED);
+ setUpAgent(em, resource);
+ em.persist(resource);
+ return resource;
+ }
+ });
+ }
+
+ protected void deleteNewResource(final Resource resource) throws Exception {
+ try {
+ List<Integer> deletedIds = resourceManager.uninventoryResource(getOverlord(), resource.getId());
+ for (Integer deletedResourceId : deletedIds) {
+ resourceManager.uninventoryResourceAsyncWork(getOverlord(), deletedResourceId);
+ }
+ } catch (Exception e) {
+ System.out.println("CANNOT CLEAN UP RESOURCE: " + resource + ": " + e);
+ throw e;
+ }
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceSubsystemTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceSubsystemTest.java
index 5408db8..2d35079 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceSubsystemTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceSubsystemTest.java
@@ -33,7 +33,7 @@ import org.rhq.core.domain.resource.ResourceType;
* Note, plugins are registered in new transactions. for tests, this means
* you can't do everything in a trans and roll back at the end. You must clean up manually.
*/
-public class UpdateResourceSubsystemTest extends UpdateSubsytemTestBase {
+public class UpdateResourceSubsystemTest extends UpdatePluginMetadataTestBase {
private static final boolean ENABLED = true;
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java
index 5ad9cdb..dc71f4c 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateResourceTypeSubsystemTest.java
@@ -41,7 +41,7 @@ import org.rhq.enterprise.server.util.LookupUtil;
* Note, plugins are registered in new transactions. For tests, this means
* you can't do everything in a trans and roll back at the end. You must clean up manually.
*/
-public class UpdateResourceTypeSubsystemTest extends UpdateSubsytemTestBase {
+public class UpdateResourceTypeSubsystemTest extends UpdatePluginMetadataTestBase {
@Override
protected String getSubsystemDirectory() {
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateSubsytemTestBase.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateSubsytemTestBase.java
deleted file mode 100644
index 77d48be..0000000
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/test/UpdateSubsytemTestBase.java
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2010 Red Hat, Inc.
- * All rights reserved.
- *
- * This program 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 version 2 of the License.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.server.resource.metadata.test;
-
-import java.io.FileNotFoundException;
-import java.net.URL;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-
-import javax.ejb.EJB;
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import javax.persistence.PersistenceContext;
-import javax.transaction.Status;
-import javax.xml.XMLConstants;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Unmarshaller;
-import javax.xml.bind.util.ValidationEventCollector;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.BeforeTest;
-
-import org.rhq.core.clientapi.agent.measurement.MeasurementAgentService;
-import org.rhq.core.clientapi.descriptor.DescriptorPackages;
-import org.rhq.core.clientapi.descriptor.plugin.PluginDescriptor;
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.criteria.ResourceCriteria;
-import org.rhq.core.domain.criteria.ResourceTypeCriteria;
-import org.rhq.core.domain.measurement.MeasurementData;
-import org.rhq.core.domain.measurement.MeasurementDataRequest;
-import org.rhq.core.domain.measurement.ResourceMeasurementScheduleRequest;
-import org.rhq.core.domain.plugin.Plugin;
-import org.rhq.core.domain.resource.Agent;
-import org.rhq.core.domain.resource.InventoryStatus;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.util.PageList;
-import org.rhq.core.util.MessageDigestGenerator;
-import org.rhq.enterprise.server.RHQConstants;
-import org.rhq.enterprise.server.resource.ResourceManagerLocal;
-import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
-import org.rhq.enterprise.server.resource.metadata.ResourceMetadataManagerLocal;
-import org.rhq.enterprise.server.resource.metadata.PluginManagerLocal;
-import org.rhq.enterprise.server.test.AbstractEJB3Test;
-import org.rhq.enterprise.server.test.TestServerCommunicationsService;
-import org.rhq.enterprise.server.util.LookupUtil;
-
-// TODO: Fix typo in class name.
-public class UpdateSubsytemTestBase extends AbstractEJB3Test {
-
- @PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME)
- @EJB
- protected ResourceManagerLocal resMgr;
-
- protected TestServerCommunicationsService agentServiceContainer;
-
- protected int agentId;
- protected int plugin1Id;
-
- protected static final String PLUGIN_NAME = "ResourceMetaDataManagerBeanTest";
- protected static final String AGENT_NAME = "-dummy agent-";
- protected static final String COMMON_PATH_PREFIX = "./test/metadata/";
-
- protected static PluginManagerLocal pluginMgr;
- protected static ResourceTypeManagerLocal resourceTypeManager;
- protected static ResourceManagerLocal resourceManager;
-
- @BeforeMethod
- protected void init() {
- try {
- pluginMgr = LookupUtil.getPluginManager();
- resourceTypeManager = LookupUtil.getResourceTypeManager();
- resourceManager = LookupUtil.getResourceManager();
- } catch (Throwable t) {
- // Catch RuntimeExceptions and Errors and dump their stack trace, because Surefire will completely swallow them
- // and throw a cryptic NPE (see http://jira.codehaus.org/browse/SUREFIRE-157)!
- t.printStackTrace();
- throw new RuntimeException(t);
- }
- }
-
- @BeforeClass
- public void beforeClass() {
- agentServiceContainer = prepareForTestAgents();
- agentServiceContainer.measurementService = new MockAgentService();
-
- prepareScheduler();
- }
-
- @AfterClass
- public void afterClass() throws Exception {
- unprepareForTestAgents();
- unprepareScheduler();
- cleanupTest();
- }
-
-// @BeforeTest
-// public void beforeTest() throws Exception {
-//// startTest(); Done in super.@BeforeMethod already ??
-// // cleanup anything left over from a previous, interrupted run.
-// cleanupTest();
-// }
-
- protected ResourceType getResourceType(String typeName) {
- return getResourceType(typeName, PLUGIN_NAME);
- }
-
- protected ResourceType getResourceType(String typeName, String pluginName) {
- Subject overlord = LookupUtil.getSubjectManager().getOverlord();
-
- ResourceTypeCriteria resourceTypeCriteria = new ResourceTypeCriteria();
- resourceTypeCriteria.setStrict(true);
- resourceTypeCriteria.addFilterName(typeName);
- resourceTypeCriteria.addFilterPluginName(pluginName);
-
- // used in UpdateMeasurementSubsystemTest
- resourceTypeCriteria.fetchMetricDefinitions(true);
- // used in several UpdateResourceSubsystemTest tests
- resourceTypeCriteria.fetchSubCategory(true);
-
- PageList<ResourceType> results = resourceTypeManager
- .findResourceTypesByCriteria(overlord, resourceTypeCriteria);
- if (results.size() == 0) {
- return null;
- } else if (results.size() == 1) {
- return results.get(0);
- } else {
- throw new IllegalStateException("Found more than one resourceType with name " + typeName + " from plugin "
- + pluginName + ".");
- }
- }
-
- protected Resource createResource(String resourceKey, String name, ResourceType type) {
- Resource resource = new Resource(resourceKey, name, type);
- resource.setUuid(UUID.randomUUID().toString());
- resource.setInventoryStatus(InventoryStatus.COMMITTED);
- return resource;
- }
-
- protected Resource getResource(ResourceCriteria resourceCriteria) {
- Subject overlord = LookupUtil.getSubjectManager().getOverlord();
-
- PageList<Resource> results = resourceManager.findResourcesByCriteria(overlord, resourceCriteria);
- if (results.size() == 0) {
- return null;
- } else if (results.size() == 1) {
- return results.get(0);
- } else {
- throw new IllegalStateException("Found more than one Resource with criteria " + resourceCriteria + ".");
- }
- }
-
- protected String getSubsystemDirectory() {
- return ".";
- }
-
- protected void registerPlugin(String pathToDescriptor, String versionOverride) throws Exception {
- pathToDescriptor = COMMON_PATH_PREFIX + getSubsystemDirectory() + "/" + pathToDescriptor;
- registerPluginInternal(pathToDescriptor, versionOverride);
- }
-
- private void registerPluginInternal(String pathToDescriptor, String versionOverride) throws Exception {
- System.out.println("Registering plugin with descriptor [" + pathToDescriptor + "]...");
- String md5 = MessageDigestGenerator.getDigestString(pathToDescriptor);
- Plugin testPlugin = new Plugin(PLUGIN_NAME, "foo.jar", md5);
- testPlugin.setDisplayName("ResourceMetaDataManagerBeanTest: " + pathToDescriptor);
- PluginDescriptor descriptor = loadPluginDescriptor(pathToDescriptor);
- // if caller passed in their own version, use it - otherwise, use the plugin descriptor version.
- // this allows our tests to reuse descriptors without having to duplicate them
- if (versionOverride != null) {
- testPlugin.setVersion(versionOverride);
- } else {
- testPlugin.setVersion(descriptor.getVersion());
- }
- try {
- pluginMgr.registerPlugin(LookupUtil.getSubjectManager().getOverlord(), testPlugin, descriptor, null,
- true);
- } catch (Throwable t) {
- t.printStackTrace();
- throw new RuntimeException(t);
- }
-
- }
-
- protected void registerPlugin(String pathToDescriptor) throws Exception {
- registerPlugin(pathToDescriptor, null);
- }
-
- public PluginDescriptor loadPluginDescriptor(String descriptorFile) throws Exception {
- URL descriptorUrl = this.getClass().getClassLoader().getResource(descriptorFile);
-
- JAXBContext jaxbContext = JAXBContext.newInstance(DescriptorPackages.PC_PLUGIN);
- URL pluginSchemaURL = this.getClass().getClassLoader().getResource("rhq-plugin.xsd");
- Schema pluginSchema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(pluginSchemaURL);
-
- Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
- ValidationEventCollector vec = new ValidationEventCollector();
- unmarshaller.setEventHandler(vec);
- unmarshaller.setSchema(pluginSchema);
- if (descriptorUrl == null)
- throw new FileNotFoundException("File " + descriptorFile + " not found");
- return (PluginDescriptor) unmarshaller.unmarshal(descriptorUrl.openStream());
- }
-
- protected boolean containedIn(String string, String[] references) {
- boolean found = false;
- for (String ref : references) {
- if (string.equals(ref)) {
- found = true;
- break;
- }
- }
-
- return found;
- }
-
- protected int getPluginId(EntityManager entityManager) {
- Plugin existingPlugin;
- try {
- existingPlugin = (Plugin) entityManager.createNamedQuery(Plugin.QUERY_FIND_BY_NAME).setParameter("name",
- PLUGIN_NAME).getSingleResult();
- plugin1Id = existingPlugin.getId();
- return plugin1Id;
- } catch (NoResultException nre) {
- throw nre;
- }
- }
-
- protected int getAgentId(EntityManager entityManager) {
- Agent existingAgent;
- try {
- existingAgent = (Agent) entityManager.createNamedQuery(Agent.QUERY_FIND_BY_NAME).setParameter("name",
- AGENT_NAME).getSingleResult();
- agentId = existingAgent.getId();
- return agentId;
- } catch (NoResultException nre) {
- throw nre;
- }
- }
-
- protected void setUpAgent(EntityManager entityManager, Resource testResource) {
- Agent agent = new Agent(AGENT_NAME, "localhost", 12345, "http://localhost:12345/", "-dummy token-");
- entityManager.persist(agent);
-
- testResource.setAgent(agent);
- agentServiceContainer.addStartedAgent(agent);
- agentId = agent.getId();
- }
-
- /**
- * A dummy that needs to be set up before running ResourceManager.deleteResource()
- */
- public class MockAgentService implements MeasurementAgentService {
-
- @Override
- public Set<MeasurementData> getRealTimeMeasurementValue(int resourceId, List<MeasurementDataRequest> requests) {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public void scheduleCollection(Set<ResourceMeasurementScheduleRequest> resourceSchedules) {
- // TODO Auto-generated method stub
-
- }
-
- public void unscheduleCollection(Set<Integer> resourceIds) {
- // TODO Auto-generated method stub
-
- }
-
- public void updateCollection(Set<ResourceMeasurementScheduleRequest> resourceSchedules) {
- // TODO Auto-generated method stub
-
- }
-
- public Map<String, Object> getMeasurementScheduleInfoForResource(int resourceId) {
- return null;
- }
- }
-
- protected void cleanupTest() throws Exception {
- try {
- String pathToDescriptor = COMMON_PATH_PREFIX + "/noTypes.xml";
- registerPluginInternal(pathToDescriptor, null);
-
- /*cleanupResourceType("constraintPlatform");
- cleanupResourceType("events");
- cleanupResourceType("groupDeletedPlatform");
- cleanupResourceType("groupPropDeletedPlatform");
- cleanupResourceType("groupPropMovedPlatform");
- cleanupResourceType("myPlatform");
- cleanupResourceType("myPlatform3");
- cleanupResourceType("myPlatform4");
- cleanupResourceType("myPlatform5");
- cleanupResourceType("myPlatform6");
- cleanupResourceType("myPlatform7");
- cleanupResourceType("ops");
- cleanupResourceType("testApp1");
- cleanupResourceType("testServer1");
- cleanupResourceType("testServer2");
- cleanupResourceType("testService1");
- cleanupResourceType("testService2");
- cleanupResourceType("TestServer");*/
-
- getTransactionManager().begin();
- EntityManager entityManager = getEntityManager();
-
- try {
- agentId = getAgentId(entityManager);
- Agent agent = entityManager.getReference(Agent.class, agentId);
- if (null != agent) {
- entityManager.remove(agent);
- }
- } catch (Exception e) {
- // ignore, agent does not exist
- }
-
- try {
- plugin1Id = getPluginId(entityManager);
- Plugin plugin1 = entityManager.getReference(Plugin.class, plugin1Id);
- if (null != plugin1) {
- entityManager.remove(plugin1);
- }
- } catch (Exception e) {
- // ignore, plugin1 does not exist
- }
- } finally {
- if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) {
- getTransactionManager().commit();
- }
- }
- }
-
- protected void cleanupResourceType(String rtName) throws Exception {
- try {
- ResourceType rt = getResourceType(rtName);
-
- if (null != rt) {
- Subject overlord = LookupUtil.getSubjectManager().getOverlord();
- ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
-
- // delete any resources first
- ResourceCriteria c = new ResourceCriteria();
- c.setStrict(true);
- c.addFilterResourceTypeId(rt.getId());
- c.addFilterInventoryStatus(InventoryStatus.NEW);
- List<Resource> doomedResources = resourceManager.findResourcesByCriteria(overlord, c);
- c.addFilterInventoryStatus(InventoryStatus.DELETED);
- doomedResources.addAll(resourceManager.findResourcesByCriteria(overlord, c));
- c.addFilterInventoryStatus(InventoryStatus.UNINVENTORIED);
- doomedResources.addAll(resourceManager.findResourcesByCriteria(overlord, c));
- // invoke bulk delete on the resource to remove any dependencies not defined in the hibernate entity model
- // perform in-band and out-of-band work in quick succession
- for (Resource doomed : doomedResources) {
- List<Integer> deletedIds = resourceManager.uninventoryResource(overlord, doomed.getId());
- for (Integer deletedResourceId : deletedIds) {
- resourceManager.uninventoryResourceAsyncWork(overlord, deletedResourceId);
- }
- }
-
- // Measurement defs go away via cascade remove
-
- getTransactionManager().begin();
- EntityManager em = getEntityManager();
-
- rt = em.find(ResourceType.class, rt.getId());
- ResourceType parent = rt.getParentResourceTypes().isEmpty() ? null : rt.getParentResourceTypes()
- .iterator().next();
- em.remove(rt);
- if (null != parent) {
- em.remove(parent);
- }
- }
- } catch (Exception e) {
- if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) {
- getTransactionManager().rollback();
- }
- System.out.println("CANNOT CLEAN UP TEST (cleanupResourceType): " + e);
- throw e;
- } finally {
- if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) {
- getTransactionManager().commit();
- }
- }
- }
-}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/test/ResourceManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/test/ResourceManagerBeanTest.java
index 03d941e..664be6d 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/test/ResourceManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/test/ResourceManagerBeanTest.java
@@ -24,7 +24,6 @@ import java.util.Random;
import javax.persistence.EntityManager;
import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
@@ -37,7 +36,7 @@ import org.rhq.core.domain.resource.ResourceErrorType;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.server.discovery.DiscoveryServerServiceImpl;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
-import org.rhq.enterprise.server.resource.metadata.test.UpdateSubsytemTestBase;
+import org.rhq.enterprise.server.resource.metadata.test.UpdatePluginMetadataTestBase;
import org.rhq.enterprise.server.test.TestServerCommunicationsService;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -45,33 +44,21 @@ import org.rhq.enterprise.server.util.LookupUtil;
* Test for {@link ResourceManagerLocal} SLSB.
*/
@Test
-public class ResourceManagerBeanTest extends UpdateSubsytemTestBase {
- private ResourceManagerLocal resourceManager;
+public class ResourceManagerBeanTest extends UpdatePluginMetadataTestBase {
private Subject superuser;
private Resource newResource;
TestServerCommunicationsService agentServiceContainer;
- @Override
- @BeforeClass
- public void beforeClass() {
- super.beforeClass();
- agentServiceContainer = prepareForTestAgents();
- agentServiceContainer.measurementService = new MockAgentService();
-
- prepareScheduler();
- }
-
@BeforeMethod
public void beforeMethod() throws Exception {
- resourceManager = LookupUtil.getResourceManager();
superuser = LookupUtil.getSubjectManager().getOverlord();
- newResource = createNewResource();
+ newResource = createNewResourceWithNewType();
}
@AfterMethod
public void afterMethod() throws Exception {
- deleteNewResource(newResource);
+ deleteNewResourceAgentResourceType(newResource);
}
public void testResourceErrors() {
@@ -123,7 +110,7 @@ public class ResourceManagerBeanTest extends UpdateSubsytemTestBase {
assert errors.size() == 0;
}
- private Resource createNewResource() throws Exception {
+ private Resource createNewResourceWithNewType() throws Exception {
getTransactionManager().begin();
EntityManager em = getEntityManager();
@@ -158,7 +145,7 @@ public class ResourceManagerBeanTest extends UpdateSubsytemTestBase {
return resource;
}
- private void deleteNewResource(Resource resource) throws Exception {
+ private void deleteNewResourceAgentResourceType(Resource resource) throws Exception {
if (resource != null) {
getTransactionManager().begin();
EntityManager em = getEntityManager();
diff --git a/modules/enterprise/server/jar/src/test/resources/test-jboss-home-dir/server/default/conf/README.txt b/modules/enterprise/server/jar/src/test/resources/test-jboss-home-dir/server/default/conf/README.txt
deleted file mode 100644
index 3acca0a..0000000
--- a/modules/enterprise/server/jar/src/test/resources/test-jboss-home-dir/server/default/conf/README.txt
+++ /dev/null
@@ -1 +0,0 @@
-jbossmq-state.xml is to allow for the JBossMQ JMS service to start in the embedded microcontainer. See AbstractEJB3Test.
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/test-jboss-home-dir/server/default/conf/jbossmq-state.xml b/modules/enterprise/server/jar/src/test/resources/test-jboss-home-dir/server/default/conf/jbossmq-state.xml
deleted file mode 100644
index caa6b9b..0000000
--- a/modules/enterprise/server/jar/src/test/resources/test-jboss-home-dir/server/default/conf/jbossmq-state.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<StateManager>
- <Users>
- <User>
- <Name>guest</Name>
- <Password>guest</Password>
- </User>
- </Users>
- <Roles>
- <Role name="guest">
- <UserName>guest</UserName>
- </Role>
- </Roles>
- <DurableSubscriptions>
- </DurableSubscriptions>
-</StateManager>
diff --git a/modules/enterprise/server/jar/src/test/resources/test/metadata/alerts/type-with-metric.xml b/modules/enterprise/server/jar/src/test/resources/test/metadata/alerts/type-with-metric.xml
new file mode 100644
index 0000000..1af82a9
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/test/metadata/alerts/type-with-metric.xml
@@ -0,0 +1,14 @@
+<plugin name="ResourceMetaDataManagerBeanTest" displayName="Type with Metric Test Plugin" package="org.rhq.plugins.mock.jboss"
+ version="1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <platform name="TypeWithMetrics">
+ <metric property="testMetric"
+ displayName="testMetric"
+ dataType="measurement"
+ measurementType="dynamic">
+ </metric>
+ </platform>
+</plugin>
+
\ No newline at end of file
diff --git a/modules/test-utils/src/main/java/org/rhq/test/JPAUtils.java b/modules/test-utils/src/main/java/org/rhq/test/JPAUtils.java
index 6e887c5..edbb7e7 100644
--- a/modules/test-utils/src/main/java/org/rhq/test/JPAUtils.java
+++ b/modules/test-utils/src/main/java/org/rhq/test/JPAUtils.java
@@ -50,13 +50,38 @@ public class JPAUtils {
}
public static void executeInTransaction(TransactionCallback callback) {
+ TransactionManager tm = null;
try {
- lookupTransactionManager().begin();
+ tm = lookupTransactionManager();
+ tm.begin();
callback.execute();
- lookupTransactionManager().commit();
+ tm.commit();
} catch (Throwable t) {
try {
- lookupTransactionManager().rollback();
+ if (tm != null) {
+ tm.rollback();
+ }
+ } catch (SystemException e) {
+ throw new RuntimeException("Failed to rollback transaction", e);
+ }
+ Throwable rootCause = getRootCause(t);
+ throw new RuntimeException(rootCause);
+ }
+ }
+
+ public static <T> T executeInTransaction(TransactionCallbackWithContext<T> callback) {
+ TransactionManager tm = null;
+ try {
+ tm = lookupTransactionManager();
+ tm.begin();
+ T results = callback.execute(tm, lookupEntityManager());
+ tm.commit();
+ return results;
+ } catch (Throwable t) {
+ try {
+ if (tm != null) {
+ tm.rollback();
+ }
} catch (SystemException e) {
throw new RuntimeException("Failed to rollback transaction", e);
}
@@ -161,7 +186,8 @@ public class JPAUtils {
em.createNativeQuery("delete from rhq_measurement_sched");
em.createNativeQuery("delete from rhq_measurement_def");
em.createNativeQuery("delete from rhq_plugin");
- em.createNativeQuery("delete from rhq_system_config where id not in (1, 2, 3, 4, 9, 10, 32, 34, 35, 36, 51, 52, 53, 54, 55, 56, 57, 58)");
+ em
+ .createNativeQuery("delete from rhq_system_config where id not in (1, 2, 3, 4, 9, 10, 32, 34, 35, 36, 51, 52, 53, 54, 55, 56, 57, 58)");
em.createNativeQuery("delete from rhq_alert_notification");
em.createNativeQuery("delete from rhq_alert_condition_log");
em.createNativeQuery("delete from rhq_alert");
diff --git a/modules/test-utils/src/main/java/org/rhq/test/TransactionCallbackWithContext.java b/modules/test-utils/src/main/java/org/rhq/test/TransactionCallbackWithContext.java
new file mode 100644
index 0000000..11850dc
--- /dev/null
+++ b/modules/test-utils/src/main/java/org/rhq/test/TransactionCallbackWithContext.java
@@ -0,0 +1,10 @@
+package org.rhq.test;
+
+import javax.persistence.EntityManager;
+import javax.transaction.TransactionManager;
+
+public interface TransactionCallbackWithContext<T> {
+
+ T execute(TransactionManager tm, EntityManager em) throws Exception;
+
+}
commit 0a302fd9e28be34dcd2f50090342a4f38b31c456
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Sep 7 13:56:11 2011 -0400
Update the resource container when a drift config is deleted
Prior to this commit if you deleted a drift configuration and then
subsequently restarted your agent, the drift configuration comes back to
life on the agent. That is because it is persisted to disk along with
other resource data when the agent is shut down. With this commit, when
a drift configuration is deleted, it is now also removed from the
resource container.
ResourceContainer now also stores DriftConfiguration
objects instead of DriftDetectionSchedules. The reason for this change
has to due with inventory sync. During a sync the server will be sending
the drift configs and not schedules. The drift detection scheudles exist
only on the agent.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
index d2956d3..d8ae989 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
@@ -26,7 +26,6 @@ import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
-import java.util.Set;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.zip.ZipEntry;
@@ -115,11 +114,9 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
}
log.debug("Rescheduling drift detection schedules for " + r);
- Set<DriftDetectionSchedule> driftSchedules = container.getDriftSchedules();
- if (driftSchedules != null)
- for (DriftDetectionSchedule schedule : driftSchedules) {
- schedulesQueue.addSchedule(schedule);
- }
+ for (DriftConfiguration c : container.getDriftConfigurations()) {
+ schedulesQueue.addSchedule(new DriftDetectionSchedule(r.getId(), c));
+ }
for (Resource child : r.getChildResources()) {
initSchedules(child, inventoryMgr);
@@ -280,9 +277,13 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
if (added) {
if (log.isDebugEnabled()) {
log.debug(schedule + " has been added to " + schedulesQueue);
- } else {
- log.warn("Failed to add " + schedule + " to " + schedulesQueue);
}
+ ResourceContainer container = getInventoryManager().getResourceContainer(resourceId);
+ if (container != null) {
+ container.addDriftConfiguration(driftConfiguration);
+ }
+ } else {
+ log.warn("Failed to add " + schedule + " to " + schedulesQueue);
}
}
@@ -322,10 +323,17 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
log.debug("Removed change set directory " + changeSetDir.getAbsolutePath());
}
});
+ if (schedule != null) {
+ ResourceContainer container = getInventoryManager().getResourceContainer(resourceId);
+ if (container != null) {
+ container.removeDriftConfiguration(schedule.getDriftConfiguration());
+ }
+ }
if (log.isDebugEnabled()) {
log.debug("Removed " + schedule + " from the queue " + schedulesQueue);
}
+
}
@Override
@@ -351,7 +359,7 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
InventoryManager inventoryMgr = PluginContainer.getInstance().getInventoryManager();
ResourceContainer container = inventoryMgr.getResourceContainer(resourceId);
if (container != null) {
- container.getDriftSchedules().add(updatedSchedule);
+ container.addDriftConfiguration(driftConfiguration);
}
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/ResourceContainer.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/ResourceContainer.java
index fcf1aea..f0722ed 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/ResourceContainer.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/ResourceContainer.java
@@ -28,6 +28,7 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
@@ -48,11 +49,11 @@ import org.jetbrains.annotations.Nullable;
import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.domain.content.transfer.ResourcePackageDetails;
+import org.rhq.core.domain.drift.DriftConfiguration;
import org.rhq.core.domain.measurement.Availability;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.pc.drift.DriftDetectionSchedule;
import org.rhq.core.pc.util.FacetLockType;
import org.rhq.core.pc.util.LoggingThreadFactory;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
@@ -89,7 +90,7 @@ public class ResourceContainer implements Serializable {
private SynchronizationState synchronizationState = SynchronizationState.NEW;
private Set<MeasurementScheduleRequest> measurementSchedule = new HashSet<MeasurementScheduleRequest>();
private Set<ResourcePackageDetails> installedPackages = new HashSet<ResourcePackageDetails>();
- private Set<DriftDetectionSchedule> driftSchedules = new HashSet<DriftDetectionSchedule>();
+ private Map<String, DriftConfiguration> driftConfigurations = new HashMap<String, DriftConfiguration>();
// transient fields
private transient ResourceComponent resourceComponent;
@@ -244,14 +245,22 @@ public class ResourceContainer implements Serializable {
}
}
- public Set<DriftDetectionSchedule> getDriftSchedules() {
+ public Collection<DriftConfiguration> getDriftConfigurations() {
synchronized (this) {
- return driftSchedules;
+ return driftConfigurations.values();
}
}
- public void setDriftSchedules(Set<DriftDetectionSchedule> schedules) {
- driftSchedules = schedules;
+ public void addDriftConfiguration(DriftConfiguration c) {
+ synchronized (this) {
+ driftConfigurations.put(c.getName(), c);
+ }
+ }
+
+ public void removeDriftConfiguration(DriftConfiguration c) {
+ synchronized (this) {
+ driftConfigurations.remove(c.getName());
+ }
}
public ResourceComponentState getResourceComponentState() {
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftManagerTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftManagerTest.java
index 226e84b..4b8b698 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftManagerTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftManagerTest.java
@@ -23,18 +23,25 @@ import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.clientapi.server.drift.DriftServerService;
import org.rhq.core.domain.drift.DriftConfiguration;
+import org.rhq.core.domain.resource.Resource;
import org.rhq.core.pc.PluginContainerConfiguration;
import org.rhq.core.pc.ServerServices;
+import org.rhq.core.pc.inventory.InventoryManager;
+import org.rhq.core.pc.inventory.ResourceContainer;
+import static java.util.Arrays.asList;
import static org.apache.commons.io.FileUtils.deleteDirectory;
import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
import static org.rhq.core.util.ZipUtil.unzipFile;
+import static org.rhq.test.AssertUtils.assertCollectionMatchesNoOrder;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
@@ -49,7 +56,7 @@ public class DriftManagerTest extends DriftTest {
private PluginContainerConfiguration pcConfig;
- private DriftManager driftMgr;
+ private TestDriftManager driftMgr;
@BeforeMethod
public void initTest() throws Exception {
@@ -63,7 +70,7 @@ public class DriftManagerTest extends DriftTest {
pcConfig.setDataDirectory(basedir());
pcConfig.setTemporaryDirectory(tmpDir);
- driftMgr = new DriftManager();
+ driftMgr = new TestDriftManager();
driftMgr.setConfiguration(pcConfig);
}
@@ -206,6 +213,21 @@ public class DriftManagerTest extends DriftTest {
}
@Test
+ public void unschedulingDetectionRemovesDriftConfigFromResourceContainer() throws Exception {
+ DriftConfiguration config = driftConfiguration("remove-from-queue", resourceDir.getAbsolutePath());
+ DriftConfiguration config2 = driftConfiguration("do-not-remove", resourceDir.getAbsolutePath());
+
+ driftMgr.scheduleDriftDetection(resourceId(), config);
+ driftMgr.scheduleDriftDetection(resourceId(), config2);
+ driftMgr.unscheduleDriftDetection(resourceId(), config);
+
+ ResourceContainer container = driftMgr.getInventoryManager().getResourceContainer(resourceId());
+
+ assertCollectionMatchesNoOrder(config + " should have been removed from the resource container ",
+ asList(config2), container.getDriftConfigurations());
+ }
+
+ @Test
public void unschedulingDetectionDeletesChangeSetDirectoryWhenScheduleIsNotActive() throws Exception {
DriftConfiguration config = driftConfiguration("delete-changeset-dir", resourceDir.getAbsolutePath());
File changeSetDir = changeSetDir(config.getName());
@@ -362,4 +384,30 @@ public class DriftManagerTest extends DriftTest {
void execute();
}
+ private static class TestDriftManager extends DriftManager {
+
+ FakeInventoryManager inventoryMgr = new FakeInventoryManager();
+
+ @Override
+ public InventoryManager getInventoryManager() {
+ return inventoryMgr;
+ }
+ }
+
+ private static class FakeInventoryManager extends InventoryManager {
+ private Map<Integer, ResourceContainer> resourceContainers = new HashMap<Integer, ResourceContainer>();
+
+ @Override
+ public ResourceContainer getResourceContainer(Integer resourceId) {
+ ResourceContainer container = resourceContainers.get(resourceId);
+ if (container == null) {
+ Resource resource = new Resource();
+ resource.setId(resourceId);
+ container = new ResourceContainer(resource, getClass().getClassLoader());
+ resourceContainers.put(resourceId, container);
+ }
+ return container;
+ }
+ }
+
}
commit 1742f95573899b85d40926dc3beb6b67c480e9e8
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Sep 7 13:21:38 2011 -0400
Reflect in the GUI when a changeset contains planned changes. It is
in the display name of the changeset tree node and also in the
changeset section of the drift details.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/AbstractDriftChangeSetsTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/AbstractDriftChangeSetsTreeView.java
index d3768c1..fb63830 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/AbstractDriftChangeSetsTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/AbstractDriftChangeSetsTreeView.java
@@ -44,6 +44,7 @@ import com.smartgwt.client.widgets.tree.events.NodeContextClickHandler;
import org.rhq.core.domain.drift.Drift;
import org.rhq.core.domain.drift.DriftChangeSet;
import org.rhq.core.domain.drift.DriftConfiguration;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
import org.rhq.enterprise.gui.coregui.client.ViewId;
@@ -387,7 +388,14 @@ public abstract class AbstractDriftChangeSetsTreeView extends LocatableTreeGrid
str.append(" (");
str.append(TimestampCellFormatter.format(changeset.getCtime(),
TimestampCellFormatter.DATE_TIME_FORMAT_SHORT));
+
+ if (DriftHandlingMode.plannedChanges == changeset.getDriftHandlingMode()) {
+ str.append(", ");
+ str.append(MSG.view_drift_table_driftHandlingMode_plannedChanges());
+ }
+
str.append(")");
+
return str.toString();
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java
index 1f6190d..189f398 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java
@@ -37,6 +37,7 @@ import org.rhq.core.domain.common.EntityContext;
import org.rhq.core.domain.criteria.DriftConfigurationCriteria;
import org.rhq.core.domain.drift.DriftConfiguration;
import org.rhq.core.domain.drift.DriftConfiguration.BaseDirectory;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
@@ -248,14 +249,7 @@ public class DriftConfigurationDataSource extends RPCDataSource<DriftConfigurati
record.setAttribute(ATTR_ID, from.getId());
record.setAttribute(ATTR_NAME, from.getName());
- switch (from.getDriftHandlingMode()) {
- case plannedChanges:
- record.setAttribute(ATTR_DRIFT_HANDLING_MODE, DRIFT_HANDLING_MODE_PLANNED);
- break;
- default:
- record.setAttribute(ATTR_DRIFT_HANDLING_MODE, DRIFT_HANDLING_MODE_NORMAL);
- break;
- }
+ record.setAttribute(ATTR_DRIFT_HANDLING_MODE, getDriftHandlingModeDisplayName(from.getDriftHandlingMode()));
record.setAttribute(ATTR_INTERVAL, String.valueOf(from.getInterval()));
record.setAttribute(ATTR_BASE_DIR_STRING, getBaseDirString(from.getBasedir()));
record.setAttribute(ATTR_ENABLED, ImageManager.getAvailabilityIcon(from.isEnabled()));
@@ -270,6 +264,16 @@ public class DriftConfigurationDataSource extends RPCDataSource<DriftConfigurati
return record;
}
+ public static String getDriftHandlingModeDisplayName(DriftHandlingMode driftHandlingMode) {
+ switch (driftHandlingMode) {
+ case plannedChanges:
+ return DRIFT_HANDLING_MODE_PLANNED;
+
+ default:
+ return DRIFT_HANDLING_MODE_NORMAL;
+ }
+ }
+
private static String getBaseDirString(BaseDirectory basedir) {
return basedir.getValueContext() + ":" + basedir.getValueName();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDetailsView.java
index 1c0b54e..1791971 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDetailsView.java
@@ -20,6 +20,9 @@
package org.rhq.enterprise.gui.coregui.client.drift;
+import static org.rhq.core.domain.drift.DriftFileStatus.LOADED;
+import static org.rhq.enterprise.gui.coregui.client.components.table.TimestampCellFormatter.DATE_TIME_FORMAT_FULL;
+
import java.util.LinkedHashMap;
import java.util.List;
@@ -37,6 +40,7 @@ import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.drift.Drift;
+import org.rhq.core.domain.drift.DriftChangeSet;
import org.rhq.core.domain.drift.DriftDetails;
import org.rhq.core.domain.drift.DriftFileStatus;
import org.rhq.core.domain.drift.FileDiffReport;
@@ -49,9 +53,6 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
-import static org.rhq.core.domain.drift.DriftFileStatus.LOADED;
-import static org.rhq.enterprise.gui.coregui.client.components.table.TimestampCellFormatter.DATE_TIME_FORMAT_FULL;
-
/**
* @author Jay Shaughnessy
*/
@@ -134,87 +135,90 @@ public class DriftDetailsView extends LocatableVLayout {
if (driftDetails.isBinaryFile()) {
switch (driftDetails.getDrift().getCategory()) {
- case FILE_ADDED:
- category.setValue(DriftDataSource.CATEGORY_ICON_ADD);
- oldFile.setValue(MSG.common_label_none());
- oldFileLink = spacer;
- newFile.setValue(driftDetails.getDrift().getNewDriftFile().getHashId());
- newFileLink = spacer;
- break;
- case FILE_CHANGED:
- category.setValue(DriftDataSource.CATEGORY_ICON_CHANGE);
- oldFile.setValue(driftDetails.getDrift().getOldDriftFile().getHashId());
- oldFileLink = createViewFileLink(driftDetails.getDrift().getOldDriftFile().getHashId(),
- driftDetails.getDrift().getPath(), driftDetails.getPreviousChangeSet().getVersion());
- newFile.setValue(driftDetails.getDrift().getNewDriftFile().getHashId());
- newFileLink = spacer;
- break;
- case FILE_REMOVED:
- category.setValue(DriftDataSource.CATEGORY_ICON_REMOVE);
- oldFile.setValue(driftDetails.getDrift().getOldDriftFile().getHashId());
- oldFileLink = spacer;
- newFile.setValue(MSG.common_label_none());
- newFileLink = spacer;
- break;
+ case FILE_ADDED:
+ category.setValue(DriftDataSource.CATEGORY_ICON_ADD);
+ oldFile.setValue(MSG.common_label_none());
+ oldFileLink = spacer;
+ newFile.setValue(driftDetails.getDrift().getNewDriftFile().getHashId());
+ newFileLink = spacer;
+ break;
+ case FILE_CHANGED:
+ category.setValue(DriftDataSource.CATEGORY_ICON_CHANGE);
+ oldFile.setValue(driftDetails.getDrift().getOldDriftFile().getHashId());
+ oldFileLink = createViewFileLink(driftDetails.getDrift().getOldDriftFile().getHashId(), driftDetails
+ .getDrift().getPath(), driftDetails.getPreviousChangeSet().getVersion());
+ newFile.setValue(driftDetails.getDrift().getNewDriftFile().getHashId());
+ newFileLink = spacer;
+ break;
+ case FILE_REMOVED:
+ category.setValue(DriftDataSource.CATEGORY_ICON_REMOVE);
+ oldFile.setValue(driftDetails.getDrift().getOldDriftFile().getHashId());
+ oldFileLink = spacer;
+ newFile.setValue(MSG.common_label_none());
+ newFileLink = spacer;
+ break;
}
driftForm.setItems(id, spacer, path, spacer, category, spacer, timestamp, spacer, oldFile, oldFileLink,
- newFile, newFileLink);
+ newFile, newFileLink);
} else {
FormItem viewDiffLink = spacer;
switch (driftDetails.getDrift().getCategory()) {
- case FILE_ADDED:
- category.setValue(DriftDataSource.CATEGORY_ICON_ADD);
- oldFile.setValue(MSG.common_label_none());
- oldFileLink = spacer;
- newFile.setValue(driftDetails.getDrift().getNewDriftFile().getHashId());
- newFileLink = createViewFileLink(driftDetails.getDrift().getNewDriftFile().getHashId(),
- driftDetails.getDrift().getPath(), driftDetails.getChangeSet().getVersion(),
- driftDetails.getNewFileStatus());
- break;
- case FILE_CHANGED:
- category.setValue(DriftDataSource.CATEGORY_ICON_CHANGE);
- oldFile.setValue(driftDetails.getDrift().getOldDriftFile().getHashId());
- oldFileLink = createViewFileLink(driftDetails.getDrift().getOldDriftFile().getHashId(),
- driftDetails.getDrift().getPath(), driftDetails.getPreviousChangeSet().getVersion(),
- driftDetails.getOldFileStatus());
- newFile.setValue(driftDetails.getDrift().getNewDriftFile().getHashId());
- newFileLink = createViewFileLink(driftDetails.getDrift().getNewDriftFile().getHashId(),
- driftDetails.getDrift().getPath(), driftDetails.getChangeSet().getVersion(),
- driftDetails.getNewFileStatus());
- if (driftDetails.getNewFileStatus() == LOADED && driftDetails.getOldFileStatus() == LOADED) {
- viewDiffLink = createViewDiffLink(driftDetails.getDrift(),
- driftDetails.getPreviousChangeSet().getVersion());
- }
- break;
- case FILE_REMOVED:
- category.setValue(DriftDataSource.CATEGORY_ICON_REMOVE);
- oldFile.setValue(driftDetails.getDrift().getOldDriftFile().getHashId());
- oldFileLink = createViewFileLink(driftDetails.getDrift().getOldDriftFile().getHashId(),
- driftDetails.getDrift().getPath(), driftDetails.getChangeSet().getVersion(),
- driftDetails.getOldFileStatus());
- newFile.setValue(MSG.common_label_none());
- newFileLink = spacer;
- break;
+ case FILE_ADDED:
+ category.setValue(DriftDataSource.CATEGORY_ICON_ADD);
+ oldFile.setValue(MSG.common_label_none());
+ oldFileLink = spacer;
+ newFile.setValue(driftDetails.getDrift().getNewDriftFile().getHashId());
+ newFileLink = createViewFileLink(driftDetails.getDrift().getNewDriftFile().getHashId(), driftDetails
+ .getDrift().getPath(), driftDetails.getChangeSet().getVersion(), driftDetails.getNewFileStatus());
+ break;
+ case FILE_CHANGED:
+ category.setValue(DriftDataSource.CATEGORY_ICON_CHANGE);
+ oldFile.setValue(driftDetails.getDrift().getOldDriftFile().getHashId());
+ oldFileLink = createViewFileLink(driftDetails.getDrift().getOldDriftFile().getHashId(), driftDetails
+ .getDrift().getPath(), driftDetails.getPreviousChangeSet().getVersion(), driftDetails
+ .getOldFileStatus());
+ newFile.setValue(driftDetails.getDrift().getNewDriftFile().getHashId());
+ newFileLink = createViewFileLink(driftDetails.getDrift().getNewDriftFile().getHashId(), driftDetails
+ .getDrift().getPath(), driftDetails.getChangeSet().getVersion(), driftDetails.getNewFileStatus());
+ if (driftDetails.getNewFileStatus() == LOADED && driftDetails.getOldFileStatus() == LOADED) {
+ viewDiffLink = createViewDiffLink(driftDetails.getDrift(), driftDetails.getPreviousChangeSet()
+ .getVersion());
+ }
+ break;
+ case FILE_REMOVED:
+ category.setValue(DriftDataSource.CATEGORY_ICON_REMOVE);
+ oldFile.setValue(driftDetails.getDrift().getOldDriftFile().getHashId());
+ oldFileLink = createViewFileLink(driftDetails.getDrift().getOldDriftFile().getHashId(), driftDetails
+ .getDrift().getPath(), driftDetails.getChangeSet().getVersion(), driftDetails.getOldFileStatus());
+ newFile.setValue(MSG.common_label_none());
+ newFileLink = spacer;
+ break;
}
driftForm.setItems(id, spacer, path, spacer, category, spacer, timestamp, spacer, oldFile, oldFileLink,
- newFile, newFileLink, spacer, spacer, spacer, viewDiffLink);
+ newFile, newFileLink, spacer, spacer, spacer, viewDiffLink);
}
addMember(driftForm);
}
- private DynamicForm createChangeSetForm(Drift drift) {
+ private DynamicForm createChangeSetForm(Drift<?, ?> drift) {
DynamicForm changeSetForm = new LocatableDynamicForm(extendLocatorId("changeSetForm"));
changeSetForm.setIsGroup(true);
changeSetForm.setGroupTitle(MSG.view_drift_table_changeSet());
changeSetForm.setWrapItemTitles(false);
+ DriftChangeSet<?> changeSet = drift.getChangeSet();
StaticTextItem changeSetId = new StaticTextItem("changeSetId", MSG.common_title_id());
- changeSetId.setValue(drift.getChangeSet().getId());
+ changeSetId.setValue(changeSet.getId());
StaticTextItem changeSetCategory = new StaticTextItem("changeSetCategory", MSG.common_title_category());
- changeSetCategory.setValue(drift.getChangeSet().getCategory().name());
+ changeSetCategory.setValue(changeSet.getCategory().name());
StaticTextItem changeSetVersion = new StaticTextItem("changeSetVersion", MSG.common_title_version());
- changeSetVersion.setValue(drift.getChangeSet().getVersion());
- changeSetForm.setItems(changeSetId, changeSetCategory, changeSetVersion);
+ changeSetVersion.setValue(changeSet.getVersion());
+ StaticTextItem changeSetDriftHandling = new StaticTextItem("changeSetDriftHandling", MSG
+ .view_drift_table_driftHandlingMode());
+ changeSetDriftHandling.setValue(DriftConfigurationDataSource.getDriftHandlingModeDisplayName(changeSet
+ .getDriftHandlingMode()));
+
+ changeSetForm.setItems(changeSetId, changeSetCategory, changeSetVersion, changeSetDriftHandling);
return changeSetForm;
}
@@ -309,7 +313,7 @@ public class DriftDetailsView extends LocatableVLayout {
return window;
}
- private LinkItem createViewDiffLink(final Drift drift, final int oldVersion) {
+ private LinkItem createViewDiffLink(final Drift<?, ?> drift, final int oldVersion) {
LinkItem viewDiffLink = new LinkItem("viewDiff");
viewDiffLink.setLinkTitle("(view diff)");
viewDiffLink.setShowTitle(false);
@@ -327,8 +331,7 @@ public class DriftDetailsView extends LocatableVLayout {
public void onSuccess(FileDiffReport diffReport) {
int newVersion = drift.getChangeSet().getVersion();
String diffContents = toHtml(diffReport.getDiff(), oldVersion, newVersion);
- LocatableWindow window = createDiffViewer(diffContents, drift.getPath(), oldVersion,
- newVersion);
+ LocatableWindow window = createDiffViewer(diffContents, drift.getPath(), oldVersion, newVersion);
window.show();
}
});
@@ -340,8 +343,8 @@ public class DriftDetailsView extends LocatableVLayout {
private String toHtml(List<String> deltas, int oldVersion, int newVersion) {
StringBuilder diff = new StringBuilder();
diff.append("<font color=\"red\">").append(deltas.get(0)).append(":").append(oldVersion).append("</font><br/>");
- diff.append("<font color=\"green\">").append(deltas.get(1)).append(":").append(newVersion)
- .append("</font><br/>");
+ diff.append("<font color=\"green\">").append(deltas.get(1)).append(":").append(newVersion).append(
+ "</font><br/>");
for (String line : deltas.subList(2, deltas.size())) {
if (line.startsWith("@@")) {
commit 4dbb8eeee9b4c3f12cfb2de0e2c14acf35a56baf
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Sep 7 12:47:35 2011 -0400
this completes the integration of JMS into the server/jar test embedded container.
JMS messages can now flow and we should be able to test alerts and other things that use JMS messaging.
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
index 8136142..8f086a6 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
@@ -19,22 +19,13 @@
package org.rhq.enterprise.server.alert.test;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
import org.testng.annotations.Test;
-import org.rhq.enterprise.server.drift.DriftManagerLocal;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
-import org.rhq.enterprise.server.util.LookupUtil;
@Test
public class AlertConditionTest extends AbstractEJB3Test {
public void test() throws Exception {
- DriftManagerLocal mgr = LookupUtil.getDriftManager();
- Log log = LogFactory.getLog("TESTING");
- log.fatal("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
- mgr.addChangeSet(1, 0, null);
- Thread.sleep(5000);
- log.fatal("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
+ // TODO need tests here
}
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
index 31d5c59..eb50402 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
@@ -22,7 +22,6 @@ import static org.rhq.test.JPAUtils.clearDB;
import static org.rhq.test.JPAUtils.lookupEntityManager;
import static org.rhq.test.JPAUtils.lookupTransactionManager;
-import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Hashtable;
@@ -47,7 +46,6 @@ import org.testng.annotations.BeforeSuite;
import org.jboss.ejb3.embedded.EJB3StandaloneBootstrap;
import org.jboss.ejb3.embedded.EJB3StandaloneDeployer;
import org.jboss.mx.util.MBeanServerLocator;
-import org.jboss.system.server.ServerConfigImpl;
import org.rhq.core.db.DatabaseTypeFactory;
import org.rhq.core.db.PostgresqlDatabaseType;
@@ -71,11 +69,11 @@ import org.rhq.enterprise.server.util.LookupUtil;
public abstract class AbstractEJB3Test extends AssertJUnit {
private static EJB3StandaloneDeployer deployer;
- private static MBeanServer dummyJBossMBeanServer;
private static Statistics stats;
private static long start; // see endTest() if you want to output this
private SchedulerService schedulerService;
private ServerPluginService serverPluginService;
+ private MBeanServer dummyJBossMBeanServer;
@BeforeClass
public void resetDB() throws Exception {
@@ -92,9 +90,6 @@ public abstract class AbstractEJB3Test extends AssertJUnit {
@BeforeSuite(alwaysRun = true)
public static void startupEmbeddedJboss() throws Exception {
- // need to create the JBoss MBeanServer and register the ServerConfig service for JMS subsystem to start properly
- prepareServerConfigMBean();
-
// Setting content location to the tmp dir
System.setProperty(ContentSourceManagerBean.FILESYSTEM_PROPERTY, System.getProperty("java.io.tmpdir"));
@@ -112,9 +107,6 @@ public abstract class AbstractEJB3Test extends AssertJUnit {
deployer.setClassLoader(AbstractEJB3Test.class.getClassLoader());
System.err.println("...... embedded container classloader set....");
- deployer.setMbeanServer(getJBossMBeanServer());
- System.err.println("...... embedded container mbean server set....");
-
deployer.getArchivesByResource().add("META-INF/persistence.xml");
System.err.println("...... embedded container persistence xml deployed....");
@@ -177,10 +169,6 @@ public abstract class AbstractEJB3Test extends AssertJUnit {
}
}
EJB3StandaloneBootstrap.shutdown();
- if (dummyJBossMBeanServer != null) {
- MBeanServerFactory.releaseMBeanServer(dummyJBossMBeanServer);
- dummyJBossMBeanServer = null;
- }
}
@BeforeMethod
@@ -250,7 +238,7 @@ public abstract class AbstractEJB3Test extends AssertJUnit {
*
* @return MBeanServer instance
*/
- public static MBeanServer getJBossMBeanServer() {
+ public MBeanServer getJBossMBeanServer() {
if (dummyJBossMBeanServer == null) {
dummyJBossMBeanServer = MBeanServerFactory.createMBeanServer("jboss");
MBeanServerLocator.setJBoss(dummyJBossMBeanServer);
@@ -359,30 +347,4 @@ public abstract class AbstractEJB3Test extends AssertJUnit {
schedulerService = null;
}
}
-
- private static final void prepareServerConfigMBean() throws Exception {
- // the JMS state service needs this, but for some reason, this deployed but the
- // state server can't find it in the JBoss MBeanServer. So this method deploys this manually.
- //
- // <bean name="jboss.system:type=ServerConfig" class="org.jboss.system.server.ServerConfigImpl">
- // <constructor>
- // <parameter class="java.util.Properties">
- // <map keyClass="java.lang.String" valueClass="java.lang.String">
- // <entry>
- // <key>jboss.home.dir</key>
- // <value>target</value>
- // </entry>
- // </map>
- // </parameter>
- // </constructor>
- // </bean>
- Properties props = new Properties();
- File jbossHomeDir = new File("target/test-classes/test-jboss-home-dir");
- assert jbossHomeDir.isDirectory() : "Test framework did not setup jboss home directory properly: "
- + jbossHomeDir.getAbsolutePath();
- props.setProperty("jboss.home.dir", jbossHomeDir.getAbsolutePath());
- ServerConfigImpl serverConfigService = new ServerConfigImpl(props);
- serverConfigService.initURLs();
- getJBossMBeanServer().registerMBean(serverConfigService, ServerConfigImpl.OBJECT_NAME);
- }
}
diff --git a/modules/enterprise/server/jar/src/test/resources/jboss-jms-beans.xml b/modules/enterprise/server/jar/src/test/resources/jboss-jms-beans.xml
index 3fa7853..287cffc 100644
--- a/modules/enterprise/server/jar/src/test/resources/jboss-jms-beans.xml
+++ b/modules/enterprise/server/jar/src/test/resources/jboss-jms-beans.xml
@@ -71,8 +71,7 @@
<property name="workManager"><inject bean="jms-rar-WorkManager"/></property>
</bean>
- <bean name="jboss.mq:service=StateManager" class="org.jboss.mq.sm.file.DynamicStateManager">
- <property name="stateFile">jbossmq-state.xml</property>
+ <bean name="jboss.mq:service=StateManager" class="org.jboss.mq.sm.none.NullStateManager">
</bean>
<bean name="BasicQueueParameters" class="org.jboss.mq.server.BasicQueueParameters"/>
commit 4d7cd7fe700fc600d97d6f0ed8c989debe7fb0a6
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Sep 7 11:58:21 2011 -0400
test log4j.xml hides the TIMER SERVICE IS NOT INSTALLED warning - we know embedded EJB3 container doesn't support timers
diff --git a/modules/enterprise/server/jar/src/test/resources/log4j.xml b/modules/enterprise/server/jar/src/test/resources/log4j.xml
index 681f2af..161f11e 100644
--- a/modules/enterprise/server/jar/src/test/resources/log4j.xml
+++ b/modules/enterprise/server/jar/src/test/resources/log4j.xml
@@ -49,6 +49,11 @@
<priority value="ERROR"/>
</category>
+ <!-- hides the TIMER SERVICE IS NOT INSTALLED warning - we know embedded EJB3 container doesn't support timers -->
+ <category name="org.jboss.ejb3.timerservice.jboss.JBossTimerServiceFactory">
+ <priority value="ERROR"/>
+ </category>
+
<!-- Hibernate SQL logs -->
<!--
<category name="org.hibernate.SQL">
commit 0b736a13f2fd80a7d75acdf064de87ff06aa8778
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Sep 7 11:20:57 2011 -0400
this gets JMS messages to flow in our test embedded container
diff --git a/modules/enterprise/server/jar/pom.xml b/modules/enterprise/server/jar/pom.xml
index d2f2bc5..77750c0 100644
--- a/modules/enterprise/server/jar/pom.xml
+++ b/modules/enterprise/server/jar/pom.xml
@@ -552,6 +552,36 @@ Build-OS-Version=${os.version}
</executions>
</plugin>
+ <!-- in order to get JMS to work properly in embedded test container, extract jms-rs.rar classes -->
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+
+ <execution>
+ <id>Extract JMS classes from RAR needed for JMS tests</id>
+ <phase>process-classes</phase>
+ <configuration>
+ <tasks>
+ <unzip src="src/test/resources/jms-ra.rar" dest="target">
+ <patternset>
+ <include name="jms-ra.jar"/>
+ </patternset>
+ </unzip>
+ <unzip src="target/jms-ra.jar" dest="target/test-classes">
+ <patternset>
+ <include name="org/**"/>
+ </patternset>
+ </unzip>
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ </executions>
+ </plugin>
+
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<!-- Everything but the web service tests, this is the standard test execution -->
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
new file mode 100644
index 0000000..8136142
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java
@@ -0,0 +1,40 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.alert.test;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.testng.annotations.Test;
+
+import org.rhq.enterprise.server.drift.DriftManagerLocal;
+import org.rhq.enterprise.server.test.AbstractEJB3Test;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+@Test
+public class AlertConditionTest extends AbstractEJB3Test {
+ public void test() throws Exception {
+ DriftManagerLocal mgr = LookupUtil.getDriftManager();
+ Log log = LogFactory.getLog("TESTING");
+ log.fatal("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+ mgr.addChangeSet(1, 0, null);
+ Thread.sleep(5000);
+ log.fatal("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
+ }
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
index 5ed329f..31d5c59 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
@@ -18,6 +18,11 @@
*/
package org.rhq.enterprise.server.test;
+import static org.rhq.test.JPAUtils.clearDB;
+import static org.rhq.test.JPAUtils.lookupEntityManager;
+import static org.rhq.test.JPAUtils.lookupTransactionManager;
+
+import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Hashtable;
@@ -42,6 +47,7 @@ import org.testng.annotations.BeforeSuite;
import org.jboss.ejb3.embedded.EJB3StandaloneBootstrap;
import org.jboss.ejb3.embedded.EJB3StandaloneDeployer;
import org.jboss.mx.util.MBeanServerLocator;
+import org.jboss.system.server.ServerConfigImpl;
import org.rhq.core.db.DatabaseTypeFactory;
import org.rhq.core.db.PostgresqlDatabaseType;
@@ -57,10 +63,6 @@ import org.rhq.enterprise.server.scheduler.SchedulerService;
import org.rhq.enterprise.server.scheduler.SchedulerServiceMBean;
import org.rhq.enterprise.server.util.LookupUtil;
-import static org.rhq.test.JPAUtils.clearDB;
-import static org.rhq.test.JPAUtils.lookupEntityManager;
-import static org.rhq.test.JPAUtils.lookupTransactionManager;
-
/**
* This is the abstract test base for server jar tests.
*
@@ -68,6 +70,13 @@ import static org.rhq.test.JPAUtils.lookupTransactionManager;
*/
public abstract class AbstractEJB3Test extends AssertJUnit {
+ private static EJB3StandaloneDeployer deployer;
+ private static MBeanServer dummyJBossMBeanServer;
+ private static Statistics stats;
+ private static long start; // see endTest() if you want to output this
+ private SchedulerService schedulerService;
+ private ServerPluginService serverPluginService;
+
@BeforeClass
public void resetDB() throws Exception {
if (isDBResetNeeded()) {
@@ -82,6 +91,10 @@ public abstract class AbstractEJB3Test extends AssertJUnit {
//@BeforeSuite(groups = {"integration.ejb3","PERF"}) // TODO investigate again
@BeforeSuite(alwaysRun = true)
public static void startupEmbeddedJboss() throws Exception {
+
+ // need to create the JBoss MBeanServer and register the ServerConfig service for JMS subsystem to start properly
+ prepareServerConfigMBean();
+
// Setting content location to the tmp dir
System.setProperty(ContentSourceManagerBean.FILESYSTEM_PROPERTY, System.getProperty("java.io.tmpdir"));
@@ -92,21 +105,30 @@ public abstract class AbstractEJB3Test extends AssertJUnit {
EJB3StandaloneBootstrap.boot(null);
// EJB3StandaloneBootstrap.scanClasspath();
- /*Properties p = System.getProperties();
- * for (Object name : p.keySet()) { System.out.println(" " + name + " = " +
- * p.getProperty((String)name));}*/
-
- System.err.println("...... embedded-jboss-beans deployed....");
+ System.err.println("...... embedded container booted....");
- // Add all EJBs found in the archive that has this file
- EJB3StandaloneDeployer deployer = EJB3StandaloneBootstrap.createDeployer(); //new EJB3StandaloneDeployer();
+ deployer = EJB3StandaloneBootstrap.createDeployer();
deployer.setClassLoader(AbstractEJB3Test.class.getClassLoader());
+ System.err.println("...... embedded container classloader set....");
+
+ deployer.setMbeanServer(getJBossMBeanServer());
+ System.err.println("...... embedded container mbean server set....");
+
deployer.getArchivesByResource().add("META-INF/persistence.xml");
+ System.err.println("...... embedded container persistence xml deployed....");
+
deployer.getArchivesByResource().add("META-INF/ejb-jar.xml");
+ System.err.println("...... embedded container ejb-jar xml deployed....");
+
+ EJB3StandaloneBootstrap.deployXmlResource("jboss-jms-beans.xml");
+ System.err.println("...... embedded container jboss-jms-beans xml deployed....");
+
+ EJB3StandaloneBootstrap.deployXmlResource("rhq-mdb-beans.xml");
+ System.err.println("...... embedded container rhq-mdb-beans xml deployed....");
/*
- * File core = new File(deployDir, "on-core-domain-ejb.ejb3"); if (!core.exists())
+ * File core = new File(deployDir, "on-core-domain-ejb.ejb3"); if (!core.exists())
* System.err.println("Deployment directory does not exist: " + core.getAbsolutePath());
* deployer.getArchives().add(core.toURI().toURL());
*
@@ -116,10 +138,6 @@ public abstract class AbstractEJB3Test extends AssertJUnit {
*
*/
- System.err.println("...... deploying MM ejb3.....");
- System.err.println("...... ejb3 deployed....");
-
- // Deploy everything we got
//deployer.setKernel(EJB3StandaloneBootstrap.getKernel());
deployer.create();
System.err.println("...... deployer created....");
@@ -133,6 +151,8 @@ public abstract class AbstractEJB3Test extends AssertJUnit {
stats = sessionFactory.getStatistics();
stats.setStatisticsEnabled(true);
+ System.err.println("...... embedded container initialized and ready for testing....");
+
} catch (Throwable t) {
// Catch RuntimeExceptions and Errors and dump their stack trace, because Surefire will completely swallow them
// and throw a cryptic NPE (see http://jira.codehaus.org/browse/SUREFIRE-157)!
@@ -142,13 +162,27 @@ public abstract class AbstractEJB3Test extends AssertJUnit {
}
//@Configuration(groups = "integration.ejb3", afterSuite = true)
- @AfterSuite
+ @AfterSuite(alwaysRun = true)
public static void shutdownEmbeddedJboss() {
+ System.err.println("!!! Any errors occurring after this point occurred during embedded server shutdown !!!\n"
+ + "!!! and is probably not a real problem. !!!");
+ if (deployer != null) {
+ try {
+ deployer.stop();
+ deployer.destroy();
+ deployer = null;
+ } catch (Throwable t) {
+ System.err.println("Failed to stop embedded deployer");
+ t.printStackTrace(System.err);
+ }
+ }
EJB3StandaloneBootstrap.shutdown();
+ if (dummyJBossMBeanServer != null) {
+ MBeanServerFactory.releaseMBeanServer(dummyJBossMBeanServer);
+ dummyJBossMBeanServer = null;
+ }
}
- private static long start;
-
@BeforeMethod
public static void startTest() {
if (DatabaseTypeFactory.getDefaultDatabaseType() == null) {
@@ -176,10 +210,6 @@ public abstract class AbstractEJB3Test extends AssertJUnit {
//System.out.println("Connections used: " + (stats.getQueryExecutionCount() - start));
}
- private TransactionManager tm;
- private MBeanServer dummyJBossMBeanServer;
- private static Statistics stats;
-
public TransactionManager getTransactionManager() {
return lookupTransactionManager();
}
@@ -220,7 +250,7 @@ public abstract class AbstractEJB3Test extends AssertJUnit {
*
* @return MBeanServer instance
*/
- public MBeanServer getJBossMBeanServer() {
+ public static MBeanServer getJBossMBeanServer() {
if (dummyJBossMBeanServer == null) {
dummyJBossMBeanServer = MBeanServerFactory.createMBeanServer("jboss");
MBeanServerLocator.setJBoss(dummyJBossMBeanServer);
@@ -258,16 +288,15 @@ public abstract class AbstractEJB3Test extends AssertJUnit {
*/
public void unprepareForTestAgents() {
try {
- if (dummyJBossMBeanServer != null) {
- dummyJBossMBeanServer.unregisterMBean(ServerCommunicationsServiceMBean.OBJECT_NAME);
+ MBeanServer mbs = getJBossMBeanServer();
+ if (mbs.isRegistered(ServerCommunicationsServiceMBean.OBJECT_NAME)) {
+ mbs.unregisterMBean(ServerCommunicationsServiceMBean.OBJECT_NAME);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
- private ServerPluginService serverPluginService;
-
/**
* If you need to test server plugins, you must first prepare the server plugin service.
* After this returns, the caller must explicitly start the PC by using the appropriate API
@@ -298,8 +327,6 @@ public abstract class AbstractEJB3Test extends AssertJUnit {
}
}
- private SchedulerService schedulerService;
-
public SchedulerService getSchedulerService() {
return schedulerService;
}
@@ -332,4 +359,30 @@ public abstract class AbstractEJB3Test extends AssertJUnit {
schedulerService = null;
}
}
+
+ private static final void prepareServerConfigMBean() throws Exception {
+ // the JMS state service needs this, but for some reason, this deployed but the
+ // state server can't find it in the JBoss MBeanServer. So this method deploys this manually.
+ //
+ // <bean name="jboss.system:type=ServerConfig" class="org.jboss.system.server.ServerConfigImpl">
+ // <constructor>
+ // <parameter class="java.util.Properties">
+ // <map keyClass="java.lang.String" valueClass="java.lang.String">
+ // <entry>
+ // <key>jboss.home.dir</key>
+ // <value>target</value>
+ // </entry>
+ // </map>
+ // </parameter>
+ // </constructor>
+ // </bean>
+ Properties props = new Properties();
+ File jbossHomeDir = new File("target/test-classes/test-jboss-home-dir");
+ assert jbossHomeDir.isDirectory() : "Test framework did not setup jboss home directory properly: "
+ + jbossHomeDir.getAbsolutePath();
+ props.setProperty("jboss.home.dir", jbossHomeDir.getAbsolutePath());
+ ServerConfigImpl serverConfigService = new ServerConfigImpl(props);
+ serverConfigService.initURLs();
+ getJBossMBeanServer().registerMBean(serverConfigService, ServerConfigImpl.OBJECT_NAME);
+ }
}
diff --git a/modules/enterprise/server/jar/src/test/resources/embedded-jboss-beans.xml b/modules/enterprise/server/jar/src/test/resources/embedded-jboss-beans.xml
index 55d697b..05edefa 100644
--- a/modules/enterprise/server/jar/src/test/resources/embedded-jboss-beans.xml
+++ b/modules/enterprise/server/jar/src/test/resources/embedded-jboss-beans.xml
@@ -157,181 +157,4 @@
</constructor>
</bean>
- <!-- JMS configuration -->
- <bean name="jboss.mq:service=JMSProviderLoader,name=JMSProvider" class="org.jboss.jms.jndi.JNDIProviderAdapter">
- <property name="factoryRef">java:/XAConnectionFactory</property>
- <property name="queueFactoryRef">java:/XAConnectionFactory</property>
- <property name="topicFactoryRef">java:/XAConnectionFactory</property>
- <property name="properties" class="java.util.Properties">
- <map keyClass="java.lang.String" valueClass="java.lang.String">
- <entry>
- <key>java.naming.factory.initial</key>
- <value>org.jnp.interfaces.LocalOnlyContextFactory</value>
- </entry>
- <entry>
- <key>java.naming.factory.url.pkgs</key>
- <value>org.jboss.naming:org.jnp.interfaces</value>
- </entry>
- </map>
- </property>
- </bean>
-
- <bean name="b1" class="org.jboss.ejb3.embedded.JndiBinder">
- <property name="jndiProperties"><inject bean="InitialContextProperties"/></property>
- <property name="target"><inject bean="jboss.mq:service=JMSProviderLoader,name=JMSProvider"/></property>
- <property name="bindTo">java:/DefaultJMSProvider</property>
- <property name="serializable">true</property>
- </bean>
-
- <bean name="jboss.mq:service=ServerSessionPoolMBean,name=StdJMSPool" class="org.jboss.jms.asf.StdServerSessionPoolFactory">
- <property name="name">StdJMSPool</property>
- <property name="xidFactory"><inject bean="XidFactoryMBean"/></property>
- <property name="transactionManager"><inject bean="TransactionManager"/></property>
- </bean>
-
- <bean name="b2" class="org.jboss.ejb3.embedded.JndiBinder">
- <property name="jndiProperties"><inject bean="InitialContextProperties"/></property>
- <property name="target"><inject bean="jboss.mq:service=ServerSessionPoolMBean,name=StdJMSPool"/></property>
- <property name="bindTo">java:/StdJMSPool</property>
- <property name="serializable">false</property>
- </bean>
-
-
- <bean name="jboss.mq:service=PersistenceManager" class="org.jboss.mq.kernel.JDBC2PersistenceManager">
- <property name="transactionManager">
- <inject bean="TransactionManager"/>
- </property>
- <property name="datasource">
- <inject bean="RHQDS"/>
- </property>
- <property name="sqlProperties">
-
- BLOB_TYPE=OBJECT_BLOB
- INSERT_TX = INSERT INTO JMS_TRANSACTIONS (TXID) values(?)
- INSERT_MESSAGE = INSERT INTO JMS_MESSAGES (MESSAGEID, DESTINATION, MESSAGEBLOB, TXID, TXOP) VALUES(?,?,?,?,?)
- SELECT_ALL_UNCOMMITED_TXS = SELECT TXID FROM JMS_TRANSACTIONS
- SELECT_MAX_TX = SELECT MAX(TXID) FROM JMS_MESSAGES
- SELECT_MESSAGES_IN_DEST = SELECT MESSAGEID, MESSAGEBLOB FROM JMS_MESSAGES WHERE DESTINATION=?
- SELECT_MESSAGE = SELECT MESSAGEID, MESSAGEBLOB FROM JMS_MESSAGES WHERE MESSAGEID=? AND DESTINATION=?
- MARK_MESSAGE = UPDATE JMS_MESSAGES SET TXID=?, TXOP=? WHERE MESSAGEID=? AND DESTINATION=?
- UPDATE_MESSAGE = UPDATE JMS_MESSAGES SET MESSAGEBLOB=? WHERE MESSAGEID=? AND DESTINATION=?
- UPDATE_MARKED_MESSAGES = UPDATE JMS_MESSAGES SET TXID=?, TXOP=? WHERE TXOP=?
- UPDATE_MARKED_MESSAGES_WITH_TX = UPDATE JMS_MESSAGES SET TXID=?, TXOP=? WHERE TXOP=? AND TXID=?
- DELETE_MARKED_MESSAGES_WITH_TX = DELETE FROM JMS_MESSAGES WHERE TXOP=? AND JMS_MESSAGES.TXID IN (SELECT TXID FROM JMS_TRANSACTIONS)
- DELETE_TX = DELETE FROM JMS_TRANSACTIONS WHERE TXID = ?
- DELETE_MARKED_MESSAGES = DELETE FROM JMS_MESSAGES WHERE TXID=? AND TXOP=?
- DELETE_MESSAGE = DELETE FROM JMS_MESSAGES WHERE MESSAGEID=? AND DESTINATION=?
- CREATE_MESSAGE_TABLE = CREATE CACHED TABLE JMS_MESSAGES ( MESSAGEID INTEGER NOT NULL, \
- DESTINATION VARCHAR(255) NOT NULL, TXID INTEGER, TXOP CHAR(1), \
- MESSAGEBLOB OBJECT, PRIMARY KEY (MESSAGEID, DESTINATION) )
- CREATE_IDX_MESSAGE_TXOP_TXID = CREATE INDEX JMS_MESSAGES_TXOP_TXID ON JMS_MESSAGES (TXOP, TXID)
- CREATE_IDX_MESSAGE_DESTINATION = CREATE INDEX JMS_MESSAGES_DESTINATION ON JMS_MESSAGES (DESTINATION)
- CREATE_TX_TABLE = CREATE CACHED TABLE JMS_TRANSACTIONS ( TXID INTEGER, PRIMARY KEY (TXID) )
- CREATE_TABLES_ON_STARTUP = TRUE
- DELETE_TEMPORARY_MESSAGES = DELETE FROM JMS_MESSAGES WHERE TXOP='T'
-
- </property>
- </bean>
-
- <bean name="jboss.mq:service=MessageCache" class="org.jboss.mq.kernel.MessageCache">
- <property name="persistenceManager"><inject bean="jboss.mq:service=PersistenceManager"/></property>
- <property name="highMemoryMark">50</property>
- <property name="maxMemoryMark">60</property>
- </bean>
-
- <bean name="jboss.mq:service=StateManager" class="org.jboss.mq.kernel.JDBCStateManager">
- <property name="transactionManager">
- <inject bean="TransactionManager"/>
- </property>
- <property name="datasource">
- <inject bean="RHQDS"/>
- </property>
- <property name="sqlProperties">
-
- CREATE_TABLES_ON_STARTUP = TRUE
- CREATE_USER_TABLE = CREATE TABLE JMS_USERS (USERID VARCHAR(32) NOT NULL, PASSWD VARCHAR(32) NOT NULL, \
- CLIENTID VARCHAR(128), PRIMARY KEY(USERID))
- CREATE_ROLE_TABLE = CREATE TABLE JMS_ROLES (ROLEID VARCHAR(32) NOT NULL, USERID VARCHAR(32) NOT NULL, \
- PRIMARY KEY(USERID, ROLEID))
- CREATE_SUBSCRIPTION_TABLE = CREATE TABLE JMS_SUBSCRIPTIONS (CLIENTID VARCHAR(128) NOT NULL, \
- SUBNAME VARCHAR(128) NOT NULL, TOPIC VARCHAR(255) NOT NULL, \
- SELECTOR VARCHAR(255), PRIMARY KEY(CLIENTID, SUBNAME))
- GET_SUBSCRIPTION = SELECT TOPIC, SELECTOR FROM JMS_SUBSCRIPTIONS WHERE CLIENTID=? AND SUBNAME=?
- LOCK_SUBSCRIPTION = SELECT TOPIC, SELECTOR FROM JMS_SUBSCRIPTIONS WHERE CLIENTID=? AND SUBNAME=?
- GET_SUBSCRIPTIONS_FOR_TOPIC = SELECT CLIENTID, SUBNAME, SELECTOR FROM JMS_SUBSCRIPTIONS WHERE TOPIC=?
- INSERT_SUBSCRIPTION = INSERT INTO JMS_SUBSCRIPTIONS (CLIENTID, SUBNAME, TOPIC, SELECTOR) VALUES(?,?,?,?)
- UPDATE_SUBSCRIPTION = UPDATE JMS_SUBSCRIPTIONS SET TOPIC=?, SELECTOR=? WHERE CLIENTID=? AND SUBNAME=?
- REMOVE_SUBSCRIPTION = DELETE FROM JMS_SUBSCRIPTIONS WHERE CLIENTID=? AND SUBNAME=?
- GET_USER_BY_CLIENTID = SELECT USERID, PASSWD, CLIENTID FROM JMS_USERS WHERE CLIENTID=?
- GET_USER = SELECT PASSWD, CLIENTID FROM JMS_USERS WHERE USERID=?
- POPULATE.TABLES.01 = INSERT INTO JMS_USERS (USERID, PASSWD) VALUES ('guest', 'guest')
- POPULATE.TABLES.02 = INSERT INTO JMS_USERS (USERID, PASSWD) VALUES ('j2ee', 'j2ee')
- POPULATE.TABLES.03 = INSERT INTO JMS_USERS (USERID, PASSWD, CLIENTID) VALUES ('john', 'needle', 'DurableSubscriberExample')
- POPULATE.TABLES.04 = INSERT INTO JMS_USERS (USERID, PASSWD) VALUES ('nobody', 'nobody')
- POPULATE.TABLES.05 = INSERT INTO JMS_USERS (USERID, PASSWD) VALUES ('dynsub', 'dynsub')
- POPULATE.TABLES.06 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('guest','guest')
- POPULATE.TABLES.07 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('j2ee','guest')
- POPULATE.TABLES.08 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('john','guest')
- POPULATE.TABLES.09 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('subscriber','john')
- POPULATE.TABLES.10 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('publisher','john')
- POPULATE.TABLES.11 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('publisher','dynsub')
- POPULATE.TABLES.12 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('durpublisher','john')
- POPULATE.TABLES.13 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('durpublisher','dynsub')
- POPULATE.TABLES.14 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('noacc','nobody')
-
- </property>
- </bean>
-
-
- <bean name="BasicQueueParameters" class="org.jboss.mq.server.BasicQueueParameters"/>
-
- <bean name="jboss.mq:service=ThreadPool" class="org.jboss.util.threadpool.BasicThreadPool">
- <property name="name">JMSThread</property>
- <property name="threadGroupName">JBossMQ Server Threads</property>
- <!-- The max number of threads in the pool -->
- <property name="maximumPoolSize">10</property>
- <!-- The max number of tasks before the queue is full -->
- <property name="maximumQueueSize">1000</property>
- <!-- The behavior of the pool when a task is added and the queue is full.
- abort - a RuntimeException is thrown
- run - the calling thread executes the task
- wait - the calling thread blocks until the queue has room
- discard - the task is silently discarded without being run
- discardOldest - check to see if a task is about to complete and enque
- the new task if possible, else run the task in the calling thread
- -->
- </bean>
-
- <bean name="jboss.mq:service=DestinationManager" class="org.jboss.mq.server.JMSDestinationManager">
- <constructor>
- <parameter class="org.jboss.mq.server.BasicQueueParameters">
- <inject bean="BasicQueueParameters"/>
- </parameter>
- </constructor>
- <property name="persistenceManager"><inject bean="jboss.mq:service=PersistenceManager"/></property>
- <property name="messageCache"><inject bean="jboss.mq:service=MessageCache"/></property>
- <property name="stateManager"><inject bean="jboss.mq:service=StateManager"/></property>
- <property name="threadPool"><inject bean="jboss.mq:service=ThreadPool"/></property>
- <property name="threadGroup"><inject bean="jboss.mq:service=ThreadPool" property="threadGroup"/></property>
- <start method="startServer"/>
- <stop method="stopServer"/>
- </bean>
-
- <bean name="jboss.mq.destination:service=Queue,name=DLQ" class="org.jboss.mq.kernel.Queue">
- <property name="destinationManagerPojo"><inject bean="jboss.mq:service=DestinationManager"/></property>
- <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property>
- <property name="destinationName">DLQ</property>
- </bean>
-
- <bean name="jboss.mq:service=Invoker" class="org.jboss.mq.server.JMSServerInvoker">
- <property name="next"><inject bean="jboss.mq:service=DestinationManager"/></property>
- </bean>
-
- <bean name="jboss.mq:service=invocationlayer,type=JVM" class="org.jboss.mq.kernel.JVMIL">
- <property name="jmsInvoker"><inject bean="jboss.mq:service=Invoker"/></property>
- <property name="connectionFactoryJNDIRef">java:/ConnectionFactory</property>
- <property name="XAConnectionFactoryJNDIRef">java:/JmsXA</property>
- <property name="pingPeriod">0</property>
- <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property>
- </bean>
</deployment>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/jboss-jms-beans.xml b/modules/enterprise/server/jar/src/test/resources/jboss-jms-beans.xml
index 624b684..3fa7853 100644
--- a/modules/enterprise/server/jar/src/test/resources/jboss-jms-beans.xml
+++ b/modules/enterprise/server/jar/src/test/resources/jboss-jms-beans.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd"
- xmlns="urn:jboss:bean-deployer">
+ xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd"
+ xmlns="urn:jboss:bean-deployer:2.0">
<bean name="jboss.mq:service=JMSProviderLoader,name=JMSProvider" class="org.jboss.jms.jndi.JNDIProviderAdapter">
- <property name="factoryRef">java:/XAConnectionFactory</property>
- <property name="queueFactoryRef">java:/XAConnectionFactory</property>
- <property name="topicFactoryRef">java:/XAConnectionFactory</property>
+ <property name="factoryRef">java:/JmsXA</property>
+ <property name="queueFactoryRef">java:/JmsXA</property>
+ <property name="topicFactoryRef">java:/JmsXA</property>
<property name="properties" class="java.util.Properties">
<map keyClass="java.lang.String" valueClass="java.lang.String">
<entry>
@@ -42,40 +42,7 @@
</bean>
- <bean name="jboss.mq:service=PersistenceManager" class="org.jboss.mq.kernel.JDBC2PersistenceManager">
- <property name="transactionManager">
- <inject bean="TransactionManager"/>
- </property>
- <property name="datasource">
- <inject bean="DefaultDS"/>
- </property>
- <property name="sqlProperties">
-
- BLOB_TYPE=OBJECT_BLOB
- INSERT_TX = INSERT INTO JMS_TRANSACTIONS (TXID) values(?)
- INSERT_MESSAGE = INSERT INTO JMS_MESSAGES (MESSAGEID, DESTINATION, MESSAGEBLOB, TXID, TXOP) VALUES(?,?,?,?,?)
- SELECT_ALL_UNCOMMITED_TXS = SELECT TXID FROM JMS_TRANSACTIONS
- SELECT_MAX_TX = SELECT MAX(TXID) FROM JMS_MESSAGES
- SELECT_MESSAGES_IN_DEST = SELECT MESSAGEID, MESSAGEBLOB FROM JMS_MESSAGES WHERE DESTINATION=?
- SELECT_MESSAGE = SELECT MESSAGEID, MESSAGEBLOB FROM JMS_MESSAGES WHERE MESSAGEID=? AND DESTINATION=?
- MARK_MESSAGE = UPDATE JMS_MESSAGES SET TXID=?, TXOP=? WHERE MESSAGEID=? AND DESTINATION=?
- UPDATE_MESSAGE = UPDATE JMS_MESSAGES SET MESSAGEBLOB=? WHERE MESSAGEID=? AND DESTINATION=?
- UPDATE_MARKED_MESSAGES = UPDATE JMS_MESSAGES SET TXID=?, TXOP=? WHERE TXOP=?
- UPDATE_MARKED_MESSAGES_WITH_TX = UPDATE JMS_MESSAGES SET TXID=?, TXOP=? WHERE TXOP=? AND TXID=?
- DELETE_MARKED_MESSAGES_WITH_TX = DELETE FROM JMS_MESSAGES WHERE TXOP=? AND JMS_MESSAGES.TXID IN (SELECT TXID FROM JMS_TRANSACTIONS)
- DELETE_TX = DELETE FROM JMS_TRANSACTIONS WHERE TXID = ?
- DELETE_MARKED_MESSAGES = DELETE FROM JMS_MESSAGES WHERE TXID=? AND TXOP=?
- DELETE_MESSAGE = DELETE FROM JMS_MESSAGES WHERE MESSAGEID=? AND DESTINATION=?
- CREATE_MESSAGE_TABLE = CREATE CACHED TABLE JMS_MESSAGES ( MESSAGEID INTEGER NOT NULL, \
- DESTINATION VARCHAR(255) NOT NULL, TXID INTEGER, TXOP CHAR(1), \
- MESSAGEBLOB OBJECT, PRIMARY KEY (MESSAGEID, DESTINATION) )
- CREATE_IDX_MESSAGE_TXOP_TXID = CREATE INDEX JMS_MESSAGES_TXOP_TXID ON JMS_MESSAGES (TXOP, TXID)
- CREATE_IDX_MESSAGE_DESTINATION = CREATE INDEX JMS_MESSAGES_DESTINATION ON JMS_MESSAGES (DESTINATION)
- CREATE_TX_TABLE = CREATE CACHED TABLE JMS_TRANSACTIONS ( TXID INTEGER, PRIMARY KEY (TXID) )
- CREATE_TABLES_ON_STARTUP = TRUE
- DELETE_TEMPORARY_MESSAGES = DELETE FROM JMS_MESSAGES WHERE TXOP='T'
-
- </property>
+ <bean name="jboss.mq:service=PersistenceManager" class="org.jboss.mq.pm.none.PersistenceManager">
</bean>
<bean name="jboss.mq:service=MessageCache" class="org.jboss.mq.kernel.MessageCache">
@@ -96,7 +63,7 @@
</bean>
<bean name="jboss.jca:name='jms-ra.rar',service=RARDeployment" class="org.jboss.ejb3.embedded.resource.RARDeployment">
- <constructor>
+ <constructor>
<parameter class="org.jboss.deployment.DeploymentInfo">
<inject bean="jms-rar-DeploymentInfo"/>
</parameter>
@@ -104,50 +71,10 @@
<property name="workManager"><inject bean="jms-rar-WorkManager"/></property>
</bean>
- <bean name="jboss.mq:service=StateManager" class="org.jboss.mq.kernel.JDBCStateManager">
- <property name="transactionManager">
- <inject bean="TransactionManager"/>
- </property>
- <property name="datasource">
- <inject bean="DefaultDS"/>
- </property>
- <property name="sqlProperties">
-
- CREATE_TABLES_ON_STARTUP = TRUE
- CREATE_USER_TABLE = CREATE TABLE JMS_USERS (USERID VARCHAR(32) NOT NULL, PASSWD VARCHAR(32) NOT NULL, \
- CLIENTID VARCHAR(128), PRIMARY KEY(USERID))
- CREATE_ROLE_TABLE = CREATE TABLE JMS_ROLES (ROLEID VARCHAR(32) NOT NULL, USERID VARCHAR(32) NOT NULL, \
- PRIMARY KEY(USERID, ROLEID))
- CREATE_SUBSCRIPTION_TABLE = CREATE TABLE JMS_SUBSCRIPTIONS (CLIENTID VARCHAR(128) NOT NULL, \
- SUBNAME VARCHAR(128) NOT NULL, TOPIC VARCHAR(255) NOT NULL, \
- SELECTOR VARCHAR(255), PRIMARY KEY(CLIENTID, SUBNAME))
- GET_SUBSCRIPTION = SELECT TOPIC, SELECTOR FROM JMS_SUBSCRIPTIONS WHERE CLIENTID=? AND SUBNAME=?
- LOCK_SUBSCRIPTION = SELECT TOPIC, SELECTOR FROM JMS_SUBSCRIPTIONS WHERE CLIENTID=? AND SUBNAME=?
- GET_SUBSCRIPTIONS_FOR_TOPIC = SELECT CLIENTID, SUBNAME, SELECTOR FROM JMS_SUBSCRIPTIONS WHERE TOPIC=?
- INSERT_SUBSCRIPTION = INSERT INTO JMS_SUBSCRIPTIONS (CLIENTID, SUBNAME, TOPIC, SELECTOR) VALUES(?,?,?,?)
- UPDATE_SUBSCRIPTION = UPDATE JMS_SUBSCRIPTIONS SET TOPIC=?, SELECTOR=? WHERE CLIENTID=? AND SUBNAME=?
- REMOVE_SUBSCRIPTION = DELETE FROM JMS_SUBSCRIPTIONS WHERE CLIENTID=? AND SUBNAME=?
- GET_USER_BY_CLIENTID = SELECT USERID, PASSWD, CLIENTID FROM JMS_USERS WHERE CLIENTID=?
- GET_USER = SELECT PASSWD, CLIENTID FROM JMS_USERS WHERE USERID=?
- POPULATE.TABLES.01 = INSERT INTO JMS_USERS (USERID, PASSWD) VALUES ('guest', 'guest')
- POPULATE.TABLES.02 = INSERT INTO JMS_USERS (USERID, PASSWD) VALUES ('j2ee', 'j2ee')
- POPULATE.TABLES.03 = INSERT INTO JMS_USERS (USERID, PASSWD, CLIENTID) VALUES ('john', 'needle', 'DurableSubscriberExample')
- POPULATE.TABLES.04 = INSERT INTO JMS_USERS (USERID, PASSWD) VALUES ('nobody', 'nobody')
- POPULATE.TABLES.05 = INSERT INTO JMS_USERS (USERID, PASSWD) VALUES ('dynsub', 'dynsub')
- POPULATE.TABLES.06 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('guest','guest')
- POPULATE.TABLES.07 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('j2ee','guest')
- POPULATE.TABLES.08 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('john','guest')
- POPULATE.TABLES.09 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('subscriber','john')
- POPULATE.TABLES.10 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('publisher','john')
- POPULATE.TABLES.11 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('publisher','dynsub')
- POPULATE.TABLES.12 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('durpublisher','john')
- POPULATE.TABLES.13 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('durpublisher','dynsub')
- POPULATE.TABLES.14 = INSERT INTO JMS_ROLES (ROLEID, USERID) VALUES ('noacc','nobody')
-
- </property>
+ <bean name="jboss.mq:service=StateManager" class="org.jboss.mq.sm.file.DynamicStateManager">
+ <property name="stateFile">jbossmq-state.xml</property>
</bean>
-
<bean name="BasicQueueParameters" class="org.jboss.mq.server.BasicQueueParameters"/>
<bean name="jboss.mq:service=ThreadPool" class="org.jboss.util.threadpool.BasicThreadPool">
@@ -165,7 +92,7 @@
discardOldest - check to see if a task is about to complete and enque
the new task if possible, else run the task in the calling thread
-->
- <property name="blockingModeString">run</property>
+ <property name="blockingMode">run</property>
</bean>
<bean name="jboss.mq:service=DestinationManager" class="org.jboss.mq.server.JMSDestinationManager">
@@ -194,11 +121,13 @@
</bean>
<bean name="jboss.mq:service=invocationlayer,type=JVM" class="org.jboss.mq.kernel.JVMIL">
- <property name="jmsInvoker"><inject bean="jboss.mq:service=Invoker"/></property>
- <property name="connectionFactoryJNDIRef">java:/ConnectionFactory</property>
- <property name="XAConnectionFactoryJNDIRef">java:/XAConnectionFactory</property>
+ <property name="jmsInvoker"><inject bean="jboss.mq:service=Invoker"/></property>
+ <!-- notice we actually switched - the non-xa connection factory JNDI Ref is the JNDI name our EJBs use -->
+ <!-- the embedded EJB container doesn't support XA, so the connection factory our JmsXA JNDI lookup will return will be a non-XA factory -->
+ <property name="connectionFactoryJNDIRef">java:/JmsXA</property>
+ <property name="XAConnectionFactoryJNDIRef">java:/ConnectionFactory</property>
<property name="pingPeriod">0</property>
<property name="initialContextProperties"><inject bean="InitialContextProperties"/></property>
</bean>
-</deployment>
\ No newline at end of file
+</deployment>
diff --git a/modules/enterprise/server/jar/src/test/resources/jms-ra.rar b/modules/enterprise/server/jar/src/test/resources/jms-ra.rar
new file mode 100644
index 0000000..c4807c6
Binary files /dev/null and b/modules/enterprise/server/jar/src/test/resources/jms-ra.rar differ
diff --git a/modules/enterprise/server/jar/src/test/resources/login-config.xml b/modules/enterprise/server/jar/src/test/resources/login-config.xml
index 81637f9..645294d 100644
--- a/modules/enterprise/server/jar/src/test/resources/login-config.xml
+++ b/modules/enterprise/server/jar/src/test/resources/login-config.xml
@@ -41,6 +41,15 @@ $Revision: 42748 $
</authentication>
</application-policy>
+ <application-policy name = "jbossmq">
+ <authentication>
+ <login-module code = "org.jboss.mq.sm.file.DynamicLoginModule" flag = "required">
+ <module-option name = "unauthenticatedIdentity">guest</module-option>
+ <module-option name = "sm.objectname">jboss.mq:service=StateManager</module-option>
+ </login-module>
+ </authentication>
+ </application-policy>
+
<application-policy name="other">
<!-- A simple server login module, which can be used when the number
of users is relatively small. It uses two properties files:
diff --git a/modules/enterprise/server/jar/src/test/resources/rhq-mdb-beans.xml b/modules/enterprise/server/jar/src/test/resources/rhq-mdb-beans.xml
new file mode 100644
index 0000000..ad05b5e
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/rhq-mdb-beans.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd"
+ xmlns="urn:jboss:bean-deployer:2.0">
+
+ <bean name="jboss.mq.destination:service=Queue,name=AlertConditionQueue" class="org.jboss.mq.kernel.Queue">
+ <property name="destinationManagerPojo"><inject bean="jboss.mq:service=DestinationManager"/></property>
+ <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property>
+ <property name="destinationName">AlertConditionQueue</property>
+ </bean>
+
+ <bean name="jboss.mq.destination:service=Queue,name=DriftChangesetQueue" class="org.jboss.mq.kernel.Queue">
+ <property name="destinationManagerPojo"><inject bean="jboss.mq:service=DestinationManager"/></property>
+ <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property>
+ <property name="destinationName">DriftChangesetQueue</property>
+ </bean>
+
+ <bean name="jboss.mq.destination:service=Queue,name=DriftFileQueue" class="org.jboss.mq.kernel.Queue">
+ <property name="destinationManagerPojo"><inject bean="jboss.mq:service=DestinationManager"/></property>
+ <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property>
+ <property name="destinationName">DriftFileQueue</property>
+ </bean>
+
+</deployment>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/test-jboss-home-dir/server/default/conf/README.txt b/modules/enterprise/server/jar/src/test/resources/test-jboss-home-dir/server/default/conf/README.txt
new file mode 100644
index 0000000..3acca0a
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/test-jboss-home-dir/server/default/conf/README.txt
@@ -0,0 +1 @@
+jbossmq-state.xml is to allow for the JBossMQ JMS service to start in the embedded microcontainer. See AbstractEJB3Test.
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/resources/test-jboss-home-dir/server/default/conf/jbossmq-state.xml b/modules/enterprise/server/jar/src/test/resources/test-jboss-home-dir/server/default/conf/jbossmq-state.xml
new file mode 100644
index 0000000..caa6b9b
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/test-jboss-home-dir/server/default/conf/jbossmq-state.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<StateManager>
+ <Users>
+ <User>
+ <Name>guest</Name>
+ <Password>guest</Password>
+ </User>
+ </Users>
+ <Roles>
+ <Role name="guest">
+ <UserName>guest</UserName>
+ </Role>
+ </Roles>
+ <DurableSubscriptions>
+ </DurableSubscriptions>
+</StateManager>
commit 49532dd9b7a7b54a37080f05042c68b7b3a8b277
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Sep 7 10:44:00 2011 -0400
fix the error log to include the stack. add debug message so we know we got the message
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftChangesetBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftChangesetBean.java
index 38aa0c0..0c9f9fd 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftChangesetBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftChangesetBean.java
@@ -60,6 +60,10 @@ public class DriftChangesetBean implements MessageListener {
@Override
public void onMessage(Message message) {
try {
+ if (log.isDebugEnabled()) {
+ log.debug("Received drift change set message");
+ }
+
ObjectMessage msg = (ObjectMessage) message;
DriftUploadRequest request = (DriftUploadRequest) msg.getObject();
@@ -95,7 +99,7 @@ public class DriftChangesetBean implements MessageListener {
} catch (Throwable t) {
// catch Throwable here, don't let anything escape as bad things can happen wrt XA/2PhaseCommit
- log.error(t);
+ log.error("Error processing drift changeset message", t);
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftFileBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftFileBean.java
index b5b9356..6c639e4 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftFileBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftFileBean.java
@@ -59,6 +59,10 @@ public class DriftFileBean implements MessageListener {
@Override
public void onMessage(Message message) {
try {
+ if (log.isDebugEnabled()) {
+ log.debug("Received drift file message");
+ }
+
ObjectMessage msg = (ObjectMessage) message;
DriftUploadRequest request = (DriftUploadRequest) msg.getObject();
@@ -95,7 +99,7 @@ public class DriftFileBean implements MessageListener {
} catch (Throwable t) {
// catch Throwable here, don't let anything escape as bad things can happen wrt XA/2PhaseCommit
- log.error(t);
+ log.error("Error processing drift file message", t);
}
}
commit dcaa5e894b2acfa8281352c0de0990fc4f2b066d
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Sep 7 11:32:52 2011 -0400
dbupgrade addition for drift config's drift handling mode support
diff --git a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
index 414f5a1..949f5bd 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -3474,6 +3474,8 @@
<schema-alterColumn table="RHQ_DRIFT_CONFIG" column="INTERVAL" nullable="FALSE" />
<schema-addColumn table="RHQ_DRIFT_CONFIG" column="IS_ENABLED" columnType="BOOLEAN" />
<schema-alterColumn table="RHQ_DRIFT_CONFIG" column="IS_ENABLED" nullable="FALSE" />
+ <schema-addColumn table="RHQ_DRIFT_CONFIG" column="MODE" columnType="VARCHAR2" precision="20" />
+ <schema-alterColumn table="RHQ_DRIFT_CONFIG" column="MODE" nullable="FALSE" />
<schema-addColumn table="RHQ_DRIFT_CONFIG" column="CONFIG_ID" columnType="INTEGER" />
<schema-alterColumn table="RHQ_DRIFT_CONFIG" column="CONFIG_ID" nullable="FALSE" />
<schema-directSQL>
@@ -3528,6 +3530,8 @@
REFERENCES RHQ_DRIFT_CONFIG (ID)
</statement>
</schema-directSQL>
+ <schema-addColumn table="RHQ_DRIFT_CHANGE_SET" column="DRIFT_CONFIG_MODE" columnType="VARCHAR2" precision="20" />
+ <schema-alterColumn table="RHQ_DRIFT_CHANGE_SET" column="DRIFT_CONFIG_MODE" nullable="FALSE" />
<!-- RHQ_DRIFT -->
<schema-createSequence name="RHQ_DRIFT_ID_SEQ" initial="10001" />
commit 0b756c37586c4dab03128e084c92b26b09536b78
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Sep 7 10:51:27 2011 -0400
fix the element name to match our convention.
diff --git a/modules/core/client-api/src/main/resources/rhq-plugin.xsd b/modules/core/client-api/src/main/resources/rhq-plugin.xsd
index 08e2a90..54f3001 100644
--- a/modules/core/client-api/src/main/resources/rhq-plugin.xsd
+++ b/modules/core/client-api/src/main/resources/rhq-plugin.xsd
@@ -592,7 +592,7 @@
</xs:documentation>
</xs:annotation>
</xs:element>
- <xs:element name="driftHandlingMode" minOccurs="0" maxOccurs="1" default="normal">
+ <xs:element name="drift-handling-mode" minOccurs="0" maxOccurs="1" default="normal">
<xs:annotation>
<xs:documentation>
Specifies the way in which drift occurrences will be handled when reported. Normal
commit ae71c6d36eb4464d9cd34f75c2951de340321377
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Sep 7 10:29:55 2011 -0400
[BZ 736050 - Domain jar being packaged in rhq.ear lib directory]
Caused by the rhq-script-bindings dep. Add an exclusion to ensure the
transitive dep is not pulled into lib.
diff --git a/modules/enterprise/server/ear/pom.xml b/modules/enterprise/server/ear/pom.xml
index 8cdaf8b..783e377 100644
--- a/modules/enterprise/server/ear/pom.xml
+++ b/modules/enterprise/server/ear/pom.xml
@@ -84,6 +84,12 @@
<groupId>org.rhq</groupId>
<artifactId>rhq-script-bindings</artifactId>
<version>${project.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-core-domain</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>
commit 33297ae638a78ec3d23fd1d0f5446e98745c8dcc
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Sep 6 17:32:03 2011 -0400
Protect drift detector from nonexistent base directories and throw a
better exception if encountering corrupt changeset headers.
diff --git a/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReaderImpl.java b/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReaderImpl.java
index 21d72f5..5ccd8bb 100644
--- a/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReaderImpl.java
+++ b/modules/common/drift/src/main/java/org/rhq/common/drift/ChangeSetReaderImpl.java
@@ -19,6 +19,10 @@
package org.rhq.common.drift;
+import static org.rhq.common.drift.FileEntry.addedFileEntry;
+import static org.rhq.common.drift.FileEntry.changedFileEntry;
+import static org.rhq.common.drift.FileEntry.removedFileEntry;
+
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
@@ -31,10 +35,6 @@ import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.drift.DriftChangeSetCategory;
-import static org.rhq.common.drift.FileEntry.addedFileEntry;
-import static org.rhq.common.drift.FileEntry.changedFileEntry;
-import static org.rhq.common.drift.FileEntry.removedFileEntry;
-
/**
* Note that this implementation does not do any validation for the most part. It assumes
* that entries in the change set file contain valid, 64 character SHA-256 hashes. It
@@ -93,11 +93,17 @@ public class ChangeSetReaderImpl implements ChangeSetReader {
private void readHeaders() throws IOException {
headers = new Headers();
- headers.setResourceId(Integer.parseInt(reader.readLine()));
- headers.setDriftCofigurationId(Integer.parseInt(reader.readLine()));
- headers.setDriftConfigurationName(reader.readLine());
- headers.setBasedir(reader.readLine());
- headers.setType(DriftChangeSetCategory.fromCode(reader.readLine()));
+ try {
+ headers.setResourceId(Integer.parseInt(reader.readLine()));
+ headers.setDriftCofigurationId(Integer.parseInt(reader.readLine()));
+ headers.setDriftConfigurationName(reader.readLine());
+ headers.setBasedir(reader.readLine());
+ headers.setType(DriftChangeSetCategory.fromCode(reader.readLine()));
+ } catch (IOException e) {
+ throw e;
+ } catch (Throwable t) {
+ throw new IllegalStateException("Invalid changeset headers, could not parse: ", t);
+ }
}
@Override
@@ -113,25 +119,25 @@ public class ChangeSetReaderImpl implements ChangeSetReader {
return null;
}
- if (line.charAt(0) == 'A') { // file added
+ if (line.charAt(0) == 'A') { // file added
String sha = line.substring(2, 66);
String fileName = line.substring(69);
return addedFileEntry(fileName, sha);
}
- if (line.charAt(0) == 'C') { // file modified
+ if (line.charAt(0) == 'C') { // file modified
String newSha = line.substring(2, 66);
String oldSha = line.substring(67, 131);
String fileName = line.substring(132);
return changedFileEntry(fileName, oldSha, newSha);
}
- if (line.charAt(0) == 'R') { // file deleted
+ if (line.charAt(0) == 'R') { // file deleted
String sha = line.substring(4, 68);
String fileName = line.substring(69);
return removedFileEntry(fileName, sha);
}
- log.error("An error occurred while parsing " + metaDataFile.getAbsolutePath() + ": " +
- line.charAt(0) + " is not a recognized drift change set category code.");
+ log.error("An error occurred while parsing " + metaDataFile.getAbsolutePath() + ": " + line.charAt(0)
+ + " is not a recognized drift change set category code.");
throw new ChangeSetReaderException(line.charAt(0) + " is not a recognized drift change set category code.");
} catch (IOException e) {
log.error("An error ocurred while parsing " + metaDataFile.getAbsolutePath() + ": " + e.getMessage());
@@ -144,9 +150,11 @@ public class ChangeSetReaderImpl implements ChangeSetReader {
try {
reader.close();
} catch (IOException e) {
- log.warn("An error ocurred while trying to close " + metaDataFile.getAbsolutePath() + ": " + e.getMessage());
- throw new ChangeSetReaderException("An error ocurred while trying to close " +
- metaDataFile.getAbsolutePath(), e);
+ log
+ .warn("An error ocurred while trying to close " + metaDataFile.getAbsolutePath() + ": "
+ + e.getMessage());
+ throw new ChangeSetReaderException("An error ocurred while trying to close "
+ + metaDataFile.getAbsolutePath(), e);
}
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
index 92519cf..87a4c6c 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
@@ -171,31 +171,34 @@ public class DriftDetector implements Runnable {
}
}
- // Now we need to do a directory tree scan to look for newly added files
- forEachFile(basedir, new FilterFileVisitor(basedir, schedule.getDriftConfiguration().getIncludes(), schedule
- .getDriftConfiguration().getExcludes(), new FileVisitor() {
- @Override
- public void visit(File file) {
- try {
- if (processedFiles.contains(file)) {
- return;
- }
-
- if (log.isInfoEnabled()) {
- log.info("Detected added file for " + schedule + " --> " + file.getAbsolutePath());
+ // If the basedir is still valid we need to do a directory tree scan to look for newly added files
+ if (basedir.isDirectory()) {
+ forEachFile(basedir, new FilterFileVisitor(basedir, schedule.getDriftConfiguration().getIncludes(),
+ schedule.getDriftConfiguration().getExcludes(), new FileVisitor() {
+ @Override
+ public void visit(File file) {
+ try {
+ if (processedFiles.contains(file)) {
+ return;
+ }
+
+ if (log.isInfoEnabled()) {
+ log.info("Detected added file for " + schedule + " --> " + file.getAbsolutePath());
+ }
+
+ FileEntry newEntry = addedFileEntry(relativePath(basedir, file), sha256(file));
+ driftWriter.write(newEntry);
+ coverageWriter.write(newEntry);
+ changes.incrementAndGet();
+ } catch (IOException e) {
+ log.error("An error occurred while generating a drift change set for " + schedule + ": "
+ + e.getMessage());
+ throw new DriftDetectionException("An error occurred while generating a drift change set",
+ e);
+ }
}
-
- FileEntry newEntry = addedFileEntry(relativePath(basedir, file), sha256(file));
- driftWriter.write(newEntry);
- coverageWriter.write(newEntry);
- changes.incrementAndGet();
- } catch (IOException e) {
- log.error("An error occurred while generating a drift change set for " + schedule + ": "
- + e.getMessage());
- throw new DriftDetectionException("An error occurred while generating a drift change set", e);
- }
- }
- }));
+ }));
+ }
driftWriter.close();
coverageWriter.close();
@@ -211,24 +214,28 @@ public class DriftDetector implements Runnable {
schedule, COVERAGE));
final DriftConfiguration config = schedule.getDriftConfiguration();
final File basedir = new File(basedir(schedule.getResourceId(), config));
-
- forEachFile(basedir, new FilterFileVisitor(basedir, config.getIncludes(), config.getExcludes(),
- new FileVisitor() {
- @Override
- public void visit(File file) {
- try {
- if (log.isInfoEnabled()) {
- log.info("Adding " + file.getAbsolutePath() + " to coverage change set for " + schedule);
+ if (basedir.isDirectory()) {
+
+ forEachFile(basedir, new FilterFileVisitor(basedir, config.getIncludes(), config.getExcludes(),
+ new FileVisitor() {
+ @Override
+ public void visit(File file) {
+ try {
+ if (log.isInfoEnabled()) {
+ log
+ .info("Adding " + file.getAbsolutePath() + " to coverage change set for "
+ + schedule);
+ }
+ writer.write(addedFileEntry(relativePath(basedir, file), sha256(file)));
+ } catch (IOException e) {
+ log.error("An error occurred while generating a coverage change set for " + schedule + ": "
+ + e.getMessage());
+ throw new DriftDetectionException(
+ "An error occurred while generating a coverage change set for " + schedule, e);
}
- writer.write(addedFileEntry(relativePath(basedir, file), sha256(file)));
- } catch (IOException e) {
- log.error("An error occurred while generating a coverage change set for " + schedule + ": "
- + e.getMessage());
- throw new DriftDetectionException(
- "An error occurred while generating a coverage change set for " + schedule, e);
}
- }
- }));
+ }));
+ }
writer.close();
}
commit 25602734567fb2b6047b4cc263284cc5ef4cb369
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Sep 6 17:29:58 2011 -0400
Fix the drift config list view column sort options
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java
index b04f71c..1f6190d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java
@@ -91,20 +91,18 @@ public class DriftConfigurationDataSource extends RPCDataSource<DriftConfigurati
ListGridField enabledField = new ListGridField(ATTR_ENABLED, MSG.common_title_enabled());
enabledField.setType(ListGridFieldType.IMAGE);
enabledField.setAlign(Alignment.CENTER);
- enabledField.setCanSort(false);
fields.add(enabledField);
ListGridField driftHandlingModeField = new ListGridField(ATTR_DRIFT_HANDLING_MODE, MSG
.view_drift_table_driftHandlingMode());
- driftHandlingModeField.setCanSort(true);
fields.add(driftHandlingModeField);
ListGridField intervalField = new ListGridField(ATTR_INTERVAL, MSG.common_title_interval());
- intervalField.setCanSort(false);
fields.add(intervalField);
ListGridField baseDirField = new ListGridField(ATTR_BASE_DIR_STRING, MSG.view_drift_table_baseDir());
- baseDirField.setCanSort(true);
+ // can't sort on this because it's not an entity field, it's derived from the config only
+ baseDirField.setCanSort(false);
fields.add(baseDirField);
if (this.entityContext.type != EntityContext.Type.Resource) {
commit 001218067c13839cefa0efcd89bcc4559a89457f
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Sep 6 16:11:45 2011 -0400
Add Drift Handling column to the drift configuration list view.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java
index 3a5707a..b04f71c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftConfigurationDataSource.java
@@ -57,9 +57,13 @@ public class DriftConfigurationDataSource extends RPCDataSource<DriftConfigurati
public static final String ATTR_ID = "id";
public static final String ATTR_NAME = "name";
public static final String ATTR_INTERVAL = "interval";
+ public static final String ATTR_DRIFT_HANDLING_MODE = "driftHandlingMode";
public static final String ATTR_BASE_DIR_STRING = "baseDirString";
public static final String ATTR_ENABLED = "enabled";
+ public static final String DRIFT_HANDLING_MODE_NORMAL = MSG.view_drift_table_driftHandlingMode_normal();
+ public static final String DRIFT_HANDLING_MODE_PLANNED = MSG.view_drift_table_driftHandlingMode_plannedChanges();
+
private DriftGWTServiceAsync driftService = GWTServiceLookup.getDriftService();
private EntityContext entityContext;
@@ -90,12 +94,17 @@ public class DriftConfigurationDataSource extends RPCDataSource<DriftConfigurati
enabledField.setCanSort(false);
fields.add(enabledField);
+ ListGridField driftHandlingModeField = new ListGridField(ATTR_DRIFT_HANDLING_MODE, MSG
+ .view_drift_table_driftHandlingMode());
+ driftHandlingModeField.setCanSort(true);
+ fields.add(driftHandlingModeField);
+
ListGridField intervalField = new ListGridField(ATTR_INTERVAL, MSG.common_title_interval());
intervalField.setCanSort(false);
fields.add(intervalField);
ListGridField baseDirField = new ListGridField(ATTR_BASE_DIR_STRING, MSG.view_drift_table_baseDir());
- baseDirField.setCanSort(false);
+ baseDirField.setCanSort(true);
fields.add(baseDirField);
if (this.entityContext.type != EntityContext.Type.Resource) {
@@ -120,15 +129,17 @@ public class DriftConfigurationDataSource extends RPCDataSource<DriftConfigurati
nameField.setWidth("20%");
enabledField.setWidth(60);
+ driftHandlingModeField.setWidth("10%");
intervalField.setWidth(100);
- baseDirField.setWidth("20%");
+ baseDirField.setWidth("*");
resourceNameField.setWidth("20%");
ancestryField.setWidth("40%");
} else {
nameField.setWidth("20%");
enabledField.setWidth(60);
+ driftHandlingModeField.setWidth("10%");
intervalField.setWidth(100);
- baseDirField.setWidth("80%");
+ baseDirField.setWidth("*");
}
return fields;
@@ -239,6 +250,14 @@ public class DriftConfigurationDataSource extends RPCDataSource<DriftConfigurati
record.setAttribute(ATTR_ID, from.getId());
record.setAttribute(ATTR_NAME, from.getName());
+ switch (from.getDriftHandlingMode()) {
+ case plannedChanges:
+ record.setAttribute(ATTR_DRIFT_HANDLING_MODE, DRIFT_HANDLING_MODE_PLANNED);
+ break;
+ default:
+ record.setAttribute(ATTR_DRIFT_HANDLING_MODE, DRIFT_HANDLING_MODE_NORMAL);
+ break;
+ }
record.setAttribute(ATTR_INTERVAL, String.valueOf(from.getInterval()));
record.setAttribute(ATTR_BASE_DIR_STRING, getBaseDirString(from.getBasedir()));
record.setAttribute(ATTR_ENABLED, ImageManager.getAvailabilityIcon(from.isEnabled()));
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index 494d691..0b336c1 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -1152,6 +1152,9 @@ view_drift_success_deleteConfigs = Successfully deleted {0} drift configurations
view_drift_success_detectNow = Successfully submitted drift detection request
view_drift_table_baseDir = Base Directory
view_drift_table_changeSet = Change Set
+view_drift_table_driftHandlingMode = Drift Handling
+view_drift_table_driftHandlingMode_normal = normal
+view_drift_table_driftHandlingMode_plannedChanges = planned changes
view_drift_table_newFile = New File
view_drift_table_oldFile = Old File
view_drift_table_resourceConfig = Resource Drift Configuration
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
index 2e546b6..3b4a7d8 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
@@ -970,6 +970,9 @@ view_dashboards_title = Dashboard
##view_drift_success_detectNow = Successfully submitted drift detection request
##view_drift_table_baseDir = Base Directory
##view_drift_table_changeSet = Change Set
+##view_drift_table_driftHandlingMode = Drift Handling
+##view_drift_table_driftHandlingMode_normal = normal
+##view_drift_table_driftHandlingMode_plannedChanges = planned changes
##view_drift_table_newFile = New File
##view_drift_table_oldFile = Old File
##view_drift_table_resourceConfig = Resource Drift Configuration
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
index 74f8fbd..f43ad29 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
@@ -1129,6 +1129,9 @@ view_dashboards_title = ããã·ã¥ããŒã
##view_drift_failure_deleteConfigs = Failed to delete some or all drift configurations.
##view_drift_table_baseDir = Base Directory
##view_drift_table_changeSet = Change Set
+##view_drift_table_driftHandlingMode = Drift Handling
+##view_drift_table_driftHandlingMode_normal = normal
+##view_drift_table_driftHandlingMode_plannedChanges = planned changes
##view_drift_table_newFile = New File
##view_drift_table_oldFile = Old File
##view_drift_table_resourceConfig = Resource Drift Configuration
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
index 3dc1b04..323b8ac 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
@@ -1154,10 +1154,13 @@ view_dashboards_portlets_refresh_one_min = 1 minuto
view_dashboards_portlets_refresh_success1 = Intervalo de atualiza\u00E7\u00E3o dos portlets din\u00E2micos alterado com sucesso
view_dashboards_portlets_refresh_success2 = Parando a atualiza\u00E7\u00E3o autom\u00E1tica dos portlets din\u00E2micos
view_dashboards_title = Dashboard
+##view_drift = Drift
##view_drift_button_detectNow = Detectar agora
##view_drift_category_fileAdded = Arquivo adicionado
##view_drift_category_fileChanged = Arquivo alterado
##view_drift_category_fileRemoved = Arquivo removido
+##view_drift_changeSets = Change Sets
+##view_drift_changeSets_resourceViewTitle = Resource Drift Change Sets
##view_drift_delete_configConfirm = Delete the selected drift configuration(s)?
##view_drift_delete_configConfirmAll = Delete all drift configurations?
##view_drift_failure_deleteConfigs = Failed to delete some or all drift configurations.
@@ -1168,6 +1171,10 @@ view_dashboards_title = Dashboard
##view_drift_success_deleteConfigs = Configuraᅵᅵes do drift {0} excluᅵdas com sucesso!
##view_drift_success_detectNow = Requisiᅵᅵo de detecᅵᅵo de drift submetida com sucesso.
##view_drift_table_baseDir = Diretï¿œrio Base
+##view_drift_table_changeSet = Change Set
+##view_drift_table_driftHandlingMode = Drift Handling
+##view_drift_table_driftHandlingMode_normal = normal
+##view_drift_table_driftHandlingMode_plannedChanges = planned changes
##view_drift_table_newFile = Novo Arquivo
##view_drift_table_oldFile = Arquivo Antigo
##view_drift_table_resourceConfig = Configuraᅵᅵo de Drift do Recurso
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
index 086bb1b..85acc40 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
@@ -1136,6 +1136,9 @@ view_dashboards_title = \u7edf\u8ba1\u8868\u76d8
##view_drift_failure_deleteConfigs = Failed to delete some or all drift configurations.
##view_drift_table_baseDir = Base Directory
##view_drift_table_changeSet = Change Set
+##view_drift_table_driftHandlingMode = Drift Handling
+##view_drift_table_driftHandlingMode_normal = normal
+##view_drift_table_driftHandlingMode_plannedChanges = planned changes
##view_drift_table_newFile = New File
##view_drift_table_oldFile = Old File
##view_drift_table_resourceConfig = Resource Drift Configuration
commit 0c29f7be635cf935ccd1418e087f0944dff86097
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Sep 6 16:10:42 2011 -0400
Expand the drift configuration nodes by default, so you can see the
changeset nodes automatically.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/AbstractDriftChangeSetsTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/AbstractDriftChangeSetsTreeView.java
index cdaf5af..d3768c1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/AbstractDriftChangeSetsTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/AbstractDriftChangeSetsTreeView.java
@@ -85,6 +85,10 @@ public abstract class AbstractDriftChangeSetsTreeView extends LocatableTreeGrid
public void onDataArrived(DataArrivedEvent dataArrivedEvent) {
if (null != pendingPath) {
selectPath(pendingPath);
+ } else {
+ // open config folders initially
+ Tree tree = getTree();
+ tree.openFolders(tree.getChildren(tree.getRoot()));
}
}
});
commit 53dcf06dbd3c02eeb9ad730f98405acfaaad9540
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Sep 6 16:09:29 2011 -0400
To ensure we don't accidentally cancel our drift detection job due
to an uncaught exception from the job command code, make sure we catch
everything and that the code we execute in the catch and finally blocks
is also safe. Fix some call chaining in the logging that was not null
protected.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
index f10ca40..92519cf 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
@@ -19,6 +19,13 @@
package org.rhq.core.pc.drift;
+import static org.rhq.common.drift.FileEntry.addedFileEntry;
+import static org.rhq.common.drift.FileEntry.changedFileEntry;
+import static org.rhq.common.drift.FileEntry.removedFileEntry;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
+import static org.rhq.core.util.file.FileUtil.forEachFile;
+
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
@@ -37,13 +44,6 @@ import org.rhq.core.domain.drift.DriftConfiguration;
import org.rhq.core.util.MessageDigestGenerator;
import org.rhq.core.util.file.FileVisitor;
-import static org.rhq.common.drift.FileEntry.addedFileEntry;
-import static org.rhq.common.drift.FileEntry.changedFileEntry;
-import static org.rhq.common.drift.FileEntry.removedFileEntry;
-import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
-import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
-import static org.rhq.core.util.file.FileUtil.forEachFile;
-
public class DriftDetector implements Runnable {
private Log log = LogFactory.getLog(DriftDetector.class);
@@ -69,17 +69,18 @@ public class DriftDetector implements Runnable {
@Override
public void run() {
- DriftDetectionSchedule schedule = scheduleQueue.getNextSchedule();
- if (schedule == null) {
- log.debug("No schedules are in the queue.");
- return;
- }
+ try {
- if (log.isDebugEnabled()) {
- log.debug("Processing " + schedule);
- }
+ DriftDetectionSchedule schedule = scheduleQueue.getNextSchedule();
+ if (schedule == null) {
+ log.debug("No schedules are in the queue.");
+ return;
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug("Processing " + schedule);
+ }
- try {
if (schedule.getNextScan() > (System.currentTimeMillis() + 100L)) {
log.debug("Skipping " + schedule + " because it is too early to do the next detection.");
return;
@@ -111,9 +112,19 @@ public class DriftDetector implements Runnable {
driftClient.sendChangeSetToServer(schedule.getResourceId(), driftConfig, changeSetType);
}
} catch (Throwable t) {
- log.error("An unexpected error occurred during drift detection: " + t.getCause().getMessage(), t);
+ Throwable cause = t.getCause();
+ String message = (null != cause) ? cause.getMessage() : t.getMessage();
+ log.error("An unexpected error occurred during drift detection: " + message, t);
+
} finally {
- scheduleQueue.deactivateSchedule();
+ try {
+ scheduleQueue.deactivateSchedule();
+
+ } catch (Throwable t) {
+ Throwable cause = t.getCause();
+ String message = (null != cause) ? cause.getMessage() : t.getMessage();
+ log.error("An unexpected error occurred while deactivating schedule: " + message, t);
+ }
}
}
@@ -121,10 +132,10 @@ public class DriftDetector implements Runnable {
log.debug("Generating drift change set for " + schedule);
final File basedir = new File(basedir(schedule.getResourceId(), schedule.getDriftConfiguration()));
- final ChangeSetWriter driftWriter = changeSetMgr.getChangeSetWriter(schedule.getResourceId(),
- createHeaders(schedule, DRIFT));
- final ChangeSetReader coverageReader = changeSetMgr.getChangeSetReader(schedule.getResourceId(),
- schedule.getDriftConfiguration().getName());
+ final ChangeSetWriter driftWriter = changeSetMgr.getChangeSetWriter(schedule.getResourceId(), createHeaders(
+ schedule, DRIFT));
+ final ChangeSetReader coverageReader = changeSetMgr.getChangeSetReader(schedule.getResourceId(), schedule
+ .getDriftConfiguration().getName());
final ChangeSetWriter coverageWriter = changeSetMgr.getChangeSetWriterForUpdate(schedule.getResourceId(),
createHeaders(schedule, COVERAGE));
final AtomicInteger changes = new AtomicInteger(0);
@@ -161,8 +172,8 @@ public class DriftDetector implements Runnable {
}
// Now we need to do a directory tree scan to look for newly added files
- forEachFile(basedir, new FilterFileVisitor(basedir, schedule.getDriftConfiguration().getIncludes(),
- schedule.getDriftConfiguration().getExcludes(), new FileVisitor() {
+ forEachFile(basedir, new FilterFileVisitor(basedir, schedule.getDriftConfiguration().getIncludes(), schedule
+ .getDriftConfiguration().getExcludes(), new FileVisitor() {
@Override
public void visit(File file) {
try {
@@ -179,8 +190,8 @@ public class DriftDetector implements Runnable {
coverageWriter.write(newEntry);
changes.incrementAndGet();
} catch (IOException e) {
- log.error("An error occurred while generating a drift change set for " + schedule + ": " +
- e.getMessage());
+ log.error("An error occurred while generating a drift change set for " + schedule + ": "
+ + e.getMessage());
throw new DriftDetectionException("An error occurred while generating a drift change set", e);
}
}
@@ -196,28 +207,28 @@ public class DriftDetector implements Runnable {
private void generateCoverageChangeSet(final DriftDetectionSchedule schedule) throws IOException {
log.debug("Generating coverage change set for " + schedule);
- final ChangeSetWriter writer = changeSetMgr.getChangeSetWriter(schedule.getResourceId(), createHeaders(schedule,
- COVERAGE));
+ final ChangeSetWriter writer = changeSetMgr.getChangeSetWriter(schedule.getResourceId(), createHeaders(
+ schedule, COVERAGE));
final DriftConfiguration config = schedule.getDriftConfiguration();
final File basedir = new File(basedir(schedule.getResourceId(), config));
forEachFile(basedir, new FilterFileVisitor(basedir, config.getIncludes(), config.getExcludes(),
new FileVisitor() {
- @Override
- public void visit(File file) {
- try {
- if (log.isInfoEnabled()) {
- log.info("Adding " + file.getAbsolutePath() + " to coverage change set for " + schedule);
+ @Override
+ public void visit(File file) {
+ try {
+ if (log.isInfoEnabled()) {
+ log.info("Adding " + file.getAbsolutePath() + " to coverage change set for " + schedule);
+ }
+ writer.write(addedFileEntry(relativePath(basedir, file), sha256(file)));
+ } catch (IOException e) {
+ log.error("An error occurred while generating a coverage change set for " + schedule + ": "
+ + e.getMessage());
+ throw new DriftDetectionException(
+ "An error occurred while generating a coverage change set for " + schedule, e);
}
- writer.write(addedFileEntry(relativePath(basedir, file), sha256(file)));
- } catch (IOException e) {
- log.error("An error occurred while generating a coverage change set for " + schedule + ": " +
- e.getMessage());
- throw new DriftDetectionException("An error occurred while generating a coverage change set for " +
- schedule, e);
}
- }
- }));
+ }));
writer.close();
}
commit e89336642c3854818447c1ee4585ef462e1221e0
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Sep 2 22:43:13 2011 -0400
Add DriftHandlingMode filtering to DriftCriteria in order to filter out
planned changes from the drift history views. The current thinking is
that planned drift is only accessible via the changeset (tree) view.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/DriftCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/DriftCriteria.java
index de55f02..388ddf3 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/DriftCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/DriftCriteria.java
@@ -19,6 +19,7 @@
package org.rhq.core.domain.criteria;
import org.rhq.core.domain.drift.DriftCategory;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
import org.rhq.core.domain.util.PageOrdering;
/**
@@ -41,6 +42,8 @@ public interface DriftCriteria extends BaseCriteria {
void addFilterChangeSetEndVersion(Integer filterChangeSetEndVersion);
+ void addFilterDriftHandlingModes(DriftHandlingMode... filterDriftHandlingModes);
+
void addFilterPath(String filterPath);
void addFilterResourceIds(Integer... filterResourceIds);
@@ -66,6 +69,8 @@ public interface DriftCriteria extends BaseCriteria {
Integer getFilterChangeSetEndVersion();
+ DriftHandlingMode[] getFilterDriftHandlingModes();
+
String getFilterPath();
Integer[] getFilterResourceIds();
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/GenericDriftCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/GenericDriftCriteria.java
index 6ef58a0..fb7fe24 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/GenericDriftCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/GenericDriftCriteria.java
@@ -25,6 +25,7 @@ import java.util.ArrayList;
import java.util.List;
import org.rhq.core.domain.drift.DriftCategory;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageOrdering;
@@ -52,6 +53,8 @@ public class GenericDriftCriteria implements Serializable, DriftCriteria {
private Integer filterChangeSetEndVersion;
+ private List<DriftHandlingMode> filterDriftHandlingModes = new ArrayList<DriftHandlingMode>();
+
private String filterPath;
private List<Integer> filterResourceIds = new ArrayList<Integer>();
@@ -112,6 +115,16 @@ public class GenericDriftCriteria implements Serializable, DriftCriteria {
}
@Override
+ public void addFilterDriftHandlingModes(DriftHandlingMode... filterDriftHandlingModes) {
+ this.filterDriftHandlingModes = getListIgnoringNulls(filterDriftHandlingModes);
+ }
+
+ @Override
+ public DriftHandlingMode[] getFilterDriftHandlingModes() {
+ return filterDriftHandlingModes.toArray(new DriftHandlingMode[filterDriftHandlingModes.size()]);
+ }
+
+ @Override
public Integer getFilterChangeSetEndVersion() {
return filterChangeSetEndVersion;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/JPADriftCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/JPADriftCriteria.java
index 0ef3c95..099a288 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/JPADriftCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/JPADriftCriteria.java
@@ -27,6 +27,7 @@ import javax.xml.bind.annotation.XmlRootElement;
import org.rhq.core.domain.drift.DriftCategory;
import org.rhq.core.domain.drift.JPADrift;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
import org.rhq.core.domain.util.CriteriaUtils;
import org.rhq.core.domain.util.PageOrdering;
@@ -44,7 +45,8 @@ public class JPADriftCriteria extends Criteria implements DriftCriteria {
private List<DriftCategory> filterCategories = new ArrayList<DriftCategory>();
private Integer filterChangeSetId; // needs override
private Integer filterChangeSetStartVersion; // needs override
- private Integer filterChangeSetEndVersion; // needs override
+ private Integer filterChangeSetEndVersion; // needs override
+ private List<DriftHandlingMode> filterDriftHandlingModes = new ArrayList<DriftHandlingMode>(); // needs override
private String filterPath;
private List<Integer> filterResourceIds = new ArrayList<Integer>();
private Long filterStartTime; // requires overrides
@@ -63,6 +65,7 @@ public class JPADriftCriteria extends Criteria implements DriftCriteria {
filterOverrides.put("changeSetStartVersion", "changeSet.version >= ?");
filterOverrides.put("changeSetEndVersion", "changeSet.version <= ?");
filterOverrides.put("categories", "category IN ( ? )");
+ filterOverrides.put("driftHandlingModes", "changeSet.driftHandlingMode IN ( ? )");
filterOverrides.put("resourceIds", "changeSet.resource.id IN ( ? )");
filterOverrides.put("startTime", "ctime >= ?");
filterOverrides.put("endTime", "ctime <= ?");
@@ -75,6 +78,7 @@ public class JPADriftCriteria extends Criteria implements DriftCriteria {
this.addFilterChangeSetId(driftCriteria.getFilterChangeSetId());
this.addFilterChangeSetStartVersion(driftCriteria.getFilterChangeSetStartVersion());
this.addFilterChangeSetEndVersion(driftCriteria.getFilterChangeSetEndVersion());
+ this.addFilterDriftHandlingModes(driftCriteria.getFilterDriftHandlingModes());
this.addFilterEndTime(driftCriteria.getFilterEndTime());
this.addFilterId(driftCriteria.getFilterId());
this.addFilterPath(driftCriteria.getFilterPath());
@@ -142,6 +146,16 @@ public class JPADriftCriteria extends Criteria implements DriftCriteria {
this.filterChangeSetEndVersion = filterChangeSetEndVersion;
}
+ @Override
+ public void addFilterDriftHandlingModes(DriftHandlingMode... filterDriftHandlingModes) {
+ this.filterDriftHandlingModes = CriteriaUtils.getListIgnoringNulls(filterDriftHandlingModes);
+ }
+
+ @Override
+ public DriftHandlingMode[] getFilterDriftHandlingModes() {
+ return this.filterDriftHandlingModes.toArray(new DriftHandlingMode[this.filterDriftHandlingModes.size()]);
+ }
+
public void addFilterPath(String filterPath) {
this.filterPath = filterPath;
}
@@ -157,7 +171,7 @@ public class JPADriftCriteria extends Criteria implements DriftCriteria {
@Override
public Integer[] getFilterResourceIds() {
- return filterResourceIds.toArray(new Integer[filterResourceIds.size()]);
+ return filterResourceIds.toArray(new Integer[this.filterResourceIds.size()]);
}
public void addFilterStartTime(Long filterStartTime) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDataSource.java
index 463d222..d9f89aa 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDataSource.java
@@ -42,6 +42,7 @@ import org.rhq.core.domain.criteria.GenericDriftCriteria;
import org.rhq.core.domain.drift.Drift;
import org.rhq.core.domain.drift.DriftCategory;
import org.rhq.core.domain.drift.DriftComposite;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageList;
@@ -295,8 +296,10 @@ public class DriftDataSource extends RPCDataSource<DriftComposite, GenericDriftC
GenericDriftCriteria criteria = new GenericDriftCriteria();
// grab the change set for the drift
criteria.fetchChangeSet(true);
+
// only get the desired drift categories
criteria.addFilterCategories(categoriesFilter);
+
// only get the desired changeset version (substring match)
if (null != changeSetFilter && !changeSetFilter.isEmpty()) {
try {
@@ -318,6 +321,9 @@ public class DriftDataSource extends RPCDataSource<DriftComposite, GenericDriftC
criteria.addFilterPath(pathFilter);
}
+ // do not get planned drifts
+ criteria.addFilterDriftHandlingModes(DriftHandlingMode.normal);
+
switch (entityContext.getType()) {
case Resource:
criteria.addFilterResourceIds(entityContext.getResourceId());
commit e826430412bf5856edf425906162daccbd843d57
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Sep 2 16:59:59 2011 -0400
comment out some debug messaging that leaked into a previous commit.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeDatasource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeDatasource.java
index 6a07ee4..792517c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeDatasource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeDatasource.java
@@ -50,8 +50,6 @@ import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
import org.rhq.enterprise.gui.coregui.client.util.StringUtility;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
/**
* This doesn't extend RPCDataSource because it is tree-oriented and behaves differently than normal list data sources
@@ -186,47 +184,47 @@ public class ResourceTreeDatasource extends DataSource {
*/
public static TreeNode[] buildNodes(List<Resource> resources, List<Resource> lockedData) {
List<ResourceTreeNode> resourceNodes = new ArrayList<ResourceTreeNode>(resources.size());
- boolean nullFound = false;
+ // boolean nullFound = false;
for (Resource resource : resources) {
- if (null != resource.getParentResource() && null == resource.getParentResource().getName()) {
- CoreGUI.getMessageCenter().notify(
- new Message(" *** Null parent name for " + resource + " parent " + resource.getParentResource(),
- Severity.Info));
- nullFound = true;
- }
+ // if (null != resource.getParentResource() && null == resource.getParentResource().getName()) {
+ // CoreGUI.getMessageCenter().notify(
+ // new Message(" *** Null parent name for " + resource + " parent " + resource.getParentResource(),
+ // Severity.Info));
+ // nullFound = true;
+ // }
ResourceTreeNode node = new ResourceTreeNode(resource, lockedData.contains(resource));
resourceNodes.add(node);
}
- if (!nullFound) {
- CoreGUI.getMessageCenter().notify(new Message(" *** No Null parent names found", Severity.Info));
- }
+ // if (!nullFound) {
+ // CoreGUI.getMessageCenter().notify(new Message(" *** No Null parent names found", Severity.Info));
+ // }
List<TreeNode> result = introduceTypeAndCategoryNodes(resourceNodes);
- nullFound = false;
- for (TreeNode node : result) {
- if (node instanceof ResourceTreeNode) {
- ResourceTreeNode rtNode = (ResourceTreeNode) node;
- if (null != rtNode.getResource().getParentResource()
- && null == rtNode.getResource().getParentResource().getName()) {
- CoreGUI.getMessageCenter().notify(
- new Message(" *** Null parent name for resource tree node " + rtNode.getResource() + " parent "
- + rtNode.getResource(), Severity.Info));
- nullFound = true;
- }
- } else if (node instanceof AutoGroupTreeNode) {
- AutoGroupTreeNode rtNode = (AutoGroupTreeNode) node;
- if (null == rtNode.getParentResource().getName()) {
- CoreGUI.getMessageCenter().notify(
- new Message(" *** Null parent name for autogroup tree node " + rtNode.getParentResource(),
- Severity.Info));
- nullFound = true;
- }
- }
- }
- if (!nullFound) {
- CoreGUI.getMessageCenter().notify(new Message(" *** No Null tree node parent names found", Severity.Info));
- }
+ // nullFound = false;
+ // for (TreeNode node : result) {
+ // if (node instanceof ResourceTreeNode) {
+ // ResourceTreeNode rtNode = (ResourceTreeNode) node;
+ // if (null != rtNode.getResource().getParentResource()
+ // && null == rtNode.getResource().getParentResource().getName()) {
+ // CoreGUI.getMessageCenter().notify(
+ // new Message(" *** Null parent name for resource tree node " + rtNode.getResource() + " parent "
+ // + rtNode.getResource(), Severity.Info));
+ // nullFound = true;
+ // }
+ // } else if (node instanceof AutoGroupTreeNode) {
+ // AutoGroupTreeNode rtNode = (AutoGroupTreeNode) node;
+ // if (null == rtNode.getParentResource().getName()) {
+ // CoreGUI.getMessageCenter().notify(
+ // new Message(" *** Null parent name for autogroup tree node " + rtNode.getParentResource(),
+ // Severity.Info));
+ // nullFound = true;
+ // }
+ // }
+ // }
+ // if (!nullFound) {
+ // CoreGUI.getMessageCenter().notify(new Message(" *** No Null tree node parent names found", Severity.Info));
+ // }
return result.toArray(new TreeNode[result.size()]);
}
commit d1151c6be3055c96d9d97b472e848f84113d691e
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Sep 2 16:53:26 2011 -0400
Update Mongo plugin with drift handling mode support (still has TODOs)
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftChangeSet.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftChangeSet.java
index 5c8fdb5..5ad5796 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftChangeSet.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftChangeSet.java
@@ -114,9 +114,9 @@ public interface DriftChangeSet<D extends Drift<?, ?>> {
* value set on the owning drift configuration can change, the value must be stored with
* the change set such that it can be applied consistently when handling the associated drift.
*
- * @param mode The {@link DriftConfiguration.DriftHandlingMode} mode
+ * @param driftHandlingMode The {@link DriftConfiguration.DriftHandlingMode} mode
*/
- void setDriftHandlingMode(DriftHandlingMode mode);
+ void setDriftHandlingMode(DriftHandlingMode driftHandlingMode);
/**
* Returns the id of the owning drift configuration. Note that while server plugins are
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
index 644ee60..6c51441 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
@@ -52,6 +52,7 @@ import org.rhq.core.domain.drift.DriftChangeSetCategory;
import org.rhq.core.domain.drift.DriftComposite;
import org.rhq.core.domain.drift.DriftFile;
import org.rhq.core.domain.drift.DriftSnapshot;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
import org.rhq.core.domain.drift.dto.DriftChangeSetDTO;
import org.rhq.core.domain.drift.dto.DriftDTO;
import org.rhq.core.domain.drift.dto.DriftFileDTO;
@@ -119,6 +120,8 @@ public class MongoDBDriftServer implements DriftServerPluginFacet, ServerPluginC
changeSet.setResourceId(resourceId);
// TODO Figure out how best to handle drift config reference
changeSet.setDriftConfigurationId(1);
+ // TODO Figure out how best to handle drift config drift handling mode
+ changeSet.setDriftHandlingMode(DriftHandlingMode.normal);
changeSet.setVersion(changeSetVersions++);
summary.setCategory(headers.getType());
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBChangeSet.java b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBChangeSet.java
index 61fdad0..0bdd2fd 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBChangeSet.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBChangeSet.java
@@ -31,6 +31,7 @@ import org.bson.types.ObjectId;
import org.rhq.core.domain.drift.DriftChangeSet;
import org.rhq.core.domain.drift.DriftChangeSetCategory;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
/**
* A change set that is stored in a MongoDB database. The change set along with its entries
@@ -62,6 +63,8 @@ public class MongoDBChangeSet implements DriftChangeSet<MongoDBChangeSetEntry>,
private int configId;
+ private DriftHandlingMode driftHandlingMode;
+
private int resourceId;
@Embedded("files")
@@ -121,6 +124,16 @@ public class MongoDBChangeSet implements DriftChangeSet<MongoDBChangeSetEntry>,
}
@Override
+ public DriftHandlingMode getDriftHandlingMode() {
+ return this.driftHandlingMode;
+ }
+
+ @Override
+ public void setDriftHandlingMode(DriftHandlingMode driftHandlingMode) {
+ this.driftHandlingMode = driftHandlingMode;
+ }
+
+ @Override
public int getResourceId() {
return resourceId;
}
commit 2142f792ace3b914fc53b17019bac2ee9dd76132
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Sep 2 16:42:34 2011 -0400
Change instances of History.newItem to be CoreGUI.goToView to ensure
all necessary view processing takes place.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java
index ab8491c..530f77a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java
@@ -24,7 +24,6 @@ package org.rhq.enterprise.gui.coregui.client.bundle.tree;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.RunAsyncCallback;
-import com.google.gwt.user.client.History;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.widgets.grid.events.DataArrivedEvent;
import com.smartgwt.client.widgets.grid.events.DataArrivedHandler;
@@ -33,6 +32,7 @@ import com.smartgwt.client.widgets.tree.TreeNode;
import com.smartgwt.client.widgets.tree.events.NodeClickEvent;
import com.smartgwt.client.widgets.tree.events.NodeClickHandler;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.ViewId;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
@@ -65,7 +65,7 @@ public class BundleTreeView extends LocatableTreeGrid {
public void onNodeClick(NodeClickEvent event) {
TreeNode node = event.getNode();
String path = node.getAttribute("id").replaceAll("_", "/");
- History.newItem("Bundles/Bundle/" + path);
+ CoreGUI.goToView("Bundles/Bundle/" + path);
}
});
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/AbstractTableSection.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/AbstractTableSection.java
index 2ccfb53..e662347 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/AbstractTableSection.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/AbstractTableSection.java
@@ -23,7 +23,6 @@
package org.rhq.enterprise.gui.coregui.client.components.table;
import com.allen_sauer.gwt.log.client.Log;
-import com.google.gwt.user.client.History;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.SortSpecifier;
import com.smartgwt.client.types.AnimationEffect;
@@ -39,6 +38,7 @@ import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.DetailsView;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
import org.rhq.enterprise.gui.coregui.client.components.buttons.BackButton;
@@ -248,7 +248,7 @@ public abstract class AbstractTableSection<DS extends RPCDataSource, ID> extends
* @see #showDetails(ListGridRecord)
*/
public void newDetails() {
- History.newItem(basePath + "/0"); // assumes the subclasses will understand "0" means "new details page"
+ CoreGUI.goToView(basePath + "/0"); // assumes the subclasses will understand "0" means "new details page"
}
/**
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/TableSection.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/TableSection.java
index 3eb65c5..3eea53e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/TableSection.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/TableSection.java
@@ -19,7 +19,6 @@
package org.rhq.enterprise.gui.coregui.client.components.table;
-import com.google.gwt.user.client.History;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.SortSpecifier;
import com.smartgwt.client.widgets.Canvas;
@@ -87,7 +86,7 @@ public abstract class TableSection<DS extends RPCDataSource> extends AbstractTab
@Override
public void showDetails(Integer id) {
if (id != null && id.intValue() > 0) {
- History.newItem(getBasePath() + "/" + id);
+ CoreGUI.goToView(getBasePath() + "/" + id);
} else {
String msg = MSG.view_tableSection_error_badId(this.getClass().toString(), (id == null) ? "null" : id
.toString());
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/content/repository/tree/ContentRepositoryTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/content/repository/tree/ContentRepositoryTreeView.java
index 79b1162..fac5b79 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/content/repository/tree/ContentRepositoryTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/content/repository/tree/ContentRepositoryTreeView.java
@@ -24,12 +24,12 @@ package org.rhq.enterprise.gui.coregui.client.content.repository.tree;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.RunAsyncCallback;
-import com.google.gwt.user.client.History;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.widgets.tree.TreeNode;
import com.smartgwt.client.widgets.tree.events.NodeClickEvent;
import com.smartgwt.client.widgets.tree.events.NodeClickHandler;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.ViewId;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
@@ -59,7 +59,7 @@ public class ContentRepositoryTreeView extends LocatableTreeGrid {
addNodeClickHandler(new NodeClickHandler() {
public void onNodeClick(NodeClickEvent event) {
String path = event.getNode().getAttribute("id").replaceAll(":", "/");
- History.newItem("Bundles/Repository/" + path);
+ CoreGUI.goToView("Bundles/Repository/" + path);
}
});
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/SingleGroupDefinitionView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/SingleGroupDefinitionView.java
index 08128de..e286590 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/SingleGroupDefinitionView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/SingleGroupDefinitionView.java
@@ -205,7 +205,7 @@ public class SingleGroupDefinitionView extends LocatableVLayout implements Bookm
if (recalc) {
recalculate(dynaGroupChildrenView, newGroupDefinition.getId());
}
- History.newItem(basePath + "/" + newGroupDefinition.getId());
+ CoreGUI.goToView(basePath + "/" + newGroupDefinition.getId());
}
} else {
dynaGroupChildrenView.refresh();
commit 2c99b6f0b2139ba0a19ed43b6b5b932d6e427b52
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Sep 2 16:41:45 2011 -0400
Planned Drift Support - DriftConfigurationDefinition work
- update DriftConfigurationDefinition and the drift xsd to include
DriftHandlingMode property (normal | plannedChanges)
- update DriftChangeSet (and JPA impl) to persist its driftHandlingMode
- update dbsetup as needed (dbupgrade work pending)
- update DriftConfigurationTest to include tests for the new property
- update DriftConfigurationComparator as well
- update DriftChangeSetSummary to hold the handling mode and don't notify
alerting in planned changes mode.
diff --git a/modules/core/client-api/src/main/resources/rhq-plugin.xsd b/modules/core/client-api/src/main/resources/rhq-plugin.xsd
index e02013a..08e2a90 100644
--- a/modules/core/client-api/src/main/resources/rhq-plugin.xsd
+++ b/modules/core/client-api/src/main/resources/rhq-plugin.xsd
@@ -592,6 +592,25 @@
</xs:documentation>
</xs:annotation>
</xs:element>
+ <xs:element name="driftHandlingMode" minOccurs="0" maxOccurs="1" default="normal">
+ <xs:annotation>
+ <xs:documentation>
+ Specifies the way in which drift occurrences will be handled when reported. Normal
+ handling implies the reported drift is unexpected and as such can trigger alerts,
+ will be present in recent drift reports, etc. Setting to "Planned Changes" implies
+ that the reported drift is happening at a time when drift is expected due to
+ planned changes in the monitored environment, such as an application deployment, a
+ configuration change, or something similar. With this setting drift is only reported
+ for inspection, in the drift history view.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="normal"/>
+ <xs:enumeration value="plannedChange"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
<xs:element name="includes" type="rhq:DriftIncludes" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:documentation>
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftChangeSet.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftChangeSet.java
index 33a78ec..5c8fdb5 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftChangeSet.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftChangeSet.java
@@ -20,7 +20,7 @@ package org.rhq.core.domain.drift;
import java.util.Set;
-import org.rhq.core.domain.drift.DriftConfiguration.Mode;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
/**
* A DriftChangeSet is somewhat similar to a commit in version control systems. It contains
@@ -99,24 +99,24 @@ public interface DriftChangeSet<D extends Drift<?, ?>> {
void setCategory(DriftChangeSetCategory category);
/**
- * Returns the mode of the owning drift configuration at the time of change set creation.
- * Because the value set on the owning drift configuration can change, the value must be
- * stored with the change set such that it can be applied consistently when handling the
- * associated drift.
+ * Returns the drift handling mode of the owning drift configuration at the time of change
+ * set creation. Because the value set on the owning drift configuration can change, the
+ * value must be stored with the change set such that it can be applied consistently when
+ * handling the associated drift.
*
- * @return The {@link DriftConfiguration.Mode} mode
+ * @return The {@link DriftConfiguration.DriftHandlingMode} mode
*/
- DriftConfiguration.Mode getDriftConfigurationMode();
+ DriftHandlingMode getDriftHandlingMode();
/**
- * Sets the drift configuration mode for the change set. It should be set to the owning drift
- * configuration mode at the time of change set creation. Because the value set on the owning
- * drift configuration can change, the value must be stored with the change set such that it
- * can be applied consistently when handling the associated drift.
+ * Sets the drift handling mode for the change set. It should be set to the owning drift
+ * configuration's drift handling mode at the time of change set creation. Because the
+ * value set on the owning drift configuration can change, the value must be stored with
+ * the change set such that it can be applied consistently when handling the associated drift.
*
- * @param mode The {@link DriftConfiguration.Mode} mode
+ * @param mode The {@link DriftConfiguration.DriftHandlingMode} mode
*/
- void setDriftConfigurationMode(Mode mode);
+ void setDriftHandlingMode(DriftHandlingMode mode);
/**
* Returns the id of the owning drift configuration. Note that while server plugins are
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java
index 40e0403..244b9c0 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java
@@ -45,6 +45,7 @@ import org.rhq.core.domain.configuration.PropertyList;
import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
import org.rhq.core.domain.resource.Resource;
/**
@@ -82,7 +83,7 @@ public class DriftConfiguration implements Serializable {
@Column(name = "MODE", nullable = false)
@Enumerated(EnumType.STRING)
- private Mode mode;
+ private DriftHandlingMode driftHandlingMode;
// unit = millis
@Column(name = "INTERVAL", nullable = false)
@@ -151,12 +152,17 @@ public class DriftConfiguration implements Serializable {
this.setEnabledProperty(isEnabled);
}
- public Mode getMode() {
- return mode;
+ public DriftHandlingMode getDriftHandlingMode() {
+ return driftHandlingMode;
}
- public void setMode(Mode mode) {
- this.mode = mode;
+ public void setDriftHandlingMode(DriftHandlingMode driftHandlingMode) {
+ if (null == driftHandlingMode) {
+ driftHandlingMode = DriftConfigurationDefinition.DEFAULT_DRIFT_HANDLING_MODE;
+ }
+
+ this.driftHandlingMode = driftHandlingMode;
+ this.setDriftHandlingModeProperty(driftHandlingMode);
}
public long getInterval() {
@@ -185,6 +191,7 @@ public class DriftConfiguration implements Serializable {
this.name = this.getNameProperty();
this.isEnabled = this.getIsEnabledProperty();
this.interval = this.getIntervalProperty();
+ this.driftHandlingMode = this.getDriftHandlingModeProperty();
}
public Resource getResource() {
@@ -341,6 +348,16 @@ public class DriftConfiguration implements Serializable {
configuration.put(new PropertySimple(DriftConfigurationDefinition.PROP_INTERVAL, interval.toString()));
}
+ private DriftHandlingMode getDriftHandlingModeProperty() {
+ return DriftHandlingMode.valueOf(configuration.getSimpleValue(
+ DriftConfigurationDefinition.PROP_DRIFT_HANDLING_MODE,
+ DriftConfigurationDefinition.DEFAULT_DRIFT_HANDLING_MODE.name()));
+ }
+
+ private void setDriftHandlingModeProperty(DriftHandlingMode mode) {
+ configuration.put(new PropertySimple(DriftConfigurationDefinition.PROP_DRIFT_HANDLING_MODE, mode.name()));
+ }
+
private boolean getIsEnabledProperty() {
return configuration.getSimpleValue(DriftConfigurationDefinition.PROP_ENABLED,
String.valueOf(DriftConfigurationDefinition.DEFAULT_ENABLED)).equals("true");
@@ -401,12 +418,4 @@ public class DriftConfiguration implements Serializable {
return filters;
}
-
- // Drift Handling Mode
- public enum Mode {
- // alerting, included in recent drift reporting
- NORMAL,
- // no alerting, not included in recent drift reporting, flagged in UI as planned
- PLANNED_CHANGES
- }
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationComparator.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationComparator.java
index 75098c8..d530ab4 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationComparator.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationComparator.java
@@ -33,7 +33,7 @@ public class DriftConfigurationComparator implements Comparator<DriftConfigurati
public enum CompareMode {
/**
- * The comparator will only check the base information: name, enabled, interval.
+ * The comparator will only check the base information: name, enabled, interval, driftHandlingMode
* The basedir/includes-excludes filters will be ignored.
*/
ONLY_BASE_INFO,
@@ -77,6 +77,10 @@ public class DriftConfigurationComparator implements Comparator<DriftConfigurati
return dc1.getInterval() < dc2.getInterval() ? -1 : 1;
}
+ if (dc1.getDriftHandlingMode() != dc2.getDriftHandlingMode()) {
+ return dc1.getDriftHandlingMode().ordinal() < dc2.getDriftHandlingMode().ordinal() ? -1 : 1;
+ }
+
if (dc1.isEnabled() != dc2.isEnabled()) {
return dc1.isEnabled() ? 1 : -1; // so false sorts before true, seems logical to me
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java
index e669a9a..70c3c84 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfigurationDefinition.java
@@ -50,6 +50,7 @@ public class DriftConfigurationDefinition implements Serializable {
public static final String PROP_BASEDIR_VALUECONTEXT = "valueContext";
public static final String PROP_BASEDIR_VALUENAME = "valueName";
public static final String PROP_INTERVAL = "interval";
+ public static final String PROP_DRIFT_HANDLING_MODE = "driftHandlingMode";
public static final String PROP_INCLUDES = "includes";
public static final String PROP_INCLUDES_INCLUDE = "include";
public static final String PROP_EXCLUDES = "excludes";
@@ -64,6 +65,7 @@ public class DriftConfigurationDefinition implements Serializable {
public static final boolean DEFAULT_ENABLED = true;
public static final long DEFAULT_INTERVAL = 1800L;
+ public static final DriftHandlingMode DEFAULT_DRIFT_HANDLING_MODE = DriftHandlingMode.normal;
/**
* The basedir property is specified in two parts - a "context" and a "name". Taken together
@@ -77,6 +79,13 @@ public class DriftConfigurationDefinition implements Serializable {
pluginConfiguration, resourceConfiguration, measurementTrait, fileSystem
}
+ /**
+ * The enumerated values for drift handling mode property
+ */
+ public enum DriftHandlingMode {
+ normal, plannedChanges
+ }
+
private static final ConfigurationDefinition INSTANCE = new ConfigurationDefinition("GLOBAL_DRIFT_CONFIG_DEF",
"The drift configuration definition");
@@ -112,24 +121,23 @@ public class DriftConfigurationDefinition implements Serializable {
}
static {
- //INSTANCE.setId(1);
INSTANCE.setConfigurationFormat(ConfigurationFormat.STRUCTURED);
INSTANCE.put(createName(INSTANCE, false));
INSTANCE.put(createEnabled(INSTANCE));
- INSTANCE.put(createBasedir(INSTANCE, false));
+ INSTANCE.put(createDriftHandlingMode(INSTANCE));
INSTANCE.put(createInterval(INSTANCE));
+ INSTANCE.put(createBasedir(INSTANCE, false));
INSTANCE.put(createIncludes(INSTANCE, false));
INSTANCE.put(createExcludes(INSTANCE, false));
- //INSTANCE_FOR_EXISTING_CONFIGS.setId(1);
INSTANCE_FOR_EXISTING_CONFIGS.setConfigurationFormat(ConfigurationFormat.STRUCTURED);
INSTANCE_FOR_EXISTING_CONFIGS.put(createName(INSTANCE_FOR_EXISTING_CONFIGS, true));
INSTANCE_FOR_EXISTING_CONFIGS.put(createEnabled(INSTANCE_FOR_EXISTING_CONFIGS));
- INSTANCE_FOR_EXISTING_CONFIGS.put(createBasedir(INSTANCE_FOR_EXISTING_CONFIGS, true));
+ INSTANCE_FOR_EXISTING_CONFIGS.put(createDriftHandlingMode(INSTANCE_FOR_EXISTING_CONFIGS));
INSTANCE_FOR_EXISTING_CONFIGS.put(createInterval(INSTANCE_FOR_EXISTING_CONFIGS));
+ INSTANCE_FOR_EXISTING_CONFIGS.put(createBasedir(INSTANCE_FOR_EXISTING_CONFIGS, true));
INSTANCE_FOR_EXISTING_CONFIGS.put(createIncludes(INSTANCE_FOR_EXISTING_CONFIGS, true));
INSTANCE_FOR_EXISTING_CONFIGS.put(createExcludes(INSTANCE_FOR_EXISTING_CONFIGS, true));
-
}
private static PropertyDefinitionSimple createName(ConfigurationDefinition configDef, boolean readOnly) {
@@ -139,7 +147,6 @@ public class DriftConfigurationDefinition implements Serializable {
PropertySimpleType type = PropertySimpleType.STRING;
PropertyDefinitionSimple pd = new PropertyDefinitionSimple(name, description, required, type);
- //pd.setId(1);
pd.setDisplayName("Drift Configuration Name");
pd.setReadOnly(readOnly);
pd.setSummary(true);
@@ -161,7 +168,6 @@ public class DriftConfigurationDefinition implements Serializable {
PropertySimpleType type = PropertySimpleType.BOOLEAN;
PropertyDefinitionSimple pd = new PropertyDefinitionSimple(name, description, required, type);
- //pd.setId(2);
pd.setDisplayName("Enabled");
pd.setReadOnly(false);
pd.setSummary(true);
@@ -172,6 +178,60 @@ public class DriftConfigurationDefinition implements Serializable {
return pd;
}
+ private static PropertyDefinitionSimple createDriftHandlingMode(ConfigurationDefinition configDef) {
+ String name = PROP_DRIFT_HANDLING_MODE;
+ String description = "" //
+ + "Specifies the way in which drift occurrences will be handled when reported. Normal " //
+ + "handling implies the reported drift is unexpected and as such can trigger alerts, " //
+ + "will be present in recent drift reports, etc. Setting to 'Planned Changes' implies " //
+ + "that the reported drift is happening at a time when drift is expected due to " //
+ + "planned changes in the monitored environment, such as an application deployment, a " //
+ + "configuration change, or something similar. With this setting drift is only reported " //
+ + " for inspection, in the drift history view.";
+ boolean required = true;
+ PropertySimpleType type = PropertySimpleType.STRING;
+
+ PropertyDefinitionSimple pd = new PropertyDefinitionSimple(name, description, required, type);
+ pd.setDisplayName("Drift Handling Mode");
+ pd.setReadOnly(false);
+ pd.setSummary(true);
+ pd.setOrder(2);
+ pd.setConfigurationDefinition(configDef);
+
+ PropertyDefinitionEnumeration normalEnum = new PropertyDefinitionEnumeration(DriftHandlingMode.normal.name(),
+ DriftHandlingMode.normal.name());
+ normalEnum.setOrderIndex(0);
+
+ PropertyDefinitionEnumeration plannedEnum = new PropertyDefinitionEnumeration(DriftHandlingMode.plannedChanges
+ .name(), DriftHandlingMode.plannedChanges.name());
+ plannedEnum.setOrderIndex(1);
+
+ ArrayList<PropertyDefinitionEnumeration> pdEnums = new ArrayList<PropertyDefinitionEnumeration>(2);
+ pdEnums.add(normalEnum);
+ pdEnums.add(plannedEnum);
+ pd.setEnumeratedValues(pdEnums, false);
+ pd.setDefaultValue(DEFAULT_DRIFT_HANDLING_MODE.name());
+
+ return pd;
+ }
+
+ private static PropertyDefinitionSimple createInterval(ConfigurationDefinition configDef) {
+ String name = PROP_INTERVAL;
+ String description = "The frequency in seconds in which drift monitoring should run. Defaults to 1800 seconds (i.e. 30 minutes)";
+ boolean required = false;
+ PropertySimpleType type = PropertySimpleType.LONG;
+
+ PropertyDefinitionSimple pd = new PropertyDefinitionSimple(name, description, required, type);
+ pd.setDisplayName("Interval");
+ pd.setReadOnly(false);
+ pd.setSummary(true);
+ pd.setOrder(3);
+ pd.setAllowCustomEnumeratedValue(false);
+ pd.setConfigurationDefinition(configDef);
+ pd.setDefaultValue(String.valueOf(DEFAULT_INTERVAL));
+ return pd;
+ }
+
private static PropertyDefinitionMap createBasedir(ConfigurationDefinition configDef, boolean readOnly) {
String name = PROP_BASEDIR;
String description = "The root directory from which snapshots will be generated during drift monitoring.";
@@ -181,11 +241,10 @@ public class DriftConfigurationDefinition implements Serializable {
PropertyDefinitionSimple valueName = createBasedirValueName(readOnly);
PropertyDefinitionMap pd = new PropertyDefinitionMap(name, description, required, valueContext, valueName);
- //pd.setId(3);
pd.setDisplayName("Base Directory");
pd.setReadOnly(readOnly);
pd.setSummary(true);
- pd.setOrder(2);
+ pd.setOrder(4);
pd.setConfigurationDefinition(configDef);
return pd;
@@ -198,7 +257,6 @@ public class DriftConfigurationDefinition implements Serializable {
PropertySimpleType type = PropertySimpleType.STRING;
PropertyDefinitionSimple pd = new PropertyDefinitionSimple(name, description, required, type);
- //pd.setId(4);
pd.setDisplayName("Value Context");
pd.setReadOnly(readOnly);
pd.setSummary(true);
@@ -206,22 +264,18 @@ public class DriftConfigurationDefinition implements Serializable {
PropertyDefinitionEnumeration pcEnum = new PropertyDefinitionEnumeration(
BaseDirValueContext.pluginConfiguration.name(), BaseDirValueContext.pluginConfiguration.name());
- //pcEnum.setId(1);
pcEnum.setOrderIndex(0);
PropertyDefinitionEnumeration rcEnum = new PropertyDefinitionEnumeration(
BaseDirValueContext.resourceConfiguration.name(), BaseDirValueContext.resourceConfiguration.name());
- //rcEnum.setId(2);
rcEnum.setOrderIndex(1);
PropertyDefinitionEnumeration mtEnum = new PropertyDefinitionEnumeration(BaseDirValueContext.measurementTrait
.name(), BaseDirValueContext.measurementTrait.name());
- //mtEnum.setId(3);
mtEnum.setOrderIndex(2);
PropertyDefinitionEnumeration fsEnum = new PropertyDefinitionEnumeration(BaseDirValueContext.fileSystem.name(),
BaseDirValueContext.fileSystem.name());
- //fsEnum.setId(4);
fsEnum.setOrderIndex(3);
ArrayList<PropertyDefinitionEnumeration> pdEnums = new ArrayList<PropertyDefinitionEnumeration>(4);
@@ -236,12 +290,11 @@ public class DriftConfigurationDefinition implements Serializable {
private static PropertyDefinitionSimple createBasedirValueName(boolean readOnly) {
String name = PROP_BASEDIR_VALUENAME;
- String description = "The name of the value as found in the context";
+ String description = "The name of the value as found in the context.";
boolean required = true;
PropertySimpleType type = PropertySimpleType.STRING;
PropertyDefinitionSimple pd = new PropertyDefinitionSimple(name, description, required, type);
- //pd.setId(5);
pd.setDisplayName("Value Name");
pd.setReadOnly(readOnly);
pd.setSummary(true);
@@ -250,24 +303,6 @@ public class DriftConfigurationDefinition implements Serializable {
return pd;
}
- private static PropertyDefinitionSimple createInterval(ConfigurationDefinition configDef) {
- String name = PROP_INTERVAL;
- String description = "The frequency in seconds in which drift monitoring should run. Defaults to 1800 seconds (i.e. 30 minutes)";
- boolean required = false;
- PropertySimpleType type = PropertySimpleType.LONG;
-
- PropertyDefinitionSimple pd = new PropertyDefinitionSimple(name, description, required, type);
- //pd.setId(6);
- pd.setDisplayName("Interval");
- pd.setReadOnly(false);
- pd.setSummary(true);
- pd.setOrder(3);
- pd.setAllowCustomEnumeratedValue(false);
- pd.setConfigurationDefinition(configDef);
- pd.setDefaultValue(String.valueOf(DEFAULT_INTERVAL));
- return pd;
- }
-
private static PropertyDefinitionList createIncludes(ConfigurationDefinition configDef, boolean readOnly) {
String name = PROP_INCLUDES;
String description = "A set of patterns that specify files and/or directories to include.";
@@ -276,11 +311,10 @@ public class DriftConfigurationDefinition implements Serializable {
PropertyDefinitionMap map = createInclude(readOnly);
PropertyDefinitionList pd = new PropertyDefinitionList(name, description, required, map);
- //pd.setId(7);
pd.setDisplayName("Includes");
pd.setReadOnly(readOnly);
pd.setSummary(true);
- pd.setOrder(4);
+ pd.setOrder(5);
pd.setConfigurationDefinition(configDef);
return pd;
}
@@ -294,7 +328,6 @@ public class DriftConfigurationDefinition implements Serializable {
PropertyDefinitionSimple pattern = createIncludePattern(readOnly);
PropertyDefinitionMap pd = new PropertyDefinitionMap(name, description, required, path, pattern);
- //pd.setId(8);
pd.setDisplayName("Include");
pd.setReadOnly(readOnly);
pd.setSummary(true);
@@ -309,7 +342,6 @@ public class DriftConfigurationDefinition implements Serializable {
PropertySimpleType type = PropertySimpleType.STRING;
PropertyDefinitionSimple pd = new PropertyDefinitionSimple(name, description, required, type);
- //pd.setId(9);
pd.setDisplayName("Path");
pd.setReadOnly(readOnly);
pd.setSummary(true);
@@ -325,7 +357,6 @@ public class DriftConfigurationDefinition implements Serializable {
PropertySimpleType type = PropertySimpleType.STRING;
PropertyDefinitionSimple pd = new PropertyDefinitionSimple(name, description, required, type);
- //pd.setId(10);
pd.setDisplayName("Pattern");
pd.setReadOnly(readOnly);
pd.setSummary(true);
@@ -342,11 +373,10 @@ public class DriftConfigurationDefinition implements Serializable {
PropertyDefinitionMap map = createExclude(readOnly);
PropertyDefinitionList pd = new PropertyDefinitionList(name, description, required, map);
- //pd.setId(11);
pd.setDisplayName("Excludes");
pd.setReadOnly(readOnly);
pd.setSummary(true);
- pd.setOrder(5);
+ pd.setOrder(6);
pd.setConfigurationDefinition(configDef);
return pd;
}
@@ -360,7 +390,6 @@ public class DriftConfigurationDefinition implements Serializable {
PropertyDefinitionSimple pattern = createExcludePattern(readOnly);
PropertyDefinitionMap pd = new PropertyDefinitionMap(name, description, required, path, pattern);
- //pd.setId(12);
pd.setDisplayName("Exclude");
pd.setReadOnly(readOnly);
pd.setSummary(true);
@@ -375,7 +404,6 @@ public class DriftConfigurationDefinition implements Serializable {
PropertySimpleType type = PropertySimpleType.STRING;
PropertyDefinitionSimple pd = new PropertyDefinitionSimple(name, description, required, type);
- //pd.setId(13);
pd.setDisplayName("Path");
pd.setReadOnly(readOnly);
pd.setSummary(true);
@@ -391,7 +419,6 @@ public class DriftConfigurationDefinition implements Serializable {
PropertySimpleType type = PropertySimpleType.STRING;
PropertyDefinitionSimple pd = new PropertyDefinitionSimple(name, description, required, type);
- //pd.setId(14);
pd.setDisplayName("Pattern");
pd.setReadOnly(readOnly);
pd.setSummary(true);
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/JPADriftChangeSet.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/JPADriftChangeSet.java
index a2421a0..1f82848 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/JPADriftChangeSet.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/JPADriftChangeSet.java
@@ -44,6 +44,7 @@ import javax.persistence.PrePersist;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
import org.rhq.core.domain.resource.Resource;
/**
@@ -98,7 +99,7 @@ public class JPADriftChangeSet implements Serializable, DriftChangeSet<JPADrift>
// that is the "live" setting.
@Column(name = "DRIFT_CONFIG_MODE", nullable = false)
@Enumerated(EnumType.STRING)
- private DriftConfiguration.Mode driftConfigurationMode;
+ private DriftHandlingMode driftHandlingMode;
@JoinColumn(name = "RESOURCE_ID", referencedColumnName = "ID", nullable = false)
@ManyToOne(optional = false)
@@ -116,6 +117,7 @@ public class JPADriftChangeSet implements Serializable, DriftChangeSet<JPADrift>
this.version = version;
this.category = category;
this.driftConfiguration = driftConfiguration;
+ this.driftHandlingMode = driftConfiguration.getDriftHandlingMode();
}
@Override
@@ -179,12 +181,12 @@ public class JPADriftChangeSet implements Serializable, DriftChangeSet<JPADrift>
this.driftConfiguration = driftConfiguration;
}
- public DriftConfiguration.Mode getDriftConfigurationMode() {
- return driftConfigurationMode;
+ public DriftHandlingMode getDriftHandlingMode() {
+ return driftHandlingMode;
}
- public void setDriftConfigurationMode(DriftConfiguration.Mode driftConfigurationMode) {
- this.driftConfigurationMode = driftConfigurationMode;
+ public void setDriftHandlingMode(DriftHandlingMode driftHandlingMode) {
+ this.driftHandlingMode = driftHandlingMode;
}
@Override
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/dto/DriftChangeSetDTO.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/dto/DriftChangeSetDTO.java
index 4ace8d1..8912791 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/dto/DriftChangeSetDTO.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/dto/DriftChangeSetDTO.java
@@ -6,6 +6,7 @@ import java.util.Set;
import org.rhq.core.domain.drift.DriftChangeSet;
import org.rhq.core.domain.drift.DriftChangeSetCategory;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
public class DriftChangeSetDTO implements DriftChangeSet<DriftDTO>, Serializable {
@@ -21,6 +22,8 @@ public class DriftChangeSetDTO implements DriftChangeSet<DriftDTO>, Serializable
private int configId;
+ private DriftHandlingMode driftHandlingMode;
+
private int resourceId;
private Set<DriftDTO> drifts = new HashSet<DriftDTO>();
@@ -88,4 +91,14 @@ public class DriftChangeSetDTO implements DriftChangeSet<DriftDTO>, Serializable
public void setDrifts(Set<DriftDTO> drifts) {
this.drifts = drifts;
}
+
+ @Override
+ public DriftHandlingMode getDriftHandlingMode() {
+ return this.driftHandlingMode;
+ }
+
+ @Override
+ public void setDriftHandlingMode(DriftHandlingMode mode) {
+ this.driftHandlingMode = mode;
+ }
}
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/drift/DriftConfigurationTest.java b/modules/core/domain/src/test/java/org/rhq/core/domain/drift/DriftConfigurationTest.java
index b59dd01..3540b29 100644
--- a/modules/core/domain/src/test/java/org/rhq/core/domain/drift/DriftConfigurationTest.java
+++ b/modules/core/domain/src/test/java/org/rhq/core/domain/drift/DriftConfigurationTest.java
@@ -1,5 +1,12 @@
package org.rhq.core.domain.drift;
+import static java.util.Arrays.asList;
+import static org.rhq.core.domain.drift.DriftConfigurationDefinition.PROP_BASEDIR;
+import static org.rhq.core.domain.drift.DriftConfigurationDefinition.PROP_BASEDIR_VALUECONTEXT;
+import static org.rhq.core.domain.drift.DriftConfigurationDefinition.PROP_BASEDIR_VALUENAME;
+import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem;
+import static org.testng.Assert.assertEquals;
+
import java.util.List;
import org.testng.annotations.Test;
@@ -10,13 +17,7 @@ import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode;
import org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext;
-
-import static java.util.Arrays.asList;
-import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem;
-import static org.rhq.core.domain.drift.DriftConfigurationDefinition.PROP_BASEDIR;
-import static org.rhq.core.domain.drift.DriftConfigurationDefinition.PROP_BASEDIR_VALUECONTEXT;
-import static org.rhq.core.domain.drift.DriftConfigurationDefinition.PROP_BASEDIR_VALUENAME;
-import static org.testng.Assert.assertEquals;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
public class DriftConfigurationTest {
@Test
@@ -32,6 +33,7 @@ public class DriftConfigurationTest {
assert comparator.compare(dc1, dc2) != 0 : dc1 + " should not equal " + dc2;
assert comparator.compare(dc2, dc1) != 0 : dc2 + " should not equal " + dc1;
dc1.setInterval(1000L);
+ dc1.setDriftHandlingMode(DriftHandlingMode.normal);
assert comparator.compare(dc1, dc2) != 0 : dc1 + " should not equal " + dc2;
assert comparator.compare(dc2, dc1) != 0 : dc2 + " should not equal " + dc1;
dc1.setName("the-name");
@@ -40,6 +42,7 @@ public class DriftConfigurationTest {
dc2.setEnabled(false);
dc2.setInterval(1000L);
+ dc2.setDriftHandlingMode(DriftHandlingMode.normal);
dc2.setName("the-name");
assert comparator.compare(dc1, dc2) == 0 : dc1 + " should equal " + dc2;
@@ -52,6 +55,10 @@ public class DriftConfigurationTest {
assert comparator.compare(dc1, dc2) > 0 : dc1 + " should have different interval than " + dc2;
dc1.setInterval(dc2.getInterval()); // put them back to the same value
+ dc1.setDriftHandlingMode(DriftHandlingMode.plannedChanges);
+ assert comparator.compare(dc1, dc2) > 0 : dc1 + " should have different drift handling mode than " + dc2;
+
+ dc1.setDriftHandlingMode(DriftHandlingMode.normal); // put them back to the same value
dc1.setName("zzzzz" + dc2.getName());
assert comparator.compare(dc1, dc2) > 0 : dc1 + " should have different name than " + dc2;
@@ -84,10 +91,12 @@ public class DriftConfigurationTest {
dc1.setEnabled(true);
dc1.setInterval(1000L);
+ dc1.setDriftHandlingMode(DriftHandlingMode.normal);
dc1.setName("the-name");
dc2.setEnabled(true);
dc2.setInterval(1000L);
+ dc2.setDriftHandlingMode(DriftHandlingMode.normal);
dc2.setName("the-name");
getCompareBaseInfoAndIncludesExcludes(comparator, dc1, dc2);
@@ -103,10 +112,12 @@ public class DriftConfigurationTest {
dc1.setEnabled(false);
dc1.setInterval(1111L);
+ dc2.setDriftHandlingMode(DriftHandlingMode.normal);
dc1.setName("some-name");
dc2.setEnabled(true);
dc2.setInterval(2222L);
+ dc2.setDriftHandlingMode(DriftHandlingMode.plannedChanges);
dc2.setName("another-name");
getCompareBaseInfoAndIncludesExcludes(comparator, dc1, dc2);
@@ -239,6 +250,19 @@ public class DriftConfigurationTest {
}
@Test
+ public void getDriftHandlingMode() {
+ DriftHandlingMode mode = DriftHandlingMode.normal;
+ Configuration config = new Configuration();
+ config.put(new PropertySimple(DriftConfigurationDefinition.PROP_DRIFT_HANDLING_MODE, mode.name()));
+ DriftConfiguration driftConfig = new DriftConfiguration(config);
+ assertEquals(driftConfig.getDriftHandlingMode(), mode, "Failed to get drift configuration drift handling mode");
+
+ mode = DriftHandlingMode.plannedChanges;
+ driftConfig.setDriftHandlingMode(mode);
+ assertEquals(driftConfig.getDriftHandlingMode(), mode, "Failed to get drift configuration drift handling mode");
+ }
+
+ @Test
public void getIncludes() {
String path1 = "lib";
String pattern1 = "*.jar";
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/drift/SnapshotTest.java b/modules/core/domain/src/test/java/org/rhq/core/domain/drift/SnapshotTest.java
index 4237f3a..42cf146 100644
--- a/modules/core/domain/src/test/java/org/rhq/core/domain/drift/SnapshotTest.java
+++ b/modules/core/domain/src/test/java/org/rhq/core/domain/drift/SnapshotTest.java
@@ -16,6 +16,8 @@ import java.util.Set;
import org.testng.annotations.Test;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
+
@SuppressWarnings("unchecked")
public class SnapshotTest {
@@ -160,6 +162,7 @@ public class SnapshotTest {
private int version;
private DriftChangeSetCategory category;
private int configId;
+ private DriftHandlingMode mode = DriftHandlingMode.normal;
private Set<Drift> drifts = new HashSet<Drift>();
private long ctime = System.currentTimeMillis();
@@ -236,6 +239,16 @@ public class SnapshotTest {
drifts.add(drift);
return this;
}
+
+ @Override
+ public DriftHandlingMode getDriftHandlingMode() {
+ return this.mode;
+ }
+
+ @Override
+ public void setDriftHandlingMode(DriftHandlingMode mode) {
+ this.mode = mode;
+ }
}
static class FakeDrift implements Drift {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
index 31c7084..61558ae 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
@@ -67,6 +67,7 @@ import org.rhq.core.domain.drift.DriftFile;
import org.rhq.core.domain.drift.DriftSnapshot;
import org.rhq.core.domain.drift.FileDiffReport;
import org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.RHQConstants;
@@ -364,7 +365,9 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
public DriftChangeSetSummary saveChangeSet(Subject subject, int resourceId, File changeSetZip) throws Exception {
DriftServerPluginFacet driftServerPlugin = getServerPlugin();
DriftChangeSetSummary summary = driftServerPlugin.saveChangeSet(subject, resourceId, changeSetZip);
- notifyAlertConditionCacheManager("saveChangeSet", summary);
+ if (DriftHandlingMode.plannedChanges != summary.getDriftHandlingMode()) {
+ notifyAlertConditionCacheManager("saveChangeSet", summary);
+ }
return summary;
}
@@ -407,7 +410,7 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
}
@Override
- public FileDiffReport generateUnifiedDiff(Drift drift) {
+ public FileDiffReport generateUnifiedDiff(Drift<?, ?> drift) {
log.debug("Generating diff for " + drift);
String oldContent = getDriftFileBits(drift.getOldDriftFile().getHashId());
List<String> oldList = asList(oldContent.split("\\n"));
@@ -421,7 +424,7 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
}
@Override
- public FileDiffReport generateUnifiedDiff(Drift drift1, Drift drift2) {
+ public FileDiffReport generateUnifiedDiff(Drift<?, ?> drift1, Drift<?, ?> drift2) {
String content1 = getDriftFileBits(drift1.getNewDriftFile().getHashId());
List<String> content1List = asList(content1.split("\\n"));
@@ -498,7 +501,7 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
}
@Override
- public boolean isBinaryFile(Drift drift) {
+ public boolean isBinaryFile(Drift<?, ?> drift) {
String path = drift.getPath();
int index = path.lastIndexOf('.');
@@ -531,7 +534,7 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
return null;
}
- Drift drift = results.get(0);
+ Drift<?, ?> drift = results.get(0);
driftDetails.setDrift(drift);
try {
switch (drift.getCategory()) {
@@ -569,7 +572,7 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
}
}
- private DriftChangeSet loadPreviousChangeSet(Subject subject, Drift drift) {
+ private DriftChangeSet<?> loadPreviousChangeSet(Subject subject, Drift<?, ?> drift) {
GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria();
criteria.addFilterResourceId(drift.getChangeSet().getResourceId());
criteria.addFilterDriftConfigurationId(drift.getChangeSet().getDriftConfigurationId());
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerLocal.java
index 5d9838f..9d8a883 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerLocal.java
@@ -129,7 +129,7 @@ public interface DriftManagerLocal extends DriftServerPluginFacet, DriftManagerR
* @return A report containing a unified diff of the two versions of the file
* referenced by drift
*/
- FileDiffReport generateUnifiedDiff(Drift drift);
+ FileDiffReport generateUnifiedDiff(Drift<?, ?> drift);
/**
* Returns an object that encapsulates the information needed for viewing drift details
@@ -140,5 +140,5 @@ public interface DriftManagerLocal extends DriftServerPluginFacet, DriftManagerR
*/
DriftDetails getDriftDetails(Subject subject, String driftId);
- boolean isBinaryFile(Drift drift);
+ boolean isBinaryFile(Drift<?, ?> drift);
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerRemote.java
index c181e51..8bb4590 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerRemote.java
@@ -40,8 +40,8 @@ public interface DriftManagerRemote {
* @param criteria
* @return The DriftChangeSets matching the criteria
*/
- PageList<? extends DriftChangeSet<?>> findDriftChangeSetsByCriteria(Subject subject,
- DriftChangeSetCriteria criteria) throws Exception;
+ PageList<? extends DriftChangeSet<?>> findDriftChangeSetsByCriteria(Subject subject, DriftChangeSetCriteria criteria)
+ throws Exception;
/**
* Standard criteria based fetch method
@@ -68,7 +68,7 @@ public interface DriftManagerRemote {
* @return A report containing a unified diff of the two versions of the file
* referenced by drift
*/
- FileDiffReport generateUnifiedDiff(Drift drift);
+ FileDiffReport generateUnifiedDiff(Drift<?, ?> drift);
/**
* Generates a unified diff of the two files referenced by drift1 and drift2. More
@@ -79,6 +79,6 @@ public interface DriftManagerRemote {
* @param drift2 References the second file to be compared
* @return A report containing a unified diff of the two files compared
*/
- FileDiffReport generateUnifiedDiff(Drift drift1, Drift drift2);
+ FileDiffReport generateUnifiedDiff(Drift<?, ?> drift1, Drift<?, ?> drift2);
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
index 2cf2232..f44000f 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
@@ -19,6 +19,9 @@
*/
package org.rhq.enterprise.server.drift;
+import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
+import static org.rhq.core.domain.drift.DriftFileStatus.LOADED;
+
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
@@ -77,9 +80,6 @@ import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
-import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
-import static org.rhq.core.domain.drift.DriftFileStatus.LOADED;
-
/**
* The SLSB method implementation needed to support the JPA (RHQ Default) Drift Server Plugin.
*
@@ -248,13 +248,12 @@ public class JPADriftServerBean implements JPADriftServerLocal {
// store the new change set info (not the actual blob)
DriftConfiguration config = findDriftConfiguration(resource, reader.getHeaders());
- int version = getChangeSetVersion(resource, config);
-
if (config == null) {
log.error("Unable to locate DriftConfiguration for Resource [" + resource
+ "]. Change set cannot be saved.");
return false;
}
+ int version = getChangeSetVersion(resource, config);
DriftChangeSetCategory category = reader.getHeaders().getType();
driftChangeSet = new JPADriftChangeSet(resource, version, category, config);
@@ -263,6 +262,7 @@ public class JPADriftServerBean implements JPADriftServerLocal {
summary.setCategory(category);
summary.setResourceId(resourceId);
summary.setDriftConfigurationName(reader.getHeaders().getDriftConfigurationName());
+ summary.setDriftHandlingMode(config.getDriftHandlingMode());
summary.setCreatedTime(driftChangeSet.getCtime());
for (FileEntry entry : reader) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftChangeSetSummary.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftChangeSetSummary.java
index 535faf9..045a3dc 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftChangeSetSummary.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftChangeSetSummary.java
@@ -24,6 +24,7 @@ import java.util.Date;
import java.util.List;
import org.rhq.core.domain.drift.DriftChangeSetCategory;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
/**
* Provides a summary of a change set.
@@ -39,6 +40,7 @@ public class DriftChangeSetSummary {
private DriftChangeSetCategory category;
private int resourceId;
private String driftConfigurationName;
+ private DriftHandlingMode driftHandlingMode;
private List<String> driftPathnames;
/**
@@ -107,4 +109,13 @@ public class DriftChangeSetSummary {
}
return driftPathnames;
}
+
+ public DriftHandlingMode getDriftHandlingMode() {
+ return driftHandlingMode;
+ }
+
+ public void setDriftHandlingMode(DriftHandlingMode driftHandlingMode) {
+ this.driftHandlingMode = driftHandlingMode;
+ }
+
}
commit eb8d96f6b388f80c3294cada24745a272a89b549
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Aug 31 15:44:11 2011 -0400
Some initial domain/entity for drift configuration mode (planned changes support)
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
index a31d6fa..e1875fe 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
@@ -671,6 +671,7 @@
<column name="NAME" type="VARCHAR2" size="512" required="true"/>
<column name="INTERVAL" type="LONG" required="true"/>
<column name="IS_ENABLED" type="BOOLEAN" required="true"/>
+ <column name="MODE" type="VARCHAR2" size="20" required="true"/>
<column name="CONFIG_ID" type="INTEGER" required="true" references="RHQ_CONFIG"/>
<column name="RESOURCE_ID" type="INTEGER" required="false" references="RHQ_RESOURCE"/>
</table>
@@ -684,6 +685,7 @@
<column name="CATEGORY" type="VARCHAR2" size="20" required="true"/>
<column name="RESOURCE_ID" type="INTEGER" required="true" references="RHQ_RESOURCE"/>
<column name="DRIFT_CONFIG_ID" type="INTEGER" required="true" references="RHQ_DRIFT_CONFIG"/>
+ <column name="DRIFT_CONFIG_MODE" type="VARCHAR2" size="20" required="true"/>
</table>
<!-- A single occurence of drift for a resource -->
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftChangeSet.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftChangeSet.java
index c6db79a..33a78ec 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftChangeSet.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftChangeSet.java
@@ -20,6 +20,8 @@ package org.rhq.core.domain.drift;
import java.util.Set;
+import org.rhq.core.domain.drift.DriftConfiguration.Mode;
+
/**
* A DriftChangeSet is somewhat similar to a commit in version control systems. It contains
* information about files being monitored or tracked for drift detection. A change set
@@ -97,6 +99,26 @@ public interface DriftChangeSet<D extends Drift<?, ?>> {
void setCategory(DriftChangeSetCategory category);
/**
+ * Returns the mode of the owning drift configuration at the time of change set creation.
+ * Because the value set on the owning drift configuration can change, the value must be
+ * stored with the change set such that it can be applied consistently when handling the
+ * associated drift.
+ *
+ * @return The {@link DriftConfiguration.Mode} mode
+ */
+ DriftConfiguration.Mode getDriftConfigurationMode();
+
+ /**
+ * Sets the drift configuration mode for the change set. It should be set to the owning drift
+ * configuration mode at the time of change set creation. Because the value set on the owning
+ * drift configuration can change, the value must be stored with the change set such that it
+ * can be applied consistently when handling the associated drift.
+ *
+ * @param mode The {@link DriftConfiguration.Mode} mode
+ */
+ void setDriftConfigurationMode(Mode mode);
+
+ /**
* Returns the id of the owning drift configuration. Note that while server plugins are
* responsible for managing the persistence of change sets, the RHQ server manages the
* persistence of the owning drift configuration.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java
index d928c6c..40e0403 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftConfiguration.java
@@ -18,6 +18,8 @@
*/
package org.rhq.core.domain.drift;
+import static java.util.Collections.emptyList;
+
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@@ -25,6 +27,8 @@ import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@@ -43,8 +47,6 @@ import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext;
import org.rhq.core.domain.resource.Resource;
-import static java.util.Collections.emptyList;
-
/**
* This is a convienence wrapper around a Configuration object whose schema is that
* of {@link DriftConfigurationDefinition}.
@@ -78,6 +80,10 @@ public class DriftConfiguration implements Serializable {
@Column(name = "IS_ENABLED", nullable = false)
private boolean isEnabled;
+ @Column(name = "MODE", nullable = false)
+ @Enumerated(EnumType.STRING)
+ private Mode mode;
+
// unit = millis
@Column(name = "INTERVAL", nullable = false)
private long interval;
@@ -145,6 +151,14 @@ public class DriftConfiguration implements Serializable {
this.setEnabledProperty(isEnabled);
}
+ public Mode getMode() {
+ return mode;
+ }
+
+ public void setMode(Mode mode) {
+ this.mode = mode;
+ }
+
public long getInterval() {
return interval;
}
@@ -387,4 +401,12 @@ public class DriftConfiguration implements Serializable {
return filters;
}
+
+ // Drift Handling Mode
+ public enum Mode {
+ // alerting, included in recent drift reporting
+ NORMAL,
+ // no alerting, not included in recent drift reporting, flagged in UI as planned
+ PLANNED_CHANGES
+ }
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/JPADriftChangeSet.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/JPADriftChangeSet.java
index f9509bb..a2421a0 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/JPADriftChangeSet.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/JPADriftChangeSet.java
@@ -94,6 +94,12 @@ public class JPADriftChangeSet implements Serializable, DriftChangeSet<JPADrift>
@ManyToOne(fetch = FetchType.EAGER, optional = false)
private DriftConfiguration driftConfiguration;
+ // Note, this is mode at the time of the changeset processing. We cant use driftConfiguration.mode because
+ // that is the "live" setting.
+ @Column(name = "DRIFT_CONFIG_MODE", nullable = false)
+ @Enumerated(EnumType.STRING)
+ private DriftConfiguration.Mode driftConfigurationMode;
+
@JoinColumn(name = "RESOURCE_ID", referencedColumnName = "ID", nullable = false)
@ManyToOne(optional = false)
private Resource resource;
@@ -173,6 +179,14 @@ public class JPADriftChangeSet implements Serializable, DriftChangeSet<JPADrift>
this.driftConfiguration = driftConfiguration;
}
+ public DriftConfiguration.Mode getDriftConfigurationMode() {
+ return driftConfigurationMode;
+ }
+
+ public void setDriftConfigurationMode(DriftConfiguration.Mode driftConfigurationMode) {
+ this.driftConfigurationMode = driftConfigurationMode;
+ }
+
@Override
public int getDriftConfigurationId() {
return this.driftConfiguration.getId();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeDatasource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeDatasource.java
index 4691f8d..6a07ee4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeDatasource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeDatasource.java
@@ -50,6 +50,8 @@ import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
import org.rhq.enterprise.gui.coregui.client.util.StringUtility;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
/**
* This doesn't extend RPCDataSource because it is tree-oriented and behaves differently than normal list data sources
@@ -184,13 +186,48 @@ public class ResourceTreeDatasource extends DataSource {
*/
public static TreeNode[] buildNodes(List<Resource> resources, List<Resource> lockedData) {
List<ResourceTreeNode> resourceNodes = new ArrayList<ResourceTreeNode>(resources.size());
+ boolean nullFound = false;
for (Resource resource : resources) {
+ if (null != resource.getParentResource() && null == resource.getParentResource().getName()) {
+ CoreGUI.getMessageCenter().notify(
+ new Message(" *** Null parent name for " + resource + " parent " + resource.getParentResource(),
+ Severity.Info));
+ nullFound = true;
+ }
ResourceTreeNode node = new ResourceTreeNode(resource, lockedData.contains(resource));
resourceNodes.add(node);
}
+ if (!nullFound) {
+ CoreGUI.getMessageCenter().notify(new Message(" *** No Null parent names found", Severity.Info));
+ }
List<TreeNode> result = introduceTypeAndCategoryNodes(resourceNodes);
+ nullFound = false;
+ for (TreeNode node : result) {
+ if (node instanceof ResourceTreeNode) {
+ ResourceTreeNode rtNode = (ResourceTreeNode) node;
+ if (null != rtNode.getResource().getParentResource()
+ && null == rtNode.getResource().getParentResource().getName()) {
+ CoreGUI.getMessageCenter().notify(
+ new Message(" *** Null parent name for resource tree node " + rtNode.getResource() + " parent "
+ + rtNode.getResource(), Severity.Info));
+ nullFound = true;
+ }
+ } else if (node instanceof AutoGroupTreeNode) {
+ AutoGroupTreeNode rtNode = (AutoGroupTreeNode) node;
+ if (null == rtNode.getParentResource().getName()) {
+ CoreGUI.getMessageCenter().notify(
+ new Message(" *** Null parent name for autogroup tree node " + rtNode.getParentResource(),
+ Severity.Info));
+ nullFound = true;
+ }
+ }
+ }
+ if (!nullFound) {
+ CoreGUI.getMessageCenter().notify(new Message(" *** No Null tree node parent names found", Severity.Info));
+ }
+
return result.toArray(new TreeNode[result.size()]);
}
commit aa4f67538e5828f4d4117e39884dad27eebc185d
Merge: fbc77d4 f2bb553
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Sep 2 10:15:04 2011 -0400
Merge commit 'origin/master' into drift
commit fbc77d447c2e27923a8eac3c275121cb3ecd0598
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 1 18:00:30 2011 -0400
[BZ 735230] provide better messages in ui
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
index c25855c..72a6966 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
@@ -188,7 +188,26 @@ public class AlertFormatUtility {
break;
}
case DRIFT: {
- str.append(MSG.view_alert_common_tab_conditions_type_drift());
+ String configNameRegex = condition.getName();
+ String pathNameRegex = condition.getOption();
+ if (configNameRegex == null || configNameRegex.length() == 0) {
+ if (pathNameRegex == null || pathNameRegex.length() == 0) {
+ // neither a config name regex nor path regex was specified
+ str.append(MSG.view_alert_common_tab_conditions_type_drift());
+ } else {
+ // a path name regex was specified, but not a config name regex
+ str.append(MSG.view_alert_common_tab_conditions_type_drift_onlypaths(pathNameRegex));
+ }
+ } else {
+ if (pathNameRegex == null || pathNameRegex.length() == 0) {
+ // a config name regex was specified, but not a path name regex
+ str.append(MSG.view_alert_common_tab_conditions_type_drift_onlyconfig(configNameRegex));
+ } else {
+ // both a config name regex and a path regex was specified
+ str.append(MSG.view_alert_common_tab_conditions_type_drift_configpaths(pathNameRegex,
+ configNameRegex));
+ }
+ }
break;
}
default: {
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index 8b978c8..494d691 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -613,6 +613,9 @@ view_alert_common_tab_conditions_type_availability = Availability Change
view_alert_common_tab_conditions_type_availability_down = Went down
view_alert_common_tab_conditions_type_availability_up = Came up
view_alert_common_tab_conditions_type_drift = Drift Detection
+view_alert_common_tab_conditions_type_drift_configpaths = Drift Detection for files that match "{0}" and for drift configuration [{1}]
+view_alert_common_tab_conditions_type_drift_onlyconfig = Drift Detection for drift configuration [{0}]
+view_alert_common_tab_conditions_type_drift_onlypaths = Drift Detection for files that match "{0}"
view_alert_common_tab_conditions_type_event = Event Detection
view_alert_common_tab_conditions_type_event_matching = with event source matching
view_alert_common_tab_conditions_type_metric_baseline = Metric Value Baseline
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
index 1e1b853..2e546b6 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
@@ -490,6 +490,9 @@ view_alert_common_tab_conditions_type_availability = Ãnderung der VerfÃŒgbarkei
view_alert_common_tab_conditions_type_availability_down = Wurde unverfÃŒgbar
view_alert_common_tab_conditions_type_availability_up = Wurde wieder verfÃŒgbar
##view_alert_common_tab_conditions_type_drift = Drift Detection
+##view_alert_common_tab_conditions_type_drift_configpaths = Drift Detection for files that match "{0}" and for drift configuration [{1}]
+##view_alert_common_tab_conditions_type_drift_onlyconfig = Drift Detection for drift configuration [{0}]
+##view_alert_common_tab_conditions_type_drift_onlypaths = Drift Detection for files that match "{0}"
##view_alert_common_tab_conditions_type_event = Event Detection
view_alert_common_tab_conditions_type_event_matching = with event source matching~
view_alert_common_tab_conditions_type_metric_baseline = Metrik ÃŒberschreitet Referenzband
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
index 150c06a..74f8fbd 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
@@ -608,6 +608,9 @@ view_alert_common_tab_conditions_type_availability = ã¢ãã€ã©ããªãã£ã®
view_alert_common_tab_conditions_type_availability_down = äžé
view_alert_common_tab_conditions_type_availability_up = äžæ
##view_alert_common_tab_conditions_type_drift = Drift Detection
+##view_alert_common_tab_conditions_type_drift_configpaths = Drift Detection for files that match "{0}" and for drift configuration [{1}]
+##view_alert_common_tab_conditions_type_drift_onlyconfig = Drift Detection for drift configuration [{0}]
+##view_alert_common_tab_conditions_type_drift_onlypaths = Drift Detection for files that match "{0}"
view_alert_common_tab_conditions_type_event = ã€ãã³ãã®æ€åº
view_alert_common_tab_conditions_type_event_matching = ã€ãã³ããœãŒã¹ãäžèŽ
view_alert_common_tab_conditions_type_metric_baseline = ã¡ããªãã¯å€ã®ããŒã¹ã©ã€ã³
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
index 53c9dfd..3dc1b04 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
@@ -624,6 +624,9 @@ view_alert_common_tab_conditions_type_availability = Mudan\u00E7a na Disponibili
view_alert_common_tab_conditions_type_availability_down = Indispon\u00EDvel
view_alert_common_tab_conditions_type_availability_up = Dispon\u00EDvel
##view_alert_common_tab_conditions_type_drift = Drift Detection
+##view_alert_common_tab_conditions_type_drift_configpaths = Drift Detection for files that match "{0}" and for drift configuration [{1}]
+##view_alert_common_tab_conditions_type_drift_onlyconfig = Drift Detection for drift configuration [{0}]
+##view_alert_common_tab_conditions_type_drift_onlypaths = Drift Detection for files that match "{0}"
view_alert_common_tab_conditions_type_event = Detec\u00E7\u00E3o de Envento
view_alert_common_tab_conditions_type_event_matching = combinando com o evento de origem
view_alert_common_tab_conditions_type_metric_baseline = Valor da m\u00E9trica excede a linha de base (baseline)
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
index 428b402..086bb1b 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
@@ -607,6 +607,9 @@ view_alert_common_tab_conditions_type_availability = \u53ef\u7528\u6027\u6539\u5
view_alert_common_tab_conditions_type_availability_down = Went down
view_alert_common_tab_conditions_type_availability_up = Came up
##view_alert_common_tab_conditions_type_drift = Drift Detection
+##view_alert_common_tab_conditions_type_drift_configpaths = Drift Detection for files that match "{0}" and for drift configuration [{1}]
+##view_alert_common_tab_conditions_type_drift_onlyconfig = Drift Detection for drift configuration [{0}]
+##view_alert_common_tab_conditions_type_drift_onlypaths = Drift Detection for files that match "{0}"
view_alert_common_tab_conditions_type_event = \u4e8b\u4ef6\u68c0\u6d4b
view_alert_common_tab_conditions_type_event_matching = with event source matching
view_alert_common_tab_conditions_type_metric_baseline = \u6307\u6807\u57fa\u51c6
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/DriftCacheElement.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/DriftCacheElement.java
index d7c68cf..7527fdc 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/DriftCacheElement.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/DriftCacheElement.java
@@ -25,7 +25,7 @@ import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
public class DriftCacheElement extends AbstractCacheElement<Object> {
- public static final Object UNUSED_CONDITION_VALUE = "unused";
+ public static final Object UNUSED_CONDITION_VALUE = "Drift Detected";
private final Pattern driftConfigNameRegex;
private final Pattern driftPathNameRegex;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftChangeSetSummary.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftChangeSetSummary.java
index 8148690..535faf9 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftChangeSetSummary.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftChangeSetSummary.java
@@ -20,6 +20,7 @@
package org.rhq.enterprise.server.plugin.pc.drift;
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
import org.rhq.core.domain.drift.DriftChangeSetCategory;
@@ -40,6 +41,22 @@ public class DriftChangeSetSummary {
private String driftConfigurationName;
private List<String> driftPathnames;
+ /**
+ * Because this summary object is used within the alert subsystem, this toString is used to display
+ * a message in the alert description if/when alerts are fired.
+ */
+ @Override
+ public String toString() {
+ if (category == DriftChangeSetCategory.COVERAGE) {
+ return "[" + new Date(createdTime) + "] Initial drift coverage includes ["
+ + obtainDriftPathnamesList().size() + "] files using drift configuration [" + driftConfigurationName
+ + "]";
+ } else {
+ return "[" + new Date(createdTime) + "] Drift detected in [" + obtainDriftPathnamesList().size()
+ + "] files using drift configuration [" + driftConfigurationName + "]";
+ }
+ }
+
public long getCreatedTime() {
return createdTime;
}
commit 62d5a9dcdd60d217b25e491c30501e6345d91e52
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 1 16:46:50 2011 -0400
[BZ 735230] initial attempt at alerting on drift for certain drift configs and certain pathnames of files
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java
index 00a409b..bebcbe0 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java
@@ -412,7 +412,10 @@ public class AlertCondition implements Serializable {
* CONTROL: the name of the operation (not its display name)
* EVENT: the level of event to compare with (DEBUG, INFO, WARN, ERROR, FATAL)
* RESOURCE_CONFIG: n/a (null)
- * DRIFT: n/a (null)
+ * DRIFT: the name of the drift config that triggered the drift detection. This is actually a
+ * regex that allows the user to match more than one drift config if they so choose.
+ * (this value may be null, in which case it doesn't matter which drift configs were the ones
+ * in which the drift was detected)
*
* @return additional information about the condition
*/
@@ -469,7 +472,7 @@ public class AlertCondition implements Serializable {
* CONTROL: the {@link OperationRequestStatus} name (SUCCESS, FAILURE, etc).
* EVENT: the regular expression of the message to match (which may be empty string if not specified)
* RESOURCE_CONFIG: n/a
- * DRIFT: n/a (TODO driftalert - regular expression to match files whose content drifted (may be empty string if not specified)
+ * DRIFT: a regular expression to match files whose content drifted (may be empty string or null if not specified)
*
* @return additional information about the condition
*/
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
index 8b9986f..f3e872d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
@@ -90,6 +90,8 @@ public class NewConditionEditor extends LocatableDynamicForm {
private static final String OPERATION_RESULTS_ITEMNAME = "operationResults";
private static final String EVENT_SEVERITY_ITEMNAME = "eventSeverity";
private static final String EVENT_REGEX_ITEMNAME = "eventRegex";
+ private static final String DRIFT_CONFIGNAME_REGEX_ITEMNAME = "driftConfigNameRegex";
+ private static final String DRIFT_PATHNAME_REGEX_ITEMNAME = "driftPathNameRegex";
private SelectItem conditionTypeSelectItem;
private HashSet<AlertCondition> conditions; // the new condition we create goes into this set
@@ -294,7 +296,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
case THRESHOLD: {
if (!calltimeCategory) {
MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(THRESHOLD_METRIC_ITEMNAME));
- newCondition.setName(measDef.getDisplayName()); // TODO should not use display name
+ newCondition.setName(measDef.getDisplayName());
newCondition.setThreshold(Double.valueOf(getValueAsString(THRESHOLD_ABSVALUE_ITEMNAME)));
newCondition.setComparator(getValueAsString(THRESHOLD_COMPARATOR_ITEMNAME));
newCondition.setOption(null);
@@ -312,7 +314,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
case BASELINE: {
MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(BASELINE_METRIC_ITEMNAME));
- newCondition.setName(measDef.getDisplayName()); // TODO should not use display name
+ newCondition.setName(measDef.getDisplayName());
newCondition.setThreshold(Double.valueOf(getValueAsString(BASELINE_PERCENTAGE_ITEMNAME)) / 100.0);
newCondition.setComparator(getValueAsString(BASELINE_COMPARATOR_ITEMNAME));
newCondition.setOption(getValueAsString(BASELINE_SELECTION_ITEMNAME));
@@ -323,7 +325,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
case CHANGE: {
if (!calltimeCategory) {
MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(CHANGE_METRIC_ITEMNAME));
- newCondition.setName(measDef.getDisplayName()); // TODO should not use display name
+ newCondition.setName(measDef.getDisplayName());
newCondition.setComparator(null);
newCondition.setThreshold(null);
newCondition.setOption(null);
@@ -342,7 +344,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
case TRAIT: {
MeasurementDefinition measDef = getMeasurementDefinition(getValueAsString(TRAIT_METRIC_ITEMNAME));
- newCondition.setName(measDef.getDisplayName()); // TODO should not use display name
+ newCondition.setName(measDef.getDisplayName());
newCondition.setComparator(null);
newCondition.setThreshold(null);
newCondition.setOption(null);
@@ -378,10 +380,10 @@ public class NewConditionEditor extends LocatableDynamicForm {
}
case DRIFT: {
- newCondition.setName(null);
+ newCondition.setName(getValueAsString(DRIFT_CONFIGNAME_REGEX_ITEMNAME));
newCondition.setComparator(null);
newCondition.setThreshold(null);
- newCondition.setOption(null); // TODO driftalert - be able to regex for only certain files that drifted
+ newCondition.setOption(getValueAsString(DRIFT_PATHNAME_REGEX_ITEMNAME));
newCondition.setMeasurementDefinition(null);
break;
}
@@ -730,6 +732,24 @@ public class NewConditionEditor extends LocatableDynamicForm {
StaticTextItem helpItem = buildHelpTextItem("driftHelp", helpStr, ifFunc);
formItems.add(helpItem);
+ TextItem driftConfigNameRegex = new TextItem(DRIFT_CONFIGNAME_REGEX_ITEMNAME, MSG
+ .view_alert_definition_condition_editor_drift_configname_regex());
+ driftConfigNameRegex.setRequired(false);
+ driftConfigNameRegex.setTooltip(MSG.view_alert_definition_condition_editor_drift_configname_regex_tooltip());
+ driftConfigNameRegex.setHoverWidth(200);
+ driftConfigNameRegex.setWrapTitle(false);
+ driftConfigNameRegex.setShowIfCondition(ifFunc);
+ formItems.add(driftConfigNameRegex);
+
+ TextItem driftPathNameRegex = new TextItem(DRIFT_PATHNAME_REGEX_ITEMNAME, MSG
+ .view_alert_definition_condition_editor_drift_pathname_regex());
+ driftPathNameRegex.setRequired(false);
+ driftPathNameRegex.setTooltip(MSG.view_alert_definition_condition_editor_drift_pathname_regex_tooltip());
+ driftPathNameRegex.setHoverWidth(200);
+ driftPathNameRegex.setWrapTitle(false);
+ driftPathNameRegex.setShowIfCondition(ifFunc);
+ formItems.add(driftPathNameRegex);
+
return formItems;
}
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index 2c62f90..8b978c8 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -667,6 +667,10 @@ view_alert_definition_condition_editor_common_avg = Average
view_alert_definition_condition_editor_common_max = Maximum
view_alert_definition_condition_editor_common_min = Minimum
view_alert_definition_condition_editor_delete_confirm = Delete the selected alert condition(s)?
+view_alert_definition_condition_editor_drift_configname_regex = Drift Configuration Name
+view_alert_definition_condition_editor_drift_configname_regex_tooltip = If specified, this is the drift configuration name that was responsible for the drift that was detected. This can optionally be a regular expression if you wish to match multiple drift configuration names.
+view_alert_definition_condition_editor_drift_pathname_regex = Pathname Regular Expression
+view_alert_definition_condition_editor_drift_pathname_regex_tooltip = If specified, this is a regular expression that must match the pathnames of those files that drifted.
view_alert_definition_condition_editor_drift_tooltip = This condition is triggered when drift has been detected.
view_alert_definition_condition_editor_event_regex = Regular Expression
view_alert_definition_condition_editor_event_regex_tooltip = If specified, this is a regular expression that must match a collected event message in order to trigger the condition.
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
index 54c4599..1e1b853 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
@@ -544,6 +544,10 @@ view_alert_definition_condition_editor_common_avg = Durchschnitt
view_alert_definition_condition_editor_common_max = Maximum
view_alert_definition_condition_editor_common_min = Minimum
view_alert_definition_condition_editor_delete_confirm = Die ausgewÀhlte(n) Alarm-Bedingung(en) löschen?
+##view_alert_definition_condition_editor_drift_configname_regex = Drift Configuration Name
+##view_alert_definition_condition_editor_drift_configname_regex_tooltip = If specified, this is the drift configuration name that was responsible for the drift that was detected. This can optionally be a regular expression if you wish to match multiple drift configuration names.
+##view_alert_definition_condition_editor_drift_pathname_regex = Pathname Regular Expression
+##view_alert_definition_condition_editor_drift_pathname_regex_tooltip = If specified, this is a regular expression that must match the pathnames of those files that drifted.
##view_alert_definition_condition_editor_drift_tooltip = This condition is triggered when drift has been detected.
view_alert_definition_condition_editor_event_regex = RegulÀrer Ausdruck
view_alert_definition_condition_editor_event_regex_tooltip = If specified, this is a regular expression that must match a collected event message in order to trigger the condition.~
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
index bafd11f..150c06a 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
@@ -662,6 +662,10 @@ view_alert_definition_condition_editor_common_avg = å¹³å
view_alert_definition_condition_editor_common_max = æ倧
view_alert_definition_condition_editor_common_min = æå°
view_alert_definition_condition_editor_delete_confirm = éžæãããã¢ã©ãŒãå®çŸ©ãåé€ããŸãã?
+##view_alert_definition_condition_editor_drift_configname_regex = Drift Configuration Name
+##view_alert_definition_condition_editor_drift_configname_regex_tooltip = If specified, this is the drift configuration name that was responsible for the drift that was detected. This can optionally be a regular expression if you wish to match multiple drift configuration names.
+##view_alert_definition_condition_editor_drift_pathname_regex = Pathname Regular Expression
+##view_alert_definition_condition_editor_drift_pathname_regex_tooltip = If specified, this is a regular expression that must match the pathnames of those files that drifted.
##view_alert_definition_condition_editor_drift_tooltip = This condition is triggered when drift has been detected.
view_alert_definition_condition_editor_event_regex = æ£èŠè¡šçŸ
view_alert_definition_condition_editor_event_regex_tooltip = ããæå®ããããªããããã¯æ£èŠè¡šçŸã§ããããã®æ¡ä»¶ãåŒãèµ·ããããã«åéãããã€ãã³ãã¡ãã»ãŒãžã«äžèŽããªããã°ãªããŸããã
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
index 2722b0d..53c9dfd 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
@@ -680,6 +680,10 @@ view_alert_definition_condition_editor_common_avg = M\u00E9dio
view_alert_definition_condition_editor_common_max = M\u00E1ximo
view_alert_definition_condition_editor_common_min = M\u00EDnimo
view_alert_definition_condition_editor_delete_confirm = Delete the selected alert condition(s)?
+##view_alert_definition_condition_editor_drift_configname_regex = Drift Configuration Name
+##view_alert_definition_condition_editor_drift_configname_regex_tooltip = If specified, this is the drift configuration name that was responsible for the drift that was detected. This can optionally be a regular expression if you wish to match multiple drift configuration names.
+##view_alert_definition_condition_editor_drift_pathname_regex = Pathname Regular Expression
+##view_alert_definition_condition_editor_drift_pathname_regex_tooltip = If specified, this is a regular expression that must match the pathnames of those files that drifted.
##view_alert_definition_condition_editor_drift_tooltip = This condition is triggered when drift has been detected.
view_alert_definition_condition_editor_event_regex = Express\u00E3o Regular
view_alert_definition_condition_editor_event_regex_tooltip = Se definida, a condi\u00E7\u00E3o somente ser\u00E1 disparada caso o evento satisfa\u00E7a a express\u00E3o.
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
index f73be85..428b402 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
@@ -661,6 +661,10 @@ view_alert_definition_condition_editor_common_avg = \u5e73\u5747
view_alert_definition_condition_editor_common_max = \u6700\u5927
view_alert_definition_condition_editor_common_min = \u6700\u5c0f
view_alert_definition_condition_editor_delete_confirm = \u5220\u9664\u9009\u5b9a\u7684\u8b66\u62a5\u6761\u4ef6?
+##view_alert_definition_condition_editor_drift_configname_regex = Drift Configuration Name
+##view_alert_definition_condition_editor_drift_configname_regex_tooltip = If specified, this is the drift configuration name that was responsible for the drift that was detected. This can optionally be a regular expression if you wish to match multiple drift configuration names.
+##view_alert_definition_condition_editor_drift_pathname_regex = Pathname Regular Expression
+##view_alert_definition_condition_editor_drift_pathname_regex_tooltip = If specified, this is a regular expression that must match the pathnames of those files that drifted.
##view_alert_definition_condition_editor_drift_tooltip = This condition is triggered when drift has been detected.
view_alert_definition_condition_editor_event_regex = \u6b63\u5219\u8868\u8fbe\u5f0f
view_alert_definition_condition_editor_event_regex_tooltip = If specified, this is a regular expression that must match a collected event message in order to trigger the condition.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AbstractConditionCache.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AbstractConditionCache.java
index 9f8726a..9199701 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AbstractConditionCache.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AbstractConditionCache.java
@@ -66,8 +66,8 @@ abstract class AbstractConditionCache {
*/
cacheElement.setActive(true); // no harm to always set active (though, technically, STATELESS operators don't need it)
cachedConditionProducer.sendActivateAlertConditionMessage(
- cacheElement.getAlertConditionTriggerId(), timestamp,
- cacheElement.convertValueToString(providedValue), extraParams);
+ cacheElement.getAlertConditionTriggerId(), timestamp, cacheElement
+ .convertValueToString(providedValue), extraParams);
stats.matched++;
} catch (Exception e) {
@@ -120,14 +120,21 @@ abstract class AbstractConditionCache {
cache.put(key, cacheElements);
}
- if (log.isTraceEnabled()) {
- log.trace("Inserted '" + mapName + "' element: " + "key=" + key + ", " + "value=" + cacheElement);
- }
+ boolean success;
+
+ if (cacheElement != null) {
+ if (log.isTraceEnabled()) {
+ log.trace("Inserting '" + mapName + "' element: " + "key=" + key + ", " + "value=" + cacheElement);
+ }
- // and finally update stats and return whether it was success
- boolean success = cacheElements.add(cacheElement);
- if (success) {
- stats.created++;
+ // and finally update stats and return whether it was success
+ success = (cacheElement != null) ? cacheElements.add(cacheElement) : false;
+ if (success) {
+ stats.created++;
+ }
+ } else {
+ success = false;
+ log.warn("Cannot insert null cache element in '" + mapName + "' element: " + "key=" + key);
}
return success;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java
index ac19d37..21409e5 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java
@@ -73,11 +73,11 @@ import org.rhq.enterprise.server.util.LookupUtil;
*/
class AgentConditionCache extends AbstractConditionCache {
- private Map<Integer, List<NumericDoubleCacheElement>> measurementDataCache;
- private Map<Integer, List<MeasurementTraitCacheElement>> measurementTraitCache;
- private Map<Integer, List<CallTimeDataCacheElement>> callTimeCache;
- private Map<Integer, List<EventCacheElement>> eventsCache;
- private Map<Integer, List<DriftCacheElement>> driftCache;
+ private Map<Integer, List<NumericDoubleCacheElement>> measurementDataCache; // key: schedule ID
+ private Map<Integer, List<MeasurementTraitCacheElement>> measurementTraitCache; // key: schedule ID
+ private Map<Integer, List<CallTimeDataCacheElement>> callTimeCache; // key: schedule ID
+ private Map<Integer, List<EventCacheElement>> eventsCache; // key: resource ID
+ private Map<Integer, List<DriftCacheElement>> driftCache; // key: resource ID
private AlertConditionManagerLocal alertConditionManager;
private MeasurementDataManagerLocal measurementDataManager;
@@ -314,7 +314,19 @@ class AgentConditionCache extends AbstractConditionCache {
addTo("eventsCache", eventsCache, eventComposite.getResourceId(), cacheElement, alertConditionId, stats);
} else if (alertConditionCategory == AlertConditionCategory.DRIFT) {
AlertConditionDriftCategoryComposite driftComposite = (AlertConditionDriftCategoryComposite) composite;
- DriftCacheElement cacheElement = new DriftCacheElement(alertConditionOperator, alertConditionId);
+
+ String driftConfigNameRegexStr = driftComposite.getCondition().getName();
+ String driftPathNameRegexStr = driftComposite.getCondition().getOption();
+
+ DriftCacheElement cacheElement = null;
+ try {
+ cacheElement = new DriftCacheElement(alertConditionOperator, driftConfigNameRegexStr,
+ driftPathNameRegexStr, alertConditionId);
+ } catch (InvalidCacheElementException icee) {
+ log.info("Failed to create DriftCacheElement: id=" + alertConditionId + ", operator="
+ + alertConditionOperator + ", driftConfigNameRegex=" + driftConfigNameRegexStr
+ + ", driftPathNameRegex=" + driftPathNameRegexStr);
+ }
addTo("driftCache", driftCache, driftComposite.getResourceId(), cacheElement, alertConditionId, stats);
}
}
@@ -477,7 +489,8 @@ class AgentConditionCache extends AbstractConditionCache {
int resourceId = driftChangeSetSummary.getResourceId();
List<DriftCacheElement> cacheElements = lookupDriftCacheElements(resourceId);
- processCacheElements(cacheElements, (Object) "", driftChangeSetSummary.getCreatedTime(), stats);
+ processCacheElements(cacheElements, DriftCacheElement.UNUSED_CONDITION_VALUE, driftChangeSetSummary
+ .getCreatedTime(), stats, driftChangeSetSummary);
AlertConditionCacheMonitor.getMBean().incrementDriftCacheElementMatches(stats.matched);
AlertConditionCacheMonitor.getMBean().incrementDriftProcessingTime(stats.getAge());
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/GlobalConditionCache.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/GlobalConditionCache.java
index dc4166f..5f9ecdb 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/GlobalConditionCache.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/GlobalConditionCache.java
@@ -57,9 +57,9 @@ import org.rhq.enterprise.server.util.LookupUtil;
*/
class GlobalConditionCache extends AbstractConditionCache {
- private Map<Integer, Map<Integer, List<ResourceOperationCacheElement>>> resourceOperationCache;
- private Map<Integer, List<AvailabilityCacheElement>> availabilityCache;
- private Map<Integer, List<ResourceConfigurationCacheElement>> resourceConfigurationCache;
+ private Map<Integer, Map<Integer, List<ResourceOperationCacheElement>>> resourceOperationCache; // key: resource ID, inner key: operation def ID
+ private Map<Integer, List<AvailabilityCacheElement>> availabilityCache; // key: resource ID
+ private Map<Integer, List<ResourceConfigurationCacheElement>> resourceConfigurationCache; // key: resource ID
private AlertConditionManagerLocal alertConditionManager;
private SubjectManagerLocal subjectManager;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/DriftCacheElement.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/DriftCacheElement.java
index d11ab51..d7c68cf 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/DriftCacheElement.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/DriftCacheElement.java
@@ -18,16 +18,74 @@
*/
package org.rhq.enterprise.server.alert.engine.model;
+import java.util.regex.Pattern;
+
+import org.rhq.core.domain.drift.DriftChangeSetCategory;
+import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
+
public class DriftCacheElement extends AbstractCacheElement<Object> {
- public DriftCacheElement(AlertConditionOperator operator, int conditionTriggerId) {
- super(operator, "", conditionTriggerId);
+ public static final Object UNUSED_CONDITION_VALUE = "unused";
+ private final Pattern driftConfigNameRegex;
+ private final Pattern driftPathNameRegex;
+
+ public DriftCacheElement(AlertConditionOperator operator, String driftConfigNameRegexStr,
+ String driftPathNameRegexStr, int conditionTriggerId) {
+ // our drift processing is special in that we do not have an alert condition value that
+ // we need check to determine if our cache element matches a particular value. But we need
+ // to give something, so just give static string since its small and we don't create more
+ // objects than we need. This means super.alertConditionValue will not be used.
+ super(operator, UNUSED_CONDITION_VALUE, conditionTriggerId);
+
+ try {
+ if (driftConfigNameRegexStr != null && driftConfigNameRegexStr.length() > 0) {
+ this.driftConfigNameRegex = Pattern.compile(driftConfigNameRegexStr);
+ } else {
+ this.driftConfigNameRegex = null;
+ }
+
+ if (driftPathNameRegexStr != null && driftPathNameRegexStr.length() > 0) {
+ this.driftPathNameRegex = Pattern.compile(driftPathNameRegexStr);
+ } else {
+ this.driftPathNameRegex = null;
+ }
+ } catch (Exception e) {
+ throw new InvalidCacheElementException("Failed to compile regex for drift condition", e);
+ }
}
@Override
public boolean matches(Object providedValue, Object... extraParams) {
+
if (alertConditionOperator == AlertConditionOperator.CHANGES) {
- return true; // any drift report we get implies the content has changed
+ DriftChangeSetSummary summary = (DriftChangeSetSummary) extraParams[0];
+
+ if (summary.getCategory() == DriftChangeSetCategory.COVERAGE) {
+ return false; // we never alert on coverage reports, we only alert when files have drifted from previous known states
+ }
+
+ if (driftConfigNameRegex != null) {
+ if (!driftConfigNameRegex.matcher(summary.getDriftConfigurationName()).matches()) {
+ return false; // drift config name did not match, our condition is false so don't alert
+ }
+ }
+
+ boolean pathNameMatches;
+ if (driftPathNameRegex != null) {
+ pathNameMatches = false; // assume we don't match anything
+ for (String pathname : summary.getDriftPathnames()) {
+ if (driftPathNameRegex.matcher(pathname).matches()) {
+ // at least one file that drifted matches our regex
+ pathNameMatches = true;
+ break;
+ }
+ }
+ } else {
+ pathNameMatches = true; // no regex, so we always match no matter what files drifted
+ }
+
+ return pathNameMatches;
+
} else {
throw new UnsupportedAlertConditionOperatorException(getClass().getSimpleName() + " does not support "
+ alertConditionOperator);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/MeasurementNumericCacheElement.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/MeasurementNumericCacheElement.java
index 29c00cd..0b66ba8 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/MeasurementNumericCacheElement.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/MeasurementNumericCacheElement.java
@@ -30,7 +30,6 @@ public class MeasurementNumericCacheElement extends NumericDoubleCacheElement {
public MeasurementNumericCacheElement(AlertConditionOperator operator, Double value, int conditionTriggerId) {
super(operator, value, conditionTriggerId);
- // TODO Auto-generated constructor stub
}
}
commit 0461e43cbb07e0f466c4938620749f2b53082553
Merge: ca05f42 153c984
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 1 10:25:06 2011 -0400
Merge commit 'origin/master' into drift
commit ca05f4252c167e01f0cf4c4bf8ab3b044117a62d
Merge: 64e471e b612594
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Sep 1 09:52:06 2011 -0400
Merge commit 'origin/master' into drift
commit 64e471e7310e066177d00a15d67bc2fd72ed0f5b
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Aug 31 16:57:48 2011 -0400
after we persist a drift change set, hand off the summary data to the alert condition cache manager to check to see if drift alerts need to be fired
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
index 27ec698..31c7084 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
@@ -71,6 +71,8 @@ import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.agentclient.AgentClient;
+import org.rhq.enterprise.server.alert.engine.AlertConditionCacheManagerLocal;
+import org.rhq.enterprise.server.alert.engine.AlertConditionCacheStats;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.core.AgentManagerLocal;
import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer;
@@ -170,6 +172,9 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
@EJB
private SubjectManagerLocal subjectManager;
+ @EJB
+ private AlertConditionCacheManagerLocal alertConditionCacheManager;
+
// use a new transaction when putting things on the JMS queue. see
// http://management-platform.blogspot.com/2008/11/transaction-recovery-in-j...
@Override
@@ -359,6 +364,7 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
public DriftChangeSetSummary saveChangeSet(Subject subject, int resourceId, File changeSetZip) throws Exception {
DriftServerPluginFacet driftServerPlugin = getServerPlugin();
DriftChangeSetSummary summary = driftServerPlugin.saveChangeSet(subject, resourceId, changeSetZip);
+ notifyAlertConditionCacheManager("saveChangeSet", summary);
return summary;
}
@@ -520,7 +526,8 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
PageList<? extends Drift<?, ?>> results = driftServerPlugin.findDriftsByCriteria(subject, criteria);
if (results.size() == 0) {
- log.warn("Unable to get the drift details for drift id " + driftId + ". No drift object found with that id.");
+ log.warn("Unable to get the drift details for drift id " + driftId
+ + ". No drift object found with that id.");
return null;
}
@@ -528,33 +535,40 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
driftDetails.setDrift(drift);
try {
switch (drift.getCategory()) {
- case FILE_ADDED:
- newFile = driftServerPlugin.getDriftFile(subject, drift.getNewDriftFile().getHashId());
- driftDetails.setNewFileStatus(newFile.getStatus());
- break;
- case FILE_CHANGED:
- newFile = driftServerPlugin.getDriftFile(subject, drift.getNewDriftFile().getHashId());
- oldFile = driftServerPlugin.getDriftFile(subject, drift.getOldDriftFile().getHashId());
-
- driftDetails.setNewFileStatus(newFile.getStatus());
- driftDetails.setOldFileStatus(oldFile.getStatus());
-
- driftDetails.setPreviousChangeSet(loadPreviousChangeSet(subject, drift));
- break;
- case FILE_REMOVED:
- oldFile = driftServerPlugin.getDriftFile(subject, drift.getOldDriftFile().getHashId());
- driftDetails.setOldFileStatus(oldFile.getStatus());
- break;
+ case FILE_ADDED:
+ newFile = driftServerPlugin.getDriftFile(subject, drift.getNewDriftFile().getHashId());
+ driftDetails.setNewFileStatus(newFile.getStatus());
+ break;
+ case FILE_CHANGED:
+ newFile = driftServerPlugin.getDriftFile(subject, drift.getNewDriftFile().getHashId());
+ oldFile = driftServerPlugin.getDriftFile(subject, drift.getOldDriftFile().getHashId());
+
+ driftDetails.setNewFileStatus(newFile.getStatus());
+ driftDetails.setOldFileStatus(oldFile.getStatus());
+
+ driftDetails.setPreviousChangeSet(loadPreviousChangeSet(subject, drift));
+ break;
+ case FILE_REMOVED:
+ oldFile = driftServerPlugin.getDriftFile(subject, drift.getOldDriftFile().getHashId());
+ driftDetails.setOldFileStatus(oldFile.getStatus());
+ break;
}
} catch (Exception e) {
- log.error("An error occurred while loading the drift details for drift id " + driftId + ": " +
- e.getMessage());
+ log.error("An error occurred while loading the drift details for drift id " + driftId + ": "
+ + e.getMessage());
throw new RuntimeException("An error occurred while loading th drift details for drift id " + driftId, e);
}
driftDetails.setBinaryFile(isBinaryFile(drift));
return driftDetails;
}
+ private void notifyAlertConditionCacheManager(String callingMethod, DriftChangeSetSummary summary) {
+ AlertConditionCacheStats stats = alertConditionCacheManager.checkConditions(summary);
+ if (log.isDebugEnabled()) {
+ log.debug(callingMethod + ": " + stats.toString());
+ }
+ }
+
private DriftChangeSet loadPreviousChangeSet(Subject subject, Drift drift) {
GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria();
criteria.addFilterResourceId(drift.getChangeSet().getResourceId());
commit 9b3d7aba530b08276da95dd7e2e9ddf2d8a65a6b
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Aug 31 14:54:11 2011 -0400
have eclipse use skipTests when doing full builds
diff --git a/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile Full Enterprise with DBSetup.launch b/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile Full Enterprise with DBSetup.launch
index 2eae613..4dc816d 100644
--- a/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile Full Enterprise with DBSetup.launch
+++ b/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile Full Enterprise with DBSetup.launch
@@ -6,6 +6,6 @@
<listEntry value="org.eclipse.ui.externaltools.launchGroup"/>
</listAttribute>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${env_var:M2_HOME}/bin/${MAVEN_EXE}"/>
-<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-o -Dmaven.test.skip=true -Pdev,enterprise -Ddbsetup -Ddb=dev install"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-o -DskipTests=true -Pdev,enterprise -Ddbsetup -Ddb=dev install"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/rhq}"/>
</launchConfiguration>
diff --git a/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile Full Enterprise.launch b/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile Full Enterprise.launch
index ebd9747..4e20f34 100644
--- a/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile Full Enterprise.launch
+++ b/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile Full Enterprise.launch
@@ -6,6 +6,6 @@
<listEntry value="org.eclipse.ui.externaltools.launchGroup"/>
</listAttribute>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${env_var:M2_HOME}/bin/${MAVEN_EXE}"/>
-<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-o -Dmaven.test.skip=true -Pdev,enterprise -Ddb=dev install"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-o -DskipTests=true -Pdev,enterprise -Ddb=dev install"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/rhq}"/>
</launchConfiguration>
commit ed6424e5954ab8e78613a5d6574e105adac0cbaf
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Aug 31 14:49:49 2011 -0400
set the data directory so we don't get changesets directory outside of the target/ dir
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/PluginContainerTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/PluginContainerTest.java
index f97db7c..6c5cb3a 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/PluginContainerTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/PluginContainerTest.java
@@ -1,29 +1,31 @@
- /*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * 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 and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * 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 and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
package org.rhq.core.pc;
import java.io.File;
+
import org.testng.annotations.Test;
+
import org.rhq.core.pc.plugin.FileSystemPluginFinder;
@Test
@@ -31,6 +33,7 @@ public class PluginContainerTest {
public void testStartup() {
PluginContainerConfiguration config = new PluginContainerConfiguration();
config.setPluginFinder(new FileSystemPluginFinder(new File(".")));
+ config.setDataDirectory(new File("target/PluginContainerTest"));
PluginContainer pc = PluginContainer.getInstance();
pc.setConfiguration(config);
pc.initialize();
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/inventory/ResourceContainerTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/inventory/ResourceContainerTest.java
index 27c026a..fd3e68a 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/inventory/ResourceContainerTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/inventory/ResourceContainerTest.java
@@ -22,6 +22,8 @@
*/
package org.rhq.core.pc.inventory;
+import java.io.File;
+
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@@ -30,6 +32,7 @@ import org.rhq.core.clientapi.agent.metadata.PluginMetadataManager;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.pc.PluginContainer;
+import org.rhq.core.pc.PluginContainerConfiguration;
import org.rhq.core.pc.util.FacetLockType;
import org.rhq.core.pluginapi.availability.AvailabilityFacet;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
@@ -45,7 +48,11 @@ public class ResourceContainerTest {
@BeforeClass
public void beforeClass() {
- PluginContainer.getInstance().initialize();
+ PluginContainerConfiguration config = new PluginContainerConfiguration();
+ config.setDataDirectory(new File("target/PluginContainerTest"));
+ PluginContainer pc = PluginContainer.getInstance();
+ pc.setConfiguration(config);
+ pc.initialize();
ResourceContainer.initialize();
}
commit 3d607576bbaf20c0aa3e5a292cf895b7561e18e7
Merge: 6aa3c58 5d4fbbe
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Aug 31 13:22:29 2011 -0400
Merge commit 'origin/master' into drift-alert
commit 6aa3c583f37107dedf6d75a30dd4e62c1dd4b148
Merge: 89731c7 044113e
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Aug 30 22:43:33 2011 -0400
Merge commit 'origin/master' into drift-alert
Conflicts:
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
diff --cc modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
index 738d69f,898a4c2..27ec698
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
@@@ -59,7 -54,9 +61,8 @@@ import org.rhq.core.domain.drift.DriftC
import org.rhq.core.domain.drift.DriftComposite;
import org.rhq.core.domain.drift.DriftConfiguration;
import org.rhq.core.domain.drift.DriftConfigurationComparator;
-import org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode;
import org.rhq.core.domain.drift.DriftConfigurationDefinition;
+ import org.rhq.core.domain.drift.DriftDetails;
import org.rhq.core.domain.drift.DriftFile;
import org.rhq.core.domain.drift.DriftSnapshot;
import org.rhq.core.domain.drift.FileDiffReport;
commit 89731c7d830f3b9293b8307002e4ae015d17406b
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Aug 30 22:40:51 2011 -0400
start of drift alerting support.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java
index 355c854..00a409b 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java
@@ -242,6 +242,21 @@ import org.rhq.core.domain.operation.OperationRequestStatus;
+ " AND ad.deleted = FALSE " //
+ " AND ac.category = 'RESOURCE_CONFIG' " //
+ "ORDER BY ac.id"), //
+ @NamedQuery(name = AlertCondition.QUERY_BY_CATEGORY_DRIFT, query = "" //
+ + " SELECT new org.rhq.core.domain.alert.composite.AlertConditionDriftCategoryComposite " //
+ + " ( " //
+ + " ac, " //
+ + " res.id " //
+ + " ) " //
+ + " FROM AlertCondition AS ac " //
+ + " JOIN ac.alertDefinition ad " //
+ + " JOIN ad.resource res " //
+ + " WHERE " + AlertCondition.RECOVERY_CONDITIONAL_EXPRESSION //
+ + " AND ( res.agent.id = :agentId OR :agentId IS NULL ) " //
+ + " AND ad.enabled = TRUE " //
+ + " AND ad.deleted = FALSE " //
+ + " AND ac.category = 'DRIFT' " //
+ + "ORDER BY ac.id"), //
@NamedQuery(name = AlertCondition.QUERY_BY_CATEGORY_COUNT_PARAMETERIZED, query = "" //
+ " SELECT count(ac.id) " //
+ " FROM AlertCondition AS ac " //
@@ -273,6 +288,7 @@ public class AlertCondition implements Serializable {
public static final String QUERY_BY_CATEGORY_THRESHOLD = "AlertCondition.byCategoryThreshold";
public static final String QUERY_BY_CATEGORY_EVENT = "AlertCondition.byCategoryEvent";
public static final String QUERY_BY_CATEGORY_RESOURCE_CONFIG = "AlertCondition.byCategoryResourceConfig";
+ public static final String QUERY_BY_CATEGORY_DRIFT = "AlertCondition.byCategoryDrift";
public static final String QUERY_BY_CATEGORY_COUNT_BASELINE = "AlertCondition.byCategoryCountBaseline";
public static final String QUERY_BY_CATEGORY_COUNT_PARAMETERIZED = "AlertCondition.byCategoryCountParameterized";
@@ -395,6 +411,8 @@ public class AlertCondition implements Serializable {
* TRAIT: the name of the trait (TODO: today its the display name, very bad for i18n purposes)
* CONTROL: the name of the operation (not its display name)
* EVENT: the level of event to compare with (DEBUG, INFO, WARN, ERROR, FATAL)
+ * RESOURCE_CONFIG: n/a (null)
+ * DRIFT: n/a (null)
*
* @return additional information about the condition
*/
@@ -450,7 +468,9 @@ public class AlertCondition implements Serializable {
* TRAIT: n/a
* CONTROL: the {@link OperationRequestStatus} name (SUCCESS, FAILURE, etc).
* EVENT: the regular expression of the message to match (which may be empty string if not specified)
- *
+ * RESOURCE_CONFIG: n/a
+ * DRIFT: n/a (TODO driftalert - regular expression to match files whose content drifted (may be empty string if not specified)
+ *
* @return additional information about the condition
*/
public String getOption() {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionCategory.java b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionCategory.java
index 531857b..e80c221 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionCategory.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionCategory.java
@@ -31,7 +31,8 @@ public enum AlertConditionCategory {
CONTROL("Control Action"), //
ALERT("Alert Fired"), //
RESOURCE_CONFIG("Resource Configuration Property Value Change"), //
- EVENT("Log Event");
+ EVENT("Log Event"), //
+ DRIFT("Drift Detected");
/*
* legacyOrder exists to support code that still uses the old EventConstants.TYPE_* attributes, which was one-based
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/composite/AlertConditionDriftCategoryComposite.java b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/composite/AlertConditionDriftCategoryComposite.java
new file mode 100644
index 0000000..7b56a4c
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/composite/AlertConditionDriftCategoryComposite.java
@@ -0,0 +1,40 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * 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 and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.core.domain.alert.composite;
+
+import org.rhq.core.domain.alert.AlertCondition;
+
+public class AlertConditionDriftCategoryComposite extends AbstractAlertConditionCategoryComposite {
+
+ private final Integer resourceId;
+
+ public AlertConditionDriftCategoryComposite(AlertCondition condition, Integer resourceId) {
+ super(condition);
+ this.resourceId = resourceId;
+ }
+
+ public Integer getResourceId() {
+ return resourceId;
+ }
+
+}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
index 777d2fb..6fcdcc5 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
@@ -834,6 +834,9 @@ public class ResourceType implements Serializable, Comparable<ResourceType> {
}
public void addDriftConfigurationTemplate(ConfigurationTemplate template) {
+ if (driftConfigurationTemplates == null) {
+ driftConfigurationTemplates = new HashSet<ConfigurationTemplate>(1);
+ }
driftConfigurationTemplates.add(template);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
index 26a2477..c25855c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java
@@ -187,6 +187,10 @@ public class AlertFormatUtility {
}
break;
}
+ case DRIFT: {
+ str.append(MSG.view_alert_common_tab_conditions_type_drift());
+ break;
+ }
default: {
str.append(MSG.view_alert_common_tab_invalid_condition_category(category.name()));
break;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java
index c113008..4410315 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/ConditionsEditor.java
@@ -22,6 +22,7 @@
*/
package org.rhq.enterprise.gui.coregui.client.alert.definitions;
+import java.util.EnumSet;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -38,12 +39,15 @@ import com.smartgwt.client.widgets.events.CloseClientEvent;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.alert.AlertCondition;
+import org.rhq.core.domain.configuration.definition.ConfigurationTemplate;
import org.rhq.core.domain.criteria.Criteria;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.gui.coregui.client.alert.AlertFormatUtility;
import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
import org.rhq.enterprise.gui.coregui.client.components.table.Table;
import org.rhq.enterprise.gui.coregui.client.components.table.TableActionEnablement;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository.MetadataType;
import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
@@ -55,7 +59,7 @@ public class ConditionsEditor extends LocatableVLayout {
private ResourceType resourceType;
private HashSet<AlertCondition> conditions;
- private Table table;
+ private Table<ConditionDataSource> table;
public ConditionsEditor(String locatorId, ResourceType resourceType, HashSet<AlertCondition> conditions) {
super(locatorId);
@@ -110,36 +114,63 @@ public class ConditionsEditor extends LocatableVLayout {
protected void configureTable() {
addTableAction(this.extendLocatorId("add"), "Add", null, new AbstractTableAction() {
public void executeAction(ListGridRecord[] selection, Object actionValue) {
- final Window winModal = new LocatableWindow(ConditionsEditor.this
- .extendLocatorId("newConditionEditorWindow"));
- winModal.setTitle(MSG.view_alert_common_tab_conditions_modal_title());
- winModal.setOverflow(Overflow.VISIBLE);
- winModal.setShowMinimizeButton(false);
- winModal.setIsModal(true);
- winModal.setShowModalMask(true);
- winModal.setAutoSize(true);
- winModal.setAutoCenter(true);
- //winModal.setShowResizer(true);
- //winModal.setCanDragResize(true);
- winModal.centerInPage();
- winModal.addCloseClickHandler(new CloseClickHandler() {
- @Override
- public void onCloseClick(CloseClientEvent event) {
- winModal.markForDestroy();
- }
- });
-
- NewConditionEditor newConditionEditor = new NewConditionEditor(
- extendLocatorId("newConditionEditor"), conditions, ConditionsEditor.this.resourceType,
- new Runnable() {
+
+ // we need the drift config templates (if there are any) so we know if we should offer drift conditions as an option
+ ResourceTypeRepository.Cache.getInstance().getResourceTypes(resourceType.getId(),
+ EnumSet.of(MetadataType.driftConfigurationTemplates),
+ new ResourceTypeRepository.TypeLoadedCallback() {
@Override
- public void run() {
- winModal.markForDestroy();
- refresh();
+ public void onTypesLoaded(ResourceType type) {
+ // the resource type repo caches types - so if this resource type was already cached prior
+ // to the conditions editor component created (which it probably was) then we are getting the same
+ // exact instance that we had before (resourceType). When this happens, great! Our resourceType
+ // instance will have its drift config templates populated. But, I'm being paranoid. If somehow
+ // we have a resourceType that is different than the type being passed to us, we need to copy
+ // the drift config.
+ if (type != resourceType) {
+ // paranoia, unsure if this is needed but clear out any old drift config still hanging around
+ if (resourceType.getDriftConfigurationTemplates() != null) {
+ resourceType.getDriftConfigurationTemplates().clear();
+ }
+ // if the newly loaded resource type supports drift, put it in our type object
+ if (type.getDriftConfigurationTemplates() != null) {
+ for (ConfigurationTemplate ct : type.getDriftConfigurationTemplates()) {
+ resourceType.addDriftConfigurationTemplate(ct);
+ }
+ }
+ }
+ final Window winModal = new LocatableWindow(ConditionsEditor.this
+ .extendLocatorId("newConditionEditorWindow"));
+ winModal.setTitle(MSG.view_alert_common_tab_conditions_modal_title());
+ winModal.setOverflow(Overflow.VISIBLE);
+ winModal.setShowMinimizeButton(false);
+ winModal.setIsModal(true);
+ winModal.setShowModalMask(true);
+ winModal.setAutoSize(true);
+ winModal.setAutoCenter(true);
+ //winModal.setShowResizer(true);
+ //winModal.setCanDragResize(true);
+ winModal.centerInPage();
+ winModal.addCloseClickHandler(new CloseClickHandler() {
+ @Override
+ public void onCloseClick(CloseClientEvent event) {
+ winModal.markForDestroy();
+ }
+ });
+
+ NewConditionEditor newConditionEditor = new NewConditionEditor(
+ extendLocatorId("newConditionEditor"), conditions,
+ ConditionsEditor.this.resourceType, new Runnable() {
+ @Override
+ public void run() {
+ winModal.markForDestroy();
+ refresh();
+ }
+ });
+ winModal.addItem(newConditionEditor);
+ winModal.show();
}
});
- winModal.addItem(newConditionEditor);
- winModal.show();
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
index 44875d8..8b9986f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java
@@ -99,6 +99,7 @@ public class NewConditionEditor extends LocatableDynamicForm {
private boolean supportsOperations = false;
private boolean supportsEvents = false;
private boolean supportsResourceConfig = false;
+ private boolean supportsDrift = false;
private Runnable closeFunction; // this is called after a button is pressed and the editor should close
private ResourceType resourceType;
@@ -112,6 +113,8 @@ public class NewConditionEditor extends LocatableDynamicForm {
this.supportsEvents = (rtype.getEventDefinitions() != null && rtype.getEventDefinitions().size() > 0);
this.supportsResourceConfig = (rtype.getResourceConfigurationDefinition() != null);
+ this.supportsDrift = (rtype.getDriftConfigurationTemplates() != null && rtype.getDriftConfigurationTemplates()
+ .size() > 0);
Set<MeasurementDefinition> metricDefinitions = rtype.getMetricDefinitions();
if (metricDefinitions != null && metricDefinitions.size() > 0) {
@@ -183,6 +186,10 @@ public class NewConditionEditor extends LocatableDynamicForm {
condTypes.put(AlertConditionCategory.EVENT.name(), MSG
.view_alert_definition_condition_editor_option_event());
}
+ if (supportsDrift) {
+ condTypes.put(AlertConditionCategory.DRIFT.name(), MSG
+ .view_alert_definition_condition_editor_option_drift());
+ }
conditionTypeSelectItem.setValueMap(condTypes);
conditionTypeSelectItem.setDefaultValue(AlertConditionCategory.AVAILABILITY.name());
conditionTypeSelectItem.setWrapTitle(false);
@@ -245,6 +252,9 @@ public class NewConditionEditor extends LocatableDynamicForm {
if (supportsResourceConfig) {
formItems.addAll(buildResourceConfigChangeFormItems());
}
+ if (supportsDrift) {
+ formItems.addAll(buildDriftFormItems());
+ }
formItems.add(spacer2);
formItems.add(ok);
formItems.add(cancel);
@@ -367,6 +377,15 @@ public class NewConditionEditor extends LocatableDynamicForm {
break;
}
+ case DRIFT: {
+ newCondition.setName(null);
+ newCondition.setComparator(null);
+ newCondition.setThreshold(null);
+ newCondition.setOption(null); // TODO driftalert - be able to regex for only certain files that drifted
+ newCondition.setMeasurementDefinition(null);
+ break;
+ }
+
default: {
CoreGUI.getErrorHandler()
.handleError(MSG.view_alert_common_tab_invalid_condition_category(category.name())); // should never happen
@@ -702,6 +721,18 @@ public class NewConditionEditor extends LocatableDynamicForm {
return formItems;
}
+ private ArrayList<FormItem> buildDriftFormItems() {
+ ArrayList<FormItem> formItems = new ArrayList<FormItem>();
+
+ ShowIfCategoryFunction ifFunc = new ShowIfCategoryFunction(AlertConditionCategory.DRIFT);
+
+ String helpStr = MSG.view_alert_definition_condition_editor_drift_tooltip();
+ StaticTextItem helpItem = buildHelpTextItem("driftHelp", helpStr, ifFunc);
+ formItems.add(helpItem);
+
+ return formItems;
+ }
+
private SelectItem buildMetricDropDownMenu(String itemName, boolean dynamicOnly, FormItemIfFunction ifFunc) {
LinkedHashMap<String, String> metricsMap = new LinkedHashMap<String, String>();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java
index c4630dd..d9689aa 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java
@@ -30,6 +30,7 @@ import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
+import org.rhq.core.domain.configuration.definition.ConfigurationTemplate;
import org.rhq.core.domain.criteria.ResourceTypeCriteria;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
@@ -57,7 +58,7 @@ public class ResourceTypeRepository {
private static ResourceTypeGWTServiceAsync resourceTypeService = GWTServiceLookup.getResourceTypeGWTService();
public enum MetadataType {
- children, operations, measurements, content, events, pluginConfigurationDefinition, resourceConfigurationDefinition, subCategory, parentTypes, processScans, productVersions
+ children, operations, measurements, content, events, pluginConfigurationDefinition, resourceConfigurationDefinition, subCategory, parentTypes, processScans, productVersions, driftConfigurationTemplates
}
public static class Cache {
@@ -245,6 +246,9 @@ public class ResourceTypeRepository {
case subCategory:
criteria.fetchSubCategory(true);
break;
+ case driftConfigurationTemplates:
+ criteria.fetchDriftConfigurationTemplates(true);
+ break;
default:
Log.error("ERROR: metadataType " + metadataType.name()
+ " not incorporated into ResourceType criteria.");
@@ -254,11 +258,10 @@ public class ResourceTypeRepository {
criteria.setPageControl(PageControl.getUnlimitedInstance());
- Log.info("Loading " + typesNeeded.size()
- + ((metadataTypes != null) ? (" types: " + metadataTypes) : ""));
+ Log.info("Loading " + typesNeeded.size() + ((metadataTypes != null) ? (" types: " + metadataTypes) : ""));
- if ((topLevelServerAndServiceTypes == null) && (metadataTypes != null) &&
- metadataTypes.contains(MetadataType.children)) {
+ if ((topLevelServerAndServiceTypes == null) && (metadataTypes != null)
+ && metadataTypes.contains(MetadataType.children)) {
// Perform a one-time load of server and service types with no parent types. These types are implicitly
// children of all platform types, even though they are not included in the platform types'
// childResourceTypes field.
@@ -269,9 +272,8 @@ public class ResourceTypeRepository {
}
private void loadTopLevelServerAndServiceTypes(final TypesLoadedCallback callback,
- final EnumSet<MetadataType> metadataTypes,
- final ResourceTypeCriteria criteria, final Map<Integer,
- ResourceType> cachedTypes) {
+ final EnumSet<MetadataType> metadataTypes, final ResourceTypeCriteria criteria,
+ final Map<Integer, ResourceType> cachedTypes) {
ResourceTypeCriteria topLevelCriteria = new ResourceTypeCriteria();
topLevelCriteria.fetchParentResourceTypes(true);
resourceTypeService.findResourceTypesByCriteria(topLevelCriteria, new AsyncCallback<PageList<ResourceType>>() {
@@ -283,8 +285,8 @@ public class ResourceTypeRepository {
public void onSuccess(PageList<ResourceType> types) {
topLevelServerAndServiceTypes = new HashSet<ResourceType>();
for (ResourceType type : types) {
- if ((type.getCategory() != ResourceCategory.PLATFORM) &&
- (type.getParentResourceTypes() == null || type.getParentResourceTypes().isEmpty())) {
+ if ((type.getCategory() != ResourceCategory.PLATFORM)
+ && (type.getParentResourceTypes() == null || type.getParentResourceTypes().isEmpty())) {
topLevelServerAndServiceTypes.add(type);
}
}
@@ -293,7 +295,8 @@ public class ResourceTypeRepository {
});
}
- private void loadRequestedTypes(final TypesLoadedCallback callback, final EnumSet<MetadataType> metadataTypes, ResourceTypeCriteria criteria, final Map<Integer, ResourceType> cachedTypes) {
+ private void loadRequestedTypes(final TypesLoadedCallback callback, final EnumSet<MetadataType> metadataTypes,
+ ResourceTypeCriteria criteria, final Map<Integer, ResourceType> cachedTypes) {
resourceTypeService.findResourceTypesByCriteria(criteria, new AsyncCallback<PageList<ResourceType>>() {
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError(MSG.widget_typeCache_loadFail(), caught);
@@ -308,8 +311,8 @@ public class ResourceTypeRepository {
switch (metadataType) {
case children:
Set<ResourceType> childTypes = type.getChildResourceTypes();
- if (type.getCategory() == ResourceCategory.PLATFORM &&
- topLevelServerAndServiceTypes != null) {
+ if (type.getCategory() == ResourceCategory.PLATFORM
+ && topLevelServerAndServiceTypes != null) {
// Add server and service types with no parent types to the list of child types.
// These types are implicitly children of all platform types, even though they
// are not included in the platform types' childResourceTypes field.
@@ -349,9 +352,19 @@ public class ResourceTypeRepository {
case subCategory:
cachedType.setSubCategory(type.getSubCategory());
break;
+ case driftConfigurationTemplates:
+ if (cachedType.getDriftConfigurationTemplates() != null) {
+ cachedType.getDriftConfigurationTemplates().clear(); // remove any old ones hanging around
+ }
+ if (type.getDriftConfigurationTemplates() != null) {
+ for (ConfigurationTemplate ct : type.getDriftConfigurationTemplates()) {
+ cachedType.addDriftConfigurationTemplate(ct);
+ }
+ }
+ break;
default:
Log.error("ERROR: metadataType " + metadataType.name()
- + " not merged into cached ResourceType.");
+ + " not merged into cached ResourceType.");
}
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index beb105b..2c62f90 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -612,6 +612,7 @@ view_alert_common_tab_conditions_text = Condition
view_alert_common_tab_conditions_type_availability = Availability Change
view_alert_common_tab_conditions_type_availability_down = Went down
view_alert_common_tab_conditions_type_availability_up = Came up
+view_alert_common_tab_conditions_type_drift = Drift Detection
view_alert_common_tab_conditions_type_event = Event Detection
view_alert_common_tab_conditions_type_event_matching = with event source matching
view_alert_common_tab_conditions_type_metric_baseline = Metric Value Baseline
@@ -666,6 +667,7 @@ view_alert_definition_condition_editor_common_avg = Average
view_alert_definition_condition_editor_common_max = Maximum
view_alert_definition_condition_editor_common_min = Minimum
view_alert_definition_condition_editor_delete_confirm = Delete the selected alert condition(s)?
+view_alert_definition_condition_editor_drift_tooltip = This condition is triggered when drift has been detected.
view_alert_definition_condition_editor_event_regex = Regular Expression
view_alert_definition_condition_editor_event_regex_tooltip = If specified, this is a regular expression that must match a collected event message in order to trigger the condition.
view_alert_definition_condition_editor_event_severity = Event Severity
@@ -716,6 +718,7 @@ view_alert_definition_condition_editor_operation_status_success = Success
view_alert_definition_condition_editor_operation_tooltip = Specify the result that must occur when the selected operation is executed in order to trigger the condition.
view_alert_definition_condition_editor_operation_value = Operation
view_alert_definition_condition_editor_option_availability = Availability Change
+view_alert_definition_condition_editor_option_drift = Drift Detection
view_alert_definition_condition_editor_option_event = Event Detection
view_alert_definition_condition_editor_option_label = Condition Type
view_alert_definition_condition_editor_option_metric_baseline = Measurement Baseline Threshold
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
index 5bb5a98..54c4599 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
@@ -489,7 +489,8 @@ view_alert_common_tab_conditions_text = Bedingung
view_alert_common_tab_conditions_type_availability = Ãnderung der VerfÃŒgbarkeit
view_alert_common_tab_conditions_type_availability_down = Wurde unverfÃŒgbar
view_alert_common_tab_conditions_type_availability_up = Wurde wieder verfÃŒgbar
-view_alert_common_tab_conditions_type_event = Event Detection~
+##view_alert_common_tab_conditions_type_drift = Drift Detection
+##view_alert_common_tab_conditions_type_event = Event Detection
view_alert_common_tab_conditions_type_event_matching = with event source matching~
view_alert_common_tab_conditions_type_metric_baseline = Metrik ÃŒberschreitet Referenzband
view_alert_common_tab_conditions_type_metric_baseline_verb = von
@@ -543,6 +544,7 @@ view_alert_definition_condition_editor_common_avg = Durchschnitt
view_alert_definition_condition_editor_common_max = Maximum
view_alert_definition_condition_editor_common_min = Minimum
view_alert_definition_condition_editor_delete_confirm = Die ausgewÀhlte(n) Alarm-Bedingung(en) löschen?
+##view_alert_definition_condition_editor_drift_tooltip = This condition is triggered when drift has been detected.
view_alert_definition_condition_editor_event_regex = RegulÀrer Ausdruck
view_alert_definition_condition_editor_event_regex_tooltip = If specified, this is a regular expression that must match a collected event message in order to trigger the condition.~
view_alert_definition_condition_editor_event_severity = Schwere des Ereignisses
@@ -593,7 +595,8 @@ view_alert_definition_condition_editor_operation_status_success = Erfolg
view_alert_definition_condition_editor_operation_tooltip = Specify the result that must occur when the selected operation is executed in order to trigger the condition.~
view_alert_definition_condition_editor_operation_value = Operation
view_alert_definition_condition_editor_option_availability = Ãnderung der VerfÃŒgbarkeit
-view_alert_definition_condition_editor_option_event = Event Detection~
+##view_alert_definition_condition_editor_option_drift = Drift Detection
+##view_alert_definition_condition_editor_option_event = Event Detection
view_alert_definition_condition_editor_option_label = Typ der Bedingung
view_alert_definition_condition_editor_option_metric_baseline = Schwelle des Referenzbands
view_alert_definition_condition_editor_option_metric_calltime_change = Ãnderung des Call-Time-Werts
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
index 98a20a4..bafd11f 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties
@@ -607,6 +607,7 @@ view_alert_common_tab_conditions_text = æ¡ä»¶
view_alert_common_tab_conditions_type_availability = ã¢ãã€ã©ããªãã£ã®å€å
view_alert_common_tab_conditions_type_availability_down = äžé
view_alert_common_tab_conditions_type_availability_up = äžæ
+##view_alert_common_tab_conditions_type_drift = Drift Detection
view_alert_common_tab_conditions_type_event = ã€ãã³ãã®æ€åº
view_alert_common_tab_conditions_type_event_matching = ã€ãã³ããœãŒã¹ãäžèŽ
view_alert_common_tab_conditions_type_metric_baseline = ã¡ããªãã¯å€ã®ããŒã¹ã©ã€ã³
@@ -661,6 +662,7 @@ view_alert_definition_condition_editor_common_avg = å¹³å
view_alert_definition_condition_editor_common_max = æ倧
view_alert_definition_condition_editor_common_min = æå°
view_alert_definition_condition_editor_delete_confirm = éžæãããã¢ã©ãŒãå®çŸ©ãåé€ããŸãã?
+##view_alert_definition_condition_editor_drift_tooltip = This condition is triggered when drift has been detected.
view_alert_definition_condition_editor_event_regex = æ£èŠè¡šçŸ
view_alert_definition_condition_editor_event_regex_tooltip = ããæå®ããããªããããã¯æ£èŠè¡šçŸã§ããããã®æ¡ä»¶ãåŒãèµ·ããããã«åéãããã€ãã³ãã¡ãã»ãŒãžã«äžèŽããªããã°ãªããŸããã
view_alert_definition_condition_editor_event_severity = ã€ãã³ãé倧床
@@ -711,6 +713,7 @@ view_alert_definition_condition_editor_operation_status_success = æå
view_alert_definition_condition_editor_operation_tooltip = æ¡ä»¶ãåŒãèµ·ããããã«éžæããããå®è¡ããããšãçºçããªããã°ãªããªãçµæãæå®ããŸã
view_alert_definition_condition_editor_operation_value = ãªãã¬ãŒã·ã§ã³
view_alert_definition_condition_editor_option_availability = ã¢ãã€ã©ããªãã£ã®å€å
+##view_alert_definition_condition_editor_option_drift = Drift Detection
view_alert_definition_condition_editor_option_event = ã€ãã³ãã®æ€åº
view_alert_definition_condition_editor_option_label = æ¡ä»¶ã¿ã€ã
view_alert_definition_condition_editor_option_metric_baseline = 枬å®ããŒã¹ã©ã€ã³ã®éŸå€
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
index 48cae04..2722b0d 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties
@@ -623,6 +623,7 @@ view_alert_common_tab_conditions_text = Condi\u00E7\u00E3o
view_alert_common_tab_conditions_type_availability = Mudan\u00E7a na Disponibilidade
view_alert_common_tab_conditions_type_availability_down = Indispon\u00EDvel
view_alert_common_tab_conditions_type_availability_up = Dispon\u00EDvel
+##view_alert_common_tab_conditions_type_drift = Drift Detection
view_alert_common_tab_conditions_type_event = Detec\u00E7\u00E3o de Envento
view_alert_common_tab_conditions_type_event_matching = combinando com o evento de origem
view_alert_common_tab_conditions_type_metric_baseline = Valor da m\u00E9trica excede a linha de base (baseline)
@@ -679,6 +680,7 @@ view_alert_definition_condition_editor_common_avg = M\u00E9dio
view_alert_definition_condition_editor_common_max = M\u00E1ximo
view_alert_definition_condition_editor_common_min = M\u00EDnimo
view_alert_definition_condition_editor_delete_confirm = Delete the selected alert condition(s)?
+##view_alert_definition_condition_editor_drift_tooltip = This condition is triggered when drift has been detected.
view_alert_definition_condition_editor_event_regex = Express\u00E3o Regular
view_alert_definition_condition_editor_event_regex_tooltip = Se definida, a condi\u00E7\u00E3o somente ser\u00E1 disparada caso o evento satisfa\u00E7a a express\u00E3o.
view_alert_definition_condition_editor_event_severity = Severidade do Evento
@@ -729,6 +731,7 @@ view_alert_definition_condition_editor_operation_status_success = Sucesso
view_alert_definition_condition_editor_operation_tooltip = Define o resultado esperado quando a opera\u00E7\u00E3o selecionada for executada para dispararo da confi\u00E7\u00E3o.
view_alert_definition_condition_editor_operation_value = Opera\u00E7\u00E3o
view_alert_definition_condition_editor_option_availability = Mudan\u00E7a de Disponibilidade
+##view_alert_definition_condition_editor_option_drift = Drift Detection
view_alert_definition_condition_editor_option_event = Detec\u00E7\u00E3o de Evento
view_alert_definition_condition_editor_option_label = Tipo de Condi\u00E7\u00E3o
view_alert_definition_condition_editor_option_metric_baseline = Threshold base da M\u00E9trica
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
index 77d3749..f73be85 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties
@@ -606,6 +606,7 @@ view_alert_common_tab_conditions_text = \u6761\u4ef6
view_alert_common_tab_conditions_type_availability = \u53ef\u7528\u6027\u6539\u53d8
view_alert_common_tab_conditions_type_availability_down = Went down
view_alert_common_tab_conditions_type_availability_up = Came up
+##view_alert_common_tab_conditions_type_drift = Drift Detection
view_alert_common_tab_conditions_type_event = \u4e8b\u4ef6\u68c0\u6d4b
view_alert_common_tab_conditions_type_event_matching = with event source matching
view_alert_common_tab_conditions_type_metric_baseline = \u6307\u6807\u57fa\u51c6
@@ -660,6 +661,7 @@ view_alert_definition_condition_editor_common_avg = \u5e73\u5747
view_alert_definition_condition_editor_common_max = \u6700\u5927
view_alert_definition_condition_editor_common_min = \u6700\u5c0f
view_alert_definition_condition_editor_delete_confirm = \u5220\u9664\u9009\u5b9a\u7684\u8b66\u62a5\u6761\u4ef6?
+##view_alert_definition_condition_editor_drift_tooltip = This condition is triggered when drift has been detected.
view_alert_definition_condition_editor_event_regex = \u6b63\u5219\u8868\u8fbe\u5f0f
view_alert_definition_condition_editor_event_regex_tooltip = If specified, this is a regular expression that must match a collected event message in order to trigger the condition.
view_alert_definition_condition_editor_event_severity = \u4e8b\u4ef6\u4e25\u91cd\u6027
@@ -710,6 +712,7 @@ view_alert_definition_condition_editor_operation_status_success = Success
view_alert_definition_condition_editor_operation_tooltip = Specify the result that must occur when the selected operation is executed in order to trigger the condition.
view_alert_definition_condition_editor_operation_value = \u64cd\u4f5c
view_alert_definition_condition_editor_option_availability = \u53ef\u7528\u6027\u6539\u53d8
+##view_alert_definition_condition_editor_option_drift = Drift Detection
view_alert_definition_condition_editor_option_event = \u4e8b\u4ef6\u68c0\u6d4b
view_alert_definition_condition_editor_option_label = \u6761\u4ef6\u7c7b\u578b
view_alert_definition_condition_editor_option_metric_baseline = \u6307\u6807\u57fa\u7ebf\u9600\u503c
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java
index ef2ac95..05e2af6 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java
@@ -112,6 +112,9 @@ public class AlertConditionManagerBean implements AlertConditionManagerLocal {
} else if (category == AlertConditionCategory.RESOURCE_CONFIG) {
queryName = AlertCondition.QUERY_BY_CATEGORY_RESOURCE_CONFIG;
+ } else if (category == AlertConditionCategory.DRIFT) {
+ queryName = AlertCondition.QUERY_BY_CATEGORY_DRIFT;
+
} else {
throw new IllegalArgumentException("getAlertConditionComposites does not support category '" + category
+ "'");
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
index 02ae7b1..728ceff 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
@@ -620,7 +620,9 @@ public class AlertManagerBean implements AlertManagerLocal, AlertManagerRemote {
* flushing org.jboss.on.domain.event.alert.AlertConditionLog.alert -> org.jboss.on.domain.event.alert.Alert"
*/
this.createAlert(newAlert);
- log.debug("New alert identifier=" + newAlert.getId());
+ if (log.isDebugEnabled()) {
+ log.debug("New alert identifier=" + newAlert.getId());
+ }
// AlertNotificationLog alertNotifLog = new AlertNotificationLog(newAlert); TODO - is that all?
// entityManager.persist(alertNotifLog);
@@ -628,7 +630,9 @@ public class AlertManagerBean implements AlertManagerLocal, AlertManagerRemote {
List<AlertConditionLog> unmatchedConditionLogs = alertConditionLogManager
.getUnmatchedLogsByAlertDefinitionId(alertDefinitionId);
for (AlertConditionLog unmatchedLog : unmatchedConditionLogs) {
- log.debug("Matched alert condition log for alertId=" + newAlert.getId() + ": " + unmatchedLog);
+ if (log.isDebugEnabled()) {
+ log.debug("Matched alert condition log for alertId=" + newAlert.getId() + ": " + unmatchedLog);
+ }
newAlert.addConditionLog(unmatchedLog); // adds both relationships
}
@@ -651,7 +655,9 @@ public class AlertManagerBean implements AlertManagerLocal, AlertManagerRemote {
* to give them some way to explicitly try to re-send the notification for some client-side auditing purposes
*/
try {
- log.debug("Sending alert notifications for " + alert.toSimpleString() + "...");
+ if (log.isDebugEnabled()) {
+ log.debug("Sending alert notifications for " + alert.toSimpleString() + "...");
+ }
List<AlertNotification> alertNotifications = alert.getAlertDefinition().getAlertNotifications();
//Set<String> emailAddresses = new LinkedHashSet<String>();
@@ -721,7 +727,9 @@ public class AlertManagerBean implements AlertManagerLocal, AlertManagerRemote {
}
public Collection<String> sendAlertNotificationEmails(Alert alert, Collection<String> emailAddresses) {
- log.debug("Sending alert notifications for " + alert.toSimpleString() + "...");
+ if (log.isDebugEnabled()) {
+ log.debug("Sending alert notifications for " + alert.toSimpleString() + "...");
+ }
if (emailAddresses.size() == 0) {
return new ArrayList<String>(0); // No email to send -> no bad addresses
@@ -885,6 +893,13 @@ public class AlertManagerBean implements AlertManagerLocal, AlertManagerRemote {
else
builder.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_AVAILABILITY,
condition.getOption()));
+ } else if (category == AlertConditionCategory.DRIFT) {
+ if (shortVersion)
+ builder.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_DRIFT_SHORT,
+ condition.getOption()));
+ else
+ builder.append(AlertI18NFactory.getMessage(AlertI18NResourceKeys.ALERT_CONFIG_PROPS_CB_DRIFT, condition
+ .getOption()));
} else {
// do nothing
}
@@ -915,17 +930,19 @@ public class AlertManagerBean implements AlertManagerLocal, AlertManagerRemote {
Integer recoveryDefinitionId = firedDefinition.getRecoveryId();
if (recoveryDefinitionId != 0) {
- log.debug("Processing recovery rules...");
- log.debug("Found recoveryDefinitionId " + recoveryDefinitionId);
+ if (log.isDebugEnabled()) {
+ log.debug("Processing recovery rules... Found recoveryDefinitionId " + recoveryDefinitionId);
+ }
AlertDefinition toBeRecoveredDefinition = alertDefinitionManager.getAlertDefinitionById(overlord,
recoveryDefinitionId);
boolean wasEnabled = toBeRecoveredDefinition.getEnabled();
- log
- .debug(firedDefinition + (wasEnabled ? "does not need to recover " : "needs to recover ")
+ if (log.isDebugEnabled()) {
+ log.debug(firedDefinition + (wasEnabled ? "does not need to recover " : "needs to recover ")
+ toBeRecoveredDefinition
+ (wasEnabled ? ", it was already enabled " : ", it was currently disabled "));
+ }
if (!wasEnabled) {
/*
@@ -941,7 +958,9 @@ public class AlertManagerBean implements AlertManagerLocal, AlertManagerRemote {
* update the cache indirectly via the status field on the owning agent and the periodic job that checks it.
*/
} else if (firedDefinition.getWillRecover()) {
- log.debug("Disabling " + firedDefinition + " until recovered manually or by recovery definition");
+ if (log.isDebugEnabled()) {
+ log.debug("Disabling " + firedDefinition + " until recovered manually or by recovery definition");
+ }
/*
* disable until recovered manually or by recovery definition
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/AlertConditionCacheManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/AlertConditionCacheManagerBean.java
index 525585e..57cf70d 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/AlertConditionCacheManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/AlertConditionCacheManagerBean.java
@@ -38,6 +38,7 @@ import org.rhq.core.domain.operation.OperationHistory;
import org.rhq.core.domain.resource.Agent;
import org.rhq.enterprise.server.alert.engine.internal.AlertConditionCacheCoordinator;
import org.rhq.enterprise.server.cloud.instance.ServerManagerLocal;
+import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
/**
* @author Joseph Marques
@@ -88,6 +89,12 @@ public class AlertConditionCacheManagerBean implements AlertConditionCacheManage
return stats;
}
+ public AlertConditionCacheStats checkConditions(DriftChangeSetSummary driftChangeSetSummary) {
+ AlertConditionCacheStats stats;
+ stats = AlertConditionCacheCoordinator.getInstance().checkConditions(driftChangeSetSummary);
+ return stats;
+ }
+
public void reloadCachesForAgent(int agentId) {
AlertConditionCacheCoordinator.getInstance().reloadCachesForAgent(agentId);
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/AlertConditionCacheManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/AlertConditionCacheManagerLocal.java
index 0281d05..1eed43d 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/AlertConditionCacheManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/AlertConditionCacheManagerLocal.java
@@ -31,6 +31,7 @@ import org.rhq.core.domain.measurement.Availability;
import org.rhq.core.domain.measurement.MeasurementData;
import org.rhq.core.domain.measurement.calltime.CallTimeData;
import org.rhq.core.domain.operation.OperationHistory;
+import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
/**
* This is the SLSB interface for interacting with the clustered cache that stores and computes whether AlertDefinition
@@ -95,6 +96,14 @@ public interface AlertConditionCacheManagerLocal {
*/
AlertConditionCacheStats checkConditions(ResourceConfigurationUpdate update);
+ /**
+ * Drift changes that an agent reported.
+ *
+ * @param driftChangeSetSummary data on the change set that is to be checked
+ * @return the number of conditions that were true against this argument
+ */
+ AlertConditionCacheStats checkConditions(DriftChangeSetSummary driftChangeSetSummary);
+
void reloadCachesForAgent(int agentId);
void reloadGlobalCache();
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java
index 0100d3a..ac19d37 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AgentConditionCache.java
@@ -32,6 +32,7 @@ import org.rhq.core.domain.alert.AlertConditionCategory;
import org.rhq.core.domain.alert.composite.AbstractAlertConditionCategoryComposite;
import org.rhq.core.domain.alert.composite.AlertConditionBaselineCategoryComposite;
import org.rhq.core.domain.alert.composite.AlertConditionChangesCategoryComposite;
+import org.rhq.core.domain.alert.composite.AlertConditionDriftCategoryComposite;
import org.rhq.core.domain.alert.composite.AlertConditionEventCategoryComposite;
import org.rhq.core.domain.alert.composite.AlertConditionScheduleCategoryComposite;
import org.rhq.core.domain.alert.composite.AlertConditionTraitCategoryComposite;
@@ -54,6 +55,7 @@ import org.rhq.enterprise.server.alert.engine.internal.AlertConditionCacheCoordi
import org.rhq.enterprise.server.alert.engine.mbean.AlertConditionCacheMonitor;
import org.rhq.enterprise.server.alert.engine.model.AlertConditionOperator;
import org.rhq.enterprise.server.alert.engine.model.CallTimeDataCacheElement;
+import org.rhq.enterprise.server.alert.engine.model.DriftCacheElement;
import org.rhq.enterprise.server.alert.engine.model.EventCacheElement;
import org.rhq.enterprise.server.alert.engine.model.InvalidCacheElementException;
import org.rhq.enterprise.server.alert.engine.model.MeasurementBaselineCacheElement;
@@ -63,6 +65,7 @@ import org.rhq.enterprise.server.alert.engine.model.NumericDoubleCacheElement;
import org.rhq.enterprise.server.alert.engine.model.CallTimeDataCacheElement.CallTimeElementValue;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementDataManagerLocal;
+import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
import org.rhq.enterprise.server.util.LookupUtil;
/**
@@ -74,6 +77,7 @@ class AgentConditionCache extends AbstractConditionCache {
private Map<Integer, List<MeasurementTraitCacheElement>> measurementTraitCache;
private Map<Integer, List<CallTimeDataCacheElement>> callTimeCache;
private Map<Integer, List<EventCacheElement>> eventsCache;
+ private Map<Integer, List<DriftCacheElement>> driftCache;
private AlertConditionManagerLocal alertConditionManager;
private MeasurementDataManagerLocal measurementDataManager;
@@ -90,6 +94,7 @@ class AgentConditionCache extends AbstractConditionCache {
measurementTraitCache = new HashMap<Integer, List<MeasurementTraitCacheElement>>();
callTimeCache = new HashMap<Integer, List<CallTimeDataCacheElement>>();
eventsCache = new HashMap<Integer, List<EventCacheElement>>();
+ driftCache = new HashMap<Integer, List<DriftCacheElement>>();
alertConditionManager = LookupUtil.getAlertConditionManager();
measurementDataManager = LookupUtil.getMeasurementDataManager();
@@ -110,14 +115,15 @@ class AgentConditionCache extends AbstractConditionCache {
AlertConditionCacheStats stats = new AlertConditionCacheStats();
try {
- if (log.isDebugEnabled())
+ if (log.isDebugEnabled()) {
log.debug("Loading Alert Condition Caches for agent[id=" + agentId + "]...");
+ }
Subject overlord = subjectManager.getOverlord();
EnumSet<AlertConditionCategory> supportedCategories = EnumSet.of(AlertConditionCategory.BASELINE,
AlertConditionCategory.CHANGE, AlertConditionCategory.TRAIT, AlertConditionCategory.THRESHOLD,
- AlertConditionCategory.EVENT);
+ AlertConditionCategory.EVENT, AlertConditionCategory.DRIFT);
for (AlertConditionCategory nextCategory : supportedCategories) {
// page thru all alert definitions
@@ -146,12 +152,14 @@ class AgentConditionCache extends AbstractConditionCache {
pc.setPageNumber(pc.getPageNumber() + 1);
}
- if (log.isDebugEnabled())
+ if (log.isDebugEnabled()) {
log.debug("Loaded " + rowsProcessed + " Alert Condition Composites of type '" + nextCategory + "'");
+ }
}
- if (log.isDebugEnabled())
+ if (log.isDebugEnabled()) {
log.debug("Loaded Alert Condition Caches for agent[id=" + agentId + "]");
+ }
} catch (Throwable t) {
// don't let any exceptions bubble up to the calling SLSB layer
log.error("Error loading cache for agent[id=" + agentId + "]", t);
@@ -304,6 +312,10 @@ class AgentConditionCache extends AbstractConditionCache {
}
addTo("eventsCache", eventsCache, eventComposite.getResourceId(), cacheElement, alertConditionId, stats);
+ } else if (alertConditionCategory == AlertConditionCategory.DRIFT) {
+ AlertConditionDriftCategoryComposite driftComposite = (AlertConditionDriftCategoryComposite) composite;
+ DriftCacheElement cacheElement = new DriftCacheElement(alertConditionOperator, alertConditionId);
+ addTo("driftCache", driftCache, driftComposite.getResourceId(), cacheElement, alertConditionId, stats);
}
}
@@ -340,7 +352,7 @@ class AgentConditionCache extends AbstractConditionCache {
log.debug("Check Measurements[size=" + measurementData.length + "] - " + stats);
} catch (Throwable t) {
// don't let any exceptions bubble up to the calling SLSB layer
- log.error("Error during cache processing for agent[id=" + agentId + "]", t);
+ log.error("Error during measurement data cache processing for agent[id=" + agentId + "]", t);
}
return stats;
}
@@ -372,8 +384,9 @@ class AgentConditionCache extends AbstractConditionCache {
private HashMap<Integer, HashMap<String, ArrayList<CallTimeDataValue>>> produceOrderedCallTimeDataStructure(
CallTimeData... callTime) {
long beginTime = 0;
- if (log.isDebugEnabled())
+ if (log.isDebugEnabled()) {
beginTime = System.nanoTime();
+ }
//Insert all CallTimeDataValue in data structure
HashMap<Integer, HashMap<String, ArrayList<CallTimeDataValue>>> order = new HashMap<Integer, HashMap<String, ArrayList<CallTimeDataValue>>>();
@@ -396,9 +409,10 @@ class AgentConditionCache extends AbstractConditionCache {
for (ArrayList<CallTimeDataValue> bottomList : topList.values())
Collections.sort(bottomList, getCallTimeComparator());
- if (log.isDebugEnabled())
+ if (log.isDebugEnabled()) {
log.debug("sorting call-time data during alerting took: "
+ TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - beginTime) + "ms");
+ }
return order;
}
@@ -447,11 +461,32 @@ class AgentConditionCache extends AbstractConditionCache {
AlertConditionCacheMonitor.getMBean().incrementEventCacheElementMatches(stats.matched);
AlertConditionCacheMonitor.getMBean().incrementEventProcessingTime(stats.getAge());
- if (log.isDebugEnabled())
+ if (log.isDebugEnabled()) {
log.debug("Check Events[size=" + events.length + "] - " + stats);
+ }
+ } catch (Throwable t) {
+ // don't let any exceptions bubble up to the calling SLSB layer
+ log.error("Error during event cache processing for agent[id=" + agentId + "]", t);
+ }
+ return stats;
+ }
+
+ public AlertConditionCacheStats checkConditions(DriftChangeSetSummary driftChangeSetSummary) {
+ AlertConditionCacheStats stats = new AlertConditionCacheStats();
+ try {
+ int resourceId = driftChangeSetSummary.getResourceId();
+ List<DriftCacheElement> cacheElements = lookupDriftCacheElements(resourceId);
+
+ processCacheElements(cacheElements, (Object) "", driftChangeSetSummary.getCreatedTime(), stats);
+
+ AlertConditionCacheMonitor.getMBean().incrementDriftCacheElementMatches(stats.matched);
+ AlertConditionCacheMonitor.getMBean().incrementDriftProcessingTime(stats.getAge());
+ if (log.isDebugEnabled()) {
+ log.debug("Check Drift[resourceId=" + resourceId + "] - " + stats);
+ }
} catch (Throwable t) {
// don't let any exceptions bubble up to the calling SLSB layer
- log.error("Error during cache processing for agent[id=" + agentId + "]", t);
+ log.error("Error during drift cache processing for agent[id=" + agentId + "]", t);
}
return stats;
}
@@ -472,6 +507,10 @@ class AgentConditionCache extends AbstractConditionCache {
return eventsCache.get(resourceId); // yup, might be null
}
+ private List<DriftCacheElement> lookupDriftCacheElements(int resourceId) {
+ return driftCache.get(resourceId); // yup, might be null
+ }
+
private Double getCalculatedBaselineValue(int conditionId, AlertConditionBaselineCategoryComposite composite,
String optionStatus, Double threshold) {
int baselineId = composite.getBaselineId();
@@ -517,6 +556,8 @@ class AgentConditionCache extends AbstractConditionCache {
return AlertConditionCacheUtils.getMapListCount(callTimeCache);
} else if (cache == AlertConditionCacheCoordinator.Cache.EventsCache) {
return AlertConditionCacheUtils.getMapListCount(eventsCache);
+ } else if (cache == AlertConditionCacheCoordinator.Cache.DriftCache) {
+ return AlertConditionCacheUtils.getMapListCount(driftCache);
} else {
throw new IllegalArgumentException("The " + AgentConditionCache.class.getSimpleName()
+ " either does not manage caches of type " + cache.type + ", or does not support obtaining their size");
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheCoordinator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheCoordinator.java
index f24b7d9..db4b0b9 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheCoordinator.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheCoordinator.java
@@ -40,6 +40,7 @@ import org.rhq.enterprise.server.alert.engine.AlertConditionCacheStats;
import org.rhq.enterprise.server.alert.engine.model.AbstractCacheElement;
import org.rhq.enterprise.server.cloud.StatusManagerLocal;
import org.rhq.enterprise.server.core.AgentManagerLocal;
+import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
import org.rhq.enterprise.server.util.LookupUtil;
/**
@@ -66,7 +67,8 @@ public final class AlertConditionCacheCoordinator {
ResourceOperationCache(Type.Global), //
AvailabilityCache(Type.Global), //
EventsCache(Type.Agent), //
- ResourceConfigurationCache(Type.Global);
+ ResourceConfigurationCache(Type.Global), //
+ DriftCache(Type.Agent);
public enum Type {
Global, //
@@ -298,6 +300,35 @@ public final class AlertConditionCacheCoordinator {
return stats;
}
+ public AlertConditionCacheStats checkConditions(DriftChangeSetSummary driftChangeSetSummary) {
+ if (driftChangeSetSummary == null) {
+ return new AlertConditionCacheStats();
+ }
+
+ Integer agentId = getAgentId(driftChangeSetSummary);
+ if (agentId == null) {
+ log.error("Could not find agent for resourceId = " + driftChangeSetSummary.getResourceId());
+ return new AlertConditionCacheStats();
+ }
+
+ AlertConditionCacheStats stats = null;
+ AgentConditionCache agentCache = null;
+ agentReadWriteLock.readLock().lock();
+ try {
+ agentCache = agentCaches.get(agentId);
+ } catch (Throwable t) {
+ log.error("Error during checkConditions", t); // don't let any exceptions bubble up to the calling SLSB layer
+ } finally {
+ agentReadWriteLock.readLock().unlock();
+ }
+ if (agentCache != null) {
+ stats = agentCache.checkConditions(driftChangeSetSummary);
+ } else {
+ stats = new AlertConditionCacheStats();
+ }
+ return stats;
+ }
+
public AlertConditionCacheStats checkConditions(Availability... availabilities) {
AlertConditionCacheStats stats = null;
try {
@@ -311,6 +342,17 @@ public final class AlertConditionCacheCoordinator {
return stats;
}
+ private Integer getAgentId(DriftChangeSetSummary driftChangeSetSummary) {
+ try {
+ int resourceId = driftChangeSetSummary.getResourceId();
+ Integer agentId = agentManager.getAgentIdByResourceId(resourceId);
+ return agentId;
+ } catch (Throwable t) {
+ log.error("Error looking up agent by DriftChangeSet", t);
+ }
+ return null;
+ }
+
private Integer getAgentId(EventSource source) {
try {
int resourceId = source.getResource().getId();
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheUtils.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheUtils.java
index 6fc8407..2e3ace3 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheUtils.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/AlertConditionCacheUtils.java
@@ -49,6 +49,11 @@ class AlertConditionCacheUtils {
return AlertConditionOperator.GREATER_THAN_OR_EQUAL_TO;
}
+ if (category == AlertConditionCategory.DRIFT) {
+ // any drift that is detected infers a change to its previous state
+ return AlertConditionOperator.CHANGES;
+ }
+
if (category == AlertConditionCategory.RESOURCE_CONFIG || category == AlertConditionCategory.CHANGE
|| category == AlertConditionCategory.TRAIT) {
// the model currently supports CHANGE as a category type instead of a comparator
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/mbean/AlertConditionCacheMonitor.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/mbean/AlertConditionCacheMonitor.java
index e997ac1..1442dce 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/mbean/AlertConditionCacheMonitor.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/mbean/AlertConditionCacheMonitor.java
@@ -42,6 +42,7 @@ public class AlertConditionCacheMonitor implements AlertConditionCacheMonitorMBe
public AtomicInteger measurementCacheElementMatches = new AtomicInteger();
public AtomicInteger resourceConfigurationCacheElementMatches = new AtomicInteger();
public AtomicInteger operationCacheElementMatches = new AtomicInteger();
+ public AtomicInteger driftCacheElementMatches = new AtomicInteger();
public AtomicInteger totalCacheElementMatches = new AtomicInteger();
public AtomicLong availabilityProcessingTime = new AtomicLong();
@@ -49,6 +50,7 @@ public class AlertConditionCacheMonitor implements AlertConditionCacheMonitorMBe
public AtomicLong measurementProcessingTime = new AtomicLong();
public AtomicLong resourceConfigurationProcessingTime = new AtomicLong();
public AtomicLong operationProcessingTime = new AtomicLong();
+ public AtomicLong driftProcessingTime = new AtomicLong();
public AtomicLong totalProcessingTime = new AtomicLong();
private static MBeanServer mbeanServer;
@@ -97,6 +99,11 @@ public class AlertConditionCacheMonitor implements AlertConditionCacheMonitorMBe
AlertConditionCacheCoordinator.Cache.ResourceOperationCache);
}
+ public int getDriftCacheElementCount() {
+ return AlertConditionCacheCoordinator.getInstance().getCacheSize(
+ AlertConditionCacheCoordinator.Cache.DriftCache);
+ }
+
public Map<String, Integer> getCacheCounts() {
return AlertConditionCacheCoordinator.getInstance().getCacheCounts();
}
@@ -121,6 +128,10 @@ public class AlertConditionCacheMonitor implements AlertConditionCacheMonitorMBe
return operationCacheElementMatches.get();
}
+ public int getDriftCacheElementMatches() {
+ return driftCacheElementMatches.get();
+ }
+
public int getTotalCacheElementMatches() {
return totalCacheElementMatches.get();
}
@@ -150,6 +161,11 @@ public class AlertConditionCacheMonitor implements AlertConditionCacheMonitorMBe
totalCacheElementMatches.addAndGet(matches);
}
+ public void incrementDriftCacheElementMatches(int matches) {
+ driftCacheElementMatches.addAndGet(matches);
+ totalCacheElementMatches.addAndGet(matches);
+ }
+
public long getAvailabilityProcessingTime() {
return availabilityProcessingTime.get();
}
@@ -166,6 +182,10 @@ public class AlertConditionCacheMonitor implements AlertConditionCacheMonitorMBe
return operationProcessingTime.get();
}
+ public long getDriftProcessingTime() {
+ return driftProcessingTime.get();
+ }
+
public long getTotalProcessingTime() {
return totalProcessingTime.get();
}
@@ -195,6 +215,11 @@ public class AlertConditionCacheMonitor implements AlertConditionCacheMonitorMBe
totalProcessingTime.addAndGet(moreMillis);
}
+ public void incrementDriftProcessingTime(long moreMillis) {
+ driftProcessingTime.addAndGet(moreMillis);
+ totalProcessingTime.addAndGet(moreMillis);
+ }
+
public void reloadCaches() {
LookupUtil.getAlertConditionCacheManager().reloadAllCaches();
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/mbean/AlertConditionCacheMonitorMBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/mbean/AlertConditionCacheMonitorMBean.java
index 6af167b..9e0a1f8 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/mbean/AlertConditionCacheMonitorMBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/mbean/AlertConditionCacheMonitorMBean.java
@@ -40,6 +40,8 @@ public interface AlertConditionCacheMonitorMBean {
public long getOperationProcessingTime();
+ public long getDriftProcessingTime();
+
public void incrementAvailabilityProcessingTime(long moreMillis);
public void incrementMeasurementProcessingTime(long moreMillis);
@@ -50,6 +52,8 @@ public interface AlertConditionCacheMonitorMBean {
public void incrementOperationProcessingTime(long moreMillis);
+ public void incrementDriftProcessingTime(long moreMillis);
+
/*
* for current congestion
*/
@@ -63,6 +67,8 @@ public interface AlertConditionCacheMonitorMBean {
public int getOperationCacheElementCount();
+ public int getDriftCacheElementCount();
+
public Map<String, Integer> getCacheCounts();
/*
@@ -80,6 +86,8 @@ public interface AlertConditionCacheMonitorMBean {
public int getOperationCacheElementMatches();
+ public int getDriftCacheElementMatches();
+
public void incrementAvailabilityCacheElementMatches(int matches);
public void incrementMeasurementCacheElementMatches(int matches);
@@ -90,6 +98,8 @@ public interface AlertConditionCacheMonitorMBean {
public void incrementOperationCacheElementMatches(int matches);
+ public void incrementDriftCacheElementMatches(int matches);
+
/*
* cache contents
*/
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/AbstractCacheElement.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/AbstractCacheElement.java
index f91e167..e09ddae 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/AbstractCacheElement.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/AbstractCacheElement.java
@@ -68,8 +68,10 @@ public abstract class AbstractCacheElement<T> {
if (value == null) {
if ((operator == AlertConditionOperator.CHANGES) || (operator == AlertConditionOperator.CHANGES_TO)
|| (operator == AlertConditionOperator.CHANGES_FROM)) {
- log.debug("Possible invalid Cache Element: " + "condition with id=" + conditionId + " "
- + "and operator='" + operator.toString() + "' " + "passed a null value argument");
+ if (log.isDebugEnabled()) {
+ log.debug("Possible invalid Cache Element: " + "condition with id=" + conditionId + " "
+ + "and operator='" + operator.toString() + "' " + "passed a null value argument");
+ }
} else {
throw new InvalidCacheElementException("Invalid Cache Element: " + "condition with id=" + conditionId
+ " " + "and operator='" + operator.toString() + "' " + "requires a non-null value");
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/DriftCacheElement.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/DriftCacheElement.java
new file mode 100644
index 0000000..d11ab51
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/DriftCacheElement.java
@@ -0,0 +1,45 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.alert.engine.model;
+
+public class DriftCacheElement extends AbstractCacheElement<Object> {
+
+ public DriftCacheElement(AlertConditionOperator operator, int conditionTriggerId) {
+ super(operator, "", conditionTriggerId);
+ }
+
+ @Override
+ public boolean matches(Object providedValue, Object... extraParams) {
+ if (alertConditionOperator == AlertConditionOperator.CHANGES) {
+ return true; // any drift report we get implies the content has changed
+ } else {
+ throw new UnsupportedAlertConditionOperatorException(getClass().getSimpleName() + " does not support "
+ + alertConditionOperator);
+ }
+ }
+
+ @Override
+ public AlertConditionOperator.Type getOperatorSupportsType(AlertConditionOperator operator) {
+ if (operator == AlertConditionOperator.CHANGES) {
+ return operator.getDefaultType();
+ }
+
+ return AlertConditionOperator.Type.NONE;
+ }
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/i18n/AlertI18NResourceKeys.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/i18n/AlertI18NResourceKeys.java
index 1de3d85..fb5f392 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/i18n/AlertI18NResourceKeys.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/i18n/AlertI18NResourceKeys.java
@@ -28,34 +28,38 @@ import mazz.i18n.annotation.I18NResourceBundle;
@I18NResourceBundle(baseName = "alert-messages", defaultLocale = "en")
public interface AlertI18NResourceKeys {
+ @I18NMessages( { @I18NMessage("Drift detected"), @I18NMessage(locale = "de", value = "Ãnderung erkannt") })
+ String ALERT_CONFIG_PROPS_CB_DRIFT = "alert.config.props.CB.Drift";
+
+ @I18NMessages( { @I18NMessage("Drift detected"), @I18NMessage(locale = "de", value = "Ãnderung erkannt") })
+ String ALERT_CONFIG_PROPS_CB_DRIFT_SHORT = "alert.config.props.CB.Drift.short";
+
@I18NMessages( { @I18NMessage("Availability goes {0}"),
- @I18NMessage(locale = "de", value = "Verfgbarkeit wird {0}") })
+ @I18NMessage(locale = "de", value = "Verfï¿œgbarkeit wird {0}") })
String ALERT_CONFIG_PROPS_CB_AVAILABILITY = "alert.config.props.CB.Availability";
- @I18NMessages( { @I18NMessage("Avail goes {0}"),
- @I18NMessage(locale = "de", value = "Verf. wird {0}") })
+ @I18NMessages( { @I18NMessage("Avail goes {0}"), @I18NMessage(locale = "de", value = "Verf. wird {0}") })
String ALERT_CONFIG_PROPS_CB_AVAILABILITY_SHORT = "alert.config.props.CB.Availability.short";
@I18NMessages( { @I18NMessage("Event Severity: {0}"),
@I18NMessage(locale = "de", value = "Schwere des Ereignesses: {0}") })
String ALERT_CONFIG_PROPS_CB_EVENT_SEVERITY = "alert.config.props.CB.EventSeverity";
- @I18NMessages( { @I18NMessage("Sev: {0}"),
- @I18NMessage(locale = "de", value = "Schwere: {0}") })
+ @I18NMessages( { @I18NMessage("Sev: {0}"), @I18NMessage(locale = "de", value = "Schwere: {0}") })
String ALERT_CONFIG_PROPS_CB_EVENT_SEVERITY_SHORT = "alert.config.props.CB.EventSeverity.short";
@I18NMessages( { @I18NMessage("Event Severity: {0} and matching expression \"{1}\""),
- @I18NMessage(locale = "de", value = "Schwere des Ereignesses: {0} und zugehriger Ausdruck \"{1}\"") })
+ @I18NMessage(locale = "de", value = "Schwere des Ereignesses: {0} und zugehï¿œriger Ausdruck \"{1}\"") })
String ALERT_CONFIG_PROPS_CB_EVENT_SEVERITY_REGEX_MATCH = "alert.config.props.CB.EventSeverity.RegexMatch";
@I18NMessages( { @I18NMessage("Sev: {0} & exp \"{1}\""),
@I18NMessage(locale = "de", value = "Schwere: {0} & Ausdruck \"{1}\"") })
String ALERT_CONFIG_PROPS_CB_EVENT_SEVERITY_REGEX_MATCH_SHORT = "alert.config.props.CB.EventSeverity.RegexMatch.short";
- @I18NMessages( { @I18NMessage("value changed"), @I18NMessage(locale = "de", value = "Der Wert hat sich gendert") })
+ @I18NMessages( { @I18NMessage("value changed"), @I18NMessage(locale = "de", value = "Der Wert hat sich geï¿œndert") })
String ALERT_CURRENT_LIST_VALUE_CHANGED = "alert.current.list.ValueChanged";
- @I18NMessages( { @I18NMessage("val chg"), @I18NMessage(locale = "de", value = "Wertnd.") })
+ @I18NMessages( { @I18NMessage("val chg"), @I18NMessage(locale = "de", value = "Wertï¿œnd.") })
String ALERT_CURRENT_LIST_VALUE_CHANGED_SHORT = "alert.current.list.ValueChanged.short";
@I18NMessages( {
@@ -64,9 +68,7 @@ public interface AlertI18NResourceKeys {
+ "\\ - Details: {3}\\n\\\n") })
String ALERT_EMAIL_CONDITION_LOG_FORMAT = "alert.email.condition.log.format";
- @I18NMessages( {
- @I18NMessage("\\ - Cond {0}: {1}\\n\\\n" + "\\ - Time: {2}\\n\\\n" + "\\ - Det: {3}\\n\\\n"),
- @I18NMessage(locale = "de", value = " - Bed {0}: {1}\\n\\\n - Zeit: {2}\\n\\\n"
- + "\\ - Det: {3}\\n\\\n") })
+ @I18NMessages( { @I18NMessage("\\ - Cond {0}: {1}\\n\\\n" + "\\ - Time: {2}\\n\\\n" + "\\ - Det: {3}\\n\\\n"),
+ @I18NMessage(locale = "de", value = " - Bed {0}: {1}\\n\\\n - Zeit: {2}\\n\\\n" + "\\ - Det: {3}\\n\\\n") })
String ALERT_EMAIL_CONDITION_LOG_FORMAT_SHORT = "alert.email.condition.log.format.short";
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
index b1a7415..738d69f 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java
@@ -18,6 +18,10 @@
*/
package org.rhq.enterprise.server.drift;
+import static java.util.Arrays.asList;
+import static javax.ejb.TransactionAttributeType.NOT_SUPPORTED;
+import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
+
import java.io.File;
import java.io.InputStream;
import java.util.HashSet;
@@ -36,6 +40,9 @@ import javax.jms.Session;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
+import difflib.DiffUtils;
+import difflib.Patch;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -52,11 +59,11 @@ import org.rhq.core.domain.drift.DriftChangeSet;
import org.rhq.core.domain.drift.DriftComposite;
import org.rhq.core.domain.drift.DriftConfiguration;
import org.rhq.core.domain.drift.DriftConfigurationComparator;
-import org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode;
import org.rhq.core.domain.drift.DriftConfigurationDefinition;
import org.rhq.core.domain.drift.DriftFile;
import org.rhq.core.domain.drift.DriftSnapshot;
import org.rhq.core.domain.drift.FileDiffReport;
+import org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.RHQConstants;
@@ -64,6 +71,7 @@ import org.rhq.enterprise.server.agentclient.AgentClient;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.core.AgentManagerLocal;
import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer;
+import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginContainer;
import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginFacet;
import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginManager;
@@ -71,13 +79,6 @@ import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
import org.rhq.enterprise.server.util.LookupUtil;
-import difflib.DiffUtils;
-import difflib.Patch;
-
-import static java.util.Arrays.asList;
-import static javax.ejb.TransactionAttributeType.NOT_SUPPORTED;
-import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
-
/**
* The SLSB supporting Drift management to clients.
*
@@ -100,10 +101,10 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
binaryFileTypes.add("jar");
binaryFileTypes.add("war");
binaryFileTypes.add("ear");
- binaryFileTypes.add("sar"); // jboss service
- binaryFileTypes.add("har"); // hibernate archive
- binaryFileTypes.add("rar"); // resource adapter
- binaryFileTypes.add("wsr"); // jboss web service archive
+ binaryFileTypes.add("sar"); // jboss service
+ binaryFileTypes.add("har"); // hibernate archive
+ binaryFileTypes.add("rar"); // resource adapter
+ binaryFileTypes.add("wsr"); // jboss web service archive
binaryFileTypes.add("zip");
binaryFileTypes.add("tar");
binaryFileTypes.add("bz2");
@@ -351,9 +352,10 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
@Override
@TransactionAttribute(NOT_SUPPORTED)
- public void saveChangeSet(Subject subject, int resourceId, File changeSetZip) throws Exception {
+ public DriftChangeSetSummary saveChangeSet(Subject subject, int resourceId, File changeSetZip) throws Exception {
DriftServerPluginFacet driftServerPlugin = getServerPlugin();
- driftServerPlugin.saveChangeSet(subject, resourceId, changeSetZip);
+ DriftChangeSetSummary summary = driftServerPlugin.saveChangeSet(subject, resourceId, changeSetZip);
+ return summary;
}
@Override
@@ -415,8 +417,8 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
List<String> content2List = asList(content2.split("\\n"));
Patch patch = DiffUtils.diff(content1List, content2List);
- List<String> deltas = DiffUtils.generateUnifiedDiff(drift1.getPath(), drift2.getPath(), content1List, patch,
- 10);
+ List<String> deltas = DiffUtils
+ .generateUnifiedDiff(drift1.getPath(), drift2.getPath(), content1List, patch, 10);
return new FileDiffReport(patch.getDeltas().size(), deltas);
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
index c3a34bf..105164f 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
@@ -19,6 +19,8 @@
*/
package org.rhq.enterprise.server.drift;
+import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
+
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
@@ -73,11 +75,10 @@ import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.agentclient.AgentClient;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.core.AgentManagerLocal;
+import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
-import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
-
/**
* The SLSB method implementation needed to support the JPA (RHQ Default) Drift Server Plugin.
*
@@ -222,12 +223,15 @@ public class JPADriftServerBean implements JPADriftServerLocal {
@Override
@TransactionAttribute(REQUIRES_NEW)
- public void storeChangeSet(Subject subject, final int resourceId, File changeSetZip) throws Exception {
+ public DriftChangeSetSummary storeChangeSet(Subject subject, final int resourceId, File changeSetZip)
+ throws Exception {
final Resource resource = entityManager.find(Resource.class, resourceId);
if (null == resource) {
throw new IllegalArgumentException("Resource not found [" + resourceId + "]");
}
+ final DriftChangeSetSummary summary = new DriftChangeSetSummary();
+
try {
ZipUtil.walkZipFile(changeSetZip, new ChangeSetFileVisitor() {
@@ -254,6 +258,11 @@ public class JPADriftServerBean implements JPADriftServerLocal {
driftChangeSet = new JPADriftChangeSet(resource, version, category, config);
entityManager.persist(driftChangeSet);
+ summary.setCategory(category);
+ summary.setResourceId(resourceId);
+ summary.setDriftConfigurationName(reader.getHeaders().getDriftConfigurationName());
+ summary.setCreatedTime(driftChangeSet.getCtime());
+
for (FileEntry entry : reader) {
JPADriftFile oldDriftFile = getDriftFile(entry.getOldSHA(), emptyDriftFiles);
JPADriftFile newDriftFile = getDriftFile(entry.getNewSHA(), emptyDriftFiles);
@@ -269,6 +278,14 @@ public class JPADriftServerBean implements JPADriftServerLocal {
JPADrift drift = new JPADrift(driftChangeSet, path, entry.getType(), oldDriftFile,
newDriftFile);
entityManager.persist(drift);
+
+ // we are taking advantage of the fact that we know the summary is only used by the server
+ // if the change set is a DRIFT report. If its a coverage report, it is not used (we do
+ // not alert on coverage reports) - so don't waste memory by collecting all the paths
+ // when we know they aren't going to be used anyway.
+ if (category == DriftChangeSetCategory.DRIFT) {
+ summary.addDriftPathname(path);
+ }
}
// send a message to the agent requesting the empty JPADriftFile content
if (!emptyDriftFiles.isEmpty()) {
@@ -295,6 +312,9 @@ public class JPADriftServerBean implements JPADriftServerLocal {
return true;
}
});
+
+ return summary;
+
} catch (Exception e) {
String msg = "Failed to store drift changeset for ";
if (null != resource) {
@@ -304,6 +324,7 @@ public class JPADriftServerBean implements JPADriftServerLocal {
}
log.error(msg, e);
+ return null;
} finally {
// delete the changeSetFile?
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerLocal.java
index 7142ead..e4c57df 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerLocal.java
@@ -33,6 +33,7 @@ import org.rhq.core.domain.drift.JPADrift;
import org.rhq.core.domain.drift.JPADriftChangeSet;
import org.rhq.core.domain.drift.JPADriftFile;
import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
/**
* The SLSB methods needed to support the JPA (RHQ Default) Drift Server Plugin.
@@ -94,9 +95,10 @@ public interface JPADriftServerLocal {
*
* @param resourceId The resource for which the change-set is being reported.
* @param changeSetZip The change-set zip file
+ * @return a summary of the change set that was persisted
* @throws Exception
*/
- void storeChangeSet(Subject subject, int resourceId, File changeSetZip) throws Exception;
+ DriftChangeSetSummary storeChangeSet(Subject subject, int resourceId, File changeSetZip) throws Exception;
/**
* This method stores the provided drift files. The files should correspond to requested drift files.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftChangeSetSummary.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftChangeSetSummary.java
new file mode 100644
index 0000000..8148690
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftChangeSetSummary.java
@@ -0,0 +1,93 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.plugin.pc.drift;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.rhq.core.domain.drift.DriftChangeSetCategory;
+
+/**
+ * Provides a summary of a change set.
+ *
+ * This object is mainly used to pass to the alert subsystem in order to determine which alerts should be triggered.
+ * It doesn't have all the information that a DriftChangeSet has - it's a summary that only has the data necessary
+ * for the alert subsystem to be able to determine what alerts need to be triggered.
+ *
+ * @author John Mazzitelli
+ */
+public class DriftChangeSetSummary {
+ private long createdTime;
+ private DriftChangeSetCategory category;
+ private int resourceId;
+ private String driftConfigurationName;
+ private List<String> driftPathnames;
+
+ public long getCreatedTime() {
+ return createdTime;
+ }
+
+ public void setCreatedTime(long createdTime) {
+ this.createdTime = createdTime;
+ }
+
+ public DriftChangeSetCategory getCategory() {
+ return category;
+ }
+
+ public void setCategory(DriftChangeSetCategory category) {
+ this.category = category;
+ }
+
+ public int getResourceId() {
+ return resourceId;
+ }
+
+ public void setResourceId(int resourceId) {
+ this.resourceId = resourceId;
+ }
+
+ public String getDriftConfigurationName() {
+ return driftConfigurationName;
+ }
+
+ public void setDriftConfigurationName(String driftConfigurationName) {
+ this.driftConfigurationName = driftConfigurationName;
+ }
+
+ public List<String> getDriftPathnames() {
+ return obtainDriftPathnamesList();
+ }
+
+ public void setDriftPathnames(List<String> driftPathnames) {
+ this.driftPathnames = driftPathnames;
+ }
+
+ public void addDriftPathname(String driftPathname) {
+ obtainDriftPathnamesList().add(driftPathname);
+ }
+
+ private List<String> obtainDriftPathnamesList() {
+ if (driftPathnames == null) {
+ driftPathnames = new ArrayList<String>();
+ }
+ return driftPathnames;
+ }
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftServerPluginFacet.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftServerPluginFacet.java
index 7a960dd..cedf437 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftServerPluginFacet.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/drift/DriftServerPluginFacet.java
@@ -72,7 +72,16 @@ public interface DriftServerPluginFacet {
*/
DriftFile getDriftFile(Subject subject, String hashId) throws Exception;
- void saveChangeSet(Subject subject, int resourceId, File changeSetZip) throws Exception;
+ /**
+ * Parses the given change set file and persists its data.
+ *
+ * @param subject
+ * @param resourceId
+ * @param changeSetZip
+ * @return a summary of what was in the change set file
+ * @throws Exception
+ */
+ DriftChangeSetSummary saveChangeSet(Subject subject, int resourceId, File changeSetZip) throws Exception;
void saveChangeSetFiles(Subject subject, File changeSetFilesZip) throws Exception;
diff --git a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
index 561d434..644ee60 100644
--- a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
+++ b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
@@ -19,6 +19,8 @@
package org.rhq.enterprise.server.plugins.drift.mongodb;
+import static org.rhq.enterprise.server.util.LookupUtil.getResourceManager;
+
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
@@ -46,6 +48,7 @@ import org.rhq.core.domain.criteria.DriftCriteria;
import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.drift.Drift;
import org.rhq.core.domain.drift.DriftChangeSet;
+import org.rhq.core.domain.drift.DriftChangeSetCategory;
import org.rhq.core.domain.drift.DriftComposite;
import org.rhq.core.domain.drift.DriftFile;
import org.rhq.core.domain.drift.DriftSnapshot;
@@ -58,14 +61,13 @@ import org.rhq.core.util.ZipUtil;
import org.rhq.core.util.file.FileUtil;
import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent;
import org.rhq.enterprise.server.plugin.pc.ServerPluginContext;
+import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginFacet;
import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBChangeSet;
import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBChangeSetEntry;
import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBFile;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
-import static org.rhq.enterprise.server.util.LookupUtil.getResourceManager;
-
public class MongoDBDriftServer implements DriftServerPluginFacet, ServerPluginComponent {
//private final Log log = LogFactory.getLog(MongoDBDriftServer.class);
@@ -101,7 +103,11 @@ public class MongoDBDriftServer implements DriftServerPluginFacet, ServerPluginC
}
@Override
- public void saveChangeSet(final Subject subject, final int resourceId, final File changeSetZip) throws Exception {
+ public DriftChangeSetSummary saveChangeSet(final Subject subject, final int resourceId, final File changeSetZip)
+ throws Exception {
+
+ final DriftChangeSetSummary summary = new DriftChangeSetSummary();
+
ZipUtil.walkZipFile(changeSetZip, new ZipUtil.ZipEntryVisitor() {
@Override
public boolean visit(ZipEntry zipEntry, ZipInputStream stream) throws Exception {
@@ -115,18 +121,33 @@ public class MongoDBDriftServer implements DriftServerPluginFacet, ServerPluginC
changeSet.setDriftConfigurationId(1);
changeSet.setVersion(changeSetVersions++);
+ summary.setCategory(headers.getType());
+ summary.setResourceId(resourceId);
+ summary.setDriftConfigurationName(headers.getDriftConfigurationName());
+ summary.setCreatedTime(changeSet.getCtime());
+
for (FileEntry fileEntry : reader) {
String path = FileUtil.useForwardSlash(fileEntry.getFile());
MongoDBChangeSetEntry entry = new MongoDBChangeSetEntry();
entry.setCategory(fileEntry.getType());
entry.setPath(path);
changeSet.add(entry);
+
+ // we are taking advantage of the fact that we know the summary is only used by the server
+ // if the change set is a DRIFT report. If its a coverage report, it is not used (we do
+ // not alert on coverage reports) - so don't waste memory by collecting all the paths
+ // when we know they aren't going to be used anyway.
+ if (headers.getType() == DriftChangeSetCategory.DRIFT) {
+ summary.addDriftPathname(path);
+ }
}
ds.save(changeSet);
return true;
}
});
+
+ return summary;
}
@Override
diff --git a/modules/enterprise/server/plugins/drift-rhq/src/main/java/org/rhq/enterprise/server/plugins/drift/JPADriftServerPluginComponent.java b/modules/enterprise/server/plugins/drift-rhq/src/main/java/org/rhq/enterprise/server/plugins/drift/JPADriftServerPluginComponent.java
index 1dadcb9..ee542d0 100644
--- a/modules/enterprise/server/plugins/drift-rhq/src/main/java/org/rhq/enterprise/server/plugins/drift/JPADriftServerPluginComponent.java
+++ b/modules/enterprise/server/plugins/drift-rhq/src/main/java/org/rhq/enterprise/server/plugins/drift/JPADriftServerPluginComponent.java
@@ -19,6 +19,8 @@
*/
package org.rhq.enterprise.server.plugins.drift;
+import static org.rhq.enterprise.server.util.LookupUtil.getJPADriftServer;
+
import java.io.File;
import org.apache.commons.logging.Log;
@@ -37,10 +39,9 @@ import org.rhq.core.domain.drift.JPADriftChangeSet;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent;
import org.rhq.enterprise.server.plugin.pc.ServerPluginContext;
+import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginFacet;
-import static org.rhq.enterprise.server.util.LookupUtil.getJPADriftServer;
-
/**
* A drift server-side plugin component that the server uses to process drift files.
*
@@ -104,8 +105,8 @@ public class JPADriftServerPluginComponent implements DriftServerPluginFacet, Se
}
@Override
- public void saveChangeSet(Subject subject, int resourceId, File changeSetZip) throws Exception {
- getJPADriftServer().storeChangeSet(subject, resourceId, changeSetZip);
+ public DriftChangeSetSummary saveChangeSet(Subject subject, int resourceId, File changeSetZip) throws Exception {
+ return getJPADriftServer().storeChangeSet(subject, resourceId, changeSetZip);
}
@Override
diff --git a/modules/plugins/rhq-server/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/rhq-server/src/main/resources/META-INF/rhq-plugin.xml
index cbcbf44..9f0f6a3 100644
--- a/modules/plugins/rhq-server/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/rhq-server/src/main/resources/META-INF/rhq-plugin.xml
@@ -48,6 +48,8 @@
description="The number of elements in the alerts cache that check conditions against operation history data"/>
<metric property="ResourceConfigurationCacheElementCount" category="throughput" displayType="summary"
description="The number of elements in the alerts cache that check conditions against resource configuration data"/>
+ <metric property="DriftCacheElementCount" category="throughput" displayType="summary"
+ description="The number of elements in the alerts cache that check conditions against drift data"/>
<metric property="TotalCacheElementMatches" category="throughput" displayType="summary" measurementType="trendsup"
description="The total number of times ANY cache element has triggered against incoming data since this RHQ Server instance was started"/>
@@ -61,6 +63,8 @@
description="The total number of times resource configuration-based conditions have triggered against incoming data since this RHQ Server instance was started"/>
<metric property="OperationCacheElementMatches" category="throughput" displayType="summary" measurementType="trendsup"
description="The total number of times operation-based conditions have triggered against incoming data since this RHQ Server instance was started"/>
+ <metric property="DriftCacheElementMatches" category="throughput" displayType="summary" measurementType="trendsup"
+ description="The total number of times drift conditions have triggered against incoming data since this RHQ Server instance was started"/>
<metric property="TotalProcessingTime" units="milliseconds" displayType="summary" measurementType="trendsup"
description="The total amount of time spent by the alerts cache processing ALL types of data"/>
@@ -74,6 +78,8 @@
description="The total amount of time spent by the alerts cache processing resource configuration data"/>
<metric property="OperationProcessingTime" units="milliseconds" displayType="summary" measurementType="trendsup"
description="The total amount of time spent by the alerts cache processing operation history data"/>
+ <metric property="DriftProcessingTime" units="milliseconds" displayType="summary" measurementType="trendsup"
+ description="The total amount of time spent by the alerts cache processing drift data"/>
</service>
12 years, 9 months
[rhq] modules/core modules/enterprise
by John Sanda
modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/drift/DriftAgentService.java | 1
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/drift/DriftServerService.java | 1
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java | 4
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java | 10
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftClient.java | 3
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetectionSummary.java | 78 ++++
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java | 165 +++++++---
modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java | 123 +++++--
modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftClientTestStub.java | 18 -
modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java | 120 +++++++
modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftManagerTest.java | 58 ++-
modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftTest.java | 14
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftServerServiceImpl.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java | 12
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java | 5
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java | 4
16 files changed, 498 insertions(+), 120 deletions(-)
New commits:
commit 3f3397557aedabbd11420c022344776d08f76e2e
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Sep 27 16:35:22 2011 -0400
Adding error handling logic on the agent during drift detection
This commit introduces several changes and a changed work flow to
address some boundary conditions that can arise when the server fails
to receive a change set report. The issue stems from the way we stream
the change set report to the server. Because the request is processed
aysnchronously, we cannot know for certainty if/when errors arise in the
comm layer.
When DriftDetector runs, a new snapshot file is generated, and now a
copy of the previous version snapshot is maintained as well. After the
server processes the change set, it now sends an ack to the agent. This
lets the agent know that the change set was successfully persisted on
the server. The agent then cleans up, deleting the previous version
snapshot, and the change set zip file.
If drift detection runs again before the agent receives the
ackowlegement, drift detection is skipped. The most likely scenario for
not receiving an acknowledgement would be a network error or a down
server.
If any errors occur during drift detection, which includes sending the
change set to the server, the agent will attempt to revert back to the
previous version snapshot. This is to ensure we have a consistent
snapshot on disk with which to work.
This commit also fixes a bug in the drift inventory sync code. In
situations where there are existing change sets on the server, and the
agent has to fetch a snapshot from the server, the snapshot version was
getting set incorrectly. This is because the snapshot was not being
built correctly. Change sets were being applied out of order. This is
fixed now.
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/drift/DriftAgentService.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/drift/DriftAgentService.java
index c8bcdb6..6d39431 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/drift/DriftAgentService.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/drift/DriftAgentService.java
@@ -104,4 +104,5 @@ public interface DriftAgentService {
*/
void updateDriftDetection(int resourceId, DriftConfiguration driftConfiguration);
+ void ackChangeSet(int resourceId, String driftConfigName);
}
\ No newline at end of file
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/drift/DriftServerService.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/drift/DriftServerService.java
index 1fe4df2..c31514d 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/drift/DriftServerService.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/drift/DriftServerService.java
@@ -43,7 +43,6 @@ public interface DriftServerService {
* @param zipSize
* @param zipStream A RemoteStream
*/
- @Asynchronous(guaranteedDelivery = true)
void sendChangesetZip(int resourceId, long zipSize, InputStream zipStream);
// note that this guaranteed delivery is weak because most likely the stream will be dead if it
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java
index debbb17..f7787ad 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManager.java
@@ -61,8 +61,12 @@ public interface ChangeSetManager {
*/
ChangeSetReader getChangeSetReader(int resourceId, String driftConfigurationName) throws IOException;
+ ChangeSetReader getChangeSetReader(File changeSetFile) throws IOException;
+
ChangeSetWriter getChangeSetWriter(int resourceId, Headers headers) throws IOException;
+ ChangeSetWriter getChangeSetWriter(File changeSetFile, Headers headers) throws IOException;
+
ChangeSetWriter getChangeSetWriterForUpdate(int resourceId, Headers headers) throws IOException;
void updateChangeSet(int resourceId, Headers headers) throws IOException;
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java
index ce257f3..6cc5e6d 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/ChangeSetManagerImpl.java
@@ -97,6 +97,11 @@ public class ChangeSetManagerImpl implements ChangeSetManager {
}
@Override
+ public ChangeSetReader getChangeSetReader(File changeSetFile) throws IOException {
+ return new ChangeSetReaderImpl(changeSetFile);
+ }
+
+ @Override
public ChangeSetWriter getChangeSetWriter(int resourceId, Headers headers) throws IOException {
File resourceDir = new File(changeSetsDir, Integer.toString(resourceId));
File changeSetDir = new File(resourceDir, headers.getDriftConfigurationName());
@@ -115,6 +120,11 @@ public class ChangeSetManagerImpl implements ChangeSetManager {
}
@Override
+ public ChangeSetWriter getChangeSetWriter(File changeSetFile, Headers headers) throws IOException {
+ return new ChangeSetWriterImpl(changeSetFile, headers);
+ }
+
+ @Override
public ChangeSetWriter getChangeSetWriterForUpdate(int resourceId, Headers headers) throws IOException {
File resourceDir = new File(changeSetsDir, Integer.toString(resourceId));
File changeSetDir = new File(resourceDir, headers.getDriftConfigurationName());
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftClient.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftClient.java
index 8398b82..33d859f 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftClient.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftClient.java
@@ -2,7 +2,6 @@ package org.rhq.core.pc.drift;
import java.io.File;
-import org.rhq.core.domain.drift.DriftChangeSetCategory;
import org.rhq.core.domain.drift.DriftConfiguration;
/**
@@ -11,7 +10,7 @@ import org.rhq.core.domain.drift.DriftConfiguration;
*/
public interface DriftClient {
- void sendChangeSetToServer(int resourceId, DriftConfiguration driftConfiguration, DriftChangeSetCategory type);
+ void sendChangeSetToServer(DriftDetectionSummary detectionSummary);
/**
* Sends requested content to the server. All of the files in the content directory are
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetectionSummary.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetectionSummary.java
new file mode 100644
index 0000000..fc5f8d3
--- /dev/null
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetectionSummary.java
@@ -0,0 +1,78 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program 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 version 2 of the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.core.pc.drift;
+
+import java.io.File;
+
+import org.rhq.core.domain.drift.DriftChangeSetCategory;
+
+public class DriftDetectionSummary {
+
+ private DriftDetectionSchedule schedule;
+
+ private DriftChangeSetCategory type;
+
+ private File oldSnapshot;
+
+ private File newSnapshot;
+
+ private File driftChangeSet;
+
+ public DriftDetectionSchedule getSchedule() {
+ return schedule;
+ }
+
+ public void setSchedule(DriftDetectionSchedule schedule) {
+ this.schedule = schedule;
+ }
+
+ public DriftChangeSetCategory getType() {
+ return type;
+ }
+
+ public void setType(DriftChangeSetCategory type) {
+ this.type = type;
+ }
+
+ public File getOldSnapshot() {
+ return oldSnapshot;
+ }
+
+ public void setOldSnapshot(File oldSnapshot) {
+ this.oldSnapshot = oldSnapshot;
+ }
+
+ public File getNewSnapshot() {
+ return newSnapshot;
+ }
+
+ public void setNewSnapshot(File newSnapshot) {
+ this.newSnapshot = newSnapshot;
+ }
+
+ public File getDriftChangeSet() {
+ return driftChangeSet;
+ }
+
+ public void setDriftChangeSet(File driftChangeSet) {
+ this.driftChangeSet = driftChangeSet;
+ }
+
+}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
index 0beeb19..4f2ea30 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
@@ -20,6 +20,7 @@
package org.rhq.core.pc.drift;
import java.io.File;
+import java.io.FilenameFilter;
import java.io.IOException;
import java.util.HashSet;
import java.util.LinkedList;
@@ -71,7 +72,7 @@ public class DriftDetector implements Runnable {
@Override
public void run() {
- log.debug("Starting drift detection..");
+ log.debug("Starting drift detection...");
long startTime = System.currentTimeMillis();
try {
if (log.isDebugEnabled()) {
@@ -99,25 +100,30 @@ public class DriftDetector implements Runnable {
return;
}
- DriftConfiguration driftConfig = schedule.getDriftConfiguration();
- DriftChangeSetCategory changeSetType = null;
- int changes = 0;
+ if (previousSnapshotExists(schedule)) {
+ log.debug("Skipping " + schedule + " because server has not yet acked previous change set");
+ return;
+ }
+ DriftDetectionSummary detectionSummary = new DriftDetectionSummary();
+ detectionSummary.setSchedule(schedule);
try {
if (changeSetMgr.changeSetExists(schedule.getResourceId(), createHeaders(schedule, COVERAGE, 0))) {
- changeSetType = DRIFT;
- changes = generateDriftChangeSet(schedule);
+ detectionSummary.setType(DRIFT);
+ generateDriftChangeSet(detectionSummary);
} else {
- changeSetType = COVERAGE;
- generateSnapshot(schedule);
+ detectionSummary.setType(COVERAGE);
+ generateSnapshot(detectionSummary);
+ }
+ if (detectionSummary.getType() == COVERAGE || detectionSummary.getDriftChangeSet() != null) {
+ driftClient.sendChangeSetToServer(detectionSummary);
}
} catch (IOException e) {
- // TODO Call ChangeSetManager here to rollback any thing that was written to disk.
- log.error("An error occurred while scanning for drift", e);
- }
-
- if (changeSetType == COVERAGE || changes > 0) {
- driftClient.sendChangeSetToServer(schedule.getResourceId(), driftConfig, changeSetType);
+ log.error("Drift detection failed: " + e.getMessage(), e);
+ revertSnapshot(detectionSummary);
+ } catch (RuntimeException e) {
+ log.error("Drift detection failed: " + e.getMessage(), e);
+ revertSnapshot(detectionSummary);
}
} catch (Throwable t) {
Throwable cause = t.getCause();
@@ -138,15 +144,26 @@ public class DriftDetector implements Runnable {
}
}
- private int generateDriftChangeSet(final DriftDetectionSchedule schedule) throws IOException {
+ private boolean previousSnapshotExists(DriftDetectionSchedule schedule) {
+ File snapshot = changeSetMgr.findChangeSet(schedule.getResourceId(),
+ schedule.getDriftConfiguration().getName(), COVERAGE);
+ File previousSnapshot = new File(snapshot.getParentFile(), snapshot.getName() + ".previous");
+ return previousSnapshot.exists();
+ }
+
+ private void generateDriftChangeSet(DriftDetectionSummary summary) throws IOException {
+ final DriftDetectionSchedule schedule = summary.getSchedule();
+
log.debug("Generating drift change set for " + schedule);
final File basedir = new File(basedir(schedule.getResourceId(), schedule.getDriftConfiguration()));
- final ChangeSetReader coverageReader = changeSetMgr.getChangeSetReader(schedule.getResourceId(), schedule
- .getDriftConfiguration().getName());
+ File currentSnapshot = changeSetMgr.findChangeSet(schedule.getResourceId(),
+ schedule.getDriftConfiguration().getName(), COVERAGE);
+ final ChangeSetReader coverageReader = changeSetMgr.getChangeSetReader(currentSnapshot);
final Set<File> processedFiles = new HashSet<File>();
final List<FileEntry> snapshotEntries = new LinkedList<FileEntry>();
final List<FileEntry> deltaEntries = new LinkedList<FileEntry>();
+ int currentVersion = coverageReader.getHeaders().getVersion();
int newVersion = coverageReader.getHeaders().getVersion() + 1;
// First look for files that have either been modified or deleted
@@ -206,39 +223,48 @@ public class DriftDetector implements Runnable {
if (deltaEntries.isEmpty()) {
// If nothing has changed, there is no need to add/update any files
- return 0;
- }
-
- File snapshotFile = changeSetMgr.findChangeSet(schedule.getResourceId(),
- schedule.getDriftConfiguration().getName(), COVERAGE);
- File backupSnapshotFile = new File(snapshotFile.getParentFile(), snapshotFile.getName() + ".bak");
- copyFile(snapshotFile, snapshotFile);
-
- Headers deltaHeaders = createHeaders(schedule, DRIFT, newVersion);
- Headers snapshotHeaders = createHeaders(schedule, COVERAGE, newVersion);
-
- ChangeSetWriter deltaWriter = changeSetMgr.getChangeSetWriter(schedule.getResourceId(), deltaHeaders);
- ChangeSetWriter snapshotWriter = changeSetMgr.getChangeSetWriter(schedule.getResourceId(), snapshotHeaders);
-
- for (FileEntry entry : deltaEntries) {
- deltaWriter.write(entry);
- }
- deltaWriter.close();
+ summary.setNewSnapshot(currentSnapshot);
+ } else {
+ File oldSnapshot = new File(currentSnapshot.getParentFile(), currentSnapshot.getName() +
+ ".previous");
+ copyFile(currentSnapshot, oldSnapshot);
+ currentSnapshot.delete();
+
+ Headers deltaHeaders = createHeaders(schedule, DRIFT, newVersion);
+ Headers snapshotHeaders = createHeaders(schedule, COVERAGE, newVersion);
+
+ File driftChangeSet = changeSetMgr.findChangeSet(schedule.getResourceId(),
+ schedule.getDriftConfiguration().getName(), DRIFT);
+ ChangeSetWriter deltaWriter = changeSetMgr.getChangeSetWriter(driftChangeSet, deltaHeaders);
+
+ File newSnapshot = changeSetMgr.findChangeSet(schedule.getResourceId(),
+ schedule.getDriftConfiguration().getName(), COVERAGE);
+ ChangeSetWriter newSnapshotWriter = changeSetMgr.getChangeSetWriter(schedule.getResourceId(),
+ snapshotHeaders);
+
+ summary.setDriftChangeSet(driftChangeSet);
+ summary.setNewSnapshot(newSnapshot);
+ summary.setOldSnapshot(oldSnapshot);
+
+ for (FileEntry entry : deltaEntries) {
+ deltaWriter.write(entry);
+ }
+ deltaWriter.close();
- for (FileEntry entry : snapshotEntries) {
- snapshotWriter.write(entry);
+ for (FileEntry entry : snapshotEntries) {
+ newSnapshotWriter.write(entry);
+ }
+ newSnapshotWriter.close();
}
- snapshotWriter.close();
- backupSnapshotFile.delete();
-
- return deltaEntries.size();
}
- private void generateSnapshot(final DriftDetectionSchedule schedule) throws IOException {
+ private void generateSnapshot(DriftDetectionSummary summary) throws IOException {
+ final DriftDetectionSchedule schedule = summary.getSchedule();
log.debug("Generating coverage change set for " + schedule);
- final ChangeSetWriter writer = changeSetMgr.getChangeSetWriter(schedule.getResourceId(), createHeaders(
- schedule, COVERAGE, 0));
+ File snapshot = changeSetMgr.findChangeSet(schedule.getResourceId(), schedule.getDriftConfiguration().getName(),
+ COVERAGE);
+ final ChangeSetWriter writer = changeSetMgr.getChangeSetWriter(snapshot, createHeaders(schedule, COVERAGE, 0));
final DriftConfiguration config = schedule.getDriftConfiguration();
final File basedir = new File(basedir(schedule.getResourceId(), config));
if (basedir.isDirectory()) {
@@ -249,9 +275,7 @@ public class DriftDetector implements Runnable {
public void visit(File file) {
try {
if (log.isInfoEnabled()) {
- log
- .info("Adding " + file.getAbsolutePath() + " to coverage change set for "
- + schedule);
+ log.info("Adding " + file.getPath() + " to coverage change set for " + schedule);
}
writer.write(addedFileEntry(relativePath(basedir, file), sha256(file)));
} catch (IOException e) {
@@ -264,6 +288,7 @@ public class DriftDetector implements Runnable {
}));
}
writer.close();
+ summary.setNewSnapshot(snapshot);
}
private String relativePath(File basedir, File file) {
@@ -293,4 +318,50 @@ public class DriftDetector implements Runnable {
return headers;
}
+ private void revertSnapshot(DriftDetectionSummary summary) throws IOException {
+ log.info("Reverting snapshot for " + summary.getSchedule());
+
+ DriftDetectionSchedule scheudle = summary.getSchedule();
+ File newSnapshot = changeSetMgr.findChangeSet(scheudle.getResourceId(),
+ scheudle.getDriftConfiguration().getName(), COVERAGE);
+
+ // We want to delete the snapshot file regardless of whether the drift detection
+ // was for an initial coverage change set or for a drift change set. We do not know
+ // the state of the snapshot file so we have to delete it. If we have only generated
+ // the initial coverage change set, then it will get regenerated.
+ newSnapshot.delete();
+
+ if (summary.getType() == DRIFT) {
+ File oldSnapshotBackup = summary.getOldSnapshot();
+ // If we generated a drift change set, we need to check for a back up of the
+ // previous snapshot. We revert to the back up. If no back up is found, we log
+ // an error.
+ if (oldSnapshotBackup != null && oldSnapshotBackup.exists()) {
+ copyFile(oldSnapshotBackup, newSnapshot);
+ // We have to delete to the previous version snapshot file; otherwise,
+ // subsequent detection runs will be skipped.
+ oldSnapshotBackup.delete();
+ } else {
+ // TODO Should we throw an exception and/or disable detection?
+ // If we fall into this else block, that means we were not able to revert
+ // to the previous snapshot version, and we may be in an inconsistent state.
+ log.error("Cannot revert snapshot to previous version for " + summary.getSchedule() +
+ ". Snapshot back up file not found.");
+ }
+ }
+ deleteZipFiles(newSnapshot.getParentFile());
+ }
+
+ private void deleteZipFiles(File dir) {
+ File[] files = dir.listFiles(new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.endsWith(".zip");
+ }
+ });
+ for (File file : files) {
+ file.delete();
+ }
+ }
+
}
\ No newline at end of file
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
index 56e66f3..400a63a 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java
@@ -24,6 +24,7 @@ import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
+import java.io.FilenameFilter;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.ScheduledThreadPoolExecutor;
@@ -40,7 +41,6 @@ import org.rhq.core.clientapi.agent.drift.DriftAgentService;
import org.rhq.core.clientapi.server.drift.DriftServerService;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.drift.Drift;
-import org.rhq.core.domain.drift.DriftChangeSetCategory;
import org.rhq.core.domain.drift.DriftConfiguration;
import org.rhq.core.domain.drift.DriftConfigurationComparator;
import org.rhq.core.domain.drift.DriftFile;
@@ -58,6 +58,7 @@ import org.rhq.core.util.stream.StreamUtil;
import static org.rhq.common.drift.FileEntry.addedFileEntry;
import static org.rhq.common.drift.FileEntry.changedFileEntry;
import static org.rhq.common.drift.FileEntry.removedFileEntry;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
import static org.rhq.core.domain.drift.DriftConfigurationComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS;
import static org.rhq.core.util.file.FileUtil.purge;
@@ -173,6 +174,8 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
return;
}
+ headers.setVersion(snapshot.getVersion());
+
log.info("Preparing to write snapshot at version " + snapshot.getVersion() + " to disk for " +
toString(resource, configuration));
ChangeSetWriter writer = changeSetMgr.getChangeSetWriter(resource.getId(), headers);
@@ -214,14 +217,18 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
}
private String toString(Resource r, DriftConfiguration c) {
- return "DriftConfiguration[id: " + c.getId() + ", resourceId: " + r.getId() + ", name: " + c.getName() + "]";
+ return toString(r.getId(), c);
+ }
+
+ private String toString(int resourceId, DriftConfiguration c) {
+ return "DriftConfiguration[id: " + c.getId() + ", resourceId: " + resourceId + ", name: " + c.getName() + "]";
}
private Headers createHeaders(Resource resource, DriftConfiguration configuration) {
Headers headers = new Headers();
headers.setResourceId(resource.getId());
headers.setDriftCofigurationId(configuration.getId());
- headers.setType(DriftChangeSetCategory.COVERAGE);
+ headers.setType(COVERAGE);
headers.setDriftConfigurationName(configuration.getName());
headers.setBasedir(getAbsoluteBaseDirectory(resource.getId(), configuration).getAbsolutePath());
return headers;
@@ -256,49 +263,62 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
}
@Override
- public void sendChangeSetToServer(int resourceId, DriftConfiguration driftConfiguration, DriftChangeSetCategory type) {
- try {
- if (!schedulesQueue.contains(resourceId, driftConfiguration)) {
- return;
- }
+ public void sendChangeSetToServer(DriftDetectionSummary detectionSummary) {
+ int resourceId = detectionSummary.getSchedule().getResourceId();
+ DriftConfiguration driftConfiguration = detectionSummary.getSchedule().getDriftConfiguration();
- File changeSetFile = changeSetMgr.findChangeSet(resourceId, driftConfiguration.getName(), type);
- if (changeSetFile == null) {
- log.warn("changeset[resourceId: " + resourceId + ", driftConfiguration: " +
- driftConfiguration.getName() + "] was not found. Cancelling request to send change set " +
- "to server");
- return;
- }
+ if (!schedulesQueue.contains(resourceId, driftConfiguration)) {
+ return;
+ }
- DriftServerService driftServer = pluginContainerConfiguration.getServerServices().getDriftServerService();
+ File changeSetFile;
+ if (detectionSummary.getType() == COVERAGE) {
+ changeSetFile = detectionSummary.getNewSnapshot();
+ } else {
+ changeSetFile = detectionSummary.getDriftChangeSet();
+ }
+ if (changeSetFile == null) {
+ log.warn("changeset[resourceId: " + resourceId + ", driftConfiguration: " +
+ driftConfiguration.getName() + "] was not found. Cancelling request to send change set " +
+ "to server");
+ return;
+ }
- // TODO Include the version in the change set file name to ensure the file name is unique
- String fileName = "changeset_" + System.currentTimeMillis() + ".zip";
- final File zipFile = new File(changeSetFile.getParentFile(), fileName);
- ZipOutputStream stream = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
+ DriftServerService driftServer = pluginContainerConfiguration.getServerServices().getDriftServerService();
+
+ String fileName = "changeset_" + System.currentTimeMillis() + ".zip";
+ final File zipFile = new File(changeSetFile.getParentFile(), fileName);
+ ZipOutputStream stream = null;
+ try {
+ stream = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
FileInputStream fis = new FileInputStream(changeSetFile);
stream.putNextEntry(new ZipEntry(changeSetFile.getName()));
StreamUtil.copy(fis, stream, false);
fis.close();
stream.close();
+ } catch (IOException e) {
+ zipFile.delete();
+ throw new DriftDetectionException("Failed to create change set zip file " + zipFile.getPath(), e);
+ } finally {
+ try {
+ if (stream != null) {
+ stream.close();
+ }
+ } catch (IOException e) {
+ log.warn("An error occurred while trying to close change set zip file output stream", e);
+ }
+ }
- // We want to clean up after we send the zip file to the server. We do this by
- // deleting the files in the content directory and the content zip itself. They
- // are no longer needed after being sent to the server. We cannot immediately
- // delete the content zip file though because it is sent asynchronously, and we
- // wind up deleting it before it is sent. The following approach allows us to
- // safely delete it when the comm layer closes the remote input stream.
- //
- // jsanda
- DriftInputStream inputStream = new DriftInputStream(new BufferedInputStream(new FileInputStream(zipFile)),
- new DeleteFile(zipFile));
-
- driftServer.sendChangesetZip(resourceId, zipFile.length(), remoteInputStream(inputStream));
-
+ try {
+ driftServer.sendChangesetZip(resourceId, zipFile.length(), remoteInputStream(new BufferedInputStream(
+ new FileInputStream(zipFile))));
} catch (IOException e) {
- log.error("An error occurred while trying to send changeset[resourceId: " + resourceId
- + ", driftConfiguration: " + driftConfiguration.getName() + "]", e);
+ throw new DriftDetectionException("Failed to set change set for " +
+ toString(resourceId, driftConfiguration) + " to server");
+ } catch (RuntimeException e) {
+ throw new DriftDetectionException("Failed to set change set for " +
+ toString(resourceId, driftConfiguration) + " to server");
}
}
@@ -474,6 +494,39 @@ public class DriftManager extends AgentService implements DriftAgentService, Dri
}
}
+ @Override
+ public void ackChangeSet(int resourceId, String driftConfigName) {
+ log.info("Received server change set ack for [resourceId: " + resourceId + ", driftConfiguration:" +
+ driftConfigName + "]");
+
+ File resourceDir = new File(changeSetsDir, Integer.toString(resourceId));
+ File changeSetDir = new File(resourceDir, driftConfigName);
+
+ if (!changeSetDir.exists()) {
+ log.warn("Cannot ack change set. Change set directory " + changeSetDir.getPath() +
+ " does not exist.");
+ return;
+ }
+
+ File snapshot = changeSetMgr.findChangeSet(resourceId, driftConfigName, COVERAGE);
+ File previousSnapshot = new File(snapshot.getParentFile(), snapshot.getName() + ".previous");
+
+ previousSnapshot.delete();
+ deleteZipFiles(changeSetDir);
+ }
+
+ private void deleteZipFiles(File dir) {
+ File[] files = dir.listFiles(new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.endsWith(".zip");
+ }
+ });
+ for (File file : files) {
+ file.delete();
+ }
+ }
+
/**
* Given a drift configuration, this examines the config and its associated resource to determine where exactly
* the base directory is that should be monitoried.
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftClientTestStub.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftClientTestStub.java
index 758fda8..a5581ca 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftClientTestStub.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftClientTestStub.java
@@ -2,17 +2,19 @@ package org.rhq.core.pc.drift;
import java.io.File;
-import org.rhq.core.domain.drift.DriftChangeSetCategory;
import org.rhq.core.domain.drift.DriftConfiguration;
class DriftClientTestStub implements DriftClient {
private File basedir;
- @Override
- public void sendChangeSetToServer(int resourceId, DriftConfiguration driftConfiguration,
- DriftChangeSetCategory type) {
+ private boolean failingOnSendChangeSet;
+ @Override
+ public void sendChangeSetToServer(DriftDetectionSummary detectionSummary) {
+ if (failingOnSendChangeSet) {
+ throw new RuntimeException("Failed to send change set to server");
+ }
}
@Override
@@ -27,4 +29,12 @@ class DriftClientTestStub implements DriftClient {
public void setBaseDir(File basedir) {
this.basedir = basedir;
}
+
+ public boolean isFailingOnSendChangeSet() {
+ return failingOnSendChangeSet;
+ }
+
+ public void setFailingOnSendChangeSet(boolean failing) {
+ failingOnSendChangeSet = failing;
+ }
}
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
index 21ec45b..0b97ba6 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
@@ -177,13 +177,19 @@ public class DriftDetectorTest extends DriftTest {
File changeSet = changeSet(config.getName(), COVERAGE);
String originalHash = sha256(changeSet);
+ // Reset the schedule so that detection will run again the next time we call
+ // detection.run()
+ DriftDetectionSchedule schedule = scheduleQueue.remove(resourceId(), config);
+ schedule.resetSchedule();
+ scheduleQueue.addSchedule(schedule);
+
// Run the detector again. Note that nothing has changed so the snapshot should
// remain the same and no drift change set file should be generated.
detector.run();
String newHash = sha256(changeSet);
- assertEquals(newHash, originalHash, "The snapshot file should not have changed since there was no drift.");
+ assertEquals(newHash, originalHash, "The snapshot file should not have changed since there was no drift. ");
File driftChangeSet = changeSet(config.getName(), DRIFT);
@@ -193,15 +199,14 @@ public class DriftDetectorTest extends DriftTest {
@SuppressWarnings("unchecked")
@Test
- public void skipScheduledThatHasConfigDisabled() throws Exception {
+ public void skipDetectionForScheduledThatIsDisabled() throws Exception {
detector.setDriftClient(new DriftClientTestStub() {
{
setBaseDir(resourceDir);
}
@Override
- public void sendChangeSetToServer(int resourceId, DriftConfiguration driftConfiguration,
- DriftChangeSetCategory type) {
+ public void sendChangeSetToServer(DriftDetectionSummary detectionSummary) {
throw new RuntimeException("Should not invoke drift client when drift configuration is disabled");
}
});
@@ -219,6 +224,45 @@ public class DriftDetectorTest extends DriftTest {
@SuppressWarnings("unchecked")
@Test
+ public void skipDetectionWhenPreviousSnapshotFileExists() throws Exception {
+ // The presence of a previous snapshot file means that the server has
+ // not acknowledged that it has received and processed the change set.
+ DriftConfiguration config = driftConfiguration("previous-snapshot-test", resourceDir.getAbsolutePath());
+
+ File confDir = mkdir(resourceDir, "conf");
+ createRandomFile(confDir, "server.conf");
+
+ DriftDetectionSchedule schedule = new DriftDetectionSchedule(resourceId(), config);
+ scheduleQueue.addSchedule(schedule);
+ detector.run();
+
+ // create some drift and generate a new snapshot
+ createRandomFile(confDir, "server-1.conf");
+ schedule.resetSchedule();
+ detector.run();
+
+ File snapshot = changeSet(config.getName(), COVERAGE);
+ String newHash = sha256(snapshot);
+ File previousSnapshot = previousChangeSet(config.getName());
+ String oldHash = sha256(previousSnapshot);
+
+ // create some drift and make sure drift detection does not run.
+ createRandomFile(confDir, "server-2.conf");
+ schedule.resetSchedule();
+ // Tell driftClient to throw an exception if detector attempts to send
+ // the change set report to the server. The detector should never call
+ // driftClient in this scenario.
+ driftClient.setFailingOnSendChangeSet(true);
+ detector.run();
+
+ assertEquals(sha256(snapshot), newHash, "The snapshot should not have changed since the previous snapshot " +
+ "is still on disk.");
+ assertEquals(sha256(previousSnapshot), oldHash, "The previous snapshot should not have changed since " +
+ "drift detection should not have run until the server acked the previous snapshot.");
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
public void includeAddedFileInDriftChangeSet() throws Exception {
DriftConfiguration config = driftConfiguration("file-added-drift-test", resourceDir.getAbsolutePath());
@@ -406,6 +450,74 @@ public class DriftDetectorTest extends DriftTest {
coverageChangeSet);
}
+ @SuppressWarnings("unchecked")
+ @Test
+ public void revertToPreviousSnapshotWhenSendingChangeSetFails() throws Exception {
+ DriftConfiguration config = driftConfiguration("revert-snapshot-test", resourceDir.getAbsolutePath());
+ DriftDetectionSchedule schedule = new DriftDetectionSchedule(resourceId(), config);
+
+ File confDir = mkdir(resourceDir, "conf");
+ File server1Conf = createRandomFile(confDir, "server.conf");
+
+ scheduleQueue.addSchedule(schedule);
+ // generate the initial snapshot
+ detector.run();
+
+ // Now generate a drift change set
+ createRandomFile(confDir, "server-1.conf");
+ schedule.resetSchedule();
+ detector.run();
+
+ File changeSet = changeSet(config.getName(), COVERAGE);
+ String currentHash = sha256(changeSet);
+
+ // Need to delete the previous version snapshot file; otherwise, the
+ // next detection run will be skipped.
+ previousChangeSet(config.getName()).delete();
+
+ // generate some more drift, and fail on sending the change set
+ // to the server
+ createRandomFile(confDir, "server-2.conf");
+ schedule.resetSchedule();
+ driftClient.setFailingOnSendChangeSet(true);
+ try {
+ detector.run();
+ } catch (RuntimeException e) {}
+
+ String newHash = sha256(changeSet);
+
+ assertEquals(newHash, currentHash, "The snapshot file should be reverted if sending the new snapshot " +
+ "to the server fails.");
+ // The previous version file must be deleted on revert; otherwise, drift
+ // detection will not run for the schedule if the previous version file
+ // is found on disk.
+ assertFalse(previousChangeSet(config.getName()).exists(), "The copy of the previous version snapshot file " +
+ "should be deleted once we have reverted back to it and have a new, current snapsot file.");
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void purgeSnapshotWhenSendingInitialChangeSetFails() throws Exception {
+ // If we have just generated the initial change set and sending it to
+ // the server fails, then there is no prior snapshot version to which
+ // we can revert. We therefore need to purge the snapshot file and
+ // allow DriftDetector to simply regenerate the initial change set again.
+
+ DriftConfiguration config = driftConfiguration("purge-snapshot-test", resourceDir.getAbsolutePath());
+
+ File confDir = mkdir(resourceDir, "conf");
+ createRandomFile(confDir, "server.conf");
+
+ scheduleQueue.addSchedule(new DriftDetectionSchedule(resourceId(), config));
+ driftClient.setFailingOnSendChangeSet(true);
+ try {
+ detector.run();
+ } catch (RuntimeException e) {}
+
+ assertFalse(changeSet(config.getName(), COVERAGE).exists(), "Snapshot file should be deleted when " +
+ "only the initial change set has been generated and sending change send report to server fails");
+ }
+
void assertHeaderEquals(File changeSet, Headers expected) throws Exception {
ChangeSetReader reader = new ChangeSetReaderImpl(new BufferedReader(new FileReader(changeSet)));
Headers actual = reader.getHeaders();
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftManagerTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftManagerTest.java
index 18d2d27..cac5ea8 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftManagerTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftManagerTest.java
@@ -75,6 +75,7 @@ public class DriftManagerTest extends DriftTest {
driftMgr = new TestDriftManager();
driftMgr.setConfiguration(pcConfig);
+ driftMgr.setChangeSetMgr(changeSetMgr);
}
@Test
@@ -93,9 +94,14 @@ public class DriftManagerTest extends DriftTest {
}
});
+ DriftDetectionSchedule schedule = new DriftDetectionSchedule(resourceId(), config);
+ DriftDetectionSummary detectionSummary = new DriftDetectionSummary();
+ detectionSummary.setSchedule(schedule);
+ detectionSummary.setType(COVERAGE);
+
driftMgr.setChangeSetMgr(changeSetMgr);
- driftMgr.getSchedulesQueue().addSchedule(new DriftDetectionSchedule(resourceId(), config));
- driftMgr.sendChangeSetToServer(resourceId(), config, COVERAGE);
+ driftMgr.getSchedulesQueue().addSchedule(schedule);
+ driftMgr.sendChangeSetToServer(detectionSummary);
}
@Test
@@ -111,32 +117,32 @@ public class DriftManagerTest extends DriftTest {
}
});
+ DriftDetectionSchedule schedule = new DriftDetectionSchedule(resourceId(), config);
+ DriftDetectionSummary detectionSummary = new DriftDetectionSummary();
+ detectionSummary.setSchedule(schedule);
+ detectionSummary.setType(COVERAGE);
+
driftMgr.setChangeSetMgr(changeSetMgr);
driftMgr.getSchedulesQueue().addSchedule(new DriftDetectionSchedule(resourceId(), config));
- driftMgr.sendChangeSetToServer(resourceId(), config, COVERAGE);
+ driftMgr.sendChangeSetToServer(detectionSummary);
}
@Test
- public void cleanUpAfterSendingChangeSetToServer() throws Exception {
- final DriftConfiguration config = driftConfiguration("send-changeset-in-zip", resourceDir.getAbsolutePath());
- final File changeSetDir = changeSetDir(config.getName());
- createRandomFile(changeSetDir, "changeset.txt");
-
- driftMgr.setChangeSetMgr(changeSetMgr);
- driftMgr.getSchedulesQueue().addSchedule(new DriftDetectionSchedule(resourceId(), config));
- driftMgr.sendChangeSetToServer(resourceId(), config, COVERAGE);
-
- // clean up should not happen until after the input stream is closed. The remote
- // input stream is consumed asynchronously; so, we have to wait until the stream
- // is closed. We could otherwise disrupt the transmission of bits.
-
- File changeSetZip = assertThatZipFileExists(changeSetDir, "changeset_", "Expected to find change set zip " +
- "zip file in " + changeSetDir.getPath() + ". The file name should follow the pattern " +
- "changeset_<integer_timestamp>.zip");
+ public void cleanUpWhenServerAcksChangeSet() throws Exception {
+ DriftConfiguration config = driftConfiguration("clean-up-when-server-acks-changeset",
+ resourceDir.getAbsolutePath());
+ File changeSetDir = changeSetDir(config.getName());
+ File snapshotFile = createRandomFile(changeSetDir, "changeset.txt");
+ File previousSnapshotFile = createRandomFile(changeSetDir, "changeset.txt.previous");
+ File changeSetZipFile = createRandomFile(changeSetDir, "changeset_" + System.currentTimeMillis() + ".zip");
- driftServerService.inputStream.close();
+ driftMgr.ackChangeSet(resourceId(), config.getName());
- assertFalse(changeSetZip.exists(), "The change set zip should be deleted when the remote input stream is closed.");
+ assertTrue(snapshotFile.exists(), "Snapshot file should exist after server acks change set");
+ assertFalse(previousSnapshotFile.exists(), "Previous version snapshot file should be deleted when server " +
+ "acks change set");
+ assertEquals(findChangeSetZipFiles(changeSetDir).size(), 0, "All change set zip files should be deleted when " +
+ "server acks change set");
}
@Test
@@ -266,6 +272,16 @@ public class DriftManagerTest extends DriftTest {
"deactivated.");
}
+ private List<File> findChangeSetZipFiles(File dir) {
+ File[] files = dir.listFiles(new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.startsWith("changeset_") && name.endsWith(".zip");
+ }
+ });
+ return asList(files);
+ }
+
/**
* This method first verifies that each of the expected files is contained in the the
* zip file. Then it verifies that the content for each file in the zip file matches
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftTest.java
index a22b26f..a267402 100644
--- a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftTest.java
+++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftTest.java
@@ -38,6 +38,7 @@ import static java.util.Arrays.asList;
import static org.apache.commons.io.FileUtils.deleteDirectory;
import static org.apache.commons.io.IOUtils.write;
import static org.apache.commons.io.IOUtils.writeLines;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem;
/**
@@ -190,6 +191,19 @@ public class DriftTest {
return changeSetMgr.findChangeSet(resourceId(), config, type);
}
+ /**
+ * Returns the previous snapshot file for the specified drift configuration for the
+ * resource with the id that can be obtained from {@link #resourceId()}.
+ *
+ * @param config The drift configuration name
+ * @return The previous snapshot file
+ * @throws Exception
+ */
+ protected File previousChangeSet(String config) throws IOException {
+ File changeSet = changeSet(config, COVERAGE);
+ return new File(changeSet.getParentFile(), changeSet.getName() + ".previous");
+ }
+
protected File changeSetDir(String driftConfigName) throws Exception {
File dir = new File(new File(changeSetsDir, Integer.toString(resourceId)), driftConfigName);
dir.mkdirs();
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftServerServiceImpl.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftServerServiceImpl.java
index 16dd477..7af5163 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftServerServiceImpl.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftServerServiceImpl.java
@@ -34,6 +34,7 @@ import org.rhq.core.domain.criteria.GenericDriftChangeSetCriteria;
import org.rhq.core.domain.drift.DriftConfiguration;
import org.rhq.core.domain.drift.DriftSnapshot;
import org.rhq.core.domain.util.PageList;
+import org.rhq.core.domain.util.PageOrdering;
import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager;
import static org.rhq.enterprise.server.util.LookupUtil.getSubjectManager;
@@ -85,6 +86,7 @@ public class DriftServerServiceImpl implements DriftServerService {
public DriftSnapshot getCurrentSnapshot(int driftConfigurationId) {
DriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria();
criteria.addFilterDriftConfigurationId(driftConfigurationId);
+ criteria.addSortVersion(PageOrdering.ASC);
Subject overlord = getSubjectManager().getOverlord();
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
index 03705cd..e808b92 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
@@ -225,7 +225,7 @@ public class JPADriftServerBean implements JPADriftServerLocal {
@Override
@TransactionAttribute(REQUIRES_NEW)
- public DriftChangeSetSummary storeChangeSet(Subject subject, final int resourceId, File changeSetZip)
+ public DriftChangeSetSummary storeChangeSet(Subject subject, final int resourceId, final File changeSetZip)
throws Exception {
final Resource resource = entityManager.find(Resource.class, resourceId);
if (null == resource) {
@@ -295,12 +295,14 @@ public class JPADriftServerBean implements JPADriftServerLocal {
summary.addDriftPathname(path);
}
}
+
+ AgentClient agentClient = agentManager.getAgentClient(subjectManager.getOverlord(), resourceId);
+ DriftAgentService service = agentClient.getDriftAgentService();
+
+ service.ackChangeSet(resourceId, reader.getHeaders().getDriftConfigurationName());
+
// send a message to the agent requesting the empty JPADriftFile content
if (!emptyDriftFiles.isEmpty()) {
-
- AgentClient agentClient = agentManager.getAgentClient(subjectManager.getOverlord(),
- resourceId);
- DriftAgentService service = agentClient.getDriftAgentService();
try {
if (service.requestDriftFiles(resourceId, reader.getHeaders(), emptyDriftFiles)) {
for (DriftFile driftFile : emptyDriftFiles) {
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
index 1e1cc90..244d332 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
@@ -438,7 +438,6 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
@Override
public void detectDrift(int resourceId, DriftConfiguration driftConfiguration) {
- //To change body of implemented methods use File | Settings | File Templates.
}
@Override
@@ -448,5 +447,9 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
@Override
public void updateDriftDetection(int resourceId, DriftConfiguration driftConfiguration) {
}
+
+ @Override
+ public void ackChangeSet(int resourceId, String driftConfigName) {
+ }
}
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java
index 2c31e18..5940b6a 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java
@@ -350,4 +350,8 @@ public class TestAgentClient implements AgentClient, BundleAgentService, DriftAg
@Override
public void updateDriftDetection(int resourceId, DriftConfiguration driftConfiguration) {
}
+
+ @Override
+ public void ackChangeSet(int resourceId, String driftConfigName) {
+ }
}
12 years, 9 months
[rhq] Branch 'as7plugin' - 5 commits - modules/core modules/enterprise
by snegrea
modules/core/client-api/src/main/resources/rhq-configuration.xsd | 4
modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java | 38 ++---
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java | 76 +++-------
4 files changed, 48 insertions(+), 75 deletions(-)
New commits:
commit 9fbcd2eddff6d70f6df3f0dce7a4d50e8df685f0
Merge: 1caea4f ce216a9
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Tue Sep 27 15:52:10 2011 -0500
Merge branch 'master' into as7plugin
commit ce216a9370e354bfd6089d929504b98be73e7e7b
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Tue Sep 27 13:58:28 2011 -0400
[BZ 739529] fix a regression that was causing the group Configuration tab to
never be displayed (https://bugzilla.redhat.com/show_bug.cgi?id=739529)
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
index 103acdd..1ecd83f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
@@ -76,7 +76,7 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
- * Right panel of the Resource Group view (#ResourceGroup/*).
+ * The right panel of a Resource Group view (#ResourceGroup/* or #Resource/AutoGroup/*).
*
* @author Jay Shaughnessy
* @author Ian Springer
@@ -247,8 +247,6 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
protected void updateTabContent(ResourceGroupComposite groupComposite) {
try {
this.groupComposite = groupComposite;
- ResourceGroup group = groupComposite.getResourceGroup();
- int groupId = group.getId();
getTitleBar().setGroup(groupComposite);
// wipe the canvas views for the current set of subtabs.
@@ -258,13 +256,13 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
Set<ResourceTypeFacet> facets = groupComposite.getResourceFacets().getFacets();
updateSummaryTab();
- updateMonitoringTab(groupId, groupCategory, facets);
- updateInventoryTab(groupId, facets);
+ updateInventoryTab(facets);
+ updateAlertsTab(groupCategory);
+ updateMonitoringTab(facets);
+ updateEventsTab(groupCategory, facets);
updateOperationsTab(groupCategory, facets);
- updateAlertsTab(groupComposite, groupCategory);
- updateConfigurationTab(groupId, groupCategory, facets);
- updateDriftTab(groupComposite, groupCategory, facets);
- updateEventsTab(groupComposite, groupCategory, facets);
+ updateConfigurationTab(groupCategory, facets);
+ updateDriftTab(groupCategory, facets);
this.show();
markForRedraw();
@@ -285,12 +283,13 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
// TODO (ips): Add Timeline subtab?
}
- private void updateMonitoringTab(final int groupId, GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
+ private void updateMonitoringTab(Set<ResourceTypeFacet> facets) {
ViewFactory viewFactory;
// TODO: Once we add an Availability subtab, the Monitoring tab will always be visible, even for groups with
// no metrics.
boolean visible = hasMetricsOfType(this.groupComposite, null);
if (updateTab(this.monitoringTab, visible, true)) {
+ final int groupId = groupComposite.getResourceGroup().getId();
visible = hasMetricsOfType(this.groupComposite, DataType.MEASUREMENT);
viewFactory = (!visible) ? null : new ViewFactory() {
@Override
@@ -352,14 +351,15 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
}
}
- private void updateInventoryTab(final int groupId, Set<ResourceTypeFacet> facets) {
+ private void updateInventoryTab(Set<ResourceTypeFacet> facets) {
// Inventory tab is always visible and enabled.
final boolean canModifyMembers = (!isAutoGroup() && !isAutoCluster() && globalPermissions
.contains(Permission.MANAGE_INVENTORY));
updateSubTab(this.inventoryTab, this.inventoryMembers, true, true, new ViewFactory() {
@Override
public Canvas createView() {
- return new MembersView(inventoryMembers.extendLocatorId("View"), groupId, canModifyMembers);
+ return new MembersView(inventoryMembers.extendLocatorId("View"),
+ groupComposite.getResourceGroup().getId(), canModifyMembers);
}
});
updateSubTab(this.inventoryTab, this.inventoryConn, facets.contains(ResourceTypeFacet.PLUGIN_CONFIGURATION),
@@ -398,7 +398,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
}
}
- private void updateAlertsTab(final ResourceGroupComposite groupComposite, GroupCategory groupCategory) {
+ private void updateAlertsTab(GroupCategory groupCategory) {
// alerts tab is always visible, even for mixed groups
if (updateTab(this.alertsTab, true, true)) {
// alert history is always available
@@ -420,7 +420,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
}
}
- private void updateConfigurationTab(final int groupId, GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
+ private void updateConfigurationTab(GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
boolean visible = (groupCategory == GroupCategory.COMPATIBLE && facets
.contains(ResourceTypeFacet.CONFIGURATION));
Set<Permission> groupPermissions = this.groupComposite.getResourcePermission().getPermissions();
@@ -434,15 +434,14 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
updateSubTab(this.configurationTab, this.configHistory, true, true, new ViewFactory() {
@Override
public Canvas createView() {
- return new HistoryGroupResourceConfigurationView(inventoryConnHistory.extendLocatorId("View"),
+ return new HistoryGroupResourceConfigurationView(configHistory.extendLocatorId("View"),
groupComposite);
}
});
}
}
- private void updateEventsTab(final ResourceGroupComposite groupComposite, GroupCategory groupCategory,
- Set<ResourceTypeFacet> facets) {
+ private void updateEventsTab(GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
// allow mixed groups to show events from supporting resources
boolean visible = (groupCategory == GroupCategory.MIXED || (groupCategory == GroupCategory.COMPATIBLE && facets
.contains(ResourceTypeFacet.EVENT)));
@@ -456,12 +455,11 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
}
}
- private void updateDriftTab(final ResourceGroupComposite resourceComposite, GroupCategory groupCategory,
- Set<ResourceTypeFacet> facets) {
+ private void updateDriftTab(GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
boolean visible = (groupCategory == GroupCategory.COMPATIBLE && facets.contains(ResourceTypeFacet.DRIFT));
Set<Permission> groupPermissions = this.groupComposite.getResourcePermission().getPermissions();
- if (updateTab(this.configurationTab, visible, visible && groupPermissions.contains(Permission.MANAGE_DRIFT))) {
+ if (updateTab(this.driftTab, visible, visible && groupPermissions.contains(Permission.MANAGE_DRIFT))) {
updateSubTab(this.driftTab, this.driftHistory, true, true, new ViewFactory() {
@Override
commit 1026cd0039574ee628929c0140b6ce452b0db822
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Tue Sep 27 11:38:03 2011 -0400
[BZ 736517] remove unnecessary loading of grandchildren Resources in
ResourceManagerBean.getResourceLineageAndSiblings() and further optimize
performance of that method (https://bugzilla.redhat.com/show_bug.cgi?id=736517)
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
index de415f4..1eb495e 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
@@ -291,13 +291,14 @@ import org.rhq.core.domain.util.Summary;
+ " FROM Resource res " //
+ " WHERE res.parentResource = :parent " //
+ " AND res.id IN (SELECT rr.id FROM Resource rr JOIN rr.implicitGroups g JOIN g.roles r JOIN r.subjects s WHERE s = :subject)"
- + " AND res.resourceType.category = :category " + " AND res.inventoryStatus = :status "),
+ + " AND res.inventoryStatus = :status " //
+ + " AND (res.resourceType.category = :category OR :category is null)"),
@NamedQuery(name = Resource.QUERY_FIND_CHILDREN_BY_CATEGORY_AND_INVENTORY_STATUS_ADMIN, query = "" //
+ "SELECT res " //
+ " FROM Resource res " //
+ " WHERE res.parentResource = :parent " //
+ " AND res.inventoryStatus = :status " //
- + " AND res.resourceType.category = :category "),
+ + " AND (res.resourceType.category = :category OR :category is null)"),
@NamedQuery(name = Resource.QUERY_FIND_BY_CATEGORY_AND_INVENTORY_STATUS, query = "" //
+ "SELECT res " //
+ " FROM Resource res " //
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
index 16fd8e6..6a10c30 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
@@ -750,74 +750,44 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage
}
public List<ResourceLineageComposite> getResourceLineageAndSiblings(Subject subject, int resourceId) {
- boolean isInventoryManager = authorizationManager.isInventoryManager(subject);
-
- // get the raw resource lineage up to the platform. We'll check the auth below
+ // Get the raw resource lineage up to the platform. We'll check the auth below.
List<Resource> rawResourceLineage = getResourceLineage(resourceId);
int depth = rawResourceLineage.size();
Resource parent = (depth > 1) ? rawResourceLineage.get(depth - 2) : null;
- // record which of the raw ancestry is locked from view
- List<ResourceLineageComposite> resourceLineage = new ArrayList<ResourceLineageComposite>(rawResourceLineage
- .size());
+ // Build up a list of composite Resources for the ancestry that includes which ancestors, if any, should be
+ // locked from view.
+ boolean isInventoryManager = authorizationManager.isInventoryManager(subject);
+ List<ResourceLineageComposite> resourceLineage = new ArrayList<ResourceLineageComposite>(rawResourceLineage.size());
for (Resource resource : rawResourceLineage) {
- resourceLineage.add(new ResourceLineageComposite(resource, !authorizationManager.canViewResource(subject,
- resource.getId())));
+ boolean isLocked = !(isInventoryManager || authorizationManager.canViewResource(subject, resource.getId()));
+ ResourceLineageComposite composite = new ResourceLineageComposite(resource, isLocked);
+ resourceLineage.add(composite);
}
- // fill out the tree, including only the direct ancestors and all viewable relations
+ // Build up the result list, including only the direct ancestors of the Resource and all viewable siblings of
+ // the ancestors. The list will represent a tree, rooted at the platform, in depth-first order.
List<ResourceLineageComposite> result = new LinkedList<ResourceLineageComposite>();
for (ResourceLineageComposite ancestor : resourceLineage) {
- // always include a direct ancestor
+ // Always include a direct ancestor.
result.add(ancestor);
- // if the ancestor is not locked, include relevant children. Also, always show viewable
- // siblings of the target resource.
+ // If the ancestor is not locked, include viewable children.
if (!ancestor.isLocked() || ancestor.getResource() == parent) {
-
- // get children
- Set<Resource> children = ancestor.getResource().getChildResources();
- // remove any that are in the ancestry to avoid repeated handling
+ // Get all viewable committed children.
+ PageList<Resource> children = findChildResourcesByCategoryAndInventoryStatus(subject,
+ ancestor.getResource(), null, InventoryStatus.COMMITTED, PageControl.getUnlimitedInstance());
+ // Remove any that are in the lineage to avoid repeated handling.
children.removeAll(rawResourceLineage);
- // only add the viewable children
- List<Resource> viewableChildren = new ArrayList<Resource>(children.size());
for (Resource child : children) {
- boolean isCommitted = (child.getInventoryStatus() == InventoryStatus.COMMITTED);
- boolean isViewable = (isInventoryManager || authorizationManager.canViewResource(subject, child
- .getId()));
- if (isCommitted && isViewable) {
- // if not a direct ancestor add to the list (direct ancestors already added by default)
- if (!rawResourceLineage.contains(child)) {
- // ensure we have the parent in the entity
- child.getParentResource().getId();
- ResourceLineageComposite composite = new ResourceLineageComposite(child, false);
- result.add(composite);
- }
- viewableChildren.add(child);
- }
- }
-
- // get grandchildren
- for (Resource child : viewableChildren) {
- // This ensures Hibernate actually fetches the parent Resource.
- // ensure we have the parent
+ // Ensure the parentResource field is fetched.
+ //noinspection ConstantConditions
child.getParentResource().getId();
- Set<Resource> grandChildren = child.getChildResources();
- for (Resource grandChild : grandChildren) {
- boolean isCommitted = (grandChild.getInventoryStatus() == InventoryStatus.COMMITTED);
- boolean isViewable = (isInventoryManager || authorizationManager.canViewResource(subject,
- grandChild.getId()));
- if (isCommitted && isViewable) {
- // if not a direct ancestor add to the list (direct ancestors already added by default)
- if (!rawResourceLineage.contains(grandChild)) {
- // ensure we have the parent in the entity
- grandChild.getParentResource().getId();
- ResourceLineageComposite composite = new ResourceLineageComposite(grandChild, false);
- result.add(composite);
- }
- }
- }
+ // The query only returned viewable children, so the composite should not be locked.
+ boolean isLocked = false;
+ ResourceLineageComposite composite = new ResourceLineageComposite(child, isLocked);
+ result.add(composite);
}
}
}
@@ -1070,7 +1040,7 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage
@SuppressWarnings("unchecked")
public PageList<Resource> findChildResourcesByCategoryAndInventoryStatus(Subject user, Resource parent,
- ResourceCategory category, InventoryStatus status, PageControl pageControl) {
+ @Nullable ResourceCategory category, InventoryStatus status, PageControl pageControl) {
pageControl.initDefaultOrderingField("res.name");
Query queryCount;
commit c14cbc4b9afa6a1f223f54b29af47c011941cbb0
Merge: 14ef47f 8ada3a7
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Sep 27 11:37:39 2011 -0400
Merge commit 'origin/master'
commit 14ef47fc976d72d69c41b21cc2de329c15ba03e8
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Sep 27 11:35:36 2011 -0400
[BZ 741691] make sure the plugin XML descriptor accepts all units that the code can support
this adds: petabytes, epoch_seconds, jiffys, microseconds
diff --git a/modules/core/client-api/src/main/resources/rhq-configuration.xsd b/modules/core/client-api/src/main/resources/rhq-configuration.xsd
index b038ec1..4b706d8 100644
--- a/modules/core/client-api/src/main/resources/rhq-configuration.xsd
+++ b/modules/core/client-api/src/main/resources/rhq-configuration.xsd
@@ -590,8 +590,12 @@
<xs:enumeration value="megabytes"/>
<xs:enumeration value="gigabytes"/>
<xs:enumeration value="terabytes"/>
+ <xs:enumeration value="petabytes" />
<xs:enumeration value="epoch_milliseconds"/>
+ <xs:enumeration value="epoch_seconds"/>
+ <xs:enumeration value="jiffys"/>
<xs:enumeration value="nanoseconds"/>
+ <xs:enumeration value="microseconds"/>
<xs:enumeration value="milliseconds"/>
<xs:enumeration value="seconds"/>
<xs:enumeration value="minutes"/>
12 years, 9 months
[rhq] Branch 'as7plugin' - modules/core
by snegrea
modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
New commits:
commit 1caea4f8ce58639c9f82d0c77fb94a1207896d24
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Tue Sep 27 15:51:36 2011 -0500
Merge markers splipped during the master merge.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
index 8f77d29..7e9aadd 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
@@ -683,11 +683,8 @@ public class InventoryManager extends AgentService implements ContainerService,
// Ask the plugin's discovery component to find the new resource, throwing exceptions if it cannot be
// found at all.
discoveredResourceDetails = discoverResource(discoveryComponent, pluginConfiguration, discoveryContext,
-<<<<<<< HEAD
- parentResourceContainer);
-=======
parentResourceContainer);
->>>>>>> master
+
if (discoveredResourceDetails == null) {
log.info("Plugin Error: During manual add, discovery component method ["
+ discoveryComponent.getClass().getName() + ".discoverResource()] returned null "
@@ -2867,4 +2864,4 @@ public class InventoryManager extends AgentService implements ContainerService,
// nothing to do
}
}
-}
\ No newline at end of file
+}
12 years, 9 months
[rhq] Branch 'feature/metric-tweek' - 3 commits - modules/core modules/enterprise modules/plugins
by mazz
modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java | 5
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java | 76 +++-------
modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml | 1
modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml | 1
modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml | 23 ++-
5 files changed, 48 insertions(+), 58 deletions(-)
New commits:
commit 8d4d7981769542a488dae522be5240537cc935ad
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Sep 27 16:06:28 2011 -0400
[BZ 741331] just some very limited number of metrics to be enabled out of box - mainly in platform plugin
diff --git a/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
index 6b0ddb4..8a8c194 100644
--- a/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
@@ -1145,6 +1145,7 @@
category="throughput"/>
<metric displayName="JVM Free Memory" property="MCBean|ServerInfo|*|freeMemory" displayType="summary"
+ defaultOn="true"
description="An approximation of the total amount of memory currently available in the app server JVM for future allocated objects, measured in bytes"
category="utilization" units="bytes"/>
diff --git a/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
index bb9fb7d..9193d34 100644
--- a/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
@@ -209,6 +209,7 @@
category="throughput"/>
<metric property="jboss.system:type=ServerInfo:FreeMemory" displayName="JVM Free Memory" displayType="summary"
+ defaultOn="true"
description="An approximation of the total amount of memory currently available in the app server JVM for future allocated objects, measured in bytes"
category="utilization" units="bytes"/>
diff --git a/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
index 7c7c2ff..86ac8bb 100644
--- a/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
@@ -51,21 +51,25 @@
<metric displayName="Hostname"
property="Trait.hostname"
description="Name that this platform is known as"
+ defaultOn="true"
dataType="trait"
displayType="summary" />
<metric displayName="OS Name"
property="Trait.osname"
description="Name that the operating system is known as"
+ defaultOn="true"
dataType="trait"
displayType="summary" />
<metric displayName="OS Version"
property="Trait.osversion"
description="Version of the operating system"
+ defaultOn="true"
dataType="trait"
displayType="summary" />
<metric displayName="Architecture"
property="Trait.sysarch"
description="Hardware architecture of the platform"
+ defaultOn="true"
dataType="trait"
displayType="summary" />
'>
@@ -73,12 +77,14 @@
<metric displayName="Free Memory"
property="Native.MemoryInfo.free"
displayType="summary"
+ defaultOn="true"
units="bytes"
description="The total free system memory"/>
<metric displayName="Used Memory"
property="Native.MemoryInfo.used"
displayType="summary"
+ defaultOn="true"
units="bytes"
description="The total used system memory"/>
@@ -89,11 +95,13 @@
<metric displayName="Free Swap Space"
property="Native.SwapInfo.free"
+ defaultOn="true"
units="bytes"
description="The total free system swap"/>
<metric displayName="Used Swap Space"
property="Native.SwapInfo.used"
+ defaultOn="true"
displayType="summary"
units="bytes"
description="The total used system swap"/>
@@ -111,11 +119,13 @@
description="Idle percentage of all CPUs"/>
<metric displayName="System Load"
property="CpuPerc.sys"
+ defaultOn="true"
displayType="summary"
units="percentage"
description="Percentage of all CPUs running in system mode"/>
<metric displayName="User Load"
property="CpuPerc.user"
+ defaultOn="true"
displayType="summary"
units="percentage"
description="Percentage of all CPUs running in user mode"/>
@@ -128,18 +138,22 @@
<!ENTITY cpuDetail '
<metric displayName="Vendor"
property="CpuTrait.vendor"
+ defaultOn="true"
dataType="trait"
description="Vendor of this CPU"/>
<metric displayName="CPU Model"
property="CpuTrait.model"
+ defaultOn="true"
dataType="trait"
description="Model of this CPU"/>
<metric displayName="CPU Speed"
property="CpuTrait.mhz"
+ defaultOn="true"
dataType="trait"
description="Speed of this CPU in Mhz"/>
<metric displayName="Cache size"
property="CpuTrait.cacheSize"
+ defaultOn="true"
dataType="trait"
description="Cache Size of this CPU"/>
'>
@@ -313,11 +327,13 @@
<metric displayName="Distribution Name"
property="distro.name"
description="name of the Linux distribution"
+ defaultOn="true"
dataType="trait"
displayType="summary" />
<metric displayName="Distribution Version"
property="distro.version"
description="version of the Linux distribution"
+ defaultOn="true"
dataType="trait"
displayType="summary" />
@@ -446,11 +462,12 @@
</runs-inside>
<metric displayName="Inet4Address"
+ defaultOn="true"
property="Trait.net4.address" dataType="trait" displayType="summary"
- description="IP address of the network adaptor"/>
+ description="IP address of the network adapter"/>
- <metric property="Trait.interfaceFlags" displayName="Interface Flags" dataType="trait" displayType="summary"
- description="Flag constants for network related ops"/>
+ <metric property="Trait.interfaceFlags" displayName="Interface Flags" dataType="trait"
+ description="Flag constants for network related operations"/>
<metric property="rxBytes" displayName="Bytes Received" units="bytes" measurementType="trendsup" displayType="summary"
description="The total number of bytes received across this network interface since it started"/>
commit 19f7e436abdaf18a6f42569f71810975647065e3
Merge: 1e48001 1026cd0
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Sep 27 13:16:00 2011 -0400
Merge commit 'origin/master' into feature/metric-tweek
commit 1026cd0039574ee628929c0140b6ce452b0db822
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Tue Sep 27 11:38:03 2011 -0400
[BZ 736517] remove unnecessary loading of grandchildren Resources in
ResourceManagerBean.getResourceLineageAndSiblings() and further optimize
performance of that method (https://bugzilla.redhat.com/show_bug.cgi?id=736517)
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
index de415f4..1eb495e 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
@@ -291,13 +291,14 @@ import org.rhq.core.domain.util.Summary;
+ " FROM Resource res " //
+ " WHERE res.parentResource = :parent " //
+ " AND res.id IN (SELECT rr.id FROM Resource rr JOIN rr.implicitGroups g JOIN g.roles r JOIN r.subjects s WHERE s = :subject)"
- + " AND res.resourceType.category = :category " + " AND res.inventoryStatus = :status "),
+ + " AND res.inventoryStatus = :status " //
+ + " AND (res.resourceType.category = :category OR :category is null)"),
@NamedQuery(name = Resource.QUERY_FIND_CHILDREN_BY_CATEGORY_AND_INVENTORY_STATUS_ADMIN, query = "" //
+ "SELECT res " //
+ " FROM Resource res " //
+ " WHERE res.parentResource = :parent " //
+ " AND res.inventoryStatus = :status " //
- + " AND res.resourceType.category = :category "),
+ + " AND (res.resourceType.category = :category OR :category is null)"),
@NamedQuery(name = Resource.QUERY_FIND_BY_CATEGORY_AND_INVENTORY_STATUS, query = "" //
+ "SELECT res " //
+ " FROM Resource res " //
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
index 16fd8e6..6a10c30 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
@@ -750,74 +750,44 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage
}
public List<ResourceLineageComposite> getResourceLineageAndSiblings(Subject subject, int resourceId) {
- boolean isInventoryManager = authorizationManager.isInventoryManager(subject);
-
- // get the raw resource lineage up to the platform. We'll check the auth below
+ // Get the raw resource lineage up to the platform. We'll check the auth below.
List<Resource> rawResourceLineage = getResourceLineage(resourceId);
int depth = rawResourceLineage.size();
Resource parent = (depth > 1) ? rawResourceLineage.get(depth - 2) : null;
- // record which of the raw ancestry is locked from view
- List<ResourceLineageComposite> resourceLineage = new ArrayList<ResourceLineageComposite>(rawResourceLineage
- .size());
+ // Build up a list of composite Resources for the ancestry that includes which ancestors, if any, should be
+ // locked from view.
+ boolean isInventoryManager = authorizationManager.isInventoryManager(subject);
+ List<ResourceLineageComposite> resourceLineage = new ArrayList<ResourceLineageComposite>(rawResourceLineage.size());
for (Resource resource : rawResourceLineage) {
- resourceLineage.add(new ResourceLineageComposite(resource, !authorizationManager.canViewResource(subject,
- resource.getId())));
+ boolean isLocked = !(isInventoryManager || authorizationManager.canViewResource(subject, resource.getId()));
+ ResourceLineageComposite composite = new ResourceLineageComposite(resource, isLocked);
+ resourceLineage.add(composite);
}
- // fill out the tree, including only the direct ancestors and all viewable relations
+ // Build up the result list, including only the direct ancestors of the Resource and all viewable siblings of
+ // the ancestors. The list will represent a tree, rooted at the platform, in depth-first order.
List<ResourceLineageComposite> result = new LinkedList<ResourceLineageComposite>();
for (ResourceLineageComposite ancestor : resourceLineage) {
- // always include a direct ancestor
+ // Always include a direct ancestor.
result.add(ancestor);
- // if the ancestor is not locked, include relevant children. Also, always show viewable
- // siblings of the target resource.
+ // If the ancestor is not locked, include viewable children.
if (!ancestor.isLocked() || ancestor.getResource() == parent) {
-
- // get children
- Set<Resource> children = ancestor.getResource().getChildResources();
- // remove any that are in the ancestry to avoid repeated handling
+ // Get all viewable committed children.
+ PageList<Resource> children = findChildResourcesByCategoryAndInventoryStatus(subject,
+ ancestor.getResource(), null, InventoryStatus.COMMITTED, PageControl.getUnlimitedInstance());
+ // Remove any that are in the lineage to avoid repeated handling.
children.removeAll(rawResourceLineage);
- // only add the viewable children
- List<Resource> viewableChildren = new ArrayList<Resource>(children.size());
for (Resource child : children) {
- boolean isCommitted = (child.getInventoryStatus() == InventoryStatus.COMMITTED);
- boolean isViewable = (isInventoryManager || authorizationManager.canViewResource(subject, child
- .getId()));
- if (isCommitted && isViewable) {
- // if not a direct ancestor add to the list (direct ancestors already added by default)
- if (!rawResourceLineage.contains(child)) {
- // ensure we have the parent in the entity
- child.getParentResource().getId();
- ResourceLineageComposite composite = new ResourceLineageComposite(child, false);
- result.add(composite);
- }
- viewableChildren.add(child);
- }
- }
-
- // get grandchildren
- for (Resource child : viewableChildren) {
- // This ensures Hibernate actually fetches the parent Resource.
- // ensure we have the parent
+ // Ensure the parentResource field is fetched.
+ //noinspection ConstantConditions
child.getParentResource().getId();
- Set<Resource> grandChildren = child.getChildResources();
- for (Resource grandChild : grandChildren) {
- boolean isCommitted = (grandChild.getInventoryStatus() == InventoryStatus.COMMITTED);
- boolean isViewable = (isInventoryManager || authorizationManager.canViewResource(subject,
- grandChild.getId()));
- if (isCommitted && isViewable) {
- // if not a direct ancestor add to the list (direct ancestors already added by default)
- if (!rawResourceLineage.contains(grandChild)) {
- // ensure we have the parent in the entity
- grandChild.getParentResource().getId();
- ResourceLineageComposite composite = new ResourceLineageComposite(grandChild, false);
- result.add(composite);
- }
- }
- }
+ // The query only returned viewable children, so the composite should not be locked.
+ boolean isLocked = false;
+ ResourceLineageComposite composite = new ResourceLineageComposite(child, isLocked);
+ result.add(composite);
}
}
}
@@ -1070,7 +1040,7 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage
@SuppressWarnings("unchecked")
public PageList<Resource> findChildResourcesByCategoryAndInventoryStatus(Subject user, Resource parent,
- ResourceCategory category, InventoryStatus status, PageControl pageControl) {
+ @Nullable ResourceCategory category, InventoryStatus status, PageControl pageControl) {
pageControl.initDefaultOrderingField("res.name");
Query queryCount;
12 years, 9 months
[rhq] Branch 'feature/performance' - modules/enterprise
by Robert Buck
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java | 21 +++++++---
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/NotifyAgentsOfScheduleUpdatesJob.java | 17 ++++++++
2 files changed, 32 insertions(+), 6 deletions(-)
New commits:
commit 8dc174fc7d93c89e7840856d56798ae9c61fde1e
Author: Robert Buck <rbuck(a)redhat.com>
Date: Tue Sep 27 14:37:41 2011 -0400
[BZ 734599] Change notification of schedule updates to agents so it uses quartz, reducing the time to update a metric schedule on a compat group with 1,000 members from 14s to 1.5s.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java
index 3d537f4..8ae6040 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java
@@ -29,6 +29,14 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Date;
+import java.util.UUID;
+
+import org.quartz.Trigger;
+import org.quartz.Scheduler;
+import org.quartz.JobDetail;
+import org.quartz.JobDataMap;
+import org.quartz.SimpleTrigger;
+import org.quartz.SchedulerException;
import javax.ejb.EJB;
import javax.ejb.Stateless;
@@ -620,6 +628,8 @@ public class MeasurementScheduleManagerBean implements MeasurementScheduleManage
return affectedRows;
}
+ public static final String TRIGGER_NAME = "TriggerName";
+ public static final String TRIGGER_GROUP_NAME = "TriggerGroupName";
public static final String SCHEDULE_SUBQUERY = "ScheduleSubQuery";
public static final String ENTITYCONTEXT_RESOURCEID = "EntityContext.resourceId";
public static final String ENTITYCONTEXT_GROUPID = "EntityContext.groupId";
@@ -640,12 +650,15 @@ public class MeasurementScheduleManagerBean implements MeasurementScheduleManage
DEFAULT_AGENT_GROUP,
NotifyAgentsOfScheduleUpdatesJob.class);
+ final String triggerName = UUID.randomUUID().toString();
SimpleTrigger simpleTrigger = new SimpleTrigger(
- DEFAULT_AGENT_TRIGGER,
+ triggerName,
DEFAULT_AGENT_GROUP,
new Date());
JobDataMap jobDataMap = simpleTrigger.getJobDataMap();
+ jobDataMap.put(TRIGGER_NAME, triggerName);
+ jobDataMap.put(TRIGGER_GROUP_NAME, DEFAULT_AGENT_GROUP);
jobDataMap.put(SCHEDULE_SUBQUERY, scheduleSubQuery);
jobDataMap.put(ENTITYCONTEXT_RESOURCEID, Integer.toString(entityContext.getResourceId()));
jobDataMap.put(ENTITYCONTEXT_GROUPID, Integer.toString(entityContext.getGroupId()));
@@ -655,11 +668,7 @@ public class MeasurementScheduleManagerBean implements MeasurementScheduleManage
if (isJobScheduled(scheduler, DEFAULT_AGENT_JOB, DEFAULT_AGENT_GROUP)) {
simpleTrigger.setJobName(DEFAULT_AGENT_JOB);
simpleTrigger.setJobGroup(DEFAULT_AGENT_GROUP);
- if (isTriggerScheduled(scheduler, DEFAULT_AGENT_TRIGGER, DEFAULT_AGENT_GROUP)) {
- scheduler.rescheduleJob(DEFAULT_AGENT_TRIGGER, DEFAULT_AGENT_GROUP, simpleTrigger);
- } else {
- scheduler.scheduleJob(simpleTrigger);
- }
+ scheduler.scheduleJob(simpleTrigger);
} else {
scheduler.scheduleJob(jobDetail, simpleTrigger);
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/NotifyAgentsOfScheduleUpdatesJob.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/NotifyAgentsOfScheduleUpdatesJob.java
index 86b3f7e..f560699 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/NotifyAgentsOfScheduleUpdatesJob.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/NotifyAgentsOfScheduleUpdatesJob.java
@@ -1,21 +1,38 @@
package org.rhq.enterprise.server.measurement;
import org.quartz.JobDataMap;
+import org.quartz.SchedulerException;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
+import org.rhq.enterprise.server.scheduler.SchedulerBean;
import org.rhq.enterprise.server.scheduler.jobs.AbstractStatefulJob;
import org.rhq.enterprise.server.util.LookupUtil;
import org.rhq.core.domain.common.EntityContext;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
/**
* Job that asynchronously notifies agents of schedule updates.
*/
public class NotifyAgentsOfScheduleUpdatesJob extends AbstractStatefulJob {
+
+ private final Log log = LogFactory.getLog(MeasurementScheduleManagerBean.class);
+
@Override
public void executeJobCode(JobExecutionContext context) throws JobExecutionException {
MeasurementScheduleManagerLocal scheduleManager = LookupUtil.getMeasurementScheduleManager();
JobDataMap jobDataMap = context.getMergedJobDataMap();
+
+ final String triggerName = (String) jobDataMap.get(MeasurementScheduleManagerBean.TRIGGER_NAME);
+ final String triggerGroupName = (String) jobDataMap.get(MeasurementScheduleManagerBean.TRIGGER_GROUP_NAME);
+ try {
+ context.getScheduler().unscheduleJob(triggerName, triggerGroupName);
+ } catch (SchedulerException e) {
+ log.error("Failed unscheduling Quartz trigger: " + triggerName, e);
+ }
+
String scheduleSubQuery = (String) jobDataMap.get(MeasurementScheduleManagerBean.SCHEDULE_SUBQUERY);
EntityContext entityContext = new EntityContext(
Integer.parseInt((String) jobDataMap.get(MeasurementScheduleManagerBean.ENTITYCONTEXT_RESOURCEID)),
12 years, 9 months
[rhq] modules/enterprise
by ips
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java | 38 ++++------
1 file changed, 18 insertions(+), 20 deletions(-)
New commits:
commit ce216a9370e354bfd6089d929504b98be73e7e7b
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Tue Sep 27 13:58:28 2011 -0400
[BZ 739529] fix a regression that was causing the group Configuration tab to
never be displayed (https://bugzilla.redhat.com/show_bug.cgi?id=739529)
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
index 103acdd..1ecd83f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
@@ -76,7 +76,7 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
- * Right panel of the Resource Group view (#ResourceGroup/*).
+ * The right panel of a Resource Group view (#ResourceGroup/* or #Resource/AutoGroup/*).
*
* @author Jay Shaughnessy
* @author Ian Springer
@@ -247,8 +247,6 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
protected void updateTabContent(ResourceGroupComposite groupComposite) {
try {
this.groupComposite = groupComposite;
- ResourceGroup group = groupComposite.getResourceGroup();
- int groupId = group.getId();
getTitleBar().setGroup(groupComposite);
// wipe the canvas views for the current set of subtabs.
@@ -258,13 +256,13 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
Set<ResourceTypeFacet> facets = groupComposite.getResourceFacets().getFacets();
updateSummaryTab();
- updateMonitoringTab(groupId, groupCategory, facets);
- updateInventoryTab(groupId, facets);
+ updateInventoryTab(facets);
+ updateAlertsTab(groupCategory);
+ updateMonitoringTab(facets);
+ updateEventsTab(groupCategory, facets);
updateOperationsTab(groupCategory, facets);
- updateAlertsTab(groupComposite, groupCategory);
- updateConfigurationTab(groupId, groupCategory, facets);
- updateDriftTab(groupComposite, groupCategory, facets);
- updateEventsTab(groupComposite, groupCategory, facets);
+ updateConfigurationTab(groupCategory, facets);
+ updateDriftTab(groupCategory, facets);
this.show();
markForRedraw();
@@ -285,12 +283,13 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
// TODO (ips): Add Timeline subtab?
}
- private void updateMonitoringTab(final int groupId, GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
+ private void updateMonitoringTab(Set<ResourceTypeFacet> facets) {
ViewFactory viewFactory;
// TODO: Once we add an Availability subtab, the Monitoring tab will always be visible, even for groups with
// no metrics.
boolean visible = hasMetricsOfType(this.groupComposite, null);
if (updateTab(this.monitoringTab, visible, true)) {
+ final int groupId = groupComposite.getResourceGroup().getId();
visible = hasMetricsOfType(this.groupComposite, DataType.MEASUREMENT);
viewFactory = (!visible) ? null : new ViewFactory() {
@Override
@@ -352,14 +351,15 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
}
}
- private void updateInventoryTab(final int groupId, Set<ResourceTypeFacet> facets) {
+ private void updateInventoryTab(Set<ResourceTypeFacet> facets) {
// Inventory tab is always visible and enabled.
final boolean canModifyMembers = (!isAutoGroup() && !isAutoCluster() && globalPermissions
.contains(Permission.MANAGE_INVENTORY));
updateSubTab(this.inventoryTab, this.inventoryMembers, true, true, new ViewFactory() {
@Override
public Canvas createView() {
- return new MembersView(inventoryMembers.extendLocatorId("View"), groupId, canModifyMembers);
+ return new MembersView(inventoryMembers.extendLocatorId("View"),
+ groupComposite.getResourceGroup().getId(), canModifyMembers);
}
});
updateSubTab(this.inventoryTab, this.inventoryConn, facets.contains(ResourceTypeFacet.PLUGIN_CONFIGURATION),
@@ -398,7 +398,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
}
}
- private void updateAlertsTab(final ResourceGroupComposite groupComposite, GroupCategory groupCategory) {
+ private void updateAlertsTab(GroupCategory groupCategory) {
// alerts tab is always visible, even for mixed groups
if (updateTab(this.alertsTab, true, true)) {
// alert history is always available
@@ -420,7 +420,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
}
}
- private void updateConfigurationTab(final int groupId, GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
+ private void updateConfigurationTab(GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
boolean visible = (groupCategory == GroupCategory.COMPATIBLE && facets
.contains(ResourceTypeFacet.CONFIGURATION));
Set<Permission> groupPermissions = this.groupComposite.getResourcePermission().getPermissions();
@@ -434,15 +434,14 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
updateSubTab(this.configurationTab, this.configHistory, true, true, new ViewFactory() {
@Override
public Canvas createView() {
- return new HistoryGroupResourceConfigurationView(inventoryConnHistory.extendLocatorId("View"),
+ return new HistoryGroupResourceConfigurationView(configHistory.extendLocatorId("View"),
groupComposite);
}
});
}
}
- private void updateEventsTab(final ResourceGroupComposite groupComposite, GroupCategory groupCategory,
- Set<ResourceTypeFacet> facets) {
+ private void updateEventsTab(GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
// allow mixed groups to show events from supporting resources
boolean visible = (groupCategory == GroupCategory.MIXED || (groupCategory == GroupCategory.COMPATIBLE && facets
.contains(ResourceTypeFacet.EVENT)));
@@ -456,12 +455,11 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
}
}
- private void updateDriftTab(final ResourceGroupComposite resourceComposite, GroupCategory groupCategory,
- Set<ResourceTypeFacet> facets) {
+ private void updateDriftTab(GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
boolean visible = (groupCategory == GroupCategory.COMPATIBLE && facets.contains(ResourceTypeFacet.DRIFT));
Set<Permission> groupPermissions = this.groupComposite.getResourcePermission().getPermissions();
- if (updateTab(this.configurationTab, visible, visible && groupPermissions.contains(Permission.MANAGE_DRIFT))) {
+ if (updateTab(this.driftTab, visible, visible && groupPermissions.contains(Permission.MANAGE_DRIFT))) {
updateSubTab(this.driftTab, this.driftHistory, true, true, new ViewFactory() {
@Override
12 years, 9 months
[rhq] Branch 'feature/metric-tweek' - modules/core modules/plugins
by mazz
modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/MetricsMetadataParser.java | 33 +-
modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml | 44 ---
modules/plugins/byteman/src/main/resources/META-INF/rhq-plugin.xml | 15 -
modules/plugins/hardware/src/main/resources/META-INF/rhq-plugin.xml | 16 -
modules/plugins/hibernate/src/main/resources/META-INF/rhq-plugin.xml | 14 -
modules/plugins/iis/src/main/resources/META-INF/rhq-plugin.xml | 37 --
modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml | 137 ++++------
modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml | 104 ++-----
modules/plugins/jmx/src/main/resources/META-INF/rhq-plugin.xml | 6
modules/plugins/mod-cluster/src/main/resources/META-INF/rhq-plugin.xml | 2
modules/plugins/mysql/src/main/resources/META-INF/rhq-plugin.xml | 26 -
modules/plugins/onewire/src/main/resources/META-INF/rhq-plugin.xml | 2
modules/plugins/oracle/src/main/resources/META-INF/rhq-plugin.xml | 38 +-
modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml | 48 ---
modules/plugins/postgres/src/main/resources/META-INF/rhq-plugin.xml | 4
modules/plugins/rhq-agent/src/main/resources/META-INF/rhq-plugin.xml | 21 -
modules/plugins/rhq-server/src/main/resources/META-INF/rhq-plugin.xml | 14 -
modules/plugins/script/src/main/resources/META-INF/rhq-plugin.xml | 2
modules/plugins/tomcat/src/main/resources/META-INF/rhq-plugin.xml | 7
modules/plugins/twitter/src/main/resources/META-INF/rhq-plugin.xml | 6
20 files changed, 217 insertions(+), 359 deletions(-)
New commits:
commit 1e48001b6037e36d872bc1a31ba1980413716367
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Sep 27 13:12:49 2011 -0400
[BZ 741331] turn off all plugin metrics by default, up all default collection intervals
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/MetricsMetadataParser.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/MetricsMetadataParser.java
index f5b4b5d..77ecd37 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/MetricsMetadataParser.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/MetricsMetadataParser.java
@@ -44,10 +44,11 @@ import org.rhq.core.domain.util.StringUtils;
* @author Greg Hinkle
*/
public class MetricsMetadataParser {
- public static final long MIN_1 = 1L * 60 * 1000L;
- public static final long MIN_5 = 5L * MIN_1;
- public static final long MIN_10 = 10L * MIN_1;
- public static final long MIN_30 = 30L * MIN_1;
+ private static final long MIN_1 = 1L * 60 * 1000L;
+ private static final long MIN_10 = 10L * MIN_1;
+ private static final long MIN_20 = 20L * MIN_1;
+ private static final long MIN_30 = 30L * MIN_1;
+ private static final long MIN_60 = 60L * MIN_1;
public static final long MINIMUM_INTERVAL = MeasurementSchedule.MINIMUM_INTERVAL;
@@ -58,39 +59,41 @@ public class MetricsMetadataParser {
DataType dataType = DataType.valueOf(metricDescriptor.getDataType().toUpperCase());
DisplayType displayType = DisplayType.valueOf(metricDescriptor.getDisplayType().toUpperCase());
- long collectionInterval = MIN_10;
+ long collectionInterval = MIN_30;
MeasurementUnits units = getMeasurementUnits(metricDescriptor.getUnits(), dataType);
switch (dataType) {
case MEASUREMENT: {
switch (resourceType.getCategory()) {
case PLATFORM: {
- collectionInterval = MIN_1;
+ collectionInterval = MIN_10;
break;
}
case SERVER: {
- collectionInterval = MIN_5;
+ collectionInterval = MIN_20;
break;
}
case SERVICE: {
- collectionInterval = MIN_10;
+ collectionInterval = MIN_30;
break;
}
}
- collectionInterval = (displayType == DisplayType.SUMMARY) ? collectionInterval : (collectionInterval * 2);
+ if (displayType != DisplayType.SUMMARY) {
+ collectionInterval *= 2;
+ }
break;
}
case TRAIT: {
- collectionInterval = (displayType == DisplayType.SUMMARY) ? MIN_10 : MIN_30;
+ collectionInterval = (displayType == DisplayType.SUMMARY) ? MIN_30 : MIN_60;
break;
}
case CALLTIME: {
- collectionInterval = MIN_1;
+ collectionInterval = MIN_10;
if (units != MeasurementUnits.MILLISECONDS) {
throw new IllegalStateException("Units must always be set to 'milliseconds' for call-time metrics.");
}
@@ -126,9 +129,11 @@ public class MetricsMetadataParser {
definition.setDestinationType(metricDescriptor.getDestinationType());
// Make sure that all summary properties are on by default.
- if (definition.getDisplayType() == DisplayType.SUMMARY) {
- definition.setDefaultOn(true);
- }
+ // BZ 741331 - we no longer want to imply any metric should be on by default
+ // let the plugin writer tell us explicitly if it should be on by default
+ // if (definition.getDisplayType() == DisplayType.SUMMARY) {
+ // definition.setDefaultOn(true);
+ // }
if ((definition.getNumericType() == NumericType.TRENDSUP)
|| (definition.getNumericType() == NumericType.TRENDSDOWN)) {
diff --git a/modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml
index ad08a22..e88ffbc 100644
--- a/modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/apache/src/main/resources/META-INF/rhq-plugin.xml
@@ -463,19 +463,19 @@
<metric displayName="Number of Concurrent Connections" property="applInboundAssociations"
destinationType="The number of current connections to this application"
- defaultOn="true" defaultInterval="300000" displayType="summary" units="none"/>
+ displayType="summary" units="none"/>
<!-- traits determined via "httpd -V" -->
<metric displayName="Server Built" property="serverBuilt"
description="the date and time this Apache server's binary was compiled"
- dataType="trait" defaultOn="true" displayType="summary"/>
+ dataType="trait" displayType="summary"/>
<!-- traits determined via SNMP (format for property attribute is "MIB_column_name") -->
<metric displayName="Start Time" property="wwwServiceStartTime"
description="the date and time this Apache server was last started"
- dataType="trait" defaultOn="true" displayType="summary"/>
+ dataType="trait" displayType="summary"/>
<!-- Metric collected by pinging availability over http -->
<metric property="rhq_avail_ping_time" displayType="summary" units="milliseconds"
@@ -533,27 +533,27 @@
<metric displayName="Host" property="wwwServiceName"
description="the host name or IP address of this virtual host"
- dataType="trait" defaultOn="true" displayType="summary"/>
+ dataType="trait" displayType="summary"/>
<metric displayName="Port" property="wwwServiceProtocol"
description="the TCP port of this virtual host"
- dataType="trait" defaultOn="true" displayType="summary"/>
+ dataType="trait" displayType="summary"/>
<metric displayName="Administrator" property="wwwServiceContact"
description="the administrator of this virtual host"
- dataType="trait" defaultOn="true" displayType="summary"/>
+ dataType="trait" displayType="summary"/>
<!-- summary metrics for requests - determined via SNMP
(format for property attribute is "MIB_column_name") -->
<metric displayName="Total Number of Requests" property="wwwSummaryInRequests"
description="The number of inbound requests on the service"
- defaultOn="true" defaultInterval="300000" displayType="summary"
+ displayType="summary"
units="none" measurementType="trendsup"/>
<metric displayName="Total Number of Bytes Received" property="wwwSummaryInLowBytes"
description="The number of bytes received by the service"
- defaultOn="true" defaultInterval="300000" displayType="summary"
+ displayType="summary"
units="bytes" measurementType="trendsup"/>
<!-- summary metrics for responses - determined via SNMP
@@ -561,12 +561,12 @@
<metric displayName="Total Number of Responses" property="wwwSummaryOutResponses"
description="The number of outbound requests on the service"
- defaultOn="true" defaultInterval="300000" displayType="summary"
+ displayType="summary"
units="none" measurementType="trendsup"/>
<metric displayName="Total Number of Bytes Sent" property="wwwSummaryOutLowBytes"
description="The number of bytes sent by the service"
- defaultOn="true" defaultInterval="300000" displayType="summary"
+ displayType="summary"
units="bytes" measurementType="trendsup"/>
<!-- per-request-method metrics - determined via SNMP
@@ -574,42 +574,34 @@
<metric displayName="Number of GET Requests" property="wwwRequestInRequests.GET"
description="The number of inbound GET requests on the service"
- defaultOn="true" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Number of HEAD Requests" property="wwwRequestInRequests.HEAD"
description="The number of inbound HEAD requests on the service"
- defaultOn="false" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Number of POST Requests" property="wwwRequestInRequests.POST"
description="The number of inbound POST requests on the service"
- defaultOn="true" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Number of PUT Requests" property="wwwRequestInRequests.PUT"
description="The number of inbound PUT requests on the service"
- defaultOn="false" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Bytes Received for GET Requests" property="wwwRequestInBytes.GET"
description="The number of bytes received by GET requests on the service"
- defaultOn="true" defaultInterval="300000"
units="bytes" measurementType="trendsup"/>
<metric displayName="Bytes Received for HEAD Requests" property="wwwRequestInBytes.HEAD"
description="The number of bytes received by HEAD requests on the service"
- defaultOn="false" defaultInterval="300000"
units="bytes" measurementType="trendsup"/>
<metric displayName="Bytes Received for POST Requests" property="wwwRequestInBytes.POST"
description="The number of bytes received by POST requests on the service"
- defaultOn="true" defaultInterval="300000"
units="bytes" measurementType="trendsup"/>
<metric displayName="Bytes Received for PUT Requests" property="wwwRequestInBytes.PUT"
description="The number of bytes received by PUT requests on the service"
- defaultOn="false" defaultInterval="300000"
units="bytes" measurementType="trendsup"/>
<!-- per-response-status-code metrics - determined via SNMP
@@ -617,78 +609,64 @@
<metric displayName="Number of 200 Responses" property="wwwResponseOutResponses.200"
description="The number of 200 responses generated by this service"
- defaultOn="true" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Number of 301 Responses" property="wwwResponseOutResponses.301"
description="The number of 301 responses generated by this service"
- defaultOn="true" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Number of 302 Responses" property="wwwResponseOutResponses.302"
description="The number of 302 responses generated by this service"
- defaultOn="true" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Number of 401 Responses" property="wwwResponseOutResponses.401"
description="The number of 401 responses generated by this service"
- defaultOn="true" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Number of 403 Responses" property="wwwResponseOutResponses.403"
description="The number of 403 responses generated by this service"
- defaultOn="true" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Number of 404 Responses" property="wwwResponseOutResponses.404"
description="The number of 404 responses generated by this service"
- defaultOn="true" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Number of 500 Responses" property="wwwResponseOutResponses.500"
description="The number of 500 responses generated by this service"
- defaultOn="true" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Bytes Sent for 200 Responses" property="wwwResponseOutBytes.200"
description="The number of bytes sent for 200 responses generated by this service"
- defaultOn="true" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Bytes Sent for 301 Responses" property="wwwResponseOutBytes.301"
description="The number of bytes sent for 301 responses generated by this service"
- defaultOn="true" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Bytes Sent for 302 Responses" property="wwwResponseOutBytes.302"
description="The number of bytes sent for 302 responses generated by this service"
- defaultOn="true" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Bytes Sent for 401 Responses" property="wwwResponseOutBytes.401"
description="The number of bytes sent for 401 responses generated by this service"
- defaultOn="true" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Bytes Sent for 403 Responses" property="wwwResponseOutBytes.403"
description="The number of bytes sent for 403 responses generated by this service"
- defaultOn="true" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Bytes Sent for 404 Responses" property="wwwResponseOutBytes.404"
description="The number of bytes sent for 404 responses generated by this service"
- defaultOn="true" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<metric displayName="Bytes Sent for 500 Responses" property="wwwResponseOutBytes.500"
description="The number of bytes sent for 500 responses generated by this service"
- defaultOn="true" defaultInterval="300000"
units="none" measurementType="trendsup"/>
<!-- response-time metric - determined by parsing the RT logfile that's specified in the plugin config -->
<metric property="ResponseTime" displayName="HTTP Response Time"
- dataType="calltime" defaultOn="false" units="milliseconds" destinationType="URL"
+ dataType="calltime" units="milliseconds" destinationType="URL"
description="The minimum, maximum, and average response times for HTTP requests serviced by this virtual host"/>
<resource-configuration>
diff --git a/modules/plugins/byteman/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/byteman/src/main/resources/META-INF/rhq-plugin.xml
index e1d6c6c..8f50485 100644
--- a/modules/plugins/byteman/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/byteman/src/main/resources/META-INF/rhq-plugin.xml
@@ -85,32 +85,27 @@
displayName="Client Version"
description="The version of the client used by this plugin to talk to the Byteman agent."
category="utilization"
- dataType="trait"
- defaultOn="true" />
+ dataType="trait" />
<metric property="totalNumberOfScripts"
description="The total number of scripts currently deployed in the Byteman agent. Scripts contain one or more rules."
category="utilization"
- displayType="summary"
- defaultOn="true" />
+ displayType="summary" />
<metric property="totalNumberOfRules"
description="The total number of individual rules currently deployed in the Byteman agent"
category="utilization"
- displayType="summary"
- defaultOn="true" />
+ displayType="summary" />
<metric property="totalNumberOfBootJars"
description="The total number of jar files that have been added to the Byteman agent's boot classpath"
category="utilization"
- displayType="summary"
- defaultOn="true" />
+ displayType="summary" />
<metric property="totalNumberOfSystemJars"
description="The total number of jar files that have been added to the Byteman agent's system classpath"
category="utilization"
- displayType="summary"
- defaultOn="true" />
+ displayType="summary" />
<!--
bootJar/systemJar content allow users to push jar content to the RHQ agent machine and manage that content.
diff --git a/modules/plugins/hardware/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/hardware/src/main/resources/META-INF/rhq-plugin.xml
index 3ef6c2e..e195a69 100644
--- a/modules/plugins/hardware/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/hardware/src/main/resources/META-INF/rhq-plugin.xml
@@ -17,14 +17,14 @@
<metric property="gpusAverageTemperature" units="celsius" displayName="Average GPU Temperature" displayType="summary"/>
<metric property="fanAverageSpeed" displayName="Average Fan Speed" displayType="summary"/>
- <metric property="smolt.System Memory" dataType="trait" displayType="summary" displayName="System Memory" defaultInterval="86400"/>
- <metric property="smolt.System Swap" dataType="trait" displayType="summary" displayName="System Swap" defaultInterval="86400"/>
- <metric property="smolt.Vendor" dataType="trait" displayType="summary" displayName="Vendor" defaultInterval="86400"/>
- <metric property="smolt.System" dataType="trait" displayType="summary" displayName="System Model" defaultInterval="86400"/>
- <metric property="smolt.Form factor" dataType="trait" displayType="summary" displayName="Form Factor" defaultInterval="86400"/>
- <metric property="smolt.CPU Vendor" dataType="trait" displayType="summary" displayName="CPU Vendor" defaultInterval="86400"/>
- <metric property="smolt.CPU Model" dataType="trait" displayType="summary" displayName="CPU Model" defaultInterval="86400"/>
- <metric property="smolt.BogoMIPS" dataType="trait" displayType="summary" displayName="BogoMIPS" defaultInterval="86400"/>
+ <metric property="smolt.System Memory" dataType="trait" displayType="summary" displayName="System Memory"/>
+ <metric property="smolt.System Swap" dataType="trait" displayType="summary" displayName="System Swap"/>
+ <metric property="smolt.Vendor" dataType="trait" displayType="summary" displayName="Vendor"/>
+ <metric property="smolt.System" dataType="trait" displayType="summary" displayName="System Model"/>
+ <metric property="smolt.Form factor" dataType="trait" displayType="summary" displayName="Form Factor"/>
+ <metric property="smolt.CPU Vendor" dataType="trait" displayType="summary" displayName="CPU Vendor"/>
+ <metric property="smolt.CPU Model" dataType="trait" displayType="summary" displayName="CPU Model"/>
+ <metric property="smolt.BogoMIPS" dataType="trait" displayType="summary" displayName="BogoMIPS"/>
</server>
diff --git a/modules/plugins/hibernate/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/hibernate/src/main/resources/META-INF/rhq-plugin.xml
index ad8a9cf..dfadc25 100644
--- a/modules/plugins/hibernate/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/hibernate/src/main/resources/META-INF/rhq-plugin.xml
@@ -91,7 +91,7 @@
<metric displayName="Successful Transaction Count" property="SuccessfulTransactionCount"
description="The global number of transactions known to have been successful since the statistics were reset"
- category="throughput" defaultOn="true" measurementType="trendsup"/>
+ category="throughput" measurementType="trendsup"/>
<metric displayName="Query Cache Hit Count" property="QueryCacheHitCount"
description="The global number of cached queries successfully retrieved from cache since the statistics were reset"
@@ -103,11 +103,11 @@
<metric displayName="Connect Count" property="ConnectCount"
description="The global number of connections asked by the sessions (the actual number of connections used may be much smaller depending whether you use a connection pool or not) since the statistics were reset"
- category="throughput" defaultOn="true" measurementType="trendsup"/>
+ category="throughput" measurementType="trendsup"/>
<metric displayName="Start Time" property="StartTime" dataType="trait"
description="The time when the statistics collection started or were last reset"
- category="availability" defaultOn="true" units="epoch_milliseconds" measurementType="dynamic"/>
+ category="availability" units="epoch_milliseconds" measurementType="dynamic"/>
<metric displayName="Second Level Cache Put Count" property="SecondLevelCachePutCount"
description="The global number of cacheable entities/collections put in the cache since the statistics were reset"
@@ -119,11 +119,11 @@
<metric displayName="Session Open Count" property="SessionOpenCount"
description="The global number of sessions closed since the statistics were reset"
- category="throughput" defaultOn="true" measurementType="trendsup"/>
+ category="throughput" measurementType="trendsup"/>
<metric displayName="Transaction Count" property="TransactionCount"
description="The global number of transactions known to have completed since the statistics were reset"
- category="throughput" defaultOn="true" measurementType="trendsup"/>
+ category="throughput" measurementType="trendsup"/>
<metric displayName="Collection Fetch Count" property="CollectionFetchCount"
description="The global number of collections fetched since the statistics were reset"
@@ -131,11 +131,11 @@
<metric displayName="Session Close Count" property="SessionCloseCount"
description="The global number of sessions closed since the statistics were reset"
- category="throughput" defaultOn="true" measurementType="trendsup"/>
+ category="throughput" measurementType="trendsup"/>
<metric displayName="Query Cache Miss Count" property="QueryCacheMissCount"
description="The global number of cached queries *not* found in cache since the statistics were reset"
- category="throughput" defaultOn="true" measurementType="trendsup"/>
+ category="throughput" measurementType="trendsup"/>
<metric displayName="Second Level Cache Miss Count" property="SecondLevelCacheMissCount"
description="The global number of cacheable entities/collections not found in the cache and loaded from the database since the statistics were reset"
diff --git a/modules/plugins/iis/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/iis/src/main/resources/META-INF/rhq-plugin.xml
index 5065353..287f835 100644
--- a/modules/plugins/iis/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/iis/src/main/resources/META-INF/rhq-plugin.xml
@@ -5,184 +5,149 @@
<metric displayName="Bytes Sent"
description="Shows the rate that data bytes are sent by the Web service."
property="Bytes Sent/sec"
- defaultOn="true"
displayType="summary"
measurementType="trendsup"
units="bytes"/>
<metric displayName="Bytes Received"
description="Shows the rate that data bytes are received by the Web service."
property="Bytes Received/sec"
- defaultOn="true"
displayType="summary"
measurementType="trendsup"
units="bytes"/>
<metric displayName="Total Files Sent"
description="Shows the total number of files sent by the Web service (counted since service startup)."
property="Total Files Sent"
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric displayName="Total Files Received"
description="Shows the total number of files received by the Web service (counted since service startup)."
property="Total Files Received"
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric displayName="Total Files Transferred"
description="Shows the sum of Files Sent and Files Received. This is the total number of files transferred by the Web service (counted since service startup)."
property="Total Files Transferred"
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric displayName="Current Anonymous Users"
description="Shows the number of users who currently have an anonymous connection using the Web service."
property="Current Anonymous Users"
- defaultOn="true"
units="none"/>
<metric displayName="Current NonAnonymous Users"
description="Shows the number of users who currently have a non-anonymous connection using the Web service."
property="Current NonAnonymous Users"
- defaultOn="true"
units="none"/>
<metric displayName="Total Anonymous Users"
description="Shows the total number of users who established an anonymous connection with the Web service (counted since service startup)."
property="Total Anonymous Users"
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric property="Total NonAnonymous Users"
description="Shows the total number of users who established a non-anonymous connection with the Web service (counted since service startup)."
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric property="Maximum Anonymous Users"
description="Shows the maximum number of users who established concurrent anonymous connections using the Web service (counted since service startup)."
- defaultOn="true"
units="none"/>
<metric property="Maximum NonAnonymous Users"
description="Shows the maximum number of users who established concurrent non-anonymous connections using the Web service (counted since service startup)."
- defaultOn="true"
units="none"/>
<metric property="Current Connections"
description="Shows the current number of connections established with the Web service."
- defaultOn="true"
displayType="summary"
units="none"/>
<metric property="Maximum Connections"
description="Shows the maximum number of simultaneous connections established with the Web service."
- defaultOn="true"
units="none"/>
<metric property="Total Logon Attempts"
description="Shows the number of logons that have been attempted using the Web service (counted since service startup)."
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric displayName="Total GET Requests"
description="Shows the number of HTTP requests using the GET method (counted since service startup). GET requests are generally used for basic file retrievals or image maps, though they can be used with forms."
property="Total Get Requests"
- defaultOn="true"
displayType="summary"
measurementType="trendsup"
units="none"/>
<metric displayName="Total POST Requests"
description="Shows the number of HTTP requests using the POST method (counted since service startup). POST requests are generally used for forms or gateway requests."
property="Total Post Requests"
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric displayName="Total HEAD Requests"
description="Shows the number of HTTP requests using the HEAD method (counted since service startup). Head requests generally indicate a client is querying the state of a document they already have to see if it needs to be refreshed."
property="Total Head Requests"
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric displayName="Total PUT Requests"
description="Shows the number of HTTP requests using the PUT method (counted since service startup)."
property="Total Put Requests"
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric displayName="Total DELETE Requests"
description="Shows the number of HTTP requests using the DELETE method (counted since service startup). Delete requests are generally used for file removals."
property="Total Delete Requests"
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric displayName="Total TRACE Requests"
description="Shows the number of HTTP requests using the TRACE method (counted since service startup). TRACE requests allow the client to see what is being received at the end of the request chain and use the information for diagnostic purposes."
property="Total Trace Requests"
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric property="Total Other Request Methods"
description="Shows the number of HTTP requests that are not OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, MOVE, COPY, MKCOL, PROPFIND, PROPPATCH, MS-SEARCH, LOCK or UNLOCK methods (counted since service startup). These may include LINK or other methods supported by gateway applications."
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric property="Total Method Requests"
description="Shows the number of all HTTP requests (counted since service startup)."
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric property="Total CGI Requests"
description="Shows the total number of CGI requests. CGI requests are custom gateway executables (.exe) the administrator can install to add forms processing or other dynamic data sources. CGI requests initiate a process on the server which can be a large drain on server resources. The count is the total since service startup."
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric property="Total ISAPI Extension Requests"
description="Shows the total number of ISAPI Extension Requests. ISAPI Extension Requests are custom gateway Dynamic Link Libraries (.dll) the administrator can install to add forms processing or other dynamic data sources. Unlike CGI requests, ISAPI requests are simple calls to a DLL library routine, thus they are better suited to high performance gateway applications. The count is the total since service startup."
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric property="Total Not Found Errors"
description="Shows the number of requests that could not be satisfied by the server because the requested document could not be found. These are generally reported as an HTTP 404 error code to the client. The count is the total since service startup."
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric property="Total Locked Errors"
description="Shows the number of requests that could not be satisfied by the server because the requested was locked. These are generally reported as an HTTP 423 error code to the client. The count is the total since service startup."
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric property="Current CGI Requests"
description="Shows the current number of CGI requests that are simultaneously being processed by the Web service."
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric property="Current ISAPI Extension Requests"
description="Shows the current number of Extension requests that are simultaneously being processed by the Web service."
- defaultOn="true"
units="none"/>
<metric property="Maximum CGI Requests"
description="Shows the maximum number of CGI requests simultaneously processed by the Web service."
- defaultOn="true"
units="none"/>
<metric property="Maximum ISAPI Extension Requests"
description="Shows the maximum number of Extension requests simultaneously processed by the Web service."
- defaultOn="true"
units="none"/>
<metric property="Total Blocked Async I/O Requests"
description="Shows the number of total requests temporarily blocked due to bandwidth throttling settings (counted since service startup)."
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric property="Total Allowed Async I/O Requests"
description="Shows the total number of requests allowed by bandwidth throttling settings (counted since service startup). When bandwidth throttling is defined, the number of allowed user requests is restricted."
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric property="Total Rejected Async I/O Requests"
description="Shows the total number of requests rejected due to bandwidth throttling settings (counted since service startup)."
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric property="Current Blocked Async I/O Requests"
description="Shows current requests that are temporarily blocked due to bandwidth throttling settings."
- defaultOn="true"
units="none"/>
<metric property="Measured Async I/O Bandwidth Usage"
description="Shows the measured bandwidth of asynchronous I/O averaged over a minute."
- defaultOn="true"
units="none"/>
'>
]>
@@ -229,12 +194,10 @@
<!-- Server only -->
<metric property="Total Connection Attempts (all instances)"
description="Shows the number of connections that have been attempted using the Web service (counted since service startup). This counter is for all instances listed."
- defaultOn="true"
measurementType="trendsup"
units="none"/>
<metric property="Service Uptime"
description="The amount of time this service has been up for"
- defaultOn="true"
units="seconds"/>
<service name="VHost" description="IIS VHost"
diff --git a/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
index a2d68c5..6b0ddb4 100644
--- a/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
@@ -4,7 +4,7 @@
<!ENTITY managedObjectMetrics '
<metric property="runState" displayType="summary"
- defaultOn="true" defaultInterval="600000" dataType="trait" category="performance"/>
+ dataType="trait" category="performance"/>
'>
<!ENTITY datasourceAndConnectionFactoryOperations '
@@ -49,42 +49,42 @@
<!ENTITY datasourceMetrics '
<!-- Traits -->
<metric property="poolJndiName" displayType="summary" displayName="Pool JNDI Name"
- defaultOn="true" defaultInterval="600000" dataType="trait" category="performance"
+ dataType="trait" category="performance"
description="the JNDI name of the connection pool for this datasource"/>
<!-- Numerics -->
<metric property="availableConnectionCount" measurementType="dynamic" displayType="summary"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"
+ dataType="measurement" category="performance"
description="the maximum number of connections that are available"/>
<metric property="connectionCount" measurementType="dynamic" displayType="summary"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"
+ dataType="measurement" category="performance"
description="the number of connections that are currently in the pool"/>
<metric property="connectionCreatedCount" measurementType="dynamic" displayType="detail"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"
+ dataType="measurement" category="performance"
description="the number of connections that have been created since the datasource was last started"/>
<metric property="connectionDestroyedCount" measurementType="dynamic" displayType="detail"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"
+ dataType="measurement" category="performance"
description="the number of connections that have been destroyed since the datasource was last started"/>
<metric property="inUseConnectionCount" measurementType="dynamic" displayType="detail"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"
+ dataType="measurement" category="performance"
description="the number of connections that are currently in use"/>
<metric property="local-transaction" displayType="summary"
- defaultOn="true" defaultInterval="600000" dataType="trait" category="performance"/>
+ dataType="trait" category="performance"/>
<metric property="maxConnectionsInUseCount" measurementType="dynamic" displayType="detail"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"
+ dataType="measurement" category="performance"
description="the most connections that have been simultaneously in use since this datasource was started"/>
<metric property="maxSize" measurementType="dynamic" displayType="detail" displayName="Max Size"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
<metric property="minSize" measurementType="dynamic" displayType="detail" displayName="Min Size"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
'>
<!-- NOTE: For Datasource ManagedProperty annotations, see:
@@ -593,39 +593,39 @@
<!ENTITY connectionFactoryMetrics '
<!-- Traits -->
- <metric property="poolJndiName" displayType="summary" displayName="Pool JNDI Name" defaultOn="true"
- defaultInterval="600000" dataType="trait" category="performance"/>
+ <metric property="poolJndiName" displayType="summary" displayName="Pool JNDI Name"
+ dataType="trait" category="performance"/>
<!-- Numerics -->
<metric property="availableConnectionCount" measurementType="dynamic" displayType="summary"
displayName="Available Connection Count" description="Number of available connections."
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
<metric property="connectionCount" measurementType="dynamic" displayType="summary"
- displayName="Connection Count" defaultOn="true" defaultInterval="600000" dataType="measurement"
+ displayName="Connection Count" dataType="measurement"
category="performance"/>
<metric property="connectionCreatedCount" measurementType="dynamic" displayType="detail"
- displayName="Connection Created Count" defaultOn="true" defaultInterval="600000"
+ displayName="Connection Created Count"
dataType="measurement" category="performance"/>
<metric property="connectionDestroyedCount" measurementType="dynamic" displayType="detail"
- displayName="Connection Destroyed Count" defaultOn="true" defaultInterval="600000"
+ displayName="Connection Destroyed Count"
dataType="measurement" category="performance"/>
<metric property="inUseConnectionCount" measurementType="dynamic" displayType="detail"
displayName="In Use Connection Count" description="Mumber of connections currently in use."
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
<metric property="maxConnectionsInUseCount" measurementType="dynamic" displayType="detail"
displayName="Max Connections In Use Count" description="Maximum number of maximum connections that have been in use."
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
<metric property="maxSize" measurementType="dynamic" displayType="detail" displayName="Max Size"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
<metric property="minSize" measurementType="dynamic" displayType="detail" displayName="Min Size"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
'>
<!-- These are the operations that both Topics and Queues have. -->
@@ -672,14 +672,14 @@
<!ENTITY webApplicationContextMetrics '
<metric property="clustered" dataType="trait" displayType="summary"
- description="True if this web application context is clustered" defaultOn="true" defaultInterval="3600000" />
+ description="True if this web application context is clustered" />
<metric property="virtualHost"
dataType="trait" displayType="summary"
description="the virtual host with which this context is associated"/>
<metric property="responseTime"
- dataType="calltime" defaultOn="false" defaultInterval="600000" units="milliseconds" destinationType="URL"
+ dataType="calltime" defaultOn="false" units="milliseconds" destinationType="URL"
description="the minimum, maximum, and average response times for requests serviced by this webapp"/>
<metric property="activeSessions"
@@ -782,30 +782,30 @@
<!-- default interval == 600000 ms == 10 min -->
<metric property="methodInvocationTime" dataType="calltime" units="milliseconds"
- defaultOn="false" defaultInterval="600000" destinationType="Method Name"
+ defaultOn="false" destinationType="Method Name"
description="The minimum, maximum, and average invocation times for each of the methods exposed by this EJB"/>
'>
<!ENTITY ejb3StatefulSessionBeanMetrics '
<metric property="cacheSize" measurementType="dynamic" displayType="detail" displayName="Cache Size"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
<metric property="passivatedCount" measurementType="dynamic" displayType="detail" displayName="Passivated Count"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
<metric property="totalSize" measurementType="dynamic" displayType="detail" displayName="Total Size"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
'>
<!ENTITY ejb3MessageDrivenBeanMetrics '
<metric property="minPoolSize" measurementType="dynamic" displayType="detail" displayName="Minimum Pool Size"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
<metric property="maxPoolSize" measurementType="dynamic" displayType="detail" displayName="Maximum Pool Size"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
<metric property="maxMessages" measurementType="dynamic" displayType="detail" displayName="Maximum number of Messages"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
'>
<!ENTITY ejb2PoolMetrics '
@@ -827,7 +827,7 @@
<!ENTITY ejb2SessionBeanMetrics '
<!-- default interval == 600000 ms == 10 min -->
<metric property="methodInvocationTime" dataType="calltime" units="milliseconds"
- defaultOn="false" defaultInterval="600000" destinationType="Method Name"
+ defaultOn="false" destinationType="Method Name"
description="The minimum, maximum, and average invocation times for each of the methods exposed by this EJB"/>
'>
@@ -902,8 +902,7 @@
<!ENTITY ejb2EntityBeanMetrics '
<metric property="CacheSize"
displayName="Cache Size"
- displayType="summary"
- defaultOn="true"/>
+ displayType="summary"/>
'>
<!ENTITY subscriptionsResultProperty '
@@ -1139,34 +1138,34 @@
<metric displayName="Active Thread Count" property="MCBean|ServerInfo|*|activeThreadCount"
description="The current number of active threads for this app server instance"
- defaultInterval="300000" displayType="summary" category="throughput"/>
+ displayType="summary" category="throughput"/>
<metric displayName="Active Thread Group Count" property="MCBean|ServerInfo|*|activeThreadGroupCount"
description="The current number of active thread groups for this app server instance"
- defaultInterval="300000" defaultOn="true" category="throughput"/>
+ category="throughput"/>
<metric displayName="JVM Free Memory" property="MCBean|ServerInfo|*|freeMemory" displayType="summary"
description="An approximation of the total amount of memory currently available in the app server JVM for future allocated objects, measured in bytes"
- defaultInterval="300000" defaultOn="true" category="utilization" units="bytes"/>
+ category="utilization" units="bytes"/>
<metric displayName="JVM Max Memory" property="MCBean|ServerInfo|*|maxMemory"
description="The maximum amount of memory that the app server JVM will attempt to use, measured in bytes; if there is no inherent limit then the value Long.MAX_VALUE will be returned"
- defaultInterval="1800000" defaultOn="true" category="utilization" units="bytes"/>
+ category="utilization" units="bytes"/>
<metric displayName="JVM Total Memory" property="MCBean|ServerInfo|*|totalMemory" displayType="summary"
description="The total amount of memory currently available in the app server JVM for current and future objects, measured in bytes"
- defaultInterval="300000" defaultOn="true" category="utilization" units="bytes"/>
+ category="utilization" units="bytes"/>
<metric displayName="Total Transactions" property="MCBean|JTA|*|transactionCount" measurementType="trendsup"
- defaultInterval="300000" defaultOn="true" category="utilization"
+ category="utilization"
description="Total number of transactions since last restart"/>
<metric displayName="Transactions Committed" property="MCBean|JTA|*|commitCount" displayType="summary" measurementType="trendsup"
- defaultInterval="600000" defaultOn="true" category="utilization"
+ category="utilization"
description="Number of transactions committed since last restart"/>
<metric displayName="Transactions Rolled Back" property="MCBean|JTA|*|rollbackCount" measurementType="trendsup"
- defaultInterval="600000" defaultOn="true" category="utilization"
+ category="utilization"
description="Number of transactions rolled back since last restart"/>
<event name="logEntry" description="an entry was appended to a log file"/>
@@ -1252,7 +1251,7 @@
displayName="Maximum Request Time"
description="the maximum time it took to process a request since the last restart"
units="milliseconds"
- defaultOn="true" category="performance"/>
+ category="performance"/>
<metric property="requestCount"
displayName="Request Count" description="the total number of requests processed since the last restart"
@@ -1260,16 +1259,16 @@
<metric property="errorCount"
displayName="Error Count" description="the number of errors while processing requests since the last restart"
- defaultOn="true" category="utilization" measurementType="trendsup"/>
+ category="utilization" measurementType="trendsup"/>
<metric property="ThreadPool|currentThreadsBusy"
displayName="Current Active Threads"
- defaultOn="true" category="utilization" displayType="summary"
+ category="utilization" displayType="summary"
description="the number of threads for this connector that are currently active"/>
<metric property="ThreadPool|currentThreadCount"
displayName="Current Thread Count"
- defaultOn="true" category="utilization" displayType="summary"
+ category="utilization" displayType="summary"
description="the number of threads for this connector that currently exist"/>
</service>
@@ -1580,7 +1579,7 @@
<metric property="custom.transactionType" displayName="Transaction Type" displayType="summary"
description="The type of transactions used by this connection factory - Local or XA"
- defaultOn="true" defaultInterval="600000" dataType="trait" category="performance"/>
+ dataType="trait" category="performance"/>
&managedObjectMetrics;
&connectionFactoryMetrics;
@@ -1759,54 +1758,54 @@
<!-- Traits -->
<metric property="createdProgrammatically" displayType="summary"
- defaultOn="true" defaultInterval="600000" dataType="trait" category="performance"
+ dataType="trait" category="performance"
description="Was this queue created programmatically? If Yes, the queue will not survive a restart of the application server. If No, the queue was created via a deployment XML file."/>
<!-- NOTE: We have to make this a trait rather than a resource config prop due to a bug in JBMESSAGING
(see https://jira.jboss.org/jira/browse/JBAS-6721). -->
<metric property="messageCounterHistoryDayLimit"
- defaultOn="true" defaultInterval="600000" dataType="trait" category="performance"
+ dataType="trait" category="performance"
description="This queue's message counter history day limit - <0: unlimited, =0: history disabled, >0: maximum day count"/>
<!-- Numerics -->
<metric property="consumerCount" measurementType="dynamic" displayType="summary" displayName="Consumer Count"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="throughput"
+ dataType="measurement" category="throughput"
description="The number of consumers on the queue"/>
<metric property="deliveringCount" measurementType="dynamic" displayType="detail" displayName="Delivering Count"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="throughput"
+ dataType="measurement" category="throughput"
description="The number of messages currently being delivered"/>
<metric property="messageCount" measurementType="dynamic" displayType="summary" displayName="Message Count"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="throughput"
+ dataType="measurement" category="throughput"
description="The number of messages in the queue"/>
<metric property="scheduledMessageCount" measurementType="dynamic" displayType="detail" displayName="Scheduled Message Count"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="throughput"
+ dataType="measurement" category="throughput"
description="The number of scheduled messages in the queue"/>
<metric property="messageStatistics.count" measurementType="dynamic" displayType="detail" displayName="Count"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="utilization"
+ dataType="measurement" category="utilization"
description="The total message count since startup or last counter reset"/>
<metric property="messageStatistics.countDelta" measurementType="dynamic" displayType="detail" displayName="Count Delta"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="utilization"
+ dataType="measurement" category="utilization"
description="The message count delta since last method call"/>
<metric property="messageStatistics.depth" measurementType="dynamic" displayType="detail" displayName="Depth"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="utilization"
+ dataType="measurement" category="utilization"
description="The current message count of pending messages within the queue waiting for dispatch"/>
<metric property="messageStatistics.depthDelta" measurementType="dynamic" displayType="detail" displayName="Depth Delta"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="utilization"
+ dataType="measurement" category="utilization"
description="The message count delta of pending messages since last method call"/>
<metric property="messageStatistics.timeLastUpdate" measurementType="dynamic" displayType="detail" displayName="Time Last Update"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="utilization"
+ dataType="measurement" category="utilization"
description="The timestamp of the last message add"/>
- <metric property="clustered" dataType="trait" description="True if this queue is clustered, false otherwise" defaultInterval="3600000" defaultOn="true"/>
+ <metric property="clustered" dataType="trait" description="True if this queue is clustered, false otherwise" />
<resource-configuration>
@@ -2110,42 +2109,42 @@
<!-- Traits -->
<metric property="createdProgrammatically" displayType="summary"
- defaultOn="true" defaultInterval="600000" dataType="trait" category="performance"
+ dataType="trait" category="performance"
description="Was this topic created programmatically? If Yes, the topic will not survive a restart of the application server. If No, the topic was created via a deployment XML file."/>
<!-- NOTE: We have to make this a trait rather than a resource config prop due to a bug in JBMESSAGING
(see https://jira.jboss.org/jira/browse/JBAS-6721). -->
<metric property="messageCounterHistoryDayLimit"
- defaultOn="true" defaultInterval="600000" dataType="trait" category="performance"
+ dataType="trait" category="performance"
description="This topic's message counter history day limit - <0: unlimited, =0: history disabled, >0: maximum day count"/>
<!-- Numerics -->
<metric property="allMessageCount" measurementType="dynamic" displayType="summary" displayName="All Message Count"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="throughput"
+ dataType="measurement" category="throughput"
description="The count of all messages in all subscriptions to this topic"/>
<metric property="allSubscriptionsCount" measurementType="dynamic" displayType="summary" displayName="All Subscriptions Count"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="throughput"
+ dataType="measurement" category="throughput"
description="The count of all subscriptions to this topic"/>
<metric property="durableMessageCount" measurementType="dynamic" displayType="detail" displayName="Durable Message Count"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="throughput"
+ dataType="measurement" category="throughput"
description="The count of all messages for all durable subscriptions to this topic"/>
<metric property="durableSubscriptionsCount" measurementType="dynamic" displayType="detail" displayName="Durable Subscriptions Count"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="throughput"
+ dataType="measurement" category="throughput"
description="The count of all durable subscriptions to this topic"/>
<metric property="nonDurableMessageCount" measurementType="dynamic" displayType="detail" displayName="Non Durable Message Count"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="throughput"
+ dataType="measurement" category="throughput"
description="The count of all messages in all non durable subscriptions to this topic"/>
<metric property="nonDurableSubscriptionsCount" measurementType="dynamic" displayType="detail" displayName="Non Durable Subscriptions Count"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="throughput"
+ dataType="measurement" category="throughput"
description="The count of all non durable subscriptions to this topic"/>
- <metric property="clustered" dataType="trait" description="True if this topic is clustered, false otherwise" defaultInterval="3600000" defaultOn="true"/>
+ <metric property="clustered" dataType="trait" description="True if this topic is clustered, false otherwise" />
<resource-configuration>
@@ -2566,7 +2565,7 @@
&ejb2StatelessSessionBeanMetrics;
<metric property="methodInvocationTime" dataType="calltime" units="milliseconds"
- defaultOn="false" defaultInterval="600000" destinationType="Method Name"
+ defaultOn="false" destinationType="Method Name"
description="The minimum, maximum, and average invocation times for each of the methods exposed by this EJB"/>
</service>
@@ -2582,7 +2581,7 @@
&ejb2StatefulSessionBeanMetrics;
<metric property="methodInvocationTime" dataType="calltime" units="milliseconds"
- defaultOn="false" defaultInterval="600000" destinationType="Method Name"
+ defaultOn="false" destinationType="Method Name"
description="The minimum, maximum, and average invocation times for each of the methods exposed by this EJB"/>
</service>
diff --git a/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
index 2d11f7a..bb9fb7d 100644
--- a/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
@@ -202,34 +202,34 @@
<metric property="jboss.system:type=ServerInfo:ActiveThreadCount" displayName="Active Thread Count"
description="The current number of active threads for this app server instance"
- defaultInterval="300000" displayType="summary" category="throughput"/>
+ displayType="summary" category="throughput"/>
<metric property="jboss.system:type=ServerInfo:ActiveThreadGroupCount" displayName="Active Thread Group Count"
description="The current number of active thread groups for this app server instance"
- defaultInterval="300000" defaultOn="true" category="throughput"/>
+ category="throughput"/>
<metric property="jboss.system:type=ServerInfo:FreeMemory" displayName="JVM Free Memory" displayType="summary"
description="An approximation of the total amount of memory currently available in the app server JVM for future allocated objects, measured in bytes"
- defaultInterval="300000" defaultOn="true" category="utilization" units="bytes"/>
+ category="utilization" units="bytes"/>
<metric property="jboss.system:type=ServerInfo:MaxMemory" displayName="JVM Max Memory"
description="The maximum amount of memory that the app server JVM will attempt to use, measured in bytes; if there is no inherent limit then the value Long.MAX_VALUE will be returned"
- defaultInterval="1800000" defaultOn="true" category="utilization" units="bytes"/>
+ category="utilization" units="bytes"/>
<metric property="jboss.system:type=ServerInfo:TotalMemory" displayName="JVM Total Memory" displayType="summary"
description="The total amount of memory currently available in the app server JVM for current and future objects, measured in bytes"
- defaultInterval="300000" defaultOn="true" category="utilization" units="bytes"/>
+ category="utilization" units="bytes"/>
<metric property="jboss:service=TransactionManager:TransactionCount" displayName="Total Transactions" measurementType="trendsup"
- defaultInterval="300000" defaultOn="true" category="utilization"
+ category="utilization"
description="Total number of transactions since last restart"/>
<metric property="jboss:service=TransactionManager:CommitCount" displayName="Transactions Committed" displayType="summary" measurementType="trendsup"
- defaultInterval="600000" defaultOn="true" category="utilization"
+ category="utilization"
description="Number of transactions commited since last restart"/>
<metric property="jboss:service=TransactionManager:RollbackCount" displayName="Transactions Rolledback" measurementType="trendsup"
- defaultInterval="600000" defaultOn="true" category="utilization"
+ category="utilization"
description="Number of transactions commited since last restart"/>
<event name="logEntry" description="an entry in a log file"/>
@@ -389,7 +389,7 @@
displayName="Maximum Request Time"
description="Maximum time it took to process a request"
units="milliseconds"
- defaultOn="true" category="performance"/>
+ category="performance"/>
<!-- jboss.web:name=http-0.0.0.0-8080,type=GlobalRequestProcessor:requestCount -->
<metric property="jboss.web:name=%schema%%dash%%address%-%port%,type=GlobalRequestProcessor:requestCount"
@@ -399,17 +399,17 @@
<!-- jboss.web:name=http-0.0.0.0-8080,type=GlobalRequestProcessor:errorCount -->
<metric property="jboss.web:name=%schema%%dash%%address%-%port%,type=GlobalRequestProcessor:errorCount"
displayName="Error count" description="Number of errors while processing since last restart."
- defaultOn="true" category="utilization" measurementType="trendsup"/>
+ category="utilization" measurementType="trendsup"/>
<!-- jboss.web:name=http-0.0.0.0-8080,type=ThreadPool:currentThreadsBusy -->
<metric property="jboss.web:name=%schema%%dash%%address%-%port%,type=ThreadPool:currentThreadsBusy"
displayName="Threads Active"
- defaultOn="true" category="utilization" displayType="summary"/>
+ category="utilization" displayType="summary"/>
<!-- jboss.web:name=http-0.0.0.0-8080,type=ThreadPool:currentThreadCount -->
<metric property="jboss.web:name=%schema%%dash%%address%-%port%,type=ThreadPool:currentThreadCount"
displayName="Threads Allocated"
- defaultOn="true" category="utilization" displayType="summary"/>
+ category="utilization" displayType="summary"/>
</service>
<service name="VHost"
@@ -426,7 +426,7 @@
<metric property="jboss.web:type=Host,host=%name%:aliases"
description="The aliases for this virtual host"
displayName="Aliases"
- defaultOn="true" dataType="trait" />
+ dataType="trait" />
</service>
</server>
@@ -458,20 +458,20 @@
created."/>
<metric displayName="Total Connections" property="ConnectionCount"
- category="utilization" defaultOn="true" displayType="summary"
+ category="utilization" displayType="summary"
description="Total Number of Connections for the Connection Pool, both active and in-active."/>
<metric displayName="Available Connections" property="AvailableConnectionCount"
- category="utilization" defaultOn="true" displayType="summary"
+ category="utilization" displayType="summary"
description="Number of available connections in the connection pool in-active and waiting."/>
<metric displayName="Active Connections" property="InUseConnectionCount"
- category="utilization" defaultOn="true" displayType="summary"
+ category="utilization" displayType="summary"
description="Number of Connections currently supporting clients."/>
<metric displayName="Connections Created" property="ConnectionCreatedCount"
- category="utilization" defaultOn="true" displayType="summary"
+ category="utilization" displayType="summary"
measurementType="trendsup"
description="Number of Connections created since the Connection Pool was created."/>
<metric displayName="Connections Destroyed" property="ConnectionDestroyedCount"
- category="utilization" defaultOn="true" displayType="summary"
+ category="utilization" displayType="summary"
measurementType="trendsup"
description="Number of Connections destroyed since the Connection Pool was created."/>
@@ -598,33 +598,33 @@
<metric property="AvailableConnectionCount" measurementType="dynamic" displayType="summary"
displayName="Available Connection Count" description="Number of available connections."
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
<metric property="ConnectionCount" measurementType="dynamic" displayType="summary"
- displayName="Connection Count" defaultOn="true" defaultInterval="600000" dataType="measurement"
+ displayName="Connection Count" dataType="measurement"
category="performance"/>
<metric property="ConnectionCreatedCount" measurementType="dynamic" displayType="detail"
- displayName="Connection Created Count" defaultOn="true" defaultInterval="600000"
+ displayName="Connection Created Count"
dataType="measurement" category="performance"/>
<metric property="ConnectionDestroyedCount" measurementType="dynamic" displayType="detail"
- displayName="Connection Destroyed Count" defaultOn="true" defaultInterval="600000"
+ displayName="Connection Destroyed Count"
dataType="measurement" category="performance"/>
<metric property="InUseConnectionCount" measurementType="dynamic" displayType="detail"
displayName="In Use Connection Count" description="Mumber of connections currently in use."
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
<metric property="MaxConnectionsInUseCount" measurementType="dynamic" displayType="detail"
displayName="Max Connections In Use Count" description="Maximum number of maximum connections that have been in use."
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
<metric property="MaxSize" measurementType="dynamic" displayType="detail" displayName="Max Size"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
<metric property="MinSize" measurementType="dynamic" displayType="detail" displayName="Min Size"
- defaultOn="true" defaultInterval="600000" dataType="measurement" category="performance"/>
+ dataType="measurement" category="performance"/>
<resource-configuration>
@@ -969,27 +969,27 @@
<metric property="jboss.mq:service=MessageCache:CacheHits" displayName="JMS Message Cache Hits"
description="The number of cache hits to the JMS Message Cache"
- defaultInterval="300000" defaultOn="false" category="throughput" measurementType="trendsup"/>
+ defaultOn="false" category="throughput" measurementType="trendsup"/>
<metric property="jboss.mq:service=MessageCache:CacheMisses" displayName="JMS Message Cache Misses"
description="The number of cache misses to the JMS Message Cache"
- defaultInterval="300000" defaultOn="false" category="throughput" measurementType="trendsup"/>
+ defaultOn="false" category="throughput" measurementType="trendsup"/>
<metric property="jboss.mq:service=MessageCache:CurrentMemoryUsage" displayName="JMS Message Cache Current Memory Usage"
description="The total memory currently in use by the JMS Message Cache"
- defaultInterval="300000" defaultOn="false" category="utilization" units="bytes"/>
+ defaultOn="false" category="utilization" units="bytes"/>
<metric property="jboss.mq:service=MessageCache:HighMemoryMark" displayName="JMS Message Cache High Memory Mark"
description="The peak amount of memory the JMS Message Cache has actively used since server start"
- defaultInterval="300000" defaultOn="false" category="utilization" units="bytes"/>
+ defaultOn="false" category="utilization" units="bytes"/>
<metric property="jboss.mq:service=MessageCache:MaxMemoryMark" displayName="JMS Message Cache Max Memory Mark"
description="The maximum amount of memory the JMS Message Cache is allowed to use"
- defaultInterval="300000" defaultOn="false" category="utilization" units="bytes"/>
+ defaultOn="false" category="utilization" units="bytes"/>
<metric property="jboss.mq:service=MessageCache:TotalCacheSize" displayName="JMS Message Cache Size"
description="The number of messages currently in the JMS Message Cache"
- defaultInterval="300000" defaultOn="false" category="utilization"/>
+ defaultOn="false" category="utilization"/>
<service name="JMQ JMS Queue" class="JMSComponent"
discovery="org.rhq.plugins.jmx.MBeanResourceDiscoveryComponent"
@@ -1046,26 +1046,22 @@
<metric displayName="Messages in Queue"
property="QueueDepth"
category="utilization"
- defaultOn="true"
displayType="summary"
description="The number of undelivered messages in the queue."/>
<metric displayName="Receivers Count"
property="ReceiversCount"
category="utilization"
- defaultOn="true"
description="The number of ClientConsumers waiting for a message."/>
<metric displayName="Scheduled Message Count"
property="ScheduledMessageCount"
category="utilization"
- defaultOn="true"
description="The number of messages waiting to be scheduled"/>
<metric displayName="In Process Message Count"
property="InProcessMessageCount"
category="utilization"
- defaultOn="true"
description="The number of messages received by clients but not acknowledged (from AS 4.0.5)"/>
<resource-configuration>
@@ -1386,37 +1382,31 @@
<metric displayName="All Message Counter"
property="AllMessageCount"
category="utilization"
- defaultOn="true"
displayType="summary"
description="Returns the total message count for all subscriptions."/>
<metric displayName="Durable Message Count"
property="DurableMessageCount"
category="utilization"
- defaultOn="true"
displayType="summary"
description="Total number of messages for all durable subscriptions."/>
<metric displayName="Non-durable Message Count"
property="NonDurableMessageCount"
category="utilization"
- defaultOn="true"
displayType="summary"
description="Total number of messages for all non-durable subscriptions."/>
<metric displayName="All Subscription Count"
property="AllSubscriptionsCount"
category="utilization"
- defaultOn="true"
displayType="summary"
description="Number of subscriptions waiting for a message."/>
<metric displayName="Durable Subscription Count"
property="DurableSubscriptionsCount"
category="utilization"
- defaultOn="true"
displayType="summary"
description="Number of durable subscriptions waiting for a message."/>
<metric displayName="Non-durable Subscription Count"
property="NonDurableSubscriptionsCount"
category="utilization"
- defaultOn="true"
displayType="summary"
description="Number of non-durable subscriptions waiting for a message."/>
@@ -1621,24 +1611,20 @@
<metric displayName="Messages in Queue"
property="MessageCount"
category="utilization"
- defaultOn="true"
displayType="summary"
description="The number of messages in the queue."/>
<metric displayName="Consumer Count"
property="ConsumerCount"
category="utilization"
- defaultOn="true"
description="The number of ClientConsumers waiting for a message."/>
<metric displayName="Scheduled Message Count"
property="ScheduledMessageCount"
category="utilization"
- defaultOn="true"
description="The number of scheduled messages in the Queue"/>
<metric displayName="Created programmatically"
property="CreatedProgrammatically"
dataType="trait"
displayType="summary"
- defaultOn="true"
description="Was this Queue created dynamically" />
<metric displayName="Delivering Count"
property="DeliveringCount"
@@ -1840,7 +1826,6 @@
<metric displayName="All Message Counter"
property="AllMessageCount"
category="utilization"
- defaultOn="true"
displayType="summary"
description="Returns the total message count for all subscriptions."/>
<metric displayName="Durable Message Count"
@@ -1856,7 +1841,6 @@
<metric displayName="All Subscription Count"
property="AllSubscriptionsCount"
category="utilization"
- defaultOn="true"
displayType="summary"
description="Number of subscriptions waiting for a message."/>
<metric displayName="Durable Subscription Count"
@@ -1873,7 +1857,6 @@
property="CreatedProgrammatically"
dataType="trait"
displayType="summary"
- defaultOn="true"
description="Was this Topic created dynamically" />
<resource-configuration>
@@ -2043,9 +2026,8 @@
<metric displayName="Max Size" property="MaxSize"
description="The maximum number of instances that are allowed to be pooled"/>
- <!-- default interval == 600000 ms == 10 min -->
<metric property="MethodInvocationTime" dataType="calltime" units="milliseconds"
- defaultOn="false" defaultInterval="600000" destinationType="Method Name"
+ defaultOn="false" destinationType="Method Name"
description="The minimum, maximum, and average invocation times for each of the methods exposed by this EJB;
NOTE: this metric is only available if JBoss EJB3 RC9 Patch 1 or later is being used
(a capable version of EJB3 is included with JBossAS 4.2.0.GA or later)"/>
@@ -2093,9 +2075,8 @@
description="The maximum number of instances that are allowed to be pooled"
property="{{jboss.j2ee:jndiName=%name%,plugin=pool,service=EJB}MaxSize}"/>
- <!-- default interval == 600000 ms == 10 min -->
<metric property="MethodInvocationTime" dataType="calltime" units="milliseconds"
- defaultOn="false" defaultInterval="600000" destinationType="Method Name"
+ defaultOn="false" destinationType="Method Name"
description="the minimum, maximum, and average invocation times for each of the methods exposed by this EJB"/>
</service>
@@ -2139,9 +2120,8 @@
property="{stats.passiveCount.current}"
displayType="summary"/>
- <!-- default interval == 600000 ms == 10 min -->
<metric property="MethodInvocationTime" dataType="calltime" units="milliseconds"
- defaultOn="false" defaultInterval="600000" destinationType="Method Name"
+ defaultOn="false" destinationType="Method Name"
description="the minimum, maximum, and average invocation times for each of the methods exposed by this EJB"/>
</service>
@@ -2187,24 +2167,20 @@
<metric property="{{jboss.j2ee:jndiName=%name%,plugin=cache,service=EJB}CacheSize}"
description="The total number of currently cached instances of this EJB 1.x or 2.x Entity Bean"
- displayName="Cache Size"
- defaultOn="true"/>
+ displayName="Cache Size"/>
<metric property="{{jboss.j2ee:jndiName=%name%,plugin=cache,service=EJB}PassivatedCount}"
description="The number of pooled instances of this EJB 1.x or 2.x Entity Bean in the passivated state"
displayName="Passivated Count"
- defaultOn="true"
measurementType="trendsup"/>
<metric property="{{jboss.j2ee:jndiName=%name%,plugin=pool,service=EJB}PoolSize}"
description="The total number of currently pooled instances of this EJB 1.x or 2.x Entity Bean"
- displayName="Current Size"
- defaultOn="true"/>
+ displayName="Current Size"/>
<metric property="{{jboss.j2ee:jndiName=%name%,plugin=pool,service=EJB}MaxPoolSize}"
description="The maximum number of instances that are allowed to be pooled"
- displayName="Max Size"
- defaultOn="true"/>
+ displayName="Max Size"/>
</service>
@@ -2409,7 +2385,7 @@
<metric property="Session.sessionMaxAliveTime" displayName="Max Session alive time"
units="seconds" description="Maximum alive time of a Sessions" />
- <metric property="Vhost.name" displayName="Vhost" dataType="trait" defaultOn="true"
+ <metric property="Vhost.name" displayName="Vhost" dataType="trait"
description="Virtual hosts this app runs on"/>
</service>
@@ -2536,7 +2512,7 @@
<metric property="Session.sessionMaxAliveTime" displayName="Max Session alive time"
units="seconds" description="Maximum alive time of a Sessions" />
- <metric property="Vhost.name" displayName="Vhost" dataType="trait" defaultOn="true"
+ <metric property="Vhost.name" displayName="Vhost" dataType="trait"
description="Virtual hosts this app runs on"/>
<content name="file" displayName="WAR File" category="deployable" isCreationType="true">
diff --git a/modules/plugins/jmx/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jmx/src/main/resources/META-INF/rhq-plugin.xml
index b142a22..b2c71b9 100644
--- a/modules/plugins/jmx/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jmx/src/main/resources/META-INF/rhq-plugin.xml
@@ -126,7 +126,6 @@
</plugin-configuration>
<metric displayName="Free Physical Memory"
- defaultOn="true"
displayType="summary"
category="performance"
property="FreePhysicalMemorySize"
@@ -147,7 +146,6 @@
measurementType="trendsup"
units="nanoseconds"/>
<metric displayName="Committed Virtual Memory"
- defaultOn="true"
category="utilization"
property="CommittedVirtualMemorySize"
description="Size of virtual memory used by this process"
@@ -208,23 +206,19 @@
</operation>
<metric displayName="Thread Count"
- defaultOn="true"
displayType="summary"
category="performance"
property="ThreadCount"
description="Number of active threads in the system"/>
<metric displayName="Peak Thread Count"
- defaultOn="true"
category="performance"
property="PeakThreadCount"
description="Peak count of active threads in the system"/>
<metric displayName="Total Started Thread Count"
- defaultOn="true"
category="performance"
property="TotalStartedThreadCount"
description="Count of threads started since system start"/>
<metric displayName="Daemon Thread Count"
- defaultOn="true"
category="performance"
property="DaemonThreadCount"
description="Count of threads marked as daemons in the system"/>
diff --git a/modules/plugins/mod-cluster/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/mod-cluster/src/main/resources/META-INF/rhq-plugin.xml
index 536e747..a98f62f 100644
--- a/modules/plugins/mod-cluster/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/mod-cluster/src/main/resources/META-INF/rhq-plugin.xml
@@ -442,7 +442,7 @@
<metric property="Load" displayName="Load" category="utilization"
description="The current load of this metric as a percent of the metric's capacity." dataType="measurement"
- defaultOn="true" displayType="summary"/>
+ displayType="summary"/>
<resource-configuration>
<c:simple-property name="weight" type="integer" description="The significance of this load metric compared to the other metrics." />
diff --git a/modules/plugins/mysql/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/mysql/src/main/resources/META-INF/rhq-plugin.xml
index 6a96c19..9c3e148 100644
--- a/modules/plugins/mysql/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/mysql/src/main/resources/META-INF/rhq-plugin.xml
@@ -361,21 +361,21 @@
<c:simple-property name="tableName" readOnly="true" />
</plugin-configuration>
<!-- Summary Traits -->
- <metric property="Engine" displayType="summary" dataType="trait" description="Database Engine that created the Table" defaultOn="true"/>
- <metric property="Version" displayType="summary" dataType="trait" description="Version of the Table" defaultOn="true"/>
- <metric property="Row_format" displayType="summary" dataType="trait" description="Row Format" defaultOn="true"/>
- <metric property="Collation" displayType="summary" dataType="trait" description="Collation Character Set" defaultOn="true"/>
- <metric property="Comment" displayType="summary" dataType="trait" description="Table Creation Comment" defaultOn="true"/>
- <metric property="Create_options" displayType="summary" dataType="trait" description="Table Creation Options" defaultOn="true"/>
- <metric property="Create_time" displayType="summary" dataType="trait" description="Table Creation Time" defaultOn="true"/>
+ <metric property="Engine" displayType="summary" dataType="trait" description="Database Engine that created the Table" />
+ <metric property="Version" displayType="summary" dataType="trait" description="Version of the Table" />
+ <metric property="Row_format" displayType="summary" dataType="trait" description="Row Format" />
+ <metric property="Collation" displayType="summary" dataType="trait" description="Collation Character Set" />
+ <metric property="Comment" displayType="summary" dataType="trait" description="Table Creation Comment" />
+ <metric property="Create_options" displayType="summary" dataType="trait" description="Table Creation Options" />
+ <metric property="Create_time" displayType="summary" dataType="trait" description="Table Creation Time" />
<!-- Dynamic Metrics -->
- <metric property="Rows" displayType="summary" measurementType="dynamic" description="Number of Rows in the Table" defaultOn="true"/>
- <metric property="Avg_row_length" displayType="summary" measurementType="dynamic" units="bytes" description="Average Row Length(bytes)" defaultOn="true"/>
- <metric property="Data_length" displayType="summary" measurementType="dynamic" units="bytes" description="Table Data Size(bytes)" defaultOn="true"/>
- <metric property="Max_data_length" displayType="summary" measurementType="dynamic" units="bytes" description="Max Table Data Size(bytes)" defaultOn="true"/>
- <metric property="Index_length" displayType="summary" measurementType="dynamic" units="bytes" description="Table Index Size(bytes)" defaultOn="true"/>
- <metric property="Data_free" displayType="summary" measurementType="dynamic" units="bytes" description="Table Free Space(bytes)" defaultOn="true"/>
+ <metric property="Rows" displayType="summary" measurementType="dynamic" description="Number of Rows in the Table" />
+ <metric property="Avg_row_length" displayType="summary" measurementType="dynamic" units="bytes" description="Average Row Length(bytes)" />
+ <metric property="Data_length" displayType="summary" measurementType="dynamic" units="bytes" description="Table Data Size(bytes)" />
+ <metric property="Max_data_length" displayType="summary" measurementType="dynamic" units="bytes" description="Max Table Data Size(bytes)" />
+ <metric property="Index_length" displayType="summary" measurementType="dynamic" units="bytes" description="Table Index Size(bytes)" />
+ <metric property="Data_free" displayType="summary" measurementType="dynamic" units="bytes" description="Table Free Space(bytes)" />
</service>
</service>
<service name="User" class="MySqlUserComponent" discovery="MySqlUserDiscoveryComponent"
diff --git a/modules/plugins/onewire/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/onewire/src/main/resources/META-INF/rhq-plugin.xml
index a8ea1e3..5cca30b 100644
--- a/modules/plugins/onewire/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/onewire/src/main/resources/META-INF/rhq-plugin.xml
@@ -25,7 +25,7 @@
discovery="DS1820Discovery"
>
- <metric property="temperature" defaultOn="true" description="Temperature measured"
+ <metric property="temperature" description="Temperature measured"
displayType="summary" units="celsius"/>
</service>
diff --git a/modules/plugins/oracle/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/oracle/src/main/resources/META-INF/rhq-plugin.xml
index 11eb232..fea33f1 100644
--- a/modules/plugins/oracle/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/oracle/src/main/resources/META-INF/rhq-plugin.xml
@@ -33,13 +33,13 @@
<metric property="totalSize" displayType="summary" units="bytes"/>
- <metric property="logons cumulative" defaultOn="true"/>
+ <metric property="logons cumulative" />
<metric property="logons current" displayType="summary"/>
<metric property="opened cursors cumulative"/>
- <metric property="opened cursors current" defaultOn="true"/>
+ <metric property="opened cursors current" />
<metric property="user commits" displayType="summary"/>
<metric property="user rollbacks" displayType="summary"/>
- <metric property="user calls" defaultOn="true"/>
+ <metric property="user calls" />
<metric property="recursive calls"/>
<metric property="recursive cpu usage"/>
<metric property="session logical reads"/>
@@ -49,8 +49,8 @@
<metric property="DB time"/>
<metric property="cluster wait time"/>
<metric property="concurrency wait time"/>
- <metric property="application wait time" defaultOn="true"/>
- <metric property="user I/O wait time" defaultOn="true"/>
+ <metric property="application wait time" />
+ <metric property="user I/O wait time" />
<metric property="session connect time"/>
<metric property="process last non-idle time"/>
<!--<metric property="session uga memory" displayType="summary" units="bytes"/>
@@ -70,30 +70,30 @@
<metric property="global enqueue gets async"/>
<metric property="global enqueue get time"/>
<metric property="global enqueue releases"/>
- <metric property="physical read total IO requests" defaultOn="true"/>
+ <metric property="physical read total IO requests" />
<metric property="physical read total multi block requests"/>
- <metric property="physical read total bytes" defaultOn="true"/>
- <metric property="physical write total IO requests" defaultOn="true"/>
+ <metric property="physical read total bytes" />
+ <metric property="physical write total IO requests" />
<metric property="physical write total multi block requests"/>
- <metric property="physical write total bytes" defaultOn="true"/>
+ <metric property="physical write total bytes" />
<metric property="IPC CPU used by this session"/>
<metric property="gcs messages sent"/>
<metric property="ges messages sent"/>
<metric property="global enqueue CPU used by this session"/>
- <metric property="db block gets" defaultOn="true"/>
- <metric property="db block gets from cache" defaultOn="true"/>
- <metric property="db block gets direct" defaultOn="true"/>
+ <metric property="db block gets" />
+ <metric property="db block gets from cache" />
+ <metric property="db block gets direct" />
<metric property="consistent gets"/>
<metric property="consistent gets from cache"/>
<metric property="consistent gets - examination"/>
<metric property="consistent gets direct"/>
- <metric property="physical reads" defaultOn="true"/>
+ <metric property="physical reads" />
<metric property="physical reads cache"/>
<metric property="physical reads direct"/>
- <metric property="physical read IO requests" defaultOn="true"/>
+ <metric property="physical read IO requests" />
<metric property="physical read bytes"/>
- <metric property="db block changes" defaultOn="true"/>
- <metric property="consistent changes" defaultOn="true"/>
+ <metric property="db block changes" />
+ <metric property="consistent changes" />
<metric property="recovery blocks read"/>
<metric property="physical writes"/>
<metric property="physical writes direct"/>
@@ -367,15 +367,15 @@
<metric property="parse count (hard)"/>
<metric property="parse count (failures)"/>
<metric property="frame signature mismatch"/>
- <metric property="execute count" defaultOn="true"/>
+ <metric property="execute count" />
<metric property="bytes sent via SQL*Net to client"/>
<metric property="bytes received via SQL*Net from client"/>
<metric property="SQL*Net roundtrips to/from client"/>
<metric property="bytes sent via SQL*Net to dblink"/>
<metric property="bytes received via SQL*Net from dblink"/>
<metric property="SQL*Net roundtrips to/from dblink"/>
- <metric property="sorts (memory)" defaultOn="true"/>
- <metric property="sorts (disk)" defaultOn="true"/>
+ <metric property="sorts (memory)" />
+ <metric property="sorts (disk)" />
<metric property="sorts (rows)"/>
<metric property="OTC commit optimization attempts"/>
<metric property="OTC commit optimization hits"/>
diff --git a/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
index d5f3932..7c7c2ff 100644
--- a/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
@@ -52,67 +52,55 @@
property="Trait.hostname"
description="Name that this platform is known as"
dataType="trait"
- displayType="summary"
- defaultOn="true" />
+ displayType="summary" />
<metric displayName="OS Name"
property="Trait.osname"
description="Name that the operating system is known as"
dataType="trait"
- displayType="summary"
- defaultOn="true" />
+ displayType="summary" />
<metric displayName="OS Version"
property="Trait.osversion"
description="Version of the operating system"
dataType="trait"
- displayType="summary"
- defaultOn="true" />
+ displayType="summary" />
<metric displayName="Architecture"
property="Trait.sysarch"
description="Hardware architecture of the platform"
dataType="trait"
- displayType="summary"
- defaultOn="true"/>
+ displayType="summary" />
'>
<!ENTITY nativeMetrics '
<metric displayName="Free Memory"
property="Native.MemoryInfo.free"
- defaultOn="true"
displayType="summary"
units="bytes"
description="The total free system memory"/>
<metric displayName="Used Memory"
property="Native.MemoryInfo.used"
- defaultOn="true"
displayType="summary"
units="bytes"
description="The total used system memory"/>
<metric displayName="Total Memory"
property="Native.MemoryInfo.total"
- defaultOn="true"
units="bytes"
- defaultInterval="1200000"
description="The total system memory"/>
<metric displayName="Free Swap Space"
property="Native.SwapInfo.free"
- defaultOn="true"
units="bytes"
description="The total free system swap"/>
<metric displayName="Used Swap Space"
property="Native.SwapInfo.used"
- defaultOn="true"
displayType="summary"
units="bytes"
description="The total used system swap"/>
<metric displayName="Total Swap Space"
property="Native.SwapInfo.total"
- defaultOn="true"
units="bytes"
- defaultInterval="1200000"
description="The total system swap"/>
'>
@@ -141,26 +129,18 @@
<metric displayName="Vendor"
property="CpuTrait.vendor"
dataType="trait"
- defaultOn="true"
- defaultInterval="3600000"
description="Vendor of this CPU"/>
<metric displayName="CPU Model"
property="CpuTrait.model"
dataType="trait"
- defaultOn="true"
- defaultInterval="3600000"
description="Model of this CPU"/>
<metric displayName="CPU Speed"
property="CpuTrait.mhz"
dataType="trait"
- defaultOn="true"
- defaultInterval="3600000"
description="Speed of this CPU in Mhz"/>
<metric displayName="Cache size"
property="CpuTrait.cacheSize"
dataType="trait"
- defaultOn="true"
- defaultInterval="3600000"
description="Cache Size of this CPU"/>
'>
@@ -334,14 +314,12 @@
property="distro.name"
description="name of the Linux distribution"
dataType="trait"
- displayType="summary"
- defaultOn="true" />
+ displayType="summary" />
<metric displayName="Distribution Version"
property="distro.version"
description="version of the Linux distribution"
dataType="trait"
- displayType="summary"
- defaultOn="true" />
+ displayType="summary" />
&syslogEventDefinition;
@@ -522,29 +500,29 @@
description="The total free bytes on filesystem"/>
<metric property="fileSystemUsage.usePercent" displayName="Used Percentage" units="percentage" displayType="summary"
description="The percentage of disk used"/>
- <metric property="fileSystemUsage.total" displayName="Capacity" units="kilobytes" dataType="trait" defaultOn="true"
+ <metric property="fileSystemUsage.total" displayName="Capacity" units="kilobytes" dataType="trait"
description="The total size of the filesystem"/>
<metric property="fileSystem.typeName" displayName="Volume Type" dataType="trait" displayType="summary"
description="The filesystem's generic type name"/>
<metric property="fileSystem.sysTypeName" displayName="Drive Type" dataType="trait" displayType="summary"
description="The filesystem's operating system-specific type name"/>
- <metric property="fileSystem.devName" displayName="name" dataType="trait" defaultOn="true"
+ <metric property="fileSystem.devName" displayName="name" dataType="trait"
description="The name of this device"/>
<metric property="fileSystemUsage.freeFiles" displayName="Free Files"
description="The number of free file nodes on the filesystem"/>
- <metric property="fileSystem.flags" displayName="Flags" dataType="trait" defaultOn="true"
+ <metric property="fileSystem.flags" displayName="Flags" dataType="trait"
description="The filesystem's flags"/>
- <metric property="fileSystemUsage.used" displayName="Used" units="kilobytes" defaultOn="true"
+ <metric property="fileSystemUsage.used" displayName="Used" units="kilobytes"
description="The total bytes used on the filesystem"/>
<metric property="fileSystemUsage.diskReads" displayName="Disk Reads" measurementType="trendsup" displayType="summary"
description="The number of physical disk reads"/>
<metric property="fileSystemUsage.diskWrites" displayName="Disk Writes" measurementType="trendsup" displayType="summary"
description="The number of physical disk writes"/>
- <metric property="fileSystemUsage.diskReadBytes" displayName="Disk Read Bytes" measurementType="trendsup" units="bytes" defaultOn="true"
+ <metric property="fileSystemUsage.diskReadBytes" displayName="Disk Read Bytes" measurementType="trendsup" units="bytes"
description="The number of physical disk bytes read"/>
- <metric property="fileSystemUsage.diskWriteBytes" displayName="Disk Write Bytes" measurementType="trendsup" units="bytes" defaultOn="true"
+ <metric property="fileSystemUsage.diskWriteBytes" displayName="Disk Write Bytes" measurementType="trendsup" units="bytes"
description="The number of physical disk bytes written"/>
- <metric property="fileSystemUsage.diskQueue" displayName="Disk Queue" defaultOn="true"
+ <metric property="fileSystemUsage.diskQueue" displayName="Disk Queue"
description="The number of I/Os currently in progress"/>
</service>
diff --git a/modules/plugins/postgres/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/postgres/src/main/resources/META-INF/rhq-plugin.xml
index 88df960..6d55124 100644
--- a/modules/plugins/postgres/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/postgres/src/main/resources/META-INF/rhq-plugin.xml
@@ -391,10 +391,10 @@
<metric displayName="Total Size" property="total_size" measurementType="dynamic" displayType="summary" units="bytes"
description="The size in bytes of the data and all associated indexes and toast tables"/>
<metric displayName="Rows" property="rows" measurementType="dynamic"
- defaultOn="false" defaultInterval="600000"
+ defaultOn="false"
description="The count of rows in the table. Warning: This may be an expensive operation"/>
<metric displayName="Approximate rows" property="rows_approx" measurementType="dynamic"
- defaultOn="false" defaultInterval="300000"
+ defaultOn="false"
description="The approximate count of rows in the table. This is basically the number of rows of the last ANALYZE of the table. This metric is not expensive."/>
<!-- TODO GH: add metrics for data and index space used -->
diff --git a/modules/plugins/rhq-agent/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/rhq-agent/src/main/resources/META-INF/rhq-plugin.xml
index 3517bf6..69cbf8a 100644
--- a/modules/plugins/rhq-agent/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/rhq-agent/src/main/resources/META-INF/rhq-plugin.xml
@@ -197,13 +197,11 @@
dataType="trait"
displayType="detail"
defaultInterval="86400000"
- defaultOn="true"
description="The directory where the agent is installed" />
<metric property="NumberAgentRestarts"
displayName="Number of Agent Restarts"
description="Number of times the agent was restarted during the lifetime of its Java Virtual Machine"
- defaultOn="true"
displayType="detail"
units="none"
category="availability"
@@ -212,8 +210,6 @@
<metric property="AgentServerClockDifference"
displayName="Agent-Server Clock Difference"
description="Number of milliseconds the agent's clock differs from its server's clock"
- defaultInterval="1800000"
- defaultOn="true"
displayType="summary"
units="milliseconds"
category="performance"
@@ -230,7 +226,6 @@
<metric property="NumberTotalCommandsReceived"
displayName="Total Number Of Commands Received"
description="Total number of messages this agent has received from the RHQ Server"
- defaultOn="true"
displayType="summary"
category="throughput"
measurementType="trendsup" />
@@ -238,21 +233,18 @@
<metric property="NumberSuccessfulCommandsReceived"
displayName="Number of Commands Received Successfully"
description="Number of messages this agent has received from the RHQ Server and succesfully processed"
- defaultOn="true"
category="throughput"
measurementType="trendsup" />
<metric property="NumberFailedCommandsReceived"
displayName="Number of Commands Received but Failed "
description="Number of messages this agent has received from the RHQ Server but failed to process"
- defaultOn="true"
category="throughput"
measurementType="trendsup" />
<metric property="AverageExecutionTimeReceived"
displayName="Avg Execution Time Commands Received Successfully"
description="Average time it took to process incoming commands that are ultimately successful"
- defaultOn="true"
displayType="summary"
category="performance"
measurementType="dynamic"
@@ -261,7 +253,6 @@
<metric property="AverageExecutionTimeSent"
displayName="Avg Execution Time Commands Sent Successfully"
description="Average time it took to send commands that are ultimately successful"
- defaultOn="true"
displayType="summary"
category="performance"
measurementType="dynamic"
@@ -270,7 +261,6 @@
<metric property="NumberTotalCommandsSent"
displayName="Total Number of Commands Sent"
description="Total number of messages this agent has sent to the RHQ Server"
- defaultOn="true"
displayType="summary"
category="throughput"
measurementType="trendsup" />
@@ -278,21 +268,18 @@
<metric property="NumberSuccessfulCommandsSent"
displayName="Number of Commands Successfully Sent"
description="Number of messages this agent has sent to the RHQ Server successfully"
- defaultOn="true"
category="throughput"
measurementType="trendsup" />
<metric property="NumberFailedCommandsSent"
displayName="Number of Commands Sent but Failed"
description="Number of messages this agent has either tried, but failed, to send or were not processed succesfully by the RHQ Server"
- defaultOn="true"
category="throughput"
measurementType="trendsup" />
<metric property="NumberCommandsActiveSent"
displayName="Number Of Active Commands Being Sent"
description="The number of messages this agent is currently sending"
- defaultOn="true"
displayType="summary"
category="throughput"
measurementType="dynamic" />
@@ -300,7 +287,6 @@
<metric property="NumberCommandsInQueue"
displayName="Number of Commands In Queue"
description="Number of messages currently queued waiting to be sent to the RHQ Server"
- defaultOn="true"
displayType="summary"
category="throughput"
measurementType="dynamic" />
@@ -308,14 +294,12 @@
<metric property="NumberCommandsSpooled"
displayName="Number of Commands Spooled To Disk"
description="Number of messages spooled to disk waiting to be sent to the RHQ Server"
- defaultOn="true"
category="throughput"
measurementType="dynamic" />
<metric property="JVMFreeMemory"
displayName="JVM Free Memory"
description="The amount of free memory the agent JVM has in its heap"
- defaultOn="true"
units="bytes"
category="performance"
measurementType="dynamic" />
@@ -323,7 +307,6 @@
<metric property="JVMTotalMemory"
displayName="JVM Total Memory"
description="The amount of total memory the agent JVM has in its heap"
- defaultOn="true"
units="bytes"
category="performance"
measurementType="dynamic" />
@@ -331,7 +314,6 @@
<metric property="JVMActiveThreads"
displayName="JVM Active Threads"
description="The number of active threads currently running in the agent JVM"
- defaultOn="true"
category="performance"
measurementType="dynamic" />
@@ -750,16 +732,13 @@
<metric property="NumberOfPluginClassLoaders"
defaultOn="false"
displayType="detail"
- defaultInterval="3600000"
description="The total number of plugin classloaders currently created and actively managed."/>
<metric property="NumberOfDiscoveryClassLoaders"
defaultOn="false"
displayType="detail"
- defaultInterval="3600000"
description="The total number of discovery classloaders currently created and actively managed."/>
<metric property="NumberOfResourceClassLoaders"
displayType="summary"
- defaultInterval="600000"
description="The total number of individual resource classloaders currently created and assigned to resources."/>
</service>
diff --git a/modules/plugins/rhq-server/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/rhq-server/src/main/resources/META-INF/rhq-plugin.xml
index 9f0f6a3..18cae0e 100644
--- a/modules/plugins/rhq-server/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/rhq-server/src/main/resources/META-INF/rhq-plugin.xml
@@ -128,19 +128,19 @@
<metric property="FullAvailabilityReports" displayType="summary" measurementType="trendsup"
description="The number of full availability reports received and processed by this RHQ Server since it was started"/>
- <metric property="PurgedAlerts" displayType="summary" measurementType="dynamic" category="utilization" defaultInterval="900000"
+ <metric property="PurgedAlerts" displayType="summary" measurementType="dynamic" category="utilization"
description="Number of alerts purged by the last purge job"/>
- <metric property="PurgedAlertConditions" displayType="summary" measurementType="dynamic" category="utilization" defaultInterval="900000"
+ <metric property="PurgedAlertConditions" displayType="summary" measurementType="dynamic" category="utilization"
description="Number of alert conditions purged by the last purge job"/>
- <metric property="PurgedAlertNotifications" displayType="summary" measurementType="dynamic" category="utilization" defaultInterval="900000"
+ <metric property="PurgedAlertNotifications" displayType="summary" measurementType="dynamic" category="utilization"
description="Number of alert notifications purged by the last purge job"/>
- <metric property="PurgedAvailabilities" displayType="summary" measurementType="dynamic" category="utilization" defaultInterval="900000"
+ <metric property="PurgedAvailabilities" displayType="summary" measurementType="dynamic" category="utilization"
description="Number of availabilities purged by the last purge job"/>
- <metric property="PurgedCallTimeData" displayType="summary" measurementType="dynamic" category="utilization" defaultInterval="900000"
+ <metric property="PurgedCallTimeData" displayType="summary" measurementType="dynamic" category="utilization"
description="Number of call time data purged by the last purge job"/>
- <metric property="PurgedEvents" displayType="summary" measurementType="dynamic" category="utilization" defaultInterval="900000"
+ <metric property="PurgedEvents" displayType="summary" measurementType="dynamic" category="utilization"
description="Number of events purged by the last purge job"/>
- <metric property="PurgedMeasurementTraits" displayType="summary" measurementType="dynamic" category="utilization" defaultInterval="900000"
+ <metric property="PurgedMeasurementTraits" displayType="summary" measurementType="dynamic" category="utilization"
description="Number of traits purged by the last purge job"/>
</service>
diff --git a/modules/plugins/script/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/script/src/main/resources/META-INF/rhq-plugin.xml
index 016985e..851e830 100644
--- a/modules/plugins/script/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/script/src/main/resources/META-INF/rhq-plugin.xml
@@ -80,9 +80,7 @@
dataType="measurement"
displayName="The Measurement Name"
description="Describes what this measurement is actually telling you"
- defaultOn="true"
units="none"
- defaultInterval="300000"
displayType="summary"
category="performance" />
-->
diff --git a/modules/plugins/tomcat/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/tomcat/src/main/resources/META-INF/rhq-plugin.xml
index 24307ef..9ef1f5c 100644
--- a/modules/plugins/tomcat/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/tomcat/src/main/resources/META-INF/rhq-plugin.xml
@@ -441,7 +441,6 @@
property="VHost.name"
displayName="Virtual Hosts"
dataType="trait"
- defaultOn="true"
description="Virtual hosts this app runs on" />
<metric
@@ -704,14 +703,12 @@
displayName="Maximum Request Time"
description="Maximum time it took to process a request."
units="milliseconds"
- defaultOn="true"
category="performance" />
<metric
property="Catalina:type=GlobalRequestProcessor,name=%handler%%address%-%port%:requestCount"
displayName="Request count"
description="Total number of requests processed since last restart."
- defaultOn="true"
category="utilization"
measurementType="trendsup" />
@@ -719,7 +716,6 @@
property="Catalina:type=GlobalRequestProcessor,name=%handler%%address%-%port%:errorCount"
displayName="Error count"
description="Number of errors while processing since last restart."
- defaultOn="true"
category="utilization"
measurementType="trendsup" />
@@ -727,7 +723,6 @@
property="Catalina:type=ThreadPool,name=%handler%%address%-%port%:currentThreadsBusy"
displayName="Threadpool Threads Active"
description="Number of current busy threads."
- defaultOn="true"
category="utilization"
displayType="summary" />
@@ -735,7 +730,6 @@
property="Catalina:type=ThreadPool,name=%handler%%address%-%port%:currentThreadCount"
displayName="Threadpool Threads Allocated"
description="Number of current threads."
- defaultOn="true"
category="utilization"
displayType="summary" />
@@ -743,7 +737,6 @@
property="Catalina:type=ThreadPool,name=%handler%%address%-%port%:maxThreads"
displayName="Threadpool Max Threads"
description="Maximum number of threads that can be allocated for the ThreadPool."
- defaultOn="true"
category="utilization"
displayType="detail" />
diff --git a/modules/plugins/twitter/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/twitter/src/main/resources/META-INF/rhq-plugin.xml
index a066afc..4944199 100644
--- a/modules/plugins/twitter/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/twitter/src/main/resources/META-INF/rhq-plugin.xml
@@ -45,11 +45,11 @@
</operation>
<metric property="tweetCount" displayName="Tweet count" category="utilization" dataType="measurement"
- defaultOn="true" displayType="summary" measurementType="dynamic"
+ displayType="summary" measurementType="dynamic"
description="Number of new tweets since last poll"/>
<metric property="followerCount" displayName="Follower count" dataType="measurement"
- defaultOn="true" displayType="summary" measurementType="dynamic" defaultInterval="14400000"
+ displayType="summary" measurementType="dynamic" defaultInterval="14400000"
description="Number of followers" />
@@ -77,7 +77,7 @@
</plugin-configuration>
<metric property="tweetCount" displayName="Tweet count" category="utilization" dataType="measurement"
- defaultOn="true" displayType="summary" measurementType="dynamic"
+ displayType="summary" measurementType="dynamic"
description="Number of new tweets since last poll"/>
<event name="FeedEvent"/>
12 years, 9 months
[rhq] modules/core modules/enterprise
by ips
modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java | 5
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java | 76 +++-------
2 files changed, 26 insertions(+), 55 deletions(-)
New commits:
commit 1026cd0039574ee628929c0140b6ce452b0db822
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Tue Sep 27 11:38:03 2011 -0400
[BZ 736517] remove unnecessary loading of grandchildren Resources in
ResourceManagerBean.getResourceLineageAndSiblings() and further optimize
performance of that method (https://bugzilla.redhat.com/show_bug.cgi?id=736517)
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
index de415f4..1eb495e 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
@@ -291,13 +291,14 @@ import org.rhq.core.domain.util.Summary;
+ " FROM Resource res " //
+ " WHERE res.parentResource = :parent " //
+ " AND res.id IN (SELECT rr.id FROM Resource rr JOIN rr.implicitGroups g JOIN g.roles r JOIN r.subjects s WHERE s = :subject)"
- + " AND res.resourceType.category = :category " + " AND res.inventoryStatus = :status "),
+ + " AND res.inventoryStatus = :status " //
+ + " AND (res.resourceType.category = :category OR :category is null)"),
@NamedQuery(name = Resource.QUERY_FIND_CHILDREN_BY_CATEGORY_AND_INVENTORY_STATUS_ADMIN, query = "" //
+ "SELECT res " //
+ " FROM Resource res " //
+ " WHERE res.parentResource = :parent " //
+ " AND res.inventoryStatus = :status " //
- + " AND res.resourceType.category = :category "),
+ + " AND (res.resourceType.category = :category OR :category is null)"),
@NamedQuery(name = Resource.QUERY_FIND_BY_CATEGORY_AND_INVENTORY_STATUS, query = "" //
+ "SELECT res " //
+ " FROM Resource res " //
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
index 16fd8e6..6a10c30 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
@@ -750,74 +750,44 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage
}
public List<ResourceLineageComposite> getResourceLineageAndSiblings(Subject subject, int resourceId) {
- boolean isInventoryManager = authorizationManager.isInventoryManager(subject);
-
- // get the raw resource lineage up to the platform. We'll check the auth below
+ // Get the raw resource lineage up to the platform. We'll check the auth below.
List<Resource> rawResourceLineage = getResourceLineage(resourceId);
int depth = rawResourceLineage.size();
Resource parent = (depth > 1) ? rawResourceLineage.get(depth - 2) : null;
- // record which of the raw ancestry is locked from view
- List<ResourceLineageComposite> resourceLineage = new ArrayList<ResourceLineageComposite>(rawResourceLineage
- .size());
+ // Build up a list of composite Resources for the ancestry that includes which ancestors, if any, should be
+ // locked from view.
+ boolean isInventoryManager = authorizationManager.isInventoryManager(subject);
+ List<ResourceLineageComposite> resourceLineage = new ArrayList<ResourceLineageComposite>(rawResourceLineage.size());
for (Resource resource : rawResourceLineage) {
- resourceLineage.add(new ResourceLineageComposite(resource, !authorizationManager.canViewResource(subject,
- resource.getId())));
+ boolean isLocked = !(isInventoryManager || authorizationManager.canViewResource(subject, resource.getId()));
+ ResourceLineageComposite composite = new ResourceLineageComposite(resource, isLocked);
+ resourceLineage.add(composite);
}
- // fill out the tree, including only the direct ancestors and all viewable relations
+ // Build up the result list, including only the direct ancestors of the Resource and all viewable siblings of
+ // the ancestors. The list will represent a tree, rooted at the platform, in depth-first order.
List<ResourceLineageComposite> result = new LinkedList<ResourceLineageComposite>();
for (ResourceLineageComposite ancestor : resourceLineage) {
- // always include a direct ancestor
+ // Always include a direct ancestor.
result.add(ancestor);
- // if the ancestor is not locked, include relevant children. Also, always show viewable
- // siblings of the target resource.
+ // If the ancestor is not locked, include viewable children.
if (!ancestor.isLocked() || ancestor.getResource() == parent) {
-
- // get children
- Set<Resource> children = ancestor.getResource().getChildResources();
- // remove any that are in the ancestry to avoid repeated handling
+ // Get all viewable committed children.
+ PageList<Resource> children = findChildResourcesByCategoryAndInventoryStatus(subject,
+ ancestor.getResource(), null, InventoryStatus.COMMITTED, PageControl.getUnlimitedInstance());
+ // Remove any that are in the lineage to avoid repeated handling.
children.removeAll(rawResourceLineage);
- // only add the viewable children
- List<Resource> viewableChildren = new ArrayList<Resource>(children.size());
for (Resource child : children) {
- boolean isCommitted = (child.getInventoryStatus() == InventoryStatus.COMMITTED);
- boolean isViewable = (isInventoryManager || authorizationManager.canViewResource(subject, child
- .getId()));
- if (isCommitted && isViewable) {
- // if not a direct ancestor add to the list (direct ancestors already added by default)
- if (!rawResourceLineage.contains(child)) {
- // ensure we have the parent in the entity
- child.getParentResource().getId();
- ResourceLineageComposite composite = new ResourceLineageComposite(child, false);
- result.add(composite);
- }
- viewableChildren.add(child);
- }
- }
-
- // get grandchildren
- for (Resource child : viewableChildren) {
- // This ensures Hibernate actually fetches the parent Resource.
- // ensure we have the parent
+ // Ensure the parentResource field is fetched.
+ //noinspection ConstantConditions
child.getParentResource().getId();
- Set<Resource> grandChildren = child.getChildResources();
- for (Resource grandChild : grandChildren) {
- boolean isCommitted = (grandChild.getInventoryStatus() == InventoryStatus.COMMITTED);
- boolean isViewable = (isInventoryManager || authorizationManager.canViewResource(subject,
- grandChild.getId()));
- if (isCommitted && isViewable) {
- // if not a direct ancestor add to the list (direct ancestors already added by default)
- if (!rawResourceLineage.contains(grandChild)) {
- // ensure we have the parent in the entity
- grandChild.getParentResource().getId();
- ResourceLineageComposite composite = new ResourceLineageComposite(grandChild, false);
- result.add(composite);
- }
- }
- }
+ // The query only returned viewable children, so the composite should not be locked.
+ boolean isLocked = false;
+ ResourceLineageComposite composite = new ResourceLineageComposite(child, isLocked);
+ result.add(composite);
}
}
}
@@ -1070,7 +1040,7 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage
@SuppressWarnings("unchecked")
public PageList<Resource> findChildResourcesByCategoryAndInventoryStatus(Subject user, Resource parent,
- ResourceCategory category, InventoryStatus status, PageControl pageControl) {
+ @Nullable ResourceCategory category, InventoryStatus status, PageControl pageControl) {
pageControl.initDefaultOrderingField("res.name");
Query queryCount;
12 years, 9 months